Annotation of early-roguelike/srogue/pstats.c, Revision 1.1
1.1 ! rubenllo 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: void updabil(int what, int amt, struct real *pst, int how);
! 17: int hungdam(void);
! 18:
! 19: /*
! 20: * chg_hpt:
! 21: * Changes players hit points
! 22: */
! 23: void
! 24: chg_hpt(int howmany, bool alsomax, 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: void
! 42: rchg_str(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: void
! 52: chg_abil(int what, int amt, int 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: void
! 70: updabil(int what, int amt, struct real *pst, int how)
! 71: {
! 72: register int *wh, *mx, *mr;
! 73: struct real *mst, *msr;
! 74: bool is_str = FALSE;
! 75: int rtype;
! 76:
! 77: msr = &him->s_re;
! 78: if (how == TRUE) /* max real abilities */
! 79: mst = &max_stats.s_re;
! 80: else /* max effective abil */
! 81: mst = &max_stats.s_ef;
! 82: switch (what) {
! 83: case STR:
! 84: is_str = TRUE;
! 85: wh = &pst->a_str;
! 86: mx = &mst->a_str;
! 87: mr = &msr->a_str;
! 88: rtype = R_ADDSTR;
! 89: when DEX:
! 90: wh = &pst->a_dex;
! 91: mx = &mst->a_dex;
! 92: mr = &msr->a_dex;
! 93: rtype = R_DEX;
! 94: when CON:
! 95: wh = &pst->a_con;
! 96: mx = &mst->a_con;
! 97: mr = &msr->a_con;
! 98: rtype = R_CONST;
! 99: when WIS:
! 100: wh = &pst->a_wis;
! 101: mx = &mst->a_wis;
! 102: mr = &msr->a_wis;
! 103: rtype = R_KNOW;
! 104: otherwise:
! 105: return;
! 106: }
! 107: *wh += amt; /* update by amt */
! 108: if (amt < 0) { /* if decrement */
! 109: if (*wh < MINABIL) /* minimum = 3 */
! 110: *wh = MINABIL;
! 111: if (how == FALSE) {
! 112: if (*wh < *mr) /* if less than real abil */
! 113: *wh = *mr; /* make equal to real */
! 114: }
! 115: }
! 116: else { /* increment */
! 117: int themax;
! 118:
! 119: themax = MAXOTHER; /* default maximum */
! 120: if (is_str)
! 121: themax = MAXSTR; /* strength maximum */
! 122: if (how != TRUE)
! 123: themax += ringex(rtype); /* get ring extra */
! 124: if (*wh > themax) { /* see if > max (if real) */
! 125: *wh = themax; /* max = 18 (24 if str) */
! 126: }
! 127: /*
! 128: * Check for updating the max player stats.
! 129: */
! 130: if (*wh > *mx)
! 131: *mx = *wh;
! 132: }
! 133: }
! 134:
! 135:
! 136: /*
! 137: * add_haste:
! 138: * add a haste to the player
! 139: */
! 140: void
! 141: add_haste(bool potion)
! 142: {
! 143: if (pl_on(ISHASTE)) {
! 144: msg("You faint from exhaustion.");
! 145: player.t_nocmd += rnd(8);
! 146: player.t_flags &= ~ISHASTE;
! 147: extinguish(nohaste);
! 148: }
! 149: else {
! 150: player.t_flags |= ISHASTE;
! 151: if (potion) {
! 152: fuse(nohaste, TRUE, roll(10,10));
! 153: msg("You feel yourself moving much faster.");
! 154: }
! 155: else {
! 156: fuse(nohaste, TRUE, roll(40,20));
! 157: msg("You find yourself moving much faster.");
! 158: }
! 159: }
! 160: }
! 161:
! 162: /*
! 163: * getpdex:
! 164: * Gets players added dexterity for fighting
! 165: */
! 166: int
! 167: getpdex(struct stats *who, bool heave)
! 168: {
! 169: reg int edex;
! 170:
! 171: edex = who->s_ef.a_dex;
! 172: if (heave) { /* an object was thrown here */
! 173: if (edex > 18)
! 174: return (edex - 15);
! 175: switch(edex) {
! 176: case 18: return 3;
! 177: case 17: return 2;
! 178: case 16: return 1;
! 179: case 15:
! 180: case 14:
! 181: case 13:
! 182: case 12:
! 183: case 11:
! 184: case 10:
! 185: case 9:
! 186: case 8:
! 187: case 7:
! 188: case 6: return 0;
! 189: case 5: return -1;
! 190: case 4: return -2;
! 191: default: return -3;
! 192: }
! 193: }
! 194: else { /* object NOT thrown here (affects armor class) */
! 195: if (edex > 18)
! 196: return (14 - edex);
! 197: switch(edex) {
! 198: case 18: return -4;
! 199: case 17: return -3;
! 200: case 16: return -2;
! 201: case 15: return -1;
! 202: case 14:
! 203: case 13:
! 204: case 12:
! 205: case 11:
! 206: case 10:
! 207: case 9:
! 208: case 8:
! 209: case 7: return 0;
! 210: case 6: return 1;
! 211: case 5: return 2;
! 212: case 4: return 3;
! 213: default: return 4;
! 214: }
! 215: }
! 216: }
! 217:
! 218: /*
! 219: * getpwis:
! 220: * Get a players wisdom for fighting
! 221: */
! 222: int
! 223: getpwis(struct stats *who)
! 224: {
! 225: reg int ewis;
! 226:
! 227: ewis = who->s_ef.a_wis;
! 228: if (ewis > 18)
! 229: return (ewis - 14);
! 230: switch(ewis) {
! 231: case 18: return 4;
! 232: case 17: return 3;
! 233: case 16: return 2;
! 234: case 15: return 1;
! 235: case 14:
! 236: case 13:
! 237: case 12:
! 238: case 11:
! 239: case 10:
! 240: case 9:
! 241: case 8: return 0;
! 242: case 7:
! 243: case 6: return -1;
! 244: case 5:
! 245: case 4: return -2;
! 246: default: return -3;
! 247: }
! 248: }
! 249:
! 250: /*
! 251: * getpcon:
! 252: * Get added hit points from players constitution
! 253: */
! 254: int
! 255: getpcon(struct stats *who)
! 256: {
! 257: reg int econ;
! 258:
! 259: econ = who->s_ef.a_con;
! 260: if (econ > 18)
! 261: return (econ - 14);
! 262: switch(econ) {
! 263: case 18: return 4;
! 264: case 17: return 3;
! 265: case 16: return 2;
! 266: case 15: return 1;
! 267: case 14:
! 268: case 13:
! 269: case 12:
! 270: case 11:
! 271: case 10:
! 272: case 9:
! 273: case 8:
! 274: case 7: return 0;
! 275: case 6:
! 276: case 5:
! 277: case 4: return -1;
! 278: default: return -2;
! 279: }
! 280: }
! 281:
! 282:
! 283: /*
! 284: * str_plus:
! 285: * compute bonus/penalties for strength on the "to hit" roll
! 286: */
! 287: int
! 288: str_plus(struct stats *who)
! 289: {
! 290: reg int hitplus, str;
! 291:
! 292: hitplus = 0;
! 293: str = who->s_ef.a_str;
! 294: if (str > 24) /* > 24 */
! 295: hitplus = str - 21;
! 296: else if (str == 24) /* 24 */
! 297: hitplus = 3;
! 298: else if (str > 20) /* 21 to 23 */
! 299: hitplus = 2;
! 300: else if(str >= 17) /* 17 to 20 */
! 301: hitplus = 1;
! 302: else if(str > 7) /* 8 to 16 */
! 303: hitplus = 0;
! 304: else if(str > 5) /* 6 to 7 */
! 305: hitplus = -1;
! 306: else if(str > 3) /* 4 to 5 */
! 307: hitplus = -2;
! 308: else
! 309: hitplus = -3; /* < 4 */
! 310: if (who == him) /* add pack weight if hero */
! 311: hitplus += hitweight();
! 312: return hitplus;
! 313: }
! 314:
! 315:
! 316: /*
! 317: * add_dam:
! 318: * Compute additional damage done depending on strength
! 319: */
! 320: int
! 321: add_dam(struct stats *who)
! 322: {
! 323: reg int exdam, str;
! 324:
! 325: exdam = 0;
! 326: str = who->s_ef.a_str;
! 327: if (str > 24) /* > 24 */
! 328: exdam = str - 18;
! 329: else if (str == 24) /* 24 */
! 330: exdam = 6;
! 331: else if (str == 23) /* 23 */
! 332: exdam = 5;
! 333: else if (str > 20) /* 21 to 22 */
! 334: exdam = 4;
! 335: else if (str > 18) /* 19 to 20 */
! 336: exdam = 3;
! 337: else if (str == 18) /* 18 */
! 338: exdam = 2;
! 339: else if (str > 15) /* 16 to 17 */
! 340: exdam = 1;
! 341: else if (str > 6) /* 7 to 14 */
! 342: exdam = 0;
! 343: else
! 344: exdam = -1; /* 3 to 6 */
! 345: if (who == him)
! 346: exdam += hungdam(); /* add hungry state if hero */
! 347: return exdam;
! 348: }
! 349:
! 350:
! 351: /*
! 352: * hungdam:
! 353: * Calculate damage depending on players hungry state
! 354: */
! 355: int
! 356: hungdam(void)
! 357: {
! 358: switch (hungry_state) {
! 359: case F_OKAY:
! 360: case F_HUNGRY: return 0;
! 361: when F_WEAK: return -1;
! 362: when F_FAINT: return -2;
! 363: }
! 364: return 0;
! 365: }
! 366:
! 367: /*
! 368: * heal_self:
! 369: * Heal the hero.
! 370: */
! 371: void
! 372: heal_self(int factor, bool updmaxhp)
! 373: {
! 374: him->s_hpt += roll(him->s_lvl + getpcon(him), factor);
! 375: if (updmaxhp)
! 376: him->s_maxhp += 1;
! 377: if (him->s_hpt > him->s_maxhp)
! 378: him->s_hpt = him->s_maxhp;
! 379: nochange = FALSE;
! 380: }
CVSweb