separate objects for polymost.c/mdsprite.c/hightile.c and friends

git-svn-id: https://svn.eduke32.com/eduke32@1173 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2008-12-02 10:44:39 +00:00
parent b2274e1968
commit c94b4d63cb
16 changed files with 410 additions and 225 deletions

View file

@ -113,6 +113,11 @@ ENGINEOBJS+= \
$(OBJ)/crc32.$o \ $(OBJ)/crc32.$o \
$(OBJ)/defs.$o \ $(OBJ)/defs.$o \
$(OBJ)/engine.$o \ $(OBJ)/engine.$o \
$(OBJ)/polymost.$o \
$(OBJ)/hightile.$o \
$(OBJ)/mdsprite.$o \
$(OBJ)/textfont.$o \
$(OBJ)/smalltextfont.$o \
$(OBJ)/glbuild.$o \ $(OBJ)/glbuild.$o \
$(OBJ)/kplib.$o \ $(OBJ)/kplib.$o \
$(OBJ)/lzf_c.$o \ $(OBJ)/lzf_c.$o \

View file

@ -9,7 +9,12 @@ $(OBJ)/compat.$o: $(SRC)/compat.c $(INC)/compat.h
$(OBJ)/config.$o: $(SRC)/config.c $(INC)/compat.h $(INC)/osd.h $(INC)/editor.h $(OBJ)/config.$o: $(SRC)/config.c $(INC)/compat.h $(INC)/osd.h $(INC)/editor.h
$(OBJ)/crc32.$o: $(SRC)/crc32.c $(INC)/crc32.h $(OBJ)/crc32.$o: $(SRC)/crc32.c $(INC)/crc32.h
$(OBJ)/defs.$o: $(SRC)/defs.c $(INC)/build.h $(INC)/baselayer.h $(INC)/scriptfile.h $(INC)/compat.h $(OBJ)/defs.$o: $(SRC)/defs.c $(INC)/build.h $(INC)/baselayer.h $(INC)/scriptfile.h $(INC)/compat.h
$(OBJ)/engine.$o: $(SRC)/engine.c $(SRC)/polymost.c $(INC)/kplib.h $(SRC)/hightile.c $(SRC)/mdsprite.c $(INC)/md4.h $(INC)/lzf.h $(INC)/lzwnew.h $(INC)/compat.h $(INC)/build.h $(INC)/pragmas.h $(INC)/cache1d.h $(INC)/a.h $(INC)/osd.h $(INC)/baselayer.h $(INC)/polymer.h $(INC)/polymost.h $(INC)/mdsprite.h $(OBJ)/engine.$o: $(SRC)/engine.c $(INC)/compat.h $(INC)/build.h $(INC)/pragmas.h $(INC)/cache1d.h $(INC)/a.h $(INC)/osd.h $(INC)/baselayer.h $(SRC)/engine_priv.h $(INC)/polymost.h $(INC)/hightile.h $(INC)/mdsprite.h $(INC)/polymer.h
$(OBJ)/polymost.$o: $(SRC)/polymost.c $(INC)/md4.h $(INC)/lzf.h $(INC)/lzwnew.h $(SRC)/engine_priv.h $(INC)/polymost.h $(INC)/hightile.h $(INC)/mdsprite.h
$(OBJ)/hightile.$o: $(SRC)/hightile.c $(INC)/kplib.h $(INC)/hightile.h
$(OBJ)/mdsprite.$o: $(SRC)/mdsprite.c $(SRC)/engine_priv.h $(INC)/polymost.h $(INC)/hightile.h $(INC)/mdsprite.h
$(OBJ)/textfont.$o: $(SRC)/textfont.c
$(OBJ)/smalltextfont.$o: $(SRC)/smalltextfont.c
$(OBJ)/glbuild.$o: $(SRC)/glbuild.c $(INC)/glbuild.h $(INC)/baselayer.h $(OBJ)/glbuild.$o: $(SRC)/glbuild.c $(INC)/glbuild.h $(INC)/baselayer.h
$(OBJ)/kplib.$o: $(SRC)/kplib.c $(INC)/compat.h $(OBJ)/kplib.$o: $(SRC)/kplib.c $(INC)/compat.h
$(OBJ)/lzf_c.$o: $(SRC)/lzf_c.c $(SRC)/lzfP.h $(OBJ)/lzf_c.$o: $(SRC)/lzf_c.c $(SRC)/lzfP.h
@ -28,7 +33,7 @@ $(OBJ)/sound.$o: $(SRC)/sound.c $(INC)/osd.h $(INC)/compat.h $(INC)/cache1d.h
$(OBJ)/winlayer.$o: $(SRC)/winlayer.c $(INC)/compat.h $(INC)/winlayer.h $(INC)/baselayer.h $(INC)/pragmas.h $(INC)/build.h $(INC)/a.h $(INC)/osd.h $(INC)/dxdidf.h $(INC)/glbuild.h $(OBJ)/winlayer.$o: $(SRC)/winlayer.c $(INC)/compat.h $(INC)/winlayer.h $(INC)/baselayer.h $(INC)/pragmas.h $(INC)/build.h $(INC)/a.h $(INC)/osd.h $(INC)/dxdidf.h $(INC)/glbuild.h
$(OBJ)/gtkbits.$o: $(SRC)/gtkbits.c $(INC)/baselayer.h $(INC)/build.h $(INC)/dynamicgtk.h $(OBJ)/gtkbits.$o: $(SRC)/gtkbits.c $(INC)/baselayer.h $(INC)/build.h $(INC)/dynamicgtk.h
$(OBJ)/dynamicgtk.$o: $(SRC)/dynamicgtk.c $(INC)/dynamicgtk.h $(OBJ)/dynamicgtk.$o: $(SRC)/dynamicgtk.c $(INC)/dynamicgtk.h
$(OBJ)/polymer.$o: $(SRC)/polymer.c $(INC)/polymer.h $(INC)/compat.h $(INC)/build.h $(INC)/glbuild.h $(INC)/osd.h $(INC)/polymost.h $(INC)/pragmas.h $(INC)/mdsprite.h $(OBJ)/polymer.$o: $(SRC)/polymer.c $(INC)/polymer.h $(INC)/compat.h $(INC)/build.h $(INC)/glbuild.h $(INC)/osd.h $(INC)/pragmas.h $(INC)/mdsprite.h
$(OBJ)/buildres.$(res): $(SRC)/misc/buildres.rc $(INC)/startwin.editor.h $(OBJ)/buildres.$(res): $(SRC)/misc/buildres.rc $(INC)/startwin.editor.h
$(OBJ)/startwin.editor.$o: $(SRC)/startwin.editor.c $(INC)/build.h $(INC)/editor.h $(INC)/winlayer.h $(INC)/compat.h $(INC)/startwin.editor.h $(OBJ)/startwin.editor.$o: $(SRC)/startwin.editor.c $(INC)/build.h $(INC)/editor.h $(INC)/winlayer.h $(INC)/compat.h $(INC)/startwin.editor.h

View file

@ -61,6 +61,11 @@ ENGINEOBJS= \
$(OBJ)\crc32.$o \ $(OBJ)\crc32.$o \
$(OBJ)\defs.$o \ $(OBJ)\defs.$o \
$(OBJ)\engine.$o \ $(OBJ)\engine.$o \
$(OBJ)\polymost.$o \
$(OBJ)\hightile.$o \
$(OBJ)\mdsprite.$o \
$(OBJ)\textfont.$o \
$(OBJ)\smalltextfont.$o \
$(OBJ)\glbuild.$o \ $(OBJ)\glbuild.$o \
$(OBJ)\kplib.$o \ $(OBJ)\kplib.$o \
$(OBJ)\lzf_c.$o \ $(OBJ)\lzf_c.$o \

View file

@ -542,6 +542,7 @@ extern int glredbluemode;
extern int glusetexcache, glusetexcachecompression; extern int glusetexcache, glusetexcachecompression;
extern int glmultisample, glnvmultisamplehint; extern int glmultisample, glnvmultisamplehint;
extern int glwidescreen, glprojectionhacks; extern int glwidescreen, glprojectionhacks;
extern int gltexmaxsize;
void gltexapplyprops (void); void gltexapplyprops (void);
void invalidatecache(void); void invalidatecache(void);

View file

@ -0,0 +1,40 @@
#ifndef HIGHTILE_PRIV_H
#define HIGHTILE_PRIV_H
struct hicskybox_t {
int ignore;
char *face[6];
};
typedef struct hicreplc_t {
struct hicreplc_t *next;
char palnum, ignore, flags, filler;
char *filename;
float alphacut, xscale, yscale;
struct hicskybox_t *skybox;
} hicreplctyp;
extern palette_t hictinting[MAXPALOOKUPS];
extern hicreplctyp *hicreplc[MAXTILES];
extern char hicfirstinit;
typedef struct
{
char magic[4]; // 'PMST', was 'Polymost'
int xdim, ydim; // of image, unpadded
int flags; // 1 = !2^x, 2 = has alpha, 4 = lzw compressed
int quality; // r_downsize at the time the cache was written
} texcacheheader;
typedef struct
{
int size;
int format;
int xdim, ydim; // of mipmap (possibly padded)
int border, depth;
} texcachepicture;
hicreplctyp * hicfindsubst(int picnum, int palnum, int skybox);
#define HICEFFECTMASK (1|2|4|8)
#endif

View file

@ -221,5 +221,23 @@ EXTERN mdmodel **models;
void updateanimation(md2model *m, spritetype *tspr); void updateanimation(md2model *m, spritetype *tspr);
int mdloadskin(md2model *m, int number, int pal, int surf); int mdloadskin(md2model *m, int number, int pal, int surf);
void mdinit(void);
void freeallmodels(void);
void clearskins(void);
int mddraw(spritetype *tspr);
typedef struct { float xadd, yadd, zadd; short angadd, flags; } hudtyp;
EXTERN hudtyp hudmem[2][MAXTILES]; //~320KB ... ok for now ... could replace with dynamic alloc
EXTERN int mdinited;
EXTERN int mdpause;
EXTERN int nummodelsalloced, nextmodelid;
EXTERN voxmodel *voxmodels[MAXVOXELS];
void voxfree(voxmodel *m);
voxmodel *voxload(const char *filnam);
int voxdraw(voxmodel *m, spritetype *tspr);
#endif // !_mdsprite_h_ #endif // !_mdsprite_h_

View file

@ -26,8 +26,9 @@
# include "build.h" # include "build.h"
# include "glbuild.h" # include "glbuild.h"
# include "osd.h" # include "osd.h"
# include "polymost.h" # include "hightile.h"
# include "mdsprite.h" # include "mdsprite.h"
# include "polymost.h"
# include "pragmas.h" # include "pragmas.h"
# include <math.h> # include <math.h>

View file

