Fix more overheadmap crashes, this time with 'Last Pissed Time'. Mapster32 now asks to jump to a sector, wall, sprite, or coordinates with 'J. Also fix crash when pressing '-' (not KP-) when aiming at something with tile 0.

git-svn-id: https://svn.eduke32.com/eduke32@1874 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2011-04-28 21:28:33 +00:00
parent c7280a140b
commit 9c3889e59b
7 changed files with 388 additions and 161 deletions

View file

@ -121,12 +121,14 @@ void yax_drawrooms(void (*ExtAnalyzeSprites)(void), int32_t horiz, int16_t sectn
// bit 4: 1 = x-flip "F"
// bit 5: 1 = y-flip "F"
// bit 6: 1 = Align texture to first wall of sector "R"
// bits 7-8: "T"
// bits 8-7: "T"
// 00 = normal floors
// 01 = masked floors
// 10 = transluscent masked floors
// 11 = reverse transluscent masked floors
// bits 9-15: reserved
// bit 9: 1 = blocking ceiling/floor
// bit 10: 1 = YAX'ed ceiling/floor
// bits 11-15: reserved
//40 bytes
typedef struct

View file

@ -173,6 +173,8 @@ extern int32_t lastpm16time;
extern char lastpm16buf[156];
int32_t editor_ask_function(const char *question, char *dachars, int32_t numchars);
void spriteoncfz(int32_t i, int32_t *czptr, int32_t *fzptr);
void DoSpriteOrnament(int32_t i);

View file

@ -2413,6 +2413,8 @@ void overheadeditor(void)
{
int16_t secshort = i;
YAX_SKIPSECTOR(i);
dabuffer = ExtGetSectorCaption(i);
if (dabuffer[0] == 0)
continue;
@ -2447,6 +2449,8 @@ void overheadeditor(void)
if (zoom < 768 && !(wal->cstat & (1<<14)))
continue;
YAX_SKIPWALL(i);
//Get average point of wall
// if ((dax > x3) && (dax < x4) && (day > y3) && (day < y4))
{
@ -2461,38 +2465,38 @@ void overheadeditor(void)
}
}
i = 0; j = numsprites; k=0;
if (zoom >= 768)
while (j > 0 && i < MAXSPRITES && (!m32_sideview || k<m32_swcnt))
for (i=0, k=0; (m32_sideview && k<m32_swcnt) || (!m32_sideview && i<MAXSPRITES); i++, k++)
{
if (m32_sideview)
{
i = m32_wallsprite[k++];
i = m32_wallsprite[k];
if (i<MAXWALLS)
continue;
i = i-MAXWALLS;
}
else
if (sprite[i].statnum == MAXSTATUS)
continue;
if (sprite[i].statnum < MAXSTATUS)
if (!m32_sideview && sprite[i].sectnum >= 0)
YAX_SKIPSECTOR(sprite[i].sectnum);
dabuffer = ExtGetSpriteCaption(i);
if (dabuffer[0] != 0)
{
dabuffer = ExtGetSpriteCaption(i);
if (dabuffer[0] != 0)
{
int32_t blocking = (sprite[i].cstat&1);
int32_t blocking = (sprite[i].cstat&1);
col = 3 + 2*blocking;
if (spritecol2d[sprite[i].picnum][blocking])
col = spritecol2d[sprite[i].picnum][blocking];
col = 3 + 2*blocking;
if (spritecol2d[sprite[i].picnum][blocking])
col = spritecol2d[sprite[i].picnum][blocking];
if ((i == pointhighlight-16384) && (totalclock & 32))
col += (2<<2);
if ((i == pointhighlight-16384) && (totalclock & 32))
col += (2<<2);
drawsmallabel(dabuffer, editorcolors[0], editorcolors[col],
sprite[i].x, sprite[i].y, sprite[i].z);
}
j--;
drawsmallabel(dabuffer, editorcolors[0], editorcolors[col],
sprite[i].x, sprite[i].y, sprite[i].z);
}
i++;
}
}
@ -5474,7 +5478,7 @@ CANCEL:
// __old_mapcopy_2__
if (LoadBoard(NULL, 4))
{
printmessage16("Invalid map format.");
message("Invalid map format, nothing loaded.");
if (bakstat==0)
mapinfofull_free(&bakmap);
}
@ -5743,17 +5747,17 @@ static int32_t ask_if_sure(const char *query, uint32_t flags)
return 0;
}
#ifdef YAX_ENABLE
static int32_t ask_above_or_below(void)
int32_t editor_ask_function(const char *question, char *dachars, int32_t numchars)
{
char ch;
int32_t ret=-1;
int32_t i, ret=-1;
_printmessage16("Extend above (a) or below (z)?");
_printmessage16("%s", question);
showframe(1);
bflushchars();
// 'c' is cancel too, but can be overridden
while ((keystatus[1]|keystatus[0x2e]) == 0 && ret==-1)
{
if (handleevents())
@ -5762,16 +5766,22 @@ static int32_t ask_above_or_below(void)
idle();
ch = bgetchar();
if (ch == 'a' || ch == 'A')
ret = 0;
else if (ch == 'z' || ch == 'Z')
ret = 1;
for (i=0; i<numchars; i++)
if (ch==Btolower(dachars[i]) || ch==Btoupper(dachars[i]))
ret = i;
}
clearkeys();
return ret;
}
#ifdef YAX_ENABLE
static int32_t ask_above_or_below(void)
{
char dachars[2] = {'a', 'z'};
return editor_ask_function("Extend above (a) or below (z)?", dachars, 2);
}
#endif
// flags: 1:no ExSaveMap (backup.map) and no taglabels saving
@ -6581,11 +6591,12 @@ int32_t getnumber_autocomplete(const char *namestart, char ch, int32_t *danum, i
// 1: sign
// 2: autocomplete names
// 4: autocomplete taglabels
// 8: return -1 if cancelled
int32_t _getnumber16(const char *namestart, int32_t num, int32_t maxnumber, char sign, void *(func)(int32_t))
{
char buffer[80], ch;
int32_t n, danum, oldnum;
uint8_t flags = (sign>>1)&3;
uint8_t flags = (sign>>1)&7;
sign &= 1;
danum = num;
@ -6627,6 +6638,9 @@ int32_t _getnumber16(const char *namestart, int32_t num, int32_t maxnumber, char
}
}
if (keystatus[0x1] && (flags&4))
oldnum = -1;
clearkeys();
return oldnum;

View file

@ -126,7 +126,7 @@ palette_t palookupfog[MAXPALOOKUPS];
#endif
static char permanentlock = 255;
int32_t artversion, mapversion=7L; // JBF 20040211: default mapversion to 7
int32_t artversion, mapversion=7; // JBF 20040211: default mapversion to 7
void *pic = NULL;
char picsiz[MAXTILES], tilefilenum[MAXTILES];
int32_t lastageclock;
@ -181,6 +181,8 @@ static int16_t maphacklight[PR_MAXLIGHTS];
inline int32_t getscreenvdisp(int32_t bz, int32_t zoome);
void screencoords(int32_t *xres, int32_t *yres, int32_t x, int32_t y, int32_t zoome);
static void scansector(int16_t sectnum);
int16_t editstatus = 0;
@ -190,6 +192,8 @@ int16_t editstatus = 0;
// all references to floor/ceiling bunchnums should be through the
// get/set functions!
static int32_t scansector_retfast = 0;
// game-time YAX data structures
static int16_t yax_bunchnum[MAXSECTORS][2];
static int16_t yax_nextwall[MAXWALLS][2];
@ -396,7 +400,7 @@ void yax_updategrays(int32_t posze)
if (cb<0 && fb<0)
continue;
k = ((cb<0 || sector[i].ceilingz < posze) && (fb<0 || posze < sector[i].floorz));
k = ((cb<0 || sector[i].ceilingz < posze) && (fb<0 || posze <= sector[i].floorz));
if (!k) // outside bounds, gray out!
{
graysectbitmap[i>>3] |= (1<<(i&7));
@ -452,7 +456,7 @@ void yax_drawrooms(void (*ExtAnalyzeSprites)(void), int32_t horiz, int16_t sectn
static uint8_t havebunch[2][YAX_MAXBUNCHES>>3];
static int16_t bunches[2][YAX_MAXBUNCHES];
int32_t i, j, k, head, cf, diddraw = 0;
int32_t i, j, k, cf, diddraw = 0;
int32_t bnchcnt, bnchnum[2] = {0,0};
int16_t ourbunch[2] = {-1,-1};
@ -503,11 +507,24 @@ void yax_drawrooms(void (*ExtAnalyzeSprites)(void), int32_t horiz, int16_t sectn
continue;
}
else
k = headsectbunch[!cf][j];
{
scansector_retfast = 1;
for (k = headsectbunch[!cf][j]; k != -1; k = nextsectbunch[!cf][k])
{
numscans = numbunches = 0;
scansector(k);
if (numbunches > 0)
break;
}
scansector_retfast = 0;
if (k < 0)
continue;
}
// tweak picnums vvv
head = headsectbunch[cf][j];
for (i=head; i!=-1; i=nextsectbunch[cf][i])
for (i=headsectbunch[cf][j]; i!=-1; i=nextsectbunch[cf][i])
{
if ((SECTORFLD(i,stat, cf)&(128+256))==0)
{
opicnum[i] = SECTORFLD(i,picnum, cf);
@ -516,11 +533,11 @@ void yax_drawrooms(void (*ExtAnalyzeSprites)(void), int32_t horiz, int16_t sectn
else
SECTORFLD(i,picnum, cf) = 13; //FOF;
}
}
if (allgotsector[k>>3]&(1<<(k&7)))
continue;
// TODO: make this better
drawrooms(globalposx,globalposy,globalposz,globalang,horiz,k+MAXSECTORS); // +MAXSECTORS: force
ExtAnalyzeSprites();
drawmasks();
@ -1769,7 +1786,13 @@ skipitaddwall:
for (z=numscansbefore; z<numscans; z++)
if ((wall[thewall[z]].point2 != thewall[p2[z]]) || (xb2[z] >= xb1[p2[z]]))
{
bunchfirst[numbunches++] = p2[z], p2[z] = -1;
#ifdef YAX_ENABLE
if (scansector_retfast)
return;
#endif
}
for (z=bunchfrst; z<numbunches; z++)
{
@ -5255,6 +5278,11 @@ static void fillpolygon(int32_t npoints)
int16_t *ptr, *ptr2;
intptr_t p;
// fix for bad next-point (xb1) values...
for (z=0; z<npoints; z++)
if ((unsigned)xb1[z] >= (unsigned)npoints)
xb1[z] = 0;
#ifdef USE_OPENGL
if (rendmode >= 3 && qsetmode == 200) { polymost_fillpolygon(npoints); return; }
#endif
@ -5275,8 +5303,8 @@ static void fillpolygon(int32_t npoints)
for (z=npoints-1; z>=0; z--)
{
zz = xb1[z];
y1 = ry1[z]; day1 = (y1>>12);
y2 = ry1[zz]; day2 = (y2>>12);
y1 = ry1[z]; day1 = clamp(y1>>12, 0, ydim-1); // clamp: crash prevention...
y2 = ry1[zz]; day2 = clamp(y2>>12, 0, ydim-1);
if (day1 != day2)
{
x1 = rx1[z]; x2 = rx1[zz];
@ -7004,7 +7032,7 @@ void drawrooms(int32_t daposx, int32_t daposy, int32_t daposz,
// *can* be negative, so let's just quit here in that case...
if (globalcursectnum<0)
{
enddrawing();
enddrawing(); //!!!
return;
}
}
@ -7023,7 +7051,10 @@ void drawrooms(int32_t daposx, int32_t daposy, int32_t daposz,
// to draw it, but scansector gets zero bunches. Result: big screwup!
// Leave inpreparesector as is, it's restored by completemirror.
if (numbunches==0)
{
enddrawing(); //!!!
return;
}
inpreparemirror = 0;
@ -7745,10 +7776,13 @@ int32_t loadboard(char *filename, char flags, int32_t *daposx, int32_t *daposy,
i = Bstrlen(filename)-1;
if (filename[i] == 255) { filename[i] = 0; flags = 1; } // JBF 20040119: "compatibility"
if ((fil = kopen4load(filename,flags)) == -1)
{ mapversion = 7L; return(-1); }
{ mapversion = 7; return(-1); }
kread(fil,&mapversion,4); mapversion = B_LITTLE32(mapversion);
if (mapversion != 7L && mapversion != 8L) { kclose(fil); return(-2); }
#ifdef YAX_ENABLE
if (mapversion != 9)
#endif
if (mapversion != 7 && mapversion != 8) { kclose(fil); return(-2); }
/*
// Enable this for doing map checksum tests
@ -7763,13 +7797,13 @@ int32_t loadboard(char *filename, char flags, int32_t *daposx, int32_t *daposy,
initspritelists();
#define MYMAXSECTORS (mapversion==7l?MAXSECTORSV7:MAXSECTORSV8)
#define MYMAXWALLS (mapversion==7l?MAXWALLSV7:MAXWALLSV8)
#define MYMAXSPRITES (mapversion==7l?MAXSPRITESV7:MAXSPRITESV8)
#define MYMAXSECTORS (mapversion==7?MAXSECTORSV7:MAXSECTORSV8)
#define MYMAXWALLS (mapversion==7?MAXWALLSV7:MAXWALLSV8)
#define MYMAXSPRITES (mapversion==7?MAXSPRITESV7:MAXSPRITESV8)
clearbuf(&show2dsector[0],(int32_t)((MAXSECTORS+3)>>5),0L);
clearbuf(&show2dsprite[0],(int32_t)((MAXSPRITES+3)>>5),0L);
clearbuf(&show2dwall[0],(int32_t)((MAXWALLS+3)>>5),0L);
Bmemset(show2dsector, 0, sizeof(show2dsector));
Bmemset(show2dsprite, 0, sizeof(show2dsprite));
Bmemset(show2dwall, 0, sizeof(show2dwall));
kread(fil,daposx,4); *daposx = B_LITTLE32(*daposx);
kread(fil,daposy,4); *daposy = B_LITTLE32(*daposy);
@ -7850,7 +7884,7 @@ int32_t loadboard(char *filename, char flags, int32_t *daposx, int32_t *daposy,
}
}
#ifdef YAX_ENABLE
yax_update(0);
yax_update(mapversion<9);
if (editstatus)
yax_updategrays(*daposz);
#endif
@ -8715,7 +8749,8 @@ int32_t saveboard(const char *filename, int32_t *daposx, int32_t *daposy, int32_
return(-1);
}
for (j=0; j<MAXSPRITES; j++)if ((unsigned)sprite[j].statnum>MAXSTATUS)
for (j=0; j<MAXSPRITES; j++)
if ((unsigned)sprite[j].statnum>MAXSTATUS)
{
initprintf("Map error: sprite #%d(%d,%d) with an illegal statnum(%d)\n",j,sprite[j].x,sprite[j].y,sprite[j].statnum);
changespritestat(j,0);
@ -8740,6 +8775,11 @@ int32_t saveboard(const char *filename, int32_t *daposx, int32_t *daposy, int32_
}
#endif
#ifdef YAX_ENABLE
if (numyaxbunches > 0)
mapversion = 9;
else
#endif
if (numsectors > MAXSECTORSV7 || numwalls > MAXWALLSV7 || numsprites > MAXSPRITESV7)
mapversion = 8;
else
@ -11600,6 +11640,7 @@ restart_grand:
#ifdef YAX_ENABLE
if (numyaxbunches > 0)
{
int32_t dasecclipmask = (dawalclipmask&1)<<9; // blocking: walstat&1 --> secstat&512
int16_t cb, fb, didchange;
yax_getbunches(sectnum, &cb, &fb);
@ -11617,17 +11658,28 @@ restart_grand:
{
for (i=0; i<origclipsectnum; i++)
{
cb = yax_getbunch(origclipsectorlist[i], YAX_CEILING);
for (j=headsectbunch[YAX_FLOOR][cb]; j!=-1; j=nextsectbunch[YAX_FLOOR][j])
if (inside(pos->x,pos->y, j)==1)
{
clipsectorlist[clipsectnum++] = j;
daz = getceilzofslope(j, pos->x,pos->y);
if (!didchange || daz > *ceilz)
didchange=1, *ceilhit = j+16384, *ceilz = daz;
}
j = origclipsectorlist[i];
if (yax_getbunch(j, YAX_CEILING) >= 0)
if (sector[j].ceilingstat&dasecclipmask)
break;
}
if (i==origclipsectnum)
for (i=0; i<origclipsectnum; i++)
{
cb = yax_getbunch(origclipsectorlist[i], YAX_CEILING);
if (cb < 0)
continue;
for (j=headsectbunch[YAX_FLOOR][cb]; j!=-1; j=nextsectbunch[YAX_FLOOR][j])
if (inside(pos->x,pos->y, j)==1)
{
clipsectorlist[clipsectnum++] = j;
daz = getceilzofslope(j, pos->x,pos->y);
if (!didchange || daz > *ceilz)
didchange=1, *ceilhit = j+16384, *ceilz = daz;
}
}
if (clipsectnum==0)
mcf++;
}
@ -11637,19 +11689,30 @@ restart_grand:
didchange = 0;
if (fb>=0 && mcf==1 && *florhit==sectnum+16384)
{
// (almost) same as above, but with floors...
for (i=0; i<origclipsectnum; i++)
{
fb = yax_getbunch(origclipsectorlist[i], YAX_FLOOR);
for (j=headsectbunch[YAX_CEILING][fb]; j!=-1; j=nextsectbunch[YAX_CEILING][j])
if (inside(pos->x,pos->y, j)==1)
{
clipsectorlist[clipsectnum++] = j;
daz = getflorzofslope(j, pos->x,pos->y);
if (!didchange || daz < *florz)
didchange=1, *florhit = j+16384, *florz = daz;
}
j = origclipsectorlist[i];
if (yax_getbunch(j, YAX_FLOOR) >= 0)
if (sector[j].floorstat&dasecclipmask)
break;
}
// (almost) same as above, but with floors...
if (i==origclipsectnum)
for (i=0; i<origclipsectnum; i++)
{
fb = yax_getbunch(origclipsectorlist[i], YAX_FLOOR);
if (fb < 0)
continue;
for (j=headsectbunch[YAX_CEILING][fb]; j!=-1; j=nextsectbunch[YAX_CEILING][j])
if (inside(pos->x,pos->y, j)==1)
{
clipsectorlist[clipsectnum++] = j;
daz = getflorzofslope(j, pos->x,pos->y);
if (!didchange || daz < *florz)
didchange=1, *florhit = j+16384, *florz = daz;
}
}
}
if (clipsectnum > 0)
@ -13726,6 +13789,9 @@ void draw2dscreen(const vec3_t *pos, int16_t cursectnum, int16_t ange, int32_t z
for (j=0; j<MAXSPRITES; j++)
if (sprite[j].statnum<MAXSTATUS && (editstatus == 1 || (show2dsprite[j>>3]&pow2char[j&7])))
{
if (!m32_sideview && sprite[j].sectnum >= 0)
YAX_SKIPSECTOR(sprite[j].sectnum);
if (!m32_sideview)
drawscreen_drawsprite(j,posxe,posye,posze,zoome);
else

View file

@ -593,6 +593,7 @@ int32_t map_undoredo(int32_t dir)
return 0;
}
#define M32_NUM_SPRITE_MODES ((signed)(sizeof(SpriteMode)/sizeof(SpriteMode[0])))
static const char *SpriteMode[]=
{
"NONE",
@ -625,7 +626,7 @@ static const char *SPRDSPMODE[MAXNOSPRITES]=
"Sprite display: NO EFFECTORS OR ACTORS"
};
#define MAXHELP3D (int32_t)(sizeof(Help3d)/sizeof(Help3d[0]))
#define MAXHELP3D ((signed)(sizeof(Help3d)/sizeof(Help3d[0])))
static const char *Help3d[]=
{
"Mapster32 3D mode help",
@ -2052,7 +2053,7 @@ static void IntegratedHelp(void)
for (j = (i==curhp)?(curline+1):0; j<helppage[i]->numlines; j++)
{
// entering an empty pattern will search with the last used pattern
if (strstr(helppage[i]->line[j], pattern[0]?pattern:oldpattern))
if (Bstrstr(helppage[i]->line[j], pattern[0]?pattern:oldpattern))
{
curhp = i;
@ -3563,7 +3564,7 @@ static int32_t m32gettile(int32_t idInitialTile)
Bstrupr(buf[1]);
if ((searchstr[0]=='^' && !Bstrncmp(buf[1], buf[0]+1, slen)) ||
(searchstr[0]!='^' && strstr(buf[1], buf[0])))
(searchstr[0]!='^' && Bstrstr(buf[1], buf[0])))
{
SelectAllTiles(i);
iTile = i;
@ -5032,7 +5033,7 @@ static void Keys3d(void)
visval = getnumber256("Visibility of selected sectors: ", sector[searchsector].visibility, 255, 0);
if (AskIfSure(0))
if (AskIfSure("Are you sure to change the visibility of all selected sectors?"))
return;
for (i=0; i<highlightsectorcnt; i++)
@ -5488,64 +5489,49 @@ static void Keys3d(void)
{
k=eitherSHIFT?1:16;
if (highlightsectorcnt >= 0)
for (i=0; i<highlightsectorcnt; i++)
if (highlightsector[i] == searchsector)
{
while (k > 0)
{
for (i=0; i<highlightsectorcnt; i++)
{
sector[highlightsector[i]].visibility += tsign;
if (tsign==1)
{
if (sector[highlightsector[i]].visibility == 240)
sector[highlightsector[i]].visibility = 239;
}
else if (sector[highlightsector[i]].visibility == 239)
sector[highlightsector[i]].visibility = 240;
}
k--;
}
break;
}
while (k > 0)
if (highlightsectorcnt > 0 && (hlsectorbitmap[searchsector>>3]&(1<<(searchsector&7))))
{
sector[searchsector].visibility += tsign;
if (tsign==1)
while (k-- > 0)
{
if (sector[searchsector].visibility == 240)
sector[searchsector].visibility = 239;
for (i=0; i<highlightsectorcnt; i++)
{
j = highlightsector[i];
sector[j].visibility += tsign;
if (tsign==1 && sector[j].visibility == 240)
sector[j].visibility = 239;
else if (tsign==-1 && sector[j].visibility == 239)
sector[j].visibility = 240;
}
}
else if (sector[searchsector].visibility == 239)
sector[searchsector].visibility = 240;
k--;
}
else
{
while (k-- > 0)
{
sector[searchsector].visibility += tsign;
if (tsign==1 && sector[searchsector].visibility == 240)
sector[searchsector].visibility = 239;
else if (tsign==-1 && sector[searchsector].visibility == 239)
sector[searchsector].visibility = 240;
}
}
message("Sector %d visibility %d",searchsector,sector[searchsector].visibility);
asksave = 1;
}
}
else // if !eitherALT
{
k = 0;
if (highlightsectorcnt >= 0)
{
for (i=0; i<highlightsectorcnt; i++)
if (highlightsector[i] == searchsector)
{
k = 1;
break;
}
}
k = (highlightsectorcnt>0 && (hlsectorbitmap[searchsector>>3]&(1<<(searchsector&7))));
tsign *= (1+3*eitherCTRL);
if (k == 0)
{
if (ASSERT_AIMING)
{
AIMED_CF_SEL(shade) += tsign*(1+3*eitherCTRL);
AIMED_CF_SEL(shade) += tsign;
message("%s %d shade %d", Typestr[searchstat], i, AIMED_CF_SEL(shade));
}
}
@ -5555,22 +5541,19 @@ static void Keys3d(void)
{
dasector = highlightsector[i];
sector[dasector].ceilingshade += tsign; //sector shade
// sector shade
sector[dasector].ceilingshade += tsign;
sector[dasector].floorshade += tsign;
startwall = sector[dasector].wallptr; //wall shade
endwall = startwall + sector[dasector].wallnum - 1;
for (j=startwall; j<=endwall; j++)
// wall shade
for (WALLS_OF_SECTOR(dasector, j))
wall[j].shade += tsign;
j = headspritesect[dasector]; //sprite shade
while (j != -1)
{
// sprite shade
for (j=headspritesect[dasector]; j!=-1; j=nextspritesect[j])
sprite[j].shade += tsign;
j = nextspritesect[j];
}
}
message("Highlighted sector shade changed by %d", tsign);
}
asksave = 1;
}
@ -5586,7 +5569,7 @@ static void Keys3d(void)
while (!tilesizx[AIMED_SELOVR_PICNUM] || !tilesizy[AIMED_SELOVR_PICNUM] || j)
{
AIMED_SELOVR_PICNUM += i;
AIMED_SELOVR_PICNUM += i+MAXTILES;
AIMED_SELOVR_PICNUM %= MAXTILES;
j = 0;
}
@ -6274,18 +6257,30 @@ static void Keys3d(void)
message("Sprite %d blocking bit %s", searchwall, ONOFF(sprite[searchwall].cstat&1));
asksave = 1;
}
else if (ASSERT_AIMING)
else if (AIMING_AT_WALL_OR_MASK || AIMING_AT_CEILING_OR_FLOOR)
{
wall[searchwall].cstat ^= 1;
// wall[searchwall].cstat &= ~64;
if ((wall[searchwall].nextwall >= 0) && !eitherSHIFT)
#ifdef YAX_ENABLE
if (AIMING_AT_CEILING_OR_FLOOR && yax_getbunch(searchsector, AIMING_AT_FLOOR)>=0)
{
NEXTWALL(searchwall).cstat &= ~(1+64);
NEXTWALL(searchwall).cstat |= (wall[searchwall].cstat&1);
SECTORFLD(searchsector,stat, AIMING_AT_FLOOR) ^= 512;
message("Sector %d's %s blocking bit %s", searchsector, typestr[searchstat],
ONOFF(SECTORFLD(searchsector,stat, AIMING_AT_FLOOR)&512));
asksave = 1;
}
else
#endif
{
wall[searchwall].cstat ^= 1;
// wall[searchwall].cstat &= ~64;
if ((wall[searchwall].nextwall >= 0) && !eitherSHIFT)
{
NEXTWALL(searchwall).cstat &= ~(1+64);
NEXTWALL(searchwall).cstat |= (wall[searchwall].cstat&1);
}
message("Wall %d blocking bit %s", searchwall, ONOFF(wall[searchwall].cstat&1));
asksave = 1;
message("Wall %d blocking bit %s", searchwall, ONOFF(wall[searchwall].cstat&1));
asksave = 1;
}
}
}
@ -6606,7 +6601,8 @@ static void Keys3d(void)
{
while (updownunits--)
wall[searchwall].xrepeat = changechar(wall[searchwall].xrepeat, changedir, smooshyalign, 1);
silentmessage("Wall %d repeat: %d, %d", searchwall, wall[searchwall].xrepeat, wall[searchwall].yrepeat);
silentmessage("Wall %d repeat: %d, %d", searchwall,
wall[searchwall].xrepeat, wall[searchwall].yrepeat);
}
else
{
@ -6658,7 +6654,8 @@ static void Keys3d(void)
sprite[searchwall].xrepeat = changechar(sprite[searchwall].xrepeat, changedir, smooshyalign, 1);
if (sprite[searchwall].xrepeat < 4)
sprite[searchwall].xrepeat = 4;
silentmessage("Sprite %d repeat: %d, %d", searchwall, sprite[searchwall].xrepeat, sprite[searchwall].yrepeat);
silentmessage("Sprite %d repeat: %d, %d", searchwall,
sprite[searchwall].xrepeat, sprite[searchwall].yrepeat);
}
}
asksave = 1;
@ -6725,7 +6722,8 @@ static void Keys3d(void)
{
while (updownunits--)
wall[searchwall].yrepeat = changechar(wall[searchwall].yrepeat, changedir, smooshyalign, 1);
silentmessage("Wall %d repeat: %d, %d", searchwall, wall[searchwall].xrepeat, wall[searchwall].yrepeat);
silentmessage("Wall %d repeat: %d, %d", searchwall,
wall[searchwall].xrepeat, wall[searchwall].yrepeat);
}
else
{
@ -6763,7 +6761,8 @@ static void Keys3d(void)
sprite[searchwall].yrepeat = changechar(sprite[searchwall].yrepeat, changedir, smooshyalign, 1);
if (sprite[searchwall].yrepeat < 4)
sprite[searchwall].yrepeat = 4;
silentmessage("Sprite %d repeat: %d, %d", searchwall, sprite[searchwall].xrepeat, sprite[searchwall].yrepeat);
silentmessage("Sprite %d repeat: %d, %d", searchwall,
sprite[searchwall].xrepeat, sprite[searchwall].yrepeat);
}
}
asksave = 1;
@ -7275,7 +7274,7 @@ paste_ceiling_or_floor:
if (PRESSED_KEYSC(D)) //Alt-D (adjust sprite[].clipdist)
{
if (eitherALT && AIMING_AT_SPRITE)
sprite[searchwall].clipdist = getnumber256("Sprite clipdist: ", sprite[searchwall].clipdist, 256L, 0);
sprite[searchwall].clipdist = getnumber256("Sprite clipdist: ", sprite[searchwall].clipdist, 255, 0);
}
VM_OnEvent(EVENT_KEYS3D, -1);
@ -7488,12 +7487,55 @@ static void Keys2d(void)
///__bigcomment__
#ifdef YAX_ENABLE
if (!m32_sideview && numyaxbunches>0)
{
int32_t zsign=0, bestzdiff=INT32_MAX, hiz=0, loz=0, bottomp=0;
if (PRESSED_KEYSC(PGDN) || (eitherCTRL && PRESSED_KEYSC(DOWN)))
zsign = 1;
else if (PRESSED_KEYSC(PGUP) || (eitherCTRL && PRESSED_KEYSC(UP)))
zsign = -1;
if (zsign)
{
for (i=0; i<numsectors; i++)
{
if (yax_getbunch(i, YAX_FLOOR) < 0)
continue;
loz = min(loz, sector[i].floorz);
hiz = max(hiz, sector[i].floorz);
// TODO: see if at least one sector point inside sceeen
j = (sector[i].floorz-pos.z)*zsign;
if (j>0 && j < bestzdiff)
bestzdiff = j;
}
if (zsign==1 && bestzdiff==INT_MAX)
bottomp=1, bestzdiff = (hiz+1024 - pos.z);
if (bestzdiff != INT32_MAX)
{
pos.z += zsign*bestzdiff;
yax_updategrays(pos.z);
printmessage16("Z position: %d%s", pos.z,
bottomp ? " (bottom)":(pos.z==loz ? " (top)":""));
}
}
}
#endif
#if 0
if (keystatus[KEYSC_QUOTE] && PRESSED_KEYSC(Z)) // ' z
{
editorzrange[0] = getnumber16("Upper Z range: ", editorzrange[0], INT32_MAX, 1);
editorzrange[1] = getnumber16("Lower Z range: ", editorzrange[1], INT32_MAX, 1);
// printmessage16("");
}
#endif
if (PRESSED_KEYSC(T)) // T (tag)
{
@ -7542,10 +7584,10 @@ static void Keys2d(void)
if (inside_editor(&pos, searchx,searchy, zoom, mousxplc,mousyplc,i) == 1)
{
Bsprintf(buffer,"Sector (%d) Lo-tag: ",i);
j = qsetmode;
qsetmode = 200;
// j = qsetmode;
// qsetmode = 200;
sector[i].lotag = _getnumber16(buffer, sector[i].lotag, BTAG_MAX, 0, (void *)ExtGetSectorType);
qsetmode = j;
// qsetmode = j;
// break;
}
}
@ -7684,7 +7726,8 @@ static void Keys2d(void)
{
uint8_t *repeat = (k==0) ? &sprite[cursprite].xrepeat : &sprite[cursprite].yrepeat;
*repeat = max(4, changechar(*repeat, changedir, smooshy, 1));
silentmessage("Sprite %d repeat: %d, %d", cursprite, sprite[cursprite].xrepeat, sprite[cursprite].yrepeat);
silentmessage("Sprite %d repeat: %d, %d", cursprite,
sprite[cursprite].xrepeat, sprite[cursprite].yrepeat);
}
else
{
@ -7696,7 +7739,8 @@ static void Keys2d(void)
{
uint8_t *panning = (k==0) ? &sector[i].floorxpanning : &sector[i].floorypanning;
*panning = changechar(*panning, changedir, smooshy, 0);
silentmessage("Sector %d floor panning: %d, %d", searchsector, sector[i].floorxpanning, sector[i].floorypanning);
silentmessage("Sector %d floor panning: %d, %d", searchsector,
sector[i].floorxpanning, sector[i].floorypanning);
}
}
@ -7920,10 +7964,8 @@ static void Keys2d(void)
if (keystatus[KEYSC_QUOTE] && PRESSED_KEYSC(3)) // ' 3
{
onnames = (onnames+1)%8;
onnames = (onnames+1)%M32_NUM_SPRITE_MODES;
printmessage16("Mode %d %s", onnames, SpriteMode[onnames]);
// clearmidstatbar16();
// for(i=0;i<MAXMODE32D;i++) {printext16(0*8,ydim16+32+(i*8),15,-1,SpriteMode[i],0);
}
// Ver();
@ -7953,22 +7995,59 @@ static void Keys2d(void)
if (keystatus[KEYSC_QUOTE] && PRESSED_KEYSC(J)) // ' J
{
pos.x = getnumber16("X-coordinate: ", pos.x, editorgridextent, 1);
pos.y = getnumber16("Y-coordinate: ", pos.y, editorgridextent, 1);
printmessage16("Current pos now (%d, %d)", pos.x, pos.y);
char dachars[4] = {'s', 'w', 'i', 'c'};
fade_editor_screen(-1);
i = editor_ask_function("Jump to (s)ector, (w)all, spr(i)te, or (c)oordinates?", dachars, 4);
switch (i)
{
case 0:
if (numsectors > 0)
{
j = getnumber16("Sector: ", 0, numsectors-1, 0+8);
if (j < 0)
break;
pos.x = wall[sector[j].wallptr].x;
pos.y = wall[sector[j].wallptr].y;
printmessage16("Current pos now on sector %d's first wall-point", j);
}
break;
case 1:
if (numwalls > 0)
{
j = getnumber16("Wall: ", 0, numwalls-1, 0+8);
if (j < 0)
break;
pos.x = wall[j].x;
pos.y = wall[j].y;
printmessage16("Current pos now on wall %d's point", j);
}
break;
case 2:
j = getnumber16("Sprite: ", 0, MAXSPRITES-1, 0+8);
if (j < 0 || sprite[j].statnum==MAXSTATUS)
break;
pos.x = sprite[j].x;
pos.y = sprite[j].y;
printmessage16("Current pos now on sprite %d", j);
break;
case 3:
pos.x = getnumber16("X-coordinate: ", pos.x, editorgridextent, 1);
pos.y = getnumber16("Y-coordinate: ", pos.y, editorgridextent, 1);
printmessage16("Current pos now (%d, %d)", pos.x, pos.y);
break;
}
}
}// end key2d
static void InitCustomColors(void)
{
/* blue */
/* vgapal16[9*4+0] = 63;
vgapal16[9*4+1] = 31;
vgapal16[9*4+2] = 7; */
int32_t i;
palette_t *edcol;
/*
/*
char vgapal16[4*256] =
{
00,00,00,00, 42,00,00,00, 00,42,00,00, 42,42,00,00, 00,00,42,00,
@ -7985,6 +8064,7 @@ static void InitCustomColors(void)
editorcolors[5] = getclosestcol(0,0,0);
*/
/* blue */
vgapal16[9*4+0] = 63;
vgapal16[9*4+1] = 31;
vgapal16[9*4+2] = 7;
@ -10007,7 +10087,7 @@ void app_crashhandler(void)
{
if (levelname[0])
{
char *f = strstr(levelname,".map");
char *f = Bstrstr(levelname,".map");
if (f)
Bstrcpy(f,"_crash.map");

View file

@ -3212,6 +3212,14 @@ void G_SE40(int32_t smoothratio)
}
}
#ifdef YAX_ENABLE
static int32_t g_yax_smoothratio;
static void G_AnalyzeSprites(void)
{
G_DoSpriteAnimations(ud.camera.x,ud.camera.y,ud.cameraang,g_yax_smoothratio);
}
#endif
void G_DrawRooms(int32_t snum, int32_t smoothratio)
{
int32_t dst,j,fz,cz;
@ -3463,7 +3471,10 @@ void G_DrawRooms(int32_t snum, int32_t smoothratio)
#endif
drawrooms(ud.camera.x,ud.camera.y,ud.camera.z,ud.cameraang,ud.camerahoriz,ud.camerasect);
#ifdef YAX_ENABLE
g_yax_smoothratio = smoothratio;
yax_drawrooms(G_AnalyzeSprites, ud.camerahoriz, ud.camerasect);
#endif
// dupe the sprites touching the portal to the other sector
if (ror_sprite != -1)

View file

@ -4472,6 +4472,44 @@ int32_t P_DoFist(DukePlayer_t *p)
return 0;
}
#ifdef YAX_ENABLE
static void getzsofslope_player(int16_t sectnum, int32_t dax, int32_t day, int32_t *ceilz, int32_t *florz)
{
int32_t i, didceil=0, didflor=0;
if ((sector[sectnum].ceilingstat&512)==0)
{
i = yax_getneighborsect(dax, day, sectnum, YAX_CEILING, NULL);
if (i >= 0)
{
*ceilz = getceilzofslope(i, dax,day);
didceil = 1;
}
}
if ((sector[sectnum].floorstat&512)==0)
{
i = yax_getneighborsect(dax, day, sectnum, YAX_FLOOR, NULL);
if (i >= 0)
{
*florz = getflorzofslope(i, dax,day);
didflor = 1;
}
}
if (!didceil || !didflor)
{
int32_t cz, fz;
getzsofslope(sectnum, dax, day, &cz, &fz);
if (!didceil)
*ceilz = cz;
if (!didflor)
*florz = fz;
}
}
#endif
void P_ProcessInput(int32_t snum)
{
DukePlayer_t *p = g_player[snum].ps;
@ -4509,7 +4547,11 @@ void P_ProcessInput(int32_t snum)
shrunk = (s->yrepeat < 32);
getzrange((vec3_t *)p,p->cursectnum,&cz,&hz,&fz,&lz,163L,CLIPMASK0);
#ifdef YAX_ENABLE
getzsofslope_player(p->cursectnum,p->pos.x,p->pos.y,&p->truecz,&p->truefz);
#else
getzsofslope(p->cursectnum,p->pos.x,p->pos.y,&p->truecz,&p->truefz);
#endif
j = p->truefz;
truefdist = klabs(p->pos.z-j);
@ -4920,7 +4962,6 @@ void P_ProcessInput(int32_t snum)
p->pos.z += ((fz-(k<<8))-p->pos.z)>>1;
if (p->pos.z < (actor[p->i].ceilingz+(18<<8)))
p->pos.z = actor[p->i].ceilingz+(18<<8);
}
else if (psectlotag != 2)
{
@ -5311,11 +5352,22 @@ HORIZONLY:
{
p->pos.x += p->vel.x>>14;
p->pos.y += p->vel.y>>14;
#ifdef YAX_ENABLE
// TODO: only if ceiling/floor bunchnum >= 0
updatesectorz(p->pos.x,p->pos.y,p->pos.z,&p->cursectnum);
#else
updatesector(p->pos.x,p->pos.y,&p->cursectnum);
#endif
changespritesect(p->i,p->cursectnum);
}
else if ((j = clipmove((vec3_t *)p,&p->cursectnum, p->vel.x,p->vel.y,164L,(4L<<8),i,CLIPMASK0)))
P_CheckTouchDamage(p, j);
else
{
#ifdef YAX_ENABLE
updatesectorz(p->pos.x,p->pos.y,p->pos.z,&p->cursectnum);
#endif
if ((j = clipmove((vec3_t *)p,&p->cursectnum, p->vel.x,p->vel.y,164L,(4L<<8),i,CLIPMASK0)))
P_CheckTouchDamage(p, j);
}
if (p->jetpack_on == 0 && psectlotag != 2 && psectlotag != 1 && shrunk)
p->pos.z += 32<<8;