From 9143833fc879817c0fd832ede372f3e60313d07c Mon Sep 17 00:00:00 2001 From: terminx Date: Tue, 22 Jun 2010 21:50:01 +0000 Subject: [PATCH] rotatesprite and multivoc have a rape baby No, seriously. Adds widescreen aware rotatesprite and works out half a dozen huge problems in the sound system, among other things. git-svn-id: https://svn.eduke32.com/eduke32@1658 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/build/include/build.h | 2 +- polymer/eduke32/build/include/cache1d.h | 1 - polymer/eduke32/build/include/polymer.h | 2 +- polymer/eduke32/build/include/polymost.h | 4 +- polymer/eduke32/build/src/cache1d.c | 9 +- polymer/eduke32/build/src/engine.c | 66 +++- polymer/eduke32/build/src/osd.c | 10 + polymer/eduke32/build/src/polymer.c | 5 +- polymer/eduke32/build/src/polymost.c | 42 ++- polymer/eduke32/build/src/sdlayer.c | 6 + polymer/eduke32/build/src/winlayer.c | 10 + polymer/eduke32/source/_functio.h | 14 +- polymer/eduke32/source/actors.c | 3 +- polymer/eduke32/source/anim.c | 2 +- polymer/eduke32/source/duke3d.h | 2 +- polymer/eduke32/source/enet/Makefile | 8 +- polymer/eduke32/source/enet/Makefile.msvc | 3 +- .../source/enet/include/enet/callbacks.h | 2 - .../eduke32/source/enet/include/enet/enet.h | 102 ++++-- .../source/enet/include/enet/protocol.h | 23 +- .../eduke32/source/enet/include/enet/win32.h | 2 + polymer/eduke32/source/enet/src/callbacks.c | 21 +- polymer/eduke32/source/enet/src/host.c | 90 +++-- polymer/eduke32/source/enet/src/peer.c | 10 +- polymer/eduke32/source/enet/src/protocol.c | 202 +++++++---- polymer/eduke32/source/enet/src/unix.c | 4 +- polymer/eduke32/source/funct.h | 1 + polymer/eduke32/source/function.h | 8 +- polymer/eduke32/source/game.c | 257 +++++++------ polymer/eduke32/source/gamedef.c | 2 +- polymer/eduke32/source/gameexec.c | 18 +- polymer/eduke32/source/global.c | 2 +- .../eduke32/source/jaudiolib/include/fx_man.h | 3 + .../source/jaudiolib/src/driver_directsound.c | 40 +- polymer/eduke32/source/jaudiolib/src/fx_man.c | 54 +-- .../eduke32/source/jaudiolib/src/multivoc.c | 341 +++++++----------- .../eduke32/source/jaudiolib/src/multivoc.h | 7 + polymer/eduke32/source/jaudiolib/src/vorbis.c | 11 +- polymer/eduke32/source/jmact/_control.h | 2 +- polymer/eduke32/source/menus.c | 18 +- polymer/eduke32/source/osdcmds.c | 1 + polymer/eduke32/source/player.c | 217 +++++------ polymer/eduke32/source/premap.c | 4 +- polymer/eduke32/source/sector.c | 3 +- polymer/eduke32/source/sounds.c | 251 ++++++++----- 45 files changed, 1115 insertions(+), 770 deletions(-) diff --git a/polymer/eduke32/build/include/build.h b/polymer/eduke32/build/include/build.h index d6ac35d81..066176900 100644 --- a/polymer/eduke32/build/include/build.h +++ b/polymer/eduke32/build/include/build.h @@ -465,7 +465,7 @@ void drawmasks(void); void clearview(int32_t dacol); void clearallviews(int32_t dacol); void drawmapview(int32_t dax, int32_t day, int32_t zoome, int16_t ang); -void rotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, int8_t dashade, char dapalnum, char dastat, int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2); +void rotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, int8_t dashade, char dapalnum, int32_t dastat, int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2); void drawline256(int32_t x1, int32_t y1, int32_t x2, int32_t y2, char col); int32_t printext16(int32_t xpos, int32_t ypos, int16_t col, int16_t backcol, const char *name, char fontsize); void printext256(int32_t xpos, int32_t ypos, int16_t col, int16_t backcol, const char *name, char fontsize); diff --git a/polymer/eduke32/build/include/cache1d.h b/polymer/eduke32/build/include/cache1d.h index 02b56f9fe..f5b915e33 100644 --- a/polymer/eduke32/build/include/cache1d.h +++ b/polymer/eduke32/build/include/cache1d.h @@ -20,7 +20,6 @@ void allocache(intptr_t *newhandle, int32_t newbytes, char *newlockptr); void suckcache(intptr_t *suckptr); void agecache(void); -mutex_t cachemutex; extern int32_t pathsearchmode; // 0 = gamefs mode (default), 1 = localfs mode (editor's mode) int32_t addsearchpath(const char *p); int32_t findfrompath(const char *fn, char **where); diff --git a/polymer/eduke32/build/include/polymer.h b/polymer/eduke32/build/include/polymer.h index 58ce204ce..21259e887 100644 --- a/polymer/eduke32/build/include/polymer.h +++ b/polymer/eduke32/build/include/polymer.h @@ -299,7 +299,7 @@ void polymer_loadboard(void); void polymer_drawrooms(int32_t daposx, int32_t daposy, int32_t daposz, int16_t daang, int32_t dahoriz, int16_t dacursectnum); void polymer_drawmasks(void); void polymer_editorpick(void); -void polymer_rotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, int8_t dashade, char dapalnum, char dastat, int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2); +void polymer_rotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, int8_t dashade, char dapalnum, int32_t dastat, int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2); void polymer_drawmaskwall(int32_t damaskwallcnt); void polymer_drawsprite(int32_t snum); void polymer_setanimatesprites(animatespritesptr animatesprites, int32_t x, int32_t y, int32_t a, int32_t smoothratio); diff --git a/polymer/eduke32/build/include/polymost.h b/polymer/eduke32/build/include/polymost.h index 90e1213ce..35fc23a3e 100644 --- a/polymer/eduke32/build/include/polymost.h +++ b/polymer/eduke32/build/include/polymost.h @@ -38,7 +38,7 @@ void uploadtexture(int32_t doalloc, int32_t xsiz, int32_t ysiz, int32_t intexfmt void polymost_drawsprite(int32_t snum); void polymost_drawmaskwall(int32_t damaskwallcnt); void polymost_dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, - int8_t dashade, char dapalnum, char dastat, int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2, int32_t uniqid); + int8_t dashade, char dapalnum, int32_t dastat, int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2, int32_t uniqid); void polymost_fillpolygon(int32_t npoints); void polymost_initosdfuncs(void); void polymost_drawrooms(void); @@ -130,7 +130,7 @@ static inline void fogcalc(const int32_t shade, const int32_t vis, const int32_t f = (vis > 239) ? (float)(gvisibility*((vis-240+f)/(klabs(vis-256)))) : (float)(gvisibility*(vis+16+f)); - fogresult = clamp(f, 0.0f, 100.f); + fogresult = clamp(f, 0.001f, 100.f); Bmemcpy(fogcol, &fogtable[pal<<2], sizeof(fogcol)); } diff --git a/polymer/eduke32/build/src/cache1d.c b/polymer/eduke32/build/src/cache1d.c index 737370713..3a7da324e 100644 --- a/polymer/eduke32/build/src/cache1d.c +++ b/polymer/eduke32/build/src/cache1d.c @@ -9,7 +9,6 @@ #include "cache1d.h" #include "pragmas.h" #include "baselayer.h" -#include "mutex.h" #ifdef WITHKPLIB #include "kplib.h" @@ -60,7 +59,6 @@ static intptr_t kzipopen(char *filnam) #define MAXCACHEOBJECTS 9216 -mutex_t cachemutex; static int32_t cachesize = 0; int32_t cachecount = 0; char zerochar = 0; @@ -101,7 +99,6 @@ void initcache(intptr_t dacachestart, int32_t dacachesize) cac[0].lock = &zerochar; cacnum = 1; - mutex_init(&cachemutex); initprintf("Initialized %.1fM cache\n", (float)(dacachesize/1024.f/1024.f)); } @@ -189,7 +186,6 @@ void suckcache(intptr_t *suckptr) { int32_t i; - while(mutex_lock(&cachemutex)); //Can't exit early, because invalid pointer might be same even though lock = 0 for (i=0; i= cacnum) agecount = cacnum-1; if (agecount < 0 || !cnt) return; - while(mutex_lock(&cachemutex)); + for (; cnt>=0; cnt--) { if (cac[agecount].lock && (((*cac[agecount].lock)-2)&255) < 198) @@ -231,7 +225,6 @@ void agecache(void) agecount--; if (agecount < 0) agecount = cacnum-1; } - mutex_unlock(&cachemutex); } static void reportandexit(char *errormessage) diff --git a/polymer/eduke32/build/src/engine.c b/polymer/eduke32/build/src/engine.c index bdbe78583..396374e4a 100644 --- a/polymer/eduke32/build/src/engine.c +++ b/polymer/eduke32/build/src/engine.c @@ -42,6 +42,8 @@ #include "engine_priv.h" +#define CACHEAGETIME 16 + #ifdef SUPERBUILD void loadvoxel(int32_t voxindex) { voxindex=0; } int32_t tiletovox[MAXTILES]; @@ -4478,7 +4480,8 @@ static int32_t clippoly4(int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2) // dorotatesprite (internal) // //JBF 20031206: Thanks to Ken's hunting, s/(rx1|ry1|rx2|ry2)/n\1/ in this function -static void dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, int8_t dashade, char dapalnum, char dastat, int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2, int32_t uniqid) +static void dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, int8_t dashade, + char dapalnum, int32_t dastat, int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2, int32_t uniqid) { int32_t cosang, sinang, v, nextv, dax1, dax2, oy, bx, by; int32_t i, x, y, x1, y1, x2, y2, gx1, gy1 ; @@ -6256,6 +6259,11 @@ void drawmapview(int32_t dax, int32_t day, int32_t zoome, int16_t ang) int32_t s, w, ox, oy, startwall, cx1, cy1, cx2, cy2; int32_t bakgxvect, bakgyvect, sortnum, gap, npoints; int32_t xvect, yvect, xvect2, yvect2, daslope; + int32_t oydim=ydim; + + ydim = (int32_t)((double)xdim * 0.625f); + setaspect(65536L,(int32_t)divscale16(ydim*320L,xdim*200L)); + ydim = oydim; beforedrawrooms = 0; @@ -6535,6 +6543,7 @@ void drawmapview(int32_t dax, int32_t day, int32_t zoome, int16_t ang) } enddrawing(); //}}} + setaspect(65536L,(int32_t)divscale16(ydim*320L,xdim*200L)); } @@ -6544,7 +6553,7 @@ void drawmapview(int32_t dax, int32_t day, int32_t zoome, int16_t ang) int32_t loadboard(char *filename, char fromwhere, int32_t *daposx, int32_t *daposy, int32_t *daposz, int16_t *daang, int16_t *dacursectnum) { - int16_t fil, i, numsprites; + int16_t fil, i, numsprites, dq[MAXSPRITES], dnum = 0; i = strlen(filename)-1; if (filename[i] == 255) { filename[i] = 0; fromwhere = 1; } // JBF 20040119: "compatibility" @@ -6642,15 +6651,58 @@ int32_t loadboard(char *filename, char fromwhere, int32_t *daposx, int32_t *dapo if (sprite[i].sectnum<0||sprite[i].sectnum>=MYMAXSECTORS) { - initprintf("Map error: sprite #%d(%d,%d) with an illegal sector(%d)\n",i,sprite[i].x,sprite[i].y,sprite[i].sectnum); - sprite[i].sectnum=MYMAXSECTORS-1; + initprintf(OSD_ERROR "Map error: sprite #%d(%d,%d) with illegal sector(%d). Map is corrupt!\n",i,sprite[i].x,sprite[i].y,sprite[i].sectnum); + updatesector(sprite[i].x, sprite[i].y, &sprite[i].sectnum); + } + if (sprite[i].picnum<0||sprite[i].picnum>=MAXTILES) + { + initprintf(OSD_ERROR "Map error: sprite #%d(%d,%d) with illegal picnum(%d). Map is corrupt!\n",i,sprite[i].x,sprite[i].y,sprite[i].picnum); + dq[dnum++] = i; } } for (i=0; i -1) + { + initprintf(OSD_ERROR "Map error: removing sprite #%d(%d,%d) in null space. Map is corrupt!\n",dq[dnum],sprite[dq[dnum]].x,sprite[dq[dnum]].y); + deletesprite(dq[dnum]); } //Must be after loading sectors, etc! @@ -7742,7 +7794,7 @@ void nextpage(void) } faketimerhandler(); - if ((totalclock >= lastageclock+8) || (totalclock < lastageclock)) + if ((totalclock >= lastageclock+CACHEAGETIME) || (totalclock < lastageclock)) { lastageclock = totalclock; agecache(); } #ifdef USE_OPENGL @@ -9730,7 +9782,7 @@ void flushperms(void) // // rotatesprite // -void rotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, int8_t dashade, char dapalnum, char dastat, int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2) +void rotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, int8_t dashade, char dapalnum, int32_t dastat, int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2) { int32_t i; permfifotype *per, *per2; diff --git a/polymer/eduke32/build/src/osd.c b/polymer/eduke32/build/src/osd.c index bcc7889cc..92b322c59 100644 --- a/polymer/eduke32/build/src/osd.c +++ b/polymer/eduke32/build/src/osd.c @@ -11,6 +11,7 @@ #include "scancodes.h" #include "crc32.h" +static mutex_t m_osdprintf; symbol_t *symbols = NULL; static symbol_t *addnewsymbol(const char *name); static symbol_t *findsymbol(const char *name, symbol_t *startingat); @@ -729,6 +730,8 @@ void OSD_Init(void) { "logcutoff","logcutoff: sets the maximal line count of the log file",(void *)&logcutoff, CVAR_INT, 0, 262144 }, }; + mutex_init(&m_osdprintf); + Bmemset(osdtext, asc_Space, TEXTSIZE); Bmemset(osdfmt, osdtextpal+(osdtextshade<<5), TEXTSIZE); Bmemset(osdsymbptrs, 0, sizeof(osdsymbptrs)); @@ -1504,8 +1507,12 @@ void OSD_Printf(const char *fmt, ...) char *chp, p=osdtextpal, s=osdtextshade; va_list va; +/* if ((osdflags & OSD_INITIALIZED) == 0) OSD_Init(); +*/ + + mutex_lock(&m_osdprintf); va_start(va, fmt); Bvsnprintf(tmpstr, 8192, fmt, va); @@ -1517,6 +1524,7 @@ void OSD_Printf(const char *fmt, ...) else { OSD_errors=MAX_ERRORS+2; + mutex_unlock(&m_osdprintf); return; } } @@ -1593,6 +1601,8 @@ void OSD_Printf(const char *fmt, ...) } } while (*(++chp)); + + mutex_unlock(&m_osdprintf); } diff --git a/polymer/eduke32/build/src/polymer.c b/polymer/eduke32/build/src/polymer.c index db7d2c712..2563d39f5 100644 --- a/polymer/eduke32/build/src/polymer.c +++ b/polymer/eduke32/build/src/polymer.c @@ -994,7 +994,8 @@ void polymer_editorpick(void) searchit = 0; } -void polymer_rotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, int8_t dashade, char dapalnum, char dastat, int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2) +void polymer_rotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, int8_t dashade, + char dapalnum, int32_t dastat, int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2) { UNREFERENCED_PARAMETER(sx); UNREFERENCED_PARAMETER(sy); @@ -3091,7 +3092,7 @@ static void polymer_extractfrustum(GLfloat* modelview, GLfloat* projecti static inline int32_t polymer_planeinfrustum(_prplane *plane, float* frustum) { - int32_t i, j, k; + int32_t i, j, k = -1; i = 4; do diff --git a/polymer/eduke32/build/src/polymost.c b/polymer/eduke32/build/src/polymost.c index d56265c22..812e4497f 100644 --- a/polymer/eduke32/build/src/polymost.c +++ b/polymer/eduke32/build/src/polymost.c @@ -5186,7 +5186,7 @@ void polymost_drawsprite(int32_t snum) //dastat&128 1:draw all pages (permanent) //cx1,... clip window (actual screen coords) void polymost_dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, - int8_t dashade, char dapalnum, char dastat, int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2, int32_t uniqid) + int8_t dashade, char dapalnum, int32_t dastat, int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2, int32_t uniqid) { static int32_t onumframes = 0; int32_t n, nn, x, zz, xoff, yoff, xsiz, ysiz, method; @@ -5196,6 +5196,8 @@ void polymost_dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16 double ogrhalfxdown10, ogrhalfxdown10x; double d, cosang, sinang, cosang2, sinang2, px[8], py[8], px2[8], py2[8]; float m[4][4]; + int32_t oxdim = xdim, oydim = ydim; + #ifdef USE_OPENGL if (rendmode >= 3 && usemodels && hudmem[(dastat&4)>>2][picnum].angadd) @@ -5378,23 +5380,54 @@ void polymost_dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16 if (dastat&2) //Auto window size scaling { + // nasty hacks go here if (!(dastat&8)) { x = xdimenscale; //= scale(xdimen,yxaspect,320); - sx = ((cx1+cx2+2)<<15)+scale(sx-(320<<15),oxdimen,320); + + if (!(dastat & 1024) && ((double)ydim/(double)xdim) <= .75f) + { + xdim = (int32_t)((double)ydim * 1.33333333333333334f); + setaspect(65536L,(int32_t)divscale16(ydim*320L,xdim*200L)); + } + + if (dastat & 512) + sx = ((cx1+cx2+2+scale((oxdim-xdim), cx1+cx2+2, oxdim))<<15)+scale(sx-(320<<15),scale(xdimen, xdim, oxdim),320); + else if (dastat & 256) + sx = ((cx1+cx2+2-scale((oxdim-xdim), cx1+cx2+2, oxdim))<<15)+scale(sx-(320<<15),scale(xdimen, xdim, oxdim),320); + else + sx = ((cx1+cx2+2)<<15)+scale(sx-(320<<15),scale(xdimen, xdim, oxdim),320); + sy = ((cy1+cy2+2)<<15)+mulscale16(sy-(200<<15),x); } else { //If not clipping to startmosts, & auto-scaling on, as a //hard-coded bonus, scale to full screen instead + + if (!(dastat & 1024) && ((double)ydim/(double)xdim) <= .75f) + { + xdim = (int32_t)((double)ydim * 1.33333333333333334f); + setaspect(65536L,(int32_t)divscale16(ydim*320L,xdim*200L)); + } + x = scale(xdim,yxaspect,320); sx = (xdim<<15)+32768+scale(sx-(320<<15),xdim,320); sy = (ydim<<15)+32768+mulscale16(sy-(200<<15),x); + + if (dastat & 512) + sx += (oxdim-xdim)<<16; + else if ((dastat & 256) == 0) + sx += (oxdim-xdim)<<15; } z = mulscale16(z,x); } - + else if (!(dastat & 1024) && ((double)ydim/(double)xdim) <= .75f) + { + ydim = (int32_t)((double)xdim * 0.75f); + setaspect(65536L,(int32_t)divscale16(ydim*320L,xdim*200L)); + } + d = (double)z/(65536.0*16384.0); cosang2 = cosang = (double)sintable[(a+512)&2047]*d; sinang2 = sinang = (double)sintable[a&2047]*d; @@ -5496,6 +5529,9 @@ void polymost_dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16 gshang = ogshang; gctang = ogctang; gstang = ogstang; + xdim = oxdim; + ydim = oydim; + setaspect(65536L,(int32_t)divscale16(ydim*320L,xdim*200L)); } #ifdef USE_OPENGL diff --git a/polymer/eduke32/build/src/sdlayer.c b/polymer/eduke32/build/src/sdlayer.c index 481b0ca7f..9545fd861 100644 --- a/polymer/eduke32/build/src/sdlayer.c +++ b/polymer/eduke32/build/src/sdlayer.c @@ -84,6 +84,8 @@ static int32_t buildkeytranslationtable(void); static SDL_Surface * appicon = NULL; static SDL_Surface * loadappicon(void); +static mutex_t m_initprintf; + int32_t wm_msgbox(char *name, char *fmt, ...) { char buf[2048]; @@ -251,6 +253,8 @@ int32_t initsystem(void) SDL_VERSION(&compiled); + mutex_init(&m_initprintf); + initprintf("Initializing SDL system interface " "(compiled against SDL version %d.%d.%d, found version %d.%d.%d)\n", compiled.major, compiled.minor, compiled.patch, @@ -361,6 +365,7 @@ void initprintf(const char *f, ...) OSD_Printf(buf); Bprintf("%s", buf); + mutex_lock(&m_initprintf); if (Bstrlen(dabuf) + Bstrlen(buf) > 1022) { startwin_puts(dabuf); @@ -375,6 +380,7 @@ void initprintf(const char *f, ...) startwin_idle(NULL); Bmemset(dabuf, 0, sizeof(dabuf)); } + mutex_unlock(&m_initprintf); } // diff --git a/polymer/eduke32/build/src/winlayer.c b/polymer/eduke32/build/src/winlayer.c index 6a1b5b98a..bb4f58a50 100644 --- a/polymer/eduke32/build/src/winlayer.c +++ b/polymer/eduke32/build/src/winlayer.c @@ -34,10 +34,13 @@ #include "osd.h" #include "rawinput.h" #include "nedmalloc.h" +#include "mutex.h" // undefine to restrict windowed resolutions to conventional sizes #define ANY_WINDOWED_SIZE +static mutex_t m_initprintf; + int32_t _buildargc = 0; const char **_buildargv = NULL; static char *argvbuf = NULL; @@ -348,6 +351,8 @@ int32_t WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, in nedcreatepool(SYSTEM_POOL_SIZE, -1); // atexit(neddestroysyspool); #else + // don't want to mix msvcrt with msvcrtd! +#ifndef DEBUGGINGAIDS if ((nedhandle = LoadLibrary("nedmalloc.dll"))) { nedpool *(WINAPI *nedcreatepool)(size_t, int); @@ -355,6 +360,7 @@ int32_t WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, in if ((nedcreatepool = (void *)GetProcAddress(nedhandle, "nedcreatepool"))) nedcreatepool(SYSTEM_POOL_SIZE, -1); } +#endif #endif hdc = GetDC(NULL); @@ -593,6 +599,8 @@ int32_t initsystem(void) // initprintf("Initializing Windows DirectX/GDI system interface\n"); + mutex_init(&m_initprintf); + // get the desktop dimensions before anything changes them ZeroMemory(&desktopmode, sizeof(DEVMODE)); desktopmode.dmSize = sizeof(DEVMODE); @@ -668,6 +676,7 @@ void initprintf(const char *f, ...) OSD_Printf(buf); + mutex_lock(&m_initprintf); if ((Bstrlen(dabuf) + Bstrlen(buf) + 2) > sizeof(dabuf)) { startwin_puts(dabuf); @@ -682,6 +691,7 @@ void initprintf(const char *f, ...) handleevents(); Bmemset(dabuf, 0, sizeof(dabuf)); } + mutex_unlock(&m_initprintf); } diff --git a/polymer/eduke32/source/_functio.h b/polymer/eduke32/source/_functio.h index fd4598fbe..097fe3de9 100644 --- a/polymer/eduke32/source/_functio.h +++ b/polymer/eduke32/source/_functio.h @@ -88,12 +88,14 @@ char gamefunctions[NUMGAMEFUNCTIONS][MAXGAMEFUNCLEN] = "Next_Weapon", "Previous_Weapon", "Show_Console", - "Show_DukeMatch_Scores" + "Show_DukeMatch_Scores", + "Dpad_Select", + "Dpad_Aiming" }; #ifdef __SETUP__ -#define NUMKEYENTRIES 54 +#define NUMKEYENTRIES 56 char keydefaults[NUMGAMEFUNCTIONS*3][MAXGAMEFUNCLEN] = { @@ -150,7 +152,9 @@ char keydefaults[NUMGAMEFUNCTIONS*3][MAXGAMEFUNCLEN] = "Next_Weapon", "'", "", "Previous_Weapon", ";", "", "Show_Console", "`", "", - "Show_DukeMatch_Scores," "", "" + "Show_DukeMatch_Scores", "", "", + "Dpad_Select", "", "", + "Dpad_Aiming", "", "", }; const char oldkeydefaults[NUMGAMEFUNCTIONS*3][MAXGAMEFUNCLEN] = @@ -208,7 +212,9 @@ const char oldkeydefaults[NUMGAMEFUNCTIONS*3][MAXGAMEFUNCLEN] = "Next_Weapon", "'", "", "Previous_Weapon", ";", "", "Show_Console", "`", "", - "Show_DukeMatch_Scores", "", "" + "Show_DukeMatch_Scores", "", "", + "Dpad_Select", "", "", + "Dpad_Aiming", "", "", }; static char * mousedefaults[] = diff --git a/polymer/eduke32/source/actors.c b/polymer/eduke32/source/actors.c index 9f99b30c0..0c0830209 100644 --- a/polymer/eduke32/source/actors.c +++ b/polymer/eduke32/source/actors.c @@ -2164,8 +2164,7 @@ CLEAR_THE_BOLT: if (t[1]) { - t[1]--; - if (t[1] == 0) + if (--t[1] == 0) s->cstat &= 32767; } else diff --git a/polymer/eduke32/source/anim.c b/polymer/eduke32/source/anim.c index a81ca2019..0254177d6 100644 --- a/polymer/eduke32/source/anim.c +++ b/polymer/eduke32/source/anim.c @@ -275,7 +275,7 @@ void G_PlayAnim(const char *fn,char t) g_restorePalette = 0; } - rotatesprite(0<<16,0<<16,65536L,512,TILE_ANIM,0,0,2+4+8+16+64, 0,0,xdim-1,ydim-1); + rotatesprite(0<<16,0<<16,65536L,512,TILE_ANIM,0,0,2+4+8+16+64+(ud.bgstretch?1024:0), 0,0,xdim-1,ydim-1); nextpage(); } diff --git a/polymer/eduke32/source/duke3d.h b/polymer/eduke32/source/duke3d.h index 4ded0a6ed..51056996d 100644 --- a/polymer/eduke32/source/duke3d.h +++ b/polymer/eduke32/source/duke3d.h @@ -335,7 +335,7 @@ typedef struct { int16_t cameraang, camerasect, camerahoriz; int16_t pause_on,from_bonus; int16_t camerasprite,last_camsprite; - int16_t last_level,secretlevel; + int16_t last_level,secretlevel, bgstretch; struct { int32_t UseJoystick; diff --git a/polymer/eduke32/source/enet/Makefile b/polymer/eduke32/source/enet/Makefile index 9ccd486b9..5c2892380 100644 --- a/polymer/eduke32/source/enet/Makefile +++ b/polymer/eduke32/source/enet/Makefile @@ -6,6 +6,7 @@ EROOT?=build RELEASE?=1 OPTLEVEL?=2 SRC=src +INC=include include ../../$(EROOT)/Makefile.shared @@ -25,14 +26,15 @@ CFLAGS=$(debug) -W -Wall -Wimplicit -Werror-implicit-function-declaration \ -funsigned-char -fno-strict-aliasing -DNO_GCC_BUILTINS -D_FORTIFY_SOURCE=2 \ -fjump-tables -fno-stack-protector -CPPFLAGS=-Iinclude -Isrc +CPPFLAGS=-I$(INC) -I$(SRC) OBJECTS=$(OBJ)/callbacks.o \ $(OBJ)/host.o \ $(OBJ)/list.o \ $(OBJ)/packet.o \ $(OBJ)/peer.o \ - $(OBJ)/protocol.o + $(OBJ)/protocol.o \ + $(OBJ)/compress.o ifeq ($(PLATFORM),WINDOWS) OBJECTS+= $(OBJ)/win32.o @@ -47,7 +49,7 @@ endif $(OBJNAME): $(OBJECTS) $(AR) cr $@ $^ -$(OBJECTS): $(OBJ)/%.o: $(SRC)/%.c +$(OBJECTS): $(OBJ)/%.o: $(SRC)/%.c $(INC)/enet/*.h -mkdir -p $(OBJ) $(COMPILE_STATUS) if $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@; then $(COMPILE_OK); else $(COMPILE_FAILED); fi diff --git a/polymer/eduke32/source/enet/Makefile.msvc b/polymer/eduke32/source/enet/Makefile.msvc index 21f71c905..6fc69b565 100644 --- a/polymer/eduke32/source/enet/Makefile.msvc +++ b/polymer/eduke32/source/enet/Makefile.msvc @@ -31,7 +31,8 @@ OBJECTS=$(OBJ)\callbacks.o \ $(OBJ)\packet.o \ $(OBJ)\peer.o \ $(OBJ)\protocol.o \ - $(OBJ)\win32.o + $(OBJ)\win32.o \ + $(OBJ)\compress.o {$(SRC)}.c{$(OBJ)}.o: $(CC) /c $(CFLAGS) /Fo$@ $< diff --git a/polymer/eduke32/source/enet/include/enet/callbacks.h b/polymer/eduke32/source/enet/include/enet/callbacks.h index b488ac724..340a4a989 100644 --- a/polymer/eduke32/source/enet/include/enet/callbacks.h +++ b/polymer/eduke32/source/enet/include/enet/callbacks.h @@ -11,7 +11,6 @@ typedef struct _ENetCallbacks { void * (ENET_CALLBACK * malloc) (size_t size); void (ENET_CALLBACK * free) (void * memory); - int (ENET_CALLBACK * rand) (void); void (ENET_CALLBACK * no_memory) (void); } ENetCallbacks; @@ -21,7 +20,6 @@ typedef struct _ENetCallbacks */ extern void * enet_malloc (size_t); extern void enet_free (void *); -extern int enet_rand (void); /** @} */ diff --git a/polymer/eduke32/source/enet/include/enet/enet.h b/polymer/eduke32/source/enet/include/enet/enet.h index 7d4ac3345..2f656d6cb 100644 --- a/polymer/eduke32/source/enet/include/enet/enet.h +++ b/polymer/eduke32/source/enet/include/enet/enet.h @@ -24,8 +24,8 @@ extern "C" #include "enet/callbacks.h" #define ENET_VERSION_MAJOR 1 -#define ENET_VERSION_MINOR 2 -#define ENET_VERSION_PATCH 2 +#define ENET_VERSION_MINOR 3 +#define ENET_VERSION_PATCH 0 #define ENET_VERSION_CREATE(major, minor, patch) (((major)<<16) | ((minor)<<8) | (patch)) #define ENET_VERSION ENET_VERSION_CREATE(ENET_VERSION_MAJOR, ENET_VERSION_MINOR, ENET_VERSION_PATCH) @@ -233,7 +233,9 @@ typedef struct _ENetPeer struct _ENetHost * host; enet_uint16 outgoingPeerID; enet_uint16 incomingPeerID; - enet_uint32 sessionID; + enet_uint32 connectID; + enet_uint8 outgoingSessionID; + enet_uint8 incomingSessionID; ENetAddress address; /**< Internet address of the peer */ void * data; /**< Application private data, may be freely modified */ ENetPeerState state; @@ -267,7 +269,7 @@ typedef struct _ENetPeer enet_uint32 highestRoundTripTimeVariance; enet_uint32 roundTripTime; /**< mean round trip time (RTT), in milliseconds, between sending a reliable packet and receiving its acknowledgement */ enet_uint32 roundTripTimeVariance; - enet_uint16 mtu; + enet_uint32 mtu; enet_uint32 windowSize; enet_uint32 reliableDataInTransit; enet_uint16 outgoingReliableSequenceNumber; @@ -281,12 +283,29 @@ typedef struct _ENetPeer enet_uint16 incomingUnsequencedGroup; enet_uint16 outgoingUnsequencedGroup; enet_uint32 unsequencedWindow [ENET_PEER_UNSEQUENCED_WINDOW_SIZE / 32]; - enet_uint32 disconnectData; + enet_uint32 eventData; } ENetPeer; +/** An ENet packet compressor for compressing UDP packets before socket sends or receives. + */ +typedef struct _ENetCompressor +{ + /** Context data for the compressor. Must be non-NULL. */ + void * context; + /** Compresses from inBuffers[0:inBufferCount-1], containing inLimit bytes, to outData, outputting at most outLimit bytes. Should return 0 on failure. */ + size_t (ENET_CALLBACK * compress) (void * context, const ENetBuffer * inBuffers, size_t inBufferCount, size_t inLimit, enet_uint8 * outData, size_t outLimit); + /** Decompresses from inData, containing inLimit bytes, to outData, outputting at most outLimit bytes. Should return 0 on failure. */ + size_t (ENET_CALLBACK * decompress) (void * context, const enet_uint8 * inData, size_t inLimit, enet_uint8 * outData, size_t outLimit); + /** Destroys the context when compression is disabled or the host is destroyed. May be NULL. */ + void (ENET_CALLBACK * destroy) (void * context); +} ENetCompressor; + +/** Callback that computes the checksum of the data held in buffers[0:bufferCount-1] */ +typedef enet_uint32 (ENET_CALLBACK * ENetChecksumCallback) (const ENetBuffer * buffers, size_t bufferCount); + /** An ENet host for communicating with peers. * - * No fields should be modified. + * No fields should be modified unless otherwise stated. @sa enet_host_create() @sa enet_host_destroy() @@ -294,38 +313,44 @@ typedef struct _ENetPeer @sa enet_host_service() @sa enet_host_flush() @sa enet_host_broadcast() + @sa enet_host_compress() + @sa enet_host_compress_with_range_coder() @sa enet_host_channel_limit() @sa enet_host_bandwidth_limit() @sa enet_host_bandwidth_throttle() */ typedef struct _ENetHost { - ENetSocket socket; - ENetAddress address; /**< Internet address of the host */ - enet_uint32 incomingBandwidth; /**< downstream bandwidth of the host */ - enet_uint32 outgoingBandwidth; /**< upstream bandwidth of the host */ - enet_uint32 bandwidthThrottleEpoch; - enet_uint32 mtu; - int recalculateBandwidthLimits; - ENetPeer * peers; /**< array of peers allocated for this host */ - size_t peerCount; /**< number of peers allocated for this host */ - size_t channelLimit; /**< maximum number of channels allowed for connected peers */ - enet_uint32 serviceTime; - ENetList dispatchQueue; - int continueSending; - size_t packetSize; - enet_uint16 headerFlags; - ENetProtocol commands [ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS]; - size_t commandCount; - ENetBuffer buffers [ENET_BUFFER_MAXIMUM]; - size_t bufferCount; - ENetAddress receivedAddress; - enet_uint8 receivedData [ENET_PROTOCOL_MAXIMUM_MTU]; - size_t receivedDataLength; - enet_uint32 totalSentData; /**< total data sent, user should reset to 0 as needed to prevent overflow */ - enet_uint32 totalSentPackets; /**< total UDP packets sent, user should reset to 0 as needed to prevent overflow */ - enet_uint32 totalReceivedData; /**< total data received, user should reset to 0 as needed to prevent overflow */ - enet_uint32 totalReceivedPackets; /**< total UDP packets received, user should reset to 0 as needed to prevent overflow */ + ENetSocket socket; + ENetAddress address; /**< Internet address of the host */ + enet_uint32 incomingBandwidth; /**< downstream bandwidth of the host */ + enet_uint32 outgoingBandwidth; /**< upstream bandwidth of the host */ + enet_uint32 bandwidthThrottleEpoch; + enet_uint32 mtu; + enet_uint32 randomSeed; + int recalculateBandwidthLimits; + ENetPeer * peers; /**< array of peers allocated for this host */ + size_t peerCount; /**< number of peers allocated for this host */ + size_t channelLimit; /**< maximum number of channels allowed for connected peers */ + enet_uint32 serviceTime; + ENetList dispatchQueue; + int continueSending; + size_t packetSize; + enet_uint16 headerFlags; + ENetProtocol commands [ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS]; + size_t commandCount; + ENetBuffer buffers [ENET_BUFFER_MAXIMUM]; + size_t bufferCount; + ENetChecksumCallback checksum; /**< callback the user can set to enable packet checksums for this host */ + ENetCompressor compressor; + enet_uint8 packetData [2][ENET_PROTOCOL_MAXIMUM_MTU]; + ENetAddress receivedAddress; + enet_uint8 * receivedData; + size_t receivedDataLength; + enet_uint32 totalSentData; /**< total data sent, user should reset to 0 as needed to prevent overflow */ + enet_uint32 totalSentPackets; /**< total UDP packets sent, user should reset to 0 as needed to prevent overflow */ + enet_uint32 totalReceivedData; /**< total data received, user should reset to 0 as needed to prevent overflow */ + enet_uint32 totalReceivedPackets; /**< total UDP packets received, user should reset to 0 as needed to prevent overflow */ } ENetHost; /** @@ -470,13 +495,15 @@ ENET_API void enet_packet_destroy (ENetPacket *); ENET_API int enet_packet_resize (ENetPacket *, size_t); extern enet_uint32 enet_crc32 (const ENetBuffer *, size_t); -ENET_API ENetHost * enet_host_create (const ENetAddress *, size_t, enet_uint32, enet_uint32); +ENET_API ENetHost * enet_host_create (const ENetAddress *, size_t, size_t, enet_uint32, enet_uint32); ENET_API void enet_host_destroy (ENetHost *); -ENET_API ENetPeer * enet_host_connect (ENetHost *, const ENetAddress *, size_t); +ENET_API ENetPeer * enet_host_connect (ENetHost *, const ENetAddress *, size_t, enet_uint32); ENET_API int enet_host_check_events (ENetHost *, ENetEvent *); ENET_API int enet_host_service (ENetHost *, ENetEvent *, enet_uint32); ENET_API void enet_host_flush (ENetHost *); ENET_API void enet_host_broadcast (ENetHost *, enet_uint8, ENetPacket *); +ENET_API void enet_host_compress (ENetHost *, const ENetCompressor *); +ENET_API int enet_host_compress_with_range_coder (ENetHost * host); ENET_API void enet_host_channel_limit (ENetHost *, size_t); ENET_API void enet_host_bandwidth_limit (ENetHost *, enet_uint32, enet_uint32); extern void enet_host_bandwidth_throttle (ENetHost *); @@ -495,7 +522,14 @@ extern void enet_peer_setup_outgoing_command (ENetPeer *, ENetO extern ENetOutgoingCommand * enet_peer_queue_outgoing_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32, enet_uint16); extern ENetIncomingCommand * enet_peer_queue_incoming_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32); extern ENetAcknowledgement * enet_peer_queue_acknowledgement (ENetPeer *, const ENetProtocol *, enet_uint16); +extern void enet_peer_dispatch_incoming_unreliable_commands (ENetPeer *, ENetChannel *); +extern void enet_peer_dispatch_incoming_reliable_commands (ENetPeer *, ENetChannel *); +ENET_API void * enet_range_coder_create (void); +ENET_API void enet_range_coder_destroy (void *); +ENET_API size_t enet_range_coder_compress (void *, const ENetBuffer *, size_t, size_t, enet_uint8 *, size_t); +ENET_API size_t enet_range_coder_decompress (void *, const enet_uint8 *, size_t, enet_uint8 *, size_t); + extern size_t enet_protocol_command_size (enet_uint8); #ifdef __cplusplus diff --git a/polymer/eduke32/source/enet/include/enet/protocol.h b/polymer/eduke32/source/enet/include/enet/protocol.h index 4e61cad38..19f7e45de 100644 --- a/polymer/eduke32/source/enet/include/enet/protocol.h +++ b/polymer/eduke32/source/enet/include/enet/protocol.h @@ -16,7 +16,7 @@ enum ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE = 32768, ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT = 1, ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT = 255, - ENET_PROTOCOL_MAXIMUM_PEER_ID = 0x7FFF + ENET_PROTOCOL_MAXIMUM_PEER_ID = 0xFFF }; typedef enum _ENetProtocolCommand @@ -43,8 +43,12 @@ typedef enum _ENetProtocolFlag ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE = (1 << 7), ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED = (1 << 6), - ENET_PROTOCOL_HEADER_FLAG_SENT_TIME = (1 << 15), - ENET_PROTOCOL_HEADER_FLAG_MASK = 0x8000 + ENET_PROTOCOL_HEADER_FLAG_COMPRESSED = (1 << 14), + ENET_PROTOCOL_HEADER_FLAG_SENT_TIME = (1 << 15), + ENET_PROTOCOL_HEADER_FLAG_MASK = ENET_PROTOCOL_HEADER_FLAG_COMPRESSED | ENET_PROTOCOL_HEADER_FLAG_SENT_TIME, + + ENET_PROTOCOL_HEADER_SESSION_MASK = (3 << 12), + ENET_PROTOCOL_HEADER_SESSION_SHIFT = 12 } ENetProtocolFlag; #ifdef _MSC_VER_ @@ -58,7 +62,6 @@ typedef enum _ENetProtocolFlag typedef struct _ENetProtocolHeader { - enet_uint32 checksum; enet_uint16 peerID; enet_uint16 sentTime; } ENET_PACKED ENetProtocolHeader; @@ -81,7 +84,9 @@ typedef struct _ENetProtocolConnect { ENetProtocolCommandHeader header; enet_uint16 outgoingPeerID; - enet_uint16 mtu; + enet_uint8 incomingSessionID; + enet_uint8 outgoingSessionID; + enet_uint32 mtu; enet_uint32 windowSize; enet_uint32 channelCount; enet_uint32 incomingBandwidth; @@ -89,14 +94,17 @@ typedef struct _ENetProtocolConnect enet_uint32 packetThrottleInterval; enet_uint32 packetThrottleAcceleration; enet_uint32 packetThrottleDeceleration; - enet_uint32 sessionID; + enet_uint32 connectID; + enet_uint32 data; } ENET_PACKED ENetProtocolConnect; typedef struct _ENetProtocolVerifyConnect { ENetProtocolCommandHeader header; enet_uint16 outgoingPeerID; - enet_uint16 mtu; + enet_uint8 incomingSessionID; + enet_uint8 outgoingSessionID; + enet_uint32 mtu; enet_uint32 windowSize; enet_uint32 channelCount; enet_uint32 incomingBandwidth; @@ -104,6 +112,7 @@ typedef struct _ENetProtocolVerifyConnect enet_uint32 packetThrottleInterval; enet_uint32 packetThrottleAcceleration; enet_uint32 packetThrottleDeceleration; + enet_uint32 connectID; } ENET_PACKED ENetProtocolVerifyConnect; typedef struct _ENetProtocolBandwidthLimit diff --git a/polymer/eduke32/source/enet/include/enet/win32.h b/polymer/eduke32/source/enet/include/enet/win32.h index 0e1cf0c5a..a20fb24dd 100644 --- a/polymer/eduke32/source/enet/include/enet/win32.h +++ b/polymer/eduke32/source/enet/include/enet/win32.h @@ -6,11 +6,13 @@ #define __ENET_WIN32_H__ #ifdef ENET_BUILDING_LIB +#ifdef _MSC_VER #pragma warning (disable: 4996) // 'strncpy' was declared deprecated #pragma warning (disable: 4267) // size_t to int conversion #pragma warning (disable: 4244) // 64bit to 32bit int #pragma warning (disable: 4018) // signed/unsigned mismatch #endif +#endif #include #include diff --git a/polymer/eduke32/source/enet/src/callbacks.c b/polymer/eduke32/source/enet/src/callbacks.c index 250b9670d..f94128256 100644 --- a/polymer/eduke32/source/enet/src/callbacks.c +++ b/polymer/eduke32/source/enet/src/callbacks.c @@ -5,11 +5,14 @@ #define ENET_BUILDING_LIB 1 #include "enet/enet.h" -static ENetCallbacks callbacks = { malloc, free, rand, abort }; +static ENetCallbacks callbacks = { malloc, free, abort }; int enet_initialize_with_callbacks (ENetVersion version, const ENetCallbacks * inits) { + if (version < ENET_VERSION_CREATE (1, 3, 0)) + return -1; + if (inits -> malloc != NULL || inits -> free != NULL) { if (inits -> malloc == NULL || inits -> free == NULL) @@ -19,14 +22,8 @@ enet_initialize_with_callbacks (ENetVersion version, const ENetCallbacks * inits callbacks.free = inits -> free; } - if (inits -> rand != NULL) - callbacks.rand = inits -> rand; - - if (version >= ENET_VERSION_CREATE(1, 2, 2)) - { - if (inits -> no_memory != NULL) - callbacks.no_memory = inits -> no_memory; - } + if (inits -> no_memory != NULL) + callbacks.no_memory = inits -> no_memory; return enet_initialize (); } @@ -48,9 +45,3 @@ enet_free (void * memory) callbacks.free (memory); } -int -enet_rand (void) -{ - return callbacks.rand (); -} - diff --git a/polymer/eduke32/source/enet/src/host.c b/polymer/eduke32/source/enet/src/host.c index 67accd93f..8bb2433fe 100644 --- a/polymer/eduke32/source/enet/src/host.c +++ b/polymer/eduke32/source/enet/src/host.c @@ -4,6 +4,7 @@ */ #define ENET_BUILDING_LIB 1 #include +#include #include "enet/enet.h" /** @defgroup host ENet host functions @@ -14,6 +15,7 @@ @param address the address at which other peers may connect to this host. If NULL, then no peers may connect to the host. @param peerCount the maximum number of peers that should be allocated for the host. + @param channelLimit the maximum number of channels allowed; if 0, then this is equivalent to ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT @param incomingBandwidth downstream bandwidth of the host in bytes/second; if 0, ENet will assume unlimited bandwidth. @param outgoingBandwidth upstream bandwidth of the host in bytes/second; if 0, ENet will assume unlimited bandwidth. @@ -25,7 +27,7 @@ at any given time. */ ENetHost * -enet_host_create (const ENetAddress * address, size_t peerCount, enet_uint32 incomingBandwidth, enet_uint32 outgoingBandwidth) +enet_host_create (const ENetAddress * address, size_t peerCount, size_t channelLimit, enet_uint32 incomingBandwidth, enet_uint32 outgoingBandwidth) { ENetHost * host; ENetPeer * currentPeer; @@ -66,7 +68,15 @@ enet_host_create (const ENetAddress * address, size_t peerCount, enet_uint32 inc if (address != NULL) host -> address = * address; - host -> channelLimit = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT; + if (! channelLimit || channelLimit > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT; + else + if (channelLimit < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT; + + host -> randomSeed = (enet_uint32) time(NULL) + (enet_uint32) (size_t) host; + host -> randomSeed = (host -> randomSeed << 16) | (host -> randomSeed >> 16); + host -> channelLimit = channelLimit; host -> incomingBandwidth = incomingBandwidth; host -> outgoingBandwidth = outgoingBandwidth; host -> bandwidthThrottleEpoch = 0; @@ -75,8 +85,10 @@ enet_host_create (const ENetAddress * address, size_t peerCount, enet_uint32 inc host -> peerCount = peerCount; host -> commandCount = 0; host -> bufferCount = 0; + host -> checksum = NULL; host -> receivedAddress.host = ENET_HOST_ANY; host -> receivedAddress.port = 0; + host -> receivedData = NULL; host -> receivedDataLength = 0; host -> totalSentData = 0; @@ -84,6 +96,11 @@ enet_host_create (const ENetAddress * address, size_t peerCount, enet_uint32 inc host -> totalReceivedData = 0; host -> totalReceivedPackets = 0; + host -> compressor.context = NULL; + host -> compressor.compress = NULL; + host -> compressor.decompress = NULL; + host -> compressor.destroy = NULL; + enet_list_clear (& host -> dispatchQueue); for (currentPeer = host -> peers; @@ -92,6 +109,7 @@ enet_host_create (const ENetAddress * address, size_t peerCount, enet_uint32 inc { currentPeer -> host = host; currentPeer -> incomingPeerID = currentPeer - host -> peers; + currentPeer -> outgoingSessionID = currentPeer -> incomingSessionID = 0xFF; currentPeer -> data = NULL; enet_list_clear (& currentPeer -> acknowledgements); @@ -103,7 +121,7 @@ enet_host_create (const ENetAddress * address, size_t peerCount, enet_uint32 inc enet_peer_reset (currentPeer); } - + return host; } @@ -124,6 +142,9 @@ enet_host_destroy (ENetHost * host) enet_peer_reset (currentPeer); } + if (host -> compressor.context != NULL && host -> compressor.destroy) + (* host -> compressor.destroy) (host -> compressor.context); + enet_free (host -> peers); enet_free (host); } @@ -132,12 +153,13 @@ enet_host_destroy (ENetHost * host) @param host host seeking the connection @param address destination for the connection @param channelCount number of channels to allocate + @param data user data supplied to the receiving host @returns a peer representing the foreign host on success, NULL on failure @remarks The peer returned will have not completed the connection until enet_host_service() notifies of an ENET_EVENT_TYPE_CONNECT event for the peer. */ ENetPeer * -enet_host_connect (ENetHost * host, const ENetAddress * address, size_t channelCount) +enet_host_connect (ENetHost * host, const ENetAddress * address, size_t channelCount, enet_uint32 data) { ENetPeer * currentPeer; ENetChannel * channel; @@ -166,7 +188,7 @@ enet_host_connect (ENetHost * host, const ENetAddress * address, size_t channelC currentPeer -> channelCount = channelCount; currentPeer -> state = ENET_PEER_STATE_CONNECTING; currentPeer -> address = * address; - currentPeer -> sessionID = (enet_uint32) enet_rand (); + currentPeer -> connectID = ++ host -> randomSeed; if (host -> outgoingBandwidth == 0) currentPeer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; @@ -199,7 +221,9 @@ enet_host_connect (ENetHost * host, const ENetAddress * address, size_t channelC command.header.command = ENET_PROTOCOL_COMMAND_CONNECT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; command.header.channelID = 0xFF; command.connect.outgoingPeerID = ENET_HOST_TO_NET_16 (currentPeer -> incomingPeerID); - command.connect.mtu = ENET_HOST_TO_NET_16 (currentPeer -> mtu); + command.connect.incomingSessionID = currentPeer -> incomingSessionID; + command.connect.outgoingSessionID = currentPeer -> outgoingSessionID; + command.connect.mtu = ENET_HOST_TO_NET_32 (currentPeer -> mtu); command.connect.windowSize = ENET_HOST_TO_NET_32 (currentPeer -> windowSize); command.connect.channelCount = ENET_HOST_TO_NET_32 (channelCount); command.connect.incomingBandwidth = ENET_HOST_TO_NET_32 (host -> incomingBandwidth); @@ -207,29 +231,14 @@ enet_host_connect (ENetHost * host, const ENetAddress * address, size_t channelC command.connect.packetThrottleInterval = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleInterval); command.connect.packetThrottleAcceleration = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleAcceleration); command.connect.packetThrottleDeceleration = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleDeceleration); - command.connect.sessionID = currentPeer -> sessionID; - + command.connect.connectID = currentPeer -> connectID; + command.connect.data = ENET_HOST_TO_NET_32 (data); + enet_peer_queue_outgoing_command (currentPeer, & command, NULL, 0, 0); return currentPeer; } -/** Limits the maximum allowed channels of future incoming connections. - @param host host to limit - @param channelLimit the maximum number of channels allowed; if 0, then this is equivalent to ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT -*/ -void -enet_host_channel_limit (ENetHost * host, size_t channelLimit) -{ - if (! channelLimit || channelLimit > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) - channelLimit = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT; - else - if (channelLimit < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT) - channelLimit = ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT; - - host -> channelLimit = channelLimit; -} - /** Queues a packet to be sent to all peers associated with the host. @param host host on which to broadcast the packet @param channelID channel on which to broadcast @@ -254,6 +263,39 @@ enet_host_broadcast (ENetHost * host, enet_uint8 channelID, ENetPacket * packet) enet_packet_destroy (packet); } +/** Sets the packet compressor the host should use to compress and decompress packets. + @param host host to enable or disable compression for + @param compressor callbacks for for the packet compressor; if NULL, then compression is disabled +*/ +void +enet_host_compress (ENetHost * host, const ENetCompressor * compressor) +{ + if (host -> compressor.context != NULL && host -> compressor.destroy) + (* host -> compressor.destroy) (host -> compressor.context); + + if (compressor) + host -> compressor = * compressor; + else + host -> compressor.context = NULL; +} + +/** Limits the maximum allowed channels of future incoming connections. + @param host host to limit + @param channelLimit the maximum number of channels allowed; if 0, then this is equivalent to ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT +*/ +void +enet_host_channel_limit (ENetHost * host, size_t channelLimit) +{ + if (! channelLimit || channelLimit > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT; + else + if (channelLimit < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT; + + host -> channelLimit = channelLimit; +} + + /** Adjusts the bandwidth limits of a host. @param host host to adjust @param incomingBandwidth new incoming bandwidth diff --git a/polymer/eduke32/source/enet/src/peer.c b/polymer/eduke32/source/enet/src/peer.c index 395a90274..d778ce1d6 100644 --- a/polymer/eduke32/source/enet/src/peer.c +++ b/polymer/eduke32/source/enet/src/peer.c @@ -325,7 +325,7 @@ void enet_peer_reset (ENetPeer * peer) { peer -> outgoingPeerID = ENET_PROTOCOL_MAXIMUM_PEER_ID; - peer -> sessionID = 0; + peer -> connectID = 0; peer -> state = ENET_PEER_STATE_DISCONNECTED; @@ -363,7 +363,7 @@ enet_peer_reset (ENetPeer * peer) peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; peer -> incomingUnsequencedGroup = 0; peer -> outgoingUnsequencedGroup = 0; - peer -> disconnectData = 0; + peer -> eventData = 0; memset (peer -> unsequencedWindow, 0, sizeof (peer -> unsequencedWindow)); @@ -477,7 +477,7 @@ enet_peer_disconnect_later (ENetPeer * peer, enet_uint32 data) enet_list_empty (& peer -> sentReliableCommands))) { peer -> state = ENET_PEER_STATE_DISCONNECT_LATER; - peer -> disconnectData = data; + peer -> eventData = data; } else enet_peer_disconnect (peer, data); @@ -585,7 +585,7 @@ enet_peer_queue_outgoing_command (ENetPeer * peer, const ENetProtocol * command, return outgoingCommand; } -static void +void enet_peer_dispatch_incoming_unreliable_commands (ENetPeer * peer, ENetChannel * channel) { ENetListIterator currentCommand; @@ -614,7 +614,7 @@ enet_peer_dispatch_incoming_unreliable_commands (ENetPeer * peer, ENetChannel * } } -static void +void enet_peer_dispatch_incoming_reliable_commands (ENetPeer * peer, ENetChannel * channel) { ENetListIterator currentCommand; diff --git a/polymer/eduke32/source/enet/src/protocol.c b/polymer/eduke32/source/enet/src/protocol.c index 21460b1b8..8e26dfb24 100644 --- a/polymer/eduke32/source/enet/src/protocol.c +++ b/polymer/eduke32/source/enet/src/protocol.c @@ -48,6 +48,7 @@ enet_protocol_dispatch_incoming_commands (ENetHost * host, ENetEvent * event) event -> type = ENET_EVENT_TYPE_CONNECT; event -> peer = peer; + event -> data = peer -> eventData; return 1; @@ -56,7 +57,7 @@ enet_protocol_dispatch_incoming_commands (ENetHost * host, ENetEvent * event) event -> type = ENET_EVENT_TYPE_DISCONNECT; event -> peer = peer; - event -> data = peer -> disconnectData; + event -> data = peer -> eventData; enet_peer_reset (peer); @@ -111,6 +112,7 @@ enet_protocol_notify_connect (ENetHost * host, ENetPeer * peer, ENetEvent * even event -> type = ENET_EVENT_TYPE_CONNECT; event -> peer = peer; + event -> data = peer -> eventData; } else enet_protocol_dispatch_state (host, peer, peer -> state == ENET_PEER_STATE_CONNECTING ? ENET_PEER_STATE_CONNECTION_SUCCEEDED : ENET_PEER_STATE_CONNECTION_PENDING); @@ -134,7 +136,11 @@ enet_protocol_notify_disconnect (ENetHost * host, ENetPeer * peer, ENetEvent * e enet_peer_reset (peer); } else + { + peer -> eventData = 0; + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + } } static void @@ -238,32 +244,13 @@ enet_protocol_remove_sent_reliable_command (ENetPeer * peer, enet_uint16 reliabl static ENetPeer * enet_protocol_handle_connect (ENetHost * host, ENetProtocolHeader * header, ENetProtocol * command) { - enet_uint16 mtu; - enet_uint32 windowSize; + enet_uint8 incomingSessionID, outgoingSessionID; + enet_uint32 mtu, windowSize; ENetChannel * channel; size_t channelCount; ENetPeer * currentPeer; ENetProtocol verifyCommand; -#ifdef USE_CRC32 - { - enet_uint32 crc = header -> checksum; - ENetBuffer buffer; - - command -> header.reliableSequenceNumber = ENET_HOST_TO_NET_16 (command -> header.reliableSequenceNumber); - - header -> checksum = command -> connect.sessionID; - - buffer.data = host -> receivedData; - buffer.dataLength = host -> receivedDataLength; - - if (enet_crc32 (& buffer, 1) != crc) - return NULL; - - command -> header.reliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> header.reliableSequenceNumber); - } -#endif - channelCount = ENET_NET_TO_HOST_32 (command -> connect.channelCount); if (channelCount < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT || @@ -277,7 +264,7 @@ enet_protocol_handle_connect (ENetHost * host, ENetProtocolHeader * header, ENet if (currentPeer -> state != ENET_PEER_STATE_DISCONNECTED && currentPeer -> address.host == host -> receivedAddress.host && currentPeer -> address.port == host -> receivedAddress.port && - currentPeer -> sessionID == command -> connect.sessionID) + currentPeer -> connectID == command -> connect.connectID) return NULL; } @@ -299,7 +286,7 @@ enet_protocol_handle_connect (ENetHost * host, ENetProtocolHeader * header, ENet return NULL; currentPeer -> channelCount = channelCount; currentPeer -> state = ENET_PEER_STATE_ACKNOWLEDGING_CONNECT; - currentPeer -> sessionID = command -> connect.sessionID; + currentPeer -> connectID = command -> connect.connectID; currentPeer -> address = host -> receivedAddress; currentPeer -> outgoingPeerID = ENET_NET_TO_HOST_16 (command -> connect.outgoingPeerID); currentPeer -> incomingBandwidth = ENET_NET_TO_HOST_32 (command -> connect.incomingBandwidth); @@ -307,6 +294,19 @@ enet_protocol_handle_connect (ENetHost * host, ENetProtocolHeader * header, ENet currentPeer -> packetThrottleInterval = ENET_NET_TO_HOST_32 (command -> connect.packetThrottleInterval); currentPeer -> packetThrottleAcceleration = ENET_NET_TO_HOST_32 (command -> connect.packetThrottleAcceleration); currentPeer -> packetThrottleDeceleration = ENET_NET_TO_HOST_32 (command -> connect.packetThrottleDeceleration); + currentPeer -> eventData = ENET_NET_TO_HOST_32 (command -> connect.data); + + incomingSessionID = command -> connect.incomingSessionID == 0xFF ? currentPeer -> outgoingSessionID : command -> connect.incomingSessionID; + incomingSessionID = (incomingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + if (incomingSessionID == currentPeer -> outgoingSessionID) + incomingSessionID = (incomingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + currentPeer -> outgoingSessionID = incomingSessionID; + + outgoingSessionID = command -> connect.outgoingSessionID == 0xFF ? currentPeer -> incomingSessionID : command -> connect.outgoingSessionID; + outgoingSessionID = (outgoingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + if (outgoingSessionID == currentPeer -> incomingSessionID) + outgoingSessionID = (outgoingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + currentPeer -> incomingSessionID = outgoingSessionID; for (channel = currentPeer -> channels; channel < & currentPeer -> channels [channelCount]; @@ -323,7 +323,7 @@ enet_protocol_handle_connect (ENetHost * host, ENetProtocolHeader * header, ENet memset (channel -> reliableWindows, 0, sizeof (channel -> reliableWindows)); } - mtu = ENET_NET_TO_HOST_16 (command -> connect.mtu); + mtu = ENET_NET_TO_HOST_32 (command -> connect.mtu); if (mtu < ENET_PROTOCOL_MINIMUM_MTU) mtu = ENET_PROTOCOL_MINIMUM_MTU; @@ -371,6 +371,8 @@ enet_protocol_handle_connect (ENetHost * host, ENetProtocolHeader * header, ENet verifyCommand.header.command = ENET_PROTOCOL_COMMAND_VERIFY_CONNECT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; verifyCommand.header.channelID = 0xFF; verifyCommand.verifyConnect.outgoingPeerID = ENET_HOST_TO_NET_16 (currentPeer -> incomingPeerID); + verifyCommand.verifyConnect.incomingSessionID = incomingSessionID; + verifyCommand.verifyConnect.outgoingSessionID = outgoingSessionID; verifyCommand.verifyConnect.mtu = ENET_HOST_TO_NET_16 (currentPeer -> mtu); verifyCommand.verifyConnect.windowSize = ENET_HOST_TO_NET_32 (windowSize); verifyCommand.verifyConnect.channelCount = ENET_HOST_TO_NET_32 (channelCount); @@ -379,6 +381,7 @@ enet_protocol_handle_connect (ENetHost * host, ENetProtocolHeader * header, ENet verifyCommand.verifyConnect.packetThrottleInterval = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleInterval); verifyCommand.verifyConnect.packetThrottleAcceleration = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleAcceleration); verifyCommand.verifyConnect.packetThrottleDeceleration = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleDeceleration); + verifyCommand.verifyConnect.connectID = currentPeer -> connectID; enet_peer_queue_outgoing_command (currentPeer, & verifyCommand, NULL, 0, 0); @@ -590,6 +593,9 @@ enet_protocol_handle_send_fragment (ENetHost * host, ENetPeer * peer, const ENet memcpy (startCommand -> packet -> data + fragmentOffset, (enet_uint8 *) command + sizeof (ENetProtocolSendFragment), fragmentLength); + + if (startCommand -> fragmentsRemaining <= 0) + enet_peer_dispatch_incoming_reliable_commands (peer, channel); } return 0; @@ -655,7 +661,9 @@ enet_protocol_handle_disconnect (ENetHost * host, ENetPeer * peer, const ENetPro else enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); - peer -> disconnectData = ENET_NET_TO_HOST_32 (command -> disconnect.data); + if (peer -> state != ENET_PEER_STATE_DISCONNECTED) + peer -> eventData = ENET_NET_TO_HOST_32 (command -> disconnect.data); + return 0; } @@ -735,7 +743,7 @@ enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer * if (enet_list_empty (& peer -> outgoingReliableCommands) && enet_list_empty (& peer -> outgoingUnreliableCommands) && enet_list_empty (& peer -> sentReliableCommands)) - enet_peer_disconnect (peer, peer -> disconnectData); + enet_peer_disconnect (peer, peer -> eventData); break; } @@ -745,8 +753,7 @@ enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer * static int enet_protocol_handle_verify_connect (ENetHost * host, ENetEvent * event, ENetPeer * peer, const ENetProtocol * command) { - enet_uint16 mtu; - enet_uint32 windowSize; + enet_uint32 mtu, windowSize; size_t channelCount; if (peer -> state != ENET_PEER_STATE_CONNECTING) @@ -757,8 +764,11 @@ enet_protocol_handle_verify_connect (ENetHost * host, ENetEvent * event, ENetPee if (channelCount < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT || channelCount > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT || ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleInterval) != peer -> packetThrottleInterval || ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleAcceleration) != peer -> packetThrottleAcceleration || - ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleDeceleration) != peer -> packetThrottleDeceleration) + ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleDeceleration) != peer -> packetThrottleDeceleration || + command -> verifyConnect.connectID != peer -> connectID) { + peer -> eventData = 0; + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); return -1; @@ -770,8 +780,10 @@ enet_protocol_handle_verify_connect (ENetHost * host, ENetEvent * event, ENetPee peer -> channelCount = channelCount; peer -> outgoingPeerID = ENET_NET_TO_HOST_16 (command -> verifyConnect.outgoingPeerID); + peer -> incomingSessionID = command -> verifyConnect.incomingSessionID; + peer -> outgoingSessionID = command -> verifyConnect.outgoingSessionID; - mtu = ENET_NET_TO_HOST_16 (command -> verifyConnect.mtu); + mtu = ENET_NET_TO_HOST_32 (command -> verifyConnect.mtu); if (mtu < ENET_PROTOCOL_MINIMUM_MTU) mtu = ENET_PROTOCOL_MINIMUM_MTU; @@ -809,15 +821,21 @@ enet_protocol_handle_incoming_commands (ENetHost * host, ENetEvent * event) enet_uint8 * currentData; size_t headerSize; enet_uint16 peerID, flags; + enet_uint8 sessionID; - if (host -> receivedDataLength < sizeof (ENetProtocolHeader)) + if (host -> receivedDataLength < (size_t) & ((ENetProtocolHeader *) 0) -> sentTime) return 0; header = (ENetProtocolHeader *) host -> receivedData; peerID = ENET_NET_TO_HOST_16 (header -> peerID); + sessionID = (peerID & ENET_PROTOCOL_HEADER_SESSION_MASK) >> ENET_PROTOCOL_HEADER_SESSION_SHIFT; flags = peerID & ENET_PROTOCOL_HEADER_FLAG_MASK; - peerID &= ~ ENET_PROTOCOL_HEADER_FLAG_MASK; + peerID &= ~ (ENET_PROTOCOL_HEADER_FLAG_MASK | ENET_PROTOCOL_HEADER_SESSION_MASK); + + headerSize = (flags & ENET_PROTOCOL_HEADER_FLAG_SENT_TIME ? sizeof (ENetProtocolHeader) : (size_t) & ((ENetProtocolHeader *) 0) -> sentTime); + if (host -> checksum != NULL) + headerSize += sizeof (enet_uint32); if (peerID == ENET_PROTOCOL_MAXIMUM_PEER_ID) peer = NULL; @@ -829,35 +847,55 @@ enet_protocol_handle_incoming_commands (ENetHost * host, ENetEvent * event) peer = & host -> peers [peerID]; if (peer -> state == ENET_PEER_STATE_DISCONNECTED || - peer -> state == ENET_PEER_STATE_ZOMBIE || + peer -> state == ENET_PEER_STATE_ZOMBIE || (host -> receivedAddress.host != peer -> address.host && - peer -> address.host != ENET_HOST_BROADCAST)) + peer -> address.host != ENET_HOST_BROADCAST) || + (peer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID && + sessionID != peer -> incomingSessionID)) return 0; + } + + if (flags & ENET_PROTOCOL_HEADER_FLAG_COMPRESSED) + { + size_t originalSize; + if (host -> compressor.context == NULL || host -> compressor.decompress == NULL) + return 0; -#ifdef USE_CRC32 - { - enet_uint32 crc = header -> checksum; - ENetBuffer buffer; + originalSize = host -> compressor.decompress (host -> compressor.context, + host -> receivedData + headerSize, + host -> receivedDataLength - headerSize, + host -> packetData [1] + headerSize, + sizeof (host -> packetData [1]) - headerSize); + if (originalSize <= 0 || originalSize > sizeof (host -> packetData [1]) - headerSize) + return 0; - header -> checksum = peer -> sessionID; + memcpy (host -> packetData [1], header, headerSize); + host -> receivedData = host -> packetData [1]; + host -> receivedDataLength = headerSize + originalSize; + } - buffer.data = host -> receivedData; - buffer.dataLength = host -> receivedDataLength; + if (host -> checksum != NULL) + { + enet_uint32 * checksum = (enet_uint32 *) & host -> receivedData [headerSize - sizeof (enet_uint32)], + desiredChecksum = * checksum; + ENetBuffer buffer; - if (enet_crc32 (& buffer, 1) != crc) - return 0; - } -#else - if (header -> checksum != peer -> sessionID) - return 0; -#endif + * checksum = peer != NULL ? peer -> connectID : 0; + buffer.data = host -> receivedData; + buffer.dataLength = host -> receivedDataLength; + + if (host -> checksum (& buffer, 1) != desiredChecksum) + return 0; + } + + if (peer != NULL) + { peer -> address.host = host -> receivedAddress.host; peer -> address.port = host -> receivedAddress.port; peer -> incomingDataTotal += host -> receivedDataLength; } - headerSize = (flags & ENET_PROTOCOL_HEADER_FLAG_SENT_TIME ? sizeof (ENetProtocolHeader) : (size_t) & ((ENetProtocolHeader *) 0) -> sentTime); currentData = host -> receivedData + headerSize; while (currentData < & host -> receivedData [host -> receivedDataLength]) @@ -990,8 +1028,8 @@ enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event) int receivedLength; ENetBuffer buffer; - buffer.data = host -> receivedData; - buffer.dataLength = sizeof (host -> receivedData); + buffer.data = host -> packetData [0]; + buffer.dataLength = sizeof (host -> packetData [0]); receivedLength = enet_socket_receive (host -> socket, & host -> receivedAddress, @@ -1004,6 +1042,7 @@ enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event) if (receivedLength == 0) return 0; + host -> receivedData = host -> packetData [0]; host -> receivedDataLength = receivedLength; host -> totalReceivedData += receivedLength; @@ -1157,7 +1196,7 @@ enet_protocol_send_unreliable_outgoing_commands (ENetHost * host, ENetPeer * pee enet_list_empty (& peer -> outgoingReliableCommands) && enet_list_empty (& peer -> outgoingUnreliableCommands) && enet_list_empty (& peer -> sentReliableCommands)) - enet_peer_disconnect (peer, peer -> disconnectData); + enet_peer_disconnect (peer, peer -> eventData); } static int @@ -1320,10 +1359,12 @@ enet_protocol_send_reliable_outgoing_commands (ENetHost * host, ENetPeer * peer) static int enet_protocol_send_outgoing_commands (ENetHost * host, ENetEvent * event, int checkForTimeouts) { - ENetProtocolHeader header; + enet_uint8 headerData [sizeof (ENetProtocolHeader) + sizeof (enet_uint32)]; + ENetProtocolHeader * header = (ENetProtocolHeader *) headerData; ENetPeer * currentPeer; int sentLength; - + size_t shouldCompress = 0; + host -> continueSending = 1; while (host -> continueSending) @@ -1402,22 +1443,57 @@ enet_protocol_send_outgoing_commands (ENetHost * host, ENetEvent * event, int ch currentPeer -> packetsLost = 0; } - header.checksum = currentPeer -> sessionID; - header.peerID = ENET_HOST_TO_NET_16 (currentPeer -> outgoingPeerID | host -> headerFlags); - - host -> buffers -> data = & header; + host -> buffers -> data = headerData; if (host -> headerFlags & ENET_PROTOCOL_HEADER_FLAG_SENT_TIME) { - header.sentTime = ENET_HOST_TO_NET_16 (host -> serviceTime & 0xFFFF); + header -> sentTime = ENET_HOST_TO_NET_16 (host -> serviceTime & 0xFFFF); host -> buffers -> dataLength = sizeof (ENetProtocolHeader); } else host -> buffers -> dataLength = (size_t) & ((ENetProtocolHeader *) 0) -> sentTime; - -#ifdef USE_CRC32 - header.checksum = enet_crc32 (host -> buffers, host -> bufferCount); + + shouldCompress = 0; + if (host -> compressor.context != NULL && host -> compressor.compress != NULL) + { + size_t originalSize = host -> packetSize - sizeof(ENetProtocolHeader), + compressedSize = host -> compressor.compress (host -> compressor.context, + & host -> buffers [1], host -> bufferCount - 1, + originalSize, + host -> packetData [1], + originalSize); + if (compressedSize > 0 && compressedSize < originalSize) + { + host -> headerFlags |= ENET_PROTOCOL_HEADER_FLAG_COMPRESSED; + shouldCompress = compressedSize; +#ifdef ENET_DEBUG_COMPRESS +#ifdef WIN32 + printf ( +#else + fprintf (stderr, #endif + "peer %u: compressed %u -> %u (%u%%)\n", currentPeer -> incomingPeerID, originalSize, compressedSize, (compressedSize * 100) / originalSize); +#endif + } + } + + if (currentPeer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID) + host -> headerFlags |= currentPeer -> outgoingSessionID << ENET_PROTOCOL_HEADER_SESSION_SHIFT; + header -> peerID = ENET_HOST_TO_NET_16 (currentPeer -> outgoingPeerID | host -> headerFlags); + if (host -> checksum != NULL) + { + enet_uint32 * checksum = (enet_uint32 *) & headerData [host -> buffers -> dataLength]; + * checksum = currentPeer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID ? currentPeer -> connectID : 0; + host -> buffers -> dataLength += sizeof (enet_uint32); + * checksum = host -> checksum (host -> buffers, host -> bufferCount); + } + + if (shouldCompress > 0) + { + host -> buffers [1].data = host -> packetData [1]; + host -> buffers [1].dataLength = shouldCompress; + host -> bufferCount = 2; + } currentPeer -> lastSendTime = host -> serviceTime; diff --git a/polymer/eduke32/source/enet/src/unix.c b/polymer/eduke32/source/enet/src/unix.c index 7bf59841d..3b072490f 100644 --- a/polymer/eduke32/source/enet/src/unix.c +++ b/polymer/eduke32/source/enet/src/unix.c @@ -30,11 +30,9 @@ #include #endif -/* sys/socket.h always has this type but never defines this as far as I can tell -#ifndef HAS_SOCKLEN_T +#ifndef __socklen_t_defined typedef int socklen_t; #endif -*/ #ifndef MSG_NOSIGNAL #define MSG_NOSIGNAL 0 diff --git a/polymer/eduke32/source/funct.h b/polymer/eduke32/source/funct.h index ff2cae7a1..4630201c0 100644 --- a/polymer/eduke32/source/funct.h +++ b/polymer/eduke32/source/funct.h @@ -40,6 +40,7 @@ extern int32_t A_PlaySound(uint32_t num,int32_t i); extern void S_StopSound(int32_t num); extern void S_StopEnvSound(int32_t num,int32_t i); extern void S_Update(void); +extern void S_Cleanup(void); extern void S_Callback(uint32_t num); extern void S_ClearSoundLocks(void); extern int32_t A_CallSound(int32_t sn,int32_t whatsprite); diff --git a/polymer/eduke32/source/function.h b/polymer/eduke32/source/function.h index 8be180ea5..ce9f79c0e 100644 --- a/polymer/eduke32/source/function.h +++ b/polymer/eduke32/source/function.h @@ -34,8 +34,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. extern "C" { #endif -#define NUMKEYENTRIES 54 -#define NUMGAMEFUNCTIONS 54 +#define NUMKEYENTRIES 56 +#define NUMGAMEFUNCTIONS 56 #define MAXGAMEFUNCLEN 32 extern char gamefunctions[NUMGAMEFUNCTIONS][MAXGAMEFUNCLEN]; @@ -96,7 +96,9 @@ enum GameFunction_t gamefunc_Next_Weapon, gamefunc_Previous_Weapon, gamefunc_Show_Console, - gamefunc_Show_DukeMatch_Scores + gamefunc_Show_DukeMatch_Scores, + gamefunc_Dpad_Select, + gamefunc_Dpad_Aiming }; #ifdef __cplusplus }; diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c index 684045c17..c8078fef4 100644 --- a/polymer/eduke32/source/game.c +++ b/polymer/eduke32/source/game.c @@ -48,6 +48,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "enet/enet.h" #include "quicklz.h" +#define ROTATESPRITE_MAX 2048 + #if KRANDDEBUG # define GAME_INLINE # define GAME_STATIC @@ -157,7 +159,10 @@ static int32_t user_quote_time[MAXUSERQUOTES]; static char user_quote[MAXUSERQUOTES][178]; // char typebuflen,typebuf[41]; -static int32_t MAXCACHE1DSIZE = (32*1048576); +// This was 32 for a while, but I think lowering it to 24 will help things like the Dingoo. +// Ideally, we would look at our memory usage on our most cramped platform and figure out +// how much of that is needed for the underlying OS and things like SDL instead of guessing +static int32_t MAXCACHE1DSIZE = (24*1048576); int32_t tempwallptr; @@ -337,7 +342,7 @@ int32_t G_PrintGameText(int32_t f, int32_t tile, int32_t x, int32_t y, const if (t == NULL) return -1; - if (o & 256) + if (o & ROTATESPRITE_MAX) { widthx = 320<<16; shift = 0; @@ -379,7 +384,7 @@ int32_t G_PrintGameText(int32_t f, int32_t tile, int32_t x, int32_t y, const x = (f & 4) ? (xres>>1)-textsc(newx>>1) : - (widthx>>1)-((o & 256)?newx<<15:newx>>1); + (widthx>>1)-((o & ROTATESPRITE_MAX)?newx<<15:newx>>1); } ox = x; @@ -419,7 +424,7 @@ int32_t G_PrintGameText(int32_t f, int32_t tile, int32_t x, int32_t y, const if (ac < tile || ac > (tile + 93)) break; - if (o&256) + if (o&ROTATESPRITE_MAX) { ox = x += (x-ox)<<16; oy = y += (y-oy)<<16; @@ -439,7 +444,7 @@ int32_t G_PrintGameText(int32_t f, int32_t tile, int32_t x, int32_t y, const if ((*t >= '0' && *t <= '9')) x -= i - ((8 * z)>>16); - if ((o&256) == 0) // wrapping long strings doesn't work for precise coordinates due to overflow + if ((o&ROTATESPRITE_MAX) == 0) // wrapping long strings doesn't work for precise coordinates due to overflow { if (((f&4) ? textsc(x) : x) > (ud.config.ScreenWidth - USERQUOTE_RIGHTOFFSET)) x = origx, y += (8 * z)>>16; @@ -487,8 +492,8 @@ int32_t minitext_(int32_t x,int32_t y,const char *t,int32_t s,int32_t p,int32_t int32_t ac; char ch, cmode; - cmode = (sb&256)!=0; - sb &= 255; + cmode = (sb&ROTATESPRITE_MAX)!=0; + sb &= ROTATESPRITE_MAX-1; do { @@ -594,7 +599,7 @@ void Net_Connect(const char * srvaddr) Net_Disconnect(); - g_netClient = enet_host_create(NULL, 1, 0, 0); + g_netClient = enet_host_create(NULL, 1, CHAN_MAX, 0, 0); if (g_netClient == NULL) { @@ -606,7 +611,7 @@ void Net_Connect(const char * srvaddr) enet_address_set_host(&address, addrstr); address.port = atoi((addrstr = strtok(NULL, ":")) == NULL ? "23513" : addrstr); - g_netClientPeer = enet_host_connect(g_netClient, &address, CHAN_MAX); + g_netClientPeer = enet_host_connect(g_netClient, &address, CHAN_MAX, 0); if (g_netClientPeer == NULL) { @@ -1757,6 +1762,7 @@ void Net_GetPackets(void) { sampletimer(); MUSIC_Update(); + S_Update(); G_HandleSpecialKeys(); @@ -2292,7 +2298,8 @@ void G_DrawTile(int32_t x, int32_t y, int32_t tilenum, int32_t shade, int32_t or if (orientation&4) a = 1024; - rotatesprite((orientation&256)?x:(x<<16),(orientation&256)?y:(y<<16),65536L,a,tilenum,shade,p,2|orientation,windowx1,windowy1,windowx2,windowy2); + rotatesprite((orientation&ROTATESPRITE_MAX)?x:(x<<16),(orientation&ROTATESPRITE_MAX)?y:(y<<16), + 65536L,a,tilenum,shade,p,2|orientation,windowx1,windowy1,windowx2,windowy2); } void G_DrawTilePal(int32_t x, int32_t y, int32_t tilenum, int32_t shade, int32_t orientation, int32_t p) @@ -2302,7 +2309,8 @@ void G_DrawTilePal(int32_t x, int32_t y, int32_t tilenum, int32_t shade, int32_t if (orientation&4) a = 1024; - rotatesprite((orientation&256)?x:(x<<16),(orientation&256)?y:(y<<16),65536L,a,tilenum,shade,p,2|orientation,windowx1,windowy1,windowx2,windowy2); + rotatesprite((orientation&ROTATESPRITE_MAX)?x:(x<<16),(orientation&ROTATESPRITE_MAX)?y:(y<<16), + 65536L,a,tilenum,shade,p,2|orientation,windowx1,windowy1,windowx2,windowy2); } void G_DrawTileSmall(int32_t x, int32_t y, int32_t tilenum, int32_t shade, int32_t orientation) @@ -2312,7 +2320,8 @@ void G_DrawTileSmall(int32_t x, int32_t y, int32_t tilenum, int32_t shade, int32 if (orientation&4) a = 1024; - rotatesprite((orientation&256)?x:(x<<16),(orientation&256)?y:(y<<16),32768L,a,tilenum,shade,p,2|orientation,windowx1,windowy1,windowx2,windowy2); + rotatesprite((orientation&ROTATESPRITE_MAX)?x:(x<<16),(orientation&ROTATESPRITE_MAX)?y:(y<<16), + 32768L,a,tilenum,shade,p,2|orientation,windowx1,windowy1,windowx2,windowy2); } void G_DrawTilePalSmall(int32_t x, int32_t y, int32_t tilenum, int32_t shade, int32_t orientation, int32_t p) @@ -2322,14 +2331,15 @@ void G_DrawTilePalSmall(int32_t x, int32_t y, int32_t tilenum, int32_t shade, in if (orientation&4) a = 1024; - rotatesprite((orientation&256)?x:(x<<16),(orientation&256)?y:(y<<16),32768L,a,tilenum,shade,p,2|orientation,windowx1,windowy1,windowx2,windowy2); + rotatesprite((orientation&ROTATESPRITE_MAX)?x:(x<<16),(orientation&ROTATESPRITE_MAX)?y:(y<<16), + 32768L,a,tilenum,shade,p,2|orientation,windowx1,windowy1,windowx2,windowy2); } #define POLYMOSTTRANS (1) #define POLYMOSTTRANS2 (1|32) // draws inventory numbers in the HUD for both the full and mini status bars -static void G_DrawInvNum(int32_t x,int32_t y,char num1,char ha,char sbits) +static void G_DrawInvNum(int32_t x,int32_t y,char num1,char ha,int32_t sbits) { char dabuf[80] = {0}; int32_t shd = (x < 0); @@ -2366,7 +2376,7 @@ static void G_DrawInvNum(int32_t x,int32_t y,char num1,char ha,char sbits) rotatesprite(sbarx(x+4),sbary(y),sbarsc(65536L),0,THREEBYFIVE+dabuf[0]-'0',ha,0,sbits,0,0,xdim-1,ydim-1); } -static void G_DrawWeapNum(int16_t ind,int32_t x,int32_t y,int32_t num1, int32_t num2,char ha) +static void G_DrawWeapNum(int16_t ind,int32_t x,int32_t y,int32_t num1, int32_t num2,int32_t ha) { char dabuf[80] = {0}; @@ -2375,7 +2385,7 @@ static void G_DrawWeapNum(int16_t ind,int32_t x,int32_t y,int32_t num1, int32_t if (VOLUMEONE && (ind > HANDBOMB_WEAPON || ind < 0)) { - minitextshade(x+1,y-4,"ORDER",20,11,2+8+16+256); + minitextshade(x+1,y-4,"ORDER",20,11,2+8+16+ROTATESPRITE_MAX); return; } @@ -2529,7 +2539,7 @@ static void G_DrawWeapAmounts(DukePlayer_t *p,int32_t x,int32_t y,int32_t u) } } -static void G_DrawDigiNum(int32_t x,int32_t y,int32_t n,char s,char cs) +static void G_DrawDigiNum(int32_t x,int32_t y,int32_t n,char s,int32_t cs) { int32_t i, j = 0, k, p, c; char b[10]; @@ -2553,11 +2563,12 @@ static void G_DrawDigiNum(int32_t x,int32_t y,int32_t n,char s,char cs) } } -void G_DrawTXDigiNumZ(int32_t starttile, int32_t x,int32_t y,int32_t n,int32_t s,int32_t pal,int32_t cs,int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t z) +void G_DrawTXDigiNumZ(int32_t starttile, int32_t x,int32_t y,int32_t n,int32_t s,int32_t pal, + int32_t cs,int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t z) { int32_t i, j = 0, k, p, c; char b[10]; - int32_t shift = (cs&256)?0:16; + int32_t shift = (cs&ROTATESPRITE_MAX)?0:16; //ltoa(n,b,10); Bsnprintf(b,10,"%d",n); @@ -2568,7 +2579,7 @@ void G_DrawTXDigiNumZ(int32_t starttile, int32_t x,int32_t y,int32_t n,int32_t s p = starttile+*(b+k)-'0'; j += (1+tilesizx[p]*z)>>16; } - if (cs&256) j<<=16; + if (cs&ROTATESPRITE_MAX) j<<=16; c = x-(j>>1); j = 0; @@ -2576,11 +2587,11 @@ void G_DrawTXDigiNumZ(int32_t starttile, int32_t x,int32_t y,int32_t n,int32_t s { p = starttile+*(b+k)-'0'; rotatesprite((c+j)<>((cs&256)?0:16)); + j += ((1+tilesizx[p]*z)>>((cs&ROTATESPRITE_MAX)?0:16)); } } -static void G_DrawAltDigiNum(int32_t x,int32_t y,int32_t n,char s,char cs) +static void G_DrawAltDigiNum(int32_t x,int32_t y,int32_t n,char s,int32_t cs) { int32_t i, j = 0, k, p, c; char b[10]; @@ -2762,51 +2773,52 @@ static void G_DrawStatusBar(int32_t snum) // rotatesprite(sbarx(5+1),sbary(200-25+1),sbarsc(49152L),0,SIXPAK,0,4,10+16+1+32,0,0,xdim-1,ydim-1); // rotatesprite(sbarx(5),sbary(200-25),sbarsc(49152L),0,SIXPAK,0,0,10+16,0,0,xdim-1,ydim-1); if (getrendermode() >= 3 && althud_shadows) - rotatesprite(sbarx(2+1),sbary(200-21+1),sbarsc(49152L),0,COLA,0,4,10+16+POLYMOSTTRANS2,0,0,xdim-1,ydim-1); - rotatesprite(sbarx(2),sbary(200-21),sbarsc(49152L),0,COLA,0,0,10+16,0,0,xdim-1,ydim-1); + rotatesprite(sbarx(2+1),sbary(200-21+1),sbarsc(49152L),0,COLA,0,4,10+16+256+POLYMOSTTRANS2,0,0,xdim-1,ydim-1); + rotatesprite(sbarx(2),sbary(200-21),sbarsc(49152L),0,COLA,0,0,10+16+256,0,0,xdim-1,ydim-1); if (sprite[p->i].pal == 1 && p->last_extra < 2) - G_DrawAltDigiNum(40,-(200-22),1,-16,10+16); + G_DrawAltDigiNum(40,-(200-22),1,-16,10+16+256); else if (!althud_flashing || p->last_extra > (p->max_player_health>>2) || totalclock&32) { int32_t s = -8; if (althud_flashing && p->last_extra > p->max_player_health) s += (sintable[(totalclock<<5)&2047]>>10); - G_DrawAltDigiNum(40,-(200-22),p->last_extra,s,10+16); + G_DrawAltDigiNum(40,-(200-22),p->last_extra,s,10+16+256); } if (getrendermode() >= 3 && althud_shadows) - rotatesprite(sbarx(62+1),sbary(200-25+1),sbarsc(49152L),0,SHIELD,0,4,10+16+POLYMOSTTRANS2,0,0,xdim-1,ydim-1); - rotatesprite(sbarx(62),sbary(200-25),sbarsc(49152L),0,SHIELD,0,0,10+16,0,0,xdim-1,ydim-1); + rotatesprite(sbarx(62+1),sbary(200-25+1),sbarsc(49152L),0,SHIELD,0,4,10+16+POLYMOSTTRANS2+256,0,0,xdim-1,ydim-1); + rotatesprite(sbarx(62),sbary(200-25),sbarsc(49152L),0,SHIELD,0,0,10+16+256,0,0,xdim-1,ydim-1); { int32_t lAmount=Gv_GetVarByLabel("PLR_MORALE",-1, p->i, snum); if (lAmount == -1) lAmount = p->inv_amount[GET_SHIELD]; - G_DrawAltDigiNum(105,-(200-22),lAmount,-16,10+16); + G_DrawAltDigiNum(105,-(200-22),lAmount,-16,10+16+256); } if (getrendermode() >= 3 && althud_shadows) { - if (p->got_access&1) rotatesprite(sbarxr(39-1),sbary(200-43+1),sbarsc(32768),0,ACCESSCARD,0,4,10+16+POLYMOSTTRANS2,0,0,xdim-1,ydim-1); - if (p->got_access&4) rotatesprite(sbarxr(34-1),sbary(200-41+1),sbarsc(32768),0,ACCESSCARD,0,4,10+16+POLYMOSTTRANS2,0,0,xdim-1,ydim-1); - if (p->got_access&2) rotatesprite(sbarxr(29-1),sbary(200-39+1),sbarsc(32768),0,ACCESSCARD,0,4,10+16+POLYMOSTTRANS2,0,0,xdim-1,ydim-1); + if (p->got_access&1) rotatesprite(sbarxr(39-1),sbary(200-43+1),sbarsc(32768),0,ACCESSCARD,0,4,10+16+POLYMOSTTRANS2+512,0,0,xdim-1,ydim-1); + if (p->got_access&4) rotatesprite(sbarxr(34-1),sbary(200-41+1),sbarsc(32768),0,ACCESSCARD,0,4,10+16+POLYMOSTTRANS2+512,0,0,xdim-1,ydim-1); + if (p->got_access&2) rotatesprite(sbarxr(29-1),sbary(200-39+1),sbarsc(32768),0,ACCESSCARD,0,4,10+16+POLYMOSTTRANS2+512,0,0,xdim-1,ydim-1); } - if (p->got_access&1) rotatesprite(sbarxr(39),sbary(200-43),sbarsc(32768),0,ACCESSCARD,0,0,10+16,0,0,xdim-1,ydim-1); - if (p->got_access&4) rotatesprite(sbarxr(34),sbary(200-41),sbarsc(32768),0,ACCESSCARD,0,23,10+16,0,0,xdim-1,ydim-1); - if (p->got_access&2) rotatesprite(sbarxr(29),sbary(200-39),sbarsc(32768),0,ACCESSCARD,0,21,10+16,0,0,xdim-1,ydim-1); + if (p->got_access&1) rotatesprite(sbarxr(39),sbary(200-43),sbarsc(32768),0,ACCESSCARD,0,0,10+16+512,0,0,xdim-1,ydim-1); + if (p->got_access&4) rotatesprite(sbarxr(34),sbary(200-41),sbarsc(32768),0,ACCESSCARD,0,23,10+16+512,0,0,xdim-1,ydim-1); + if (p->got_access&2) rotatesprite(sbarxr(29),sbary(200-39),sbarsc(32768),0,ACCESSCARD,0,21,10+16+512,0,0,xdim-1,ydim-1); + + i = (p->curr_weapon == PISTOL_WEAPON) ? 16384 : 32768; - i = 32768; - if (p->curr_weapon == PISTOL_WEAPON) i = 16384; if (getrendermode() >= 3 && althud_shadows) - rotatesprite(sbarxr(57-1),sbary(200-15+1),sbarsc(i),0,ammo_sprites[p->curr_weapon],0,4,2+POLYMOSTTRANS2,0,0,xdim-1,ydim-1); - rotatesprite(sbarxr(57),sbary(200-15),sbarsc(i),0,ammo_sprites[p->curr_weapon],0,0,2,0,0,xdim-1,ydim-1); + rotatesprite(sbarxr(57-1),sbary(200-15+1),sbarsc(i),0,ammo_sprites[p->curr_weapon],0,4,10+POLYMOSTTRANS2+512,0,0,xdim-1,ydim-1); + rotatesprite(sbarxr(57),sbary(200-15),sbarsc(i),0,ammo_sprites[p->curr_weapon],0,0,10+512,0,0,xdim-1,ydim-1); if (p->curr_weapon == HANDREMOTE_WEAPON) i = HANDBOMB_WEAPON; else i = p->curr_weapon; + if (p->curr_weapon != KNEE_WEAPON && (!althud_flashing || totalclock&32 || p->ammo_amount[i] > (p->max_ammo_amount[i]/10))) - G_DrawAltDigiNum(-20,-(200-22),p->ammo_amount[i],-16,10+16); + G_DrawAltDigiNum(-20,-(200-22),p->ammo_amount[i],-16,10+16+512); o = 102; permbit = 0; @@ -2842,13 +2854,13 @@ static void G_DrawStatusBar(int32_t snum) if (i >= 0) { if (getrendermode() >= 3 && althud_shadows) - rotatesprite(sbarx(231-o+1),sbary(200-21-2+1),sbarsc(65536L),0,i,0,4,10+16+permbit+POLYMOSTTRANS2,0,0,xdim-1,ydim-1); - rotatesprite(sbarx(231-o),sbary(200-21-2),sbarsc(65536L),0,i,0,0,10+16+permbit,0,0,xdim-1,ydim-1); + rotatesprite(sbarx(231-o+1),sbary(200-21-2+1),sbarsc(65536L),0,i,0,4,10+16+permbit+POLYMOSTTRANS2+256,0,0,xdim-1,ydim-1); + rotatesprite(sbarx(231-o),sbary(200-21-2),sbarsc(65536L),0,i,0,0,10+16+permbit+256,0,0,xdim-1,ydim-1); } if (getrendermode() >= 3 && althud_shadows) - minitext(292-30-o+1,190-3+1,"%",4,POLYMOSTTRANS+10+16+permbit + 256); - minitext(292-30-o,190-3,"%",6,10+16+permbit + 256); + minitext(292-30-o+1,190-3+1,"%",4,POLYMOSTTRANS+10+16+permbit+256 + ROTATESPRITE_MAX); + minitext(292-30-o,190-3,"%",6,10+16+permbit+256 + ROTATESPRITE_MAX); j = 0x80000000; switch (p->inven_icon) @@ -2878,42 +2890,43 @@ static void G_DrawStatusBar(int32_t snum) i = (p->inv_amount[GET_BOOTS]>>1); break; } - G_DrawInvNum(-(284-30-o),200-6-3,(uint8_t)i,0,10+permbit); + G_DrawInvNum(-(284-30-o),200-6-3,(uint8_t)i,0,10+permbit+256); if (j > 0) { if (getrendermode() >= 3 && althud_shadows) - minitext(288-30-o+1,180-3+1,"ON",4,POLYMOSTTRANS+10+16+permbit + 256); - minitext(288-30-o,180-3,"ON",0,10+16+permbit + 256); + minitext(288-30-o+1,180-3+1,"ON",4,POLYMOSTTRANS+10+16+permbit+256 + ROTATESPRITE_MAX); + minitext(288-30-o,180-3,"ON",0,10+16+permbit+256 + ROTATESPRITE_MAX); } else if ((uint32_t)j != 0x80000000) { if (getrendermode() >= 3 && althud_shadows) - minitext(284-30-o+1,180-3+1,"OFF",4,POLYMOSTTRANS+10+16+permbit + 256); - minitext(284-30-o,180-3,"OFF",2,10+16+permbit + 256); + minitext(284-30-o+1,180-3+1,"OFF",4,POLYMOSTTRANS+10+16+permbit+256 + ROTATESPRITE_MAX); + minitext(284-30-o,180-3,"OFF",2,10+16+permbit+256 + ROTATESPRITE_MAX); } if (p->inven_icon >= 6) { if (getrendermode() >= 3 && althud_shadows) - minitext(284-35-o+1,180-3+1,"AUTO",4,POLYMOSTTRANS+10+16+permbit + 256); - minitext(284-35-o,180-3,"AUTO",2,10+16+permbit + 256); + minitext(284-35-o+1,180-3+1,"AUTO",4,POLYMOSTTRANS+10+16+permbit+256 + ROTATESPRITE_MAX); + minitext(284-35-o,180-3,"AUTO",2,10+16+permbit+256 + ROTATESPRITE_MAX); } } return; } - rotatesprite(sbarx(5),sbary(200-28),sbarsc(65536L),0,HEALTHBOX,0,21,10+16,0,0,xdim-1,ydim-1); + + rotatesprite(sbarx(5),sbary(200-28),sbarsc(65536L),0,HEALTHBOX,0,21,10+16+256,0,0,xdim-1,ydim-1); if (p->inven_icon) - rotatesprite(sbarx(69),sbary(200-30),sbarsc(65536L),0,INVENTORYBOX,0,21,10+16,0,0,xdim-1,ydim-1); + rotatesprite(sbarx(69),sbary(200-30),sbarsc(65536L),0,INVENTORYBOX,0,21,10+16+256,0,0,xdim-1,ydim-1); if (sprite[p->i].pal == 1 && p->last_extra < 2) // frozen - G_DrawDigiNum(20,200-17,1,-16,10+16); - else G_DrawDigiNum(20,200-17,p->last_extra,-16,10+16); + G_DrawDigiNum(20,200-17,1,-16,10+16+256); + else G_DrawDigiNum(20,200-17,p->last_extra,-16,10+16+256); - rotatesprite(sbarx(37),sbary(200-28),sbarsc(65536L),0,AMMOBOX,0,21,10+16,0,0,xdim-1,ydim-1); + rotatesprite(sbarx(37),sbary(200-28),sbarsc(65536L),0,AMMOBOX,0,21,10+16+256,0,0,xdim-1,ydim-1); if (p->curr_weapon == HANDREMOTE_WEAPON) i = HANDBOMB_WEAPON; else i = p->curr_weapon; - G_DrawDigiNum(53,200-17,p->ammo_amount[i],-16,10+16); + G_DrawDigiNum(53,200-17,p->ammo_amount[i],-16,10+16+256); o = 158; permbit = 0; @@ -2945,9 +2958,9 @@ static void G_DrawStatusBar(int32_t snum) default: i = -1; } - if (i >= 0) rotatesprite(sbarx(231-o),sbary(200-21),sbarsc(65536L),0,i,0,0,10+16+permbit,0,0,xdim-1,ydim-1); + if (i >= 0) rotatesprite(sbarx(231-o),sbary(200-21),sbarsc(65536L),0,i,0,0,10+16+permbit+256,0,0,xdim-1,ydim-1); - minitext(292-30-o,190,"%",6,10+16+permbit + 256); + minitext(292-30-o,190,"%",6,10+16+permbit+256 + ROTATESPRITE_MAX); j = 0x80000000; switch (p->inven_icon) @@ -2977,10 +2990,10 @@ static void G_DrawStatusBar(int32_t snum) i = (p->inv_amount[GET_BOOTS]>>1); break; } - G_DrawInvNum(284-30-o,200-6,(uint8_t)i,0,10+permbit); - if (j > 0) minitext(288-30-o,180,"ON",0,10+16+permbit + 256); - else if ((uint32_t)j != 0x80000000) minitext(284-30-o,180,"OFF",2,10+16+permbit + 256); - if (p->inven_icon >= 6) minitext(284-35-o,180,"AUTO",2,10+16+permbit + 256); + G_DrawInvNum(284-30-o,200-6,(uint8_t)i,0,10+permbit+256); + if (j > 0) minitext(288-30-o,180,"ON",0,10+16+permbit+256 + ROTATESPRITE_MAX); + else if ((uint32_t)j != 0x80000000) minitext(284-30-o,180,"OFF",2,10+16+permbit+256 + ROTATESPRITE_MAX); + if (p->inven_icon >= 6) minitext(284-35-o,180,"AUTO",2,10+16+permbit+256 + ROTATESPRITE_MAX); } return; } @@ -3235,8 +3248,8 @@ static void G_DrawStatusBar(int32_t snum) break; } rotatesprite(sbarx(231-o),sbary(SBY+13),sbarsc(65536L),0,i,0,0,10+16+permbit,0,0,xdim-1,ydim-1); - minitext(292-30-o,SBY+24,"%",6,10+16+permbit + 256); - if (p->inven_icon >= 6) minitext(284-35-o,SBY+14,"AUTO",2,10+16+permbit + 256); + minitext(292-30-o,SBY+24,"%",6,10+16+permbit + ROTATESPRITE_MAX); + if (p->inven_icon >= 6) minitext(284-35-o,SBY+14,"AUTO",2,10+16+permbit + ROTATESPRITE_MAX); } if (u&(2048+4096)) { @@ -3254,8 +3267,8 @@ static void G_DrawStatusBar(int32_t snum) default: j = 0x80000000; } - if (j > 0) minitext(288-30-o,SBY+14,"ON",0,10+16+permbit + 256); - else if ((uint32_t)j != 0x80000000) minitext(284-30-o,SBY+14,"OFF",2,10+16+permbit + 256); + if (j > 0) minitext(288-30-o,SBY+14,"ON",0,10+16+permbit + ROTATESPRITE_MAX); + else if ((uint32_t)j != 0x80000000) minitext(284-30-o,SBY+14,"OFF",2,10+16+permbit + ROTATESPRITE_MAX); } if (u&8192) { @@ -3551,7 +3564,7 @@ void fadepaltile(int32_t r, int32_t g, int32_t b, int32_t start, int32_t end, in KB_ClearKeyDown(sc_Space); return; } - rotatesprite(0,0,65536L,0,tile,0,0,2+8+16, 0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,tile,0,0,2+8+16+(ud.bgstretch?1024:0), 0,0,xdim-1,ydim-1); G_FadePalette(r,g,b,start); } } @@ -3562,7 +3575,7 @@ void fadepaltile(int32_t r, int32_t g, int32_t b, int32_t start, int32_t end, in KB_ClearKeyDown(sc_Space); return; } - rotatesprite(0,0,65536L,0,tile,0,0,2+8+16, 0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,tile,0,0,2+8+16+(ud.bgstretch?1024:0), 0,0,xdim-1,ydim-1); G_FadePalette(r,g,b,start); } } @@ -3582,7 +3595,7 @@ static void G_DisplayExtraScreens(void) P_SetGamePalette(g_player[myconnectindex].ps, palette, 1); // JBF 20040308 fadepal(0,0,0, 0,64,7); KB_FlushKeyboardQueue(); - rotatesprite(0,0,65536L,0,3291,0,0,2+8+16+64, 0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,3291,0,0,2+8+16+64+(ud.bgstretch?1024:0), 0,0,xdim-1,ydim-1); fadepaltile(0,0,0, 63,0,-7, 3291); while (!KB_KeyWaiting()) { @@ -3592,7 +3605,7 @@ static void G_DisplayExtraScreens(void) fadepaltile(0,0,0, 0,64,7, 3291); KB_FlushKeyboardQueue(); - rotatesprite(0,0,65536L,0,3290,0,0,2+8+16+64, 0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,3290,0,0,2+8+16+64+(ud.bgstretch?1024:0), 0,0,xdim-1,ydim-1); fadepaltile(0,0,0, 63,0,-7,3290); while (!KB_KeyWaiting()) { @@ -3609,7 +3622,7 @@ static void G_DisplayExtraScreens(void) P_SetGamePalette(g_player[myconnectindex].ps, palette, 1); // JBF 20040308 fadepal(0,0,0, 0,64,7); KB_FlushKeyboardQueue(); - rotatesprite(0,0,65536L,0,TENSCREEN,0,0,2+8+16+64, 0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,TENSCREEN,0,0,2+8+16+64+(ud.bgstretch?1024:0), 0,0,xdim-1,ydim-1); fadepaltile(0,0,0, 63,0,-7,TENSCREEN); while (!KB_KeyWaiting() && totalclock < 2400) { @@ -3930,6 +3943,11 @@ static void G_DrawOverheadMap(int32_t cposx, int32_t cposy, int32_t czoom, int16 char col; walltype *wal, *wal2; spritetype *spr; + int32_t oydim=ydim; + + ydim = (int32_t)((double)xdim * 0.625f); + setaspect(65536L,(int32_t)divscale16(ydim*320L,xdim*200L)); + ydim = oydim; xvect = sintable[(-cang)&2047] * czoom; yvect = sintable[(1536-cang)&2047] * czoom; @@ -4170,6 +4188,8 @@ static void G_DrawOverheadMap(int32_t cposx, int32_t cposy, int32_t czoom, int16 } } + setaspect(65536L,(int32_t)divscale16(ydim*320L,xdim*200L)); + TRAVERSE_CONNECT(p) { if (ud.scrollmode && p == screenpeek) continue; @@ -4201,7 +4221,7 @@ static void G_DrawOverheadMap(int32_t cposx, int32_t cposy, int32_t czoom, int16 rotatesprite((x1<<4)+(xdim<<15),(y1<<4)+(ydim<<15),j,daang,i,sprite[g_player[p].ps->i].shade, (g_player[p].ps->cursectnum > -1)?sector[g_player[p].ps->cursectnum].floorpal:0, - (sprite[g_player[p].ps->i].cstat&2)>>1,windowx1,windowy1,windowx2,windowy2); + 0,windowx1,windowy1,windowx2,windowy2); } } } @@ -4493,8 +4513,8 @@ void G_DisplayRest(int32_t smoothratio) { if (ud.screen_size > 0) a = 147; else a = 179; - minitext(5,a+6,EpisodeNames[ud.volume_number],0,2+8+16); - minitext(5,a+6+6,MapInfo[ud.volume_number*MAXLEVELS + ud.level_number].name,0,2+8+16); + minitext(5,a+6,EpisodeNames[ud.volume_number],0,2+8+16+256); + minitext(5,a+6+6,MapInfo[ud.volume_number*MAXLEVELS + ud.level_number].name,0,2+8+16+256); } } } @@ -4783,7 +4803,7 @@ void G_DrawBackground(void) for (x=0; x= 8 && ud.statusbarmode == 0) + if (ud.screen_size >= 8 && ud.statusbarmode == 0) { /* y1 = y2; @@ -4827,7 +4847,7 @@ void G_DrawBackground(void) } */ // when not rendering a game, fullscreen wipe - x2 = (xdim - scale(xdim,ud.statusbarscale,100)) >> 1; + x2 = (xdim - scale((int32_t)(ydim*1.333333333333333333f),ud.statusbarscale,100)) >> 1; for (y=y2-y2%tilesizy[dapicnum]; y>1; x+=tilesizx[dapicnum]) { @@ -5071,7 +5091,7 @@ void G_DrawRooms(int32_t snum, int32_t smoothratio) else { i = divscale22(1,sprite[p->i].yrepeat+28); - if (i != oyrepeat) +// if (i != oyrepeat) { oyrepeat = i; setaspect(oyrepeat,yxaspect); @@ -9208,9 +9228,23 @@ GAME_STATIC void G_HandleLocalKeys(void) inputloc = 0; } - if (KB_UnBoundKeyPressed(sc_F1) || (ud.show_help && (KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || MOUSE_GetButtons()&LEFT_MOUSE))) + if (KB_UnBoundKeyPressed(sc_F1)/* || (ud.show_help && (KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || MOUSE_GetButtons()&LEFT_MOUSE))*/) { KB_ClearKeyDown(sc_F1); + ChangeToMenu(400); + FX_StopAllSounds(); + S_ClearSoundLocks(); + + g_player[myconnectindex].ps->gm |= MODE_MENU; + + if ((!g_netServer && ud.multimode < 2)) + { + ready2send = 0; + totalclock = ototalclock; + screenpeek = myconnectindex; + } + +/* KB_ClearKeyDown(sc_Space); KB_ClearKeyDown(sc_kpad_Enter); KB_ClearKeyDown(sc_Enter); @@ -9232,6 +9266,7 @@ GAME_STATIC void G_HandleLocalKeys(void) totalclock = ototalclock; } } +*/ } // if((!net_server && ud.multimode < 2)) @@ -10081,7 +10116,7 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) address.host = ENET_HOST_ANY; address.port = g_netPort; - g_netServer = enet_host_create(&address, MAXPLAYERS, 0, 0); + g_netServer = enet_host_create(&address, MAXPLAYERS, CHAN_MAX, 0, 0); if (g_netServer == NULL) initprintf("An error occurred while trying to create an ENet server host.\n"); @@ -10480,13 +10515,13 @@ static void G_DisplayLogo(void) P_SetGamePalette(g_player[myconnectindex].ps, drealms, 11); // JBF 20040308 fadepal(0,0,0, 0,64,7); flushperms(); - rotatesprite(0,0,65536L,0,DREALMS,0,0,2+8+16, 0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,DREALMS,0,0,2+8+16+(ud.bgstretch?1024:0), 0,0,xdim-1,ydim-1); nextpage(); fadepaltile(0,0,0, 63,0,-7,DREALMS); totalclock = 0; while (totalclock < (120*7) && !KB_KeyWaiting() && !MOUSE_GetButtons()&LEFT_MOUSE && !BUTTON(gamefunc_Fire) && !BUTTON(gamefunc_Open)) { - rotatesprite(0,0,65536L,0,DREALMS,0,0,2+8+16+64, 0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,DREALMS,0,0,2+8+16+64+(ud.bgstretch?1024:0), 0,0,xdim-1,ydim-1); handleevents(); Net_GetPackets(); if (g_restorePalette) @@ -10517,7 +10552,7 @@ static void G_DisplayLogo(void) while (totalclock < (860+120) && !KB_KeyWaiting() && !MOUSE_GetButtons()&LEFT_MOUSE && !BUTTON(gamefunc_Fire) && !BUTTON(gamefunc_Open)) { - rotatesprite(0,0,65536L,0,BETASCREEN,0,0,2+8+16+64,0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,BETASCREEN,0,0,2+8+16+64+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); if (logoflags & LOGO_DUKENUKEM) { if (totalclock > 120 && totalclock < (120+60)) @@ -11084,7 +11119,7 @@ void app_main(int32_t argc,const char **argv) int32_t i = 0, j; char cwd[BMAX_PATH]; // extern char datetimestring[]; - ENetCallbacks callbacks = { Bmalloc, Bfree, NULL, NULL }; + ENetCallbacks callbacks = { Bmalloc, Bfree, NULL }; #ifdef RENDERTYPEWIN if (argc > 1) @@ -11714,7 +11749,7 @@ CLEAN_DIRECTORY: //g_player[myconnectindex].ps->palette = palette; //G_FadePalette(0,0,0,0); P_SetGamePalette(g_player[myconnectindex].ps, palette, 0); // JBF 20040308 - rotatesprite(320<<15,200<<15,65536L,0,LOADSCREEN,0,0,2+8+64,0,0,xdim-1,ydim-1); + rotatesprite(320<<15,200<<15,65536L,0,LOADSCREEN,0,0,2+8+64+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); menutext(160,105,0,0,"LOADING SAVED GAME..."); nextpage(); @@ -11909,7 +11944,6 @@ MAIN_LOOP_RESTART: G_DisplayRest(i); if (getrendermode() >= 3) G_DrawBackground(); - S_Update(); framewaiting++; } @@ -12764,7 +12798,7 @@ static void G_DoOrderScreen(void) //g_player[myconnectindex].ps->palette = palette; P_SetGamePalette(g_player[myconnectindex].ps, palette, 1); // JBF 20040308 KB_FlushKeyboardQueue(); - rotatesprite(0,0,65536L,0,ORDERING,0,0,2+8+16+64, 0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,ORDERING,0,0,2+8+16+64+(ud.bgstretch?1024:0), 0,0,xdim-1,ydim-1); fadepal(0,0,0, 63,0,-7); while (!KB_KeyWaiting()) { @@ -12774,7 +12808,7 @@ static void G_DoOrderScreen(void) fadepal(0,0,0, 0,63,7); KB_FlushKeyboardQueue(); - rotatesprite(0,0,65536L,0,ORDERING+1,0,0,2+8+16+64, 0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,ORDERING+1,0,0,2+8+16+64+(ud.bgstretch?1024:0), 0,0,xdim-1,ydim-1); fadepal(0,0,0, 63,0,-7); while (!KB_KeyWaiting()) { @@ -12784,7 +12818,7 @@ static void G_DoOrderScreen(void) fadepal(0,0,0, 0,63,7); KB_FlushKeyboardQueue(); - rotatesprite(0,0,65536L,0,ORDERING+2,0,0,2+8+16+64, 0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,ORDERING+2,0,0,2+8+16+64+(ud.bgstretch?1024:0), 0,0,xdim-1,ydim-1); fadepal(0,0,0, 63,0,-7); while (!KB_KeyWaiting()) { @@ -12794,7 +12828,7 @@ static void G_DoOrderScreen(void) fadepal(0,0,0, 0,63,7); KB_FlushKeyboardQueue(); - rotatesprite(0,0,65536L,0,ORDERING+3,0,0,2+8+16+64, 0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,ORDERING+3,0,0,2+8+16+64+(ud.bgstretch?1024:0), 0,0,xdim-1,ydim-1); fadepal(0,0,0, 63,0,-7); while (!KB_KeyWaiting()) { @@ -12839,7 +12873,12 @@ void G_BonusScreen(int32_t bonusonly) if (!lastmapname) lastmapname = Bstrrchr(boardfilename,'/'); if (!lastmapname) lastmapname = boardfilename; } - else lastmapname = MapInfo[(ud.volume_number*MAXLEVELS)+ud.last_level-1].name; + else + { + lastmapname = MapInfo[(ud.volume_number*MAXLEVELS)+ud.last_level-1].name; + if (!lastmapname) // this isn't right but it's better than no name at all + lastmapname = MapInfo[(ud.m_volume_number*MAXLEVELS)+ud.last_level-1].name; + } bonuscnt = 0; @@ -12864,7 +12903,7 @@ void G_BonusScreen(int32_t bonusonly) { P_SetGamePalette(g_player[myconnectindex].ps, endingpal, 11); // JBF 20040308 clearview(0L); - rotatesprite(0,50<<16,65536L,0,VICTORY1,0,0,2+8+16+64+128,0,0,xdim-1,ydim-1); + rotatesprite(0,50<<16,65536L,0,VICTORY1,0,0,2+8+16+64+128+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); nextpage(); //g_player[myconnectindex].ps->palette = endingpal; fadepal(0,0,0, 63,0,-1); @@ -12875,7 +12914,7 @@ void G_BonusScreen(int32_t bonusonly) while (1) { clearview(0L); - rotatesprite(0,50<<16,65536L,0,VICTORY1,0,0,2+8+16+64+128,0,0,xdim-1,ydim-1); + rotatesprite(0,50<<16,65536L,0,VICTORY1,0,0,2+8+16+64+128+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); // boss if (totalclock > 390 && totalclock < 780) @@ -12887,7 +12926,7 @@ void G_BonusScreen(int32_t bonusonly) S_PlaySound(SQUISHED); bonuscnt++; } - rotatesprite(bossmove[t+3]<<16,bossmove[t+4]<<16,65536L,0,bossmove[t+2],0,0,2+8+16+64+128,0,0,xdim-1,ydim-1); + rotatesprite(bossmove[t+3]<<16,bossmove[t+4]<<16,65536L,0,bossmove[t+2],0,0,2+8+16+64+128+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); } // Breathe @@ -12895,7 +12934,7 @@ void G_BonusScreen(int32_t bonusonly) { if (totalclock >= 750) { - rotatesprite(86<<16,59<<16,65536L,0,VICTORY1+8,0,0,2+8+16+64+128,0,0,xdim-1,ydim-1); + rotatesprite(86<<16,59<<16,65536L,0,VICTORY1+8,0,0,2+8+16+64+128+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); if (totalclock >= 750 && bonuscnt == 2) { S_PlaySound(DUKETALKTOBOSS); @@ -12911,7 +12950,7 @@ void G_BonusScreen(int32_t bonusonly) S_PlaySound(BOSSTALKTODUKE); bonuscnt++; } - rotatesprite(breathe[t+3]<<16,breathe[t+4]<<16,65536L,0,breathe[t+2],0,0,2+8+16+64+128,0,0,xdim-1,ydim-1); + rotatesprite(breathe[t+3]<<16,breathe[t+4]<<16,65536L,0,breathe[t+2],0,0,2+8+16+64+128+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); } } handleevents(); @@ -12927,7 +12966,7 @@ void G_BonusScreen(int32_t bonusonly) //g_player[myconnectindex].ps->palette = palette; P_SetGamePalette(g_player[myconnectindex].ps, palette, 11); // JBF 20040308 - rotatesprite(0,0,65536L,0,3292,0,0,2+8+16+64, 0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,3292,0,0,2+8+16+64+(ud.bgstretch?1024:0), 0,0,xdim-1,ydim-1); fadepal(0,0,0, 63,0,-1); while (!KB_KeyWaiting() && !MOUSE_GetButtons()&LEFT_MOUSE && !BUTTON(gamefunc_Fire) && !BUTTON(gamefunc_Open)) { @@ -12959,7 +12998,7 @@ void G_BonusScreen(int32_t bonusonly) KB_FlushKeyboardQueue(); //g_player[myconnectindex].ps->palette = palette; P_SetGamePalette(g_player[myconnectindex].ps, palette, 11); // JBF 20040308 - rotatesprite(0,0,65536L,0,3293,0,0,2+8+16+64, 0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,3293,0,0,2+8+16+64+(ud.bgstretch?1024:0), 0,0,xdim-1,ydim-1); fadepal(0,0,0, 63,0,-1); while (!KB_KeyWaiting() && !MOUSE_GetButtons()&LEFT_MOUSE && !BUTTON(gamefunc_Fire) && !BUTTON(gamefunc_Open)) { @@ -13144,7 +13183,7 @@ FRAGBONUS: if (!(ud.config.MusicToggle == 0 || ud.config.MusicDevice < 0)) S_PlaySound(BONUSMUSIC); - rotatesprite(0,0,65536L,0,MENUSCREEN,16,0,2+8+16+64,0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,MENUSCREEN,16,0,2+8+16+64+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); rotatesprite(160<<16,34<<16,65536L,0,INGAMEDUKETHREEDEE,0,0,10,0,0,xdim-1,ydim-1); if (PLUTOPAK) // JBF 20030804 rotatesprite((260)<<16,36<<16,65536L,0,PLUTOPAKSPRITE+2,0,0,2+8,0,0,xdim-1,ydim-1); @@ -13245,9 +13284,10 @@ FRAGBONUS: break; } - rotatesprite(0,0,65536L,0,BONUSSCREEN+gfx_offset,0,0,2+8+16+64+128,0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,BONUSSCREEN+gfx_offset,0,0,2+8+16+64+128+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); - menutext(160,20-6,0,0,lastmapname); + if (lastmapname) + menutext(160,20-6,0,0,lastmapname); menutext(160,36-6,0,0,"COMPLETED"); gametext(160,192,"PRESS ANY KEY OR BUTTON TO CONTINUE",quotepulseshade,2+8+16); @@ -13300,7 +13340,7 @@ FRAGBONUS: if (g_player[myconnectindex].ps->gm&MODE_EOL) { - rotatesprite(0,0,65536L,0,BONUSSCREEN+gfx_offset,0,0,2+8+16+64+128,0,0,xdim-1,ydim-1); + rotatesprite(0,0,65536L,0,BONUSSCREEN+gfx_offset,0,0,2+8+16+64+128+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); if (totalclock > (1000000000L) && totalclock < (1000000320L)) { @@ -13330,11 +13370,11 @@ FRAGBONUS: case 1: case 4: case 5: - rotatesprite(199<<16,31<<16,65536L,0,BONUSSCREEN+3+gfx_offset,0,0,2+8+16+64+128,0,0,xdim-1,ydim-1); + rotatesprite(199<<16,31<<16,65536L,0,BONUSSCREEN+3+gfx_offset,0,0,2+8+16+64+128+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); break; case 2: case 3: - rotatesprite(199<<16,31<<16,65536L,0,BONUSSCREEN+4+gfx_offset,0,0,2+8+16+64+128,0,0,xdim-1,ydim-1); + rotatesprite(199<<16,31<<16,65536L,0,BONUSSCREEN+4+gfx_offset,0,0,2+8+16+64+128+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); break; } } @@ -13345,15 +13385,16 @@ FRAGBONUS: { case 1: case 3: - rotatesprite(199<<16,31<<16,65536L,0,BONUSSCREEN+1+gfx_offset,0,0,2+8+16+64+128,0,0,xdim-1,ydim-1); + rotatesprite(199<<16,31<<16,65536L,0,BONUSSCREEN+1+gfx_offset,0,0,2+8+16+64+128+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); break; case 2: - rotatesprite(199<<16,31<<16,65536L,0,BONUSSCREEN+2+gfx_offset,0,0,2+8+16+64+128,0,0,xdim-1,ydim-1); + rotatesprite(199<<16,31<<16,65536L,0,BONUSSCREEN+2+gfx_offset,0,0,2+8+16+64+128+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); break; } } - menutext(160,20-6,0,0,lastmapname); + if (lastmapname) + menutext(160,20-6,0,0,lastmapname); menutext(160,36-6,0,0,"COMPLETED"); gametext(160,192,"PRESS ANY KEY OR BUTTON TO CONTINUE",quotepulseshade,2+8+16); diff --git a/polymer/eduke32/source/gamedef.c b/polymer/eduke32/source/gamedef.c index a46b35809..0c3769acb 100644 --- a/polymer/eduke32/source/gamedef.c +++ b/polymer/eduke32/source/gamedef.c @@ -3868,7 +3868,7 @@ static int32_t C_ParseCommand(void) g_scriptPtr--; if (g_dynamicTileMapping++) { - initprintf("%s:%d: warning: duplicate g_dynamicTileMapping statement\n",g_szScriptFileName,g_lineNumber); + initprintf("%s:%d: warning: duplicate dynamicremap statement\n",g_szScriptFileName,g_lineNumber); g_numCompilerWarnings++; } else initprintf("Using dynamic tile remapping\n"); diff --git a/polymer/eduke32/source/gameexec.c b/polymer/eduke32/source/gameexec.c index b7c229f7d..b6c09e814 100644 --- a/polymer/eduke32/source/gameexec.c +++ b/polymer/eduke32/source/gameexec.c @@ -2359,13 +2359,13 @@ nullquote: int32_t x1=Gv_GetVarX(*insptr++), y1=Gv_GetVarX(*insptr++); int32_t x2=Gv_GetVarX(*insptr++), y2=Gv_GetVarX(*insptr++); - if (tw == CON_ROTATESPRITE && !(orientation & 256)) + if (tw == CON_ROTATESPRITE) { x<<=16; y<<=16; } - if (x < (-160)<<16 || x >= (480<<16) || y < (-100)<<16 || y >= (300<<16)) + if (x < (-320)<<16 || x >= (640<<16) || y < (-200)<<16 || y >= (400<<16)) { OSD_Printf(CON_ERROR "invalid coordinates: %d, %d\n",g_errorLineNum, keyw[g_tw], x, y); continue; @@ -2748,7 +2748,7 @@ nullquote: { curtime = time(NULL); Bstrcpy(tempbuf,asctime(localtime(&curtime))); - clearbuf(ud.savegame[g_lastSaveSlot],sizeof(ud.savegame[g_lastSaveSlot]),0); + clearbufbyte(ud.savegame[g_lastSaveSlot],sizeof(ud.savegame[g_lastSaveSlot]),0); Bsprintf(ud.savegame[g_lastSaveSlot],"Auto"); // for (j=0;j<13;j++) // Bmemcpy(&ud.savegame[g_lastSaveSlot][j+4],&tempbuf[j+3],sizeof(tempbuf[j+3])); @@ -4601,8 +4601,18 @@ nullquote: { int32_t j = MAXSOUNDS-1; for (; j>=0; j--) - if (g_sounds[j].SoundOwner[0].i == vm.g_i) + { + int32_t k = 0; + + for (;k #include "driver_directsound.h" +#include "multivoc.h" enum { DSErr_Warning = -2, @@ -73,10 +74,10 @@ static HANDLE mutex = 0; static void FillBufferPortion(char * ptr, int32_t remaining) { - int32_t len; + int32_t len = 0; char *sptr; - while (remaining > 0) { + while (remaining >= len) { if (MixBufferUsed == MixBufferSize) { MixCallBack(); @@ -87,7 +88,7 @@ static void FillBufferPortion(char * ptr, int32_t remaining) } } - while (remaining > 0 && MixBufferUsed < MixBufferSize) { + while (remaining >= len && MixBufferUsed < MixBufferSize) { sptr = MixBuffer + (MixBufferCurrent * MixBufferSize) + MixBufferUsed; len = MixBufferSize - MixBufferUsed; @@ -111,7 +112,7 @@ static void FillBuffer(int32_t bufnum) DWORD remaining, remaining2; int32_t retries = 1; - //fprintf(stderr, "DirectSound FillBuffer: filling %d\n", bufnum); + //initprintf( "DirectSound FillBuffer: filling %d\n", bufnum); do { err = IDirectSoundBuffer_Lock(lpdsbsec, @@ -131,7 +132,8 @@ static void FillBuffer(int32_t bufnum) continue; } } - fprintf(stderr, "DirectSound FillBuffer: err %x\n", (uint32_t) err); + if (MV_Printf) + MV_Printf("DirectSound FillBuffer: err %x\n", (uint32_t) err); return; } break; @@ -149,13 +151,13 @@ static void FillBuffer(int32_t bufnum) static DWORD WINAPI fillDataThread(LPVOID lpParameter) { - HANDLE handles[3]; DWORD waitret, waitret2; + HANDLE handles[] = { handles[0] = notifyPositions[0].hEventNotify, + handles[1] = notifyPositions[1].hEventNotify, + handles[2] = notifyPositions[2].hEventNotify }; - handles[0] = notifyPositions[0].hEventNotify; - handles[1] = notifyPositions[1].hEventNotify; - handles[2] = notifyPositions[2].hEventNotify; - + UNREFERENCED_PARAMETER(lpParameter); + do { waitret = WaitForMultipleObjects(3, handles, FALSE, INFINITE); switch (waitret) { @@ -166,15 +168,17 @@ static DWORD WINAPI fillDataThread(LPVOID lpParameter) FillBuffer(WAIT_OBJECT_0 + 1 - waitret); ReleaseMutex(mutex); } else { - fprintf(stderr, "DirectSound fillDataThread: wfso err %d\n", (int32_t) waitret2); + if (MV_Printf) + MV_Printf( "DirectSound fillDataThread: wfso err %d\n", (int32_t) waitret2); } break; case WAIT_OBJECT_0+2: - fprintf(stderr, "DirectSound fillDataThread: exiting\n"); +// initprintf( "DirectSound fillDataThread: exiting\n"); ExitThread(0); break; default: - fprintf(stderr, "DirectSound fillDataThread: wfmo err %d\n", (int32_t) waitret); + if (MV_Printf) + MV_Printf( "DirectSound fillDataThread: wfmo err %d\n", (int32_t) waitret); break; } } while (1); @@ -272,7 +276,8 @@ const char *DirectSoundDrv_ErrorString( int32_t ErrorNumber ) static void TeardownDSound(HRESULT err) { if (FAILED(err)) { - fprintf(stderr, "Dying error: %x\n", (uint32_t) err); + if (MV_Printf) + MV_Printf( "Dying error: %x\n", (uint32_t) err); } if (lpdsnotify) IDirectSoundNotify_Release(lpdsnotify); @@ -404,7 +409,7 @@ int32_t DirectSoundDrv_PCM_Init(int32_t *mixrate, int32_t *numchannels, int32_t Initialised = 1; - fprintf(stderr, "DirectSound Init: yay\n"); +// initprintf("DirectSound Init: yay\n"); return DSErr_Ok; } @@ -450,7 +455,7 @@ int32_t DirectSoundDrv_PCM_BeginPlayback(char *BufferStart, int32_t BufferSize, return DSErr_Error; } - SetThreadPriority(mixThread, THREAD_PRIORITY_HIGHEST); + SetThreadPriority(mixThread, THREAD_PRIORITY_ABOVE_NORMAL); err = IDirectSoundBuffer_Play(lpdsbsec, 0, 0, DSBPLAY_LOOPING); if (FAILED( err )) { @@ -481,7 +486,8 @@ void DirectSoundDrv_PCM_Lock(void) err = WaitForSingleObject(mutex, INFINITE); if (err != WAIT_OBJECT_0) { - fprintf(stderr, "DirectSound lock: wfso %d\n", (int32_t) err); + if (MV_Printf) + MV_Printf( "DirectSound lock: wfso %d\n", (int32_t) err); } } diff --git a/polymer/eduke32/source/jaudiolib/src/fx_man.c b/polymer/eduke32/source/jaudiolib/src/fx_man.c index 6c70c8f5d..f57b0e8f7 100644 --- a/polymer/eduke32/source/jaudiolib/src/fx_man.c +++ b/polymer/eduke32/source/jaudiolib/src/fx_man.c @@ -812,13 +812,7 @@ int32_t FX_PlayLoopedRaw with the specified handle. ---------------------------------------------------------------------*/ -int32_t FX_Pan3D -( - int32_t handle, - int32_t angle, - int32_t distance -) - +int32_t FX_Pan3D(int32_t handle,int32_t angle,int32_t distance) { int32_t status; @@ -839,11 +833,7 @@ int32_t FX_Pan3D Tests if the specified sound is currently playing. ---------------------------------------------------------------------*/ -int32_t FX_SoundActive -( - int32_t handle -) - +int32_t FX_SoundActive(int32_t handle) { return(MV_VoicePlaying(handle)); } @@ -855,11 +845,7 @@ int32_t FX_SoundActive Reports the number of voices playing. ---------------------------------------------------------------------*/ -int32_t FX_SoundsPlaying -( - void -) - +int32_t FX_SoundsPlaying(void) { return(MV_VoicesPlaying()); } @@ -871,11 +857,7 @@ int32_t FX_SoundsPlaying Halts playback of a specific voice ---------------------------------------------------------------------*/ -int32_t FX_StopSound -( - int32_t handle -) - +int32_t FX_StopSound(int32_t handle) { int32_t status; @@ -979,7 +961,7 @@ int32_t FX_PlayAuto(char *ptr, uint32_t length, int32_t pitchoffset, int32_t vol break; } - if (handle < MV_Ok) + if (handle <= MV_Ok) { FX_SetErrorCode(FX_MultiVocError); handle = FX_Warning; @@ -988,6 +970,14 @@ int32_t FX_PlayAuto(char *ptr, uint32_t length, int32_t pitchoffset, int32_t vol return handle; } +int32_t FX_SetPrintf(void (*function)(const char *, ...)) +{ + MV_SetPrintf(function); + + return FX_Ok; +} + + /*--------------------------------------------------------------------- Function: FX_PlayLoopedAuto @@ -1021,7 +1011,7 @@ int32_t FX_PlayLoopedAuto(char *ptr, uint32_t length, int32_t loopstart, int32_t } - if (handle < MV_Ok) + if (handle <= MV_Ok) { FX_SetErrorCode(FX_MultiVocError); handle = FX_Warning; @@ -1061,7 +1051,7 @@ int32_t FX_PlayAuto3D(char *ptr, uint32_t length, int32_t pitchoffset, int32_t a break; } - if (handle < MV_Ok) + if (handle <= MV_Ok) { FX_SetErrorCode(FX_MultiVocError); handle = FX_Warning; @@ -1069,3 +1059,17 @@ int32_t FX_PlayAuto3D(char *ptr, uint32_t length, int32_t pitchoffset, int32_t a return handle; } + +int32_t FX_SetVoiceCallback(int32_t handle, uint32_t callbackval) +{ + int32_t status; + + status = MV_SetVoiceCallback(handle, callbackval); + if (status != MV_Ok) + { + FX_SetErrorCode(FX_MultiVocError); + return(FX_Warning); + } + + return(FX_Ok); +} diff --git a/polymer/eduke32/source/jaudiolib/src/multivoc.c b/polymer/eduke32/source/jaudiolib/src/multivoc.c index 1327f076c..52add6b8b 100644 --- a/polymer/eduke32/source/jaudiolib/src/multivoc.c +++ b/polymer/eduke32/source/jaudiolib/src/multivoc.c @@ -140,6 +140,7 @@ static volatile VoiceNode VoicePool; static int32_t MV_MixPage = 0; static int32_t MV_VoiceHandle = MV_MinVoiceHandle; +void (*MV_Printf)(const char *fmt, ...) = NULL; static void (*MV_CallBackFunc)(uint32_t) = NULL; static void (*MV_MixFunction)(VoiceNode *voice, int32_t buffer); @@ -157,7 +158,8 @@ uint32_t MV_MixPosition; int32_t MV_ErrorCode = MV_Ok; static int32_t lockdepth = 0; -static void DisableInterrupts(void) + +static inline void DisableInterrupts(void) { if (lockdepth++ > 0) return; @@ -165,7 +167,7 @@ static void DisableInterrupts(void) return; } -static void RestoreInterrupts(void) +static inline void RestoreInterrupts(void) { if (--lockdepth > 0) return; @@ -180,71 +182,50 @@ static void RestoreInterrupts(void) number. A -1 returns a pointer the current error. ---------------------------------------------------------------------*/ -const char *MV_ErrorString -( - int32_t ErrorNumber -) - +const char *MV_ErrorString(int32_t ErrorNumber) { - const char *ErrorString; - switch (ErrorNumber) { case MV_Warning : case MV_Error : - ErrorString = MV_ErrorString(MV_ErrorCode); - break; + return MV_ErrorString(MV_ErrorCode); case MV_Ok : - ErrorString = "Multivoc ok."; - break; + return "Multivoc ok."; case MV_UnsupportedCard : - ErrorString = "Selected sound card is not supported by Multivoc."; - break; + return "Selected sound card is not supported by Multivoc."; case MV_NotInstalled : - ErrorString = "Multivoc not installed."; - break; + return "Multivoc not installed."; case MV_DriverError : - ErrorString = SoundDriver_ErrorString(SoundDriver_GetError()); - break; + return SoundDriver_ErrorString(SoundDriver_GetError()); case MV_NoVoices : - ErrorString = "No free voices available to Multivoc."; - break; + return "No free voices available to Multivoc."; case MV_NoMem : - ErrorString = "Out of memory in Multivoc."; - break; + return "Out of memory in Multivoc."; case MV_VoiceNotFound : - ErrorString = "No voice with matching handle found."; - break; + return "No voice with matching handle found."; case MV_InvalidVOCFile : - ErrorString = "Invalid VOC file passed in to Multivoc."; - break; + return "Invalid VOC file passed in to Multivoc."; case MV_InvalidWAVFile : - ErrorString = "Invalid WAV file passed in to Multivoc."; - break; + return "Invalid WAV file passed in to Multivoc."; case MV_InvalidVorbisFile : - ErrorString = "Invalid OggVorbis file passed in to Multivoc."; - break; + return "Invalid OggVorbis file passed in to Multivoc."; case MV_InvalidMixMode : - ErrorString = "Invalid mix mode request in Multivoc."; - break; + return "Invalid mix mode request in Multivoc."; default : - ErrorString = "Unknown Multivoc error code."; - break; + return "Unknown Multivoc error code."; } - - return(ErrorString); } @@ -254,12 +235,7 @@ const char *MV_ErrorString Mixes the sound into the buffer. ---------------------------------------------------------------------*/ -static void MV_Mix -( - VoiceNode *voice, - int32_t buffer -) - +static void MV_Mix(VoiceNode *voice,int32_t buffer) { char *start; int32_t length; @@ -308,14 +284,10 @@ static void MV_Mix } } else - { voclength = length; - } if (voice->mix) - { voice->mix(position, rate, start, voclength); - } voice->position = MV_MixPosition; @@ -325,9 +297,7 @@ static void MV_Mix { // Get the next block of sound if (voice->GetSound(voice) != KeepPlaying) - { return; - } if (length > (voice->channels - 1)) { @@ -345,16 +315,10 @@ static void MV_Mix Adds a voice to the play list. ---------------------------------------------------------------------*/ -void MV_PlayVoice -( - VoiceNode *voice -) - +void MV_PlayVoice(VoiceNode *voice) { - DisableInterrupts(); LL_SortedInsertion(&VoiceList, voice, prev, next, VoiceNode, priority); - RestoreInterrupts(); } @@ -365,11 +329,7 @@ void MV_PlayVoice Removes the voice from the play list and adds it to the free list. ---------------------------------------------------------------------*/ -void MV_StopVoice -( - VoiceNode *voice -) - +void MV_StopVoice(VoiceNode *voice) { DisableInterrupts(); @@ -380,9 +340,9 @@ void MV_StopVoice RestoreInterrupts(); if (voice->wavetype == Vorbis) - { MV_ReleaseVorbisVoice(voice); - } + + voice->handle = 0; } @@ -403,22 +363,16 @@ void MV_StopVoice MV_GetNextWAVBlock MV_SetVoiceMixMode ---------------------------------------------------------------------*/ -void MV_ServiceVoc -( - void -) - +void MV_ServiceVoc(void) { VoiceNode *voice; VoiceNode *next; //int32_t flags; + int32_t iter; // Toggle which buffer we'll mix next - MV_MixPage++; - if (MV_MixPage >= MV_NumberOfBuffers) - { + if (++MV_MixPage >= MV_NumberOfBuffers) MV_MixPage -= MV_NumberOfBuffers; - } if (MV_ReverbLevel == 0) { @@ -443,41 +397,30 @@ void MV_ServiceVoc end = MV_MixBuffer[ 0 ] + MV_BufferLength;; dest = MV_MixBuffer[ MV_MixPage ]; source = MV_MixBuffer[ MV_MixPage ] - MV_ReverbDelay; + if (source < MV_MixBuffer[ 0 ]) - { source += MV_BufferLength; - } length = MV_BufferSize; while (length > 0) { count = length; if (source + count > end) - { count = end - source; - } if (MV_Bits == 16) { if (MV_ReverbTable != NULL) - { MV_16BitReverb(source, dest, MV_ReverbTable, count / 2); - } else - { MV_16BitReverbFast(source, dest, count / 2, MV_ReverbLevel); - } } else { if (MV_ReverbTable != NULL) - { MV_8BitReverb((int8_t *) source, (int8_t *) dest, MV_ReverbTable, count); - } else - { MV_8BitReverbFast((int8_t *) source, (int8_t *) dest, count, MV_ReverbLevel); - } } // if we go through the loop again, it means that we've wrapped around the buffer @@ -493,9 +436,15 @@ void MV_ServiceVoc if (!VoiceList.next || (voice = VoiceList.next) == &VoiceList) return; + iter = 0; + do { next = voice->next; + iter++; + + if (iter > MV_MaxVoices && MV_Printf) + MV_Printf("more iterations than voices! iter: %d\n",iter); if (voice->Paused) continue; @@ -515,6 +464,8 @@ void MV_ServiceVoc if (voice->wavetype == Vorbis) MV_ReleaseVorbisVoice(voice); + voice->handle = 0; + if (MV_CallBackFunc) MV_CallBackFunc(voice->callbackval); } @@ -531,11 +482,7 @@ void MV_ServiceVoc Interpret the information of a VOC format sound file. ---------------------------------------------------------------------*/ -playbackstatus MV_GetNextVOCBlock -( - VoiceNode *voice -) - +playbackstatus MV_GetNextVOCBlock(VoiceNode *voice) { uint8_t *ptr; int32_t blocktype; @@ -756,13 +703,9 @@ playbackstatus MV_GetNextVOCBlock if (voice->LoopEnd != NULL) { if (blocklength > (uint32_t)voice->LoopEnd) - { blocklength = (uint32_t)voice->LoopEnd; - } else - { voice->LoopEnd = (char *)blocklength; - } voice->LoopStart = voice->sound + (uint32_t)voice->LoopStart; voice->LoopEnd = voice->sound + (uint32_t)voice->LoopEnd; @@ -770,13 +713,10 @@ playbackstatus MV_GetNextVOCBlock } if (voice->bits == 16) - { blocklength /= 2; - } + if (voice->channels == 2) - { blocklength /= 2; - } voice->position = 0; voice->length = min(blocklength, 0x8000); @@ -798,11 +738,7 @@ playbackstatus MV_GetNextVOCBlock Controls playback of demand fed data. ---------------------------------------------------------------------*/ -playbackstatus MV_GetNextDemandFeedBlock -( - VoiceNode *voice -) - +playbackstatus MV_GetNextDemandFeedBlock(VoiceNode *voice) { if (voice->BlockLength > 0) { @@ -816,9 +752,7 @@ playbackstatus MV_GetNextDemandFeedBlock } if (voice->DemandFeed == NULL) - { return(NoMoreData); - } voice->position = 0; (voice->DemandFeed)(&voice->sound, &voice->BlockLength); @@ -826,11 +760,7 @@ playbackstatus MV_GetNextDemandFeedBlock voice->BlockLength -= voice->length; voice->length <<= 16; - if ((voice->length > 0) && (voice->sound != NULL)) - { - return(KeepPlaying); - } - return(NoMoreData); + return((voice->length > 0) && (voice->sound != NULL) ? KeepPlaying : NoMoreData); } @@ -840,11 +770,7 @@ playbackstatus MV_GetNextDemandFeedBlock Controls playback of demand fed data. ---------------------------------------------------------------------*/ -playbackstatus MV_GetNextRawBlock -( - VoiceNode *voice -) - +playbackstatus MV_GetNextRawBlock(VoiceNode *voice) { if (voice->BlockLength <= 0) { @@ -877,11 +803,7 @@ playbackstatus MV_GetNextRawBlock Controls playback of demand fed data. ---------------------------------------------------------------------*/ -playbackstatus MV_GetNextWAVBlock -( - VoiceNode *voice -) - +playbackstatus MV_GetNextWAVBlock(VoiceNode *voice) { if (voice->BlockLength <= 0) { @@ -914,33 +836,31 @@ playbackstatus MV_GetNextWAVBlock Locates the voice with the specified handle. ---------------------------------------------------------------------*/ -VoiceNode *MV_GetVoice -( - int32_t handle -) - +VoiceNode *MV_GetVoice(int32_t handle) { VoiceNode *voice; + if (handle < MV_MinVoiceHandle || handle > MV_MaxVoices) + { + if (MV_Printf) + MV_Printf("MV_GetVoice(): bad handle (%d)!\n", handle); + return NULL; + } + DisableInterrupts(); for (voice = VoiceList.next; voice != &VoiceList; voice = voice->next) { if (handle == voice->handle) { - break; + RestoreInterrupts(); + return voice; } } RestoreInterrupts(); - - if (voice == &VoiceList) - { - MV_SetErrorCode(MV_VoiceNotFound); - voice = 0; - } - - return(voice); + MV_SetErrorCode(MV_VoiceNotFound); + return NULL; } @@ -951,28 +871,15 @@ VoiceNode *MV_GetVoice playing. ---------------------------------------------------------------------*/ -int32_t MV_VoicePlaying -( - int32_t handle -) - +int32_t MV_VoicePlaying(int32_t handle) { - VoiceNode *voice; - if (!MV_Installed) { MV_SetErrorCode(MV_NotInstalled); return(FALSE); } - voice = MV_GetVoice(handle); - - if (voice == NULL) - { - return(FALSE); - } - - return(TRUE); + return MV_GetVoice(handle) ? TRUE : FALSE; } @@ -982,13 +889,9 @@ int32_t MV_VoicePlaying Stops output of all currently active voices. ---------------------------------------------------------------------*/ -int32_t MV_KillAllVoices -( - void -) - +int32_t MV_KillAllVoices(void) { - VoiceNode * voice = VoiceList.prev; + VoiceNode * voice; if (!MV_Installed) { @@ -996,11 +899,16 @@ int32_t MV_KillAllVoices return(MV_Error); } - if (&VoiceList == VoiceList.next) - return(MV_Ok); - DisableInterrupts(); + if (&VoiceList == VoiceList.next) + { + RestoreInterrupts(); + return(MV_Ok); + } + + voice = VoiceList.prev; + // Remove all the voices from the list while (voice != &VoiceList) { @@ -1026,11 +934,7 @@ int32_t MV_KillAllVoices Stops output of the voice associated with the specified handle. ---------------------------------------------------------------------*/ -int32_t MV_Kill -( - int32_t handle -) - +int32_t MV_Kill(int32_t handle) { VoiceNode *voice; uint32_t callbackval; @@ -1043,8 +947,7 @@ int32_t MV_Kill DisableInterrupts(); - voice = MV_GetVoice(handle); - if (voice == NULL) + if ((voice = MV_GetVoice(handle)) == NULL) { RestoreInterrupts(); MV_SetErrorCode(MV_VoiceNotFound); @@ -1058,9 +961,7 @@ int32_t MV_Kill RestoreInterrupts(); if (MV_CallBackFunc) - { MV_CallBackFunc(callbackval); - } return(MV_Ok); } @@ -1072,14 +973,10 @@ int32_t MV_Kill Determines the number of currently active voices. ---------------------------------------------------------------------*/ -int32_t MV_VoicesPlaying -( - void -) - +int32_t MV_VoicesPlaying(void) { VoiceNode *voice; - int32_t NumVoices = 0; + int32_t NumVoices = 0; if (!MV_Installed) { @@ -1090,9 +987,7 @@ int32_t MV_VoicesPlaying DisableInterrupts(); for (voice = VoiceList.next; voice != &VoiceList; voice = voice->next) - { NumVoices++; - } RestoreInterrupts(); @@ -1106,11 +1001,7 @@ int32_t MV_VoicesPlaying Retrieve an inactive or lower priority voice for output. ---------------------------------------------------------------------*/ -VoiceNode *MV_AllocVoice -( - int32_t priority -) - +VoiceNode *MV_AllocVoice(int32_t priority) { VoiceNode *voice; VoiceNode *node; @@ -1125,87 +1016,72 @@ VoiceNode *MV_AllocVoice for (node = voice->next; node != &VoiceList; node = node->next) { if (node->priority < voice->priority) - { voice = node; - } } - if (priority >= voice->priority) - { + if (priority >= voice->priority && voice->handle > MV_Ok) MV_Kill(voice->handle); - } - } - // Check if any voices are in the voice pool - if (LL_Empty(&VoicePool, next, prev)) - { - // No free voices - RestoreInterrupts(); - return(NULL); + if (LL_Empty(&VoicePool, next, prev)) + { + // No free voices + RestoreInterrupts(); + return NULL; + } } voice = VoicePool.next; LL_Remove(voice, next, prev); RestoreInterrupts(); + MV_VoiceHandle = MV_MinVoiceHandle; + // Find a free voice handle do { - MV_VoiceHandle++; - if (MV_VoiceHandle < MV_MinVoiceHandle) - { + if (++MV_VoiceHandle < MV_MinVoiceHandle || MV_VoiceHandle > MV_MaxVoices) MV_VoiceHandle = MV_MinVoiceHandle; - } } while (MV_VoicePlaying(MV_VoiceHandle)); voice->handle = MV_VoiceHandle; - return(voice); + return voice; } /*--------------------------------------------------------------------- Function: MV_VoiceAvailable - Checks if a voice can be play at the specified priority. + Checks if a voice can be played at the specified priority. ---------------------------------------------------------------------*/ -int32_t MV_VoiceAvailable -( - int32_t priority -) - +int32_t MV_VoiceAvailable(int32_t priority) { VoiceNode *voice; VoiceNode *node; // Check if we have any free voices if (!LL_Empty(&VoicePool, next, prev)) - { - return(TRUE); - } + return TRUE; DisableInterrupts(); // check if we have a higher priority than a voice that is playing. - voice = VoiceList.next; - for (node = VoiceList.next; node != &VoiceList; node = node->next) + for (voice = node = VoiceList.next; node != &VoiceList; node = node->next) { if (node->priority < voice->priority) - { voice = node; - } } - RestoreInterrupts(); - if ((voice != &VoiceList) && (priority >= voice->priority)) { - return(TRUE); + RestoreInterrupts(); + return TRUE; } - return(FALSE); + RestoreInterrupts(); + return FALSE; } @@ -1938,9 +1814,7 @@ void MV_StopPlayback MV_StopVoice(voice); if (MV_CallBackFunc) - { MV_CallBackFunc(voice->callbackval); - } } RestoreInterrupts(); @@ -2213,6 +2087,9 @@ int32_t MV_PlayLoopedWAV VoiceNode *voice; int32_t length; + UNREFERENCED_PARAMETER(ptrlength); + UNREFERENCED_PARAMETER(loopend); + if (!MV_Installed) { MV_SetErrorCode(MV_NotInstalled); @@ -2425,6 +2302,8 @@ int32_t MV_PlayLoopedVOC VoiceNode *voice; int32_t status; + UNREFERENCED_PARAMETER(ptrlength); + if (!MV_Installed) { MV_SetErrorCode(MV_NotInstalled); @@ -2854,4 +2733,36 @@ int32_t MV_Shutdown return(MV_Ok); } +int32_t MV_SetVoiceCallback(int32_t handle, uint32_t callbackval) +{ + VoiceNode *voice; + + if (!MV_Installed) + { + MV_SetErrorCode(MV_NotInstalled); + return(MV_Error); + } + + DisableInterrupts(); + + if ((voice = MV_GetVoice(handle)) == NULL) + { + RestoreInterrupts(); + MV_SetErrorCode(MV_VoiceNotFound); + return(MV_Error); + } + + voice->callbackval = callbackval; + + RestoreInterrupts(); + + return(MV_Ok); +} + +void MV_SetPrintf(void (*function)(const char *, ...)) +{ + MV_Printf = function; +} + + // vim:ts=3:expandtab: diff --git a/polymer/eduke32/source/jaudiolib/src/multivoc.h b/polymer/eduke32/source/jaudiolib/src/multivoc.h index b476832a9..e4794c7e8 100644 --- a/polymer/eduke32/source/jaudiolib/src/multivoc.h +++ b/polymer/eduke32/source/jaudiolib/src/multivoc.h @@ -31,6 +31,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef __MULTIVOC_H #define __MULTIVOC_H +#ifndef UNREFERENCED_PARAMETER +#define UNREFERENCED_PARAMETER(x) x=x +#endif + #define MV_MinVoiceHandle 1 extern int32_t MV_ErrorCode; @@ -53,6 +57,7 @@ enum MV_Errors MV_NullRecordFunction }; +void (*MV_Printf)(const char *fmt, ...); const char *MV_ErrorString( int32_t ErrorNumber ); int32_t MV_VoicePlaying( int32_t handle ); int32_t MV_KillAllVoices( void ); @@ -113,5 +118,7 @@ int32_t MV_GetReverseStereo( void ); int32_t MV_Init( int32_t soundcard, int32_t MixRate, int32_t Voices, int32_t numchannels, int32_t samplebits, void * initdata ); int32_t MV_Shutdown( void ); +int32_t MV_SetVoiceCallback(int32_t handle, uint32_t callbackval); +void MV_SetPrintf(void (*function)(const char *fmt, ...)); #endif diff --git a/polymer/eduke32/source/jaudiolib/src/vorbis.c b/polymer/eduke32/source/jaudiolib/src/vorbis.c index ccbfad3c4..eb81dc460 100644 --- a/polymer/eduke32/source/jaudiolib/src/vorbis.c +++ b/polymer/eduke32/source/jaudiolib/src/vorbis.c @@ -115,6 +115,7 @@ static int32_t seek_vorbis(void * datasource, ogg_int64_t offset, int32_t whence static int32_t close_vorbis(void * datasource) { + UNREFERENCED_PARAMETER(datasource); return 0; } @@ -161,7 +162,7 @@ static playbackstatus MV_GetNextVorbisBlock if (voice->LoopStart) { err = ov_pcm_seek_page(&vd->vf, 0); if (err != 0) { - fprintf(stderr, "MV_GetNextVorbisBlock ov_pcm_seek_page_lap: err %d\n", err); + MV_Printf("MV_GetNextVorbisBlock ov_pcm_seek_page_lap: err %d\n", err); } else { continue; } @@ -169,7 +170,7 @@ static playbackstatus MV_GetNextVorbisBlock break; } } else if (bytes < 0) { - fprintf(stderr, "MV_GetNextVorbisBlock ov_read: err %d\n", bytes); + MV_Printf("MV_GetNextVorbisBlock ov_read: err %d\n", bytes); voice->Playing = FALSE; return NoMoreData; } @@ -316,7 +317,9 @@ int32_t MV_PlayLoopedVorbis int32_t status; vorbis_data * vd = 0; vorbis_info * vi = 0; - + + UNREFERENCED_PARAMETER(loopend); + if ( !MV_Installed ) { MV_SetErrorCode( MV_NotInstalled ); @@ -337,7 +340,7 @@ int32_t MV_PlayLoopedVorbis status = ov_open_callbacks((void *) vd, &vd->vf, 0, 0, vorbis_callbacks); if (status < 0) { - fprintf(stderr, "MV_PlayLoopedVorbis: err %d\n", status); + MV_Printf("MV_PlayLoopedVorbis: err %d\n", status); MV_SetErrorCode( MV_InvalidVorbisFile ); return MV_Error; } diff --git a/polymer/eduke32/source/jmact/_control.h b/polymer/eduke32/source/jmact/_control.h index 7c610939a..ca49ec048 100644 --- a/polymer/eduke32/source/jmact/_control.h +++ b/polymer/eduke32/source/jmact/_control.h @@ -70,7 +70,7 @@ extern "C" { #define JoyMax 0xa00 #define MaxJoyValue 5000 -#define DEFAULTMOUSESENSITIVITY 10 // 0x7000+MINIMUMMOUSESENSITIVITY +#define DEFAULTMOUSESENSITIVITY 7 // 0x7000+MINIMUMMOUSESENSITIVITY #define INSTANT_ONOFF 0 #define TOGGLE_ONOFF 1 diff --git a/polymer/eduke32/source/menus.c b/polymer/eduke32/source/menus.c index 1bc264cd0..cf8b91f1c 100644 --- a/polymer/eduke32/source/menus.c +++ b/polymer/eduke32/source/menus.c @@ -4934,7 +4934,23 @@ VOLUME_ALL_40x: if (x == -1) { if (g_player[myconnectindex].ps->gm&MODE_GAME) - ChangeToMenu(50); + { + switch (g_currentMenu) + { + case 400: + case 401: + g_player[myconnectindex].ps->gm = MODE_GAME; + if ((!g_netServer && ud.multimode < 2) && ud.recstat != 2) + { + ready2send = 1; + totalclock = ototalclock; + } + break; + default: + ChangeToMenu(50); + break; + } + } else ChangeToMenu(0); return; } diff --git a/polymer/eduke32/source/osdcmds.c b/polymer/eduke32/source/osdcmds.c index 803e8e46b..a7e765017 100644 --- a/polymer/eduke32/source/osdcmds.c +++ b/polymer/eduke32/source/osdcmds.c @@ -1404,6 +1404,7 @@ int32_t registerosdcommands(void) { "demoplay_showsync","demoplay_showsync: enable/disable display of sync status",(void*)&demoplay_showsync, CVAR_BOOL, 0, 1 }, { "hud_althud", "hud_althud: enable/disable alternate mini-hud", (void*)&ud.althud, CVAR_BOOL, 0, 1 }, + { "hud_bgstretch", "hud_bgstretch: enable/disable background image stretching in wide resolutions", (void*)&ud.bgstretch, CVAR_BOOL, 0, 1 }, { "hud_messagetime", "hud_messagetime: length of time to display multiplayer chat messages", (void*)&ud.msgdisptime, CVAR_INT, 0, 3600 }, { "hud_numbertile", "hud_numbertile: first tile in alt hud number set", (void*)&althud_numbertile, CVAR_INT, 0, MAXTILES-10 }, { "hud_numberpal", "hud_numberpal: pal for alt hud numbers", (void*)&althud_numberpal, CVAR_INT, 0, MAXPALOOKUPS }, diff --git a/polymer/eduke32/source/player.c b/polymer/eduke32/source/player.c index 2bf47714e..211612f5c 100644 --- a/polymer/eduke32/source/player.c +++ b/polymer/eduke32/source/player.c @@ -455,10 +455,11 @@ int32_t A_Shoot(int32_t i,int32_t atwith) { if (ProjectileData[atwith].decal >= 0) { - if (!(SpriteFlags[ProjectileData[atwith].decal] & SPRITE_DECAL)) - SpriteFlags[ProjectileData[atwith].decal] |= SPRITE_DECAL; - k = A_Spawn(i,ProjectileData[atwith].decal); + + if (!A_CheckSpriteFlags(k , SPRITE_DECAL)) + actor[k].flags |= SPRITE_DECAL; + sprite[k].xvel = -1; sprite[k].ang = getangle(wall[hitinfo.hitwall].x-wall[wall[hitinfo.hitwall].point2].x, wall[hitinfo.hitwall].y-wall[wall[hitinfo.hitwall].point2].y)+512; @@ -841,6 +842,10 @@ int32_t A_Shoot(int32_t i,int32_t atwith) if (ProjectileData[atwith].decal >= 0) { l = A_Spawn(k,ProjectileData[atwith].decal); + + if (!A_CheckSpriteFlags(l , SPRITE_DECAL)) + actor[l].flags |= SPRITE_DECAL; + sprite[l].xvel = -1; sprite[l].ang = getangle(wall[hitinfo.hitwall].x-wall[wall[hitinfo.hitwall].point2].x, wall[hitinfo.hitwall].y-wall[wall[hitinfo.hitwall].point2].y)+512; @@ -1400,6 +1405,10 @@ DOSKIPBULLETHOLE: l = nextspritestat[l]; } l = A_Spawn(k,BULLETHOLE); + + if (!A_CheckSpriteFlags(l , SPRITE_DECAL)) + actor[l].flags |= SPRITE_DECAL; + sprite[l].xvel = -1; sprite[l].x = hitinfo.pos.x; sprite[l].y = hitinfo.pos.y; @@ -2020,9 +2029,9 @@ static void G_DrawTileScaled(int32_t x, int32_t y, int32_t tilenum, int32_t shad if (getrendermode() >= 3 && usemodels && md_tilehasmodel(tilenum,p) > 0) y += (224-weapsc(224)); #endif - rotatesprite(weapsc((orientation&256)?x:(x<<16))+((xoff-weapsc(xoff))<<16), - weapsc((orientation&256)?y:(y<<16))+((200-weapsc(200))<<16), - weapsc(65536L),a,tilenum,shade,p,2|orientation,windowx1,windowy1,windowx2,windowy2); + rotatesprite(weapsc((orientation&1024)?x:(x<<16))+((xoff-weapsc(xoff))<<16), + weapsc((orientation&1024)?y:(y<<16))+((200-weapsc(200))<<16), + weapsc(65536L),a,tilenum,shade,p,(2|orientation),windowx1,windowy1,windowx2,windowy2); } static void G_DrawWeaponTile(int32_t x, int32_t y, int32_t tilenum, int32_t shade, int32_t orientation, int32_t p) @@ -2473,12 +2482,12 @@ void P_DisplayWeapon(int32_t snum) if (*kb < 8) { G_DrawWeaponTile(weapon_xoffset+164,(looking_arc<<1)+176-gun_pos, - RPGGUN+((*kb)>>1),gs,o,pal); + RPGGUN+((*kb)>>1),gs,o|512,pal); } } G_DrawWeaponTile(weapon_xoffset+164,(looking_arc<<1)+176-gun_pos, - RPGGUN,gs,o,pal); + RPGGUN,gs,o|512,pal); } break; @@ -2666,42 +2675,42 @@ void P_DisplayWeapon(int32_t snum) if ((*kb) < *aplWeaponReload[PISTOL_WEAPON]-17) { guniqhudid = cw; - G_DrawWeaponTile(194-(p->look_ang>>1),looking_arc+230-gun_pos,FIRSTGUN+4,gs,o,pal); + G_DrawWeaponTile(194-(p->look_ang>>1),looking_arc+230-gun_pos,FIRSTGUN+4,gs,o|512,pal); guniqhudid = 0; } else if ((*kb) < *aplWeaponReload[PISTOL_WEAPON]-12) { - G_DrawWeaponTile(244-((*kb)<<3)-(p->look_ang>>1),looking_arc+130-gun_pos+((*kb)<<4),FIRSTGUN+6,gs,o,pal); + G_DrawWeaponTile(244-((*kb)<<3)-(p->look_ang>>1),looking_arc+130-gun_pos+((*kb)<<4),FIRSTGUN+6,gs,o|512,pal); guniqhudid = cw; - G_DrawWeaponTile(224-(p->look_ang>>1),looking_arc+220-gun_pos,FIRSTGUN+5,gs,o,pal); + G_DrawWeaponTile(224-(p->look_ang>>1),looking_arc+220-gun_pos,FIRSTGUN+5,gs,o|512,pal); guniqhudid = 0; } else if ((*kb) < *aplWeaponReload[PISTOL_WEAPON]-7) { - G_DrawWeaponTile(124+((*kb)<<1)-(p->look_ang>>1),looking_arc+430-gun_pos-((*kb)<<3),FIRSTGUN+6,gs,o,pal); + G_DrawWeaponTile(124+((*kb)<<1)-(p->look_ang>>1),looking_arc+430-gun_pos-((*kb)<<3),FIRSTGUN+6,gs,o|512,pal); guniqhudid = cw; - G_DrawWeaponTile(224-(p->look_ang>>1),looking_arc+220-gun_pos,FIRSTGUN+5,gs,o,pal); + G_DrawWeaponTile(224-(p->look_ang>>1),looking_arc+220-gun_pos,FIRSTGUN+5,gs,o|512,pal); guniqhudid = 0; } else if ((*kb) < *aplWeaponReload[PISTOL_WEAPON]-4) { - G_DrawWeaponTile(184-(p->look_ang>>1),looking_arc+235-gun_pos,FIRSTGUN+8,gs,o,pal); + G_DrawWeaponTile(184-(p->look_ang>>1),looking_arc+235-gun_pos,FIRSTGUN+8,gs,o|512,pal); guniqhudid = cw; - G_DrawWeaponTile(224-(p->look_ang>>1),looking_arc+210-gun_pos,FIRSTGUN+5,gs,o,pal); + G_DrawWeaponTile(224-(p->look_ang>>1),looking_arc+210-gun_pos,FIRSTGUN+5,gs,o|512,pal); guniqhudid = 0; } else if ((*kb) < *aplWeaponReload[PISTOL_WEAPON]-2) { - G_DrawWeaponTile(164-(p->look_ang>>1),looking_arc+245-gun_pos,FIRSTGUN+8,gs,o,pal); + G_DrawWeaponTile(164-(p->look_ang>>1),looking_arc+245-gun_pos,FIRSTGUN+8,gs,o|512,pal); guniqhudid = cw; - G_DrawWeaponTile(224-(p->look_ang>>1),looking_arc+220-gun_pos,FIRSTGUN+5,gs,o,pal); + G_DrawWeaponTile(224-(p->look_ang>>1),looking_arc+220-gun_pos,FIRSTGUN+5,gs,o|512,pal); guniqhudid = 0; } else if ((*kb) < *aplWeaponReload[PISTOL_WEAPON]) { guniqhudid = cw; - G_DrawWeaponTile(194-(p->look_ang>>1),looking_arc+235-gun_pos,FIRSTGUN+5,gs,o,pal); + G_DrawWeaponTile(194-(p->look_ang>>1),looking_arc+235-gun_pos,FIRSTGUN+5,gs,o|512,pal); guniqhudid = 0; } @@ -2841,15 +2850,15 @@ void P_DisplayWeapon(int32_t snum) } gun_pos -= 16; guniqhudid = 0; - G_DrawWeaponTile(weapon_xoffset+210-(p->look_ang>>1),looking_arc+261-gun_pos,FREEZE+2,-32,o,pal); + G_DrawWeaponTile(weapon_xoffset+210-(p->look_ang>>1),looking_arc+261-gun_pos,FREEZE+2,-32,o|512,pal); guniqhudid = cw; - G_DrawWeaponTile(weapon_xoffset+210-(p->look_ang>>1),looking_arc+235-gun_pos,FREEZE+3+cat_frames[*kb%6],-32,o,pal); + G_DrawWeaponTile(weapon_xoffset+210-(p->look_ang>>1),looking_arc+235-gun_pos,FREEZE+3+cat_frames[*kb%6],-32,o|512,pal); guniqhudid = 0; } else { guniqhudid = cw; - G_DrawWeaponTile(weapon_xoffset+210-(p->look_ang>>1),looking_arc+261-gun_pos,FREEZE,gs,o,pal); + G_DrawWeaponTile(weapon_xoffset+210-(p->look_ang>>1),looking_arc+261-gun_pos,FREEZE,gs,o|512,pal); guniqhudid = 0; } } @@ -3065,72 +3074,6 @@ void getinput(int32_t snum) return; } - if (BUTTON(gamefunc_Jump) && p->on_ground) - jump_timer = 4; - - loc.bits = (jump_timer > 0 || BUTTON(gamefunc_Jump))<curr_weapon][snum] & WEAPON_SEMIAUTO && BUTTON(gamefunc_Fire)) - CONTROL_ClearButton(gamefunc_Fire); - - if (jump_timer > 0) - jump_timer--; - - j=0; - - if (BUTTON(gamefunc_Weapon_1)) - j = 1; - if (BUTTON(gamefunc_Weapon_2)) - j = 2; - if (BUTTON(gamefunc_Weapon_3)) - j = 3; - if (BUTTON(gamefunc_Weapon_4)) - j = 4; - if (BUTTON(gamefunc_Weapon_5)) - j = 5; - if (BUTTON(gamefunc_Weapon_6)) - j = 6; - if (BUTTON(gamefunc_Weapon_7)) - j = 7; - if (BUTTON(gamefunc_Weapon_8)) - j = 8; - if (BUTTON(gamefunc_Weapon_9)) - j = 9; - if (BUTTON(gamefunc_Weapon_10)) - j = 10; - if (BUTTON(gamefunc_Previous_Weapon)) - j = 11; - if (BUTTON(gamefunc_Next_Weapon)) - j = 12; - - loc.bits |= j< MAXHORIZ) horiz = MAXHORIZ; + j=0; + + if (BUTTON(gamefunc_Weapon_1)) + j = 1; + if (BUTTON(gamefunc_Weapon_2)) + j = 2; + if (BUTTON(gamefunc_Weapon_3)) + j = 3; + if (BUTTON(gamefunc_Weapon_4)) + j = 4; + if (BUTTON(gamefunc_Weapon_5)) + j = 5; + if (BUTTON(gamefunc_Weapon_6)) + j = 6; + if (BUTTON(gamefunc_Weapon_7)) + j = 7; + if (BUTTON(gamefunc_Weapon_8)) + j = 8; + if (BUTTON(gamefunc_Weapon_9)) + j = 9; + if (BUTTON(gamefunc_Weapon_10)) + j = 10; + if (BUTTON(gamefunc_Previous_Weapon) || (BUTTON(gamefunc_Dpad_Select) && vel < 0)) + j = 11; + if (BUTTON(gamefunc_Next_Weapon) || (BUTTON(gamefunc_Dpad_Select) && vel > 0)) + j = 12; + + if (BUTTON(gamefunc_Jump) && p->on_ground) + jump_timer = 4; + + if (aplWeaponFlags[g_player[snum].ps->curr_weapon][snum] & WEAPON_SEMIAUTO && BUTTON(gamefunc_Fire)) + CONTROL_ClearButton(gamefunc_Fire); + + loc.bits = (jump_timer > 0 || BUTTON(gamefunc_Jump))< 0) + jump_timer--; + + loc.bits |= BUTTON(gamefunc_Crouch)< 0))< 0 || angvel < 0))) < 0))) < 0); @@ -3240,10 +3256,7 @@ void getinput(int32_t snum) { ud.folfvel = vel; ud.folavel = angvel; - loc.fvel = 0; - loc.svel = 0; - loc.avel = 0; - loc.horz = 0; + loc.fvel = loc.svel = loc.avel = loc.horz = 0; return; } @@ -3838,9 +3851,10 @@ void P_FragPlayer(int32_t snum) p->holoduke_on = -1; S_StopEnvSound(DUKE_JETPACK_IDLE,p->i); - if (p->scream_voice >= FX_Ok) + if (p->scream_voice > FX_Ok) { FX_StopSound(p->scream_voice); + S_Cleanup(); // S_TestSoundCallback(DUKE_SCREAM); p->scream_voice = -1; } @@ -4065,7 +4079,7 @@ void P_ProcessWeapon(int32_t snum) if (p->ammo_amount[p->curr_weapon] > 0) { (*kb)=1; - if (aplWeaponInitialSound[p->curr_weapon][snum]) + if (aplWeaponInitialSound[p->curr_weapon][snum] > 0) A_PlaySound(aplWeaponInitialSound[p->curr_weapon][snum], p->i); } break; @@ -4073,7 +4087,7 @@ void P_ProcessWeapon(int32_t snum) case HANDREMOTE_WEAPON: p->hbomb_hold_delay = 0; (*kb) = 1; - if (aplWeaponInitialSound[p->curr_weapon][snum]) + if (aplWeaponInitialSound[p->curr_weapon][snum] > 0) A_PlaySound(aplWeaponInitialSound[p->curr_weapon][snum], p->i); break; @@ -4081,7 +4095,7 @@ void P_ProcessWeapon(int32_t snum) if (p->ammo_amount[p->curr_weapon] > 0 && p->random_club_frame == 0) { (*kb)=1; - if (aplWeaponInitialSound[p->curr_weapon][snum]) + if (aplWeaponInitialSound[p->curr_weapon][snum] > 0) A_PlaySound(aplWeaponInitialSound[p->curr_weapon][snum], p->i); } break; @@ -4126,7 +4140,7 @@ void P_ProcessWeapon(int32_t snum) p->pos.z = p->opos.z; p->posvel.z = 0; (*kb) = 1; - if (aplWeaponInitialSound[p->curr_weapon][snum]) + if (aplWeaponInitialSound[p->curr_weapon][snum] > 0) { A_PlaySound(aplWeaponInitialSound[p->curr_weapon][snum], p->i); } @@ -4143,7 +4157,7 @@ void P_ProcessWeapon(int32_t snum) if (p->ammo_amount[p->curr_weapon] > 0) { (*kb) = 1; - if (aplWeaponInitialSound[p->curr_weapon][snum]) + if (aplWeaponInitialSound[p->curr_weapon][snum] > 0) A_PlaySound(aplWeaponInitialSound[p->curr_weapon][snum], p->i); } break; @@ -4153,7 +4167,7 @@ void P_ProcessWeapon(int32_t snum) { (*kb) = 1; p->hbomb_hold_delay = !p->hbomb_hold_delay; - if (aplWeaponInitialSound[p->curr_weapon][snum]) + if (aplWeaponInitialSound[p->curr_weapon][snum] > 0) A_PlaySound(aplWeaponInitialSound[p->curr_weapon][snum], p->i); } break; @@ -4162,7 +4176,7 @@ void P_ProcessWeapon(int32_t snum) if (p->quick_kick == 0) { (*kb) = 1; - if (aplWeaponInitialSound[p->curr_weapon][snum]) + if (aplWeaponInitialSound[p->curr_weapon][snum] > 0) A_PlaySound(aplWeaponInitialSound[p->curr_weapon][snum], p->i); } break; @@ -5025,7 +5039,7 @@ void P_ProcessInput(int32_t snum) if (p->posvel.z > 2400 && p->falling_counter < 255) { p->falling_counter++; - if (p->falling_counter >= 38 && p->scream_voice == -1) + if (p->falling_counter >= 38 && p->scream_voice <= FX_Ok) p->scream_voice = A_PlaySound(DUKE_SCREAM,p->i); } @@ -5066,9 +5080,10 @@ void P_ProcessInput(int32_t snum) { p->falling_counter = 0; - if (p->scream_voice >= FX_Ok) + if (p->scream_voice > FX_Ok) { FX_StopSound(p->scream_voice); + S_Cleanup(); p->scream_voice = -1; } diff --git a/polymer/eduke32/source/premap.c b/polymer/eduke32/source/premap.c index cb0be55ce..b89889692 100644 --- a/polymer/eduke32/source/premap.c +++ b/polymer/eduke32/source/premap.c @@ -350,7 +350,7 @@ static void G_DoLoadScreen(char *statustext, int32_t percent) clearview(0L); } - rotatesprite(320<<15,200<<15,65536L,0,j > MAXTILES-1?j-MAXTILES:j,0,0,2+8+64,0,0,xdim-1,ydim-1); + rotatesprite(320<<15,200<<15,65536L,0,j > MAXTILES-1?j-MAXTILES:j,0,0,2+8+64+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); if (j > MAXTILES-1) { @@ -402,7 +402,7 @@ static void G_DoLoadScreen(char *statustext, int32_t percent) aGameVars[g_iReturnVarID].val.lValue = LOADSCREEN; VM_OnEvent(EVENT_GETLOADTILE, -1, myconnectindex, -1); j = aGameVars[g_iReturnVarID].val.lValue; - rotatesprite(320<<15,200<<15,65536L,0,j > MAXTILES-1?j-MAXTILES:j,0,0,2+8+64,0,0,xdim-1,ydim-1); + rotatesprite(320<<15,200<<15,65536L,0,j > MAXTILES-1?j-MAXTILES:j,0,0,2+8+64+(ud.bgstretch?1024:0),0,0,xdim-1,ydim-1); if (j > MAXTILES-1) { nextpage(); diff --git a/polymer/eduke32/source/sector.c b/polymer/eduke32/source/sector.c index 6fe6b0125..6066958f1 100644 --- a/polymer/eduke32/source/sector.c +++ b/polymer/eduke32/source/sector.c @@ -2968,10 +2968,9 @@ CHECKINV1: if (p->jetpack_on) { p->inven_icon = 4; - if (p->scream_voice >= FX_Ok) + if (p->scream_voice > FX_Ok) { FX_StopSound(p->scream_voice); -// S_TestSoundCallback(DUKE_SCREAM); p->scream_voice = -1; } diff --git a/polymer/eduke32/source/sounds.c b/polymer/eduke32/source/sounds.c index 1cf09216e..6386ff37b 100644 --- a/polymer/eduke32/source/sounds.c +++ b/polymer/eduke32/source/sounds.c @@ -42,6 +42,9 @@ static int32_t MusicLen = 0; static int32_t MusicVoice = -1; static int32_t MusicPaused = 0; +static mutex_t s_mutex; +static uint32_t dq[128], dnum = 0; + /* =================== = @@ -71,9 +74,12 @@ void S_SoundStartup(void) G_GameExit(tempbuf); } + S_ClearSoundLocks(); FX_SetVolume(ud.config.FXVolume); FX_SetReverseStereo(ud.config.ReverseStereo); FX_SetCallBack(S_Callback); + FX_SetPrintf(initprintf); + mutex_init(&s_mutex); } /* @@ -267,7 +273,7 @@ int32_t S_PlayMusic(const char *fn, const int32_t sel) { if ((MusicVoice = FX_PlayLoopedAuto(MusicPtr, MusicLen, 0, 0, 0, ud.config.MusicVolume, ud.config.MusicVolume, ud.config.MusicVolume, - FX_MUSIC_PRIORITY, MUSIC_ID)) >= FX_Ok) + FX_MUSIC_PRIORITY, MUSIC_ID)) > FX_Ok) MusicIsWaveform = 1; } return (alt != 0); @@ -294,6 +300,67 @@ void S_StopMusic(void) } } +void S_Cleanup(void) +{ + // process from our own local copy of the delete queue so we don't hold the lock long + uint32_t ldq[128], ldnum; + + mutex_lock(&s_mutex); + + if (!dnum) + { + mutex_unlock(&s_mutex); + return; + } + + Bmemcpy(ldq, dq, sizeof(int32_t) * (ldnum = dnum)); + dnum = 0; + + mutex_unlock(&s_mutex); + + do + { + uint32_t num = ldq[--ldnum]; + + if (num >= 65536) + { + g_soundlocks[num-65536]--; + continue; + } + + // negative index is RTS playback + if ((int32_t)num < 0) + { + if (lumplockbyte[-(int32_t)num] >= 200) + lumplockbyte[-(int32_t)num]--; + continue; + } + + { + int32_t j = num & (MAXSOUNDINSTANCES-1); + num = (num - j) / MAXSOUNDINSTANCES; + + if (g_sounds[num].num > MAXSOUNDINSTANCES) + OSD_Printf(OSD_ERROR "S_Cleanup(): num exceeds MAXSOUNDINSTANCES! g_sounds[%d].num %d wtf?\n", num, g_sounds[num].num); + + if (g_sounds[num].num > 0) + { + int32_t i = g_sounds[num].SoundOwner[j].i; + + // MUSICANDSFX uses t_data[0] to control restarting the sound + if (i != -1 && sprite[i].picnum == MUSICANDSFX && sector[sprite[i].sectnum].lotag < 3 && sprite[i].lotag < 999) + actor[i].t_data[0] = 0; + + g_sounds[num].SoundOwner[j].i = -1; + g_sounds[num].SoundOwner[j].voice = 0; + g_sounds[num].num--; + } + } + g_soundlocks[num]--; + } + while (ldnum); +} + // returns number of bytes read int32_t S_LoadSound(uint32_t num) { @@ -317,11 +384,9 @@ int32_t S_LoadSound(uint32_t num) g_sounds[num].soundsiz = l = kfilelength(fp); - while(mutex_lock(&cachemutex)); g_soundlocks[num] = 200; allocache((intptr_t *)&g_sounds[num].ptr, l, (char *)&g_soundlocks[num]); - mutex_unlock(&cachemutex); l = kread(fp, g_sounds[num].ptr , l); kclose(fp); @@ -340,38 +405,35 @@ int32_t S_PlaySound3D(int32_t num, int32_t i, const vec3_t *pos) ((g_sounds[num].m&8) && ud.lockout) || ud.config.SoundToggle == 0 || g_sounds[num].num >= MAXSOUNDINSTANCES || + i < 0 || i >= MAXSPRITES || FX_VoiceAvailable(g_sounds[num].pr) == 0 || (g_player[myconnectindex].ps->timebeforeexit > 0 && g_player[myconnectindex].ps->timebeforeexit <= GAMETICSPERSEC*3) || g_player[myconnectindex].ps->gm&MODE_MENU) return -1; if (g_sounds[num].m&128) { - if (g_sounds[num].num < MAXSOUNDINSTANCES && i >= 0 && i < MAXSPRITES) + while (j < MAXSOUNDINSTANCES && g_sounds[num].SoundOwner[j].voice > 0) + j++; + + if (j >= MAXSOUNDINSTANCES) { - while(mutex_lock(&cachemutex)); - while (j < MAXSOUNDINSTANCES && g_sounds[num].SoundOwner[j].voice > 0) - j++; - mutex_unlock(&cachemutex); - - if (j >= MAXSOUNDINSTANCES) - { - OSD_Printf(OSD_ERROR "%s %d: WTF?\n", __FILE__, __LINE__); - return -1; - } - - if ((voice = S_PlaySound(num)) >= FX_Ok) - { - while(mutex_lock(&cachemutex)); - g_sounds[num].SoundOwner[j].i = i; - g_sounds[num].num++; - g_sounds[num].SoundOwner[j].voice = voice; - mutex_unlock(&cachemutex); - return voice; - } - + OSD_Printf(OSD_ERROR "%s %d: WTF?\n", __FILE__, __LINE__); return -1; } - return -1; + + if ((voice = S_PlaySound(num)) <= FX_Ok) + return -1; + + if (FX_SetVoiceCallback(voice, (num * MAXSOUNDINSTANCES) + j)) + { + OSD_Printf(OSD_ERROR "S_PlaySound3D(): error setting callback!\n"); + return -1; + } + + g_sounds[num].SoundOwner[j].i = i; + g_sounds[num].num++; + g_sounds[num].SoundOwner[j].voice = voice; + return voice; } // Duke talk @@ -447,11 +509,9 @@ int32_t S_PlaySound3D(int32_t num, int32_t i, const vec3_t *pos) } else { - while(mutex_lock(&cachemutex)); if (g_soundlocks[num] < 200) g_soundlocks[num] = 200; else g_soundlocks[num]++; - mutex_unlock(&cachemutex); } if (g_sounds[num].m&16) sndist = 0; @@ -461,22 +521,22 @@ int32_t S_PlaySound3D(int32_t num, int32_t i, const vec3_t *pos) j = 0; - while(mutex_lock(&cachemutex)); while (j < MAXSOUNDINSTANCES && g_sounds[num].SoundOwner[j].voice > 0) j++; if (j >= MAXSOUNDINSTANCES) { g_soundlocks[num]--; - mutex_unlock(&cachemutex); return -1; } - mutex_unlock(&cachemutex); - if (g_sounds[num].m&1) { - if (g_sounds[num].num > 0) return -1; + if (g_sounds[num].num > 0) + { + g_soundlocks[num]--; + return -1; + } voice = FX_PlayLoopedAuto(g_sounds[num].ptr, g_sounds[num].soundsiz, 0, -1, pitch,sndist>>6,sndist>>6,0,g_sounds[num].pr,(num * MAXSOUNDINSTANCES) + j); @@ -487,19 +547,15 @@ int32_t S_PlaySound3D(int32_t num, int32_t i, const vec3_t *pos) (num * MAXSOUNDINSTANCES) + j); } - while(mutex_lock(&cachemutex)); - - if (voice >= FX_Ok) + if (voice > FX_Ok) { g_sounds[num].SoundOwner[j].i = i; g_sounds[num].num++; g_sounds[num].SoundOwner[j].voice = voice; - mutex_unlock(&cachemutex); return voice; } g_soundlocks[num]--; - mutex_unlock(&cachemutex); return -1; } @@ -530,23 +586,19 @@ int32_t S_PlaySound(int32_t num) } else { - while(mutex_lock(&cachemutex)); if (g_soundlocks[num] < 200) g_soundlocks[num] = 200; else g_soundlocks[num]++; - mutex_unlock(&cachemutex); } voice = (g_sounds[num].m&1) ? FX_PlayLoopedAuto(g_sounds[num].ptr, g_sounds[num].soundsiz, 0, -1, - pitch,LOUDESTVOLUME,LOUDESTVOLUME,LOUDESTVOLUME,g_sounds[num].soundsiz,num * MAXSOUNDINSTANCES) : - FX_PlayAuto3D(g_sounds[ num ].ptr, g_sounds[num].soundsiz, pitch,0,255-LOUDESTVOLUME,g_sounds[num].pr, num * MAXSOUNDINSTANCES); + pitch,LOUDESTVOLUME,LOUDESTVOLUME,LOUDESTVOLUME,g_sounds[num].soundsiz, 65536 + num) : + FX_PlayAuto3D(g_sounds[ num ].ptr, g_sounds[num].soundsiz, pitch,0,255-LOUDESTVOLUME,g_sounds[num].pr, 65536 + num); - if (voice < FX_Ok) + if (voice <= FX_Ok) { - while(mutex_lock(&cachemutex)); g_soundlocks[num]--; - mutex_unlock(&cachemutex); return -1; } @@ -568,17 +620,28 @@ void S_StopSound(int32_t num) { int32_t j=MAXSOUNDINSTANCES-1; - while(mutex_lock(&cachemutex)); for (; j>=0; j--) { if (g_sounds[num].SoundOwner[j].voice) { - mutex_unlock(&cachemutex); - FX_StopSound(g_sounds[num].SoundOwner[j].voice); - goto retry; + if (g_sounds[num].SoundOwner[j].voice > FX_Ok && g_sounds[num].SoundOwner[j].voice <= ud.config.NumVoices) + { + if (FX_SoundActive(g_sounds[num].SoundOwner[j].voice)) + FX_StopSound(g_sounds[num].SoundOwner[j].voice); + S_Cleanup(); + goto retry; + } + else + { + initprintf(OSD_ERROR "S_StopSound(): bad voice %d for sound ID %d index %d!\n", g_sounds[num].SoundOwner[j].voice, num, j); + mutex_lock(&s_mutex); + dq[dnum++] = (num * MAXSOUNDINSTANCES) + j; + mutex_unlock(&s_mutex); + S_Cleanup(); + goto retry; + } } } - mutex_unlock(&cachemutex); } } @@ -591,17 +654,28 @@ void S_StopEnvSound(int32_t num,int32_t i) { int32_t j=MAXSOUNDINSTANCES-1; - while(mutex_lock(&cachemutex)); for (; j>=0; j--) { - if (g_sounds[num].SoundOwner[j].i == i && g_sounds[num].SoundOwner[j].voice) + if (g_sounds[num].SoundOwner[j].i == i) { - mutex_unlock(&cachemutex); - FX_StopSound(g_sounds[num].SoundOwner[j].voice); - goto retry; + if (g_sounds[num].SoundOwner[j].voice > FX_Ok && g_sounds[num].SoundOwner[j].voice <= ud.config.NumVoices) + { + if (FX_SoundActive(g_sounds[num].SoundOwner[j].voice)) + FX_StopSound(g_sounds[num].SoundOwner[j].voice); + S_Cleanup(); + goto retry; + } + else + { + initprintf(OSD_ERROR "S_StopEnvSound(): bad voice %d for sound ID %d index %d!\n", g_sounds[num].SoundOwner[j].voice, num, j); + mutex_lock(&s_mutex); + dq[dnum++] = (num * MAXSOUNDINSTANCES) + j; + mutex_unlock(&s_mutex); + S_Cleanup(); + goto retry; + } } } - mutex_unlock(&cachemutex); } } @@ -609,6 +683,8 @@ void S_Update(void) { vec3_t *s, *c; int32_t sndist,sndang,ca,j,k,i,cs; + + S_Cleanup(); g_numEnvSoundsPlaying = 0; @@ -627,16 +703,24 @@ void S_Update(void) j = g_maxSoundPos; - while(mutex_lock(&cachemutex)); do { for (k=MAXSOUNDINSTANCES-1; k>=0; k--) { i = g_sounds[j].SoundOwner[k].i; - if (i < 0 || i >= MAXSPRITES || g_sounds[j].num == 0 || g_sounds[j].SoundOwner[k].voice < FX_Ok) + if (i < 0 || i >= MAXSPRITES || g_sounds[j].num == 0 || g_sounds[j].SoundOwner[k].voice <= FX_Ok) continue; + if (!FX_SoundActive(g_sounds[j].SoundOwner[k].voice)) + { +/* + OSD_Printf("S_Update(): stale voice %d from sound %d position %d sprite %d\n", + g_sounds[j].SoundOwner[k].voice, j, k, g_sounds[j].SoundOwner[k].i); +*/ + continue; + } + s = (vec3_t *)&sprite[i]; if (PN == APLAYER && sprite[i].yvel == screenpeek) @@ -674,13 +758,10 @@ void S_Update(void) if (sndist < ((255-LOUDESTVOLUME)<<6)) sndist = ((255-LOUDESTVOLUME)<<6); - mutex_unlock(&cachemutex); FX_Pan3D(g_sounds[j].SoundOwner[k].voice, sndang>>4, sndist>>6); - mutex_lock(&cachemutex); } } while (j--); - mutex_unlock(&cachemutex); } void S_Callback(uint32_t num) @@ -688,53 +769,33 @@ void S_Callback(uint32_t num) if ((int32_t)num == MUSIC_ID) return; - while(mutex_lock(&cachemutex)); - - // negative index is RTS playback - if ((int32_t)num < 0) - { - - if (lumplockbyte[-(int32_t)num] >= 200) - lumplockbyte[-(int32_t)num]--; - mutex_unlock(&cachemutex); - return; - } - - { - int32_t j = num & (MAXSOUNDINSTANCES-1); - num = (num - j) / MAXSOUNDINSTANCES; - - if (g_sounds[num].num > 0) - { - int32_t i = g_sounds[num].SoundOwner[j].i; - - // MUSICANDSFX uses t_data[0] to control restarting the sound - if (sprite[i].picnum == MUSICANDSFX && sector[sprite[i].sectnum].lotag < 3 && sprite[i].lotag < 999) - actor[i].t_data[0] = 0; - - g_sounds[num].SoundOwner[j].i = -1; - g_sounds[num].SoundOwner[j].voice = 0; - - g_sounds[num].num--; - } - } - g_soundlocks[num]--; - mutex_unlock(&cachemutex); + mutex_lock(&s_mutex); + dq[dnum++] = num; + mutex_unlock(&s_mutex); } void S_ClearSoundLocks(void) { int32_t i; - while(mutex_lock(&cachemutex)); for (i=g_maxSoundPos; i >= 0 ; i--) + { + int32_t j = MAXSOUNDINSTANCES-1; + + for (; j>=0; j--) + { + g_sounds[i].num = 0; + g_sounds[i].SoundOwner[j].voice = 0; + g_sounds[i].SoundOwner[j].i = -1; + } + if (g_soundlocks[i] >= 200) g_soundlocks[i] = 199; + } for (i=0; i<11; i++) if (lumplockbyte[i] >= 200) lumplockbyte[i] = 199; - mutex_unlock(&cachemutex); } int32_t A_CheckSoundPlaying(int32_t i, int32_t num)