From 0d139ee1d1605069dc9759d578ac4356e8f3335f Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 6 Sep 2008 11:21:32 -0400 Subject: [PATCH] Update lost file from prewrite callbacks 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. --- src/lib/commands/anti.c | 4 ---- src/lib/commands/buil.c | 8 -------- src/lib/commands/cede.c | 17 ----------------- src/lib/commands/coll.c | 2 -- src/lib/commands/edit.c | 15 --------------- src/lib/commands/load.c | 3 --- src/lib/commands/scra.c | 16 ---------------- src/lib/commands/setsect.c | 3 --- src/lib/commands/trad.c | 12 ------------ src/lib/subs/attsub.c | 10 ---------- src/lib/subs/bridgefall.c | 1 - src/lib/subs/detonate.c | 1 - src/lib/subs/land.c | 17 ++++++++++++++--- src/lib/subs/nuke.c | 21 +++++++++++++++------ src/lib/subs/plane.c | 19 +++++++++++++++---- src/lib/subs/sect.c | 25 ++++++++++++++++++------- src/lib/subs/ship.c | 21 +++++++++++++++++---- src/lib/subs/takeover.c | 16 ---------------- src/lib/update/revolt.c | 7 ++++++- 19 files changed, 85 insertions(+), 133 deletions(-) diff --git a/src/lib/commands/anti.c b/src/lib/commands/anti.c index a20ff692..bdced571 100644 --- a/src/lib/commands/anti.c +++ b/src/lib/commands/anti.c @@ -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(§); diff --git a/src/lib/commands/buil.c b/src/lib/commands/buil.c index 2c325141..6a80a3ab 100644 --- a/src/lib/commands/buil.c +++ b/src/lib/commands/buil.c @@ -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)); diff --git a/src/lib/commands/cede.c b/src/lib/commands/cede.c index bcc1b63a..b1981475 100644 --- a/src/lib/commands/cede.c +++ b/src/lib/commands/cede.c @@ -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); } diff --git a/src/lib/commands/coll.c b/src/lib/commands/coll.c index 04a51c6e..94a78afd 100644 --- a/src/lib/commands/coll.c +++ b/src/lib/commands/coll.c @@ -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)); diff --git a/src/lib/commands/edit.c b/src/lib/commands/edit.c index f5af20b7..55695414 100644 --- a/src/lib/commands/edit.c +++ b/src/lib/commands/edit.c @@ -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) diff --git a/src/lib/commands/load.c b/src/lib/commands/load.c index d245ba21..0526275b 100644 --- a/src/lib/commands/load.c +++ b/src/lib/commands/load.c @@ -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 diff --git a/src/lib/commands/scra.c b/src/lib/commands/scra.c index 5de18625..88985cbe 100644 --- a/src/lib/commands/scra.c +++ b/src/lib/commands/scra.c @@ -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); } } diff --git a/src/lib/commands/setsect.c b/src/lib/commands/setsect.c index 07087ece..9c608e29 100644 --- a/src/lib/commands/setsect.c +++ b/src/lib/commands/setsect.c @@ -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(§); } diff --git a/src/lib/commands/trad.c b/src/lib/commands/trad.c index dc3037b9..1668c8d6 100644 --- a/src/lib/commands/trad.c +++ b/src/lib/commands/trad.c @@ -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) { diff --git a/src/lib/subs/attsub.c b/src/lib/subs/attsub.c index 64ce6196..2d56188a 100644 --- a/src/lib/subs/attsub.c +++ b/src/lib/subs/attsub.c @@ -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; diff --git a/src/lib/subs/bridgefall.c b/src/lib/subs/bridgefall.c index 0a436af7..70fa4875 100644 --- a/src/lib/subs/bridgefall.c +++ b/src/lib/subs/bridgefall.c @@ -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; diff --git a/src/lib/subs/detonate.c b/src/lib/subs/detonate.c index 2530faae..beca372a 100644 --- a/src/lib/subs/detonate.c +++ b/src/lib/subs/detonate.c @@ -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 || diff --git a/src/lib/subs/land.c b/src/lib/subs/land.c index d8ab37a5..41ebf794 100644 --- a/src/lib/subs/land.c +++ b/src/lib/subs/land.c @@ -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 * diff --git a/src/lib/subs/nuke.c b/src/lib/subs/nuke.c index 4732f386..938f8bf5 100644 --- a/src/lib/subs/nuke.c +++ b/src/lib/subs/nuke.c @@ -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 diff --git a/src/lib/subs/plane.c b/src/lib/subs/plane.c index 3c21b26a..a5fb8133 100644 --- a/src/lib/subs/plane.c +++ b/src/lib/subs/plane.c @@ -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 * diff --git a/src/lib/subs/sect.c b/src/lib/subs/sect.c index 111444ff..02f979b5 100644 --- a/src/lib/subs/sect.c +++ b/src/lib/subs/sect.c @@ -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 diff --git a/src/lib/subs/ship.c b/src/lib/subs/ship.c index e9f3eff0..16b8e5b5 100644 --- a/src/lib/subs/ship.c +++ b/src/lib/subs/ship.c @@ -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 * diff --git a/src/lib/subs/takeover.c b/src/lib/subs/takeover.c index a5342ea4..962432c7 100644 --- a/src/lib/subs/takeover.c +++ b/src/lib/subs/takeover.c @@ -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 */ diff --git a/src/lib/update/revolt.c b/src/lib/update/revolt.c index e9ef4e46..8e379b67 100644 --- a/src/lib/update/revolt.c +++ b/src/lib/update/revolt.c @@ -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;