@ -1,20 +1,90 @@
#ifndef _polymost_h_ #ifndef _polymost_h_
# define _polymost_h_ # define _polymost_h_
# include "glbuild.h" #ifdef POLYMOST
struct hicskybox_t { #define CULL_OFFSET 384
int ignore; #define CULL_DELAY 2
char *face[6]; #define MAXCULLCHECKS 1024
extern int lastcullcheck;
extern char cullmodel[MAXSPRITES];
extern int cullcheckcnt;
#define PI 3.14159265358979323
typedef struct { unsigned char r, g, b, a; } coltype;
extern int rendmode;
extern float gtang;
extern float glox1, gloy1;
extern double gxyaspect, grhalfxdown10x;
extern double gcosang, gsinang, gcosang2, gsinang2;
extern double gchang, gshang, gctang, gstang;
struct glfiltermodes {
char *name;
int min,mag;
};
#define numglfiltermodes 6
extern struct glfiltermodes glfiltermodes[numglfiltermodes];
extern const char *TEXCACHEDIR;
void phex(unsigned char v, char *s);
void uploadtexture(int doalloc, int xsiz, int ysiz, int intexfmt, int texfmt, coltype *pic, int tsizx, int tsizy, int dameth);
void polymost_drawsprite(int snum);
void polymost_drawmaskwall(int damaskwallcnt);
void polymost_dorotatesprite(int sx, int sy, int z, short a, short picnum,
signed char dashade, char dapalnum, char dastat, int cx1, int cy1, int cx2, int cy2, int uniqid);
void polymost_fillpolygon(int npoints);
void polymost_initosdfuncs(void);
void polymost_drawrooms(void);
void polymost_glinit(void);
void polymost_glreset(void);
void gltexinvalidate(int dapicnum, int dapalnum, int dameth);
void gltexinvalidateall(void);
void gltexinvalidate8(void);
int polymost_printext256(int xpos, int ypos, short col, short backcol, char *name, char fontsize);
// Depth peeling control
extern int r_curpeel;
extern float curpolygonoffset;
extern int peelcompiling;
// Depth peeling data
extern GLuint ztexture[3];
extern GLuint *peels;
extern GLuint *peelfbos;
extern GLuint peelprogram[2];
extern int cachefilehandle;
extern FILE *cacheindexptr;
extern struct HASH_table cacheH;
struct cache_entry
{
char name[BMAX_PATH];
int offset;
int len;
struct cache_entry *next;
}; };
typedef struct hicreplc_t { typedef struct cache_entry texcacheindex;
struct hicreplc_t *next;
char palnum, ignore, flags, filler; extern texcacheindex firstcacheindex;
char *filename; extern texcacheindex *datextures;
float alphacut, xscale, yscale; extern texcacheindex *cacheptrs[MAXTILES<<2];
struct hicskybox_t *skybox; extern int numcacheentries;
} hicreplctyp;
int dxtfilter(int fil, texcachepicture *pict, char *pic, void *midbuf, char *packbuf, unsigned int miplen);
int dedxtfilter(int fil, texcachepicture *pict, char *pic, void *midbuf, char *packbuf, int ispacked);
void writexcache(char *fn, int len, int dameth, char effect, texcacheheader *head);
extern float shadescale;
extern float alphahackarray[MAXTILES];
typedef struct pthtyp_t typedef struct pthtyp_t
{ {
@ -34,7 +104,6 @@ typedef struct pthtyp_t
char *palmap;int size; char *palmap;int size;
} pthtyp; } pthtyp;
hicreplctyp * hicfindsubst(int picnum, int palnum, int skybox);
pthtyp * gltexcache (int dapicnum, int dapalnum, int dameth); pthtyp * gltexcache (int dapicnum, int dapalnum, int dameth);
extern palette_t hictinting[MAXPALOOKUPS]; extern palette_t hictinting[MAXPALOOKUPS];
@ -47,6 +116,6 @@ extern float shadescale;
extern int globalnoeffect; extern int globalnoeffect;
extern int drawingskybox; extern int drawingskybox;
#define HICEFFECTMASK (1|2|4|8) #endif
#endif // !_polymost_h_ #endif

View file

