From cc73a2d7c676b12d6edaaf6f9d01a96ab2e730f4 Mon Sep 17 00:00:00 2001 From: terminx Date: Tue, 25 Nov 2008 13:06:36 +0000 Subject: [PATCH] new texcache stuff git-svn-id: https://svn.eduke32.com/eduke32@1155 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/build/include/build.h | 1 + polymer/eduke32/build/src/defs.c | 3 +- polymer/eduke32/build/src/engine.c | 6 +- polymer/eduke32/build/src/mdsprite.c | 54 ++++-- polymer/eduke32/build/src/polymost.c | 242 ++++++++++++++++++++++---- polymer/eduke32/source/actors.c | 10 +- polymer/eduke32/source/gamedef.c | 2 - polymer/eduke32/source/gamedef.h | 2 + polymer/eduke32/source/gameexec.c | 6 +- polymer/eduke32/source/gamevars.c | 8 +- polymer/eduke32/source/menus.c | 1 + 11 files changed, 268 insertions(+), 67 deletions(-) diff --git a/polymer/eduke32/build/include/build.h b/polymer/eduke32/build/include/build.h index b16cec117..f1695cacd 100644 --- a/polymer/eduke32/build/include/build.h +++ b/polymer/eduke32/build/include/build.h @@ -543,6 +543,7 @@ extern int glusetexcache, glusetexcachecompression; extern int glmultisample, glnvmultisamplehint; extern int glwidescreen, glprojectionhacks; void gltexapplyprops (void); +void invalidatecache(void); extern int r_depthpeeling, r_peelscount; extern int r_detailmapping; diff --git a/polymer/eduke32/build/src/defs.c b/polymer/eduke32/build/src/defs.c index ea6b7b5c5..c28a20ddd 100644 --- a/polymer/eduke32/build/src/defs.c +++ b/polymer/eduke32/build/src/defs.c @@ -678,7 +678,7 @@ static int defsparser(scriptfile *script) for (j=ysiz-1;j>=0;j--) { col = (palette_t *)&picptr[j*xsiz+i]; - if (col->f != 255) { faketiledata[tile][i*ysiz+j] = 255; continue; } + if (col->f < alphacut) { faketiledata[tile][i*ysiz+j] = 255; continue; } faketiledata[tile][i*ysiz+j] = getclosestcol(col->b>>2,col->g>>2,col->r>>2); } // initprintf(" %d %d %d %d\n",col->r,col->g,col->b,col->f); @@ -699,7 +699,6 @@ static int defsparser(scriptfile *script) Bfree(picptr); } - } break; case T_IMPORTTILE: diff --git a/polymer/eduke32/build/src/engine.c b/polymer/eduke32/build/src/engine.c index ca8a052b8..87871a7e2 100644 --- a/polymer/eduke32/build/src/engine.c +++ b/polymer/eduke32/build/src/engine.c @@ -19,6 +19,7 @@ #include "crc32.h" #include "baselayer.h" +#include "scriptfile.h" #ifdef POLYMOST # ifdef _WIN32 @@ -87,7 +88,7 @@ double vid_brightness = DEFAULT_BRIGHTNESS; static char globalpolytype; static short *dotp1[MAXYDIM], *dotp2[MAXYDIM]; -static unsigned char tempbuf[MAXWALLS]; +static char tempbuf[MAXWALLS]; int ebpbak, espbak; int slopalookup[16384]; // was 2048 @@ -5785,6 +5786,8 @@ void uninitengine(void) polymost_glreset(); hicinit(); freeallmodels(); + if (g_cachefil > -1) Bclose(g_cachefil); + if (g_indexfil != NULL) Bfclose(g_indexfil); #endif uninitsystem(); @@ -7392,7 +7395,6 @@ int loadoldboard(char *filename, char fromwhere, int *daposx, int *daposy, int * // loadmaphack // #if defined(POLYMOST) && defined(USE_OPENGL) -#include "scriptfile.h" int loadmaphack(char *filename) { enum diff --git a/polymer/eduke32/build/src/mdsprite.c b/polymer/eduke32/build/src/mdsprite.c index ed9a0ee9d..5f9860838 100644 --- a/polymer/eduke32/build/src/mdsprite.c +++ b/polymer/eduke32/build/src/mdsprite.c @@ -560,11 +560,11 @@ static int daskinloader(int filh, intptr_t *fptr, int *bpl, int *sizx, int *sizy // JONOF'S COMPRESSED TEXTURE CACHE STUFF --------------------------------------------------- int mdloadskin_trytexcache(char *fn, int len, int pal, char effect, texcacheheader *head) { - int fil, fp; + int fp; char cachefn[BMAX_PATH], *cp; unsigned char mdsum[16]; - if (!glinfo.texcompr || !glusetexcompr || !glusetexcache) return -1; + if (!glinfo.texcompr || !glusetexcompr || !glusetexcache || !g_indexfil || g_cachefil < 0) return -1; if (!bglCompressedTexImage2DARB || !bglGetCompressedTexImageARB) { // lacking the necessary extensions to do this @@ -574,17 +574,44 @@ int mdloadskin_trytexcache(char *fn, int len, int pal, char effect, texcachehead } md4once((unsigned char *)fn, strlen(fn), mdsum); - for (cp = cachefn, fp = 0; (*cp = TEXCACHEDIR[fp]); cp++,fp++); - *(cp++) = '/'; +// for (cp = cachefn, fp = 0; (*cp = TEXCACHEDIR[fp]); cp++,fp++); +// *(cp++) = '/'; + cp = cachefn; for (fp = 0; fp < 16; phex(mdsum[fp++], cp), cp+=2); sprintf(cp, "-%x-%x%x", len, pal, effect); - fil = kopen4load(cachefn, 0); - if (fil < 0) return -1; +// fil = kopen4load(cachefn, 0); +// if (fil < 0) return -1; - /* initprintf("Loading cached skin: %s\n", cachefn); */ + if (firsttexture.next == NULL) + return -1; + else + { + int offset = 0; + int len = 0; - if (kread(fil, head, sizeof(texcacheheader)) < (int)sizeof(texcacheheader)) goto failure; + texcacheindex *cacheindexptr = &firsttexture; + + do + { +// initprintf("checking %s against %s\n",cachefn,cacheindexptr->name); + if (!Bstrcmp(cachefn,cacheindexptr->name)) + { + offset = cacheindexptr->offset; + len = cacheindexptr->len; +// initprintf("got a match for %s offset %d\n",cachefn,offset); + break; + } + cacheindexptr = cacheindexptr->next; + } + while (cacheindexptr->next); + if (len == 0) return -1; // didn't find it + Blseek(g_cachefil, offset, BSEEK_SET); + } + +// initprintf("Loading cached skin: %s\n", cachefn); + + if (Bread(g_cachefil, head, sizeof(texcacheheader)) < (int)sizeof(texcacheheader)) goto failure; if (memcmp(head->magic, "Polymost", 8)) goto failure; head->xdim = B_LITTLE32(head->xdim); @@ -598,9 +625,10 @@ int mdloadskin_trytexcache(char *fn, int len, int pal, char effect, texcachehead if (gltexmaxsize && (head->xdim > (1<ydim > (1<flags & 1)) goto failure; - return fil; + return g_cachefil; failure: - kclose(fil); +// kclose(fil); + initprintf("cache miss\n"); return -1; } @@ -626,7 +654,7 @@ static int mdloadskin_cached(int fil, texcacheheader *head, int *doalloc, GLuint // load the mipmaps for (level = 0; level==0 || (pict.xdim > 1 || pict.ydim > 1); level++) { - r = kread(fil, &pict, sizeof(texcachepicture)); + r = Bread(fil, &pict, sizeof(texcachepicture)); if (r < (int)sizeof(texcachepicture)) goto failure; pict.size = B_LITTLE32(pict.size); @@ -760,13 +788,13 @@ int mdloadskin(md2model *m, int number, int pal, int surf) osizy = cachead.ydim; hasalpha = (cachead.flags & 2) ? 1 : 0; if (pal < (MAXPALOOKUPS - RESERVEDPALS))m->usesalpha = hasalpha; - kclose(cachefil); +// kclose(cachefil); //kclose(filh); // FIXME: uncomment when cache1d.c is fixed // cachefil >= 0, so it won't be rewritten } else { - if (cachefil >= 0) kclose(cachefil); +// if (cachefil >= 0) kclose(cachefil); cachefil = -1; // the compressed version will be saved to disk if ((filh = kopen4load(fn, 0)) < 0) return -1; diff --git a/polymer/eduke32/build/src/polymost.c b/polymer/eduke32/build/src/polymost.c index 2660f2cec..dc47e521a 100644 --- a/polymer/eduke32/build/src/polymost.c +++ b/polymer/eduke32/build/src/polymost.c @@ -325,7 +325,11 @@ static void uploadtexture(int doalloc, int xsiz, int ysiz, int intexfmt, int tex # include "lzwnew.h" #endif -char TEXCACHEDIR[BMAX_PATH] = "texcache"; +int g_cachefil = -1; // texture cache file handle +FILE *g_indexfil = NULL; + +char TEXCACHEDIR[BMAX_PATH] = "textures"; + typedef struct { char magic[8]; // 'Polymost' @@ -349,6 +353,20 @@ void writexcache(char *fn, int len, int dameth, char effect, texcacheheader *hea int mdtims, omdtims; float alphahackarray[MAXTILES]; + +struct cache_list +{ + char name[BMAX_PATH]; + int offset; + int len; + struct cache_list *next; +}; + +typedef struct cache_list texcacheindex; + +texcacheindex firsttexture; +texcacheindex *datextures = NULL; + #include "mdsprite.c" //-------------------------------------------------------------------------------------------------- @@ -631,7 +649,7 @@ void gltexapplyprops(void) } //-------------------------------------------------------------------------------------------------- - +static int LoadCacheOffsets(void); static float glox1, gloy1, glox2, gloy2; //Use this for both initialization and uninitialization of OpenGL. @@ -693,6 +711,29 @@ void polymost_glreset() peels = NULL; } + + if (g_cachefil != -1) + Bclose(g_cachefil); + + if (g_indexfil) + Bfclose(g_indexfil); + + datextures = &firsttexture; + LoadCacheOffsets(); + + Bstrcpy(tempbuf,TEXCACHEDIR); + Bstrcat(tempbuf,".cache"); + g_indexfil = Bfopen(tempbuf, "at"); + if (!g_indexfil) + { + initprintf("Unable to open cache index!\n"); + return; + } + + g_cachefil = openfrompath(TEXCACHEDIR,BO_BINARY|BO_APPEND|BO_CREAT|BO_RDWR,BS_IREAD|BS_IWRITE); + + if (g_cachefil < 0) + initprintf("Unable to open cache file!\n"); } // one-time initialization of OpenGL for polymost @@ -854,6 +895,52 @@ void polymost_glinit() bglEnableClientState(GL_VERTEX_ARRAY); bglEnableClientState(GL_TEXTURE_COORD_ARRAY); + + if (g_cachefil != -1) + Bclose(g_cachefil); + + if (g_indexfil) + Bfclose(g_indexfil); + + datextures = &firsttexture; + LoadCacheOffsets(); + + Bstrcpy(tempbuf,TEXCACHEDIR); + Bstrcat(tempbuf,".cache"); + g_indexfil = Bfopen(tempbuf, "at"); + if (!g_indexfil) + { + initprintf("Unable to open cache index!\n"); + return; + } + g_cachefil = Bopen(TEXCACHEDIR,BO_BINARY|BO_APPEND|BO_CREAT|BO_RDWR,BS_IREAD|BS_IWRITE); + + if (g_cachefil < 0) + initprintf("Unable to open cache file!\n"); +} + +void invalidatecache(void) +{ + if (g_cachefil != -1) + Bclose(g_cachefil); + + if (g_indexfil) + Bfclose(g_indexfil); + + datextures = &firsttexture; + + Bstrcpy(tempbuf,TEXCACHEDIR); + Bstrcat(tempbuf,".cache"); + g_indexfil = Bfopen(tempbuf, "wt"); + if (!g_indexfil) + { + initprintf("Unable to open cache index!\n"); + return; + } + g_cachefil = Bopen(TEXCACHEDIR,BO_BINARY|BO_TRUNC|BO_CREAT|BO_RDWR,BS_IREAD|BS_IWRITE); + + if (g_cachefil < 0) + initprintf("Unable to open cache file!\n"); } void resizeglcheck() @@ -1219,6 +1306,37 @@ int gloadtile_art(int dapic, int dapal, int dameth, pthtyp *pth, int doalloc) } // JONOF'S COMPRESSED TEXTURE CACHE STUFF --------------------------------------------------- + +static int LoadCacheOffsets(void) +{ + int foffset, fsize; + char *fname; + + scriptfile *script; + + Bstrcpy(tempbuf,TEXCACHEDIR); + Bstrcat(tempbuf,".cache"); + script = scriptfile_fromfile(tempbuf); + + if (!script) return -1; + + while (!scriptfile_eof(script)) + { + if (scriptfile_getstring(script, &fname)) break; // filename + if (scriptfile_getnumber(script, &foffset)) break; // offset in cache + if (scriptfile_getnumber(script, &fsize)) break; // size + + strncpy(datextures->name, fname, BMAX_PATH); + datextures->offset = foffset; + datextures->len = fsize; + datextures->next = Bcalloc(1, sizeof(texcacheindex)); + datextures = datextures->next; + } + + scriptfile_close(script); + return 0; +} + static inline void phex(unsigned char v, char *s) { int x; @@ -1230,11 +1348,11 @@ static inline void phex(unsigned char v, char *s) int trytexcache(char *fn, int len, int dameth, char effect, texcacheheader *head) { - int fil, fp; + int fp; char cachefn[BMAX_PATH], *cp; unsigned char mdsum[16]; - if (!glinfo.texcompr || !glusetexcompr || !glusetexcache) return -1; + if (!glinfo.texcompr || !glusetexcompr || !glusetexcache || !g_indexfil || g_cachefil < 0) return -1; if (!bglCompressedTexImage2DARB || !bglGetCompressedTexImageARB) { // lacking the necessary extensions to do this @@ -1244,19 +1362,45 @@ int trytexcache(char *fn, int len, int dameth, char effect, texcacheheader *head } md4once((unsigned char *)fn, strlen(fn), mdsum); - for (cp = cachefn, fp = 0; (*cp = TEXCACHEDIR[fp]); cp++,fp++); - *(cp++) = '/'; +// for (cp = cachefn, fp = 0; (*cp = TEXCACHEDIR[fp]); cp++,fp++); +// *(cp++) = '/'; + cp = cachefn; for (fp = 0; fp < 16; phex(mdsum[fp++], cp), cp+=2); sprintf(cp, "-%x-%x%x", len, dameth, effect); - fil = kopen4load(cachefn, 0); - if (fil < 0) return -1; +// fil = kopen4load(cachefn, 0); +// if (fil < 0) return -1; - /* initprintf("Loading cached tex: %s\n", cachefn); */ + if (firsttexture.next == NULL) + return -1; + else + { + int offset = 0; + int len = 0; - if (kread(fil, head, sizeof(texcacheheader)) < (int)sizeof(texcacheheader)) goto failure; + texcacheindex *cacheindexptr = &firsttexture; + + do + { +// initprintf("checking %s against %s\n",cachefn,cacheindexptr->name); + if (!Bstrcmp(cachefn,cacheindexptr->name)) + { + offset = cacheindexptr->offset; + len = cacheindexptr->len; +// initprintf("got a match for %s offset %d\n",cachefn,offset); +// break; + } + cacheindexptr = cacheindexptr->next; + } + while (cacheindexptr->next); + if (len == 0) return -1; // didn't find it + Blseek(g_cachefil, offset, BSEEK_SET); + } + +// initprintf("Loading cached tex: %s\n", cachefn); + + if (Bread(g_cachefil, head, sizeof(texcacheheader)) < (int)sizeof(texcacheheader)) goto failure; if (memcmp(head->magic, "Polymost", 8)) goto failure; - head->xdim = B_LITTLE32(head->xdim); head->ydim = B_LITTLE32(head->ydim); head->flags = B_LITTLE32(head->flags); @@ -1269,15 +1413,17 @@ int trytexcache(char *fn, int len, int dameth, char effect, texcacheheader *head if (gltexmaxsize && (head->xdim > (1<ydim > (1<flags & 1)) goto failure; - return fil; + return g_cachefil; failure: - kclose(fil); + initprintf("cache miss\n"); +// kclose(g_cachefil); return -1; } void writexcache(char *fn, int len, int dameth, char effect, texcacheheader *head) { - int fil=-1, fp; +// int fil=-1; + int fp; char cachefn[BMAX_PATH], *cp; unsigned char mdsum[16]; texcachepicture pict; @@ -1287,7 +1433,7 @@ void writexcache(char *fn, int len, int dameth, char effect, texcacheheader *hea unsigned int padx=0, pady=0; GLuint gi; - if (!glinfo.texcompr || !glusetexcompr || !glusetexcache) return; + if (!glinfo.texcompr || !glusetexcompr || !glusetexcache || !g_indexfil || g_cachefil < 0) return; if (!bglCompressedTexImage2DARB || !bglGetCompressedTexImageARB) { // lacking the necessary extensions to do this @@ -1295,7 +1441,7 @@ void writexcache(char *fn, int len, int dameth, char effect, texcacheheader *hea glusetexcache = 0; return; } - +/* { struct stat st; if (stat(TEXCACHEDIR, &st) < 0) @@ -1325,21 +1471,22 @@ void writexcache(char *fn, int len, int dameth, char effect, texcacheheader *hea return; } } - +*/ gi = GL_FALSE; bglGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_ARB, (GLint *)&gi); if (gi != GL_TRUE) return; md4once((unsigned char *)fn, strlen(fn), mdsum); - for (cp = cachefn, fp = 0; (*cp = TEXCACHEDIR[fp]); cp++,fp++); - *(cp++) = '/'; +// for (cp = cachefn, fp = 0; (*cp = TEXCACHEDIR[fp]); cp++,fp++); +// *(cp++) = '/'; + cp = cachefn; for (fp = 0; fp < 16; phex(mdsum[fp++], cp), cp+=2); sprintf(cp, "-%x-%x%x", len, dameth, effect); - OSD_Printf("Writing cached tex: %s\n", cachefn); + OSD_Printf("Writing cached tex: %s ", cachefn); - fil = Bopen(cachefn,BO_BINARY|BO_CREAT|BO_TRUNC|BO_RDWR,BS_IREAD|BS_IWRITE); - if (fil < 0) return; +// fil = Bopen(cachefn,BO_BINARY|BO_CREAT|BO_TRUNC|BO_RDWR,BS_IREAD|BS_IWRITE); +// if (fil < 0) return; memcpy(head->magic, "Polymost", 8); // sizes are set by caller @@ -1350,7 +1497,12 @@ void writexcache(char *fn, int len, int dameth, char effect, texcacheheader *hea head->flags = B_LITTLE32(head->flags); head->quality = B_LITTLE32(head->quality); - if (Bwrite(fil, head, sizeof(texcacheheader)) != sizeof(texcacheheader)) goto failure; + Bstrcpy(datextures->name, cachefn); + Blseek(g_cachefil, 0, BSEEK_END); + datextures->offset = Blseek(g_cachefil, 0, BSEEK_CUR); + initprintf("offset: %d\n",datextures->offset); + + if (Bwrite(g_cachefil, head, sizeof(texcacheheader)) != sizeof(texcacheheader)) goto failure; bglGetError(); for (level = 0; level==0 || (padx > 1 || pady > 1); level++) @@ -1393,12 +1545,25 @@ void writexcache(char *fn, int len, int dameth, char effect, texcacheheader *hea bglGetCompressedTexImageARB(GL_TEXTURE_2D, level, pic); if (bglGetError() != GL_NO_ERROR) goto failure; - if (Bwrite(fil, &pict, sizeof(texcachepicture)) != sizeof(texcachepicture)) goto failure; - if (dxtfilter(fil, &pict, pic, midbuf, packbuf, miplen)) goto failure; + if (Bwrite(g_cachefil, &pict, sizeof(texcachepicture)) != sizeof(texcachepicture)) goto failure; + if (dxtfilter(g_cachefil, &pict, pic, midbuf, packbuf, miplen)) goto failure; } + datextures->len = Blseek(g_cachefil, 0, BSEEK_CUR) - datextures->offset; + datextures->next = (texcacheindex *)Bcalloc(1,sizeof(texcacheindex)); + + if (g_indexfil) + fprintf(g_indexfil, "\"%s\" %d %d\n", datextures->name, datextures->offset, datextures->len); + + datextures = datextures->next; + + goto success; failure: - if (fil>=0) Bclose(fil); + initprintf("failure!\n"); + datextures->offset = 0; + Bmemset(datextures->name,0,sizeof(datextures->name)); +success: +// if (fil>=0) Bclose(fil); if (midbuf) free(midbuf); if (pic) free(pic); if (packbuf) free(packbuf); @@ -1429,7 +1594,7 @@ int gloadtile_cached(int fil, texcacheheader *head, int *doalloc, pthtyp *pth,in // load the mipmaps for (level = 0; level==0 || (pict.xdim > 1 || pict.ydim > 1); level++) { - r = kread(fil, &pict, sizeof(texcachepicture)); + r = Bread(fil, &pict, sizeof(texcachepicture)); if (r < (int)sizeof(texcachepicture)) goto failure; pict.size = B_LITTLE32(pict.size); @@ -1477,6 +1642,7 @@ int gloadtile_cached(int fil, texcacheheader *head, int *doalloc, pthtyp *pth,in if (packbuf) free(packbuf); return 0; failure: + initprintf("failure!!!\n"); if (midbuf) free(midbuf); if (pic) free(pic); if (packbuf) free(packbuf); @@ -1552,13 +1718,13 @@ int gloadtile_hi(int dapic,int dapalnum, int facen, hicreplctyp *hicr, int damet tsizx = cachead.xdim; tsizy = cachead.ydim; hasalpha = (cachead.flags & 2) ? 0 : 255; - kclose(cachefil); +// kclose(cachefil); //kclose(filh); // FIXME: uncomment when cache1d.c is fixed // cachefil >= 0, so it won't be rewritten } else { - if (cachefil >= 0) kclose(cachefil); +// if (cachefil >= 0) kclose(cachefil); cachefil = -1; // the compressed version will be saved to disk if ((filh = kopen4load(fn, 0)) < 0) return -1; @@ -6396,15 +6562,15 @@ int dedxtfilter(int fil, texcachepicture *pict, char *pic, void *midbuf, char *p if (stride == 16) //If DXT3... { //alpha_4x4 - if (kread(fil,&cleng,4) < 4) return -1; cleng = B_LITTLE32(cleng); + if (Bread(fil,&cleng,4) < 4) return -1; cleng = B_LITTLE32(cleng); j = (pict->size/stride)*8; #ifdef USELZF if (ispacked && cleng < j) inbuf = packbuf; else inbuf = midbuf; - if (kread(fil,inbuf,cleng) < cleng) return -1; + if (Bread(fil,inbuf,cleng) < cleng) return -1; if (ispacked && cleng < j) if (lzf_decompress(packbuf,cleng,midbuf,j) == 0) return -1; #else - if (kread(fil,inbuf,cleng) < cleng) return -1; + if (Bread(fil,inbuf,cleng) < cleng) return -1; if (ispacked && lzwuncompress(packbuf,cleng,midbuf,j) != j) return -1; #endif cptr = midbuf; @@ -6414,15 +6580,15 @@ int dedxtfilter(int fil, texcachepicture *pict, char *pic, void *midbuf, char *p } //rgb0,rgb1 - if (kread(fil,&cleng,4) < 4) return -1; cleng = B_LITTLE32(cleng); + if (Bread(fil,&cleng,4) < 4) return -1; cleng = B_LITTLE32(cleng); j = (pict->size/stride)*4; #ifdef USELZF if (ispacked && cleng < j) inbuf = packbuf; else inbuf = midbuf; - if (kread(fil,inbuf,cleng) < cleng) return -1; + if (Bread(fil,inbuf,cleng) < cleng) return -1; if (ispacked && cleng < j) if (lzf_decompress(packbuf,cleng,midbuf,j) == 0) return -1; #else - if (kread(fil,inbuf,cleng) < cleng) return -1; + if (Bread(fil,inbuf,cleng) < cleng) return -1; if (ispacked && lzwuncompress(packbuf,cleng,midbuf,j) != j) return -1; #endif cptr = midbuf; @@ -6434,15 +6600,15 @@ int dedxtfilter(int fil, texcachepicture *pict, char *pic, void *midbuf, char *p } //index_4x4: - if (kread(fil,&cleng,4) < 4) return -1; cleng = B_LITTLE32(cleng); + if (Bread(fil,&cleng,4) < 4) return -1; cleng = B_LITTLE32(cleng); j = (pict->size/stride)*4; #ifdef USELZF if (ispacked && cleng < j) inbuf = packbuf; else inbuf = midbuf; - if (kread(fil,inbuf,cleng) < cleng) return -1; + if (Bread(fil,inbuf,cleng) < cleng) return -1; if (ispacked && cleng < j) if (lzf_decompress(packbuf,cleng,midbuf,j) == 0) return -1; #else - if (kread(fil,inbuf,cleng) < cleng) return -1; + if (Bread(fil,inbuf,cleng) < cleng) return -1; if (ispacked && lzwuncompress(packbuf,cleng,midbuf,j) != j) return -1; #endif cptr = midbuf; diff --git a/polymer/eduke32/source/actors.c b/polymer/eduke32/source/actors.c index 3aa2b8bb9..7014fe3a7 100644 --- a/polymer/eduke32/source/actors.c +++ b/polymer/eduke32/source/actors.c @@ -102,6 +102,8 @@ void P_AddAmmo(int weapon,DukePlayer_t *p,int amount) void P_AddWeaponNoSwitch(DukePlayer_t *p, int weapon) { + int snum = sprite[p->i].yvel; + if (p->gotweapon[weapon] == 0) { p->gotweapon[weapon] = 1; @@ -110,10 +112,10 @@ void P_AddWeaponNoSwitch(DukePlayer_t *p, int weapon) } #if 1 - if (aplWeaponSelectSound[p->curr_weapon][sprite[p->i].yvel]) - A_StopSound(aplWeaponSelectSound[p->curr_weapon][sprite[p->i].yvel],p->i); - if (aplWeaponSelectSound[weapon][sprite[p->i].yvel]) - A_PlaySound(aplWeaponSelectSound[weapon][sprite[p->i].yvel],p->i); + if (aplWeaponSelectSound[p->curr_weapon][snum]) + A_StopSound(aplWeaponSelectSound[p->curr_weapon][snum],p->i); + if (aplWeaponSelectSound[weapon][snum]) + A_PlaySound(aplWeaponSelectSound[weapon][snum],p->i); #else switch (p->curr_weapon) { diff --git a/polymer/eduke32/source/gamedef.c b/polymer/eduke32/source/gamedef.c index e79b564cc..0458c5541 100644 --- a/polymer/eduke32/source/gamedef.c +++ b/polymer/eduke32/source/gamedef.c @@ -27,8 +27,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "osd.h" -intptr_t *g_scriptPtr; - int g_scriptVersion = 13; // 13 = 1.3D-style CON files, 14 = 1.4/1.5 style CON files char g_szScriptFileName[BMAX_PATH] = "(none)"; // file we're currently compiling diff --git a/polymer/eduke32/source/gamedef.h b/polymer/eduke32/source/gamedef.h index e7d6e4da5..7dda80860 100644 --- a/polymer/eduke32/source/gamedef.h +++ b/polymer/eduke32/source/gamedef.h @@ -56,6 +56,8 @@ extern char g_szScriptFileName[BMAX_PATH]; extern int g_totalLines,g_lineNumber; extern int g_numCompilerErrors,g_numCompilerWarnings; +extern intptr_t *g_scriptPtr; + typedef struct { char *name; diff --git a/polymer/eduke32/source/gameexec.c b/polymer/eduke32/source/gameexec.c index c3cf29a2a..6a379e83a 100644 --- a/polymer/eduke32/source/gameexec.c +++ b/polymer/eduke32/source/gameexec.c @@ -833,7 +833,7 @@ static int X_DoExecute(void) //Following changed to use pointersizes g_t[5] = *insptr++; // Ai g_t[4] = *(intptr_t *)(g_t[5]); // Action - g_t[1] = *(((intptr_t *)g_t[5])+1); // move + if (g_t[5]) g_t[1] = *(((intptr_t *)g_t[5])+1); // move g_sp->hitag = *(((intptr_t *)g_t[5])+2); // move flags g_t[0] = g_t[2] = g_t[3] = 0; // count, actioncount... g_t[3] = ??? if (g_sp->hitag&random_angle) @@ -1095,7 +1095,9 @@ static int X_DoExecute(void) default: // fix for flying/jumping monsters getting stuck in water if (g_sp->statnum != MAXSTATUS && actorscrptr[g_sp->picnum] && - ((moveptr && *(moveptr+1)) || g_sp->hitag & jumptoplayer)) + (g_sp->hitag & jumptoplayer || + (moveptr >= g_scriptPtr && moveptr <= (g_scriptPtr+g_scriptSize) && *(moveptr+1))) + ) { // OSD_Printf("%d\n",*(moveptr+1)); break; diff --git a/polymer/eduke32/source/gamevars.c b/polymer/eduke32/source/gamevars.c index df73728ac..a9098f436 100644 --- a/polymer/eduke32/source/gamevars.c +++ b/polymer/eduke32/source/gamevars.c @@ -1470,11 +1470,11 @@ void Gv_RefreshPointers(void) aGameVars[Gv_GetVarIndex("lastvisinc")].lValue = (intptr_t)&lastvisinc; aGameVars[Gv_GetVarIndex("numsectors")].lValue = (intptr_t)&numsectors; aGameVars[Gv_GetVarIndex("numplayers")].lValue = (intptr_t)&numplayers; - aGameVars[Gv_GetVarIndex("g_currentMenu")].lValue = (intptr_t)&g_currentMenu; + aGameVars[Gv_GetVarIndex("cenu")].lValue = (intptr_t)&g_currentMenu; aGameVars[Gv_GetVarIndex("viewingrange")].lValue = (intptr_t)&viewingrange; aGameVars[Gv_GetVarIndex("yxaspect")].lValue = (intptr_t)&yxaspect; aGameVars[Gv_GetVarIndex("gravitationalconstant")].lValue = (intptr_t)&g_spriteGravity; - aGameVars[Gv_GetVarIndex("GametypeFlags")].lValue = (intptr_t)&GametypeFlags[ud.coop]; + aGameVars[Gv_GetVarIndex("gametypeflags")].lValue = (intptr_t)&GametypeFlags[ud.coop]; aGameVars[Gv_GetVarIndex("framerate")].lValue = (intptr_t)&g_currentFrameRate; aGameVars[Gv_GetVarIndex("camerax")].lValue = (intptr_t)&ud.camerax; @@ -1483,8 +1483,8 @@ void Gv_RefreshPointers(void) aGameVars[Gv_GetVarIndex("cameraang")].lValue = (intptr_t)&ud.cameraang; aGameVars[Gv_GetVarIndex("camerahoriz")].lValue = (intptr_t)&ud.camerahoriz; aGameVars[Gv_GetVarIndex("camerasect")].lValue = (intptr_t)&ud.camerasect; - aGameVars[Gv_GetVarIndex("g_cameraDistance")].lValue = (intptr_t)&g_cameraDistance; - aGameVars[Gv_GetVarIndex("g_cameraClock")].lValue = (intptr_t)&g_cameraClock; + aGameVars[Gv_GetVarIndex("cameradist")].lValue = (intptr_t)&g_cameraDistance; + aGameVars[Gv_GetVarIndex("cameraclock")].lValue = (intptr_t)&g_cameraClock; aGameVars[Gv_GetVarIndex("myx")].lValue = (intptr_t)&myx; aGameVars[Gv_GetVarIndex("myy")].lValue = (intptr_t)&myy; diff --git a/polymer/eduke32/source/menus.c b/polymer/eduke32/source/menus.c index 2f496045a..b9a7bfde2 100644 --- a/polymer/eduke32/source/menus.c +++ b/polymer/eduke32/source/menus.c @@ -2531,6 +2531,7 @@ cheat_for_port_credits: _bar(1,d+8,yy+7, &r_downsize,-1,enabled && x==io,MENUHIGHLIGHT(io),!enabled,0,2); if (r_downsize != i) { + invalidatecache(); resetvideomode(); if (setgamemode(fullscreen,xdim,ydim,bpp)) OSD_Printf("restartvid: Reset failed...\n");