diff --git a/polymer/build/include/build.h b/polymer/build/include/build.h index fde5f2500..8093ab0e2 100644 --- a/polymer/build/include/build.h +++ b/polymer/build/include/build.h @@ -36,9 +36,15 @@ extern "C" { #define MAXSPRITESONSCREEN 4096 #define MAXUNIQHUDID 256 //Extra slots so HUD models can store animation state without messing game sprites -#define RESERVEDPALS 2 // don't forget to increment this when adding reserved pals +#define RESERVEDPALS 8 // don't forget to increment this when adding reserved pals #define DETAILPAL (MAXPALOOKUPS - 1) #define GLOWPAL (MAXPALOOKUPS - 2) +#define REDPAL (MAXPALOOKUPS - 3) +#define BLUEPAL (MAXPALOOKUPS - 4) +#define BROWNPAL (MAXPALOOKUPS - 5) +#define GREYPAL (MAXPALOOKUPS - 6) +#define GREENPAL (MAXPALOOKUPS - 7) +#define SPECPAL (MAXPALOOKUPS - 8) #define CLIPMASK0 (((1L)<<16)+1L) #define CLIPMASK1 (((256L)<<16)+64L) @@ -168,6 +174,8 @@ typedef struct BPACK { #define SPREXT_NOTMD 1 #define SPREXT_NOMDANIM 2 +#define SPREXT_AWAY1 4 +#define SPREXT_AWAY2 8 EXTERN spriteexttype *spriteext; EXTERN spritesmoothtype *spritesmooth; EXTERN int guniqhudid; @@ -523,16 +531,24 @@ int hicsetsubsttex(int picnum, int palnum, char *filen, float alphacut, float xs int hicsetskybox(int picnum, int palnum, char *faces[6]); int hicclearsubst(int picnum, int palnum); +int Ptile2tile(int tile, int pallet); int md_loadmodel(const char *fn); -int md_setmisc(int modelid, float scale, int shadeoff, float zadd); -int md_tilehasmodel(int tilenume); -int md_defineframe(int modelid, const char *framename, int tilenume, int skinnum, float smoothduration); +int md_setmisc(int modelid, float scale, int shadeoff, float zadd, int flags); +int md_tilehasmodel(int tilenume, int pal); +int md_defineframe(int modelid, const char *framename, int tilenume, int skinnum, float smoothduration, int pal); int md_defineanimation(int modelid, const char *framestart, const char *frameend, int fps, int flags); int md_defineskin(int modelid, const char *skinfn, int palnum, int skinnum, int surfnum, float param); int md_definehud (int modelid, int tilex, double xadd, double yadd, double zadd, double angadd, int flags); int md_undefinetile(int tile); int md_undefinemodel(int modelid); +#define MAXPALCONV 200 +void clearconv(); +void setpalconv(int pal,int pal1,int pal2); +void getpalmap(int stage,int *pal1,int *pal2); +int checkpalmaps(int pal); +void applypalmap(char *pic, char *palmap, int size, int pal); + int loaddefinitionsfile(char *fn); extern int mapversion; // if loadboard() fails with -2 return, try loadoldboard(). if it fails with -2, board is dodgy diff --git a/polymer/build/include/polymost.h b/polymer/build/include/polymost.h index 9adbec154..903a11e91 100644 --- a/polymer/build/include/polymost.h +++ b/polymer/build/include/polymost.h @@ -30,6 +30,8 @@ typedef struct pthtyp_t unsigned short sizx, sizy; float scalex, scaley; struct pthtyp_t *ofb; // only fullbright + + char *palmap;int size; } pthtyp; pthtyp * gltexcache (int dapicnum, int dapalnum, int dameth); diff --git a/polymer/build/src/defs.c b/polymer/build/src/defs.c index 61b487091..f7a00f7f4 100644 --- a/polymer/build/src/defs.c +++ b/polymer/build/src/defs.c @@ -21,6 +21,7 @@ enum T_DEFINETEXTURE, T_DEFINESKYBOX, T_DEFINETINT, + T_DEFINECONV, T_DEFINEMODEL, T_DEFINEMODELFRAME, T_DEFINEMODELANIM, @@ -68,7 +69,9 @@ enum T_FOGPAL, T_LOADGRP, T_DUMMYTILE,T_DUMMYTILERANGE, - T_CACHESIZE + T_CACHESIZE, + T_MUSIC,T_ID,T_SOUND, + T_REDPAL,T_BLUEPAL,T_BROWNPAL,T_GREYPAL,T_GREENPAL,T_SPECPAL }; typedef struct { char *text; int tokenid; } tokenlist; @@ -83,6 +86,7 @@ static tokenlist basetokens[] = { "definetexture", T_DEFINETEXTURE }, { "defineskybox", T_DEFINESKYBOX }, { "definetint", T_DEFINETINT }, + { "defineconv", T_DEFINECONV }, { "definemodel", T_DEFINEMODEL }, { "definemodelframe",T_DEFINEMODELFRAME }, { "definemodelanim", T_DEFINEMODELANIM }, @@ -99,6 +103,8 @@ static tokenlist basetokens[] = { "tint", T_TINT }, { "texture", T_TEXTURE }, { "tile", T_TEXTURE }, + { "music", T_MUSIC }, + { "sound", T_SOUND }, // other stuff { "undefmodel", T_UNDEFMODEL }, @@ -127,11 +133,19 @@ static tokenlist modeltokens[] = { "skin", T_SKIN }, { "glow", T_GLOW }, { "detail", T_DETAIL }, + { "redmap", T_REDPAL }, + { "bluepal", T_BLUEPAL }, + { "brownpal",T_BROWNPAL}, + { "greypal", T_GREYPAL }, + { "greenpal",T_GREENPAL}, + { "specpal", T_SPECPAL }, { "hud", T_HUD }, + { "flags", T_FLAGS }, }; static tokenlist modelframetokens[] = { + { "pal", T_PAL }, { "frame", T_FRAME }, { "name", T_FRAME }, { "tile", T_TILE }, @@ -208,6 +222,12 @@ static tokenlist texturetokens[] = { "pal", T_PAL }, { "detail", T_DETAIL }, { "glow", T_GLOW }, + { "redmap", T_REDPAL }, + { "bluepal", T_BLUEPAL }, + { "brownpal",T_BROWNPAL}, + { "greypal", T_GREYPAL }, + { "greenpal",T_GREENPAL}, + { "specpal", T_SPECPAL }, }; static tokenlist texturetokens_pal[] = { @@ -218,6 +238,17 @@ static tokenlist texturetokens_pal[] = { "nocompress", T_NOCOMPRESS }, }; +static tokenlist musictokens[] = +{ + { "id", T_ID }, + { "file", T_FILE }, +}; +static tokenlist soundtokens[] = +{ + { "id", T_ID }, + { "file", T_FILE }, +}; + static int getatoken(scriptfile *sf, tokenlist *tl, int ntokens) { char *tok; @@ -379,6 +410,16 @@ static int defsparser(scriptfile *script) hicsetpalettetint(pal,r,g,b,f); } break; + case T_DEFINECONV: + { + int pal, pal1, pal2; + + if (scriptfile_getsymbol(script,&pal)) break; + if (scriptfile_getnumber(script,&pal1)) break; + if (scriptfile_getnumber(script,&pal2)) break; + setpalconv(pal,pal1,pal2); + } + break; case T_ALPHAHACK: { int tile; @@ -558,7 +599,7 @@ static int defsparser(scriptfile *script) initprintf("Failure loading MD2/MD3 model \"%s\"\n", modelfn); break; } - md_setmisc(lastmodelid,(float)scale, shadeoffs,0.0); + md_setmisc(lastmodelid,(float)scale, shadeoffs,0.0,0); #endif modelskin = lastmodelskin = 0; seenframe = 0; @@ -588,7 +629,7 @@ static int defsparser(scriptfile *script) #if defined(POLYMOST) && defined(USE_OPENGL) for (tilex = ftilenume; tilex <= ltilenume && happy; tilex++) { - switch (md_defineframe(lastmodelid, framename, tilex, max(0,modelskin), 0.0f)) + switch (md_defineframe(lastmodelid, framename, tilex, max(0,modelskin), 0.0f,0)) { case 0: break; @@ -764,7 +805,7 @@ static int defsparser(scriptfile *script) { char *modelend, *modelfn; double scale=1.0, mzadd=0.0; - int shadeoffs=0; + int shadeoffs=0, pal=0, flags=0; modelskin = lastmodelskin = 0; seenframe = 0; @@ -792,6 +833,8 @@ static int defsparser(scriptfile *script) scriptfile_getnumber(script,&shadeoffs); break; case T_ZADD: scriptfile_getdouble(script,&mzadd); break; + case T_FLAGS: + scriptfile_getnumber(script,&flags); break; case T_FRAME: { char *frametokptr = script->ltextptr; @@ -804,6 +847,8 @@ static int defsparser(scriptfile *script) { switch (getatoken(script,modelframetokens,sizeof(modelframetokens)/sizeof(tokenlist))) { + case T_PAL: + scriptfile_getnumber(script,&pal); break; case T_FRAME: scriptfile_getstring(script,&framename); break; case T_TILE: @@ -837,7 +882,7 @@ static int defsparser(scriptfile *script) #if defined(POLYMOST) && defined(USE_OPENGL) for (tilex = ftilenume; tilex <= ltilenume && happy; tilex++) { - switch (md_defineframe(lastmodelid, framename, tilex, max(0,modelskin), smoothduration)) + switch (md_defineframe(lastmodelid, framename, tilex, max(0,modelskin), smoothduration,pal)) { case 0: break; @@ -915,6 +960,7 @@ static int defsparser(scriptfile *script) } break; case T_SKIN: case T_DETAIL: case T_GLOW: +case T_REDPAL: case T_BLUEPAL: case T_BROWNPAL: case T_GREYPAL: case T_GREENPAL: case T_SPECPAL: { char *skintokptr = script->ltextptr; char *skinend, *skinfn = 0; @@ -946,13 +992,23 @@ static int defsparser(scriptfile *script) if (seenframe) { modelskin = ++lastmodelskin; } seenframe = 0; - if (token == T_DETAIL) + switch (token) { + case T_REDPAL: palnum = REDPAL; break; + case T_BLUEPAL: palnum = BLUEPAL; break; + case T_BROWNPAL:palnum = BROWNPAL;break; + case T_GREYPAL: palnum = GREYPAL; break; + case T_GREENPAL:palnum = GREENPAL;break; + case T_SPECPAL: palnum = SPECPAL; break; + + case T_DETAIL: palnum = DETAILPAL; param = 1.0f / param; - } - else if (token == T_GLOW) + break; + case T_GLOW: palnum = GLOWPAL; + break; + } #if defined(POLYMOST) && defined(USE_OPENGL) switch (md_defineskin(lastmodelid, skinfn, palnum, max(0,modelskin), surfnum, param)) @@ -1059,7 +1115,7 @@ static int defsparser(scriptfile *script) } #if defined(POLYMOST) && defined(USE_OPENGL) - md_setmisc(lastmodelid,(float)scale,shadeoffs,(float)mzadd); + md_setmisc(lastmodelid,(float)scale,shadeoffs,(float)mzadd,flags); #endif modelskin = lastmodelskin = 0; @@ -1217,6 +1273,9 @@ static int defsparser(scriptfile *script) char *texturetokptr = script->ltextptr, *textureend; int tile=-1, token; + char *fnB=0; double alphacutB=0, xscaleB=0, yscaleB=0; char flagsB=0; + int palmapbits=0;int palbits=0; + if (scriptfile_getsymbol(script,&tile)) break; if (scriptfile_getbraces(script,&textureend)) break; while (script->textptr < textureend) @@ -1287,9 +1346,12 @@ static int defsparser(scriptfile *script) yscale = 1.0f / yscale; hicsetsubsttex(tile,pal,fn,alphacut,xscale,yscale,flags); + fnB=fn;alphacutB=alphacut;xscaleB=xscale;yscaleB=yscale;flagsB=flags; + if (pal<30)palbits|=1<ltextptr, *detailend; int pal = 0, i; @@ -1340,15 +1402,24 @@ static int defsparser(scriptfile *script) else Bfree(tfn); pathsearchmode = i; - if (token == T_DETAIL) + switch (token) { + case T_REDPAL: pal = REDPAL; palmapbits|=32;break; + case T_BLUEPAL: pal = BLUEPAL; palmapbits|=16;break; + case T_BROWNPAL:pal = BROWNPAL;palmapbits|= 8;break; + case T_GREYPAL: pal = GREYPAL; palmapbits|= 4;break; + case T_GREENPAL:pal = GREENPAL;palmapbits|= 2;break; + case T_SPECPAL: pal = SPECPAL; palmapbits|= 1;break; + + case T_DETAIL: pal = DETAILPAL; xscale = 1.0f / xscale; yscale = 1.0f / yscale; - } - else if (token == T_GLOW) + break; + case T_GLOW: pal = GLOWPAL; - + break; + } hicsetsubsttex(tile,pal,fn,-1.0,xscale,yscale,flags); } break; @@ -1357,6 +1428,12 @@ static int defsparser(scriptfile *script) } } + int i; + if (palmapbits&&fnB) + for (i=0;i<=25;i++) + if (!(palbits&(1<= (unsigned)MAXTILES) { initprintf("Error: missing or invalid 'tile number' for texture definition near line %s:%d\n", @@ -1415,7 +1492,7 @@ static int defsparser(scriptfile *script) } #if defined(POLYMOST) && defined(USE_OPENGL) - mid = md_tilehasmodel(r0); + mid = md_tilehasmodel(r0,0); if (mid < 0) break; md_undefinemodel(mid); @@ -1461,6 +1538,46 @@ static int defsparser(scriptfile *script) } break; + case T_MUSIC: + { + char *tinttokptr = script->ltextptr; + char *ID=0,*ext=""; + char *musicend; + + if (scriptfile_getbraces(script,&musicend)) break; + while (script->textptr < musicend) + { + switch (getatoken(script,musictokens,sizeof(musictokens)/sizeof(tokenlist))) + { + case T_ID: + scriptfile_getstring(script,&ID); break; + case T_FILE: + scriptfile_getstring(script,&ext); + } + } + } + break; + + case T_SOUND: + { + char *tinttokptr = script->ltextptr; + char *name=0;int num=0; + char *musicend; + + if (scriptfile_getbraces(script,&musicend)) break; + while (script->textptr < musicend) + { + switch (getatoken(script,soundtokens,sizeof(soundtokens)/sizeof(tokenlist))) + { + case T_ID: + scriptfile_getsymbol(script,&num);break; + case T_FILE: + scriptfile_getstring(script,&name); + } + } + } + break; + default: initprintf("Unknown token.\n"); break; } diff --git a/polymer/build/src/engine.c b/polymer/build/src/engine.c index 6291f8087..ae5528b55 100644 --- a/polymer/build/src/engine.c +++ b/polymer/build/src/engine.c @@ -7275,7 +7275,9 @@ int loadmaphack(char *filename) T_ROLL, T_MDXOFF, T_MDYOFF, - T_MDZOFF + T_MDZOFF, + T_AWAY1, + T_AWAY2, }; static struct { char *text; int tokenid; } legaltokens[] = @@ -7294,6 +7296,8 @@ int loadmaphack(char *filename) { "mdxoff", T_MDXOFF }, { "mdyoff", T_MDYOFF }, { "mdzoff", T_MDZOFF }, + { "away1", T_AWAY1 }, + { "away2", T_AWAY2 }, { NULL, -1 } }; @@ -7434,8 +7438,27 @@ int loadmaphack(char *filename) } spriteext[whichsprite].zoff = i; } - break; + case T_AWAY1: // away1 + if (whichsprite < 0) + { + // no sprite directive preceeding + initprintf("Ignoring moving away directive because of absent/invalid sprite number on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + spriteext[whichsprite].flags |= SPREXT_AWAY1; + break; + case T_AWAY2: // away2 + if (whichsprite < 0) + { + // no sprite directive preceeding + initprintf("Ignoring moving away directive because of absent/invalid sprite number on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + spriteext[whichsprite].flags |= SPREXT_AWAY2; + break; default: // unrecognised token @@ -7559,13 +7582,14 @@ int saveboard(char *filename, int *daposx, int *daposy, int *daposz, if (tspri == NULL) break; - Bmemcpy(&tspri[0], &sprite[0], sizeof(spritetype) * numsprites); - for (j=0;jx = B_LITTLE32(spri->x); spri->y = B_LITTLE32(spri->y); spri->z = B_LITTLE32(spri->z); @@ -7581,6 +7605,7 @@ int saveboard(char *filename, int *daposx, int *daposy, int *daposz, spri->lotag = B_LITTLE16(spri->lotag); spri->hitag = B_LITTLE16(spri->hitag); spri->extra = B_LITTLE16(spri->extra); + i = nextspritestat[i];spri++; } } diff --git a/polymer/build/src/hightile.c b/polymer/build/src/hightile.c index d6a4fa27c..0939402b8 100644 --- a/polymer/build/src/hightile.c +++ b/polymer/build/src/hightile.c @@ -70,6 +70,7 @@ void hicinit(void) int i,j; hicreplctyp *hr, *next; + clearconv(); for (i=0;i=1550&&tile<=1589){initprintf("(%d, %d)\n",tile,pallet);pallet=0;} + while ((tile=tile2model[tile].next)!=-1) + if (tile2model[tile].pal==pallet) + return tile; + return t; +} //Move this to appropriate place! typedef struct { float xadd, yadd, zadd; short angadd, flags; } hudtyp; @@ -209,6 +238,7 @@ static GLuint* indexvbos = NULL; mdmodel *mdload(const char *); int mddraw(spritetype *); void mdfree(mdmodel *); +int globalnoeffect=0; extern int timerticspersec; @@ -225,6 +255,7 @@ static void freeallmodels() } memset(tile2model,-1,sizeof(tile2model)); + curextra=MAXTILES; if (vertlist) { @@ -315,7 +346,7 @@ int md_loadmodel(const char *fn) return(nextmodelid-1); } -int md_setmisc(int modelid, float scale, int shadeoff, float zadd) +int md_setmisc(int modelid, float scale, int shadeoff, float zadd, int flags) { mdmodel *m; @@ -326,14 +357,15 @@ int md_setmisc(int modelid, float scale, int shadeoff, float zadd) m->bscale = scale; m->shadeoff = shadeoff; m->zadd = zadd; + m->flags = flags; return 0; } -int md_tilehasmodel(int tilenume) +int md_tilehasmodel(int tilenume,int pal) { if (!mdinited) return -1; - return tile2model[tilenume].modelid; + return tile2model[Ptile2tile(tilenume,pal)].modelid; } static int framename2index(mdmodel *vm, const char *nam) @@ -364,7 +396,7 @@ static int framename2index(mdmodel *vm, const char *nam) return(i); } -int md_defineframe(int modelid, const char *framename, int tilenume, int skinnum, float smoothduration) +int md_defineframe(int modelid, const char *framename, int tilenume, int skinnum, float smoothduration, int pal) { void *vm; md2model *m; @@ -376,6 +408,7 @@ int md_defineframe(int modelid, const char *framename, int tilenume, int skinnum if ((unsigned int)tilenume >= (unsigned int)MAXTILES) return(-2); if (!framename) return(-3); + tilenume=addtileP(modelid,tilenume,pal); m = (md2model *)models[modelid]; if (m->mdnum == 1) { @@ -467,6 +500,7 @@ int md_defineskin(int modelid, const char *skinfn, int palnum, int skinnum, int sk->fn = (char *)malloc(strlen(skinfn)+1); if (!sk->fn) return(-4); strcpy(sk->fn, skinfn); + sk->palmap=0; return 0; } @@ -493,6 +527,7 @@ int md_undefinetile(int tile) if ((unsigned)tile >= (unsigned)MAXTILES) return -1; tile2model[tile].modelid = -1; + tile2model[tile].next=-1; return 0; } @@ -502,7 +537,7 @@ int md_undefinemodel(int modelid) if (!mdinited) return 0; if ((unsigned int)modelid >= (unsigned int)nextmodelid) return -1; - for (i=MAXTILES-1; i>=0; i--) + for (i=MAXTILES+EXTRATILES-1; i>=0; i--) if (tile2model[i].modelid == modelid) tile2model[i].modelid = -1; @@ -515,7 +550,105 @@ int md_undefinemodel(int modelid) return 0; } -static int daskinloader(int filh, int *fptr, int *bpl, int *sizx, int *sizy, int *osizx, int *osizy, char *hasalpha, char effect) +md2model *modelhead; +mdskinmap_t *skhead; + +typedef struct +{ + int pal,pal1,pal2; +} palmaptr; +palmaptr palconv[MAXPALCONV]; + +void clearconv() +{ + Bmemset(palconv,0,sizeof(palconv)); +} +void setpalconv(int pal,int pal1,int pal2) +{ + int i; + for (i=0;iskinmap; sk; sk = sk->next) + if ((int)sk->palette == pal1&&sk->palmap)break; + if (!sk||sk->size!=sizx*sizy)continue; + + applypalmap(pic,sk->palmap,sk->size,pal2); + } +} + +static int daskinloader(int filh, int *fptr, int *bpl, int *sizx, int *sizy, int *osizx, int *osizy, char *hasalpha, int pal, char effect) { int picfillen, j,y,x; char *picfil,*cptr,al=255; @@ -551,6 +684,7 @@ static int daskinloader(int filh, int *fptr, int *bpl, int *sizx, int *sizy, int { free(picfil); free(pic); return -1; } free(picfil); + applypalmapSkin((char *)pic,tsizx,tsizy,pal); cptr = &britable[gammabrightness ? 0 : curbrightness][0]; for (y=0,j=0;ypalette == pal && sk->skinnum == number && sk->surfnum == surf) { skinfile = sk->fn; - texidx = &sk->texid[ hictinting[pal].f ]; + texidx = &sk->texid[(globalnoeffect)?0:hictinting[pal].f ]; strcpy(fn,skinfile); //OSD_Printf("Using exact match skin (pal=%d,skinnum=%d,surfnum=%d) %s\n",pal,number,surf,skinfile); break; @@ -745,7 +880,7 @@ static int mdloadskin(md2model *m, int number, int pal, int surf) if (skzero) { skinfile = skzero->fn; - texidx = &skzero->texid[ hictinting[pal].f ]; + texidx = &skzero->texid[(globalnoeffect)?0:hictinting[pal].f ]; strcpy(fn,skinfile); //OSD_Printf("Using def skin 0,0 as fallback, pal=%d\n", pal); } @@ -753,11 +888,12 @@ static int mdloadskin(md2model *m, int number, int pal, int surf) { if ((unsigned)number >= (unsigned)m->numskins) number = 0; skinfile = m->skinfn + number*64; - texidx = &m->texid[ number * (HICEFFECTMASK+1) + hictinting[pal].f ]; + texidx = &m->texid[ number * (HICEFFECTMASK+1) + (globalnoeffect)?0:hictinting[pal].f ]; strcpy(fn,m->basepath); strcat(fn,skinfile); //OSD_Printf("Using MD2/MD3 skin (%d) %s, pal=%d\n",number,skinfile,pal); } } + skhead=sk; // for palmaps if (!skinfile[0]) return 0; if (*texidx) return *texidx; @@ -766,10 +902,10 @@ static int mdloadskin(md2model *m, int number, int pal, int surf) if (pal >= (MAXPALOOKUPS - RESERVEDPALS)) for (i=0;iskinmap; skzero; skzero = skzero->next) - if (!Bstrcasecmp(skzero->fn, sk->fn) && skzero->texid[hictinting[pal].f]) + if (!Bstrcasecmp(skzero->fn, sk->fn) && skzero->texid[(globalnoeffect)?0:hictinting[pal].f]) { - sk->texid[hictinting[pal].f] = skzero->texid[hictinting[pal].f]; - return sk->texid[hictinting[pal].f]; + sk->texid[(globalnoeffect)?0:hictinting[pal].f] = skzero->texid[(globalnoeffect)?0:hictinting[pal].f]; + return sk->texid[(globalnoeffect)?0:hictinting[pal].f]; } *texidx = 0; @@ -784,8 +920,8 @@ static int mdloadskin(md2model *m, int number, int pal, int surf) picfillen = kfilelength(filh); kclose(filh); // FIXME: shouldn't have to do this. bug in cache1d.c - cachefil = mdloadskin_trytexcache(fn, picfillen, hictinting[pal].f, &cachead); - if (cachefil >= 0 && !mdloadskin_cached(cachefil, &cachead, &doalloc, texidx, &xsiz, &ysiz)) + cachefil = mdloadskin_trytexcache(fn, picfillen, pal<<8, (globalnoeffect)?0:hictinting[pal].f, &cachead); + if (cachefil >= 0 && !mdloadskin_cached(cachefil, &cachead, &doalloc, texidx, &xsiz, &ysiz, pal)) { osizx = cachead.xdim; osizy = cachead.ydim; @@ -800,7 +936,7 @@ static int mdloadskin(md2model *m, int number, int pal, int surf) cachefil = -1; // the compressed version will be saved to disk if ((filh = kopen4load(fn, 0)) < 0) return -1; - if (daskinloader(filh,&fptr,&bpl,&xsiz,&ysiz,&osizx,&osizy,&hasalpha,hictinting[pal].f)) + if (daskinloader(filh,&fptr,&bpl,&xsiz,&ysiz,&osizx,&osizy,&hasalpha,pal,(globalnoeffect)?0:hictinting[pal].f)) { kclose(filh); initprintf("Failed loading skin file \"%s\"\n", fn); @@ -818,6 +954,18 @@ static int mdloadskin(md2model *m, int number, int pal, int surf) else if (!hasalpha) intexfmt = GL_RGB; if (glinfo.bgra) texfmt = GL_BGRA; uploadtexture((doalloc&1), xsiz, ysiz, intexfmt, texfmt, (coltype*)fptr, xsiz, ysiz, 0); + if (pal>=SPECPAL&&pal<=REDPAL) + { + //_initprintf("%cLoaded palmap %d(%dx%d)",sk->palmap?'+':'-',pal,xsiz,ysiz); + if (!sk->palmap) + { + sk->size=xsiz*ysiz; + sk->palmap=malloc(sk->size*4); + memcpy(sk->palmap,(char *)fptr,sk->size*4); + } + cachefil=0; + //_initprintf("#%d\n",sk->palmap); + } free((void*)fptr); } @@ -876,7 +1024,7 @@ static int mdloadskin(md2model *m, int number, int pal, int surf) if (ysiz == pow2long[j]) { i |= 2; } } cachead.flags = (i!=3) | (hasalpha ? 2 : 0); - writexcache(fn, picfillen, 0, hictinting[pal].f, &cachead); + writexcache(fn, picfillen, pal<<8, (globalnoeffect)?0:hictinting[pal].f, &cachead); } return(*texidx); @@ -891,23 +1039,22 @@ static void updateanimation(md2model *m, spritetype *tspr) int i, j, k; int fps; + m->cframe = m->nframe = tile2model[Ptile2tile(tspr->picnum,tspr->pal)].framenum; if (mdpause) { // spriteext[tspr->owner].mdanimtims = mdtims; m->interpol = 0; spriteext[tspr->owner].mdanimtims = mdtims; - m->nframe = m->cframe; + spriteext[tspr->picnum].mdanimtims = mdtims; return; } - m->cframe = m->nframe = tile2model[tspr->picnum].framenum; - for (anim = m->animations; anim && anim->startframe != m->cframe; anim = anim->next) ; if (!anim) { - if (r_animsmoothing && (tile2model[tspr->picnum].smoothduration != 0) && (spritesmooth[tspr->owner].mdoldframe != m->cframe)) + if (r_animsmoothing && (tile2model[Ptile2tile(tspr->picnum,tspr->pal)].smoothduration != 0) && (spritesmooth[tspr->owner].mdoldframe != m->cframe)) { if (spritesmooth[tspr->owner].mdsmooth == 0) { @@ -916,7 +1063,7 @@ static void updateanimation(md2model *m, spritetype *tspr) spritesmooth[tspr->owner].mdsmooth = 1; spritesmooth[tspr->owner].mdcurframe = m->cframe; } - if (r_animsmoothing && (tile2model[tspr->picnum].smoothduration != 0) && (spritesmooth[tspr->owner].mdcurframe != m->cframe)) + if (r_animsmoothing && (tile2model[Ptile2tile(tspr->picnum,tspr->pal)].smoothduration != 0) && (spritesmooth[tspr->owner].mdcurframe != m->cframe)) { spriteext[tspr->owner].mdanimtims = mdtims; m->interpol = 0; @@ -925,7 +1072,7 @@ static void updateanimation(md2model *m, spritetype *tspr) spritesmooth[tspr->owner].mdcurframe = m->cframe; } } - else if (r_animsmoothing && (tile2model[tspr->picnum].smoothduration != 0) && (spritesmooth[tspr->owner].mdcurframe != m->cframe)) + else if (r_animsmoothing && (tile2model[Ptile2tile(tspr->picnum,tspr->pal)].smoothduration != 0) && (spritesmooth[tspr->owner].mdcurframe != m->cframe)) { spriteext[tspr->owner].mdanimtims = mdtims; m->interpol = 0; @@ -947,7 +1094,7 @@ static void updateanimation(md2model *m, spritetype *tspr) spriteext[tspr->owner].mdanimcur = (short)anim->startframe; spriteext[tspr->owner].mdanimtims = mdtims; m->interpol = 0; - if (!r_animsmoothing || (tile2model[tspr->picnum].smoothduration == 0)) + if (!r_animsmoothing || (tile2model[Ptile2tile(tspr->picnum,tspr->pal)].smoothduration == 0)) { m->cframe = m->nframe = anim->startframe; return; @@ -959,7 +1106,7 @@ static void updateanimation(md2model *m, spritetype *tspr) } if (spritesmooth[tspr->owner].mdsmooth) - fps = (1.0f / (float)(tile2model[tspr->picnum].smoothduration)) * 66; + fps = (1.0f / (float)(tile2model[Ptile2tile(tspr->picnum,tspr->pal)].smoothduration)) * 66; else fps = anim->fpssc; @@ -1229,6 +1376,11 @@ static md2model *md2load(int fil, const char *filnam) if (m->numskins > 0) { sk->fn = (char *)malloc(strlen(m->basepath)+strlen(m->skinfn)+1); + if (sk->palmap) + { + //_initprintf("Delete %s",m->skinfn); + sk->palmap=0;sk->size=0; + } strcpy(sk->fn, m->basepath); strcat(sk->fn, m->skinfn); } @@ -1463,8 +1615,9 @@ static int md3draw(md3model *m, spritetype *tspr) point3d fp, fp1, fp2, m0, m1, a0, a1; md3xyzn_t *v0, *v1; int i, j, k, l, surfi, *lptr; - float f, g, k0, k1, k2, k3, k4, k5, k6, k7, mat[16], pc[4], mult; + float f, g, k0, k1, k2, k3, k4, k5, k6, k7, mat[16], mult; md3surf_t *s; + GLfloat pc[4],pc1[4]; int texunits = GL_TEXTURE0_ARB; mdskinmap_t *sk; //PLAG : sorting stuff @@ -1490,14 +1643,14 @@ static int md3draw(md3model *m, spritetype *tspr) m0.x = m->scale * g; m1.x = m->scale *f; m0.y = m->scale * g; m1.y = m->scale *f; m0.z = m->scale * g; m1.z = m->scale *f; - a0.x = a0.y = 0; a0.z = m->zadd*m->scale; + a0.x = a0.y = 0; a0.z = ((globalorientation&8)?-m->zadd:m->zadd)*m->scale; } else { m0.x = (1.0/64.0) * m->scale * g; m1.x = (1.0/64.0) * m->scale *f; m0.y = (1.0/64.0) * m->scale * g; m1.y = (1.0/64.0) * m->scale *f; m0.z = (1.0/64.0) * m->scale * g; m1.z = (1.0/64.0) * m->scale *f; - a0.x = a0.y = 0; a0.z = m->zadd*m->scale; + a0.x = a0.y = 0; a0.z = ((globalorientation&8)?-m->zadd:m->zadd)*m->scale; } @@ -1581,15 +1734,19 @@ static int md3draw(md3model *m, spritetype *tspr) bglEnable(GL_TEXTURE_2D); pc[0] = pc[1] = pc[2] = ((float)(numpalookups-min(max((globalshade * shadescale)+m->shadeoff,0),numpalookups)))/((float)numpalookups); - pc[0] *= (float)hictinting[globalpal].r / 255.0; - pc[1] *= (float)hictinting[globalpal].g / 255.0; - pc[2] *= (float)hictinting[globalpal].b / 255.0; - if (hictinting[MAXPALOOKUPS-1].r != 255 || hictinting[MAXPALOOKUPS-1].g != 255 || hictinting[MAXPALOOKUPS-1].b != 255) + if (!(m->flags&1)) { - pc[0] *= (float)hictinting[MAXPALOOKUPS-1].r / 255.0; - pc[1] *= (float)hictinting[MAXPALOOKUPS-1].g / 255.0; - pc[2] *= (float)hictinting[MAXPALOOKUPS-1].b / 255.0; + pc[0] *= (float)hictinting[globalpal].r / 255.0; + pc[1] *= (float)hictinting[globalpal].g / 255.0; + pc[2] *= (float)hictinting[globalpal].b / 255.0; + if (hictinting[MAXPALOOKUPS-1].r != 255 || hictinting[MAXPALOOKUPS-1].g != 255 || hictinting[MAXPALOOKUPS-1].b != 255) + { + pc[0] *= (float)hictinting[MAXPALOOKUPS-1].r / 255.0; + pc[1] *= (float)hictinting[MAXPALOOKUPS-1].g / 255.0; + pc[2] *= (float)hictinting[MAXPALOOKUPS-1].b / 255.0; + } } + else globalnoeffect=1; if (tspr->cstat&2) { if (!(tspr->cstat&512)) pc[3] = 0.66; else pc[3] = 0.33; } else pc[3] = 1.0; @@ -1699,12 +1856,17 @@ static int md3draw(md3model *m, spritetype *tspr) mat[3] = mat[7] = mat[11] = 0.f; mat[15] = 1.f; bglLoadMatrixf(mat); // PLAG: End - i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,globalpal,surfi); if (!i) continue; - //i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,surfi); //hack for testing multiple surfaces per MD3 + + int pal1; + for (pal1=SPECPAL;pal1<=REDPAL;pal1++) + mdloadskin((md2model *)m,tile2model[Ptile2tile(tspr->picnum,tspr->pal)].skinnum,pal1,surfi); + + i = mdloadskin((md2model *)m,tile2model[Ptile2tile(tspr->picnum,tspr->pal)].skinnum,globalpal,surfi); if (!i) continue; + //i = mdloadskin((md2model *)m,tile2model[Ptile2tile(tspr->picnum,tspr->pal)].skinnum,surfi); //hack for testing multiple surfaces per MD3 bglBindTexture(GL_TEXTURE_2D, i); if (r_detailmapping && !r_depthpeeling && !(tspr->cstat&1024)) - i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,DETAILPAL,surfi); + i = mdloadskin((md2model *)m,tile2model[Ptile2tile(tspr->picnum,tspr->pal)].skinnum,DETAILPAL,surfi); else i = 0; @@ -1734,7 +1896,7 @@ static int md3draw(md3model *m, spritetype *tspr) bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); for (sk = m->skinmap; sk; sk = sk->next) - if ((int)sk->palette == DETAILPAL && sk->skinnum == tile2model[tspr->picnum].skinnum && sk->surfnum == surfi) + if ((int)sk->palette == DETAILPAL && sk->skinnum == tile2model[Ptile2tile(tspr->picnum,tspr->pal)].skinnum && sk->surfnum == surfi) f = sk->param; bglMatrixMode(GL_TEXTURE); @@ -1744,7 +1906,7 @@ static int md3draw(md3model *m, spritetype *tspr) } if (r_glowmapping && !r_depthpeeling && !(tspr->cstat&1024)) - i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,GLOWPAL,surfi); + i = mdloadskin((md2model *)m,tile2model[Ptile2tile(tspr->picnum,tspr->pal)].skinnum,GLOWPAL,surfi); else i = 0; @@ -1946,6 +2108,7 @@ static int md3draw(md3model *m, spritetype *tspr) } bglLoadIdentity(); + globalnoeffect=0; return 1; } @@ -1967,6 +2130,11 @@ static void md3free(md3model *m) { nsk = sk->next; free(sk->fn); + if (sk->palmap) + { + //_initprintf("Kill %d\n",sk->palette); + free(sk->palmap);sk->palmap=0; + } free(sk); } @@ -2686,7 +2854,7 @@ static int voxdraw(voxmodel *m, spritetype *tspr) m0.x = m->scale; m0.y = m->scale; m0.z = m->scale; - a0.x = a0.y = 0; a0.z = m->zadd*m->scale; + a0.x = a0.y = 0; a0.z = ((globalorientation&8)?-m->zadd:m->zadd)*m->scale; //if (globalorientation&8) //y-flipping //{ @@ -2884,7 +3052,7 @@ int mddraw(spritetype *tspr) allocmodelverts = maxmodelverts; } - vm = models[tile2model[tspr->picnum].modelid]; + vm = models[tile2model[Ptile2tile(tspr->picnum,tspr->pal)].modelid]; if (vm->mdnum == 1) { return voxdraw((voxmodel *)vm,tspr); } if (vm->mdnum == 3) { return md3draw((md3model *)vm,tspr); } return 0; diff --git a/polymer/build/src/osd.c b/polymer/build/src/osd.c index 7bbfa0a22..aae79f2a7 100644 --- a/polymer/build/src/osd.c +++ b/polymer/build/src/osd.c @@ -590,7 +590,7 @@ int OSD_HandleKey(int sc, int press) { } else if (sc == 1) // escape -{ + { // OSD_ShowDisplay(0); osdscroll = -1; osdrowscur += osdscroll; diff --git a/polymer/build/src/polymost.c b/polymer/build/src/polymost.c index d0a32567a..ed9667ffd 100644 --- a/polymer/build/src/polymost.c +++ b/polymer/build/src/polymost.c @@ -364,8 +364,10 @@ static pthtyp *gltexcachead[GLTEXCACHEADSIZ]; static int drawingskybox = 0; +pthtyp *pichead; + int gloadtile_art(int,int,int,pthtyp*,int); -int gloadtile_hi(int,int,hicreplctyp*,int,pthtyp*,int,char); +int gloadtile_hi(int,int,int,hicreplctyp*,int,pthtyp*,int,char); static int hicprecaching = 0; pthtyp * gltexcache(int dapicnum, int dapalnum, int dameth) { @@ -389,8 +391,9 @@ pthtyp * gltexcache(int dapicnum, int dapalnum, int dameth) * effects are applied to the palette 0 texture if it exists */ + pichead=gltexcachead[j]; // for palmaps // load a replacement - for (pth=gltexcachead[j]; pth; pth=pth->next) + for (pth=pichead; pth; pth=pth->next) { if (pth->picnum == dapicnum && pth->palnum == si->palnum && @@ -402,7 +405,7 @@ pthtyp * gltexcache(int dapicnum, int dapalnum, int dameth) if (pth->flags & 128) { pth->flags &= ~128; - if (gloadtile_hi(dapicnum,drawingskybox,si,dameth,pth,0, + if (gloadtile_hi(dapicnum,dapalnum,drawingskybox,si,dameth,pth,0, (si->palnum>0) ? 0 : hictinting[dapalnum].f)) // reload tile { if (drawingskybox) return NULL; @@ -430,12 +433,18 @@ pthtyp * gltexcache(int dapicnum, int dapalnum, int dameth) if (pth2->flags & 8) pth->flags |= 8; //hasalpha pth->hicr = si; pth->next = gltexcachead[j]; + if (pth->palmap) + { + //_initprintf("Realloc #%d->#%d\n",pth2->palmap, pth->palmap); + pth->palmap=malloc(pth->size*4); + memcpy(pth->palmap, pth2->palmap, pth->size*4); + } gltexcachead[j] = pth; return(pth); } } - if (gloadtile_hi(dapicnum,drawingskybox,si,dameth,pth,1, (si->palnum>0) ? 0 : hictinting[dapalnum].f)) + if (gloadtile_hi(dapicnum,dapalnum,drawingskybox,si,dameth,pth,1, (si->palnum>0) ? 0 : hictinting[dapalnum].f)) { free(pth); if (drawingskybox) return NULL; @@ -642,6 +651,11 @@ void polymost_glreset() free(pth->ofb); } bglDeleteTextures(1,&pth->glpic); + if (pth->palmap) + { + //_initprintf("Kill #%d\n",pth->palmap); + free(pth->palmap);pth->palmap=0; + } free(pth); pth = next; } @@ -1353,7 +1367,7 @@ failure: if (packbuf) free(packbuf); } -int gloadtile_cached(int fil, texcacheheader *head, int *doalloc, pthtyp *pth) +int gloadtile_cached(int fil, texcacheheader *head, int *doalloc, pthtyp *pth,int dapalnum) { int level, r; texcachepicture pict; @@ -1417,8 +1431,26 @@ failure: return -1; } // --------------------------------------------------- JONOF'S COMPRESSED TEXTURE CACHE STUFF +static void applypalmapsT(char *pic, int sizx, int sizy, int pal) +{ + //_initprintf("%d\n",pal); + int stage; + for (stage=0;stagenext) + if (pth->palnum ==pal1&&pth->palmap)break; + if (!pth||pth->size!=sizx*sizy)continue; + + applypalmap(pic,pth->palmap,pth->size,pal2); + } +} + +int gloadtile_hi(int dapic,int dapalnum, int facen, hicreplctyp *hicr, int dameth, pthtyp *pth, int doalloc, char effect) { coltype *pic = NULL, *rpptr; int j, x, y, x2, y2, xsiz=0, ysiz=0, tsizx, tsizy; @@ -1456,8 +1488,8 @@ int gloadtile_hi(int dapic, int facen, hicreplctyp *hicr, int dameth, pthtyp *pt kclose(filh); // FIXME: shouldn't have to do this. bug in cache1d.c - cachefil = trytexcache(fn, picfillen, dameth, effect, &cachead); - if (cachefil >= 0 && !gloadtile_cached(cachefil, &cachead, &doalloc, pth)) + cachefil = trytexcache(fn, picfillen+(dapalnum<<8), dameth, effect, &cachead); + if (cachefil >= 0 && !gloadtile_cached(cachefil, &cachead, &doalloc, pth, dapalnum)) { tsizx = cachead.xdim; tsizy = cachead.ydim; @@ -1498,6 +1530,7 @@ int gloadtile_hi(int dapic, int facen, hicreplctyp *hicr, int dameth, pthtyp *pt pic = (coltype *)calloc(xsiz,ysiz*sizeof(coltype)); if (!pic) { free(picfil); return 1; } if (kprender(picfil,picfillen,(int)pic,xsiz*sizeof(coltype),xsiz,ysiz,0,0)) { free(picfil); free(pic); return -2; } + applypalmapsT((char *)pic,tsizx,tsizy,dapalnum); for (y=0,j=0;yglpic); //# of textures (make OpenGL allocate structure) bglBindTexture(GL_TEXTURE_2D,pth->glpic); + if (dapalnum>=SPECPAL&&dapalnum<=REDPAL) + { + //_initprintf("%cLoaded palamp %d(%dx%d)",pth->palmap?'+':'-',dapalnum,xsiz,ysiz); + if (!pth->palmap) + { + pth->size=xsiz*ysiz; + pth->palmap=malloc(pth->size*4); + memcpy(pth->palmap,pic,pth->size*4); + } + cachefil=0; + //_initprintf("#%d\n",pth->palmap); + } fixtransparency(pic,tsizx,tsizy,xsiz,ysiz,dameth); uploadtexture(doalloc,xsiz,ysiz,intexfmt,texfmt,pic,-1,tsizy,dameth); } @@ -1618,7 +1663,7 @@ int gloadtile_hi(int dapic, int facen, hicreplctyp *hicr, int dameth, pthtyp *pt if (ysiz == pow2long[j]) { x |= 2; } } cachead.flags = (x!=3) | (hasalpha != 255 ? 2 : 0); - writexcache(fn, picfillen, dameth, effect, &cachead); + writexcache(fn, picfillen+(dapalnum<<8), dameth, effect, &cachead); } return 0; @@ -1642,8 +1687,9 @@ void drawpoly(double *dpx, double *dpy, int n, int method) int i, j, k, x, y, z, nn, ix0, ix1, mini, maxi, tsizx, tsizy, tsizxm1 = 0, tsizym1 = 0, ltsizy = 0; int xx, yy, xi, d0, u0, v0, d1, u1, v1, xmodnice = 0, ymulnice = 0, dorot; char dacol = 0, *walptr, *palptr = NULL, *vidp, *vide; + GLfloat pc1[4]; #ifdef USE_OPENGL - pthtyp *pth, *detailpth, *glowpth; + pthtyp *pth, *detailpth, *glowpth, *palpth; int texunits = GL_TEXTURE0_ARB; #endif // backup of the n for possible redrawing of fullbright @@ -1730,6 +1776,11 @@ void drawpoly(double *dpx, double *dpy, int n, int method) { float hackscx, hackscy; + int pal1; + for (pal1=SPECPAL;pal1<=REDPAL;pal1++) + if (hicfindsubst(globalpicnum, pal1, 0)) + gltexcache(globalpicnum, pal1, method&(~3)); + if (skyclamphack) method |= 4; pth = gltexcache(globalpicnum,globalpal,method&(~3)); @@ -4321,7 +4372,7 @@ void polymost_drawsprite(int snum) while (rendmode >= 3 && !(spriteext[tspr->owner].flags&SPREXT_NOTMD)) { - if (usemodels && tile2model[tspr->picnum].modelid >= 0 && tile2model[tspr->picnum].framenum >= 0) + if (usemodels && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].modelid >= 0 && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].framenum >= 0) { if (mddraw(tspr)) return; break; // else, render as flat sprite @@ -4345,6 +4396,18 @@ void polymost_drawsprite(int snum) bglPolygonOffset(-curpolygonoffset, -curpolygonoffset); } #endif + int posx=tspr->x,posy=tspr->y; + if (spriteext[tspr->owner].flags&SPREXT_AWAY1) + { + posx+=(sintable[(tspr->ang+512)&2047]>>13); + posy+=(sintable[(tspr->ang)&2047]>>13); + } + else + if (spriteext[tspr->owner].flags&SPREXT_AWAY2) + { + posx-=(sintable[(tspr->ang+512)&2047]>>13); + posy-=(sintable[(tspr->ang)&2047]>>13); + } switch ((globalorientation>>4)&3) { @@ -4402,8 +4465,8 @@ void polymost_drawsprite(int snum) xv = (float)tspr->xrepeat * (float)sintable[(tspr->ang)&2047] / 65536.0; yv = (float)tspr->xrepeat * (float)sintable[(tspr->ang+1536)&2047] / 65536.0; f = (float)(tilesizx[globalpicnum]>>1) + (float)xoff; - x0 = (float)(tspr->x-globalposx) - xv*f; x1 = xv*(float)tilesizx[globalpicnum] + x0; - y0 = (float)(tspr->y-globalposy) - yv*f; y1 = yv*(float)tilesizx[globalpicnum] + y0; + x0 = (float)(posx-globalposx) - xv*f; x1 = xv*(float)tilesizx[globalpicnum] + x0; + y0 = (float)(posy-globalposy) - yv*f; y1 = yv*(float)tilesizx[globalpicnum] + y0; yp0 = x0*gcosang2 + y0*gsinang2; yp1 = x1*gcosang2 + y1*gsinang2; @@ -4633,7 +4696,7 @@ void polymost_dorotatesprite(int sx, int sy, int z, short a, short picnum, #ifdef USE_OPENGL if (rendmode >= 3 && usemodels && hudmem[(dastat&4)>>2][picnum].angadd) { - if ((tile2model[picnum].modelid >= 0) && (tile2model[picnum].framenum >= 0)) + if ((tile2model[Ptile2tile(picnum,dapalnum)].modelid >= 0) && (tile2model[Ptile2tile(picnum,dapalnum)].framenum >= 0)) { spritetype tspr; memset(&tspr,0,sizeof(spritetype)); @@ -5669,12 +5732,17 @@ void polymost_precache(int dapicnum, int dapalnum, int datype) //OSD_Printf("precached %d %d type %d\n", dapicnum, dapalnum, datype); hicprecaching = 1; + int pal1; + for (pal1=SPECPAL;pal1<=REDPAL;pal1++) + if (hicfindsubst(globalpicnum, pal1, 0)) + gltexcache(globalpicnum, pal1, (datype & 1) << 2); + gltexcache(dapicnum, dapalnum, (datype & 1) << 2); hicprecaching = 0; if (datype == 0) return; - mid = md_tilehasmodel(dapicnum); + mid = md_tilehasmodel(dapicnum,dapalnum); if (mid < 0 || models[mid]->mdnum < 2) return; { @@ -5684,7 +5752,11 @@ void polymost_precache(int dapicnum, int dapalnum, int datype) j = ((md3model *)models[mid])->head.numsurfs; for (i=0;i<=j;i++) + { + int pal1; + for (pal1=SPECPAL;pal1<=REDPAL;pal1++)mdloadskin((md2model*)models[mid],0,pal1,i); mdloadskin((md2model*)models[mid], 0, dapalnum, i); + } } #endif } diff --git a/polymer/eduke32/source/actors.c b/polymer/eduke32/source/actors.c index 9242d314a..a9fe738bd 100644 --- a/polymer/eduke32/source/actors.c +++ b/polymer/eduke32/source/actors.c @@ -554,6 +554,16 @@ int ssp(int i,unsigned int cliptype) //The set sprite function return (movetype==0); } + +#undef deletesprite +void deletespriteEVENT(int s) +{ + SetGameVarID(g_iReturnVarID,0, -1, -1); + OnEvent(EVENT_KILLIT, s, myconnectindex, -1); + if (!GetGameVarID(g_iReturnVarID, -1, -1))deletesprite(s); +} +#define deletesprite deletespriteEVENT + void insertspriteq(int i) { if (spriteqamount > 0) @@ -2573,7 +2583,7 @@ static void moveweapons(void) s->xvel=s->xvel>>1; s->zvel=s->zvel>>1; } - goto BOLT; + if (!(hittype[i].projectile.workslike & PROJECTILE_FLAG_FORCEIMPACT))goto BOLT; } checkhitsprite(j,i); @@ -2626,9 +2636,10 @@ static void moveweapons(void) if (hittype[i].projectile.isound > -1) spritesound(hittype[i].projectile.isound,i); - KILLIT(i); + if (!(hittype[i].projectile.workslike & PROJECTILE_FLAG_FORCEIMPACT))KILLIT(i); } + if (hittype[i].projectile.workslike & PROJECTILE_FLAG_FORCEIMPACT)goto BOLT; } else if ((j&49152) == 32768) @@ -3286,7 +3297,7 @@ static void movetransports(void) case 1: if ((sprite[j].picnum == SHARK) || (sprite[j].picnum == COMMANDER) || (sprite[j].picnum == OCTABRAIN) - || ((sprite[j].picnum >= GREENSLIME) && (sprite[j].picnum >= GREENSLIME+7))) + || ((sprite[j].picnum >= GREENSLIME) && (sprite[j].picnum <= GREENSLIME+7))) { if (sprite[j].extra > 0) goto JBOLT; diff --git a/polymer/eduke32/source/astub.c b/polymer/eduke32/source/astub.c index 63c296914..7fd8eaeee 100644 --- a/polymer/eduke32/source/astub.c +++ b/polymer/eduke32/source/astub.c @@ -6143,7 +6143,7 @@ void ExtAnalyzeSprites(void) // else tspr->cstat&=32767; #if defined(USE_OPENGL) && defined(POLYMOST) - if (!usemodels || md_tilehasmodel(tspr->picnum) < 0) + if (!usemodels || md_tilehasmodel(tspr->picnum,tspr->pal) < 0) #endif { if (frames!=0) diff --git a/polymer/eduke32/source/duke3d.h b/polymer/eduke32/source/duke3d.h index 83755bd6c..70767ebe8 100644 --- a/polymer/eduke32/source/duke3d.h +++ b/polymer/eduke32/source/duke3d.h @@ -264,6 +264,9 @@ enum weapons { #define ESCESCAPE if(KB_KeyPressed( sc_Escape ) ) gameexit(" "); #define IFWITHIN(B,E) if((PN)>=(B) && (PN)<=(E)) + +#define deletesprite deletespriteEVENT +void deletespriteEVENT(int s); #define KILLIT(KX) {deletesprite(KX);goto BOLT;} @@ -781,7 +784,8 @@ enum events { EVENT_USE, EVENT_PROCESSINPUT, EVENT_FAKEDOMOVETHINGS, - EVENT_DISPLAYROOMS + EVENT_DISPLAYROOMS, + EVENT_KILLIT }; // store global game definitions @@ -915,7 +919,8 @@ enum projectileflags { PROJECTILE_FLAG_EXPLODEONTIMER = 16384, PROJECTILE_FLAG_RPG_IMPACT = 32768, PROJECTILE_FLAG_RADIUS_PICNUM = 65536, - PROJECTILE_FLAG_ACCURATE_AUTOAIM = 131072 + PROJECTILE_FLAG_ACCURATE_AUTOAIM = 131072, + PROJECTILE_FLAG_FORCEIMPACT = 262144 }; extern proj_struct projectile[MAXTILES], defaultprojectile[MAXTILES]; diff --git a/polymer/eduke32/source/funct.h b/polymer/eduke32/source/funct.h index a595ccb8a..ccc31286d 100644 --- a/polymer/eduke32/source/funct.h +++ b/polymer/eduke32/source/funct.h @@ -197,6 +197,8 @@ extern void fadepal(int r, int g, int b, int start, int end, int step); extern inline int minitextshade(int x,int y,const char *t,int s,int p,int sb); extern inline int gametext_(int small, int starttile, int x,int y,const char *t,int s,int p,int orientation,int x1, int y1, int x2, int y2); +extern inline int gametext_z(int small, int starttile, int x,int y,const char *t,int s,int p,int orientation,int x1, int y1, int x2, int y2,int z); +extern void txdigitalnumberz(int starttile, int x,int y,int n,int s,int pal,int cs,int x1, int y1, int x2, int y2, int z); extern void txdigitalnumber(int starttile, int x,int y,int n,int s,int pal,int cs,int x1, int y1, int x2, int y2); extern void myosx(int x,int y,int tilenum,int shade,int orientation); extern void myospalx(int x,int y,int tilenum,int shade,int orientation,int p); diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c index 14fe7e6c3..1b5a49a9c 100644 --- a/polymer/eduke32/source/game.c +++ b/polymer/eduke32/source/game.c @@ -288,8 +288,12 @@ const char *stripcolorcodes(const char *t) colstrip[i] = '\0'; return(colstrip); } - int gametext_(int small, int starttile, int x,int y,const char *t,int s,int p,int orientation,int x1, int y1, int x2, int y2) +{ + return gametext_z(small,starttile,x,y,t,s,p,orientation,x1,y1,x2,y2,65536); +} + +int gametext_z(int small, int starttile, int x,int y,const char *t,int s,int p,int orientation,int x1, int y1, int x2, int y2, int z) { int ac,newx,oldx=x; char centre, *oldt; @@ -313,7 +317,7 @@ int gametext_(int small, int starttile, int x,int y,const char *t,int s,int p,in } if (*t == 32) { - newx+=5; + newx+=5*z/65536; t++; continue; } @@ -322,8 +326,8 @@ int gametext_(int small, int starttile, int x,int y,const char *t,int s,int p,in if (ac < starttile || ac > (starttile + 93)) break; if (*t >= '0' && *t <= '9') - newx += 8; - else newx += tilesizx[ac]; + newx += 8*z/65536; + else newx += tilesizx[ac]*z/65536; t++; } @@ -354,7 +358,7 @@ int gametext_(int small, int starttile, int x,int y,const char *t,int s,int p,in } if (*t == 32) { - x+=5; + x+=5*z/65536; t++; continue; } @@ -363,11 +367,11 @@ int gametext_(int small, int starttile, int x,int y,const char *t,int s,int p,in if (ac < starttile || ac > (starttile + 93)) break; - rotatesprite(x<<16,(y<<16)+(small?ud.config.ScreenHeight<<15:0),65536,0,ac,s,p,small?(8|16):(2|orientation),x1,y1,x2,y2); + rotatesprite(x<<16,(y<<16)+(small?ud.config.ScreenHeight<<15:0),z,0,ac,s,p,small?(8|16):(2|orientation),x1,y1,x2,y2); if ((*t >= '0' && *t <= '9')) - x += 8; - else x += tilesizx[ac];//(tilesizx[ac]>>small); - if (t-oldt >= (signed)TEXTWRAPLEN-!small) oldt = (char *)t, x = oldx, y+=8; + x += 8*z/65536; + else x += tilesizx[ac]*z/65536;//(tilesizx[ac]>>small); + if (t-oldt >= (signed)TEXTWRAPLEN-!small) oldt = (char *)t, x = oldx, y+=8*z/65536; t++; } @@ -519,7 +523,7 @@ void getpackets(void) OSD_DispatchQueued(); } - if (qe == 0 && KB_KeyPressed(sc_LeftControl) && KB_KeyPressed(sc_LeftAlt) && KB_KeyPressed(sc_Delete)) + if (qe == 0 && KB_KeyPressed(sc_LeftControl) && KB_KeyPressed(sc_LeftAlt) && (KB_KeyPressed(sc_Delete)||KB_KeyPressed(sc_End))) { qe = 1; gameexit("Quick Exit."); @@ -1655,7 +1659,8 @@ static void weaponnum999(char ind,int x,int y,int num1, int num2,char ha) rotatesprite(sbarx(x+21),sbary(y),sbarsc(65536L),0,THREEBYFIVE+dabuf[1]-'0',ha,0,10,0,0,xdim-1,ydim-1); return; } - rotatesprite(sbarx(x+25),sbary(y),sbarsc(65536L),0,THREEBYFIVE+dabuf[0]-'0',ha,0,10,0,0,xdim-1,ydim-1); + else + rotatesprite(sbarx(x+25),sbary(y),sbarsc(65536L),0,THREEBYFIVE+dabuf[0]-'0',ha,0,10,0,0,xdim-1,ydim-1); } static void weapon_amounts(player_struct *p,int x,int y,int u) @@ -1770,7 +1775,7 @@ static void digitalnumber(int x,int y,int n,char s,char cs) } } -void txdigitalnumber(int starttile, int x,int y,int n,int s,int pal,int cs,int x1, int y1, int x2, int y2) +void txdigitalnumberz(int starttile, int x,int y,int n,int s,int pal,int cs,int x1, int y1, int x2, int y2, int z) { int i, j = 0, k, p, c; char b[10]; @@ -1782,7 +1787,7 @@ void txdigitalnumber(int starttile, int x,int y,int n,int s,int pal,int cs,int x for (k=0;k>1); @@ -1790,12 +1795,16 @@ void txdigitalnumber(int starttile, int x,int y,int n,int s,int pal,int cs,int x for (k=0;k 8 && usemodels && md_tilehasmodel(t->picnum) >= 0) + if (bpp > 8 && usemodels && md_tilehasmodel(t->picnum,t->pal) >= 0 && !(spriteext[i].flags&SPREXT_NOTMD)) { t->cstat &= ~4; break; @@ -6546,8 +6555,9 @@ void animatesprites(int x,int y,int a,int smoothratio) t->picnum = GROWSPARK+((totalclock>>4)&3); break; case RPG__STATIC: + #if defined(POLYMOST) && defined(USE_OPENGL) - if (bpp > 8 && usemodels && md_tilehasmodel(t->picnum) >= 0) + if (bpp > 8 && usemodels && md_tilehasmodel(t->picnum,t->pal) >= 0 && !(spriteext[i].flags&SPREXT_NOTMD)) { t->cstat &= ~4; break; @@ -6565,8 +6575,9 @@ void animatesprites(int x,int y,int a,int smoothratio) break; case RECON__STATIC: + #if defined(POLYMOST) && defined(USE_OPENGL) - if (bpp > 8 && usemodels && md_tilehasmodel(t->picnum) >= 0) + if (bpp > 8 && usemodels && md_tilehasmodel(t->picnum,t->pal) >= 0 && !(spriteext[i].flags&SPREXT_NOTMD)) { t->cstat &= ~4; break; @@ -6666,8 +6677,9 @@ void animatesprites(int x,int y,int a,int smoothratio) if (s->owner == -1) { + #if defined(POLYMOST) && defined(USE_OPENGL) - if (bpp > 8 && usemodels && md_tilehasmodel(s->picnum) >= 0) + if (bpp > 8 && usemodels && md_tilehasmodel(s->picnum,t->pal) >= 0 && !(spriteext[i].flags&SPREXT_NOTMD)) { k = 0; t->cstat &= ~4; @@ -6789,8 +6801,9 @@ PALONLY: if (t4) { l = *(int *)(t4+8); + #if defined(POLYMOST) && defined(USE_OPENGL) - if (bpp > 8 && usemodels && md_tilehasmodel(s->picnum) >= 0) + if (bpp > 8 && usemodels && md_tilehasmodel(s->picnum,t->pal) >= 0 && !(spriteext[i].flags&SPREXT_NOTMD)) { k = 0; t->cstat &= ~4; @@ -6895,13 +6908,13 @@ PALONLY: tsprite[spritesortcnt].z = daz; xrep = tsprite[spritesortcnt].xrepeat;// - (klabs(daz-t->z)>>11); tsprite[spritesortcnt].xrepeat = xrep; - tsprite[spritesortcnt].pal = 4; +// tsprite[spritesortcnt].pal = 4; (shadow will have the same model as its actor) yrep = tsprite[spritesortcnt].yrepeat;// - (klabs(daz-t->z)>>11); tsprite[spritesortcnt].yrepeat = yrep; #if defined(POLYMOST) && defined(USE_OPENGL) - if (bpp > 8 && usemodels && md_tilehasmodel(t->picnum) >= 0) + if (bpp > 8 && usemodels && md_tilehasmodel(t->picnum,t->pal) >= 0) { tsprite[spritesortcnt].yrepeat = 0; // 512:trans reverse @@ -6964,7 +6977,7 @@ PALONLY: break; case PLAYERONWATER__STATIC: #if defined(POLYMOST) && defined(USE_OPENGL) - if (bpp > 8 && usemodels && md_tilehasmodel(s->picnum) >= 0) + if (bpp > 8 && usemodels && md_tilehasmodel(s->picnum,s->pal) >= 0 && !(spriteext[i].flags&SPREXT_NOTMD)) { k = 0; t->cstat &= ~4; @@ -7028,7 +7041,7 @@ PALONLY: case RAT__STATIC: #if defined(POLYMOST) && defined(USE_OPENGL) - if (bpp > 8 && usemodels && md_tilehasmodel(s->picnum) >= 0) + if (bpp > 8 && usemodels && md_tilehasmodel(s->picnum,s->pal) >= 0 && !(spriteext[i].flags&SPREXT_NOTMD)) { t->cstat &= ~4; break; diff --git a/polymer/eduke32/source/gamedef.c b/polymer/eduke32/source/gamedef.c index b0d94506c..2982e532a 100644 --- a/polymer/eduke32/source/gamedef.c +++ b/polymer/eduke32/source/gamedef.c @@ -436,8 +436,11 @@ static const char *keyw[] = "headspritesect", // 306 "prevspritesect", // 307 "nextspritesect", // 308 - "spritenopal", // 309 - "getkeyname", // 310 + "getkeyname", // 309 + "qsubstr", // 310 + "gametextz", // 311 + "digitalnumberz", // 312 + "spritenopal", // 313 "" }; @@ -1371,7 +1374,9 @@ static void transvartype(int type) if (!(error || warning) && g_ScriptDebug) initprintf("%s:%d: debug: accepted constant %d in place of gamevar.\n",compilefile,line_number,atol(textptr)); *scriptptr++=MAXGAMEVARS; - *scriptptr++=atol(textptr); + if (tolower(textptr[1])=='x')sscanf(textptr+2,"%x",scriptptr);else + *scriptptr=atol(textptr); + scriptptr++; getlabel(); return; } @@ -1544,6 +1549,7 @@ static int transnum(int type) } if (!(error || warning) && g_ScriptDebug > 1) initprintf("%s:%d: debug: accepted constant %d.\n",compilefile,line_number,atol(textptr)); + if (tolower(textptr[1])=='x')sscanf(textptr+2,"%x",scriptptr);else *scriptptr = atol(textptr); scriptptr++; @@ -1731,8 +1737,8 @@ static int parsecommand(void) textptr++; // get the ID of the DEF - if (tw == CON_SETTHISPROJECTILE) - labelsonly = 1; +// if (tw == CON_SETTHISPROJECTILE) +// labelsonly = 1; transvar(); labelsonly = 0; // now get name of .xxx @@ -1837,7 +1843,12 @@ static int parsecommand(void) //Bsprintf(g_szBuf,"Adding GameVar='%s', val=%l, flags=%lX",label+(labelcnt<<6), // *(scriptptr-2), *(scriptptr-1)); //AddLog(g_szBuf); - + if ((*(scriptptr-1)&GAMEVAR_FLAG_USER_MASK)==3) + { + warning++; + *(scriptptr-1)^=GAMEVAR_FLAG_PERPLAYER; + ReportError(WARNING_BADGAMEVAR); + } AddGameVar(label+(labelcnt<<6),*(scriptptr-2), (*(scriptptr-1)) // can't define default or secret @@ -2320,7 +2331,7 @@ static int parsecommand(void) j++; } parsing_item_name[j] = 0; - labelsonly = 1; +// labelsonly = 1; transnum(LABEL_DEFINE); labelsonly = 0; scriptptr--; @@ -2589,7 +2600,7 @@ static int parsecommand(void) textptr++; // get the ID of the DEF - labelsonly = 1; +// labelsonly = 1; transvar(); labelsonly = 0; // now get name of .xxx @@ -2720,7 +2731,7 @@ static int parsecommand(void) textptr++; // get the ID of the DEF - labelsonly = 1; +// labelsonly = 1; transvar(); labelsonly = 0; // now get name of .xxx @@ -2783,7 +2794,7 @@ static int parsecommand(void) textptr++; // get the ID of the DEF - labelsonly = 1; +// labelsonly = 1; transvar(); labelsonly = 0; // now get name of .xxx @@ -2860,7 +2871,7 @@ static int parsecommand(void) textptr++; // get the ID of the DEF - labelsonly = 1; +// labelsonly = 1; transvar(); labelsonly = 0; // now get name of .xxx @@ -2973,7 +2984,7 @@ static int parsecommand(void) textptr++; // get the ID of the DEF - labelsonly = 1; +// labelsonly = 1; transvar(); labelsonly = 0; // now get name of . @@ -3087,7 +3098,7 @@ static int parsecommand(void) textptr++; // get the ID of the DEF - labelsonly = 1; +// labelsonly = 1; transvar(); labelsonly = 0; // now get name of .xxx @@ -3576,7 +3587,9 @@ static int parsecommand(void) case CON_MINITEXT: case CON_GAMETEXT: + case CON_GAMETEXTZ: case CON_DIGITALNUMBER: + case CON_DIGITALNUMBERZ: if (parsing_event == 0 && parsing_state == 0) { ReportError(ERROR_EVENTONLY); @@ -3585,6 +3598,9 @@ static int parsecommand(void) switch (tw) { + case CON_GAMETEXTZ: + case CON_DIGITALNUMBERZ: + transmultvars(1); case CON_GAMETEXT: case CON_DIGITALNUMBER: transmultvars(6); @@ -3705,6 +3721,7 @@ static int parsecommand(void) //Bsprintf(g_szBuf,"SWITCH2: '%.22s'",textptr); //AddLog(g_szBuf); } + tempscrptr = (int *)(script+tempoffset); //Bsprintf(g_szBuf,"SWITCHXX: '%.22s'",textptr); //AddLog(g_szBuf); @@ -3764,6 +3781,13 @@ repeatcase: //AddLog(g_szBuf); if (casescriptptr) { + for (i=0;i>1,y,fta_quotes[q],shade,pal,orientation,x1,y1,x2,y2); + int z=65536; + if (tw == CON_GAMETEXTZ)z=GetGameVarID(*insptr++,g_i,g_p); + gametext_z(0,tilenum,x>>1,y,fta_quotes[q],shade,pal,orientation,x1,y1,x2,y2,z); break; } - txdigitalnumber(tilenum,x,y,q,shade,pal,orientation,x1,y1,x2,y2); + int z=65536; + if (tw == CON_DIGITALNUMBERZ)z=GetGameVarID(*insptr++,g_i,g_p); + txdigitalnumberz(tilenum,x,y,q,shade,pal,orientation,x1,y1,x2,y2,z); break; } diff --git a/polymer/eduke32/source/menus.c b/polymer/eduke32/source/menus.c index 1cfa78f14..f1d866036 100644 --- a/polymer/eduke32/source/menus.c +++ b/polymer/eduke32/source/menus.c @@ -2673,6 +2673,7 @@ cheat_for_port_credits: break; case 6: if (x==io) ud.screen_tilting = 1-ud.screen_tilting; + if (!ud.screen_tilting)setrollangle(0); modval(0,1,(int *)&ud.screen_tilting,1,probey==io); gametextpal(d,yy, ud.screen_tilting ? "On" : "Off", MENUHIGHLIGHT(io), 0); break; // original had a 'full' option diff --git a/polymer/eduke32/source/osdcmds.c b/polymer/eduke32/source/osdcmds.c index ced03cad5..25448ed58 100644 --- a/polymer/eduke32/source/osdcmds.c +++ b/polymer/eduke32/source/osdcmds.c @@ -534,9 +534,14 @@ static int osdcmd_setvar(const osdfuncparm_t *parm) return OSDCMD_OK; } - strcpy(varname,parm->parms[0]); - varval = Batol(parm->parms[1]); + strcpy(varname,parm->parms[1]); + varval = Batol(varname); + for (i=0;ii, myconnectindex); + strcpy(varname,parm->parms[0]); for (i=0;inumparms != 3) return OSDCMD_SHOWHELP; + + if (numplayers > 1) + { + OSD_Printf("Command not allowed in multiplayer\n"); + return OSDCMD_OK; + } + + ID=Batol(parm->parms[0]); + if (ID>=MAXSPRITES) + { + OSD_Printf("Invalid sprite ID\n"); + return OSDCMD_OK; + } + + varval = Batol(parm->parms[2]); + strcpy(varname,parm->parms[2]); + varval = Batol(varname); + for (i=0;ii, myconnectindex); + + strcpy(varname,parm->parms[1]); + for (i=0;i: changes the mouse sensitivity", osdcmd_sensitivity); OSD_RegisterFunction("setvar","setvar : sets the value of a gamevar", osdcmd_setvar); + OSD_RegisterFunction("setvarvar","setvar : sets the value of a gamevar", osdcmd_setvar); + OSD_RegisterFunction("setactorvar","setactorvar : sets the value of a gamevar", osdcmd_setactorvar); OSD_RegisterFunction("spawn","spawn [palnum] [cstat] [ang] [x y z]: spawns a sprite with the given properties",osdcmd_spawn); OSD_RegisterFunction("usejoystick","usejoystick: enables input from the joystick if it is present",osdcmd_usemousejoy);