]> git.pond.sub.org Git - empserver/commitdiff
Update lost file from prewrite callbacks
authorMarkus Armbruster <armbru@pond.sub.org>
Sat, 6 Sep 2008 15:21:32 +0000 (11:21 -0400)
committerMarkus Armbruster <armbru@pond.sub.org>
Tue, 9 Sep 2008 01:26:42 +0000 (21:26 -0400)
Losses of sectors, ships, planes, land units and nukes are tracked in
the lost file.  To keep it current, makelost() and makenotlost() were
called whenever one of these changed owners.  Cumbersome and
error-prone.  In fact, the lost file was never perfectly accurate.

Detect the ownership change in the prewrite callback and call
makelost() / makenotlost() from there.  Remove lost file updates from
where they're no longer needed: right before a put.  takeover() is a
bit more involved: it doesn't put the sectors, but all callers do,
except for guerrilla().  So remove the lost file update from
takeover(), but add it to guerrilla().

This takes care of lost file update for all ownership changes that go
through ef_write().  It can't take care of any missing updates for
changes that don't go through it.

19 files changed:
src/lib/commands/anti.c
src/lib/commands/buil.c
src/lib/commands/cede.c
src/lib/commands/coll.c
src/lib/commands/edit.c
src/lib/commands/load.c
src/lib/commands/scra.c
src/lib/commands/setsect.c
src/lib/commands/trad.c
src/lib/subs/attsub.c
src/lib/subs/bridgefall.c
src/lib/subs/detonate.c
src/lib/subs/land.c
src/lib/subs/nuke.c
src/lib/subs/plane.c
src/lib/subs/sect.c
src/lib/subs/ship.c
src/lib/subs/takeover.c
src/lib/update/revolt.c

index a20ff69224507f228b2093284979e5396d1263db..bdced571843b2fefa3829652c2ed9faac13d8b50 100644 (file)
@@ -138,10 +138,6 @@ anti(void)
                sect.sct_item[I_MILIT] = ache;
                if (sect.sct_own == sect.sct_oldown)
                    sect.sct_oldown = 0;
-               makelost(EF_SECTOR, sect.sct_own, 0,
-                        sect.sct_x, sect.sct_y);
-               makenotlost(EF_SECTOR, sect.sct_oldown, 0,
-                           sect.sct_x, sect.sct_y);
                sect.sct_own = sect.sct_oldown;
                sect.sct_off = 1;       /* Turn the sector off */
                putsect(&sect);
index 2c3251418d439509de47afda6e4fb7ca039ad7ae..6a80a3ab1f5898da4c60f9abdb2b4ea7778164c8 100644 (file)
@@ -383,8 +383,6 @@ build_ship(struct sctstr *sp, struct mchrstr *mp, short *vec, int tlev)
 
     if (sp->sct_pstage == PLG_INFECT)
        ship.shp_pstage = PLG_EXPOSED;
-    makenotlost(EF_SHIP, ship.shp_own, ship.shp_uid,
-               ship.shp_x, ship.shp_y);
     putship(ship.shp_uid, &ship);
     pr("%s", prship(&ship));
     pr(" built in sector %s\n", xyas(sp->sct_x, sp->sct_y, player->cnum));
@@ -507,8 +505,6 @@ build_land(struct sctstr *sp, struct lchrstr *lp, short *vec, int tlev)
     if (sp->sct_pstage == PLG_INFECT)
        land.lnd_pstage = PLG_EXPOSED;
     putland(nstr.cur, &land);
-    makenotlost(EF_LAND, land.lnd_own, land.lnd_uid,
-               land.lnd_x, land.lnd_y);
     pr("%s", prland(&land));
     pr(" built in sector %s\n", xyas(sp->sct_x, sp->sct_y, player->cnum));
     return 1;
@@ -693,8 +689,6 @@ build_nuke(struct sctstr *sp, struct nchrstr *np, short *vec, int tlev)
     vec[I_OIL] -= np->n_oil;
     vec[I_RAD] -= np->n_rad;
 
-    makenotlost(EF_NUKE, nuke.nuk_own, nuke.nuk_uid,
-               nuke.nuk_x, nuke.nuk_y);
     putnuke(nuke.nuk_uid, &nuke);
     pr("%s created in %s\n", prnuke(&nuke),
        xyas(sp->sct_x, sp->sct_y, player->cnum));