@ -22,27 +22,24 @@
#include "scriptfile.h" #include "scriptfile.h"
#ifdef POLYMOST #ifdef POLYMOST
# ifdef USE_OPENGL
# include "glbuild.h"
# ifdef POLYMER
# include "polymer.h"
# endif
# endif
# include "hightile.h"
# include "mdsprite.h"
# include "polymost.h"
# ifdef _WIN32 # ifdef _WIN32
# define WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN
# include <windows.h> # include <windows.h>
# endif # endif
# ifdef USE_OPENGL
# include "glbuild.h"
# ifdef POLYMER
# include "polymer.h"
# endif
#endif
#endif #endif
#include <math.h> #include <math.h>
#define MAXCLIPNUM 1024 #include "engine_priv.h"
#define MAXPERMS 512
#define MAXTILEFILES 256
#define MAXYSAVES ((MAXXDIM*MAXSPRITES)>>7)
#define MAXNODESPERLINE 42 //Warning: This depends on MAXYSAVES & MAXYDIM!
#define MAXCLIPDIST 1024
void *kmalloc(bsize_t size) { return(Bmalloc(size)); } void *kmalloc(bsize_t size) { return(Bmalloc(size)); }
#define kkmalloc kmalloc #define kkmalloc kmalloc
@ -93,7 +90,7 @@ static char tempbuf[MAXWALLS];
int ebpbak, espbak; int ebpbak, espbak;
int slopalookup[16384]; // was 2048 int slopalookup[16384]; // was 2048
#if defined(USE_OPENGL) #if defined(USE_OPENGL)
static palette_t palookupfog[MAXPALOOKUPS]; palette_t palookupfog[MAXPALOOKUPS];
#endif #endif
static char permanentlock = 255; static char permanentlock = 255;
@ -122,9 +119,8 @@ int pow2long[32] =
int reciptable[2048], fpuasm; int reciptable[2048], fpuasm;
char britable[16][256]; // JBF 20040207: full 8bit precision char britable[16][256]; // JBF 20040207: full 8bit precision
//char textfont[1024], smalltextfont[1024];
#include "textfont.c" extern char textfont[2048], smalltextfont[2048];
#include "smalltextfont.c"
static char kensmessage[128]; static char kensmessage[128];
char *engineerrstr = "No error"; char *engineerrstr = "No error";
@ -191,21 +187,6 @@ int msqrtasm(unsigned int);
modify exact [eax ebx ecx] modify exact [eax ebx ecx]
int krecipasm(int); int krecipasm(int);
#pragma aux setgotpic =\
"mov ebx, eax",\
"cmp byte ptr walock[eax], 200",\
"jae skipit",\
"mov byte ptr walock[eax], 199",\
"skipit: shr eax, 3",\
"and ebx, 7",\
"mov dl, byte ptr gotpic[eax]",\
"mov bl, byte ptr pow2char[ebx]",\
"or dl, bl",\
"mov byte ptr gotpic[eax], dl",\
parm [eax]\
modify exact [eax ebx ecx edx]
void setgotpic(int);
#pragma aux getclipmask =\ #pragma aux getclipmask =\
"sar eax, 31",\ "sar eax, 31",\
"add ebx, ebx",\ "add ebx, ebx",\
@ -314,27 +295,6 @@ static inline int krecipasm(int a)
} }
} }
static inline void setgotpic(int a)
{
_asm
{
push ebx
mov eax, a
mov ebx, eax
cmp byte ptr walock[eax], 200
jae skipit
mov byte ptr walock[eax], 199
skipit:
shr eax, 3
and ebx, 7
mov dl, byte ptr gotpic[eax]
mov bl, byte ptr pow2char[ebx]
or dl, bl
mov byte ptr gotpic[eax], dl
pop ebx
}
}
static inline int getclipmask(int a, int b, int c, int d) static inline int getclipmask(int a, int b, int c, int d)
{ {
_asm _asm
@ -425,24 +385,6 @@ beg:
: "=a" (__r) : "c" (__c) : "edx","ebx", "cc"); \ : "=a" (__r) : "c" (__c) : "edx","ebx", "cc"); \
__r; }) __r; })
#define setgotpic(a) \
({ int __a=(a); \
__asm__ __volatile__ ( \
"movl %%eax, %%ebx\n\t" \
"cmpb $200, "ASMSYM("walock")"(%%eax)\n\t" \
"jae 0f\n\t" \
"movb $199, "ASMSYM("walock")"(%%eax)\n\t" \
"0:\n\t" \
"shrl $3, %%eax\n\t" \
"andl $7, %%ebx\n\t" \
"movb "ASMSYM("gotpic")"(%%eax), %%dl\n\t" \
"movb "ASMSYM("pow2char")"(%%ebx), %%bl\n\t" \
"orb %%bl, %%dl\n\t" \
"movb %%dl, "ASMSYM("gotpic")"(%%eax)" \
: "=a" (__a) : "a" (__a) \
: "ebx", "edx", "memory", "cc"); \
__a; })
#define krecipasm(a) \ #define krecipasm(a) \
({ int __a=(a); \ ({ int __a=(a); \
__asm__ __volatile__ ( \ __asm__ __volatile__ ( \
@ -532,12 +474,6 @@ static inline int msqrtasm(unsigned int c)
return a; return a;
} }
static inline void setgotpic(int tilenume)
{
if (walock[tilenume] < 200) walock[tilenume] = 199;
gotpic[tilenume>>3] |= pow2char[tilenume&7];
}
static inline int krecipasm(int i) static inline int krecipasm(int i)
{ {
// Ken did this // Ken did this
@ -562,12 +498,12 @@ inline int getkensmessagecrc(int b)
#endif #endif
static int xb1[MAXWALLSB], yb1[MAXWALLSB], xb2[MAXWALLSB], yb2[MAXWALLSB]; int xb1[MAXWALLSB], yb1[MAXWALLSB], xb2[MAXWALLSB], yb2[MAXWALLSB];
static int rx1[MAXWALLSB], ry1[MAXWALLSB], rx2[MAXWALLSB], ry2[MAXWALLSB]; int rx1[MAXWALLSB], ry1[MAXWALLSB], rx2[MAXWALLSB], ry2[MAXWALLSB];
static short p2[MAXWALLSB], thesector[MAXWALLSB]; short p2[MAXWALLSB], thesector[MAXWALLSB];
short thewall[MAXWALLSB]; short thewall[MAXWALLSB];
static short bunchfirst[MAXWALLSB], bunchlast[MAXWALLSB]; short bunchfirst[MAXWALLSB], bunchlast[MAXWALLSB];
static short smost[MAXYSAVES], smostcnt; static short smost[MAXYSAVES], smostcnt;
static short smoststart[MAXWALLSB]; static short smoststart[MAXWALLSB];
@ -617,13 +553,13 @@ intptr_t globalbufplc;
int globalx1, globaly1, globalx2, globaly2, globalx3, globaly3, globalzx; int globalx1, globaly1, globalx2, globaly2, globalx3, globaly3, globalzx;
int globalx, globaly, globalz; int globalx, globaly, globalz;
static short sectorborder[256], sectorbordercnt; short sectorborder[256], sectorbordercnt;
static char tablesloaded = 0; static char tablesloaded = 0;
int pageoffset, ydim16, qsetmode = 0; int pageoffset, ydim16, qsetmode = 0;
int startposx, startposy, startposz; int startposx, startposy, startposz;
short startang, startsectnum; short startang, startsectnum;
short pointhighlight, linehighlight, highlightcnt; short pointhighlight, linehighlight, highlightcnt;
static int lastx[MAXYDIM]; int lastx[MAXYDIM];
char *transluc = NULL, paletteloaded = 0; char *transluc = NULL, paletteloaded = 0;
int halfxdim16, midydim16; int halfxdim16, midydim16;
@ -639,7 +575,7 @@ static int colscan[27];
static short clipnum, hitwalls[4]; static short clipnum, hitwalls[4];
int hitscangoalx = (1<<29)-1, hitscangoaly = (1<<29)-1; int hitscangoalx = (1<<29)-1, hitscangoaly = (1<<29)-1;
#ifdef POLYMOST #ifdef POLYMOST
static int hitallsprites = 0; int hitallsprites = 0;
#endif #endif
typedef struct { int x1, y1, x2, y2; } linetype; typedef struct { int x1, y1, x2, y2; } linetype;
@ -679,7 +615,7 @@ double msens = 1.0;
static char artfilename[20]; static char artfilename[20];
static int numtilefiles, artfil = -1, artfilnum, artfilplc; static int numtilefiles, artfil = -1, artfilnum, artfilplc;
static char inpreparemirror = 0; char inpreparemirror = 0;
static int mirrorsx1, mirrorsy1, mirrorsx2, mirrorsy2; static int mirrorsx1, mirrorsy1, mirrorsx2, mirrorsy2;
static int setviewcnt = 0; // interface layers use this now static int setviewcnt = 0; // interface layers use this now
@ -706,26 +642,6 @@ char palfadedelta = 0;
//int cacheresets = 0,cacheinvalidates = 0; //int cacheresets = 0,cacheinvalidates = 0;
//============================================================================= //POLYMOST BEGINS
#ifdef POLYMOST
static void scansector(short sectnum);
#include "polymost.h"
#include "hightile.c"
#include "polymost.c"
#else
void hicsetpalettetint(int palnum, unsigned char r, unsigned char g, unsigned char b, unsigned char effect)
{ UNREFERENCED_PARAMETER(palnum); UNREFERENCED_PARAMETER(r); UNREFERENCED_PARAMETER(g); UNREFERENCED_PARAMETER(b); UNREFERENCED_PARAMETER(effect);}
int hicsetsubsttex(int picnum, int palnum, char *filen, float alphacut, float xscale, float yscale, char flags)
{ UNREFERENCED_PARAMETER(picnum); UNREFERENCED_PARAMETER(palnum); UNREFERENCED_PARAMETER(filen); UNREFERENCED_PARAMETER(alphacut); UNREFERENCED_PARAMETER(xscale); UNREFERENCED_PARAMETER(yscale); UNREFERENCED_PARAMETER(flags); return 0;}
int hicsetskybox(int picnum, int palnum, char *faces[6])
{ UNREFERENCED_PARAMETER(picnum); UNREFERENCED_PARAMETER(palnum); UNREFERENCED_PARAMETER(faces); return 0;}
int hicclearsubst(int picnum, int palnum)
{ UNREFERENCED_PARAMETER(picnum); UNREFERENCED_PARAMETER(palnum);return 0;}
int polymost_drawtilescreen(int tilex, int tiley, int wallnum, int dimen, int tilezoom)
{ UNREFERENCED_PARAMETER(tilex); UNREFERENCED_PARAMETER(tiley); UNREFERENCED_PARAMETER(wallnum); UNREFERENCED_PARAMETER(dimen); UNREFERENCED_PARAMETER(tilezoom);return -1;}
#endif
//============================================================================= //POLYMOST ENDS
// //
// getpalookup (internal) // getpalookup (internal)
// //
@ -1042,7 +958,7 @@ static void maskwallscan(int x1, int x2, short *uwal, short *dwal, int *swal, in
// //
// wallfront (internal) // wallfront (internal)
// //
static int wallfront(int l1, int l2) int wallfront(int l1, int l2)
{ {
walltype *wal; walltype *wal;
int x11, y11, x21, y21, x12, y12, x22, y22, dx, dy, t1, t2; int x11, y11, x21, y21, x12, y12, x22, y22, dx, dy, t1, t2;
@ -1407,7 +1323,7 @@ static int owallmost(short *mostbuf, int w, int z)
// //
// wallmost (internal) // wallmost (internal)
// //
static int wallmost(short *mostbuf, int w, int sectnum, char dastat) int wallmost(short *mostbuf, int w, int sectnum, char dastat)
{ {
int bad, i, j, t, y, z, inty, intz, xcross, yinc, fw; int bad, i, j, t, y, z, inty, intz, xcross, yinc, fw;
int x1, y1, z1, x2, y2, z2, xv, yv, dx, dy, dasqr, oz1, oz2; int x1, y1, z1, x2, y2, z2, xv, yv, dx, dy, dasqr, oz1, oz2;

View file

@ -0,0 +1,132 @@
#ifndef ENGINE_PRIV_H
#define ENGINE_PRIV_H
#define MAXCLIPNUM 1024
#define MAXPERMS 512
#define MAXTILEFILES 256
#define MAXYSAVES ((MAXXDIM*MAXSPRITES)>>7)
#define MAXNODESPERLINE 42 //Warning: This depends on MAXYSAVES & MAXYDIM!
#define MAXCLIPDIST 1024
extern char pow2char[8];
extern int pow2int[32];
extern short thesector[MAXWALLSB], thewall[MAXWALLSB];
extern short bunchfirst[MAXWALLSB], bunchlast[MAXWALLSB];
extern short maskwall[MAXWALLSB], maskwallcnt;
extern spritetype *tspriteptr[MAXSPRITESONSCREEN];
extern int xdimen, xdimenrecip, halfxdimen, xdimenscale, xdimscale, ydimen;
extern int frameoffset;
extern int globalposx, globalposy, globalposz, globalhoriz;
extern short globalang, globalcursectnum;
extern int globalpal, cosglobalang, singlobalang;
extern int cosviewingrangeglobalang, sinviewingrangeglobalang;
extern int globalvisibility;
extern int xyaspect;
extern int asm1, asm2, asm3, asm4;
extern int globalshade;
extern short globalpicnum;
extern int globalx1, globaly2;
extern int globalorientation;
extern short searchit;
extern int searchx, searchy;
extern short searchsector, searchwall, searchstat;
extern char inpreparemirror;
extern int curbrightness, gammabrightness;
extern char britable[16][256];
extern char picsiz[MAXTILES];
extern int lastx[MAXYDIM];
extern char *transluc;
extern short sectorborder[256], sectorbordercnt;
extern int qsetmode;
extern int hitallsprites;
extern int xb1[MAXWALLSB];
extern int rx1[MAXWALLSB], ry1[MAXWALLSB];
extern short p2[MAXWALLSB];
extern short numscans, numhits, numbunches;
#ifdef USE_OPENGL
extern palette_t palookupfog[MAXPALOOKUPS];
#endif
int wallmost(short *mostbuf, int w, int sectnum, char dastat);
int wallfront(int l1, int l2);
int animateoffs(short tilenum, short fakevar);
extern int indrawroomsandmasks;
#if defined(__WATCOMC__) && !defined(NOASM)
#pragma aux setgotpic =\
"mov ebx, eax",\
"cmp byte ptr walock[eax], 200",\
"jae skipit",\
"mov byte ptr walock[eax], 199",\
"skipit: shr eax, 3",\
"and ebx, 7",\
"mov dl, byte ptr gotpic[eax]",\
"mov bl, byte ptr pow2char[ebx]",\
"or dl, bl",\
"mov byte ptr gotpic[eax], dl",\
parm [eax]\
modify exact [eax ebx ecx edx]
void setgotpic(int);
#elif defined(_MSC_VER) && !defined(NOASM) // __WATCOMC__
static inline void setgotpic(int a)
{
_asm {
push ebx
mov eax, a
mov ebx, eax
cmp byte ptr walock[eax], 200
jae skipit
mov byte ptr walock[eax], 199
skipit:
shr eax, 3
and ebx, 7
mov dl, byte ptr gotpic[eax]
mov bl, byte ptr pow2char[ebx]
or dl, bl
mov byte ptr gotpic[eax], dl
pop ebx
}
}
#elif defined(__GNUC__) && defined(__i386__) && !defined(NOASM) // _MSC_VER
#define setgotpic(a) \
({ int __a=(a); \
__asm__ __volatile__ ( \
"movl %%eax, %%ebx\n\t" \
"cmpb $200, "ASMSYM("walock")"(%%eax)\n\t" \
"jae 0f\n\t" \
"movb $199, "ASMSYM("walock")"(%%eax)\n\t" \
"0:\n\t" \
"shrl $3, %%eax\n\t" \
"andl $7, %%ebx\n\t" \
"movb "ASMSYM("gotpic")"(%%eax), %%dl\n\t" \
"movb "ASMSYM("pow2char")"(%%ebx), %%bl\n\t" \
"orb %%bl, %%dl\n\t" \
"movb %%dl, "ASMSYM("gotpic")"(%%eax)" \
: "=a" (__a) : "a" (__a) \
: "ebx", "edx", "memory", "cc"); \
__a; })
#else // __GNUC__ && __i386__
static inline void setgotpic(int tilenume)
{
if (walock[tilenume] < 200) walock[tilenume] = 199;
gotpic[tilenume>>3] |= pow2char[tilenume&7];
}
#endif
#endif /* ENGINE_PRIV_H */

View file

@ -4,26 +4,18 @@
* See the included license file "BUILDLIC.TXT" for license info. * See the included license file "BUILDLIC.TXT" for license info.
*/ */
#ifdef POLYMOST
#include "build.h"
#include "compat.h"
#include "kplib.h" #include "kplib.h"
#include "hightile.h"
palette_t hictinting[MAXPALOOKUPS]; palette_t hictinting[MAXPALOOKUPS];
//moved into polymost.h hicreplctyp *hicreplc[MAXTILES];
//#define HICEFFECTMASK (1|2|4) char hicfirstinit = 0;
/*struct hicskybox_t {
int ignore;
char *face[6];
};
typedef struct hicreplc_t {
struct hicreplc_t *next;
char palnum, ignore, flags, filler;
char *filename;
float alphacut;
struct hicskybox_t *skybox;
} hicreplctyp;*/
static hicreplctyp *hicreplc[MAXTILES];
static char hicfirstinit = 0;
// //
// find the index into hicreplc[] which contains the replacement tile particulars // find the index into hicreplc[] which contains the replacement tile particulars
@ -290,3 +282,13 @@ int hicclearsubst(int picnum, int palnum)
return 0; return 0;
} }
#else /* POLYMOST */
void hicsetpalettetint(int palnum, unsigned char r, unsigned char g, unsigned char b, unsigned char effect) { }
int hicsetsubsttex(int picnum, int palnum, char *filen, float alphacut) { return 0; }
int hicsetskybox(int picnum, int palnum, char *faces[6]) { return 0; }
int hicclearsubst(int picnum, int palnum) { return 0; }
#endif

View file

@ -1,7 +1,19 @@
//------------------------------------- MD2/MD3 LIBRARY BEGINS ------------------------------------- //------------------------------------- MD2/MD3 LIBRARY BEGINS -------------------------------------
#include "compat.h"
#include "build.h"
#include "glbuild.h"
#include "pragmas.h"
#include "baselayer.h"
#include "engine_priv.h"
#include "hightile.h"
#include "polymost.h"
#include "mdsprite.h" #include "mdsprite.h"
static voxmodel *voxmodels[MAXVOXELS]; #include "cache1d.h"
#include "kplib.h"
#include "md4.h"
voxmodel *voxmodels[MAXVOXELS];
int curextra=MAXTILES; int curextra=MAXTILES;
int addtileP(int model,int tile,int pallet) int addtileP(int model,int tile,int pallet)
@ -29,15 +41,11 @@ int Ptile2tile(int tile,int pallet)
return t; return t;
} }
//Move this to appropriate place! int mdinited=0;
typedef struct { float xadd, yadd, zadd; short angadd, flags; } hudtyp;
hudtyp hudmem[2][MAXTILES]; //~320KB ... ok for now ... could replace with dynamic alloc
static char mdinited=0;
int mdpause=0; int mdpause=0;
#define MODELALLOCGROUP 256 #define MODELALLOCGROUP 256
static int nummodelsalloced = 0, nextmodelid = 0; int nummodelsalloced = 0, nextmodelid = 0;
static int maxmodelverts = 0, allocmodelverts = 0; static int maxmodelverts = 0, allocmodelverts = 0;
static int maxmodeltris = 0, allocmodeltris = 0; static int maxmodeltris = 0, allocmodeltris = 0;
@ -54,7 +62,7 @@ int globalnoeffect=0;
extern int timerticspersec; extern int timerticspersec;
static void freeallmodels() void freeallmodels()
{ {
int i; int i;
@ -87,7 +95,7 @@ static void freeallmodels()
} }
} }
static void clearskins() void clearskins()
{ {
mdmodel *m; mdmodel *m;
int i, j; int i, j;
@ -134,7 +142,7 @@ static void clearskins()
} }
} }
static void mdinit() void mdinit()
{ {
memset(hudmem,0,sizeof(hudmem)); memset(hudmem,0,sizeof(hudmem));
freeallmodels(); freeallmodels();
@ -2701,7 +2709,7 @@ static int loadvxl(const char *filnam)
} }
#endif #endif
static void voxfree(voxmodel *m) void voxfree(voxmodel *m)
{ {
if (!m) return; if (!m) return;
if (m->mytex) free(m->mytex); if (m->mytex) free(m->mytex);
@ -2710,7 +2718,7 @@ static void voxfree(voxmodel *m)
free(m); free(m);
} }
static voxmodel *voxload(const char *filnam) voxmodel *voxload(const char *filnam)
{ {
int i, is8bit, ret; int i, is8bit, ret;
voxmodel *vm; voxmodel *vm;
@ -2741,7 +2749,7 @@ static voxmodel *voxload(const char *filnam)
} }
//Draw voxel model as perfect cubes //Draw voxel model as perfect cubes
static int voxdraw(voxmodel *m, spritetype *tspr) int voxdraw(voxmodel *m, spritetype *tspr)
{ {
point3d fp, m0, a0; point3d fp, m0, a0;
int i, j, fi, xx, yy, zz; int i, j, fi, xx, yy, zz;

View file

@ -65,7 +65,25 @@ Low priority:
**************************************************************************************************/ **************************************************************************************************/
int animateoffs(short tilenum, short fakevar);
#ifdef POLYMOST
#include "compat.h"
#include "build.h"
#include "glbuild.h"
#include "pragmas.h"
#include "baselayer.h"
#include "osd.h"
#include "engine_priv.h"
#include "hightile.h"
#include "mdsprite.h"
#include "polymost.h"
#include "scriptfile.h"
#include "cache1d.h"
#include "kplib.h"
extern char textfont[2048], smalltextfont[2048];
int rendmode=0; int rendmode=0;
int usemodels=1, usehightile=1; int usemodels=1, usehightile=1;
@ -82,13 +100,12 @@ static double dxb1[MAXWALLSB], dxb2[MAXWALLSB];
#define LINTERPSIZ 4 //log2 of interpolation size. 4:pretty fast&acceptable quality, 0:best quality/slow! #define LINTERPSIZ 4 //log2 of interpolation size. 4:pretty fast&acceptable quality, 0:best quality/slow!
#define DEPTHDEBUG 0 //1:render distance instead of texture, for debugging only!, 0:default #define DEPTHDEBUG 0 //1:render distance instead of texture, for debugging only!, 0:default
#define FOGSCALE 0.0000640 #define FOGSCALE 0.0000640
#define PI 3.14159265358979323
float shadescale = 1.050; float shadescale = 1.050;
static double gyxscale, gxyaspect, gviewxrange, ghalfx, grhalfxdown10, grhalfxdown10x, ghoriz; double gyxscale, gxyaspect, gviewxrange, ghalfx, grhalfxdown10, grhalfxdown10x, ghoriz;
static double gcosang, gsinang, gcosang2, gsinang2; double gcosang, gsinang, gcosang2, gsinang2;
static double gchang, gshang, gctang, gstang, gvisibility; double gchang, gshang, gctang, gstang, gvisibility;
float gtang = 0.0; float gtang = 0.0;
double guo, gux, guy; //Screen-based texture mapping parameters double guo, gux, guy; //Screen-based texture mapping parameters
double gvo, gvx, gvy; double gvo, gvx, gvy;
@ -105,11 +122,7 @@ static int srepeat = 0, trepeat = 0;
int glredbluemode = 0; int glredbluemode = 0;
static int lastglredbluemode = 0, redblueclearcnt = 0; static int lastglredbluemode = 0, redblueclearcnt = 0;
static struct glfiltermodes struct glfiltermodes glfiltermodes[numglfiltermodes] =
{
char *name;
int min,mag;
} glfiltermodes[] =
{ {
{"GL_NEAREST",GL_NEAREST,GL_NEAREST}, {"GL_NEAREST",GL_NEAREST,GL_NEAREST},
{"GL_LINEAR",GL_LINEAR,GL_LINEAR}, {"GL_LINEAR",GL_LINEAR,GL_LINEAR},
@ -118,7 +131,6 @@ static struct glfiltermodes
{"GL_NEAREST_MIPMAP_LINEAR",GL_NEAREST_MIPMAP_LINEAR,GL_NEAREST}, {"GL_NEAREST_MIPMAP_LINEAR",GL_NEAREST_MIPMAP_LINEAR,GL_NEAREST},
{"GL_LINEAR_MIPMAP_LINEAR",GL_LINEAR_MIPMAP_LINEAR,GL_LINEAR} {"GL_LINEAR_MIPMAP_LINEAR",GL_LINEAR_MIPMAP_LINEAR,GL_LINEAR}
}; };
#define numglfiltermodes (sizeof(glfiltermodes)/sizeof(glfiltermodes[0]))
int glanisotropy = 1; // 0 = maximum supported by card int glanisotropy = 1; // 0 = maximum supported by card
int glusetexcompr = 1; int glusetexcompr = 1;
@ -144,15 +156,15 @@ static int shadeforfullbrightpass;
int r_depthpeeling = 0; // cvar toggling general depth peeling usage int r_depthpeeling = 0; // cvar toggling general depth peeling usage
int r_peelscount = 5; // cvar controlling the number of peeling layers int r_peelscount = 5; // cvar controlling the number of peeling layers
int r_curpeel = -1; // cvar controlling the display of independant peeling layers int r_curpeel = -1; // cvar controlling the display of independant peeling layers
static float curpolygonoffset; // internal polygon offset stack for drawing flat sprites to avoid depth fighting float curpolygonoffset; // internal polygon offset stack for drawing flat sprites to avoid depth fighting
static int peelcompiling = 0; // internal control var to disable blending when compiling the peeling display list int peelcompiling = 0; // internal control var to disable blending when compiling the peeling display list
static int newpeelscount = 0; // temporary var for peels count changing during the game int newpeelscount = 0; // temporary var for peels count changing during the game
// Depth peeling data // Depth peeling data
static GLuint ztexture[3]; // secondary Z-buffers identifier GLuint ztexture[3]; // secondary Z-buffers identifier
static GLuint *peels; // peels identifiers GLuint *peels; // peels identifiers
static GLuint *peelfbos; // peels FBOs identifiers GLuint *peelfbos; // peels FBOs identifiers
static GLuint peelprogram[2]; // ARBfp peeling fragment program GLuint peelprogram[2]; // ARBfp peeling fragment program
// Detail mapping cvar // Detail mapping cvar
int r_detailmapping = 1; int r_detailmapping = 1;
@ -195,6 +207,8 @@ static float fogresult, fogcol[4];
} }
#endif #endif
static char tempbuf[MAXWALLSB<<1];
// polymost ART sky control // polymost ART sky control
int r_parallaxskyclamping = 1; int r_parallaxskyclamping = 1;
int r_parallaxskypanning = 0; int r_parallaxskypanning = 0;
@ -310,9 +324,6 @@ void drawline2d(float x0, float y0, float x1, float y1, char col)
} }
#ifdef USE_OPENGL #ifdef USE_OPENGL
typedef struct { unsigned char r, g, b, a; } coltype;
static void uploadtexture(int doalloc, int xsiz, int ysiz, int intexfmt, int texfmt, coltype *pic, int tsizx, int tsizy, int dameth);
#include "md4.h" #include "md4.h"
@ -328,51 +339,18 @@ static void uploadtexture(int doalloc, int xsiz, int ysiz, int intexfmt, int tex
int cachefilehandle = -1; // texture cache file handle int cachefilehandle = -1; // texture cache file handle
FILE *cacheindexptr = NULL; FILE *cacheindexptr = NULL;
static struct HASH_table cacheH = { MAXTILES<<2, NULL }; struct HASH_table cacheH = { MAXTILES<<2, NULL };
char TEXCACHEFILE[BMAX_PATH] = "textures"; char TEXCACHEFILE[BMAX_PATH] = "textures";
typedef struct
{
char magic[4]; // 'PMST', was 'Polymost'
int xdim, ydim; // of image, unpadded
int flags; // 1 = !2^x, 2 = has alpha, 4 = lzw compressed
int quality; // r_downsize at the time the cache was written
} texcacheheader;
typedef struct
{
int size;
int format;
int xdim, ydim; // of mipmap (possibly padded)
int border, depth;
} texcachepicture;
int dxtfilter(int fil, texcachepicture *pict, char *pic, void *midbuf, char *packbuf, unsigned int miplen);
int dedxtfilter(int fil, texcachepicture *pict, char *pic, void *midbuf, char *packbuf, int ispacked);
static inline void phex(unsigned char v, char *s);
void writexcache(char *fn, int len, int dameth, char effect, texcacheheader *head);
int mdtims, omdtims; int mdtims, omdtims;
float alphahackarray[MAXTILES]; float alphahackarray[MAXTILES];
struct cache_entry
{
char name[BMAX_PATH];
int offset;
int len;
struct cache_entry *next;
};
typedef struct cache_entry texcacheindex;
texcacheindex firstcacheindex; texcacheindex firstcacheindex;
texcacheindex *datextures = NULL; texcacheindex *datextures = NULL;
texcacheindex *cacheptrs[MAXTILES<<2]; texcacheindex *cacheptrs[MAXTILES<<2];
int numcacheentries = 0; int numcacheentries = 0;
#include "mdsprite.c"
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
//TEXTURE MANAGEMENT: treats same texture with different .PAL as a separate texture. This makes the //TEXTURE MANAGEMENT: treats same texture with different .PAL as a separate texture. This makes the
// max number of virtual textures very large (MAXTILES*256). Instead of allocating a handle for // max number of virtual textures very large (MAXTILES*256). Instead of allocating a handle for
@ -398,7 +376,7 @@ int numcacheentries = 0;
} pthtyp;*/ } pthtyp;*/
#define GLTEXCACHEADSIZ 8192 #define GLTEXCACHEADSIZ 8192
static pthtyp *gltexcachead[GLTEXCACHEADSIZ]; pthtyp *gltexcachead[GLTEXCACHEADSIZ];
int drawingskybox = 0; int drawingskybox = 0;
@ -654,7 +632,7 @@ void gltexapplyprops(void)
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
static int LoadCacheOffsets(void); static int LoadCacheOffsets(void);
static float glox1, gloy1, glox2, gloy2; float glox1, gloy1, glox2, gloy2;
//Use this for both initialization and uninitialization of OpenGL. //Use this for both initialization and uninitialization of OpenGL.
static int gltexcacnum = -1; static int gltexcacnum = -1;
@ -1140,7 +1118,7 @@ void fixtransparency(coltype *dapic, int daxsiz, int daysiz, int daxsiz2, int da
} }
} }
static void uploadtexture(int doalloc, int xsiz, int ysiz, int intexfmt, int texfmt, coltype *pic, int tsizx, int tsizy, int dameth) void uploadtexture(int doalloc, int xsiz, int ysiz, int intexfmt, int texfmt, coltype *pic, int tsizx, int tsizy, int dameth)
{ {
coltype *wpptr, *rpptr; coltype *wpptr, *rpptr;
int x2, y2, j, js=0, x3, y3, y, x, r, g, b, a, k; int x2, y2, j, js=0, x3, y3, y, x, r, g, b, a, k;
@ -1423,7 +1401,7 @@ static int LoadCacheOffsets(void)
return 0; return 0;
} }
static inline void phex(unsigned char v, char *s) void phex(unsigned char v, char *s)
{ {
int x; int x;
x = v>>4; x = v>>4;
@ -1513,7 +1491,7 @@ void writexcache(char *fn, int len, int dameth, char effect, texcacheheader *hea
void *midbuf = NULL; void *midbuf = NULL;
unsigned int alloclen=0, level, miplen; unsigned int alloclen=0, level, miplen;
unsigned int padx=0, pady=0; unsigned int padx=0, pady=0;
GLuint gi; GLint gi;
int offset = 0; int offset = 0;
if (!glinfo.texcompr || !glusetexcompr || !glusetexcache || !cacheindexptr || cachefilehandle < 0) return; if (!glinfo.texcompr || !glusetexcompr || !glusetexcache || !cacheindexptr || cachefilehandle < 0) return;
@ -4198,7 +4176,6 @@ static void polymost_drawalls(int bunch)
} }
} }
static int wallfront(int, int);
static int polymost_bunchfront(int b1, int b2) static int polymost_bunchfront(int b1, int b2)
{ {
double x1b1, x1b2, x2b1, x2b2; double x1b1, x1b2, x2b1, x2b2;
@ -4749,10 +4726,6 @@ void polymost_drawmaskwall(int damaskwallcnt)
drawpoly(dpx,dpy,n,method); drawpoly(dpx,dpy,n,method);
} }
#define CULL_OFFSET 384
#define CULL_DELAY 2
#define MAXCULLCHECKS 1024
int lastcullcheck = 0; int lastcullcheck = 0;
char cullmodel[MAXSPRITES]; char cullmodel[MAXSPRITES];
int cullcheckcnt = 0; int cullcheckcnt = 0;
@ -6729,4 +6702,11 @@ int dedxtfilter(int fil, texcachepicture *pict, char *pic, void *midbuf, char *p
return 0; return 0;
} }
#endif #endif
#else /* POLYMOST */
int polymost_drawtilescreen (int tilex, int tiley, int wallnum, int dimen) { return -1; }
#endif
// vim:ts=4:sw=4: // vim:ts=4:sw=4:

