patch from hunter_rus

git-svn-id: https://svn.eduke32.com/eduke32@587 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2007-12-20 19:14:38 +00:00
parent d6739cc554
commit 4aa6cf2ea3
18 changed files with 695 additions and 150 deletions

View file

@ -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

View file

@ -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);

View file

@ -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<<pal;
}
break;
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 *detailtokptr = script->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<<i))&&(palmapbits&checkpalmaps(i)))
hicsetsubsttex(tile,i,fnB,alphacutB,xscaleB,yscaleB,flagsB);
if ((unsigned)tile >= (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;
}

View file

@ -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,7 +7438,26 @@ 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:
@ -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;j<MAXSPRITES;j++)
spri=tspri;
for (j=0;j<MAXSTATUS;j++)
{
if (sprite[j].statnum != MAXSTATUS)
int i = headspritestat[j];
while (i != -1)
{
spri = &tspri[j];
Bmemcpy(spri,&sprite[i],sizeof(spritetype));
spri->x = 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++;
}
}

View file

@ -70,6 +70,7 @@ void hicinit(void)
int i,j;
hicreplctyp *hr, *next;
clearconv();
for (i=0;i<MAXPALOOKUPS;i++) // all tints should be 100%
{
hictinting[i].r = hictinting[i].g = hictinting[i].b = 0xff;

View file

@ -12,6 +12,7 @@ typedef struct
int shadeoff;
float scale, bscale, zadd;
GLuint *texid; // skins
int flags;
} mdmodel;
typedef struct _mdanim_t
@ -31,6 +32,7 @@ typedef struct _mdskinmap_t
GLuint texid[HICEFFECTMASK+1]; // OpenGL texture numbers for effect variations
struct _mdskinmap_t *next;
float param;
char *palmap;int size;
} mdskinmap_t;
@ -70,6 +72,7 @@ typedef struct
int shadeoff;
float scale, bscale, zadd;
GLuint *texid; // texture ids for base skin if no mappings defined
int flags;
int numframes, cframe, nframe, fpssc, usesalpha;
float oldtime, curtime, interpol;
@ -137,6 +140,7 @@ typedef struct
int shadeoff;
float scale, bscale, zadd;
unsigned int *texid; // texture ids for base skin if no mappings defined
int flags;
int numframes, cframe, nframe, fpssc, usesalpha;
float oldtime, curtime, interpol;
@ -168,6 +172,7 @@ typedef struct
int shadeoff;
float scale, bscale, zadd;
unsigned int *texid; // skins for palettes
int flags;
//VOX specific stuff:
voxrect_t *quad; int qcnt, qfacind[7];
@ -185,8 +190,32 @@ typedef struct
int skinnum;
int framenum; // calculate the number from the name when declaring
float smoothduration;
int next;
char pal;
} tile2model_t;
static tile2model_t tile2model[MAXTILES];
#define EXTRATILES MAXTILES
int curextra=MAXTILES;
static tile2model_t tile2model[MAXTILES+EXTRATILES];
int addtileP(int model,int tile,int pallet)
{
if (curextra==MAXTILES+EXTRATILES-2)return curextra;
if (tile2model[tile].modelid==-1)return tile;
while (tile2model[tile].next!=-1)tile=tile2model[tile].next;
tile2model[tile].next=curextra;
tile2model[curextra].pal=pallet;
return curextra++;
}
int Ptile2tile(int tile,int pallet)
{
int t=tile;
// if(tile>=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;i<MAXPALCONV;i++)
if (!palconv[i].pal)
{
palconv[i].pal =pal;
palconv[i].pal1=pal1;
palconv[i].pal2=pal2;return;
}
else
if (palconv[i].pal==pal&&palconv[i].pal1==pal1)
{
palconv[i].pal2=pal2;return;
}
}
void getpalmap(int stage,int *pal1,int *pal2)
{
int i;
for (i=0;i<MAXPALCONV;i++)
if (palconv[i].pal==*pal2)
{
if (!stage)
{
*pal1=palconv[i].pal1;
*pal2=palconv[i].pal2;
return;
}
stage--;
}
}
int checkpalmaps(int pal)
{
int stage,val=0;
for (stage=0;stage<MAXPALCONV;stage++)
{
int pal1=0,pal2=pal;
getpalmap(stage,&pal1,&pal2);
if (!pal)break;
if (pal1)val|=1<<(pal1-SPECPAL);
}
return val;
}
void applypalmap(char *pic, char *palmap, int size, int pal)
{
pal+=200;
int r=0,g=1,b=2;
//_initprintf(" %d #%d\n",pal,palmap);
while (size--)
{
char a=palmap[b+1];
if (glinfo.bgra)swapchar(&pic[r], &pic[b]);
pic[r]=((pic[r]*(255-a)+hictinting[pal].r*a)*palmap[r])/255/255;
pic[g]=((pic[g]*(255-a)+hictinting[pal].g*a)*palmap[g])/255/255;
pic[b]=((pic[b]*(255-a)+hictinting[pal].b*a)*palmap[b])/255/255;
if (glinfo.bgra)swapchar(&pic[r], &pic[b]);
r+=4;g+=4;b+=4;
}
}
static void applypalmapSkin(char *pic, int sizx, int sizy, int pal)
{
int stage;
//_initprintf("%d(%dx%d)\n",pal,sizx,sizy);
for (stage=0;stage<MAXPALCONV;stage++)
{
int pal1=0,pal2=pal;
getpalmap(stage,&pal1,&pal2);
if (!pal1)return;
mdskinmap_t *sk;
for (sk = modelhead->skinmap; 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;y<tsizy;y++,j+=xsiz)
{
@ -599,7 +733,7 @@ static int daskinloader(int filh, int *fptr, int *bpl, int *sizx, int *sizy, int
}
// JONOF'S COMPRESSED TEXTURE CACHE STUFF ---------------------------------------------------
int mdloadskin_trytexcache(char *fn, int len, char effect, texcacheheader *head)
int mdloadskin_trytexcache(char *fn, int len, int pal, char effect, texcacheheader *head)
{
int fil, fp;
char cachefn[BMAX_PATH], *cp;
@ -618,7 +752,7 @@ int mdloadskin_trytexcache(char *fn, int len, char effect, texcacheheader *head)
for (cp = cachefn, fp = 0; (*cp = TEXCACHEDIR[fp]); cp++,fp++);
*(cp++) = '/';
for (fp = 0; fp < 16; phex(mdsum[fp++], cp), cp+=2);
sprintf(cp, "-%x-0%x", len, effect);
sprintf(cp, "-%x-%x%x", len, pal, effect);
fil = kopen4load(cachefn, 0);
if (fil < 0) return -1;
@ -640,7 +774,7 @@ failure:
return -1;
}
static int mdloadskin_cached(int fil, texcacheheader *head, int *doalloc, GLuint *glpic, int *xsiz, int *ysiz)
static int mdloadskin_cached(int fil, texcacheheader *head, int *doalloc, GLuint *glpic, int *xsiz, int *ysiz, int pal)
{
int level, r;
texcachepicture pict;
@ -712,6 +846,7 @@ static int mdloadskin(md2model *m, int number, int pal, int surf)
GLuint *texidx = NULL;
mdskinmap_t *sk, *skzero = NULL;
int doalloc = 1, filh;
modelhead=m; // for palmaps
int cachefil = -1, picfillen;
texcacheheader cachead;
@ -725,7 +860,7 @@ static int mdloadskin(md2model *m, int number, int pal, int surf)
if ((int)sk->palette == 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;i<nextmodelid;i++)
for (skzero = ((md2model *)models[i])->skinmap; 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,6 +1734,8 @@ 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);
if (!(m->flags&1))
{
pc[0] *= (float)hictinting[globalpal].r / 255.0;
pc[1] *= (float)hictinting[globalpal].g / 255.0;
pc[2] *= (float)hictinting[globalpal].b / 255.0;
@ -1590,6 +1745,8 @@ static int md3draw(md3model *m, spritetype *tspr)
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;

View file

@ -590,7 +590,7 @@ int OSD_HandleKey(int sc, int press)
{
}
else if (sc == 1) // escape
{
{
// OSD_ShowDisplay(0);
osdscroll = -1;
osdrowscur += osdscroll;

View file

@ -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;stage<MAXPALCONV;stage++)
{
int pal1=0,pal2=pal;
getpalmap(stage,&pal1,&pal2);
if (!pal1)return;
int gloadtile_hi(int dapic, int facen, hicreplctyp *hicr, int dameth, pthtyp *pth, int doalloc, char effect)
pthtyp *pth;
for (pth=pichead; pth; pth=pth->next)
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;y<tsizy;y++,j+=xsiz)
{
coltype tcol;
@ -1559,6 +1592,18 @@ int gloadtile_hi(int dapic, int facen, hicreplctyp *hicr, int dameth, pthtyp *pt
if ((doalloc&3)==1) bglGenTextures(1,(GLuint*)&pth->glpic); //# 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,8 +5752,12 @@ 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
}

View file

@ -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;

View file

@ -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)

View file

@ -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];

View file

@ -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);

View file

@ -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,6 +1659,7 @@ 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;
}
else
rotatesprite(sbarx(x+25),sbary(y),sbarsc(65536L),0,THREEBYFIVE+dabuf[0]-'0',ha,0,10,0,0,xdim-1,ydim-1);
}
@ -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<i;k++)
{
p = starttile+*(b+k)-'0';
j += tilesizx[p]+1;
j += (tilesizx[p]+1)*z/65536;
}
c = x-(j>>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<i;k++)
{
p = starttile+*(b+k)-'0';
rotatesprite((c+j)<<16,y<<16,65536L,0,p,s,pal,2|cs,x1,y1,x2,y2);
rotatesprite((c+j)<<16,y<<16,z,0,p,s,pal,2|cs,x1,y1,x2,y2);
/* rotatesprite((c+j)<<16,y<<16,65536L,0,p,s,pal,cs,0,0,xdim-1,ydim-1);
rotatesprite(x<<16,y<<16,32768L,a,tilenum,shade,p,2|orientation,windowx1,windowy1,windowx2,windowy2);*/
j += tilesizx[p]+1;
j += (tilesizx[p]+1)*z/65536;
}
}
void txdigitalnumber(int starttile, int x,int y,int n,int s,int pal,int cs,int x1, int y1, int x2, int y2)
{
txdigitalnumberz(starttile,x,y,n,s,pal,cs,x1,y1,x2,y2,65536);
}
static void displayinventory(player_struct *p)
{
@ -6265,7 +6274,7 @@ void animatesprites(int x,int y,int a,int smoothratio)
continue;
case CHAIR3__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;
@ -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;

View file

@ -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
"<null>"
};
@ -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 .<varx>
@ -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<casecount/2;i++)
if (casescriptptr[i*2+1]==j)
{
warning++;
ReportError(WARNING_DUPLICATECASE);
break;
}
//AddLog("Adding value to script");
casescriptptr[casecount++]=j; // save value
casescriptptr[casecount]=(int)((int*)scriptptr-&script[0]); // save offset
@ -3861,6 +3885,9 @@ repeatcase:
case CON_NEXTSPRITESECT:
transmultvars(2);
return 0;
case CON_QSUBSTR:
transmultvars(4);
return 0;
case CON_SETACTORANGLE:
case CON_SETPLAYERANGLE:
if (!CheckEventSync(current_event))
@ -4741,6 +4768,7 @@ static void AddDefaultDefinitions(void)
AddDefinition("EVENT_WEAPKEY7",EVENT_WEAPKEY7,LABEL_DEFINE);
AddDefinition("EVENT_WEAPKEY8",EVENT_WEAPKEY8,LABEL_DEFINE);
AddDefinition("EVENT_WEAPKEY9",EVENT_WEAPKEY9,LABEL_DEFINE);
AddDefinition("EVENT_KILLIT",EVENT_KILLIT,LABEL_DEFINE);
AddDefinition("NO",0,LABEL_DEFINE|LABEL_ACTION|LABEL_AI|LABEL_MOVE);
@ -5093,5 +5121,11 @@ void ReportError(int iError)
case WARNING_LABELSONLY:
initprintf("%s:%d: warning: expected a label, found a constant.\n",compilefile,line_number);
break;
case WARNING_BADGAMEVAR:
initprintf("%s:%ld: warning: variable `%s' should be either per-player OR per-actor, not both.\n",compilefile,line_number,label+(labelcnt<<6));
break;
case WARNING_DUPLICATECASE:
initprintf("%s:%ld: warning: duplicate case ignored.\n",compilefile,line_number);
break;
}
}

