[BACK]Return to encumb.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / srogue

Annotation of early-roguelike/srogue/encumb.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:  * Stuff to do with encumberence
        !             3:  *
        !             4:  * @(#)encumb.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 <string.h>
        !            14: #include "rogue.h"
        !            15: #include "rogue.ext"
        !            16:
        !            17: int packweight(void);
        !            18: int pack_vol(void);
        !            19:
        !            20: /*
        !            21:  * updpack:
        !            22:  *     Update his pack weight and adjust fooduse accordingly
        !            23:  */
        !            24: void
        !            25: updpack(void)
        !            26: {
        !            27:        reg int topcarry, curcarry;
        !            28:
        !            29:        him->s_carry = totalenc();                      /* get total encumb */
        !            30:        curcarry = packweight();                        /* get pack weight */
        !            31:        topcarry = him->s_carry / 5;            /* 20% of total carry */
        !            32:        if (curcarry > 4 * topcarry) {
        !            33:                if (rnd(100) < 80)
        !            34:                        foodlev = 3;                            /* > 80% of pack */
        !            35:        }
        !            36:        else if (curcarry > 3 * topcarry) {
        !            37:                if (rnd(100) < 60)
        !            38:                        foodlev = 2;                            /* > 60% of pack */
        !            39:        }
        !            40:        else
        !            41:                foodlev = 1;                                    /* <= 60% of pack */
        !            42:        him->s_pack = curcarry;                         /* update pack weight */
        !            43:        packvol = pack_vol();                           /* update pack volume */
        !            44:        nochange = FALSE;                                       /* also change display */
        !            45: }
        !            46:
        !            47:
        !            48: /*
        !            49:  * packweight:
        !            50:  *     Get the total weight of the hero's pack
        !            51:  */
        !            52: int
        !            53: packweight(void)
        !            54: {
        !            55:        reg struct object *obj;
        !            56:        reg struct linked_list *pc;
        !            57:        reg int weight, i;
        !            58:
        !            59:        weight = 0;
        !            60:        for (pc = pack ; pc != NULL ; pc = next(pc)) {
        !            61:                obj = OBJPTR(pc);
        !            62:                weight += itemweight(obj) * obj->o_count;
        !            63:        }
        !            64:        if (weight < 0)         /* in case of amulet */
        !            65:                 weight = 0;
        !            66:        for (i = LEFT; i <= RIGHT; i += 1) {
        !            67:                obj = cur_ring[i];
        !            68:                if (obj != NULL) {
        !            69:                        if (obj->o_type == R_HEAVY && o_off(obj, ISBLESS))
        !            70:                                weight += weight / 4;
        !            71:                }
        !            72:        }
        !            73:        return weight;
        !            74: }
        !            75:
        !            76:
        !            77: /*
        !            78:  * itemweight:
        !            79:  *     Get the weight of an object
        !            80:  */
        !            81: int
        !            82: itemweight(struct object *wh)
        !            83: {
        !            84:        reg int weight;
        !            85:
        !            86:        weight = wh->o_weight;          /* get base weight */
        !            87:        switch (wh->o_type) {
        !            88:                case ARMOR:
        !            89:                        if ((armors[wh->o_which].a_class - wh->o_ac) > 0)
        !            90:                                weight /= 2;
        !            91:                when WEAPON:
        !            92:                        if ((wh->o_hplus + wh->o_dplus) > 0)
        !            93:                                weight /= 2;
        !            94:        }
        !            95:        if (o_on(wh,ISCURSED))
        !            96:                weight += weight / 5;   /* 20% more for cursed */
        !            97:        if (o_on(wh, ISBLESS))
        !            98:                weight -= weight / 5;   /* 20% less for blessed */
        !            99:        return weight;
        !           100: }
        !           101:
        !           102: /*
        !           103:  * pack_vol:
        !           104:  *     Get the total volume of the hero's pack
        !           105:  */
        !           106: int
        !           107: pack_vol(void)
        !           108: {
        !           109:        reg struct object *obj;
        !           110:        reg struct linked_list *pc;
        !           111:        reg int volume;
        !           112:
        !           113:        volume = 0;
        !           114:        for (pc = pack ; pc != NULL ; pc = next(pc)) {
        !           115:                obj = OBJPTR(pc);
        !           116:                volume += itemvol(obj);
        !           117:        }
        !           118:        return volume;
        !           119: }
        !           120:
        !           121: /*
        !           122:  * itemvol:
        !           123:  *     Get the volume of an object
        !           124:  */
        !           125: int
        !           126: itemvol(struct object *wh)
        !           127: {
        !           128:        reg int volume, what, extra;
        !           129:
        !           130:        extra = 0;
        !           131:        what = getindex(wh->o_type);
        !           132:        switch (wh->o_type) {
        !           133:                case ARMOR:             extra = armors[wh->o_which].a_vol;
        !           134:                when WEAPON:    extra = weaps[wh->o_which].w_vol;
        !           135:                when STICK:             if (strcmp(ws_stuff[wh->o_which].ws_type,"staff") == 0)
        !           136:                                                        extra = V_WS_STAFF;
        !           137:                                                else
        !           138:                                                        extra = V_WS_WAND;
        !           139:        }
        !           140:        volume = thnginfo[what].mf_vol + extra;
        !           141:        volume *= wh->o_count;
        !           142:        return volume;
        !           143: }
        !           144:
        !           145: /*
        !           146:  * playenc:
        !           147:  *     Get hero's carrying ability above norm
        !           148:  */
        !           149: int
        !           150: playenc(void)
        !           151: {
        !           152:        reg int estr = him->s_ef.a_str;
        !           153:        if (estr >= 24)
        !           154:                return 3000;
        !           155:        switch(him->s_ef.a_str) {
        !           156:                case 23: return 2000;
        !           157:                case 22: return 1500;
        !           158:                case 21: return 1250;
        !           159:                case 20: return 1100;
        !           160:                case 19: return 1000;
        !           161:                case 18: return 700;
        !           162:                case 17: return 500;
        !           163:                case 16: return 350;
        !           164:                case 15:
        !           165:                case 14: return 200;
        !           166:                case 13:
        !           167:                case 12: return 100;
        !           168:                case 11:
        !           169:                case 10:
        !           170:                case  9:
        !           171:                case  8: return 0;
        !           172:                case  7:
        !           173:                case  6: return -150;
        !           174:                case  5:
        !           175:                case  4: return -250;
        !           176:        }
        !           177:        return -350;
        !           178: }
        !           179:
        !           180:
        !           181: /*
        !           182:  * totalenc:
        !           183:  *     Get total weight that the hero can carry
        !           184:  */
        !           185: int
        !           186: totalenc(void)
        !           187: {
        !           188:        reg int wtotal;
        !           189:
        !           190:        wtotal = NORMENCB + playenc();
        !           191:        switch(hungry_state) {
        !           192:                case F_OKAY:
        !           193:                case F_HUNGRY:  ;                                               /* no change */
        !           194:                when F_WEAK:    wtotal -= wtotal / 10;  /* 10% off weak */
        !           195:                when F_FAINT:   wtotal /= 2;                    /* 50% off faint */
        !           196:        }
        !           197:        return wtotal;
        !           198: }
        !           199:
        !           200: /*
        !           201:  * whgtchk:
        !           202:  *     See if the hero can carry his pack
        !           203:  */
        !           204: void
        !           205: wghtchk(int fromfuse)
        !           206: {
        !           207:        reg int dropchk, err = TRUE;
        !           208:        reg char ch;
        !           209:
        !           210:        inwhgt = TRUE;
        !           211:        if (him->s_pack > him->s_carry) {
        !           212:                ch = player.t_oldch;
        !           213:                extinguish(wghtchk);
        !           214:                if ((ch != FLOOR && ch != PASSAGE) || isfight) {
        !           215:                        fuse(wghtchk, TRUE, 1);
        !           216:                        inwhgt = FALSE;
        !           217:                        return;
        !           218:                }
        !           219:                msg("Your pack is too heavy for you.");
        !           220:                do {
        !           221:                        dropchk = drop(NULL);
        !           222:                        if (dropchk == SOMTHERE)
        !           223:                                err = FALSE;
        !           224:                        else if (dropchk == FALSE) {
        !           225:                                mpos = 0;
        !           226:                                msg("You must drop something");
        !           227:                        }
        !           228:                        if (dropchk == TRUE)
        !           229:                                err = FALSE;
        !           230:                } while(err);
        !           231:        }
        !           232:        inwhgt = FALSE;
        !           233: }
        !           234:
        !           235:
        !           236: /*
        !           237:  * hitweight:
        !           238:  *     Gets the fighting ability according to current weight
        !           239:  *     This returns a  +1 hit for light pack weight
        !           240:  *                      0 hit for medium pack weight
        !           241:  *                     -1 hit for heavy pack weight
        !           242:  */
        !           243: int
        !           244: hitweight(void)
        !           245: {
        !           246:        return(2 - foodlev);
        !           247: }

CVSweb