View file

@ -36,9 +36,6 @@ extern "C" {
#include "compat.h" #include "compat.h"
#include "a.h" #include "a.h"
#include "build.h" #include "build.h"
#if defined(POLYMOST) && defined(USE_OPENGL)
# include "polymost.h"
#endif
#ifdef POLYMER #ifdef POLYMER
# include "polymer.h" # include "polymer.h"
#endif #endif

View file

@ -44,6 +44,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "kplib.h" #include "kplib.h"
//#include "crc32.h" //#include "crc32.h"
#include "util_lib.h" #include "util_lib.h"
#include "hightile.h"
#ifdef _WIN32 #ifdef _WIN32
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN

View file

@ -910,7 +910,12 @@ static int X_DoExecute(void)
insptr++; insptr++;
if (g_sp->picnum == APLAYER) if (g_sp->picnum == APLAYER)
g_sp->pal = g_player[g_sp->yvel].ps->palookup; g_sp->pal = g_player[g_sp->yvel].ps->palookup;
else g_sp->pal = ActorExtra[g_i].tempang; else
{
if (g_sp->pal == 1 && g_sp->extra == 0) // hack for frozen
g_sp->extra++;
g_sp->pal = ActorExtra[g_i].tempang;
}
ActorExtra[g_i].tempang = 0; ActorExtra[g_i].tempang = 0;
break; break;