@@ -793,8 +787,6 @@ build_plane(struct sctstr *sp, struct plchrstr *pp, short *vec, int tlev)
     vec[I_HCM] -= hcm;
     vec[I_MILIT] -= mil;
 
-    makenotlost(EF_PLANE, plane.pln_own, plane.pln_uid,
-               plane.pln_x, plane.pln_y);
     putplane(plane.pln_uid, &plane);
     pr("%s built in sector %s\n", prplane(&plane),
        xyas(sp->sct_x, sp->sct_y, player->cnum));
index bcc1b63aa24dcdfaf509de28d9ea3084bbc20577..b1981475b508cf88dfb24452e59c69a3cf202462 100644 (file)
@@ -229,10 +229,7 @@ grab_sect(struct sctstr *sp, natid to)
 
        wu(0, to, "\t%s ceded to you by %s\n",
           prplane(pp), cname(player->cnum));
-       makelost(EF_PLANE, pp->pln_own, pp->pln_uid, pp->pln_x, pp->pln_y);
        pp->pln_own = to;
-       makenotlost(EF_PLANE, pp->pln_own, pp->pln_uid,
-                   pp->pln_x, pp->pln_y);
        pp->pln_mobil = 0;
        pp->pln_mission = 0;
        putplane(pp->pln_uid, pp);
@@ -246,10 +243,7 @@ grab_sect(struct sctstr *sp, natid to)
 
        wu(0, to, "\t%s ceded to you by %s\n",
           prnuke(np), cname(player->cnum));
-       makelost(EF_NUKE, np->nuk_own, np->nuk_uid, np->nuk_x, np->nuk_y);
        np->nuk_own = to;
-       makenotlost(EF_NUKE, np->nuk_own, np->nuk_uid,
-                   np->nuk_x, np->nuk_y);
        putnuke(ni.cur, np);
     }
 
@@ -265,8 +259,6 @@ grab_sect(struct sctstr *sp, natid to)
 
        wu(0, to, "\t%s ceded to you by %s\n",
           prland(lp), cname(player->cnum));
-       makelost(EF_LAND, lp->lnd_own, lp->lnd_uid, lp->lnd_x, lp->lnd_y);
-       makenotlost(EF_LAND, to, lp->lnd_uid, lp->lnd_x, lp->lnd_y);
        lp->lnd_own = to;
        lp->lnd_mobil = 0;
        lp->lnd_mission = 0;
@@ -288,8 +280,6 @@ grab_sect(struct sctstr *sp, natid to)
 
     sp->sct_dist_x = sp->sct_x;
     sp->sct_dist_y = sp->sct_y;
-    makelost(EF_SECTOR, sp->sct_own, 0, sp->sct_x, sp->sct_y);
-    makenotlost(EF_SECTOR, to, 0, sp->sct_x, sp->sct_y);
     if (sp->sct_oldown == sp->sct_own)
        sp->sct_oldown = to;
     sp->sct_own = to;
@@ -358,10 +348,7 @@ grab_ship(struct shpstr *sp, natid to)
 
        wu(0, to, "\t%s ceded to you by %s\n",
           prplane(pp), cname(player->cnum));
-       makelost(EF_PLANE, pp->pln_own, pp->pln_uid, pp->pln_x, pp->pln_y);
        pp->pln_own = to;
-       makenotlost(EF_PLANE, pp->pln_own, pp->pln_uid,
-                   pp->pln_x, pp->pln_y);
        pp->pln_mobil = 0;
        pp->pln_mission = 0;
        putplane(pp->pln_uid, pp);
@@ -379,15 +366,11 @@ grab_ship(struct shpstr *sp, natid to)
 
        wu(0, to, "\t%s ceded to you by %s\n",
           prland(lp), cname(player->cnum));
-       makelost(EF_LAND, lp->lnd_own, lp->lnd_uid, lp->lnd_x, lp->lnd_y);
-       makenotlost(EF_LAND, to, lp->lnd_uid, lp->lnd_x, lp->lnd_y);
        lp->lnd_own = to;
        lp->lnd_mobil = 0;
        lp->lnd_mission = 0;
        putland(ni.cur, lp);
     }
 
