From e5804f8dd8073cb9e8fc529cc7dbe7138453021e Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 19 Feb 2005 17:28:30 +0000 Subject: [PATCH] (prod, produce, upd_ship): struct pchrstr p_nrndx refers to u_char, not s_char. Fix types. (upd_ship): Catch resource underflow (should not happen). --- src/lib/commands/prod.c | 4 ++-- src/lib/update/produce.c | 4 ++-- src/lib/update/ship.c | 9 ++++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/lib/commands/prod.c b/src/lib/commands/prod.c index 16494b39..4f894cf3 100644 --- a/src/lib/commands/prod.c +++ b/src/lib/commands/prod.c @@ -87,7 +87,7 @@ prod(void) int wforce; i_type it; i_type vtype; - s_char *resource; + u_char *resource; s_char maxc[MAXPRCON][10]; s_char use[MAXPRCON][10]; int lcms, hcms; @@ -204,7 +204,7 @@ prod(void) goto is_enlist; if (pp->p_nrndx != 0) { unit_work++; - resource = ((s_char *)§) + pp->p_nrndx; + resource = (u_char *)§ + pp->p_nrndx; p_e = (*resource * p_e) / 100.0; } /* diff --git a/src/lib/update/produce.c b/src/lib/update/produce.c index ee35f74a..6a69f2e2 100644 --- a/src/lib/update/produce.c +++ b/src/lib/update/produce.c @@ -57,7 +57,7 @@ produce(struct natstr *np, struct sctstr *sp, short *vec, int work, struct pchrstr *product; double p_e; double prodeff; - s_char *resource; + u_char *resource; double output; int actual; int unit_work; @@ -82,7 +82,7 @@ produce(struct natstr *np, struct sctstr *sp, short *vec, int work, p_e = neweff / 100.0; if (product->p_nrndx != 0) { unit_work++; - resource = ((s_char *)sp) + product->p_nrndx; + resource = (u_char *)sp + product->p_nrndx; p_e = (*resource * p_e) / 100.0; } /* diff --git a/src/lib/update/ship.c b/src/lib/update/ship.c index 68adce71..861304a1 100644 --- a/src/lib/update/ship.c +++ b/src/lib/update/ship.c @@ -121,6 +121,7 @@ upd_ship(struct shpstr *sp, int etus, int max_food; struct pchrstr *product; s_char *resource; + int dep; int n; int mult; int needed; @@ -180,9 +181,11 @@ upd_ship(struct shpstr *sp, int etus, oil_gained = max_oil - sp->shp_item[I_OIL]; sp->shp_item[I_OIL] += oil_gained; if (product->p_nrdep != 0 && oil_gained > 0) { - resource = ((s_char *)sectp) + product->p_nrndx; - *resource -= roundavg(oil_gained * - product->p_nrdep / 100.0); + resource = (u_char *)sectp + product->p_nrndx; + dep = roundavg(oil_gained * product->p_nrdep / 100.0); + if (CANT_HAPPEN(dep > *resource)) + dep = *resource; + *resource -= dep; } } if ((mp->m_flags & M_FOOD) && sectp->sct_type == SCT_WATER) {