Clean up astub.c:CheckMapCorruption() and some build.c code a little.

There are no intended changes of functionality, it's readability tweaks only.

git-svn-id: https://svn.eduke32.com/eduke32@4568 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2014-08-08 20:02:53 +00:00
parent 1486a2937b
commit 21b852cd0d
2 changed files with 91 additions and 74 deletions

View file

@ -7111,7 +7111,8 @@ check_next_sector: ;
if (doSectorSplit && k==loopnum) if (doSectorSplit && k==loopnum)
continue; continue;
if (!doSectorSplit && (k == loopnumofsector(ovh.splitsect,ovh.splitstartwall) || k == loopnumofsector(ovh.splitsect,splitendwall))) if (!doSectorSplit && (k == loopnumofsector(ovh.splitsect,ovh.splitstartwall) ||
k == loopnumofsector(ovh.splitsect,splitendwall)))
continue; continue;
i = k; i = k;
@ -7180,7 +7181,7 @@ check_next_sector: ;
numsectors += 1 + doSectorSplit; numsectors += 1 + doSectorSplit;
k = danumwalls-numwalls; //Back of number of walls of new sector for later k = danumwalls-numwalls; //Back up number of walls of new sector for later
numwalls = danumwalls; numwalls = danumwalls;
//clear out old sector's next pointers for clean deletesector //clear out old sector's next pointers for clean deletesector
@ -8444,21 +8445,22 @@ static int32_t checkautoinsert(int32_t dax, int32_t day, int16_t danumwalls)
if ((x1 <= dax && dax <= x2) || (x2 <= dax && dax <= x1)) if ((x1 <= dax && dax <= x2) || (x2 <= dax && dax <= x1))
if ((y1 <= day && day <= y2) || (y2 <= day && day <= y1)) if ((y1 <= day && day <= y2) || (y2 <= day && day <= y1))
if ((dax-x1)*(y2-y1) == (day-y1)*(x2-x1)) if ((dax-x1)*(y2-y1) == (day-y1)*(x2-x1))
return(1); //insertpoint((short)i,dax,day,NULL); return 1; //insertpoint((short)i,dax,day,NULL);
} }
return(0); return 0;
} }
// wallstart has to be the starting wall of a loop! // <wallstart> has to be the starting (i.e. least index) wall of a loop!
static int32_t clockdir(int16_t wallstart) //Returns: 0 is CW, 1 is CCW // Returns: CLOCKDIR_CW or CLOCKDIR_CCW.
static int32_t clockdir(int32_t wallstart)
{ {
int16_t i, themin; int32_t tempint, x0, x1, x2, y0, y1, y2;
int32_t minx, tempint, x0, x1, x2, y0, y1, y2;
int32_t minx = 0x7fffffff;
int32_t themin = -1;
int32_t i = wallstart-1;
minx = 0x7fffffff;
themin = -1;
i = wallstart-1;
do do
{ {
i++; i++;
@ -8468,7 +8470,11 @@ static int32_t clockdir(int16_t wallstart) //Returns: 0 is CW, 1 is CCW
themin = i; themin = i;
} }
} }
while ((wall[i].point2 != wallstart) && (i < MAXWALLS)); while (wall[i].point2 != wallstart && i < MAXWALLS-1);
// NOTE: the i < MAXWALLS-1 check is really only safety against either
// - a really corrupt map, or
// - misuse of clockdir() where <wallstart> is not the starting wall of
// the very last loop
x0 = wall[themin].x; x0 = wall[themin].x;
y0 = wall[themin].y; y0 = wall[themin].y;
@ -8477,14 +8483,16 @@ static int32_t clockdir(int16_t wallstart) //Returns: 0 is CW, 1 is CCW
x2 = POINT2(wall[themin].point2).x; x2 = POINT2(wall[themin].point2).x;
y2 = POINT2(wall[themin].point2).y; y2 = POINT2(wall[themin].point2).y;
if (y1 >= y2 && y1 <= y0) return(0); if (y1 >= y2 && y1 <= y0)
if (y1 >= y0 && y1 <= y2) return(1); return CLOCKDIR_CW;
if (y1 >= y0 && y1 <= y2)
return CLOCKDIR_CCW;
tempint = (x0-x1)*(y2-y1) - (x2-x1)*(y0-y1); tempint = (x0-x1)*(y2-y1) - (x2-x1)*(y0-y1);
if (tempint < 0) if (tempint < 0)
return(0); return CLOCKDIR_CW;
else else
return(1); return CLOCKDIR_CCW;
} }
static void flipwalls(int16_t numwalls, int16_t newnumwalls) static void flipwalls(int16_t numwalls, int16_t newnumwalls)
@ -8822,38 +8830,44 @@ static void clearministatbar16(void)
enddrawing(); enddrawing();
} }
// startwall has to be the starting wall of a loop! // <startwall> has to be the starting wall of a loop!
static int16_t loopinside(int32_t x, int32_t y, int16_t startwall) //
// Assuming that <startwall> indicates a CW (outer) loop, the return value can
// be seen as a boolean of whether (x,y) is inside it.
//
// XXX: this function suffers from asymmetry issues in degenerate cases,
// similar to how inside() did before r3898.
static int32_t loopinside(int32_t x, int32_t y, int16_t startwall)
{ {
int32_t x1, y1, x2, y2; int32_t cnt = clockdir(startwall);
int16_t i, cnt; int32_t i = startwall;
cnt = clockdir(startwall);
i = startwall;
do do
{ {
x1 = wall[i].x; int32_t x1 = wall[i].x;
x2 = POINT2(i).x; int32_t x2 = POINT2(i).x;
if (x1 >= x || x2 >= x) if (x <= x1 || x <= x2)
{ {
y1 = wall[i].y; int32_t y1 = wall[i].y;
y2 = POINT2(i).y; int32_t y2 = POINT2(i).y;
if (y1 > y2) if (y1 > y2)
{ {
swaplong(&x1, &x2); swaplong(&x1, &x2);
swaplong(&y1, &y2); swaplong(&y1, &y2);
} }
if (y1 <= y && y2 > y)
if (y1 <= y && y < y2)
if (x1*(y-y2)+x2*(y1-y) <= x*(y1-y2)) if (x1*(y-y2)+x2*(y1-y) <= x*(y1-y2))
cnt ^= 1; cnt ^= 1;
} }
i = wall[i].point2; i = wall[i].point2;
} }
while (i != startwall); while (i != startwall);
return(cnt); return cnt;
} }
#if 0 #if 0

