]> git.pond.sub.org Git - empserver/commitdiff
(upd_ship, upd_land, do_plague): Work directly on item arrays instead
authorMarkus Armbruster <armbru@pond.sub.org>
Thu, 11 Mar 2004 18:10:25 +0000 (18:10 +0000)
committerMarkus Armbruster <armbru@pond.sub.org>
Thu, 11 Mar 2004 18:10:25 +0000 (18:10 +0000)
of copies made by getvec().  This is safe, because the new code
changes the item array precisely when the old code writes back a
changed copy.
(starv_ships, starv_units): Replace getvec() by direct, read-only item
access.
(feed_ship, feed_land): Remove parameter vec, work with sp->shp_item[]
and lp->lnd_item[] instead.
(plague_people): Change argument type to match uncopied item arrays.

include/prototypes.h
src/lib/commands/strv.c
src/lib/update/land.c
src/lib/update/plague.c
src/lib/update/ship.c

index 9ea253b18ffdb9134af7cdf2af36235555d22af9..d23e755215e42629fa632f2010c92f187e1e4038 100644 (file)
@@ -555,7 +555,7 @@ extern int do_feed(register struct sctstr *, register struct natstr *,
 extern int feed_people(register int *, int, int *);
 /* land.c */
 extern int prod_land(int, int, int *, int);
-extern int feed_land(struct lndstr *, register int *, int, int *, int);
+extern int feed_land(struct lndstr *, int, int *, int);
 /* main.c */
 /* in server.h */
 /* material.c */
@@ -591,7 +591,7 @@ extern s_char *nxtitemp(struct nstr_item *, int);
 extern struct sctstr *nxtsctp(register struct nstr_sect *);
 /* plague.c */
 extern void do_plague(struct sctstr *, struct natstr *, int);
-extern int plague_people(struct natstr *, int *, u_short *, u_short *, int);
+extern int plague_people(struct natstr *, short *, u_short *, u_short *, int);
 /* plane.c */
 extern int prod_plane(int, int, int *, int);
 /* populace.c */
@@ -623,7 +623,7 @@ extern void produce_sect(int natnum, int etu, int *bp,
                         long int (*p_sect)[2], int sector_type);
 /* ship.c */
 extern int prod_ship(int, int, int *, int);
-extern int feed_ship(struct shpstr *, register int *, int, int *, int);
+extern int feed_ship(struct shpstr *, int, int *, int);
 
 /*
  * src/server
index 5faa5451785321a5da6d32e1027b50ddee4d7d2e..83ef0e9567b2a00b84f06ebc60cc68e32b3ee723 100644 (file)
@@ -164,7 +164,7 @@ starv_ships(s_char *range)
     struct nstr_item ni;
     struct shpstr ship;
     int nship = 0;
-    int vec[I_MAX + 1], s, needed;
+    int s, needed;
 
     if (!snxtitem(&ni, EF_SHIP, range))
        return;
@@ -173,9 +173,7 @@ starv_ships(s_char *range)
        if (!player->owner || !ship.shp_own)
            continue;
 
-       getvec(VT_ITEM, vec, (s_char *)&ship, EF_SHIP);
-       s = feed_ship(&ship, vec, etu_per_update, &needed, 0);
-
+       s = feed_ship(&ship, etu_per_update, &needed, 0);
        if (s == 0)
            continue;
        if (nship++ == 0)
@@ -214,7 +212,7 @@ starv_units(s_char *range)
     struct nstr_item ni;
     struct lndstr land;
     int nunit = 0;
-    int vec[I_MAX + 1], s, needed;
+    int s, needed;
 
     if (!snxtitem(&ni, EF_LAND, range))
        return;
@@ -223,9 +221,7 @@ starv_units(s_char *range)
        if (!player->owner || !land.lnd_own)
            continue;
 
-       getvec(VT_ITEM, vec, (s_char *)&land, EF_LAND);
-       s = feed_land(&land, vec, etu_per_update, &needed, 0);
-
+       s = feed_land(&land, etu_per_update, &needed, 0);
        if (s == 0)
            continue;
        if (nunit++ == 0)
index 7c403526702491a97a457803eae9183264e9b0a9..453bc8f41718f46c6c66fb9152814cb325d4601b 100644 (file)
@@ -117,7 +117,6 @@ upd_land(register struct lndstr *lp, register int etus,
 {
     struct lchrstr *lcp;
     u_short pstage, ptime;
-    int vec[I_MAX + 1];
     int n;
     int min = morale_base - (int)np->nat_level[NAT_HLEV];
     int mult;
@@ -170,8 +169,7 @@ upd_land(register struct lndstr *lp, register int etus,
            resupply_commod(lp, I_FOOD);
 
        if (!player->simulation) {
-           getvec(VT_ITEM, vec, (s_char *)lp, EF_LAND);
-           if ((n = feed_land(lp, vec, etus, &needed, 1)) > 0) {
+           if ((n = feed_land(lp, etus, &needed, 1)) > 0) {
                wu(0, lp->lnd_own, "%d starved in %s%s\n",
                   n, prland(lp),
                   (lp->lnd_effic < LAND_MINEFF ? ", killing it" : ""));
@@ -185,7 +183,7 @@ upd_land(register struct lndstr *lp, register int etus,
            pstage = lp->lnd_pstage;
            ptime = lp->lnd_ptime;
            if (pstage != PLG_HEALTHY) {
-               n = plague_people(np, vec, &pstage, &ptime, etus);
+               n = plague_people(np, lp->lnd_item, &pstage, &ptime, etus);
                switch (n) {
                case PLG_DYING:
                    wu(0, lp->lnd_own,
@@ -229,7 +227,6 @@ upd_land(register struct lndstr *lp, register int etus,
                lp->lnd_pstage = pstage;
                lp->lnd_ptime = ptime;
            }
-           putvec(VT_ITEM, vec, (s_char *)lp, EF_LAND);
        }                       /* end !player->simulation */
     }
 }