-    makelost(EF_SHIP, sp->shp_own, sp->shp_uid, sp->shp_x, sp->shp_y);
     sp->shp_own = to;
-    makenotlost(EF_SHIP, sp->shp_own, sp->shp_uid, sp->shp_x, sp->shp_y);
 }
index 04a51c6e5c82d706ca7136db55156dceb5140deb..94a78afd21b96efb905844751c422ea546ab3db1 100644 (file)
@@ -112,8 +112,6 @@ coll(void)
      * Used to call takeover() here a long time ago, but that does
      * unwanted things, like generate che.
      */
-    makelost(EF_SECTOR, sect.sct_own, 0, sect.sct_x, sect.sct_y);
-    makenotlost(EF_SECTOR, player->cnum, 0, sect.sct_x, sect.sct_y);
     sect.sct_own = player->cnum;
 
     memset(sect.sct_dist, 0, sizeof(sect.sct_dist));
index f5af20b703a03406e9dd609e8ff041176ad1fcc7..55695414b438730526fa4ce3e2466d5b57cab4b1 100644 (file)
@@ -462,8 +462,6 @@ doland(char op, int arg, char *p, struct sctstr *sect)
           xyas(sect->sct_x, sect->sct_y, player->cnum),
           cname(sect->sct_own), sect->sct_own, cname(newown), newown);
        if (sect->sct_own) {
-           makelost(EF_SECTOR, sect->sct_own, 0,
-                    sect->sct_x, sect->sct_y);
            wu(player->cnum, sect->sct_own,
               "Sector %s lost to deity intervention\n",
               xyas(sect->sct_x, sect->sct_y, sect->sct_own));
@@ -471,7 +469,6 @@ doland(char op, int arg, char *p, struct sctstr *sect)
        benefit(sect->sct_own, 0);
        sect->sct_own = newown;
        if (newown) {
-           makenotlost(EF_SECTOR, newown, 0, sect->sct_x, sect->sct_y);
            wu(player->cnum, newown,
               "Sector %s gained from deity intervention\n",
               xyas(sect->sct_x, sect->sct_y, sect->sct_own));
@@ -777,11 +774,7 @@ doship(char op, int arg, char *p, struct shpstr *ship)
        if (arg && arg < MAXNOC) {
            wu(player->cnum, (natid)arg,
               "%s given to you by deity intervention!\n", prship(ship));
-           makelost(EF_SHIP, ship->shp_own, ship->shp_uid,
-                    ship->shp_x, ship->shp_y);
            ship->shp_own = (natid)arg;
-           makenotlost(EF_SHIP, ship->shp_own, ship->shp_uid,
-                       ship->shp_x, ship->shp_y);
        } else if (!arg)
            ship->shp_effic = 0;
        break;
@@ -882,11 +875,7 @@ dounit(char op, int arg, char *p, struct lndstr *land)
        if (arg && arg < MAXNOC) {
            wu(player->cnum, (natid)arg,
               "%s given to you by deity intervention!\n", prland(land));
-           makelost(EF_LAND, land->lnd_own, land->lnd_uid,
-                    land->lnd_x, land->lnd_y);
            land->lnd_own = (natid)arg;
-           makenotlost(EF_LAND, land->lnd_own, land->lnd_uid,
-                       land->lnd_x, land->lnd_y);
        } else if (!arg)
            land->lnd_effic = 0;
        break;
@@ -1009,11 +998,7 @@ doplane(char op, int arg, char *p, struct plnstr *plane)
               "%s taken from you by deity intervention!\n",
               prplane(plane));
        if (arg && arg < MAXNOC) {
-           makelost(EF_PLANE, plane->pln_own, plane->pln_uid,
-                    plane->pln_x, plane->pln_y);
            plane->pln_own = (natid)arg;
-           makenotlost(EF_PLANE, plane->pln_own, plane->pln_uid,
-                       plane->pln_x, plane->pln_y);
            wu(player->cnum, plane->pln_own,
               "%s given to you by deity intervention!\n", prplane(plane));
        } else if (!arg)
index d245ba2152152505eccabca29b3b9cc74fd9fb5b..0526275be1a42f1ced679c005720fc20e0110c2f 100644 (file)
@@ -316,10 +316,7 @@ gift(natid givee, natid giver, void *ptr, char *mesg)
 
     if (giver != givee)
        wu(0, givee, "%s %s %s\n", cname(giver), obj_nameof(gen), mesg);
-
-    makelost(gen->ef_type, gen->own, gen->uid, gen->x, gen->y);
     gen->own = givee;
-    makenotlost(gen->ef_type, gen->own, gen->uid, gen->x, gen->y);
 }
 
 static int
