From 9c3889e59bd9df71f7592253d10cb888bde25cd0 Mon Sep 17 00:00:00 2001 From: helixhorned Date: Thu, 28 Apr 2011 21:28:33 +0000 Subject: [PATCH] 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 --- polymer/eduke32/build/include/build.h | 6 +- polymer/eduke32/build/include/editor.h | 2 + polymer/eduke32/build/src/build.c | 70 ++++--- polymer/eduke32/build/src/engine.c | 144 ++++++++++---- polymer/eduke32/source/astub.c | 256 ++++++++++++++++--------- polymer/eduke32/source/game.c | 13 +- polymer/eduke32/source/player.c | 58 +++++- 7 files changed, 388 insertions(+), 161 deletions(-) diff --git a/polymer/eduke32/build/include/build.h b/polymer/eduke32/build/include/build.h index 73e1e448e..4fefb6b5c 100644 --- a/polymer/eduke32/build/include/build.h +++ b/polymer/eduke32/build/include/build.h @@ -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 diff --git a/polymer/eduke32/build/include/editor.h b/polymer/eduke32/build/include/editor.h index f29bba7a2..0a922deba 100644 --- a/polymer/eduke32/build/include/editor.h +++ b/polymer/eduke32/build/include/editor.h @@ -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); diff --git a/polymer/eduke32/build/src/build.c b/polymer/eduke32/build/src/build.c index f49c39d60..66cb7e718 100644 --- a/polymer/eduke32/build/src/build.c +++ b/polymer/eduke32/build/src/build.c @@ -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= 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>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; diff --git a/polymer/eduke32/build/src/engine.c b/polymer/eduke32/build/src/engine.c index 36573e78f..c35ce9c53 100644 --- a/polymer/eduke32/build/src/engine.c +++ b/polymer/eduke32/build/src/engine.c @@ -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= xb1[p2[z]])) + { bunchfirst[numbunches++] = p2[z], p2[z] = -1; +#ifdef YAX_ENABLE + if (scansector_retfast) + return; +#endif + } for (z=bunchfrst; 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; jMAXSTATUS) + for (j=0; jMAXSTATUS) { 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; ix,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; ix,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; ix,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; ix,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>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 diff --git a/polymer/eduke32/source/astub.c b/polymer/eduke32/source/astub.c index e292283b0..1779dcafe 100644 --- a/polymer/eduke32/source/astub.c +++ b/polymer/eduke32/source/astub.c @@ -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; jnumlines; 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= 0) - for (i=0; i 0) - { - for (i=0; i 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 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; i0 && (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; i0 && 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) ? §or[i].floorxpanning : §or[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 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"); diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c index f152dd593..cf97ddf72 100644 --- a/polymer/eduke32/source/game.c +++ b/polymer/eduke32/source/game.c @@ -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) diff --git a/polymer/eduke32/source/player.c b/polymer/eduke32/source/player.c index 58d1f0f47..0bec4772a 100644 --- a/polymer/eduke32/source/player.c +++ b/polymer/eduke32/source/player.c @@ -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;