mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-11 07:11:39 +00:00
patch from hunter_rus
git-svn-id: https://svn.eduke32.com/eduke32@587 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
d6739cc554
commit
4aa6cf2ea3
18 changed files with 695 additions and 150 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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++;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -590,7 +590,7 @@ int OSD_HandleKey(int sc, int press)
|
|||
{
|
||||
}
|
||||
else if (sc == 1) // escape
|
||||
{
|
||||
{
|
||||
// OSD_ShowDisplay(0);
|
||||
osdscroll = -1;
|
||||
osdrowscur += osdscroll;
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue