From 21b852cd0df5412e82ca199e12bf26a3aae63bb9 Mon Sep 17 00:00:00 2001 From: helixhorned Date: Fri, 8 Aug 2014 20:02:53 +0000 Subject: [PATCH] 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 --- polymer/eduke32/build/src/build.c | 72 +++++++++++++---------- polymer/eduke32/source/m32common.c | 93 +++++++++++++++--------------- 2 files changed, 91 insertions(+), 74 deletions(-) diff --git a/polymer/eduke32/build/src/build.c b/polymer/eduke32/build/src/build.c index ef12f2249..a1521217f 100644 --- a/polymer/eduke32/build/src/build.c +++ b/polymer/eduke32/build/src/build.c @@ -7111,7 +7111,8 @@ check_next_sector: ; if (doSectorSplit && k==loopnum) 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; i = k; @@ -7180,7 +7181,7 @@ check_next_sector: ; 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; //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 ((y1 <= day && day <= y2) || (y2 <= day && day <= y1)) 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! -static int32_t clockdir(int16_t wallstart) //Returns: 0 is CW, 1 is CCW +// has to be the starting (i.e. least index) wall of a loop! +// Returns: CLOCKDIR_CW or CLOCKDIR_CCW. +static int32_t clockdir(int32_t wallstart) { - int16_t i, themin; - int32_t minx, tempint, x0, x1, x2, y0, y1, y2; + int32_t 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 { i++; @@ -8468,7 +8470,11 @@ static int32_t clockdir(int16_t wallstart) //Returns: 0 is CW, 1 is CCW 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 is not the starting wall of + // the very last loop x0 = wall[themin].x; 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; y2 = POINT2(wall[themin].point2).y; - if (y1 >= y2 && y1 <= y0) return(0); - if (y1 >= y0 && y1 <= y2) return(1); + if (y1 >= y2 && y1 <= y0) + return CLOCKDIR_CW; + if (y1 >= y0 && y1 <= y2) + return CLOCKDIR_CCW; tempint = (x0-x1)*(y2-y1) - (x2-x1)*(y0-y1); if (tempint < 0) - return(0); + return CLOCKDIR_CW; else - return(1); + return CLOCKDIR_CCW; } static void flipwalls(int16_t numwalls, int16_t newnumwalls) @@ -8822,38 +8830,44 @@ static void clearministatbar16(void) enddrawing(); } -// startwall has to be the starting wall of a loop! -static int16_t loopinside(int32_t x, int32_t y, int16_t startwall) +// has to be the starting wall of a loop! +// +// Assuming that 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; - int16_t i, cnt; + int32_t cnt = clockdir(startwall); + int32_t i = startwall; - cnt = clockdir(startwall); - i = startwall; do { - x1 = wall[i].x; - x2 = POINT2(i).x; + int32_t x1 = wall[i].x; + int32_t x2 = POINT2(i).x; - if (x1 >= x || x2 >= x) + if (x <= x1 || x <= x2) { - y1 = wall[i].y; - y2 = POINT2(i).y; + int32_t y1 = wall[i].y; + int32_t y2 = POINT2(i).y; if (y1 > y2) { swaplong(&x1, &x2); swaplong(&y1, &y2); } - if (y1 <= y && y2 > y) + + if (y1 <= y && y < y2) if (x1*(y-y2)+x2*(y1-y) <= x*(y1-y2)) cnt ^= 1; } + i = wall[i].point2; } while (i != startwall); - return(cnt); + return cnt; } #if 0 diff --git a/polymer/eduke32/source/m32common.c b/polymer/eduke32/source/m32common.c index ef44dc7c9..43e58b712 100644 --- a/polymer/eduke32/source/m32common.c +++ b/polymer/eduke32/source/m32common.c @@ -577,16 +577,11 @@ int32_t map_undoredo(int32_t dir) #define CCHK_CORRECTED OSDTEXT_GREEN " -> " #ifdef _MSC_VER -#define CORRUPTCHK_PRINT(errlev, what, fmt, ...) do \ -{ \ - 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) +# define OSD_Printf_CChk OSD_Printf #else +# define OSD_Printf_CChk OSD_Printf_nowarn +#endif + #define CORRUPTCHK_PRINT(errlev, what, fmt, ...) do \ { \ bad = max(bad, errlev); \ @@ -594,9 +589,9 @@ int32_t map_undoredo(int32_t dir) goto too_many_errors; \ corruptthings[numcorruptthings++] = (what); \ if (errlev >= printfromlev) \ - OSD_Printf_nowarn("#%d: " fmt "\n", numcorruptthings, ## __VA_ARGS__); \ + OSD_Printf_CChk("#%d: " fmt "\n", numcorruptthings, ## __VA_ARGS__); \ } while (0) -#endif + #ifdef YAX_ENABLE 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 i, j, w0, numw, endwall, ns, nw; + int32_t i, j; int32_t ewall=0; // expected wall index int32_t errlevel=0, bad=0; @@ -892,10 +887,11 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing) for (i=0; i numwalls) { @@ -915,8 +911,7 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing) 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); // inconsistent cstat&2 and heinum checker @@ -952,14 +947,17 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing) errlevel = max(errlevel, bad); - if (bad<4) + if (bad < 4) { - endwall--; - for (j=w0; j<=endwall; j++) { + const int32_t nw = wall[j].nextwall; + const int32_t ns = wall[j].nextsector; + bad = 0; + // First, some basic wall sanity checks. + if (wall[j].point2 < w0 || wall[j].point2 > endwall) { 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); } - nw = wall[j].nextwall; - if (nw >= numwalls) { - int32_t onumct = numcorruptthings; + const int32_t onumct = numcorruptthings; if (TRYFIX_NONE()) { @@ -993,11 +989,9 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing) } } - ns = wall[j].nextsector; - if (ns >= numsectors) { - int32_t onumct = numcorruptthings; + const int32_t onumct = numcorruptthings; 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); #ifdef YAX_ENABLE + // Various TROR checks. { - int32_t cf, ynw, ynwp2; + int32_t 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 >= numwalls) @@ -1052,8 +1048,8 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing) } { - int16_t bunchnum = yax_getbunch(i, cf); - int32_t onumct = numcorruptthings; + const int16_t bunchnum = yax_getbunch(i, cf); + const int32_t onumct = numcorruptthings; if (bunchnum < 0 || bunchnum >= numyaxbunches) { @@ -1083,9 +1079,9 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing) 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) { 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 + // Check for ".nextsector is its own sector" if (ns == i) { if (!bad) { - int32_t onumct = numcorruptthings; - int32_t safetoclear = (nw==j || (wall[nw].nextwall==-1 && wall[nw].nextsector==-1)); + const int32_t onumct = numcorruptthings; + 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); 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>3]&(1<<(nw&7))) { - int16_t nwnw, lnws; - int32_t onumct = numcorruptthings; + const 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", j, nw, lnws); - nwnw = wall[nw].nextwall; + 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< 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]", i, TrackerCast(sprite[i].x), TrackerCast(sprite[i].y), -BXY_MAX, BXY_MAX); 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) { - int32_t firstwall = sector[sect].wallptr; + const int32_t firstwall = sector[sect].wallptr; if ((unsigned)firstwall < (unsigned)numwalls) {