index 5de186256aef5d035dc038f0038452d288561644..88985cbedbf61663cbcacfbb892cd92a1f270371 100644 (file)
@@ -196,11 +196,7 @@ scra(void)
                           "%s given to you by %s\n", prplane(&plane),
                           cname(player->cnum));
                    }
-                   makelost(EF_PLANE, plane.pln_own, plane.pln_uid,
-                            plane.pln_x, plane.pln_y);
                    plane.pln_own = sect2.sct_own;
-                   makenotlost(EF_PLANE, plane.pln_own, plane.pln_uid,
-                               plane.pln_x, plane.pln_y);
                    putplane(plane.pln_uid, &plane);
                }
            }
@@ -222,11 +218,7 @@ scra(void)
                           "%s given to you by %s\n", prland(&land),
                           cname(player->cnum));
                    }
-                   makelost(EF_LAND, land.lnd_own, land.lnd_uid,
-                            land.lnd_x, land.lnd_y);
                    land.lnd_own = sect2.sct_own;
-                   makenotlost(EF_LAND, land.lnd_own, land.lnd_uid,
-                               land.lnd_x, land.lnd_y);
                    putland(land.lnd_uid, &land);
                }
            }
@@ -261,11 +253,7 @@ scra(void)
                           "%s given to you by %s\n", prland(&land),
                           cname(player->cnum));
                    }
-                   makelost(EF_LAND, land.lnd_own, land.lnd_uid,
-                            land.lnd_x, land.lnd_y);
                    land.lnd_own = sect2.sct_own;
-                   makenotlost(EF_LAND, land.lnd_own, land.lnd_uid,
-                               land.lnd_x, land.lnd_y);
                    putland(land.lnd_uid, &land);
                }
            }
@@ -288,11 +276,7 @@ scra(void)
                           "%s given to you by %s\n", prplane(&plane),
                           cname(player->cnum));
                    }
-                   makelost(EF_PLANE, plane.pln_own, plane.pln_uid,
-                            plane.pln_x, plane.pln_y);
                    plane.pln_own = sect2.sct_own;
-                   makenotlost(EF_PLANE, plane.pln_own, plane.pln_uid,
-                               plane.pln_x, plane.pln_y);
                    putplane(plane.pln_uid, &plane);
                }
            }
index 07087ece3e44813e9702dc41c5047d5e2f36c822..9c608e297849804ca3cc6f6c0932312801fe18a5 100644 (file)
@@ -149,9 +149,6 @@ setsector(void)
                    wu(player->cnum, amt,
                       "Sector %s gained from deity intervention\n",
                       xyas(sect.sct_x, sect.sct_y, amt));
-               makelost(EF_SECTOR, sect.sct_own, 0,
-                        sect.sct_x, sect.sct_y);
-               makenotlost(EF_SECTOR, amt, 0, sect.sct_x, sect.sct_y);
                sect.sct_own = (natid)amt;
                putsect(&sect);
            }
index dc3037b9b2916faab7b9bad365e45bfc89c87f91..1668c8d68a9ae19f31c068a2ef3b3183aa3cbe62 100644 (file)
@@ -352,22 +352,14 @@ check_trade(void)
        case EF_NUKE:
            tg.nuke.nuk_x = trade.trd_x;
            tg.nuke.nuk_y = trade.trd_y;
-           makelost(EF_NUKE, tg.nuke.nuk_own, tg.nuke.nuk_uid,
-                    tg.nuke.nuk_x, tg.nuke.nuk_y);
            tg.nuke.nuk_own = trade.trd_maxbidder;
-           makenotlost(EF_NUKE, tg.nuke.nuk_own, tg.nuke.nuk_uid,
-                       tg.nuke.nuk_x, tg.nuke.nuk_y);
            break;
        case EF_PLANE:
            if (!pln_is_in_orbit(&tg.plane)) {
                tg.plane.pln_x = trade.trd_x;
                tg.plane.pln_y = trade.trd_y;
            }
