Oops, r1801 crashed Mapster in the undo system. Also less/better automatic wall[].xrepeat resizing on things like attaching a wall to another.

git-svn-id: https://svn.eduke32.com/eduke32@1803 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2011-02-25 22:10:25 +00:00
parent 043bb208b3
commit 73d6ad1d04
5 changed files with 109 additions and 97 deletions

View file

@ -85,6 +85,10 @@ extern inline int32_t getscreenvdisp(int32_t bz, int32_t zoome);
extern void setup_sideview_sincos(void); extern void setup_sideview_sincos(void);
extern void m32_setkeyfilter(int32_t on); extern void m32_setkeyfilter(int32_t on);
extern int32_t wallength(int16_t i);
extern void fixrepeats(int16_t i);
extern void fixxrepeat(int16_t i, uint32_t lenrepquot);
extern int32_t ExtInit(void); extern int32_t ExtInit(void);
extern int32_t ExtPreInit(int32_t argc,const char **argv); extern int32_t ExtPreInit(int32_t argc,const char **argv);
extern void ExtUnInit(void); extern void ExtUnInit(void);
@ -175,21 +179,6 @@ void test_map(int32_t mode);
#define POINT2(i) (wall[wall[i].point2]) #define POINT2(i) (wall[wall[i].point2])
#define SPRITESEC(j) (sector[sprite[j].sectnum]) #define SPRITESEC(j) (sector[sprite[j].sectnum])
static inline int32_t wallength(int16_t i)
{
int64_t dax = POINT2(i).x - wall[i].x;
int64_t day = POINT2(i).y - wall[i].y;
#if 1 //def POLYMOST
int64_t hypsq = dax*dax + day*day;
if (hypsq > (int64_t)INT_MAX)
return (int32_t)sqrt((double)hypsq);
else
return ksqrt((int32_t)hypsq);
#else
return ksqrt(dax*dax + day*day);
#endif
}
#define CLEARLINES2D(Startline, Numlines, Color) clearbuf((char *)(frameplace + ((Startline)*bytesperline)), (bytesperline*(Numlines))>>2, (Color)) #define CLEARLINES2D(Startline, Numlines, Color) clearbuf((char *)(frameplace + ((Startline)*bytesperline)), (bytesperline*(Numlines))>>2, (Color))
#define SCRIPTHISTSIZ 32 // should be the same as OSD_HISTORYDEPTH for maximum win, should be a power of two #define SCRIPTHISTSIZ 32 // should be the same as OSD_HISTORYDEPTH for maximum win, should be a power of two

View file