@@ -248,14 +245,12 @@ landrepair(register struct lndstr *land, struct natstr *np,
     int avail;
     int w_p_eff;
     int mult;
-    int svec[I_MAX + 1];
     int mvec[I_MAX + 1];
 
     lp = &lchr[(int)land->lnd_type];
     sp = getsectp(land->lnd_x, land->lnd_y);
     if (sp->sct_off)
        return 1;
-    getvec(VT_ITEM, svec, (s_char *)sp, EF_SECTOR);
     mult = 1;
     if (np->nat_level[NAT_TLEV] < land->lnd_tech * 0.85)
        mult = 2;
@@ -360,8 +355,7 @@ landrepair(register struct lndstr *land, struct natstr *np,
  * returns the number who starved, if any.
  */
 int
-feed_land(struct lndstr *lp, register int *vec, int etus, int *needed,
-         int doit)
+feed_land(struct lndstr *lp, int etus, int *needed, int doit)
 {
     double food_eaten, ship_eaten;
     int ifood_eaten;
@@ -388,32 +382,32 @@ feed_land(struct lndstr *lp, register int *vec, int etus, int *needed,
      * the ship, tho...
      */
 /* doit - Only try to take food off the ship during the update */
-    if (ifood_eaten > vec[I_FOOD] && lp->lnd_ship >= 0 && doit) {
-       need = ifood_eaten - vec[I_FOOD];
+    if (ifood_eaten > lp->lnd_item[I_FOOD] && lp->lnd_ship >= 0 && doit) {
+       need = ifood_eaten - lp->lnd_item[I_FOOD];
        sp = getshipp(lp->lnd_ship);
        ship_eaten = etus * eatrate * (sp->shp_item[I_CIVIL]
                                       + sp->shp_item[I_MILIT]
                                       + sp->shp_item[I_UW]);
        if (sp->shp_item[I_FOOD] - need > ship_eaten) {
-           vec[I_FOOD] += need;
+           lp->lnd_item[I_FOOD] += need;
            sp->shp_item[I_FOOD] -= need;
        } else if (sp->shp_item[I_FOOD] - ship_eaten > 0) {
-           vec[I_FOOD] += sp->shp_item[I_FOOD] - ship_eaten;
+           lp->lnd_item[I_FOOD] += sp->shp_item[I_FOOD] - ship_eaten;
            sp->shp_item[I_FOOD] -= sp->shp_item[I_FOOD] - ship_eaten;
        }
     }
 
-    if (ifood_eaten > vec[I_FOOD]) {
-       *needed = ifood_eaten - vec[I_FOOD];
-       people_left = (vec[I_FOOD] + 0.01) / (food_eaten + 0.01);
+    if (ifood_eaten > lp->lnd_item[I_FOOD]) {
+       *needed = ifood_eaten - lp->lnd_item[I_FOOD];
+       people_left = (lp->lnd_item[I_FOOD] + 0.01) / (food_eaten + 0.01);
        /* only want to starve off at most 1/2 the populace. */
        if (people_left < 0.5)
            people_left = 0.5;
        starved = total_people * (1 - people_left);
-       vec[I_MILIT] -= starved;
-       vec[I_FOOD] = 0;
+       lp->lnd_item[I_MILIT] -= starved;
+       lp->lnd_item[I_FOOD] = 0;
     } else {
-       vec[I_FOOD] -= (int)food_eaten;
+       lp->lnd_item[I_FOOD] -= (int)food_eaten;
     }
     return starved;
 }
index 94ba2702f1ff0c39465e04d5d293984e85f93148..115d9114e5f4def040c4ae5150e7e557e1b10fcc 100644 (file)
@@ -52,7 +52,6 @@ static int infect_people(struct natstr *, struct sctstr *);
 void
 do_plague(struct sctstr *sp, struct natstr *np, int etu)
 {
-    int vec[I_MAX + 1];
     u_short pstage, ptime;
     int n;
 
@@ -66,8 +65,7 @@ do_plague(struct sctstr *sp, struct natstr *np, int etu)
        pstage = infect_people(np, sp);
        ptime = 0;
     } else {
-       getvec(VT_ITEM, vec, (s_char *)sp, EF_SECTOR);
-       n = plague_people(np, vec, &pstage, &ptime, etu);
+       n = plague_people(np, sp->sct_item, &pstage, &ptime, etu);
        switch (n) {
        case PLG_DYING:
            wu(0, sp->sct_own, "PLAGUE deaths reported in %s.\n",
@@ -107,7 +105,6 @@ do_plague(struct sctstr *sp, struct natstr *np, int etu)
        default:
            break;
        }
-       putvec(VT_ITEM, vec, (s_char *)sp, EF_SECTOR);
     }
     if (sp->sct_item[I_CIVIL] == 0 && sp->sct_item[I_MILIT] == 0
        && !has_units(sp->sct_x, sp->sct_y, sp->sct_own, 0)) {
@@ -154,7 +151,7 @@ infect_people(struct natstr *np, struct sctstr *sp)
  * stage.  No reports generated here anymore.
  */
 int
-plague_people(struct natstr *np, register int *vec,
+plague_people(struct natstr *np, short *vec,
              u_short *pstage, u_short *ptime,
              int etus)
 {
index e9e303dcc775bada92ac9c6a0fc229477f61fa7e..2e043bea80df0c5dcf0a06f263628ca3236599af 100644 (file)
@@ -116,7 +116,6 @@ upd_ship(register struct shpstr *sp, register int etus,
 {
     struct sctstr *sectp;
     struct mchrstr *mp;
-    int vec[I_MAX + 1];
     u_short pstage, ptime;
     int oil_gained;
     int max_oil;
@@ -163,19 +162,18 @@ upd_ship(register struct shpstr *sp, register int etus,
        }
 
        if (!player->simulation) {
-           getvec(VT_ITEM, vec, (s_char *)sp, EF_SHIP);
            sectp = getsectp(sp->shp_x, sp->shp_y);
 
            if ((mp->m_flags & M_OIL) && sectp->sct_type == SCT_WATER) {
                /*
                 * take care of oil production
                 */
-               oil_gained = roundavg((vec[I_CIVIL] * etus / 10000.0)
+               oil_gained = roundavg((sp->shp_item[I_CIVIL] * etus / 10000.0)
                                      * sectp->sct_oil);
-               vec[I_OIL] += oil_gained;
+               sp->shp_item[I_OIL] += oil_gained;
                max_oil = vl_find(V_OIL, mp->m_vtype, mp->m_vamt, mp->m_nv);
-               if (vec[I_OIL] > max_oil)
-                   vec[I_OIL] = max_oil;
+               if (sp->shp_item[I_OIL] > max_oil)
+                   sp->shp_item[I_OIL] = max_oil;
                product = &pchr[P_OIL];
                if (product->p_nrdep != 0 && oil_gained > 0) {
                    resource = ((s_char *)sectp) + product->p_nrndx;
@@ -184,17 +182,17 @@ upd_ship(register struct shpstr *sp, register int etus,
                }
            }
            if ((mp->m_flags & M_FOOD) && sectp->sct_type == SCT_WATER) {
-               vec[I_FOOD] += ((vec[I_CIVIL] * etus) / 1000.0)
+               sp->shp_item[I_FOOD] += ((sp->shp_item[I_CIVIL] * etus) / 1000.0)
                    * sectp->sct_fertil;
            }
-           if ((n = feed_ship(sp, vec, etus, &needed, 1)) > 0) {
+           if ((n = feed_ship(sp, etus, &needed, 1)) > 0) {
                wu(0, sp->shp_own, "%d starved on %s\n", n, prship(sp));
                if (n > 10)
                    nreport(sp->shp_own, N_DIE_FAMINE, 0, 1);
            }
            max_food = vl_find(V_FOOD, mp->m_vtype, mp->m_vamt, mp->m_nv);
-           if (vec[I_FOOD] > max_food)
-               vec[I_FOOD] = max_food;
+           if (sp->shp_item[I_FOOD] > max_food)
+               sp->shp_item[I_FOOD] = max_food;
            /*
             * do plague stuff.  plague can't break out on ships,
             * but it can still kill people.
@@ -202,7 +200,7 @@ upd_ship(register struct shpstr *sp, register int etus,
            pstage = sp->shp_pstage;
            ptime = sp->shp_ptime;
            if (pstage != PLG_HEALTHY) {
-               n = plague_people(np, vec, &pstage, &ptime, etus);
+               n = plague_people(np, sp->shp_item, &pstage, &ptime, etus);
                switch (n) {
                case PLG_DYING:
                    wu(0, sp->shp_own,
@@ -247,8 +245,7 @@ upd_ship(register struct shpstr *sp, register int etus,
                sp->shp_pstage = pstage;
                sp->shp_ptime = ptime;
            }
-           putvec(VT_ITEM, vec, (s_char *)sp, EF_SHIP);
-           pops[sp->shp_own] += vec[I_CIVIL];
+           pops[sp->shp_own] += sp->shp_item[I_CIVIL];
        }
     }
 }
@@ -423,8 +420,7 @@ shiprepair(register struct shpstr *ship, struct natstr *np,
  * returns the number who starved, if any.
  */
 int
-feed_ship(struct shpstr *sp, register int *vec, int etus, int *needed,
-         int doit)
+feed_ship(struct shpstr *sp, int etus, int *needed, int doit)
 {
     double food_eaten, land_eaten;
     int ifood_eaten;
@@ -438,63 +434,65 @@ feed_ship(struct shpstr *sp, register int *vec, int etus, int *needed,
     if (opt_NOFOOD)
        return 0;               /* no food no work to do */
 
-    total_people = vec[I_CIVIL] + vec[I_MILIT] + vec[I_UW];
+    total_people
+       = sp->shp_item[I_CIVIL] + sp->shp_item[I_MILIT] + sp->shp_item[I_UW];
     food_eaten = etus * eatrate * total_people;
     ifood_eaten = (int)food_eaten;
     if (food_eaten - ifood_eaten > 0)
        ifood_eaten++;
     starved = 0;
     *needed = 0;
-    if (!player->simulation && ifood_eaten > vec[I_FOOD])
-       vec[I_FOOD] += supply_commod(sp->shp_own, sp->shp_x, sp->shp_y,
-                                    I_FOOD, ifood_eaten - vec[I_FOOD]);
+    if (!player->simulation && ifood_eaten > sp->shp_item[I_FOOD])
+       sp->shp_item[I_FOOD]
+           += supply_commod(sp->shp_own, sp->shp_x, sp->shp_y,
+                            I_FOOD, ifood_eaten - sp->shp_item[I_FOOD]);
 
 /* doit - only steal food from land units during the update */
-    if (ifood_eaten > vec[I_FOOD] && sp->shp_nland > 0 && doit) {
+    if (ifood_eaten > sp->shp_item[I_FOOD] && sp->shp_nland > 0 && doit) {
        snxtitem_all(&ni, EF_LAND);
        while ((lp = (struct lndstr *)nxtitemp(&ni, 0)) &&
-              ifood_eaten > vec[I_FOOD]) {
+              ifood_eaten > sp->shp_item[I_FOOD]) {
            if (lp->lnd_ship != sp->shp_uid)
                continue;
-           need = ifood_eaten - vec[I_FOOD];
+           need = ifood_eaten - sp->shp_item[I_FOOD];
            land_eaten = etus * eatrate * lnd_getmil(lp);
            if (lp->lnd_item[I_FOOD] - need > land_eaten) {
-               vec[I_FOOD] += need;
+               sp->shp_item[I_FOOD] += need;
                lp->lnd_item[I_FOOD] -= need;
            } else if (lp->lnd_item[I_FOOD] - land_eaten > 0) {
-               vec[I_FOOD] += lp->lnd_item[I_FOOD] - land_eaten;
+               sp->shp_item[I_FOOD] += lp->lnd_item[I_FOOD] - land_eaten;
                lp->lnd_item[I_FOOD] -= lp->lnd_item[I_FOOD] - land_eaten;
            }
        }
     }
 
-    if (ifood_eaten > vec[I_FOOD]) {
-       *needed = ifood_eaten - vec[I_FOOD];
-       can_eat = vec[I_FOOD] / (etus * eatrate);
+    if (ifood_eaten > sp->shp_item[I_FOOD]) {
+       *needed = ifood_eaten - sp->shp_item[I_FOOD];
+       can_eat = sp->shp_item[I_FOOD] / (etus * eatrate);
        /* only want to starve off at most 1/2 the populace. */
        if (can_eat < total_people / 2)
            can_eat = total_people / 2;
 
        to_starve = total_people - can_eat;
-       while (to_starve && vec[I_UW]) {
+       while (to_starve && sp->shp_item[I_UW]) {
            to_starve--;
            starved++;
-           vec[I_UW]--;
+           sp->shp_item[I_UW]--;
        }
-       while (to_starve && vec[I_CIVIL]) {
+       while (to_starve && sp->shp_item[I_CIVIL]) {
            to_starve--;
            starved++;
-           vec[I_CIVIL]--;
+           sp->shp_item[I_CIVIL]--;
        }
-       while (to_starve && vec[I_MILIT]) {
+       while (to_starve && sp->shp_item[I_MILIT]) {
            to_starve--;
            starved++;
-           vec[I_MILIT]--;
+           sp->shp_item[I_MILIT]--;
        }
 
-       vec[I_FOOD] = 0;
+       sp->shp_item[I_FOOD] = 0;
     } else {
-       vec[I_FOOD] -= (int)food_eaten;
+       sp->shp_item[I_FOOD] -= (int)food_eaten;
     }
     return starved;
 }