-           makelost(EF_PLANE, tg.plane.pln_own, tg.plane.pln_uid,
-                    tg.plane.pln_x, tg.plane.pln_y);
            tg.plane.pln_own = trade.trd_maxbidder;
-           makenotlost(EF_PLANE, tg.plane.pln_own, tg.plane.pln_uid,
-                       tg.plane.pln_x, tg.plane.pln_y);
            tg.plane.pln_wing = 0;
            /* no cheap version of fly */
            if (opt_MOB_ACCESS) {
@@ -393,11 +385,7 @@ check_trade(void)
                ship.shp_nland--;
                putship(ship.shp_uid, &ship);
            }
-           makelost(EF_LAND, tg.land.lnd_own, tg.land.lnd_uid,
-                    tg.land.lnd_x, tg.land.lnd_y);
            tg.land.lnd_own = trade.trd_maxbidder;
-           makenotlost(EF_LAND, tg.land.lnd_own, tg.land.lnd_uid,
-                       tg.land.lnd_x, tg.land.lnd_y);
            tg.land.lnd_army = 0;
            /* no cheap version of fly */
            if (opt_MOB_ACCESS) {
index 64ce6196a4ab6af7c0ad61a896d8d9c0c578005c..2d56188a297a950b6107fd092163887e566cdbf8 100644 (file)
@@ -361,8 +361,6 @@ put_combat(struct combat *com)
                    sect.sct_mobil = (short)(com->mob - com->mobcost);
            }
        }
-       makelost(EF_SECTOR, sect.sct_own, 0, sect.sct_x, sect.sct_y);
-       makenotlost(EF_SECTOR, com->own, 0, sect.sct_x, sect.sct_y);
        sect.sct_own = com->own;
        if (com->plague) {
            if (sect.sct_pstage == PLG_HEALTHY)
@@ -381,11 +379,7 @@ put_combat(struct combat *com)
            else
                land.lnd_mobil = (signed char)(com->mob - com->mobcost);
        }
-       makelost(EF_LAND, land.lnd_own, land.lnd_uid,
-                land.lnd_x, land.lnd_y);
        land.lnd_own = com->own;
-       makenotlost(EF_LAND, land.lnd_own, land.lnd_uid,
-                   land.lnd_x, land.lnd_y);
        if (com->plague) {
            if (land.lnd_pstage == PLG_HEALTHY)
                land.lnd_pstage = PLG_EXPOSED;
@@ -409,11 +403,7 @@ put_combat(struct combat *com)
            else
                ship.shp_mobil = (signed char)(com->mob - com->mobcost);
        }
-       makelost(EF_SHIP, ship.shp_own, ship.shp_uid,
-                ship.shp_x, ship.shp_y);
        ship.shp_own = com->own;
-       makenotlost(EF_SHIP, ship.shp_own, ship.shp_uid,
-                   ship.shp_x, ship.shp_y);
        if (com->plague) {
            if (ship.shp_pstage == PLG_HEALTHY)
                ship.shp_pstage = PLG_EXPOSED;
index 0a436af7a92978b085c44bfa6cb6f34eff3c94e7..70fa4875c5b16b6577fcb088b55f86254e634e41 100644 (file)
@@ -134,7 +134,6 @@ knockdown(struct sctstr *sp)
        xyas(sp->sct_x, sp->sct_y, sp->sct_own));
     sp->sct_type = SCT_WATER;
     sp->sct_newtype = SCT_WATER;
-    makelost(EF_SECTOR, sp->sct_own, 0, sp->sct_x, sp->sct_y);
     sp->sct_own = 0;
     sp->sct_oldown = 0;
     sp->sct_mobil = 0;
