diff --git a/include/misc.h b/include/misc.h index 53da3fbc..de95f85f 100644 --- a/include/misc.h +++ b/include/misc.h @@ -147,8 +147,6 @@ extern char *getstring(char *prompt, char buf[]); extern s_char *prbuf(s_char *format, ...) ATTRIBUTE((format (printf, 1, 2))); -#define MAXCHRNV 12 - #include "prototypes.h" /* must come at end, after defines and typedefs */ #endif /* _MISC_H_ */ diff --git a/include/product.h b/include/product.h index c0de4c4f..d9034a0a 100644 --- a/include/product.h +++ b/include/product.h @@ -34,10 +34,15 @@ #ifndef _PRODUCT_H_ #define _PRODUCT_H_ +/* + * Maximum number of product constituents. + * Beware, some output formats rely on MAXPRCON <= 3! + */ +enum { MAXPRCON = 3 }; + struct pchrstr { - u_char p_nv; /* number of constituents */ - u_char p_vtype[MAXCHRNV]; /* constituent types */ - u_short p_vamt[MAXCHRNV]; /* constituent amounts */ + u_char p_ctype[MAXPRCON]; /* constituent types */ + u_short p_camt[MAXPRCON]; /* constituent amounts */ int p_type; /* vtype if product is a variable */ int p_level; /* index (NAT_?LEV) if product is not a var */ int p_cost; /* dollars / product unit */ diff --git a/src/lib/commands/grin.c b/src/lib/commands/grin.c index 07155c2a..82dd5a0b 100644 --- a/src/lib/commands/grin.c +++ b/src/lib/commands/grin.c @@ -68,23 +68,36 @@ grin(void) if (sect.sct_effic < 60 || sect.sct_own != player->cnum) continue; n = sect.sct_item[I_BAR] >= qty ? qty : sect.sct_item[I_BAR]; - avail = n * 5.0; + /* work limit */ + avail = n * 5; if (avail > sect.sct_avail) { n = sect.sct_avail / 5; avail = sect.sct_avail; } - for (i = 0; i < pchr[P_BAR].p_nv; i++) { + /* space limit */ + for (i = 0; i < MAXPRCON; i++) { + if (!pchr[P_BAR].p_camt[i]) + continue; + if (CANT_HAPPEN(pchr[P_BAR].p_ctype[i] <= I_NONE || + pchr[P_BAR].p_ctype[i] > I_MAX)) + continue; n = min(n, - (double)(ITEM_MAX - sect.sct_item[pchr[P_BAR].p_vtype[i]]) - / (pchr[P_BAR].p_vamt[i] * grind_eff)); + (double)(ITEM_MAX - sect.sct_item[pchr[P_BAR].p_ctype[i]]) + / (pchr[P_BAR].p_camt[i] * grind_eff)); } + if (n > 0) { pr("%d bars ground up in %s\n", n, xyas(sect.sct_x, sect.sct_y, player->cnum)); sect.sct_item[I_BAR] -= n; - for (i = 0; i < pchr[P_BAR].p_nv; i++) { - sect.sct_item[pchr[P_BAR].p_vtype[i]] - += n * pchr[P_BAR].p_vamt[i] * grind_eff; + for (i = 0; i < MAXPRCON; i++) { + if (!pchr[P_BAR].p_camt[i]) + continue; + if (CANT_HAPPEN(pchr[P_BAR].p_ctype[i] <= I_NONE || + pchr[P_BAR].p_ctype[i] > I_MAX)) + continue; + sect.sct_item[pchr[P_BAR].p_ctype[i]] + += n * pchr[P_BAR].p_camt[i] * grind_eff; } sect.sct_avail -= avail; putsect(§); diff --git a/src/lib/commands/prod.c b/src/lib/commands/prod.c index bdec10e8..4551b5d8 100644 --- a/src/lib/commands/prod.c +++ b/src/lib/commands/prod.c @@ -77,8 +77,8 @@ prod(void) int totpop; int act; /* actual production */ int cost; - int i; - int max; /* production w/infinate materials */ + int i, j; + int max; /* production w/infinite materials */ int nsect; double take; double mtake; @@ -87,14 +87,10 @@ prod(void) int used; /* production w/infinite workforce */ int wforce; int it; - u_short *amount; /* amount for component pointer */ - u_char *comp; /* component pointer */ - u_char *endcomp; u_char vtype; s_char *resource; - int c; - s_char maxc[3][10]; - s_char use[3][10]; + s_char maxc[MAXPRCON][10]; + s_char use[MAXPRCON][10]; int lcms, hcms; int civs = 0; int uws = 0; @@ -232,13 +228,14 @@ prod(void) * raw material limit */ used = 9999; - amount = pp->p_vamt; - endcomp = pp->p_vtype + pp->p_nv; - for (comp = pp->p_vtype; comp < endcomp; comp++, amount++) { - if (*amount == 0) + for (j = 0; j < MAXPRCON; ++j) { + it = pp->p_ctype[j]; + if (!pp->p_camt[j]) continue; - used = min(used, sect.sct_item[(int)*comp] / *amount); - unit_work += *amount; + if (CANT_HAPPEN(it <= I_NONE || I_MAX < it)) + continue; + used = min(used, sect.sct_item[it] / pp->p_camt[j]); + unit_work += pp->p_camt[j]; } if (unit_work == 0) unit_work = 1; @@ -275,22 +272,20 @@ prod(void) } } - comp = pp->p_vtype; - amount = pp->p_vamt; i = 0; - while (comp < endcomp) { - it = unitem((int)*comp); - if (it > 0 && it <= I_MAX && ichr[it].i_name != 0) - c = ichr[it].i_name[0]; - else - c = ' '; - (void)sprintf(use[i], " %3d%c", - (int)((take * (double)(*amount)) + 0.5), c); - (void)sprintf(maxc[i], " %3d%c", - (int)((mtake * (double)(*amount)) + 0.5), c); - ++comp; - ++amount; - ++i; + for (j = 0; j < MAXPRCON; ++j) { + it = pp->p_ctype[j]; + if (it > I_NONE && it <= I_MAX && ichr[it].i_name != 0) { + if (CANT_HAPPEN(i >= 3)) + break; + sprintf(use[i], " %3d%c", + (int)((take * (double)pp->p_camt[j]) + 0.5), + ichr[it].i_name[0]); + sprintf(maxc[i], " %3d%c", + (int)((mtake * (double)pp->p_camt[j]) + 0.5), + ichr[it].i_name[0]); + ++i; + } } while (i < 3) { strcpy(use[i], " "); diff --git a/src/lib/global/product.c b/src/lib/global/product.c index fbf549ec..39a5c7e8 100644 --- a/src/lib/global/product.c +++ b/src/lib/global/product.c @@ -41,58 +41,58 @@ struct pchrstr pchr[] = { /* level cost nrndx nrdep nlndx nlmin nllag effic sname name */ - {0, {0}, {0}, + {{I_NONE, I_NONE, I_NONE}, {0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, "unused", "",}, - {2, {V_LCM, V_HCM}, {2, 1}, + {{I_LCM, I_HCM, I_NONE}, {2, 1, 0}, V_SHELL, -1, 3, 0, 0, NAT_TLEV, 20, 10, 100, "shells", "shells",}, - {3, {V_OIL, V_LCM, V_HCM}, {1, 5, 10}, + {{I_OIL, I_LCM, I_HCM}, {1, 5, 10}, V_GUN, -1, 30, 0, 0, NAT_TLEV, 20, 10, 100, "guns", "guns",}, - {1, {V_OIL}, {1}, + {{I_OIL, I_NONE, I_NONE}, {1, 0, 0}, V_PETROL, -1, 1, 0, 0, NAT_TLEV, 20, 10, 1000, "petrol", "petrol",}, - {0, {0}, {0}, + {{I_NONE, I_NONE, I_NONE}, {0, 0, 0}, V_IRON, -1, 0, offsetof(struct sctstr, sct_min), 0, -1, 0, 0, 100, "iron ore", "iron",}, - {0, {0}, {0}, + {{I_NONE, I_NONE, I_NONE}, {0, 0, 0}, V_DUST, -1, 0, offsetof(struct sctstr, sct_gmin), 20, -1, 0, 0, 100, "gold dust", "dust",}, - {1, {V_DUST}, {5}, + {{I_DUST, I_NONE, I_NONE}, {5, 0, 0}, V_BAR, -1, 10, 0, 0, -1, 0, 0, 100, "gold bars", "bars",}, - {0, {0}, {0}, + {{I_NONE, I_NONE, I_NONE}, {0, 0, 0}, V_FOOD, -1, 0, offsetof(struct sctstr, sct_fertil), 0, NAT_TLEV, -10, 10, 900, "food", "food",}, - {0, {0}, {0}, + {{I_NONE, I_NONE, I_NONE}, {0, 0, 0}, V_OIL, -1, 0, offsetof(struct sctstr, sct_oil), 10, NAT_TLEV, -10, 10, 100, "oil", "oil",}, - {1, {V_IRON}, {1}, + {{I_IRON, I_NONE, I_NONE}, {1, 0, 0}, V_LCM, -1, 0, 0, 0, NAT_TLEV, -10, 10, 100, "light construction materials", "lcm",}, - {1, {V_IRON}, {2}, + {{I_IRON, I_NONE, I_NONE}, {2, 0, 0}, V_HCM, -1, 0, 0, 0, NAT_TLEV, -10, 10, 100, "heavy construction materials", "hcm",}, - {3, {V_DUST, V_OIL, V_LCM}, {1, 5, 10}, + {{I_DUST, I_OIL, I_LCM}, {1, 5, 10}, 0, NAT_TLEV, 300, 0, 0, NAT_ELEV, 5, 10, 100, "technological breakthroughs", "tech",}, - {3, {V_DUST, V_OIL, V_LCM}, {1, 5, 10}, + {{I_DUST, I_OIL, I_LCM}, {1, 5, 10}, 0, NAT_RLEV, 90, 0, 0, NAT_ELEV, 5, 10, 100, "medical discoveries", "medical",}, - {1, {V_LCM}, {1}, + {{I_LCM, I_NONE, I_NONE}, {1, 0, 0}, 0, NAT_ELEV, 9, 0, 0, -1, 0, 0, 100, "a class of graduates", "edu",}, - {1, {V_LCM}, {1}, + {{I_LCM, I_NONE, I_NONE}, {1, 0, 0}, 0, NAT_HLEV, 9, 0, 0, -1, 0, 0, 100, "happy strollers", "happy",}, - {0, {0}, {0}, + {{I_NONE, I_NONE, I_NONE}, {0, 0, 0}, V_RAD, -1, 2, offsetof(struct sctstr, sct_uran), 35, NAT_TLEV, 40, 10, 100, "radioactive materials", "rad",}, - {0, {0}, {0}, + {{I_NONE, I_NONE, I_NONE}, {0, 0, 0}, V_DUST, -1, 0, offsetof(struct sctstr, sct_gmin), 20, -1, 0, 0, 75, "gold dust", "dust",}, - {0, {0}, {0}, + {{I_NONE, I_NONE, I_NONE}, {0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "",} }; diff --git a/src/lib/subs/show.c b/src/lib/subs/show.c index 139da95f..11fedc96 100644 --- a/src/lib/subs/show.c +++ b/src/lib/subs/show.c @@ -701,12 +701,14 @@ show_sect_capab(int foo) pr("%c %-23s %-7s ", dchr[x].d_mnem, dchr[x].d_name, pchr[j].p_sname); - /*for(i=0;i 3); /* output has only three columns */ for (i = 0; i < 3; i++) { - if ((i < pchr[j].p_nv) && (pchr[j].p_vamt[i] > 0)) { - pr("%2d %c ", pchr[j].p_vamt[i], - ichr[pchr[j].p_vtype[i] & (~VT_ITEM)].i_name[0]); + if (i < MAXPRCON + && pchr[j].p_camt[i] + && pchr[j].p_ctype[i] > I_NONE + && pchr[j].p_ctype[i] <= I_MAX) { + pr("%2d %c ", pchr[j].p_camt[i], + ichr[pchr[j].p_ctype[i] & (~VT_ITEM)].i_name[0]); } else { pr(" "); } diff --git a/src/lib/update/produce.c b/src/lib/update/produce.c index 20b70b9b..43acfc11 100644 --- a/src/lib/update/produce.c +++ b/src/lib/update/produce.c @@ -176,53 +176,42 @@ produce(struct natstr *np, struct sctstr *sp, short *vec, int work, } static int -materials_cost(struct pchrstr *product, short *vec, int *costp) +materials_cost(struct pchrstr *pp, short *vec, int *costp) { - register u_char *vp; - register u_short *ap; - register int count; - register int cost; - register int n; - register u_char *endp; + int count; + int cost; + int i, n; count = 9999; cost = 0; - ap = product->p_vamt; - endp = product->p_vtype + product->p_nv; - for (vp = product->p_vtype; vp < endp; vp++, ap++) { - if (!*ap) + for (i = 0; i < MAXPRCON; ++i) { + if (!pp->p_camt[i]) continue; - n = vec[*vp & ~VT_ITEM] / *ap; + if (CANT_HAPPEN(pp->p_ctype[i] <= I_NONE || I_MAX < pp->p_ctype[i])) + continue; + n = vec[pp->p_ctype[i]] / pp->p_camt[i]; if (n < count) count = n; - cost += *ap; + cost += pp->p_camt[i]; } *costp = cost; return count; } static void -materials_charge(struct pchrstr *product, short *vec, int count) +materials_charge(struct pchrstr *pp, short *vec, int count) { - register u_char *vp; - register u_short *ap; - register u_char *endp; - register int item; - register int n; + int i, item, n; - ap = product->p_vamt; - endp = product->p_vtype + product->p_nv; - for (vp = product->p_vtype; vp < endp; vp++, ap++) { - item = *vp & ~VT_ITEM; - if (item < 0 || item > I_MAX) { - logerror("materials_charge: bad item %d", item); + for (i = 0; i < MAXPRCON; ++i) { + item = pp->p_ctype[i]; + if (!pp->p_camt[i]) continue; - } - if ((n = vec[item] - *ap * count) < 0) { - logerror("materials_charge: %d > %d item #%d", - n, vec[item], item); + if (CANT_HAPPEN(item <= I_NONE || I_MAX < item)) + continue; + n = vec[item] - pp->p_camt[i] * count; + if (CANT_HAPPEN(n < 0)) n = 0; - } vec[item] = n; } } diff --git a/src/server/main.c b/src/server/main.c index 70c4da20..5889356b 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -439,13 +439,13 @@ nullify_objects(void) dchr[i].d_lcms = 0; } for (i = 0; i < prd_maxno; i++) { - for (j = 0; j < pchr[i].p_nv; j++) { - if (opt_NO_HCMS && pchr[i].p_vtype[j] == V_HCM) - pchr[i].p_vamt[j] = 0; - if (opt_NO_LCMS && pchr[i].p_vtype[j] == V_LCM) - pchr[i].p_vamt[j] = 0; - if (opt_NO_OIL && pchr[i].p_vtype[j] == V_OIL) - pchr[i].p_vamt[j] = 0; + for (j = 0; j < MAXPRCON; j++) { + if (opt_NO_HCMS && pchr[i].p_ctype[j] == I_HCM) + pchr[i].p_camt[j] = 0; + if (opt_NO_LCMS && pchr[i].p_ctype[j] == I_LCM) + pchr[i].p_camt[j] = 0; + if (opt_NO_OIL && pchr[i].p_ctype[j] == I_OIL) + pchr[i].p_camt[j] = 0; } } }