Annotation of early-roguelike/arogue7/encumb.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: * encumb.c - Stuff to do with encumberence
3: *
4: * Advanced Rogue
5: * Copyright (C) 1984, 1985, 1986 Michael Morgan, Ken Dalka and AT&T
6: * All rights reserved.
7: *
8: * Based on "Rogue: Exploring the Dungeons of Doom"
9: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
10: * All rights reserved.
11: *
12: * See the file LICENSE.TXT for full copyright and licensing information.
13: */
14:
15: /*
16: * Stuff to do with encumberence
17: *
18: */
19:
20: #include "curses.h"
21: #include "rogue.h"
22:
23: int packweight(struct thing *tp);
24:
25: /*
26: * updpack:
27: * Update his pack weight and adjust fooduse accordingly
28: */
29: void
30: updpack(int getmax, struct thing *tp)
31: {
32:
33: reg int topcarry, curcarry;
34:
35: if (getmax)
36: tp->t_stats.s_carry = totalenc(tp); /* get total encumb */
37: curcarry = packweight(tp); /* get pack weight */
38:
39: /* Only update food use for the player (for now) */
40: if (tp == &player) {
41: topcarry = tp->t_stats.s_carry / 5; /* 20% of total carry */
42: if(curcarry > 4 * topcarry) {
43: if(rnd(100) < 80)
44: foodlev = 3; /* > 80% of pack */
45: } else if(curcarry > 3 * topcarry) {
46: if(rnd(100) < 60)
47: foodlev = 2; /* > 60% of pack */
48: } else
49: foodlev = 1; /* <= 60% of pack */
50: }
51: tp->t_stats.s_pack = curcarry; /* update pack weight */
52: }
53:
54:
55: /*
56: * packweight:
57: * Get the total weight of the hero's pack
58: */
59: int
60: packweight(struct thing *tp)
61: {
62: reg struct object *obj;
63: reg struct linked_list *pc;
64: reg int weight;
65:
66: weight = 0;
67: for (pc = tp->t_pack ; pc != NULL ; pc = next(pc)) {
68: obj = OBJPTR(pc);
69: weight += itemweight(obj);
70: }
71: if (weight < 0) /* in case of amulet */
72: weight = 0;
73:
74: /* If this is the player, is he wearing a ring of carrying? */
75: if (tp == &player && ISWEARING(R_CARRY)) {
76: register int temp, i;
77:
78: temp = 0;
79: for (i=0; i<NUM_FINGERS; i++) {
80: if (cur_ring[i]->o_which == R_CARRY) {
81: if (cur_ring[i]->o_flags & ISCURSED) temp--;
82: else temp++;
83: }
84: }
85: weight -= (temp * weight) / 4;
86: }
87:
88: return(weight);
89: }
90:
91:
92: /*
93: * itemweight:
94: * Get the weight of an object
95: */
96: int
97: itemweight(struct object *wh)
98: {
99: reg int weight;
100: reg int ac;
101:
102: weight = wh->o_weight; /* get base weight */
103: switch(wh->o_type) {
104: case ARMOR:
105: /*
106: * subtract 10% for each enchantment
107: * this will add weight for negative items
108: */
109: ac = armors[wh->o_which].a_class - wh->o_ac;
110: weight = ((weight*10) - (weight*ac)) / 10;
111: if (weight < 0) weight = 0;
112: when WEAPON:
113: if ((wh->o_hplus + wh->o_dplus) > 0)
114: weight /= 2;
115: }
116: if(wh->o_flags & ISCURSED)
117: weight += weight / 5; /* 20% more for cursed */
118: weight *= wh->o_count;
119: return(weight);
120: }
121:
122:
123: /*
124: * playenc:
125: * Get hero's carrying ability above norm
126: */
127: int
128: playenc(struct thing *tp)
129: {
130: register int strength;
131:
132: if (tp == &player) strength = str_compute();
133: else strength = tp->t_stats.s_str;
134:
135: return ((strength-8)*50);
136: }
137:
138:
139: /*
140: * totalenc:
141: * Get total weight that the hero can carry
142: */
143: int
144: totalenc(struct thing *tp)
145: {
146: reg int wtotal;
147:
148: wtotal = NORMENCB + playenc(tp);
149: if (tp == &player) switch(hungry_state) {
150: case F_SATIATED:
151: case F_OKAY:
152: case F_HUNGRY: ; /* no change */
153: when F_WEAK: wtotal -= wtotal / 10; /* 10% off weak */
154: when F_FAINT: wtotal /= 2; /* 50% off faint */
155: }
156: return(wtotal);
157: }
158:
159:
160:
161: /*
162: * whgtchk:
163: * See if the hero can carry his pack
164: */
165:
166: void
167: wghtchk(void)
168: {
169: reg int dropchk, err = TRUE;
170: reg char ch;
171:
172: inwhgt = TRUE;
173: if (pstats.s_pack > pstats.s_carry) {
174: ch = CCHAR( mvwinch(stdscr, hero.y, hero.x) );
175: if((ch != FLOOR && ch != PASSAGE)) {
176: extinguish(wghtchk);
177: fuse(wghtchk, NULL, 1, AFTER);
178: inwhgt = FALSE;
179: return;
180: }
181: extinguish(wghtchk);
182: msg("Your pack is too heavy for you");
183: do {
184: dropchk = drop(NULL);
185: if(dropchk == 0) {
186: mpos = 0;
187: msg("You must drop something");
188: }
189: if(dropchk == TRUE)
190: err = FALSE;
191: } while(err);
192: }
193: inwhgt = FALSE;
194: }
195:
196:
197: /*
198: * hitweight:
199: * Gets the fighting ability according to current weight
200: * This returns a +1 hit for light pack weight
201: * 0 hit for medium pack weight
202: * -1 hit for heavy pack weight
203: */
204:
205: int
206: hitweight(void)
207: {
208: return(2 - foodlev);
209: }
CVSweb