View file

@ -92,6 +92,8 @@ enum errors
WARNING_DUPLICATEDEFINITION,
WARNING_EVENTSYNC,
WARNING_LABELSONLY,
WARNING_BADGAMEVAR,
WARNING_DUPLICATECASE
};
enum playerlabels
@ -788,7 +790,10 @@ enum keywords
CON_HEADSPRITESECT, // 306
CON_PREVSPRITESECT, // 307
CON_NEXTSPRITESECT, // 308
CON_SPRITENOPAL, // 309
CON_GETKEYNAME, // 310
CON_GETKEYNAME, // 309
CON_QSUBSTR, // 310
CON_GAMETEXTZ, // 311
CON_DIGITALNUMBERZ, // 312
CON_SPRITENOPAL, // 313
END
};

View file

@ -4308,6 +4308,43 @@ static int parse(void)
break;
}
case CON_GETKEYNAME:
insptr++;
{
int i = GetGameVarID(*insptr++, g_i, g_p),
f=GetGameVarID(*insptr++, g_i, g_p);
j=GetGameVarID(*insptr++, g_i, g_p);
if (i<MAXQUOTES&&fta_quotes[i] != NULL&&f<NUMGAMEFUNCTIONS)
{
if (j<2)Bstrcpy(tempbuf,KB_ScanCodeToString(ud.config.KeyboardKeys[f][j]));else
{
Bstrcpy(tempbuf,KB_ScanCodeToString(ud.config.KeyboardKeys[f][0]));
if (!*tempbuf)
Bstrcpy(tempbuf,KB_ScanCodeToString(ud.config.KeyboardKeys[f][1]));
}
}
if (*tempbuf)Bstrcpy(fta_quotes[i],tempbuf);
break;
}
case CON_QSUBSTR:
insptr++;
{
char *s1,*s2;int q1,q2,st,ln;
q1 = GetGameVarID(*insptr++, g_i, g_p),
q2 = GetGameVarID(*insptr++, g_i, g_p);
st = GetGameVarID(*insptr++, g_i, g_p);
ln = GetGameVarID(*insptr++, g_i, g_p);
if (q1<MAXQUOTES&&fta_quotes[q1] != NULL&&q2<MAXQUOTES&&fta_quotes[q2] != NULL)
{
s1=fta_quotes[q1];
s2=fta_quotes[q2];
while (*s2&&st--)s2++;
while ((*s1=*s2)&&ln--){s1++;s2++;}
*s1=0;
}
break;
}
case CON_GETPNAME:
case CON_QSTRCAT:
case CON_QSTRCPY:
@ -4385,19 +4422,6 @@ static int parse(void)
break;
}
case CON_GETKEYNAME:
insptr++;
{
int i = GetGameVarID(*insptr++, g_i, g_p), f=GetGameVarID(*insptr++, g_i, g_p);
j=GetGameVarID(*insptr++, g_i, g_p);
if (fta_quotes[i] != NULL && f < NUMGAMEFUNCTIONS && j < 2)
Bstrcpy(fta_quotes[i], KB_ScanCodeToString(ud.config.KeyboardKeys[f][j]));
break;
}
case CON_MYOSX:
case CON_MYOSPALX:
case CON_MYOS:
@ -4836,30 +4860,36 @@ static int parse(void)
case CON_MINITEXT:
case CON_GAMETEXT:
case CON_GAMETEXTZ:
case CON_DIGITALNUMBER:
case CON_DIGITALNUMBERZ:
insptr++;
{
int tilenum = (tw == CON_GAMETEXT || tw == CON_DIGITALNUMBER)?GetGameVarID(*insptr++,g_i,g_p):0;
int tilenum = (tw == CON_GAMETEXT || tw == CON_GAMETEXTZ || tw == CON_DIGITALNUMBER || tw == CON_DIGITALNUMBERZ)?GetGameVarID(*insptr++,g_i,g_p):0;
int x=GetGameVarID(*insptr++,g_i,g_p), y=GetGameVarID(*insptr++,g_i,g_p), q=GetGameVarID(*insptr++,g_i,g_p);
int shade=GetGameVarID(*insptr++,g_i,g_p), pal=GetGameVarID(*insptr++,g_i,g_p);
if (tw == CON_GAMETEXT || tw == CON_DIGITALNUMBER)
if (tw == CON_GAMETEXT || tw == CON_GAMETEXTZ || tw == CON_DIGITALNUMBER || tw == CON_DIGITALNUMBERZ)
{
int orientation=GetGameVarID(*insptr++,g_i,g_p);
int x1=GetGameVarID(*insptr++,g_i,g_p), y1=GetGameVarID(*insptr++,g_i,g_p);
int x2=GetGameVarID(*insptr++,g_i,g_p), y2=GetGameVarID(*insptr++,g_i,g_p);
if (tw == CON_GAMETEXT)
if (tw == CON_GAMETEXT || tw == CON_GAMETEXTZ)
{
if (fta_quotes[q] == NULL)
{
OSD_Printf("%s %d null quote %d\n",__FILE__,__LINE__,q);
break;
}
gametext_(0,tilenum,x>>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;
}

View file

@ -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

View file

@ -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;i<iGameVarCount;i++)
if (aGameVars[i].szLabel != NULL)
if (Bstrcmp(varname, aGameVars[i].szLabel) == 0)
varval=GetGameVarID(i, g_player[myconnectindex].ps->i, myconnectindex);
strcpy(varname,parm->parms[0]);
for (i=0;i<iGameVarCount;i++)
if (aGameVars[i].szLabel != NULL)
if (Bstrcmp(varname, aGameVars[i].szLabel) == 0)
@ -544,6 +549,42 @@ static int osdcmd_setvar(const osdfuncparm_t *parm)
return OSDCMD_OK;
}
static int osdcmd_setactorvar(const osdfuncparm_t *parm)
{
int i, varval, ID;
char varname[256];
if (parm->numparms != 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;i<iGameVarCount;i++)
if (aGameVars[i].szLabel != NULL)
if (Bstrcmp(varname, aGameVars[i].szLabel) == 0)
varval=GetGameVarID(i, g_player[myconnectindex].ps->i, myconnectindex);
strcpy(varname,parm->parms[1]);
for (i=0;i<iGameVarCount;i++)
if (aGameVars[i].szLabel != NULL)
if (Bstrcmp(varname, aGameVars[i].szLabel) == 0)
SetGameVarID(i, varval, ID, -1);
return OSDCMD_OK;
}
static int osdcmd_addpath(const osdfuncparm_t *parm)
{
char pathname[BMAX_PATH];
@ -948,6 +989,8 @@ int registerosdcommands(void)
OSD_RegisterFunction("sensitivity","sensitivity <value>: changes the mouse sensitivity", osdcmd_sensitivity);
OSD_RegisterFunction("setvar","setvar <gamevar> <value>: sets the value of a gamevar", osdcmd_setvar);
OSD_RegisterFunction("setvarvar","setvar <gamevar> <gamevar>: sets the value of a gamevar", osdcmd_setvar);
OSD_RegisterFunction("setactorvar","setactorvar <actorID> <gamevar> <value>: sets the value of a gamevar", osdcmd_setactorvar);
OSD_RegisterFunction("spawn","spawn <picnum> [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);