View file

@ -577,16 +577,11 @@ int32_t map_undoredo(int32_t dir)
#define CCHK_CORRECTED OSDTEXT_GREEN " -> " #define CCHK_CORRECTED OSDTEXT_GREEN " -> "
#ifdef _MSC_VER #ifdef _MSC_VER
#define CORRUPTCHK_PRINT(errlev, what, fmt, ...) do \ # define OSD_Printf_CChk OSD_Printf
{ \
bad = max(bad, errlev); \
if (numcorruptthings>=MAXCORRUPTTHINGS) \
goto too_many_errors; \
corruptthings[numcorruptthings++] = (what); \
if (errlev >= printfromlev) \
OSD_Printf("#%d: " fmt "\n", numcorruptthings, ## __VA_ARGS__); \
} while (0)
#else #else
# define OSD_Printf_CChk OSD_Printf_nowarn
#endif
#define CORRUPTCHK_PRINT(errlev, what, fmt, ...) do \ #define CORRUPTCHK_PRINT(errlev, what, fmt, ...) do \
{ \ { \
bad = max(bad, errlev); \ bad = max(bad, errlev); \
@ -594,9 +589,9 @@ int32_t map_undoredo(int32_t dir)
goto too_many_errors; \ goto too_many_errors; \
corruptthings[numcorruptthings++] = (what); \ corruptthings[numcorruptthings++] = (what); \
if (errlev >= printfromlev) \ if (errlev >= printfromlev) \
OSD_Printf_nowarn("#%d: " fmt "\n", numcorruptthings, ## __VA_ARGS__); \ OSD_Printf_CChk("#%d: " fmt "\n", numcorruptthings, ## __VA_ARGS__); \
} while (0) } while (0)
#endif
#ifdef YAX_ENABLE #ifdef YAX_ENABLE
static int32_t walls_have_equal_endpoints(int32_t w1, int32_t w2) static int32_t walls_have_equal_endpoints(int32_t w1, int32_t w2)
{ {
@ -852,7 +847,7 @@ static int32_t check_spritelist_consistency()
int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing) int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
{ {
int32_t i, j, w0, numw, endwall, ns, nw; int32_t i, j;
int32_t ewall=0; // expected wall index int32_t ewall=0; // expected wall index
int32_t errlevel=0, bad=0; int32_t errlevel=0, bad=0;
@ -892,10 +887,11 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
for (i=0; i<numsectors; i++) for (i=0; i<numsectors; i++)
{ {
bad = 0; const int32_t w0 = sector[i].wallptr;
const int32_t numw = sector[i].wallnum;
const int32_t endwall = w0 + numw - 1; // inclusive
w0 = sector[i].wallptr; bad = 0;
numw = sector[i].wallnum;
if (w0 < 0 || w0 > numwalls) if (w0 < 0 || w0 > numwalls)
{ {
@ -915,8 +911,7 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
ewall += numw; ewall += numw;
endwall = w0 + numw; if (endwall >= numwalls)
if (endwall > numwalls)
CORRUPTCHK_PRINT(5, CORRUPT_SECTOR|i, "SECTOR[%d]: wallptr+wallnum=%d out of range: numwalls=%d", i, endwall, numwalls); CORRUPTCHK_PRINT(5, CORRUPT_SECTOR|i, "SECTOR[%d]: wallptr+wallnum=%d out of range: numwalls=%d", i, endwall, numwalls);
// inconsistent cstat&2 and heinum checker // inconsistent cstat&2 and heinum checker
@ -952,14 +947,17 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
errlevel = max(errlevel, bad); errlevel = max(errlevel, bad);
if (bad<4) if (bad < 4)
{ {
endwall--;
for (j=w0; j<=endwall; j++) for (j=w0; j<=endwall; j++)
{ {
const int32_t nw = wall[j].nextwall;
const int32_t ns = wall[j].nextsector;
bad = 0; bad = 0;
// First, some basic wall sanity checks.
if (wall[j].point2 < w0 || wall[j].point2 > endwall) if (wall[j].point2 < w0 || wall[j].point2 > endwall)
{ {
if (wall[j].point2 < 0 || wall[j].point2 >= MAXWALLS) if (wall[j].point2 < 0 || wall[j].point2 >= MAXWALLS)
@ -970,11 +968,9 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
j, TrackerCast(wall[j].point2), w0, endwall); j, TrackerCast(wall[j].point2), w0, endwall);
} }
nw = wall[j].nextwall;
if (nw >= numwalls) if (nw >= numwalls)
{ {
int32_t onumct = numcorruptthings; const int32_t onumct = numcorruptthings;
if (TRYFIX_NONE()) if (TRYFIX_NONE())
{ {
@ -993,11 +989,9 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
} }
} }
ns = wall[j].nextsector;
if (ns >= numsectors) if (ns >= numsectors)
{ {
int32_t onumct = numcorruptthings; const int32_t onumct = numcorruptthings;
if (TRYFIX_NONE()) if (TRYFIX_NONE())
{ {
@ -1023,12 +1017,14 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
CORRUPTCHK_PRINT(3, CORRUPT_WALL|j, "WALL[%d] has length 0", j); CORRUPTCHK_PRINT(3, CORRUPT_WALL|j, "WALL[%d] has length 0", j);
#ifdef YAX_ENABLE #ifdef YAX_ENABLE
// Various TROR checks.
{ {
int32_t cf, ynw, ynwp2; int32_t cf;
for (cf=0; cf<2; cf++) for (cf=0; cf<2; cf++)
{ {
ynw = yax_getnextwall(j, cf); const int32_t ynw = yax_getnextwall(j, cf);
if (ynw >= 0) if (ynw >= 0)
{ {
if (ynw >= numwalls) if (ynw >= numwalls)
@ -1052,8 +1048,8 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
} }
{ {
int16_t bunchnum = yax_getbunch(i, cf); const int16_t bunchnum = yax_getbunch(i, cf);
int32_t onumct = numcorruptthings; const int32_t onumct = numcorruptthings;
if (bunchnum < 0 || bunchnum >= numyaxbunches) if (bunchnum < 0 || bunchnum >= numyaxbunches)
{ {
@ -1083,9 +1079,9 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
if (ynextwallok) if (ynextwallok)
{ {
int32_t onumct = numcorruptthings; const int32_t onumct = numcorruptthings;
const int32_t ynwp2 = yax_getnextwall(ynw, !cf);
ynwp2 = yax_getnextwall(ynw, !cf);
if (ynwp2 != j) if (ynwp2 != j)
{ {
CORRUPTCHK_PRINT(4, CORRUPT_WALL|j, "WALL %d's %s=%d's reverse link wrong" CORRUPTCHK_PRINT(4, CORRUPT_WALL|j, "WALL %d's %s=%d's reverse link wrong"
@ -1105,18 +1101,19 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
} }
} }
} }
} // woot! } // brace woot!
} }
} }
} }
} }
#endif #endif
// Check for ".nextsector is its own sector"
if (ns == i) if (ns == i)
{ {
if (!bad) if (!bad)
{ {
int32_t onumct = numcorruptthings; const int32_t onumct = numcorruptthings;
int32_t safetoclear = (nw==j || (wall[nw].nextwall==-1 && wall[nw].nextsector==-1)); const int32_t safetoclear = (nw==j || (wall[nw].nextwall==-1 && wall[nw].nextsector==-1));
CORRUPTCHK_PRINT(4, CORRUPT_WALL|j, "WALL[%d].NEXTSECTOR is its own sector", j); CORRUPTCHK_PRINT(4, CORRUPT_WALL|j, "WALL[%d].NEXTSECTOR is its own sector", j);
if (onumct < MAXCORRUPTTHINGS) if (onumct < MAXCORRUPTTHINGS)
@ -1143,20 +1140,23 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
} }
} }
// Check for ".nextwall already referenced from wall ..."
if (!corruptcheck_noalreadyrefd && nw>=0 && nw<numwalls) if (!corruptcheck_noalreadyrefd && nw>=0 && nw<numwalls)
{ {
if (seen_nextwalls[nw>>3]&(1<<(nw&7))) if (seen_nextwalls[nw>>3]&(1<<(nw&7)))
{ {
int16_t nwnw, lnws; const int32_t onumct = numcorruptthings;
int32_t onumct = numcorruptthings;
const int16_t lnws = lastnextwallsource[nw];
const int16_t nwnw = wall[nw].nextwall;
lnws = lastnextwallsource[nw];
CORRUPTCHK_PRINT(3, CORRUPT_WALL|j, "WALL[%d].NEXTWALL=%d already referenced from wall %d", CORRUPTCHK_PRINT(3, CORRUPT_WALL|j, "WALL[%d].NEXTWALL=%d already referenced from wall %d",
j, nw, lnws); j, nw, lnws);
nwnw = wall[nw].nextwall;
if (onumct < MAXCORRUPTTHINGS && (nwnw==j || nwnw==lnws)) if (onumct < MAXCORRUPTTHINGS && (nwnw==j || nwnw==lnws))
{ {
int32_t walltoclear = nwnw==j ? lnws : j; const int32_t walltoclear = nwnw==j ? lnws : j;
if (tryfixing & (1ull<<onumct)) if (tryfixing & (1ull<<onumct))
{ {
wall[walltoclear].nextsector = wall[walltoclear].nextwall = -1; wall[walltoclear].nextsector = wall[walltoclear].nextwall = -1;
@ -1175,9 +1175,11 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
} }
} }
if (bad<4) // Various checks of .nextsector and .nextwall
if (bad < 4)
{ {
int32_t onumct = numcorruptthings; const int32_t onumct = numcorruptthings;
if ((ns^nw)<0) if ((ns^nw)<0)
{ {
CORRUPTCHK_PRINT(4, CORRUPT_WALL|j, "WALL[%d].NEXTSECTOR=%d and .NEXTWALL=%d inconsistent:" CORRUPTCHK_PRINT(4, CORRUPT_WALL|j, "WALL[%d].NEXTSECTOR=%d and .NEXTWALL=%d inconsistent:"
@ -1240,18 +1242,19 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
if (klabs(sprite[i].x) > BXY_MAX || klabs(sprite[i].y) > BXY_MAX) if (klabs(sprite[i].x) > BXY_MAX || klabs(sprite[i].y) > BXY_MAX)
{ {
int32_t onumct = numcorruptthings; const int32_t onumct = numcorruptthings;
CORRUPTCHK_PRINT(3, CORRUPT_SPRITE|i, "SPRITE %d at [%d, %d] is outside the maximal grid range [%d, %d]", CORRUPTCHK_PRINT(3, CORRUPT_SPRITE|i, "SPRITE %d at [%d, %d] is outside the maximal grid range [%d, %d]",
i, TrackerCast(sprite[i].x), TrackerCast(sprite[i].y), -BXY_MAX, BXY_MAX); i, TrackerCast(sprite[i].x), TrackerCast(sprite[i].y), -BXY_MAX, BXY_MAX);
if (onumct < MAXCORRUPTTHINGS) if (onumct < MAXCORRUPTTHINGS)
{ {
int32_t x=0, y=0, sect=sprite[i].sectnum, ok=0; int32_t x=0, y=0, ok=0;
const int32_t sect = sprite[i].sectnum;
if ((unsigned)sect < (unsigned)numsectors) if ((unsigned)sect < (unsigned)numsectors)
{ {
int32_t firstwall = sector[sect].wallptr; const int32_t firstwall = sector[sect].wallptr;
if ((unsigned)firstwall < (unsigned)numwalls) if ((unsigned)firstwall < (unsigned)numwalls)
{ {