@ -1380,7 +1380,7 @@ static int32_t restore_highlighted_map(mapinfofull_t *mapinfo)
for (i=numwalls; i<newnumwalls; i++) for (i=numwalls; i<newnumwalls; i++)
{ {
wall[i].point2 += numwalls; wall[i].point2 += numwalls;
wall[i].x += editorgridextent<<2; wall[i].x += BXY_MAX*2;
} }
// reconstruct wall connections // reconstruct wall connections
@ -1394,7 +1394,7 @@ static int32_t restore_highlighted_map(mapinfofull_t *mapinfo)
hlsectorbitmap[i>>3] |= (1<<(i&7)); hlsectorbitmap[i>>3] |= (1<<(i&7));
} }
for (i=numwalls; i<newnumwalls; i++) for (i=numwalls; i<newnumwalls; i++)
wall[i].x -= editorgridextent<<2; wall[i].x -= BXY_MAX*2;
// checksectorpointer_warn = 1; // checksectorpointer_warn = 1;
// insert sprites // insert sprites
@ -3026,7 +3026,7 @@ outtathis:
if (((bstatus&1) < (oldmousebstatus&1)) && highlightsectorcnt < 0) //after dragging if (((bstatus&1) < (oldmousebstatus&1)) && highlightsectorcnt < 0) //after dragging
{ {
int32_t wallsdrawn = newnumwalls-numwalls, runi; int32_t wallsdrawn = newnumwalls-numwalls, runi;
walltype *tmpwall; walltype *tmpwall = NULL;
if (newnumwalls != -1) if (newnumwalls != -1)
{ {
@ -3103,7 +3103,7 @@ outtathis:
|| (POINT2(i).x == dax && POINT2(i).y == day)) || (POINT2(i).x == dax && POINT2(i).y == day))
{ {
checksectorpointer(i, sectorofwall(i)); checksectorpointer(i, sectorofwall(i));
fixrepeats(i); // fixrepeats(i);
asksave = 1; asksave = 1;
} }
} }
@ -4658,7 +4658,7 @@ end_space_handling:
if ((wall[i].x == dax && wall[i].y == day) || (POINT2(i).x == dax && POINT2(i).y == day)) if ((wall[i].x == dax && wall[i].y == day) || (POINT2(i).x == dax && POINT2(i).y == day))
{ {
checksectorpointer(i, sectorofwall(i)); checksectorpointer(i, sectorofwall(i));
fixrepeats(i); // fixrepeats(i);
} }
} }
//if (j != 0) //if (j != 0)
@ -5480,22 +5480,25 @@ static void insertpoint(int16_t linehighlight, int32_t dax, int32_t day)
{ {
int16_t sucksect; int16_t sucksect;
int32_t i, j, k; int32_t i, j, k;
uint32_t templenrepquot;
j = linehighlight; j = linehighlight;
sucksect = sectorofwall(j); sucksect = sectorofwall(j);
templenrepquot = divscale12(wallength(j), wall[j].xrepeat);
templenrepquot = max(1, templenrepquot);
sector[sucksect].wallnum++; sector[sucksect].wallnum++;
for (i=sucksect+1; i<numsectors; i++) for (i=sucksect+1; i<numsectors; i++)
sector[i].wallptr++; sector[i].wallptr++;
movewalls(j+1, +1); movewalls(j+1, +1);
Bmemcpy(&wall[j+1],&wall[j],sizeof(walltype)); Bmemcpy(&wall[j+1], &wall[j], sizeof(walltype));
wall[j].point2 = j+1; wall[j].point2 = j+1;
wall[j+1].x = dax; wall[j+1].x = dax;
wall[j+1].y = day; wall[j+1].y = day;
fixrepeats(j); fixxrepeat(j, templenrepquot);
fixrepeats(j+1); fixxrepeat(j+1, templenrepquot);
if (wall[j].nextwall >= 0) if (wall[j].nextwall >= 0)
{ {
@ -5513,8 +5516,8 @@ static void insertpoint(int16_t linehighlight, int32_t dax, int32_t day)
wall[k].point2 = k+1; wall[k].point2 = k+1;
wall[k+1].x = dax; wall[k+1].x = dax;
wall[k+1].y = day; wall[k+1].y = day;
fixrepeats(k); fixxrepeat(k, templenrepquot);
fixrepeats(k+1); fixxrepeat(k+1, templenrepquot);
j = wall[k].nextwall; j = wall[k].nextwall;
wall[j].nextwall = k+1; wall[j].nextwall = k+1;
@ -5651,6 +5654,21 @@ static int32_t movewalls(int32_t start, int32_t offs)
return(0); return(0);
} }
int32_t wallength(int16_t i)
{
int64_t dax = POINT2(i).x - wall[i].x;
int64_t day = POINT2(i).y - wall[i].y;
#if 1 //def POLYMOST
int64_t hypsq = dax*dax + day*day;
if (hypsq > (int64_t)INT_MAX)
return (int32_t)sqrt((double)hypsq);
else
return ksqrt((int32_t)hypsq);
#else
return ksqrt(dax*dax + day*day);
#endif
}
void fixrepeats(int16_t i) void fixrepeats(int16_t i)
{ {
int32_t dist = wallength(i); int32_t dist = wallength(i);
@ -5659,6 +5677,12 @@ void fixrepeats(int16_t i)
wall[i].xrepeat = clamp(mulscale10(dist,day), 1, 255); wall[i].xrepeat = clamp(mulscale10(dist,day), 1, 255);
} }
void fixxrepeat(int16_t i, uint32_t lenrepquot) // lenrepquot: divscale12(wallength,xrepeat)
{
if (lenrepquot != 0)
wall[i].xrepeat = clamp(divscale12(wallength(i), lenrepquot), 1, 255);
}
int32_t overridepm16y = -1; int32_t overridepm16y = -1;

View file

@ -9848,7 +9848,7 @@ static void addclipline(int32_t dax1, int32_t day1, int32_t dax2, int32_t day2,
// //
// clipmove // clipmove
// //
int32_t clipmove(vec3_t *vect, int16_t *sectnum, int32_t clipmove(vec3_t *pos, int16_t *sectnum,
int32_t xvect, int32_t yvect, int32_t xvect, int32_t yvect,
int32_t walldist, int32_t ceildist, int32_t flordist, uint32_t cliptype) int32_t walldist, int32_t ceildist, int32_t flordist, uint32_t cliptype)
{ {
@ -9874,16 +9874,16 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
oxvect = xvect; oxvect = xvect;
oyvect = yvect; oyvect = yvect;
goalx = (vect->x) + (xvect>>14); goalx = pos->x + (xvect>>14);
goaly = (vect->y) + (yvect>>14); goaly = pos->y + (yvect>>14);
clipnum = 0; clipnum = 0;
cx = (((vect->x)+goalx)>>1); cx = (pos->x+goalx)>>1;
cy = (((vect->y)+goaly)>>1); cy = (pos->y+goaly)>>1;
//Extra walldist for sprites on sector lines //Extra walldist for sprites on sector lines
gx = goalx-(vect->x); gy = goaly-(vect->y); gx = goalx-(pos->x); gy = goaly-(pos->y);
rad = nsqrtasm(gx*gx + gy*gy) + MAXCLIPDIST+walldist + 8; rad = nsqrtasm(gx*gx + gy*gy) + MAXCLIPDIST+walldist + 8;
xmin = cx-rad; ymin = cy-rad; xmin = cx-rad; ymin = cy-rad;
xmax = cx+rad; ymax = cy+rad; xmax = cx+rad; ymax = cy+rad;
@ -9928,7 +9928,7 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
continue; continue;
} }
clipsprite_initindex(curidx, curspr, &clipsectcnt, vect); clipsprite_initindex(curidx, curspr, &clipsectcnt, pos);
} }
@ -9949,7 +9949,7 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
x1 = wal->x; y1 = wal->y; x2 = wal2->x; y2 = wal2->y; x1 = wal->x; y1 = wal->y; x2 = wal2->x; y2 = wal2->y;
dx = x2-x1; dy = y2-y1; dx = x2-x1; dy = y2-y1;
if (dx*((vect->y)-y1) < ((vect->x)-x1)*dy) continue; //If wall's not facing you if (dx*((pos->y)-y1) < ((pos->x)-x1)*dy) continue; //If wall's not facing you
if (dx > 0) dax = dx*(ymin-y1); else dax = dx*(ymax-y1); if (dx > 0) dax = dx*(ymin-y1); else dax = dx*(ymax-y1);
if (dy > 0) day = dy*(xmax-x1); else day = dy*(xmin-x1); if (dy > 0) day = dy*(xmax-x1); else day = dy*(xmin-x1);
@ -9962,25 +9962,25 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
{ {
int32_t basez; int32_t basez;
if (rintersect(vect->x,vect->y,0, gx,gy,0, x1,y1, x2,y2, &dax,&day,&daz) == 0) if (rintersect(pos->x,pos->y,0, gx,gy,0, x1,y1, x2,y2, &dax,&day,&daz) == 0)
dax = vect->x, day = vect->y; dax = pos->x, day = pos->y;
daz = getflorzofslope((int16_t)dasect,dax,day); daz = getflorzofslope(dasect, dax,day);
daz2 = getflorzofslope(wal->nextsector,dax,day); daz2 = getflorzofslope(wal->nextsector, dax,day);
basez = getflorzofslope(sectq[clipinfo[curidx].qend],dax,day); basez = getflorzofslope(sectq[clipinfo[curidx].qend], dax,day);
sec2 = &sector[wal->nextsector]; sec2 = &sector[wal->nextsector];
if ((sec2->floorstat&1) == 0) if ((sec2->floorstat&1) == 0)
// if (dasect==sectq[clipinfo[curidx].qend] || daz2 < daz-(1<<8)) // if (dasect==sectq[clipinfo[curidx].qend] || daz2 < daz-(1<<8))
if (daz2-(flordist-1) <= vect->z && vect->z <= basez+(flordist-1)) if (daz2-(flordist-1) <= pos->z && pos->z <= basez+(flordist-1))
clipyou = 1; clipyou = 1;
if (clipyou == 0) if (clipyou == 0)
{ {
daz = getceilzofslope((int16_t)dasect,dax,day); daz = getceilzofslope(dasect, dax,day);
daz2 = getceilzofslope(wal->nextsector,dax,day); daz2 = getceilzofslope(wal->nextsector, dax,day);
basez = getceilzofslope(sectq[clipinfo[curidx].qend],dax,day); basez = getceilzofslope(sectq[clipinfo[curidx].qend], dax,day);
if ((sec2->ceilingstat&1) == 0) if ((sec2->ceilingstat&1) == 0)
// if (dasect==sectq[clipinfo[curidx].qend] || daz2 > daz+(1<<8)) // if (dasect==sectq[clipinfo[curidx].qend] || daz2 > daz+(1<<8))
if (basez-(ceildist-1) <= vect->z && vect->z <= daz2+(ceildist-1)) if (basez-(ceildist-1) <= pos->z && pos->z <= daz2+(ceildist-1))
clipyou = 1; clipyou = 1;
} }
} }
@ -9988,22 +9988,22 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
else if ((wal->nextsector < 0) || (wal->cstat&dawalclipmask)) clipyou = 1; else if ((wal->nextsector < 0) || (wal->cstat&dawalclipmask)) clipyou = 1;
else if (editstatus == 0) else if (editstatus == 0)
{ {
if (rintersect(vect->x,vect->y,0,gx,gy,0,x1,y1,x2,y2,&dax,&day,&daz) == 0) if (rintersect(pos->x,pos->y,0,gx,gy,0,x1,y1,x2,y2,&dax,&day,&daz) == 0)
dax = vect->x, day = vect->y; dax = pos->x, day = pos->y;
daz = getflorzofslope((int16_t)dasect,dax,day); daz = getflorzofslope(dasect, dax,day);
daz2 = getflorzofslope(wal->nextsector,dax,day); daz2 = getflorzofslope(wal->nextsector, dax,day);
sec2 = &sector[wal->nextsector]; sec2 = &sector[wal->nextsector];
if (daz2 < daz-(1<<8)) if (daz2 < daz-(1<<8))
if ((sec2->floorstat&1) == 0) if ((sec2->floorstat&1) == 0)
if ((vect->z) >= daz2-(flordist-1)) clipyou = 1; if ((pos->z) >= daz2-(flordist-1)) clipyou = 1;
if (clipyou == 0) if (clipyou == 0)
{ {
daz = getceilzofslope((int16_t)dasect,dax,day); daz = getceilzofslope(dasect, dax,day);
daz2 = getceilzofslope(wal->nextsector,dax,day); daz2 = getceilzofslope(wal->nextsector, dax,day);
if (daz2 > daz+(1<<8)) if (daz2 > daz+(1<<8))
if ((sec2->ceilingstat&1) == 0) if ((sec2->ceilingstat&1) == 0)
if ((vect->z) <= daz2+(ceildist-1)) clipyou = 1; if ((pos->z) <= daz2+(ceildist-1)) clipyou = 1;
} }
} }
@ -10017,15 +10017,15 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
//Add 2 boxes at endpoints //Add 2 boxes at endpoints
bsz = walldist; if (gx < 0) bsz = -bsz; bsz = walldist; if (gx < 0) bsz = -bsz;
addclipline(x1-bsz,y1-bsz,x1-bsz,y1+bsz,objtype); addclipline(x1-bsz,y1-bsz, x1-bsz,y1+bsz, objtype);
addclipline(x2-bsz,y2-bsz,x2-bsz,y2+bsz,objtype); addclipline(x2-bsz,y2-bsz, x2-bsz,y2+bsz, objtype);
bsz = walldist; if (gy < 0) bsz = -bsz; bsz = walldist; if (gy < 0) bsz = -bsz;
addclipline(x1+bsz,y1-bsz,x1-bsz,y1-bsz,objtype); addclipline(x1+bsz,y1-bsz, x1-bsz,y1-bsz, objtype);
addclipline(x2+bsz,y2-bsz,x2-bsz,y2-bsz,objtype); addclipline(x2+bsz,y2-bsz, x2-bsz,y2-bsz, objtype);
dax = walldist; if (dy > 0) dax = -dax; dax = walldist; if (dy > 0) dax = -dax;
day = walldist; if (dx < 0) day = -day; day = walldist; if (dx < 0) day = -day;
addclipline(x1+dax,y1+day,x2+dax,y2+day,objtype); addclipline(x1+dax,y1+day, x2+dax,y2+day, objtype);
} }
else if (wal->nextsector>=0) else if (wal->nextsector>=0)
{ {
@ -10057,7 +10057,7 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
k = ((tilesizy[spr->picnum]*spr->yrepeat)<<2); k = ((tilesizy[spr->picnum]*spr->yrepeat)<<2);
if (cstat&128) daz = spr->z+(k>>1); else daz = spr->z; if (cstat&128) daz = spr->z+(k>>1); else daz = spr->z;
if (picanm[spr->picnum]&0x00ff0000) daz -= ((int32_t)((int8_t)((picanm[spr->picnum]>>16)&255))*spr->yrepeat<<2); if (picanm[spr->picnum]&0x00ff0000) daz -= ((int32_t)((int8_t)((picanm[spr->picnum]>>16)&255))*spr->yrepeat<<2);
if (((vect->z) < daz+ceildist) && ((vect->z) > daz-k-flordist)) if (((pos->z) < daz+ceildist) && ((pos->z) > daz-k-flordist))
{ {
bsz = (spr->clipdist<<2)+walldist; if (gx < 0) bsz = -bsz; bsz = (spr->clipdist<<2)+walldist; if (gx < 0) bsz = -bsz;
addclipline(x1-bsz,y1-bsz,x1-bsz,y1+bsz,(int16_t)j+49152); addclipline(x1-bsz,y1-bsz,x1-bsz,y1+bsz,(int16_t)j+49152);
@ -10072,7 +10072,7 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
if (picanm[spr->picnum]&0x00ff0000) daz -= ((int32_t)((int8_t)((picanm[spr->picnum]>>16)&255))*spr->yrepeat<<2); if (picanm[spr->picnum]&0x00ff0000) daz -= ((int32_t)((int8_t)((picanm[spr->picnum]>>16)&255))*spr->yrepeat<<2);
daz2 = daz-k; daz2 = daz-k;
daz += ceildist; daz2 -= flordist; daz += ceildist; daz2 -= flordist;
if (((vect->z) < daz) && ((vect->z) > daz2)) if (((pos->z) < daz) && ((pos->z) > daz2))
{ {
//These lines get the 2 points of the rotated sprite //These lines get the 2 points of the rotated sprite
//Given: (x1, y1) starts out as the center point //Given: (x1, y1) starts out as the center point
@ -10089,7 +10089,7 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
dax = mulscale14(sintable[(spr->ang+256+512)&2047],walldist); dax = mulscale14(sintable[(spr->ang+256+512)&2047],walldist);
day = mulscale14(sintable[(spr->ang+256)&2047],walldist); day = mulscale14(sintable[(spr->ang+256)&2047],walldist);
if ((x1-(vect->x))*(y2-(vect->y)) >= (x2-(vect->x))*(y1-(vect->y))) //Front if ((x1-(pos->x))*(y2-(pos->y)) >= (x2-(pos->x))*(y1-(pos->y))) //Front
{ {
addclipline(x1+dax,y1+day,x2+day,y2-dax,(int16_t)j+49152); addclipline(x1+dax,y1+day,x2+day,y2-dax,(int16_t)j+49152);
} }
@ -10100,9 +10100,9 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
} }
//Side blocker //Side blocker
if ((x2-x1)*((vect->x)-x1) + (y2-y1)*((vect->y)-y1) < 0) if ((x2-x1)*((pos->x)-x1) + (y2-y1)*((pos->y)-y1) < 0)
{ addclipline(x1-day,y1+dax,x1+dax,y1+day,(int16_t)j+49152); } { addclipline(x1-day,y1+dax,x1+dax,y1+day,(int16_t)j+49152); }
else if ((x1-x2)*((vect->x)-x2) + (y1-y2)*((vect->y)-y2) < 0) else if ((x1-x2)*((pos->x)-x2) + (y1-y2)*((pos->y)-y2) < 0)
{ addclipline(x2+day,y2-dax,x2-dax,y2-day,(int16_t)j+49152); } { addclipline(x2+day,y2-dax,x2-dax,y2-day,(int16_t)j+49152); }
} }
} }
@ -10110,10 +10110,10 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
case 32: case 32:
daz = spr->z+ceildist; daz = spr->z+ceildist;
daz2 = spr->z-flordist; daz2 = spr->z-flordist;
if (((vect->z) < daz) && ((vect->z) > daz2)) if (((pos->z) < daz) && ((pos->z) > daz2))
{ {
if ((cstat&64) != 0) if ((cstat&64) != 0)
if (((vect->z) > spr->z) == ((cstat&8)==0)) continue; if (((pos->z) > spr->z) == ((cstat&8)==0)) continue;
tilenum = spr->picnum; tilenum = spr->picnum;
xoff = (int32_t)((int8_t)((picanm[tilenum]>>8)&255))+((int32_t)spr->xoffset); xoff = (int32_t)((int8_t)((picanm[tilenum]>>8)&255))+((int32_t)spr->xoffset);
@ -10139,23 +10139,23 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
dax = mulscale14(sintable[(spr->ang-256+512)&2047],walldist); dax = mulscale14(sintable[(spr->ang-256+512)&2047],walldist);
day = mulscale14(sintable[(spr->ang-256)&2047],walldist); day = mulscale14(sintable[(spr->ang-256)&2047],walldist);
if ((rxi[0]-(vect->x))*(ryi[1]-(vect->y)) < (rxi[1]-(vect->x))*(ryi[0]-(vect->y))) if ((rxi[0]-(pos->x))*(ryi[1]-(pos->y)) < (rxi[1]-(pos->x))*(ryi[0]-(pos->y)))
{ {
if (clipinsideboxline(cx,cy,rxi[1],ryi[1],rxi[0],ryi[0],rad) != 0) if (clipinsideboxline(cx,cy,rxi[1],ryi[1],rxi[0],ryi[0],rad) != 0)
addclipline(rxi[1]-day,ryi[1]+dax,rxi[0]+dax,ryi[0]+day,(int16_t)j+49152); addclipline(rxi[1]-day,ryi[1]+dax,rxi[0]+dax,ryi[0]+day,(int16_t)j+49152);
} }
else if ((rxi[2]-(vect->x))*(ryi[3]-(vect->y)) < (rxi[3]-(vect->x))*(ryi[2]-(vect->y))) else if ((rxi[2]-(pos->x))*(ryi[3]-(pos->y)) < (rxi[3]-(pos->x))*(ryi[2]-(pos->y)))
{ {
if (clipinsideboxline(cx,cy,rxi[3],ryi[3],rxi[2],ryi[2],rad) != 0) if (clipinsideboxline(cx,cy,rxi[3],ryi[3],rxi[2],ryi[2],rad) != 0)
addclipline(rxi[3]+day,ryi[3]-dax,rxi[2]-dax,ryi[2]-day,(int16_t)j+49152); addclipline(rxi[3]+day,ryi[3]-dax,rxi[2]-dax,ryi[2]-day,(int16_t)j+49152);
} }
if ((rxi[1]-(vect->x))*(ryi[2]-(vect->y)) < (rxi[2]-(vect->x))*(ryi[1]-(vect->y))) if ((rxi[1]-(pos->x))*(ryi[2]-(pos->y)) < (rxi[2]-(pos->x))*(ryi[1]-(pos->y)))
{ {
if (clipinsideboxline(cx,cy,rxi[2],ryi[2],rxi[1],ryi[1],rad) != 0) if (clipinsideboxline(cx,cy,rxi[2],ryi[2],rxi[1],ryi[1],rad) != 0)
addclipline(rxi[2]-dax,ryi[2]-day,rxi[1]-day,ryi[1]+dax,(int16_t)j+49152); addclipline(rxi[2]-dax,ryi[2]-day,rxi[1]-day,ryi[1]+dax,(int16_t)j+49152);
} }
else if ((rxi[3]-(vect->x))*(ryi[0]-(vect->y)) < (rxi[0]-(vect->x))*(ryi[3]-(vect->y))) else if ((rxi[3]-(pos->x))*(ryi[0]-(pos->y)) < (rxi[0]-(pos->x))*(ryi[3]-(pos->y)))
{ {
if (clipinsideboxline(cx,cy,rxi[0],ryi[0],rxi[3],ryi[3],rad) != 0) if (clipinsideboxline(cx,cy,rxi[0],ryi[0],rxi[3],ryi[3],rad) != 0)
addclipline(rxi[0]+dax,ryi[0]+day,rxi[3]+day,ryi[3]-dax,(int16_t)j+49152); addclipline(rxi[0]+dax,ryi[0]+day,rxi[3]+day,ryi[3]-dax,(int16_t)j+49152);
@ -10181,7 +10181,7 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
do do
{ {
intx = goalx; inty = goaly; intx = goalx; inty = goaly;
hitwall = raytrace(vect->x, vect->y, &intx, &inty); hitwall = raytrace(pos->x, pos->y, &intx, &inty);
if (hitwall >= 0) if (hitwall >= 0)
{ {
lx = clipit[hitwall].x2-clipit[hitwall].x1; lx = clipit[hitwall].x2-clipit[hitwall].x1;
@ -10198,6 +10198,8 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
goalx = mulscale20(lx,i)+intx; goalx = mulscale20(lx,i)+intx;
goaly = mulscale20(ly,i)+inty; goaly = mulscale20(ly,i)+inty;
} }
// else if (tempint2<0)
// Bprintf("!! tempint2<0 !!\n");
tempint1 = dmulscale6(lx,oxvect,ly,oyvect); tempint1 = dmulscale6(lx,oxvect,ly,oyvect);
for (i=cnt+1; i<=clipmoveboxtracenum; i++) for (i=cnt+1; i<=clipmoveboxtracenum; i++)
@ -10206,7 +10208,7 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
tempint2 = dmulscale6(clipit[j].x2-clipit[j].x1,oxvect,clipit[j].y2-clipit[j].y1,oyvect); tempint2 = dmulscale6(clipit[j].x2-clipit[j].x1,oxvect,clipit[j].y2-clipit[j].y1,oyvect);
if ((tempint1^tempint2) < 0) if ((tempint1^tempint2) < 0)
{ {
updatesector(vect->x,vect->y,sectnum); updatesector(pos->x,pos->y,sectnum);
return(retval); return(retval);
} }
} }
@ -10220,13 +10222,13 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
} }
cnt--; cnt--;
vect->x = intx; pos->x = intx;
vect->y = inty; pos->y = inty;
} }
while (((xvect|yvect) != 0) && (hitwall >= 0) && (cnt > 0)); while (((xvect|yvect) != 0) && (hitwall >= 0) && (cnt > 0));
for (j=0; j<clipsectnum; j++) for (j=0; j<clipsectnum; j++)
if (inside(vect->x,vect->y,clipsectorlist[j]) == 1) if (inside(pos->x,pos->y,clipsectorlist[j]) == 1)
{ {
*sectnum = clipsectorlist[j]; *sectnum = clipsectorlist[j];
return(retval); return(retval);
@ -10234,12 +10236,12 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
*sectnum = -1; tempint1 = 0x7fffffff; *sectnum = -1; tempint1 = 0x7fffffff;
for (j=numsectors-1; j>=0; j--) for (j=numsectors-1; j>=0; j--)
if (inside(vect->x,vect->y,j) == 1) if (inside(pos->x,pos->y,j) == 1)
{ {
if (sector[j].ceilingstat&2) if (sector[j].ceilingstat&2)
tempint2 = (getceilzofslope((int16_t)j,vect->x,vect->y)-(vect->z)); tempint2 = (getceilzofslope((int16_t)j,pos->x,pos->y)-(pos->z));
else else
tempint2 = (sector[j].ceilingz-(vect->z)); tempint2 = (sector[j].ceilingz-(pos->z));
if (tempint2 > 0) if (tempint2 > 0)
{ {
@ -10249,9 +10251,9 @@ int32_t clipmove(vec3_t *vect, int16_t *sectnum,
else else
{ {
if (sector[j].floorstat&2) if (sector[j].floorstat&2)
tempint2 = ((vect->z)-getflorzofslope((int16_t)j,vect->x,vect->y)); tempint2 = ((pos->z)-getflorzofslope((int16_t)j,pos->x,pos->y));
else else
tempint2 = ((vect->z)-sector[j].floorz); tempint2 = ((pos->z)-sector[j].floorz);
if (tempint2 <= 0) if (tempint2 <= 0)
{ {

View file

@ -105,12 +105,7 @@ static int32_t curcorruptthing=-1;
int32_t corruptlevel=0, numcorruptthings=0, corruptthings[MAXCORRUPTTHINGS]; int32_t corruptlevel=0, numcorruptthings=0, corruptthings[MAXCORRUPTTHINGS];
static uint32_t templenrepquot; static uint32_t templenrepquot=1;
static void fixxrepeat(int16_t i, uint32_t lenrepquot)
{
if (lenrepquot != 0)
wall[i].xrepeat = clamp(divscale12(wallength(i), lenrepquot), 1, 255);
}
//////////////////// Key stuff //////////////////// //////////////////// Key stuff ////////////////////
@ -384,20 +379,21 @@ void create_map_snapshot(void)
else else
{ {
int32_t i = 0; int32_t i = 0;
spritetype *tspri = (spritetype *)Bcalloc(1, sizeof(spritetype) * numsprites), spritetype *tspri = (spritetype *)Bcalloc(1, sizeof(spritetype) * numsprites + 1),
*spri = &tspri[0]; *spri = &tspri[0];
mapstate->sprites = (spritetype *)Bcalloc(1, sizeof(spritetype) * numsprites); mapstate->sprites = (spritetype *)Bcalloc(1, sizeof(spritetype) * numsprites + QADDNSZ);
for (j=0; j<MAXSPRITES && i < numsprites; j++) for (j=0; j<MAXSPRITES && i < numsprites; j++)
{ {
if (sprite[j].statnum != MAXSTATUS) if (sprite[j].statnum != MAXSTATUS)
{ {
Bmemcpy(spri++,&sprite[j],sizeof(spritetype)); Bmemcpy(spri++, &sprite[j], sizeof(spritetype));
i++; i++;
} }
} }
mapstate->spritesiz = j = qlz_compress(&tspri[0], (char *)&mapstate->sprites[0], mapstate->spritesiz = j = qlz_compress(&tspri[0], (char *)&mapstate->sprites[0],
sizeof(spritetype) * numsprites + QADDNSZ, state_compress); sizeof(spritetype) * numsprites, state_compress);
mapstate->sprites = (spritetype *)Brealloc(mapstate->sprites, j); mapstate->sprites = (spritetype *)Brealloc(mapstate->sprites, j);
mapstate->spritecrc = tempcrc; mapstate->spritecrc = tempcrc;
Bfree(tspri); Bfree(tspri);
@ -5182,8 +5178,7 @@ static void Keys3d(void)
for (j=0; j<(k?k:1); j++, sect=highlightsector[j]) for (j=0; j<(k?k:1); j++, sect=highlightsector[j])
{ {
i = headspritesect[sect]; for (i=headspritesect[sect]; i!=-1; i=nextspritesect[i])
while (i != -1)
{ {
tempint = getceilzofslope(sect, sprite[i].x, sprite[i].y); tempint = getceilzofslope(sect, sprite[i].x, sprite[i].y);
tempint += (tilesizy[sprite[i].picnum]*sprite[i].yrepeat)<<2; tempint += (tilesizy[sprite[i].picnum]*sprite[i].yrepeat)<<2;
@ -5193,8 +5188,6 @@ static void Keys3d(void)
if (sprite[i].z == tempint) if (sprite[i].z == tempint)
sprite[i].z += tsign * (updownunits << (eitherCTRL<<1)); // JBF 20031128 sprite[i].z += tsign * (updownunits << (eitherCTRL<<1)); // JBF 20031128
i = nextspritesect[i];
} }
sector[sect].ceilingz += tsign * (updownunits << (eitherCTRL<<1)); // JBF 20031128 sector[sect].ceilingz += tsign * (updownunits << (eitherCTRL<<1)); // JBF 20031128
@ -5207,8 +5200,7 @@ static void Keys3d(void)
for (j=0; j<(k?k:1); j++, sect=highlightsector[j]) for (j=0; j<(k?k:1); j++, sect=highlightsector[j])
{ {
i = headspritesect[sect]; for (i=headspritesect[sect]; i!=-1; i=nextspritesect[i])
while (i != -1)
{ {
tempint = getflorzofslope(sect,sprite[i].x,sprite[i].y); tempint = getflorzofslope(sect,sprite[i].x,sprite[i].y);
@ -5217,8 +5209,6 @@ static void Keys3d(void)
if (sprite[i].z == tempint) if (sprite[i].z == tempint)
sprite[i].z += tsign * (updownunits << (eitherCTRL<<1)); // JBF 20031128 sprite[i].z += tsign * (updownunits << (eitherCTRL<<1)); // JBF 20031128
i = nextspritesect[i];
} }
sector[sect].floorz += tsign * (updownunits << (eitherCTRL<<1)); // JBF 20031128 sector[sect].floorz += tsign * (updownunits << (eitherCTRL<<1)); // JBF 20031128
@ -6476,7 +6466,7 @@ static void Keys3d(void)
wall[w].xrepeat = 8; wall[w].xrepeat = 8;
wall[w].yrepeat = 8; wall[w].yrepeat = 8;
wall[w].cstat = 0; wall[w].cstat = 0;
fixrepeats((int16_t)searchwall); fixrepeats(searchwall);
} }
else if (AIMING_AT_CEILING_OR_FLOOR) else if (AIMING_AT_CEILING_OR_FLOOR)
{ {
@ -10255,6 +10245,14 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
} }
} }
} }
#if 0
// this one usually appears together with the "already referenced" corruption
else if (wall[nw].nextsector != i || wall[nw].nextwall != j)
{
CORRUPTCHK_PRINT(4, CORRUPT_WALL|nw, "WALL %d nextwall's backreferences inconsistent. Expected nw=%d, ns=%d; got nw=%d, ns=%d",
nw, i, j, wall[nw].nextsector, wall[nw].nextwall);
}
#endif
} }
} }

View file

@ -67,7 +67,6 @@ extern void updatenumsprites(void);
extern int32_t lastpm16time, synctics; extern int32_t lastpm16time, synctics;
extern int32_t halfxdim16, midydim16, zoom; extern int32_t halfxdim16, midydim16, zoom;
extern void fixrepeats(int16_t i);
static char autospritehelp=0,autosecthelp=0; static char autospritehelp=0,autosecthelp=0;
//int16_t MinRate=24, MinD=3; //int16_t MinRate=24, MinD=3;