index 2530faae65f1dc96fd061b0d03c3f2654ba53cbe..beca372a9616809f31a115a9c864e4ada17bad0a 100644 (file)
@@ -116,7 +116,6 @@ detonate(struct nukstr *np, coord x, coord y, int airburst)
            sect.sct_fallout = MIN(fallout, FALLOUT_MAX);
        }
        if (damage > 100) {
-           makelost(EF_SECTOR, sect.sct_own, 0, sect.sct_x, sect.sct_y);
            sect.sct_oldown = 0;
            sect.sct_own = 0;
            if (type == SCT_WATER || type == SCT_BSPAN ||
index d8ab37a5678c4672e8cf64ba867314fc8976b5f6..41ebf794a6c66d3a92dbd8cfa49b6e743cef8f3d 100644 (file)
@@ -111,15 +111,15 @@ lnd_postread(int n, void *ptr)
 void
 lnd_prewrite(int n, void *old, void *new)
 {
+    struct lndstr *oldlp = old;
     struct lndstr *llp = new;
+    natid own = llp->lnd_own;
     struct lndstr *lp;
     struct plnstr *pp;
     int i;
 
     if (llp->lnd_own && llp->lnd_effic < LAND_MINEFF) {
-       makelost(EF_LAND, llp->lnd_own, llp->lnd_uid,
-                llp->lnd_x, llp->lnd_y);
-       llp->lnd_own = 0;
+       own = 0;
 
        for (i = 0; NULL != (lp = getlandp(i)); i++) {
            if (lp->lnd_own && lp->lnd_land == n) {
@@ -149,6 +149,17 @@ lnd_prewrite(int n, void *old, void *new)
        item_prewrite(llp->lnd_item);
     }
 
+    /* We've avoided assigning to llp->lnd_own, in case oldsp == sp */
+    if (oldlp->lnd_own != own) {
+       if (oldlp->lnd_own)
+           makelost(EF_LAND, oldlp->lnd_own,
+                    llp->lnd_uid, llp->lnd_x, llp->lnd_y);
+       if (own)
+           makenotlost(EF_LAND, own,
+                       llp->lnd_uid, llp->lnd_x, llp->lnd_y);
+    }
+
+    llp->lnd_own = own;
 }
 
 char *
index 4732f3861abe02deac83a887f91af8b9f5d00e53..938f8bf5ffd28cc60e433c4971d765c71565d31c 100644 (file)
@@ -76,15 +76,24 @@ nuk_postread(int n, void *ptr)
 void
 nuk_prewrite(int n, void *old, void *new)
 {
+    struct nukstr *oldnp = old;
     struct nukstr *np = new;
+    natid own = np->nuk_own;
 
-    if (np->nuk_effic == 0) {
-       if (np->nuk_own)
-           makelost(EF_NUKE, np->nuk_own, np->nuk_uid,
-                    np->nuk_x, np->nuk_y);
-       np->nuk_own = 0;
-       np->nuk_effic = 0;
+    if (np->nuk_effic == 0)
+       own = 0;
+
+    /* We've avoided assigning to np->nuk_own, in case oldsp == sp */
+    if (oldnp->nuk_own != own) {
+       if (oldnp->nuk_own)
+           makelost(EF_NUKE, oldnp->nuk_own,
+                    np->nuk_uid, np->nuk_x, np->nuk_y);
+       if (own)
+           makenotlost(EF_NUKE, own,
+                       np->nuk_uid, np->nuk_x, np->nuk_y);
     }
+
+    np->nuk_own = own;
 }
 
 int
index 3c21b26a3811e87bf15218135af6cd9a6270730b..a5fb8133b4a09bd1c8a46966e3da082dd3c7fc18 100644 (file)
@@ -110,15 +110,14 @@ pln_postread(int n, void *ptr)
 void
 pln_prewrite(int n, void *old, void *new)
 {
+    struct plnstr *oldpp = old;
     struct plnstr *pp = new;
+    natid own = pp->pln_own;
     struct nukstr *np;
     int i;
 
     if (pp->pln_effic < PLANE_MINEFF) {
-       if (pp->pln_own)
-           makelost(EF_PLANE, pp->pln_own, pp->pln_uid,
-                    pp->pln_x, pp->pln_y);
-       pp->pln_own = 0;
+       own = 0;
        pp->pln_effic = 0;
        for (i = 0; NULL != (np = getnukep(i)); i++) {
            if (np->nuk_own && np->nuk_plane == n) {
@@ -129,6 +128,18 @@ pln_prewrite(int n, void *old, void *new)
            }
        }
     }
+
+    /* We've avoided assigning to pp->pln_own, in case oldsp == sp */
+    if (oldpp->pln_own != own) {
+       if (oldpp->pln_own)
+           makelost(EF_PLANE, oldpp->pln_own,
+                    pp->pln_uid, pp->pln_x, pp->pln_y);
+       if (own)
+           makenotlost(EF_PLANE, own,
+                       pp->pln_uid, pp->pln_x, pp->pln_y);
+    }
+
+    pp->pln_own = own;
 }
 
 char *
index 111444ffeb0ef69cd43d9c2466744da130438db8..02f979b5a3a92129fd9f422026e388b1103d01f9 100644 (file)
@@ -61,6 +61,7 @@ sct_postread(int id, void *ptr)
 void
 sct_prewrite(int id, void *old, void *new)
 {
+    struct sctstr *oldsp = old;
     struct sctstr *sp = new;
     int mil, civs;
     natid own;
@@ -70,23 +71,33 @@ sct_prewrite(int id, void *old, void *new)
 
     mil = sp->sct_item[I_MILIT];
     civs = sp->sct_item[I_CIVIL];
+    own = sp->sct_own;
 
-    if (sp->sct_own != 0 && !civs) {
+    if (own && !civs) {
        sp->sct_work = 100;
-       sp->sct_oldown = sp->sct_own;
+       sp->sct_oldown = own;
     }
 
-    if (sp->sct_own && !civs && !mil
-       && !has_units(sp->sct_x, sp->sct_y, sp->sct_own, NULL)
+    if (own && !civs && !mil && !has_units(sp->sct_x, sp->sct_y, own, NULL)
        && !(sp->sct_flags & MOVE_IN_PROGRESS)) {
        /* more cruft! */
-       own = sp->sct_own;
-       makelost(EF_SECTOR, sp->sct_own, 0, sp->sct_x, sp->sct_y);
-       sp->sct_own = 0;
+       own = 0;
        sp->sct_mobil = 0;
        if (sp->sct_type == SCT_CAPIT || sp->sct_type == SCT_MOUNT)
            caploss(sp, own, "");
     }
+
+    /* We've avoided assigning to sp->sct_own, in case oldsp == sp */
+    if (oldsp->sct_own != own) {
+       if (oldsp->sct_own)
+           makelost(EF_SECTOR, oldsp->sct_own,
+                    0, sp->sct_x, sp->sct_y);
+       if (own)
+           makenotlost(EF_SECTOR, own,
+                       0, sp->sct_x, sp->sct_y);
+    }
+
+    sp->sct_own = own;
 }
 
 void
index e9f3eff0186e87fb0f5ad2b8952217ad04de6f23..16b8e5b5e2f6812623a6871713ca49b2aade91cd 100644 (file)
@@ -64,15 +64,16 @@ shp_postread(int n, void *ptr)
 void
 shp_prewrite(int n, void *old, void *new)
 {
+    struct shpstr *oldsp = old;
     struct shpstr *sp = new;
+    natid own = sp->shp_own;
     struct lndstr *lp;
     struct plnstr *pp;
     int i;
 
-    if (sp->shp_own != 0 && sp->shp_effic < SHIP_MINEFF) {
-       mpr(sp->shp_own, "\t%s sunk!\n", prship(sp));
-       makelost(EF_SHIP, sp->shp_own, sp->shp_uid, sp->shp_x, sp->shp_y);
-       sp->shp_own = 0;
+    if (own && sp->shp_effic < SHIP_MINEFF) {
+       mpr(own, "\t%s sunk!\n", prship(sp));
+       own = 0;
 
        for (i = 0; NULL != (lp = getlandp(i)); i++) {
            if (lp->lnd_own && lp->lnd_ship == n) {
@@ -95,6 +96,18 @@ shp_prewrite(int n, void *old, void *new)
     } else {
        item_prewrite(sp->shp_item);
     }
+
+    /* We've avoided assigning to sp->shp_own, in case oldsp == sp */
+    if (oldsp->shp_own != own) {
+       if (oldsp->shp_own)
+           makelost(EF_SHIP, oldsp->shp_own,
+                    sp->shp_uid, sp->shp_x, sp->shp_y);
+       if (own)
+           makenotlost(EF_SHIP, own,
+                       sp->shp_uid, sp->shp_x, sp->shp_y);
+    }
+
+    sp->shp_own = own;
 }
 
 char *
index a5342ea41753af37c8cd679c256eba2a7ff42b72..962432c726841a0ea380410a9df252b9207b31f3 100644 (file)
@@ -158,8 +158,6 @@ takeover(struct sctstr *sp, natid newown)
         */
        sp->sct_loyal = 50;
     }
-    makelost(EF_SECTOR, sp->sct_own, 0, sp->sct_x, sp->sct_y);
-    makenotlost(EF_SECTOR, newown, 0, sp->sct_x, sp->sct_y);
     sp->sct_own = newown;
     if (opt_MOB_ACCESS) {
        game_tick_to_now(&sp->sct_access);
@@ -206,9 +204,7 @@ takeover_plane(struct plnstr *pp, natid newown)
        trdswitchown(EF_PLANE, pp, newown);
     if (pp->pln_mobil > 0)
        pp->pln_mobil = 0;
-    makelost(EF_PLANE, pp->pln_own, pp->pln_uid, pp->pln_x, pp->pln_y);
     pp->pln_own = newown;
-    makenotlost(EF_PLANE, pp->pln_own, pp->pln_uid, pp->pln_x, pp->pln_y);
     pp->pln_mission = 0;
     pp->pln_wing = 0;
     putplane(pp->pln_uid, pp);
@@ -225,9 +221,7 @@ takeover_ship(struct shpstr *sp, natid newown, int hostile)
 
     if (opt_MARKET)
        trdswitchown(EF_SHIP, sp, newown);
-    makelost(EF_SHIP, sp->shp_own, sp->shp_uid, sp->shp_x, sp->shp_y);
     sp->shp_own = newown;
-    makenotlost(EF_SHIP, sp->shp_own, sp->shp_uid, sp->shp_x, sp->shp_y);
     sp->shp_mission = 0;
     sp->shp_fleet = 0;
     sp->shp_rflags = 0;
@@ -251,10 +245,7 @@ takeover_ship(struct shpstr *sp, natid newown, int hostile)
        if (opt_MARKET)
            trdswitchown(EF_PLANE, pp, newown);
        pp->pln_mission = 0;
-       makelost(EF_PLANE, pp->pln_own, pp->pln_uid, pp->pln_x, pp->pln_y);
        pp->pln_own = newown;
-       makenotlost(EF_PLANE, pp->pln_own, pp->pln_uid,
-                   pp->pln_x, pp->pln_y);
        putplane(pp->pln_uid, pp);
     }
     /* Take over land units */
@@ -290,11 +281,7 @@ takeover_land(struct lndstr *landp, natid newown, int hostile)
     if (opt_MARKET)
        trdswitchown(EF_LAND, landp, newown);
     landp->lnd_mission = 0;
-    makelost(EF_LAND, landp->lnd_own, landp->lnd_uid,
-            landp->lnd_x, landp->lnd_y);
     landp->lnd_own = newown;
-    makenotlost(EF_LAND, landp->lnd_own, landp->lnd_uid,
-               landp->lnd_x, landp->lnd_y);
     pp = &p;
     lp = &llp;
     /* Take over planes */
@@ -314,10 +301,7 @@ takeover_land(struct lndstr *landp, natid newown, int hostile)
        if (opt_MARKET)
            trdswitchown(EF_PLANE, pp, newown);
        pp->pln_mission = 0;
-       makelost(EF_PLANE, pp->pln_own, pp->pln_uid, pp->pln_x, pp->pln_y);
        pp->pln_own = newown;
-       makenotlost(EF_PLANE, pp->pln_own, pp->pln_uid,
-                   pp->pln_x, pp->pln_y);
        putplane(pp->pln_uid, pp);
     }
     /* Take over land units */
index e9ef4e463e7a22ed8a79d5cc98d53d21f47ecede..8e379b6715acc5e4edbab5e43cdb8f4374a03c35 100644 (file)
@@ -312,8 +312,13 @@ guerrilla(struct sctstr *sp)
        /* che won, and sector converts. */
        if (sp->sct_own == sp->sct_oldown)
            sp->sct_oldown = 0;
-       else
+       else {
+           makelost(EF_SECTOR, sp->sct_own,
+                    0, sp->sct_x, sp->sct_y);
+           makenotlost(EF_SECTOR, sp->sct_oldown,
+                       0, sp->sct_x, sp->sct_y);
            takeover(sp, sp->sct_oldown);
+       }
        sp->sct_mobil = oldmob;
        civ += uw;
        uw = 0;