2006-04-23 06:44:19 +00:00
/*
* Definitions file parser for Build
* by Jonathon Fowler ( jonof @ edgenetwork . org )
* Remixed substantially by Ken Silverman
* See the included license file " BUILDLIC.TXT " for license info .
*/
# include "build.h"
# include "compat.h"
# include "baselayer.h"
# include "scriptfile.h"
2006-04-13 20:47:06 +00:00
# include "cache1d.h"
2007-05-01 04:35:27 +00:00
# include "kplib.h"
2006-04-13 20:47:06 +00:00
2007-12-12 17:42:14 +00:00
enum
{
2006-04-24 19:04:22 +00:00
T_EOF = - 2 ,
T_ERROR = - 1 ,
T_INCLUDE = 0 ,
T_DEFINE ,
T_DEFINETEXTURE ,
T_DEFINESKYBOX ,
T_DEFINETINT ,
2007-12-20 19:14:38 +00:00
T_DEFINECONV ,
2006-04-24 19:04:22 +00:00
T_DEFINEMODEL ,
T_DEFINEMODELFRAME ,
T_DEFINEMODELANIM ,
T_DEFINEMODELSKIN ,
T_SELECTMODELSKIN ,
T_DEFINEVOXEL ,
T_DEFINEVOXELTILES ,
T_MODEL ,
T_FILE ,
T_SCALE ,
T_SHADE ,
T_FRAME ,
2007-04-12 03:09:41 +00:00
T_SMOOTHDURATION ,
2006-04-24 19:04:22 +00:00
T_ANIM ,
T_SKIN ,
T_SURF ,
T_TILE ,
T_TILE0 ,
T_TILE1 ,
T_FRAME0 ,
T_FRAME1 ,
T_FPS ,
T_FLAGS ,
T_PAL ,
2007-01-15 09:08:57 +00:00
T_DETAIL ,
2007-02-15 01:35:34 +00:00
T_GLOW ,
2007-02-16 01:34:41 +00:00
T_PARAM ,
2006-04-24 19:04:22 +00:00
T_HUD ,
T_XADD ,
T_YADD ,
T_ZADD ,
T_ANGADD ,
T_FLIPPED ,
T_HIDE ,
T_NOBOB ,
T_NODEPTH ,
T_VOXEL ,
T_SKYBOX ,
T_FRONT , T_RIGHT , T_BACK , T_LEFT , T_TOP , T_BOTTOM ,
T_TINT , T_RED , T_GREEN , T_BLUE ,
2008-08-26 04:00:42 +00:00
T_TEXTURE , T_ALPHACUT , T_XSCALE , T_YSCALE , T_NOCOMPRESS , T_NODOWNSIZE ,
2006-04-24 19:04:22 +00:00
T_UNDEFMODEL , T_UNDEFMODELRANGE , T_UNDEFMODELOF , T_UNDEFTEXTURE , T_UNDEFTEXTURERANGE ,
T_ALPHAHACK , T_ALPHAHACKRANGE ,
T_SPRITECOL , T_2DCOL ,
T_FOGPAL ,
T_LOADGRP ,
2006-07-20 01:50:56 +00:00
T_DUMMYTILE , T_DUMMYTILERANGE ,
2008-03-27 21:32:23 +00:00
T_SETUPTILE , T_SETUPTILERANGE ,
2008-08-02 13:00:41 +00:00
T_ANIMTILERANGE ,
2007-12-20 19:14:38 +00:00
T_CACHESIZE ,
2008-11-24 09:22:07 +00:00
T_IMPORTTILE ,
2007-12-20 19:14:38 +00:00
T_MUSIC , T_ID , T_SOUND ,
2008-11-24 11:31:05 +00:00
T_REDPAL , T_BLUEPAL , T_BROWNPAL , T_GREYPAL , T_GREENPAL , T_SPECPAL ,
T_TILEFROMTEXTURE ,
2006-04-23 06:44:19 +00:00
} ;
typedef struct { char * text ; int tokenid ; } tokenlist ;
2006-04-24 19:04:22 +00:00
static tokenlist basetokens [ ] =
2007-12-12 17:42:14 +00:00
{
{ " include " , T_INCLUDE } ,
{ " #include " , T_INCLUDE } ,
{ " define " , T_DEFINE } ,
{ " #define " , T_DEFINE } ,
// deprecated style
{ " definetexture " , T_DEFINETEXTURE } ,
{ " defineskybox " , T_DEFINESKYBOX } ,
{ " definetint " , T_DEFINETINT } ,
2007-12-20 19:14:38 +00:00
{ " defineconv " , T_DEFINECONV } ,
2007-12-12 17:42:14 +00:00
{ " definemodel " , T_DEFINEMODEL } ,
{ " definemodelframe " , T_DEFINEMODELFRAME } ,
{ " definemodelanim " , T_DEFINEMODELANIM } ,
{ " definemodelskin " , T_DEFINEMODELSKIN } ,
{ " selectmodelskin " , T_SELECTMODELSKIN } ,
{ " definevoxel " , T_DEFINEVOXEL } ,
{ " definevoxeltiles " , T_DEFINEVOXELTILES } ,
// new style
{ " model " , T_MODEL } ,
{ " voxel " , T_VOXEL } ,
{ " skybox " , T_SKYBOX } ,
{ " tint " , T_TINT } ,
{ " texture " , T_TEXTURE } ,
{ " tile " , T_TEXTURE } ,
2007-12-20 19:14:38 +00:00
{ " music " , T_MUSIC } ,
{ " sound " , T_SOUND } ,
2007-12-12 17:42:14 +00:00
// other stuff
{ " undefmodel " , T_UNDEFMODEL } ,
{ " undefmodelrange " , T_UNDEFMODELRANGE } ,
{ " undefmodelof " , T_UNDEFMODELOF } ,
{ " undeftexture " , T_UNDEFTEXTURE } ,
{ " undeftexturerange " , T_UNDEFTEXTURERANGE } ,
{ " alphahack " , T_ALPHAHACK } ,
{ " alphahackrange " , T_ALPHAHACKRANGE } ,
{ " spritecol " , T_SPRITECOL } ,
{ " 2dcol " , T_2DCOL } ,
{ " fogpal " , T_FOGPAL } ,
{ " loadgrp " , T_LOADGRP } ,
{ " dummytile " , T_DUMMYTILE } ,
{ " dummytilerange " , T_DUMMYTILERANGE } ,
2008-03-27 21:32:23 +00:00
{ " setuptile " , T_SETUPTILE } ,
{ " setuptilerange " , T_SETUPTILERANGE } ,
2008-08-02 13:00:41 +00:00
{ " animtilerange " , T_ANIMTILERANGE } ,
2007-12-12 17:42:14 +00:00
{ " cachesize " , T_CACHESIZE } ,
2008-11-24 11:31:05 +00:00
{ " dummytilefrompic " , T_IMPORTTILE } ,
{ " tilefromtexture " , T_TILEFROMTEXTURE } ,
2007-12-12 17:42:14 +00:00
} ;
static tokenlist modeltokens [ ] =
{
{ " scale " , T_SCALE } ,
{ " shade " , T_SHADE } ,
{ " zadd " , T_ZADD } ,
{ " frame " , T_FRAME } ,
{ " anim " , T_ANIM } ,
{ " skin " , T_SKIN } ,
{ " glow " , T_GLOW } ,
{ " detail " , T_DETAIL } ,
2007-12-20 19:14:38 +00:00
{ " redmap " , T_REDPAL } ,
{ " bluepal " , T_BLUEPAL } ,
{ " brownpal " , T_BROWNPAL } ,
{ " greypal " , T_GREYPAL } ,
{ " greenpal " , T_GREENPAL } ,
{ " specpal " , T_SPECPAL } ,
2007-12-12 17:42:14 +00:00
{ " hud " , T_HUD } ,
2007-12-20 19:14:38 +00:00
{ " flags " , T_FLAGS } ,
2007-12-12 17:42:14 +00:00
} ;
static tokenlist modelframetokens [ ] =
{
2007-12-20 19:14:38 +00:00
{ " pal " , T_PAL } ,
2007-12-12 17:42:14 +00:00
{ " frame " , T_FRAME } ,
{ " name " , T_FRAME } ,
{ " tile " , T_TILE } ,
{ " tile0 " , T_TILE0 } ,
{ " tile1 " , T_TILE1 } ,
{ " smoothduration " , T_SMOOTHDURATION } ,
} ;
static tokenlist modelanimtokens [ ] =
{
{ " frame0 " , T_FRAME0 } ,
{ " frame1 " , T_FRAME1 } ,
{ " fps " , T_FPS } ,
{ " flags " , T_FLAGS } ,
} ;
static tokenlist modelskintokens [ ] =
{
{ " pal " , T_PAL } ,
{ " file " , T_FILE } ,
{ " surf " , T_SURF } ,
{ " surface " , T_SURF } ,
{ " intensity " , T_PARAM } ,
{ " scale " , T_PARAM } ,
{ " detailscale " , T_PARAM } ,
} ;
static tokenlist modelhudtokens [ ] =
{
{ " tile " , T_TILE } ,
{ " tile0 " , T_TILE0 } ,
{ " tile1 " , T_TILE1 } ,
{ " xadd " , T_XADD } ,
{ " yadd " , T_YADD } ,
{ " zadd " , T_ZADD } ,
{ " angadd " , T_ANGADD } ,
{ " hide " , T_HIDE } ,
{ " nobob " , T_NOBOB } ,
{ " flipped " , T_FLIPPED } ,
{ " nodepth " , T_NODEPTH } ,
} ;
static tokenlist voxeltokens [ ] =
{
{ " tile " , T_TILE } ,
{ " tile0 " , T_TILE0 } ,
{ " tile1 " , T_TILE1 } ,
{ " scale " , T_SCALE } ,
} ;
static tokenlist skyboxtokens [ ] =
{
{ " tile " , T_TILE } ,
{ " pal " , T_PAL } ,
{ " ft " , T_FRONT } , { " front " , T_FRONT } , { " forward " , T_FRONT } ,
{ " rt " , T_RIGHT } , { " right " , T_RIGHT } ,
{ " bk " , T_BACK } , { " back " , T_BACK } ,
{ " lf " , T_LEFT } , { " left " , T_LEFT } , { " lt " , T_LEFT } ,
{ " up " , T_TOP } , { " top " , T_TOP } , { " ceiling " , T_TOP } , { " ceil " , T_TOP } ,
{ " dn " , T_BOTTOM } , { " bottom " , T_BOTTOM } , { " floor " , T_BOTTOM } , { " down " , T_BOTTOM }
} ;
static tokenlist tinttokens [ ] =
{
{ " pal " , T_PAL } ,
{ " red " , T_RED } , { " r " , T_RED } ,
{ " green " , T_GREEN } , { " g " , T_GREEN } ,
{ " blue " , T_BLUE } , { " b " , T_BLUE } ,
{ " flags " , T_FLAGS }
} ;
static tokenlist texturetokens [ ] =
{
{ " pal " , T_PAL } ,
{ " detail " , T_DETAIL } ,
{ " glow " , T_GLOW } ,
2007-12-20 19:14:38 +00:00
{ " redmap " , T_REDPAL } ,
{ " bluepal " , T_BLUEPAL } ,
{ " brownpal " , T_BROWNPAL } ,
{ " greypal " , T_GREYPAL } ,
{ " greenpal " , T_GREENPAL } ,
{ " specpal " , T_SPECPAL } ,
2007-12-12 17:42:14 +00:00
} ;
2008-11-24 11:31:05 +00:00
2007-12-12 17:42:14 +00:00
static tokenlist texturetokens_pal [ ] =
{
{ " file " , T_FILE } , { " name " , T_FILE } ,
{ " alphacut " , T_ALPHACUT } ,
{ " detailscale " , T_XSCALE } , { " scale " , T_XSCALE } , { " xscale " , T_XSCALE } , { " intensity " , T_XSCALE } ,
{ " yscale " , T_YSCALE } ,
{ " nocompress " , T_NOCOMPRESS } ,
2008-08-26 04:00:42 +00:00
{ " nodownsize " , T_NODOWNSIZE } ,
2007-12-12 17:42:14 +00:00
} ;
2006-04-23 06:44:19 +00:00
2008-03-08 05:23:15 +00:00
static tokenlist sound_musictokens [ ] =
2007-12-20 19:14:38 +00:00
{
{ " id " , T_ID } ,
{ " file " , T_FILE } ,
} ;
2008-11-24 11:31:05 +00:00
static tokenlist tilefromtexturetokens [ ] =
{
{ " file " , T_FILE } ,
{ " name " , T_FILE } ,
{ " alphacut " , T_ALPHACUT } ,
} ;
2006-04-23 06:44:19 +00:00
static int getatoken ( scriptfile * sf , tokenlist * tl , int ntokens )
{
2006-04-24 19:04:22 +00:00
char * tok ;
int i ;
2006-04-23 06:44:19 +00:00
2006-04-24 19:04:22 +00:00
if ( ! sf ) return T_ERROR ;
tok = scriptfile_gettoken ( sf ) ;
if ( ! tok ) return T_EOF ;
2006-04-23 06:44:19 +00:00
2007-12-12 17:42:14 +00:00
for ( i = 0 ; i < ntokens ; i + + )
{
2006-04-24 19:04:22 +00:00
if ( ! Bstrcasecmp ( tok , tl [ i ] . text ) )
return tl [ i ] . tokenid ;
}
2006-04-23 06:44:19 +00:00
2006-04-24 19:04:22 +00:00
return T_ERROR ;
2006-04-23 06:44:19 +00:00
}
static int lastmodelid = - 1 , lastvoxid = - 1 , modelskin = - 1 , lastmodelskin = - 1 , seenframe = 0 ;
extern int nextvoxid ;
2006-04-13 20:47:06 +00:00
2008-11-24 11:31:05 +00:00
extern char faketile [ MAXTILES ] ;
extern char * faketiledata [ MAXTILES ] ;
extern int getclosestcol ( int r , int g , int b ) ;
2006-05-12 21:55:05 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2006-04-13 20:47:06 +00:00
extern float alphahackarray [ MAXTILES ] ;
2006-05-12 21:55:05 +00:00
# endif
2006-04-13 20:47:06 +00:00
extern char spritecol2d [ MAXTILES ] [ 2 ] ;
extern char vgapal16 [ 4 * 256 ] ;
2007-12-12 17:42:14 +00:00
static const char * skyfaces [ 6 ] =
{
" front face " , " right face " , " back face " ,
" left face " , " top face " , " bottom face "
} ;
2006-04-23 06:44:19 +00:00
static int defsparser ( scriptfile * script )
{
2006-04-24 19:04:22 +00:00
int tokn ;
char * cmdtokptr ;
2007-12-12 17:42:14 +00:00
while ( 1 )
{
2008-08-20 09:17:23 +00:00
if ( quitevent ) return 0 ;
2006-04-24 19:04:22 +00:00
tokn = getatoken ( script , basetokens , sizeof ( basetokens ) / sizeof ( tokenlist ) ) ;
cmdtokptr = script - > ltextptr ;
2007-12-12 17:42:14 +00:00
switch ( tokn )
{
2006-04-24 19:04:22 +00:00
case T_ERROR :
initprintf ( " Error on line %s:%d. \n " , script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
break ;
case T_EOF :
return ( 0 ) ;
case T_INCLUDE :
2006-11-13 23:12:47 +00:00
{
char * fn ;
2007-12-12 17:42:14 +00:00
if ( ! scriptfile_getstring ( script , & fn ) )
{
2006-11-13 23:12:47 +00:00
scriptfile * included ;
included = scriptfile_fromfile ( fn ) ;
2007-12-12 17:42:14 +00:00
if ( ! included )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Warning: Failed including %s on line %s:%d \n " ,
fn , script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
2007-12-12 17:42:14 +00:00
}
else
{
2006-11-13 23:12:47 +00:00
defsparser ( included ) ;
scriptfile_close ( included ) ;
2006-04-24 19:04:22 +00:00
}
}
2006-11-13 23:12:47 +00:00
break ;
}
2006-04-24 19:04:22 +00:00
case T_DEFINE :
2006-11-13 23:12:47 +00:00
{
char * name ;
int number ;
2006-04-24 19:04:22 +00:00
2006-11-13 23:12:47 +00:00
if ( scriptfile_getstring ( script , & name ) ) break ;
if ( scriptfile_getsymbol ( script , & number ) ) break ;
2006-04-24 19:04:22 +00:00
2006-11-13 23:12:47 +00:00
if ( scriptfile_addsymbolvalue ( name , number ) < 0 )
initprintf ( " Warning: Symbol %s was NOT redefined to %d on line %s:%d \n " ,
name , number , script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
break ;
}
2006-04-24 19:04:22 +00:00
2006-11-13 23:12:47 +00:00
// OLD (DEPRECATED) DEFINITION SYNTAX
2006-04-24 19:04:22 +00:00
case T_DEFINETEXTURE :
2006-11-13 23:12:47 +00:00
{
int tile , pal , fnoo , i ;
2007-04-30 19:41:19 +00:00
char * fn , * tfn = NULL ;
2006-11-13 23:12:47 +00:00
if ( scriptfile_getsymbol ( script , & tile ) ) break ;
if ( scriptfile_getsymbol ( script , & pal ) ) break ;
if ( scriptfile_getnumber ( script , & fnoo ) ) break ; //x-center
if ( scriptfile_getnumber ( script , & fnoo ) ) break ; //y-center
if ( scriptfile_getnumber ( script , & fnoo ) ) break ; //x-size
if ( scriptfile_getnumber ( script , & fnoo ) ) break ; //y-size
if ( scriptfile_getstring ( script , & fn ) ) break ;
2007-04-30 19:41:19 +00:00
i = pathsearchmode ;
2007-05-01 04:35:27 +00:00
pathsearchmode = 1 ;
2007-12-12 17:42:14 +00:00
if ( findfrompath ( fn , & tfn ) < 0 )
{
2007-05-01 04:35:27 +00:00
char buf [ BMAX_PATH ] ;
Bstrcpy ( buf , fn ) ;
kzfindfilestart ( buf ) ;
2007-12-12 17:42:14 +00:00
if ( ! kzfindfile ( buf ) )
{
2007-05-01 04:35:27 +00:00
initprintf ( " Error: file '%s' does not exist \n " , fn ) ;
2008-02-01 03:36:54 +00:00
pathsearchmode = i ;
2007-05-01 04:35:27 +00:00
break ;
2007-12-12 17:42:14 +00:00
}
}
else Bfree ( tfn ) ;
2007-04-30 19:41:19 +00:00
pathsearchmode = i ;
2006-10-31 18:32:29 +00:00
2007-02-17 02:23:50 +00:00
hicsetsubsttex ( tile , pal , fn , - 1.0 , 1.0 , 1.0 , 0 ) ;
2006-11-13 23:12:47 +00:00
}
break ;
2006-04-24 19:04:22 +00:00
case T_DEFINESKYBOX :
2006-11-13 23:12:47 +00:00
{
2008-03-22 10:23:57 +00:00
int tile , pal , i , ii ;
2007-04-30 19:41:19 +00:00
char * fn [ 6 ] , happy = 1 , * tfn = NULL ;
2006-11-13 23:12:47 +00:00
if ( scriptfile_getsymbol ( script , & tile ) ) break ;
if ( scriptfile_getsymbol ( script , & pal ) ) break ;
if ( scriptfile_getsymbol ( script , & i ) ) break ; //future expansion
2007-12-12 17:42:14 +00:00
for ( i = 0 ; i < 6 ; i + + )
{
2006-11-13 23:12:47 +00:00
if ( scriptfile_getstring ( script , & fn [ i ] ) ) break ; //grab the 6 faces
2007-04-30 19:41:19 +00:00
ii = pathsearchmode ;
pathsearchmode = 1 ;
2007-12-12 17:42:14 +00:00
if ( findfrompath ( fn [ i ] , & tfn ) < 0 )
{
2007-05-01 04:35:27 +00:00
char buf [ BMAX_PATH ] ;
Bstrcpy ( buf , fn [ i ] ) ;
kzfindfilestart ( buf ) ;
2007-12-12 17:42:14 +00:00
if ( ! kzfindfile ( buf ) )
{
2007-05-01 04:35:27 +00:00
initprintf ( " Error: file '%s' does not exist \n " , fn [ i ] ) ;
happy = 0 ;
2007-12-12 17:42:14 +00:00
}
}
else Bfree ( tfn ) ;
2007-04-30 19:41:19 +00:00
pathsearchmode = ii ;
2006-04-24 19:04:22 +00:00
}
2006-11-13 23:12:47 +00:00
if ( i < 6 | | ! happy ) break ;
hicsetskybox ( tile , pal , fn ) ;
}
break ;
2006-04-24 19:04:22 +00:00
case T_DEFINETINT :
2006-11-13 23:12:47 +00:00
{
int pal , r , g , b , f ;
if ( scriptfile_getsymbol ( script , & pal ) ) break ;
if ( scriptfile_getnumber ( script , & r ) ) break ;
if ( scriptfile_getnumber ( script , & g ) ) break ;
if ( scriptfile_getnumber ( script , & b ) ) break ;
if ( scriptfile_getnumber ( script , & f ) ) break ; //effects
hicsetpalettetint ( pal , r , g , b , f ) ;
}
break ;
2007-12-20 19:14:38 +00:00
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 ;
2008-01-27 23:28:45 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2007-12-20 19:14:38 +00:00
setpalconv ( pal , pal1 , pal2 ) ;
2008-01-27 23:28:45 +00:00
# endif
2007-12-20 19:14:38 +00:00
}
break ;
2006-04-24 19:04:22 +00:00
case T_ALPHAHACK :
2006-11-13 23:12:47 +00:00
{
int tile ;
double alpha ;
2006-04-24 19:04:22 +00:00
2006-11-13 23:12:47 +00:00
if ( scriptfile_getsymbol ( script , & tile ) ) break ;
if ( scriptfile_getdouble ( script , & alpha ) ) break ;
2006-05-12 21:55:05 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2007-12-12 17:42:14 +00:00
if ( ( unsigned int ) tile < MAXTILES ) alphahackarray [ tile ] = alpha ;
2006-05-12 21:55:05 +00:00
# endif
2006-11-13 23:12:47 +00:00
}
break ;
2006-04-24 19:04:22 +00:00
case T_ALPHAHACKRANGE :
2006-11-13 23:12:47 +00:00
{
int tilenume1 , tilenume2 , i ;
double alpha ;
if ( scriptfile_getsymbol ( script , & tilenume1 ) ) break ;
if ( scriptfile_getsymbol ( script , & tilenume2 ) ) break ;
if ( scriptfile_getdouble ( script , & alpha ) ) break ;
2007-12-12 17:42:14 +00:00
if ( tilenume2 < tilenume1 )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Warning: backwards tile range on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
i = tilenume2 ;
tilenume2 = tilenume1 ;
tilenume1 = i ;
}
2006-05-12 21:55:05 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2006-11-13 23:12:47 +00:00
if ( ( tilenume1 > = 0 & & tilenume1 < MAXTILES ) & & ( tilenume2 > = 0 & & tilenume2 < MAXTILES ) )
{
for ( i = tilenume1 ; i < = tilenume2 ; i + + )
2006-04-24 19:04:22 +00:00
{
2007-12-12 17:42:14 +00:00
if ( ( unsigned int ) i < MAXTILES )
2006-11-13 23:12:47 +00:00
alphahackarray [ i ] = alpha ;
2006-04-24 19:04:22 +00:00
}
}
2006-11-13 23:12:47 +00:00
# endif
}
break ;
2006-04-24 19:04:22 +00:00
case T_SPRITECOL :
2006-11-13 23:12:47 +00:00
{
int tile , col , col2 ;
2006-04-24 19:04:22 +00:00
2006-11-13 23:12:47 +00:00
if ( scriptfile_getsymbol ( script , & tile ) ) break ;
if ( scriptfile_getnumber ( script , & col ) ) break ;
if ( scriptfile_getnumber ( script , & col2 ) ) break ;
2007-12-12 17:42:14 +00:00
if ( ( unsigned int ) tile < MAXTILES )
2006-11-13 23:12:47 +00:00
{
spritecol2d [ tile ] [ 0 ] = col ;
spritecol2d [ tile ] [ 1 ] = col2 ;
2006-04-24 19:04:22 +00:00
}
2006-11-13 23:12:47 +00:00
}
break ;
2006-04-24 19:04:22 +00:00
case T_2DCOL :
2006-11-13 23:12:47 +00:00
{
int col , b , g , r ;
if ( scriptfile_getnumber ( script , & col ) ) break ;
if ( scriptfile_getnumber ( script , & r ) ) break ;
if ( scriptfile_getnumber ( script , & g ) ) break ;
if ( scriptfile_getnumber ( script , & b ) ) break ;
2007-12-12 17:42:14 +00:00
if ( col < 256 )
{
2006-11-13 23:12:47 +00:00
vgapal16 [ col * 4 + 0 ] = b ; // blue
vgapal16 [ col * 4 + 1 ] = g ; // green
vgapal16 [ col * 4 + 2 ] = r ; // red
2006-04-24 19:04:22 +00:00
}
2006-11-13 23:12:47 +00:00
}
break ;
2006-04-24 19:04:22 +00:00
case T_FOGPAL :
2006-11-13 23:12:47 +00:00
{
int p , r , g , b , j ;
char tempbuf [ 256 ] ;
if ( scriptfile_getnumber ( script , & p ) ) break ;
if ( scriptfile_getnumber ( script , & r ) ) break ;
if ( scriptfile_getnumber ( script , & g ) ) break ;
if ( scriptfile_getnumber ( script , & b ) ) break ;
for ( j = 0 ; j < 256 ; j + + )
tempbuf [ j ] = j ;
makepalookup ( p , tempbuf , r , g , b , 1 ) ;
}
break ;
2006-04-24 19:04:22 +00:00
case T_LOADGRP :
2006-11-13 23:12:47 +00:00
{
char * bs ;
scriptfile_getstring ( script , & bs ) ;
}
break ;
2007-01-02 02:27:31 +00:00
case T_CACHESIZE :
{
int j ;
2007-12-12 17:42:14 +00:00
2007-01-02 02:27:31 +00:00
if ( scriptfile_getnumber ( script , & j ) ) break ;
}
break ;
2008-03-27 21:32:23 +00:00
case T_SETUPTILE :
{
int tile , tmp ;
if ( scriptfile_getsymbol ( script , & tile ) ) break ;
if ( tile > = MAXTILES ) break ;
if ( scriptfile_getsymbol ( script , & h_xsize [ tile ] ) ) break ;
if ( scriptfile_getsymbol ( script , & h_ysize [ tile ] ) ) break ;
if ( scriptfile_getsymbol ( script , & tmp ) ) break ;
h_xoffs [ tile ] = tmp ;
if ( scriptfile_getsymbol ( script , & tmp ) ) break ;
h_yoffs [ tile ] = tmp ;
break ;
}
case T_SETUPTILERANGE :
{
int tile1 , tile2 , xsiz , ysiz , xoffs , yoffs , i ;
if ( scriptfile_getnumber ( script , & tile1 ) ) break ;
if ( scriptfile_getnumber ( script , & tile2 ) ) break ;
if ( scriptfile_getnumber ( script , & xsiz ) ) break ;
if ( scriptfile_getnumber ( script , & ysiz ) ) break ;
if ( scriptfile_getsymbol ( script , & xoffs ) ) break ;
if ( scriptfile_getsymbol ( script , & yoffs ) ) break ;
if ( tile2 < tile1 )
{
initprintf ( " Warning: backwards tile range on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
i = tile2 ;
tile2 = tile1 ;
tile1 = i ;
}
if ( ( tile1 > = 0 & & tile1 < MAXTILES ) & & ( tile2 > = 0 & & tile2 < MAXTILES ) )
{
for ( i = tile1 ; i < = tile2 ; i + + )
{
if ( ( unsigned int ) i < MAXTILES )
{
h_xsize [ i ] = xsiz ;
h_ysize [ i ] = ysiz ;
h_xoffs [ i ] = xoffs ;
h_yoffs [ i ] = yoffs ;
}
}
}
break ;
}
2008-08-02 13:00:41 +00:00
case T_ANIMTILERANGE :
{
int tile1 , tile2 , spd , type , i ;
if ( scriptfile_getsymbol ( script , & tile1 ) ) break ;
if ( tile1 > = MAXTILES ) break ;
if ( scriptfile_getsymbol ( script , & tile2 ) ) break ;
if ( tile2 > = MAXTILES ) break ;
if ( scriptfile_getsymbol ( script , & spd ) ) break ;
if ( scriptfile_getsymbol ( script , & type ) ) break ;
if ( tile2 < tile1 )
{
initprintf ( " Warning: backwards tile range on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
i = tile2 ;
tile2 = tile1 ;
tile1 = i ;
}
picanm [ tile1 ] = ( spd < < 24 ) + ( type < < 6 ) + tile2 - tile1 ;
break ;
}
2008-11-24 11:31:05 +00:00
case T_TILEFROMTEXTURE :
{
char * texturetokptr = script - > ltextptr , * textureend , * fn , * tfn = NULL ;
int tile = - 1 , token , i ;
int alphacut = 255 ;
if ( scriptfile_getsymbol ( script , & tile ) ) break ;
if ( scriptfile_getbraces ( script , & textureend ) ) break ;
while ( script - > textptr < textureend )
{
token = getatoken ( script , tilefromtexturetokens , sizeof ( tilefromtexturetokens ) / sizeof ( tokenlist ) ) ;
switch ( token )
{
case T_FILE :
scriptfile_getstring ( script , & fn ) ; break ;
case T_ALPHACUT :
scriptfile_getsymbol ( script , & alphacut ) ; break ;
default :
break ;
}
if ( ( unsigned ) tile > ( unsigned ) MAXTILES ) break ; // message is printed later
if ( ! fn )
{
initprintf ( " Error: missing 'file name' for tilefromtexture definition near line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , texturetokptr ) ) ;
break ;
}
if ( alphacut > 255 ) alphacut = 255 ;
if ( alphacut < 0 ) alphacut = 0 ;
i = pathsearchmode ;
pathsearchmode = 1 ;
if ( findfrompath ( fn , & tfn ) < 0 )
{
char buf [ BMAX_PATH ] ;
Bstrcpy ( buf , fn ) ;
kzfindfilestart ( buf ) ;
if ( ! kzfindfile ( buf ) )
{
initprintf ( " Error: file '%s' does not exist \n " , fn ) ;
pathsearchmode = i ;
break ;
}
}
else Bfree ( tfn ) ;
pathsearchmode = i ;
}
if ( ( unsigned ) tile > = ( unsigned ) MAXTILES )
{
initprintf ( " Error: missing or invalid 'tile number' for texture definition near line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , texturetokptr ) ) ;
break ;
}
{
int xsiz , ysiz , j ;
int * picptr = NULL ;
palette_t * col ;
kpzload ( fn , ( intptr_t * ) & picptr , & j , & xsiz , & ysiz ) ;
// initprintf("got bpl %d xsiz %d ysiz %d\n",bpl,xsiz,ysiz);
faketiledata [ tile ] = Bmalloc ( xsiz * ysiz ) ;
for ( i = xsiz - 1 ; i > = 0 ; i - - )
{
for ( j = ysiz - 1 ; j > = 0 ; j - - )
{
col = ( palette_t * ) & picptr [ j * xsiz + i ] ;
2008-11-25 13:06:36 +00:00
if ( col - > f < alphacut ) { faketiledata [ tile ] [ i * ysiz + j ] = 255 ; continue ; }
2008-11-24 11:31:05 +00:00
faketiledata [ tile ] [ i * ysiz + j ] = getclosestcol ( col - > b > > 2 , col - > g > > 2 , col - > r > > 2 ) ;
}
// initprintf(" %d %d %d %d\n",col->r,col->g,col->b,col->f);
}
if ( xsiz > 0 & & ysiz > 0 )
{
tilesizx [ tile ] = xsiz ;
tilesizy [ tile ] = ysiz ;
faketile [ tile ] = 2 ;
picanm [ tile ] = 0 ;
j = 15 ; while ( ( j > 1 ) & & ( pow2long [ j ] > xsiz ) ) j - - ;
picsiz [ tile ] = ( ( char ) j ) ;
j = 15 ; while ( ( j > 1 ) & & ( pow2long [ j ] > ysiz ) ) j - - ;
picsiz [ tile ] + = ( ( char ) ( j < < 4 ) ) ;
}
Bfree ( picptr ) ;
}
}
break ;
2008-11-24 09:22:07 +00:00
case T_IMPORTTILE :
{
2008-11-24 11:31:05 +00:00
int tile , xsiz , ysiz , j , i ;
2008-11-24 09:22:07 +00:00
int * picptr = NULL ;
int bpl ;
char * fn ;
palette_t * col ;
if ( scriptfile_getsymbol ( script , & tile ) ) break ;
if ( scriptfile_getstring ( script , & fn ) ) break ;
kpzload ( fn , ( intptr_t * ) & picptr , & bpl , & xsiz , & ysiz ) ;
2008-11-24 11:31:05 +00:00
// initprintf("got bpl %d xsiz %d ysiz %d\n",bpl,xsiz,ysiz);
2008-11-24 09:22:07 +00:00
faketiledata [ tile ] = Bmalloc ( xsiz * ysiz ) ;
2008-11-24 11:31:05 +00:00
for ( i = xsiz - 1 ; i > = 0 ; i - - )
2008-11-24 09:22:07 +00:00
{
2008-11-24 11:31:05 +00:00
for ( j = ysiz - 1 ; j > = 0 ; j - - )
{
col = ( palette_t * ) & picptr [ j * xsiz + i ] ;
if ( col - > f ! = 255 ) { faketiledata [ tile ] [ i * ysiz + j ] = 255 ; continue ; }
faketiledata [ tile ] [ i * ysiz + j ] = getclosestcol ( col - > b > > 2 , col - > g > > 2 , col - > r > > 2 ) ;
}
2008-11-24 09:22:07 +00:00
// initprintf(" %d %d %d %d\n",col->r,col->g,col->b,col->f);
}
if ( xsiz > 0 & & ysiz > 0 )
{
tilesizx [ tile ] = xsiz ;
tilesizy [ tile ] = ysiz ;
faketile [ tile ] = 2 ;
picanm [ tile ] = 0 ;
j = 15 ; while ( ( j > 1 ) & & ( pow2long [ j ] > xsiz ) ) j - - ;
picsiz [ tile ] = ( ( char ) j ) ;
j = 15 ; while ( ( j > 1 ) & & ( pow2long [ j ] > ysiz ) ) j - - ;
picsiz [ tile ] + = ( ( char ) ( j < < 4 ) ) ;
}
2008-11-24 11:31:05 +00:00
Bfree ( picptr ) ;
2008-11-24 09:22:07 +00:00
break ;
}
2006-04-26 01:25:18 +00:00
case T_DUMMYTILE :
2006-11-13 23:12:47 +00:00
{
int tile , xsiz , ysiz , j ;
extern char faketile [ MAXTILES ] ;
2006-04-26 01:25:18 +00:00
2006-11-13 23:12:47 +00:00
if ( scriptfile_getsymbol ( script , & tile ) ) break ;
if ( scriptfile_getsymbol ( script , & xsiz ) ) break ;
if ( scriptfile_getsymbol ( script , & ysiz ) ) break ;
2006-08-04 04:01:17 +00:00
2006-11-13 23:12:47 +00:00
if ( xsiz > 0 & & ysiz > 0 )
{
tilesizx [ tile ] = xsiz ;
tilesizy [ tile ] = ysiz ;
faketile [ tile ] = 1 ;
picanm [ tile ] = 0 ;
j = 15 ; while ( ( j > 1 ) & & ( pow2long [ j ] > xsiz ) ) j - - ;
picsiz [ tile ] = ( ( char ) j ) ;
j = 15 ; while ( ( j > 1 ) & & ( pow2long [ j ] > ysiz ) ) j - - ;
picsiz [ tile ] + = ( ( char ) ( j < < 4 ) ) ;
2006-04-26 01:25:18 +00:00
}
2006-11-13 23:12:47 +00:00
break ;
}
2006-04-26 01:25:18 +00:00
case T_DUMMYTILERANGE :
2006-11-13 23:12:47 +00:00
{
int tile1 , tile2 , xsiz , ysiz , i , j ;
extern char faketile [ MAXTILES ] ;
if ( scriptfile_getnumber ( script , & tile1 ) ) break ;
if ( scriptfile_getnumber ( script , & tile2 ) ) break ;
if ( scriptfile_getnumber ( script , & xsiz ) ) break ;
if ( scriptfile_getnumber ( script , & ysiz ) ) break ;
2007-12-12 17:42:14 +00:00
if ( tile2 < tile1 )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Warning: backwards tile range on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
i = tile2 ;
tile2 = tile1 ;
tile1 = i ;
}
if ( ( tile1 > = 0 & & tile1 < MAXTILES ) & & ( tile2 > = 0 & & tile2 < MAXTILES ) )
2006-04-26 01:25:18 +00:00
{
2006-11-13 23:12:47 +00:00
for ( i = tile1 ; i < = tile2 ; i + + )
2006-04-26 01:25:18 +00:00
{
2007-12-12 17:42:14 +00:00
if ( ( unsigned int ) i < MAXTILES )
2006-04-26 01:25:18 +00:00
{
2006-11-13 23:12:47 +00:00
if ( xsiz > 0 & & ysiz > 0 )
2006-04-26 01:25:18 +00:00
{
2006-11-13 23:12:47 +00:00
tilesizx [ i ] = xsiz ;
tilesizy [ i ] = ysiz ;
faketile [ i ] = 1 ;
picanm [ i ] = 0 ;
j = 15 ; while ( ( j > 1 ) & & ( pow2long [ j ] > xsiz ) ) j - - ;
picsiz [ i ] = ( ( char ) j ) ;
j = 15 ; while ( ( j > 1 ) & & ( pow2long [ j ] > ysiz ) ) j - - ;
picsiz [ i ] + = ( ( char ) ( j < < 4 ) ) ;
2006-04-26 01:25:18 +00:00
}
}
}
}
2006-11-13 23:12:47 +00:00
break ;
}
2006-04-26 01:25:18 +00:00
2006-04-24 19:04:22 +00:00
case T_DEFINEMODEL :
2006-11-13 23:12:47 +00:00
{
char * modelfn ;
double scale ;
int shadeoffs ;
2006-04-24 19:04:22 +00:00
2006-11-13 23:12:47 +00:00
if ( scriptfile_getstring ( script , & modelfn ) ) break ;
if ( scriptfile_getdouble ( script , & scale ) ) break ;
if ( scriptfile_getnumber ( script , & shadeoffs ) ) break ;
2006-04-23 06:44:19 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2006-11-13 23:12:47 +00:00
lastmodelid = md_loadmodel ( modelfn ) ;
2007-12-12 17:42:14 +00:00
if ( lastmodelid < 0 )
{
2008-07-20 04:12:52 +00:00
initprintf ( " Warning: Failed loading MD2/MD3 model \" %s \" \n " , modelfn ) ;
2006-11-13 23:12:47 +00:00
break ;
2006-04-24 19:04:22 +00:00
}
2007-12-20 19:14:38 +00:00
md_setmisc ( lastmodelid , ( float ) scale , shadeoffs , 0.0 , 0 ) ;
2006-04-23 06:44:19 +00:00
# endif
2006-11-13 23:12:47 +00:00
modelskin = lastmodelskin = 0 ;
seenframe = 0 ;
}
break ;
case T_DEFINEMODELFRAME :
{
2008-07-24 11:16:20 +00:00
char * framename ;
# if defined(POLYMOST) && defined(USE_OPENGL)
char happy = 1 ;
# endif
2006-11-13 23:12:47 +00:00
int ftilenume , ltilenume , tilex ;
if ( scriptfile_getstring ( script , & framename ) ) break ;
if ( scriptfile_getnumber ( script , & ftilenume ) ) break ; //first tile number
if ( scriptfile_getnumber ( script , & ltilenume ) ) break ; //last tile number (inclusive)
2007-12-12 17:42:14 +00:00
if ( ltilenume < ftilenume )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Warning: backwards tile range on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
tilex = ftilenume ;
ftilenume = ltilenume ;
ltilenume = tilex ;
2006-04-24 19:04:22 +00:00
}
2007-12-12 17:42:14 +00:00
if ( lastmodelid < 0 )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Warning: Ignoring frame definition. \n " ) ;
break ;
}
2006-04-23 06:44:19 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2007-12-12 17:42:14 +00:00
for ( tilex = ftilenume ; tilex < = ltilenume & & happy ; tilex + + )
{
2007-12-20 19:14:38 +00:00
switch ( md_defineframe ( lastmodelid , framename , tilex , max ( 0 , modelskin ) , 0.0f , 0 ) )
2007-12-12 17:42:14 +00:00
{
2006-11-13 23:12:47 +00:00
case 0 :
2006-04-24 19:04:22 +00:00
break ;
2006-11-13 23:12:47 +00:00
case - 1 :
happy = 0 ; break ; // invalid model id!?
case - 2 :
initprintf ( " Invalid tile number on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
happy = 0 ;
2006-04-24 19:04:22 +00:00
break ;
2006-11-13 23:12:47 +00:00
case - 3 :
initprintf ( " Invalid frame name on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
happy = 0 ;
2006-04-24 19:04:22 +00:00
break ;
}
2006-11-13 23:12:47 +00:00
}
2006-04-23 06:44:19 +00:00
# endif
2006-11-13 23:12:47 +00:00
seenframe = 1 ;
}
break ;
case T_DEFINEMODELANIM :
{
char * startframe , * endframe ;
int flags ;
double dfps ;
if ( scriptfile_getstring ( script , & startframe ) ) break ;
if ( scriptfile_getstring ( script , & endframe ) ) break ;
if ( scriptfile_getdouble ( script , & dfps ) ) break ; //animation frame rate
if ( scriptfile_getnumber ( script , & flags ) ) break ;
2007-12-12 17:42:14 +00:00
if ( lastmodelid < 0 )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Warning: Ignoring animation definition. \n " ) ;
break ;
2006-04-24 19:04:22 +00:00
}
2006-11-13 23:12:47 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2007-12-12 17:42:14 +00:00
switch ( md_defineanimation ( lastmodelid , startframe , endframe , ( int ) ( dfps * ( 65536.0 * .001 ) ) , flags ) )
{
2006-11-13 23:12:47 +00:00
case 0 :
break ;
case - 1 :
break ; // invalid model id!?
case - 2 :
initprintf ( " Invalid starting frame name on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
break ;
case - 3 :
initprintf ( " Invalid ending frame name on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
break ;
case - 4 :
initprintf ( " Out of memory on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
break ;
}
# endif
}
break ;
2006-04-24 19:04:22 +00:00
case T_DEFINEMODELSKIN :
2006-11-13 23:12:47 +00:00
{
2008-03-22 10:23:57 +00:00
int palnum ;
2006-11-13 23:12:47 +00:00
char * skinfn ;
if ( scriptfile_getsymbol ( script , & palnum ) ) break ;
if ( scriptfile_getstring ( script , & skinfn ) ) break ; //skin filename
// if we see a sequence of definemodelskin, then a sequence of definemodelframe,
// and then a definemodelskin, we need to increment the skin counter.
//
// definemodel "mymodel.md2" 1 1
// definemodelskin 0 "normal.png" // skin 0
// definemodelskin 21 "normal21.png"
// definemodelframe "foo" 1000 1002 // these use skin 0
// definemodelskin 0 "wounded.png" // skin 1
// definemodelskin 21 "wounded21.png"
// definemodelframe "foo2" 1003 1004 // these use skin 1
// selectmodelskin 0 // resets to skin 0
// definemodelframe "foo3" 1005 1006 // these use skin 0
2007-12-12 17:42:14 +00:00
if ( seenframe ) { modelskin = + + lastmodelskin ; }
2006-11-13 23:12:47 +00:00
seenframe = 0 ;
2006-04-23 06:44:19 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2007-12-12 17:42:14 +00:00
switch ( md_defineskin ( lastmodelid , skinfn , palnum , max ( 0 , modelskin ) , 0 , 0.0f ) )
{
2006-11-13 23:12:47 +00:00
case 0 :
break ;
case - 1 :
break ; // invalid model id!?
case - 2 :
initprintf ( " Invalid skin filename on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
break ;
case - 3 :
initprintf ( " Invalid palette number on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
break ;
case - 4 :
initprintf ( " Out of memory on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
break ;
2006-04-24 19:04:22 +00:00
}
2006-11-13 23:12:47 +00:00
# endif
}
break ;
2006-04-24 19:04:22 +00:00
case T_SELECTMODELSKIN :
2006-11-13 23:12:47 +00:00
{
if ( scriptfile_getsymbol ( script , & modelskin ) ) break ;
}
break ;
2006-04-24 19:04:22 +00:00
case T_DEFINEVOXEL :
2006-11-13 23:12:47 +00:00
{
char * fn ;
2006-04-24 19:04:22 +00:00
2006-11-13 23:12:47 +00:00
if ( scriptfile_getstring ( script , & fn ) ) break ; //voxel filename
2006-04-24 19:04:22 +00:00
2007-12-12 17:42:14 +00:00
if ( nextvoxid = = MAXVOXELS )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Maximum number of voxels already defined. \n " ) ;
break ;
}
2006-04-23 06:44:19 +00:00
# ifdef SUPERBUILD
2007-12-12 17:42:14 +00:00
if ( qloadkvx ( nextvoxid , fn ) )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Failure loading voxel file \" %s \" \n " , fn ) ;
break ;
}
2006-04-23 06:44:19 +00:00
2006-11-13 23:12:47 +00:00
lastvoxid = nextvoxid + + ;
2006-04-23 06:44:19 +00:00
# endif
2006-11-13 23:12:47 +00:00
}
break ;
2006-04-24 19:04:22 +00:00
case T_DEFINEVOXELTILES :
2006-11-13 23:12:47 +00:00
{
int ftilenume , ltilenume , tilex ;
if ( scriptfile_getnumber ( script , & ftilenume ) ) break ; //1st tile #
if ( scriptfile_getnumber ( script , & ltilenume ) ) break ; //last tile #
2007-12-12 17:42:14 +00:00
if ( ltilenume < ftilenume )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Warning: backwards tile range on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
tilex = ftilenume ;
ftilenume = ltilenume ;
ltilenume = tilex ;
}
2007-12-12 17:42:14 +00:00
if ( ltilenume < 0 | | ftilenume > = MAXTILES )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Invalid tile range on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
break ;
}
2006-04-24 19:04:22 +00:00
2007-12-12 17:42:14 +00:00
if ( lastvoxid < 0 )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Warning: Ignoring voxel tiles definition. \n " ) ;
break ;
}
2006-04-23 06:44:19 +00:00
# ifdef SUPERBUILD
2007-12-12 17:42:14 +00:00
for ( tilex = ftilenume ; tilex < = ltilenume ; tilex + + )
{
2006-11-13 23:12:47 +00:00
tiletovox [ tilex ] = lastvoxid ;
2006-04-24 19:04:22 +00:00
}
2006-11-13 23:12:47 +00:00
# endif
}
break ;
2006-04-23 06:44:19 +00:00
2006-11-13 23:12:47 +00:00
// NEW (ENCOURAGED) DEFINITION SYNTAX
2006-04-24 19:04:22 +00:00
case T_MODEL :
2006-11-13 23:12:47 +00:00
{
char * modelend , * modelfn ;
double scale = 1.0 , mzadd = 0.0 ;
2007-12-20 19:14:38 +00:00
int shadeoffs = 0 , pal = 0 , flags = 0 ;
2006-04-23 06:44:19 +00:00
2006-11-13 23:12:47 +00:00
modelskin = lastmodelskin = 0 ;
seenframe = 0 ;
2006-04-23 06:44:19 +00:00
2006-11-13 23:12:47 +00:00
if ( scriptfile_getstring ( script , & modelfn ) ) break ;
2008-07-20 04:12:52 +00:00
if ( scriptfile_getbraces ( script , & modelend ) ) break ;
2006-04-23 06:44:19 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2006-11-13 23:12:47 +00:00
lastmodelid = md_loadmodel ( modelfn ) ;
2007-12-12 17:42:14 +00:00
if ( lastmodelid < 0 )
{
2008-07-20 04:12:52 +00:00
initprintf ( " Warning: Failed loading MD2/MD3 model \" %s \" \n " , modelfn ) ;
script - > textptr = modelend + 1 ;
2006-11-13 23:12:47 +00:00
break ;
}
2006-04-23 06:44:19 +00:00
# endif
2007-12-12 17:42:14 +00:00
while ( script - > textptr < modelend )
{
2007-02-16 01:34:41 +00:00
int token = getatoken ( script , modeltokens , sizeof ( modeltokens ) / sizeof ( tokenlist ) ) ;
2007-12-12 17:42:14 +00:00
switch ( token )
{
2006-11-13 23:12:47 +00:00
//case T_ERROR: initprintf("Error on line %s:%d in model tokens\n", script->filename,script->linenum); break;
case T_SCALE :
scriptfile_getdouble ( script , & scale ) ; break ;
case T_SHADE :
scriptfile_getnumber ( script , & shadeoffs ) ; break ;
case T_ZADD :
scriptfile_getdouble ( script , & mzadd ) ; break ;
2007-12-20 19:14:38 +00:00
case T_FLAGS :
scriptfile_getnumber ( script , & flags ) ; break ;
2006-11-13 23:12:47 +00:00
case T_FRAME :
{
char * frametokptr = script - > ltextptr ;
char * frameend , * framename = 0 , happy = 1 ;
int ftilenume = - 1 , ltilenume = - 1 , tilex = 0 ;
2007-04-12 03:09:41 +00:00
double smoothduration = 0.0f ;
2006-11-13 23:12:47 +00:00
if ( scriptfile_getbraces ( script , & frameend ) ) break ;
2007-12-12 17:42:14 +00:00
while ( script - > textptr < frameend )
{
switch ( getatoken ( script , modelframetokens , sizeof ( modelframetokens ) / sizeof ( tokenlist ) ) )
{
2007-12-20 19:14:38 +00:00
case T_PAL :
scriptfile_getnumber ( script , & pal ) ; break ;
2006-11-13 23:12:47 +00:00
case T_FRAME :
scriptfile_getstring ( script , & framename ) ; break ;
case T_TILE :
scriptfile_getsymbol ( script , & ftilenume ) ; ltilenume = ftilenume ; break ;
case T_TILE0 :
scriptfile_getsymbol ( script , & ftilenume ) ; break ; //first tile number
case T_TILE1 :
scriptfile_getsymbol ( script , & ltilenume ) ; break ; //last tile number (inclusive)
2007-04-12 03:09:41 +00:00
case T_SMOOTHDURATION :
scriptfile_getdouble ( script , & smoothduration ) ; break ;
2006-11-13 23:12:47 +00:00
}
}
if ( ftilenume < 0 ) initprintf ( " Error: missing 'first tile number' for frame definition near line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , frametokptr ) ) , happy = 0 ;
if ( ltilenume < 0 ) initprintf ( " Error: missing 'last tile number' for frame definition near line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , frametokptr ) ) , happy = 0 ;
if ( ! happy ) break ;
2007-12-12 17:42:14 +00:00
if ( ltilenume < ftilenume )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Warning: backwards tile range on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , frametokptr ) ) ;
tilex = ftilenume ;
ftilenume = ltilenume ;
ltilenume = tilex ;
}
2007-12-12 17:42:14 +00:00
if ( lastmodelid < 0 )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Warning: Ignoring frame definition. \n " ) ;
break ;
}
2006-04-23 06:44:19 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2007-12-12 17:42:14 +00:00
for ( tilex = ftilenume ; tilex < = ltilenume & & happy ; tilex + + )
{
2007-12-20 19:14:38 +00:00
switch ( md_defineframe ( lastmodelid , framename , tilex , max ( 0 , modelskin ) , smoothduration , pal ) )
2007-12-12 17:42:14 +00:00
{
2006-11-13 23:12:47 +00:00
case 0 :
break ;
case - 1 :
happy = 0 ; break ; // invalid model id!?
case - 2 :
initprintf ( " Invalid tile number on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , frametokptr ) ) ;
happy = 0 ;
break ;
case - 3 :
initprintf ( " Invalid frame name on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , frametokptr ) ) ;
happy = 0 ;
break ;
}
}
2006-04-23 06:44:19 +00:00
# endif
2006-11-13 23:12:47 +00:00
seenframe = 1 ;
}
break ;
case T_ANIM :
{
char * animtokptr = script - > ltextptr ;
char * animend , * startframe = 0 , * endframe = 0 , happy = 1 ;
int flags = 0 ;
double dfps = 1.0 ;
if ( scriptfile_getbraces ( script , & animend ) ) break ;
2007-12-12 17:42:14 +00:00
while ( script - > textptr < animend )
{
switch ( getatoken ( script , modelanimtokens , sizeof ( modelanimtokens ) / sizeof ( tokenlist ) ) )
{
2006-11-13 23:12:47 +00:00
case T_FRAME0 :
scriptfile_getstring ( script , & startframe ) ; break ;
case T_FRAME1 :
scriptfile_getstring ( script , & endframe ) ; break ;
case T_FPS :
scriptfile_getdouble ( script , & dfps ) ; break ; //animation frame rate
case T_FLAGS :
scriptfile_getsymbol ( script , & flags ) ; break ;
2006-04-24 19:04:22 +00:00
}
2006-11-13 23:12:47 +00:00
}
if ( ! startframe ) initprintf ( " Error: missing 'start frame' for anim definition near line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , animtokptr ) ) , happy = 0 ;
if ( ! endframe ) initprintf ( " Error: missing 'end frame' for anim definition near line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , animtokptr ) ) , happy = 0 ;
if ( ! happy ) break ;
2007-12-12 17:42:14 +00:00
if ( lastmodelid < 0 )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Warning: Ignoring animation definition. \n " ) ;
2006-04-24 19:04:22 +00:00
break ;
2006-11-13 23:12:47 +00:00
}
2006-04-23 06:44:19 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2007-12-12 17:42:14 +00:00
switch ( md_defineanimation ( lastmodelid , startframe , endframe , ( int ) ( dfps * ( 65536.0 * .001 ) ) , flags ) )
{
2006-11-13 23:12:47 +00:00
case 0 :
break ;
case - 1 :
break ; // invalid model id!?
case - 2 :
initprintf ( " Invalid starting frame name on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , animtokptr ) ) ;
break ;
case - 3 :
initprintf ( " Invalid ending frame name on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , animtokptr ) ) ;
break ;
case - 4 :
initprintf ( " Out of memory on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , animtokptr ) ) ;
break ;
}
2006-04-23 06:44:19 +00:00
# endif
2007-12-12 17:42:14 +00:00
}
break ;
2008-05-15 03:16:38 +00:00
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 :
2006-11-13 23:12:47 +00:00
{
char * skintokptr = script - > ltextptr ;
char * skinend , * skinfn = 0 ;
int palnum = 0 , surfnum = 0 ;
2007-02-16 01:34:41 +00:00
double param = 1.0 ;
2006-11-13 23:12:47 +00:00
if ( scriptfile_getbraces ( script , & skinend ) ) break ;
2007-12-12 17:42:14 +00:00
while ( script - > textptr < skinend )
{
switch ( getatoken ( script , modelskintokens , sizeof ( modelskintokens ) / sizeof ( tokenlist ) ) )
{
2006-11-13 23:12:47 +00:00
case T_PAL :
scriptfile_getsymbol ( script , & palnum ) ; break ;
2007-02-16 01:34:41 +00:00
case T_PARAM :
scriptfile_getdouble ( script , & param ) ; break ;
2006-11-13 23:12:47 +00:00
case T_FILE :
scriptfile_getstring ( script , & skinfn ) ; break ; //skin filename
case T_SURF :
scriptfile_getnumber ( script , & surfnum ) ; break ;
}
}
2007-12-12 17:42:14 +00:00
if ( ! skinfn )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Error: missing 'skin filename' for skin definition near line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , skintokptr ) ) ;
break ;
}
if ( seenframe ) { modelskin = + + lastmodelskin ; }
seenframe = 0 ;
2006-04-23 06:44:19 +00:00
2007-12-20 19:14:38 +00:00
switch ( token )
2007-02-16 01:34:41 +00:00
{
2007-12-20 19:14:38 +00:00
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 :
2007-02-16 01:34:41 +00:00
palnum = DETAILPAL ;
param = 1.0f / param ;
2007-12-20 19:14:38 +00:00
break ;
case T_GLOW :
2007-02-16 01:34:41 +00:00
palnum = GLOWPAL ;
2007-12-20 19:14:38 +00:00
break ;
}
2007-02-16 01:34:41 +00:00
2006-04-23 06:44:19 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2007-12-12 17:42:14 +00:00
switch ( md_defineskin ( lastmodelid , skinfn , palnum , max ( 0 , modelskin ) , surfnum , param ) )
{
2006-11-13 23:12:47 +00:00
case 0 :
break ;
case - 1 :
break ; // invalid model id!?
case - 2 :
initprintf ( " Invalid skin filename on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , skintokptr ) ) ;
break ;
case - 3 :
initprintf ( " Invalid palette number on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , skintokptr ) ) ;
break ;
case - 4 :
initprintf ( " Out of memory on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , skintokptr ) ) ;
break ;
}
2006-04-23 06:44:19 +00:00
# endif
2007-12-12 17:42:14 +00:00
}
break ;
2006-11-13 23:12:47 +00:00
case T_HUD :
{
char * hudtokptr = script - > ltextptr ;
char happy = 1 , * frameend ;
int ftilenume = - 1 , ltilenume = - 1 , tilex = 0 , flags = 0 ;
double xadd = 0.0 , yadd = 0.0 , zadd = 0.0 , angadd = 0.0 ;
if ( scriptfile_getbraces ( script , & frameend ) ) break ;
2007-12-12 17:42:14 +00:00
while ( script - > textptr < frameend )
{
switch ( getatoken ( script , modelhudtokens , sizeof ( modelhudtokens ) / sizeof ( tokenlist ) ) )
{
2006-11-13 23:12:47 +00:00
case T_TILE :
scriptfile_getsymbol ( script , & ftilenume ) ; ltilenume = ftilenume ; break ;
case T_TILE0 :
scriptfile_getsymbol ( script , & ftilenume ) ; break ; //first tile number
case T_TILE1 :
scriptfile_getsymbol ( script , & ltilenume ) ; break ; //last tile number (inclusive)
case T_XADD :
scriptfile_getdouble ( script , & xadd ) ; break ;
case T_YADD :
scriptfile_getdouble ( script , & yadd ) ; break ;
case T_ZADD :
scriptfile_getdouble ( script , & zadd ) ; break ;
case T_ANGADD :
scriptfile_getdouble ( script , & angadd ) ; break ;
case T_HIDE :
flags | = 1 ; break ;
case T_NOBOB :
flags | = 2 ; break ;
case T_FLIPPED :
flags | = 4 ; break ;
case T_NODEPTH :
flags | = 8 ; break ;
}
}
if ( ftilenume < 0 ) initprintf ( " Error: missing 'first tile number' for hud definition near line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , hudtokptr ) ) , happy = 0 ;
if ( ltilenume < 0 ) initprintf ( " Error: missing 'last tile number' for hud definition near line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , hudtokptr ) ) , happy = 0 ;
if ( ! happy ) break ;
2007-12-12 17:42:14 +00:00
if ( ltilenume < ftilenume )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Warning: backwards tile range on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , hudtokptr ) ) ;
tilex = ftilenume ;
ftilenume = ltilenume ;
ltilenume = tilex ;
}
2007-12-12 17:42:14 +00:00
if ( lastmodelid < 0 )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Warning: Ignoring frame definition. \n " ) ;
break ;
}
2006-04-23 06:44:19 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2007-12-12 17:42:14 +00:00
for ( tilex = ftilenume ; tilex < = ltilenume & & happy ; tilex + + )
{
switch ( md_definehud ( lastmodelid , tilex , xadd , yadd , zadd , angadd , flags ) )
{
2006-11-13 23:12:47 +00:00
case 0 :
break ;
case - 1 :
happy = 0 ; break ; // invalid model id!?
case - 2 :
initprintf ( " Invalid tile number on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , hudtokptr ) ) ;
happy = 0 ;
break ;
case - 3 :
initprintf ( " Invalid frame name on line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , hudtokptr ) ) ;
happy = 0 ;
break ;
}
2006-04-24 19:04:22 +00:00
}
2006-11-13 23:12:47 +00:00
# endif
2007-12-12 17:42:14 +00:00
}
break ;
2006-04-24 19:04:22 +00:00
}
2006-11-13 23:12:47 +00:00
}
2006-04-23 06:44:19 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2007-12-20 19:14:38 +00:00
md_setmisc ( lastmodelid , ( float ) scale , shadeoffs , ( float ) mzadd , flags ) ;
2006-04-23 06:44:19 +00:00
# endif
2006-11-13 23:12:47 +00:00
modelskin = lastmodelskin = 0 ;
seenframe = 0 ;
2006-04-23 06:44:19 +00:00
2006-11-13 23:12:47 +00:00
}
break ;
2006-04-24 19:04:22 +00:00
case T_VOXEL :
2006-11-13 23:12:47 +00:00
{
char * voxeltokptr = script - > ltextptr ;
char * fn , * modelend ;
int tile0 = MAXTILES , tile1 = - 1 , tilex = - 1 ;
2006-04-23 06:44:19 +00:00
2006-11-13 23:12:47 +00:00
if ( scriptfile_getstring ( script , & fn ) ) break ; //voxel filename
2007-12-12 17:42:14 +00:00
if ( nextvoxid = = MAXVOXELS ) { initprintf ( " Maximum number of voxels already defined. \n " ) ; break ; }
2006-04-23 06:44:19 +00:00
# ifdef SUPERBUILD
2006-11-13 23:12:47 +00:00
if ( qloadkvx ( nextvoxid , fn ) ) { initprintf ( " Failure loading voxel file \" %s \" \n " , fn ) ; break ; }
lastvoxid = nextvoxid + + ;
2006-04-23 06:44:19 +00:00
# endif
2006-11-13 23:12:47 +00:00
if ( scriptfile_getbraces ( script , & modelend ) ) break ;
2007-12-12 17:42:14 +00:00
while ( script - > textptr < modelend )
{
switch ( getatoken ( script , voxeltokens , sizeof ( voxeltokens ) / sizeof ( tokenlist ) ) )
{
2006-11-13 23:12:47 +00:00
//case T_ERROR: initprintf("Error on line %s:%d in voxel tokens\n", script->filename,linenum); break;
case T_TILE :
scriptfile_getsymbol ( script , & tilex ) ;
2006-04-23 06:44:19 +00:00
# ifdef SUPERBUILD
2007-12-12 17:42:14 +00:00
if ( ( unsigned int ) tilex < MAXTILES ) tiletovox [ tilex ] = lastvoxid ;
2006-11-13 23:12:47 +00:00
else initprintf ( " Invalid tile number on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , voxeltokptr ) ) ;
2006-04-23 06:44:19 +00:00
# endif
2006-11-13 23:12:47 +00:00
break ;
case T_TILE0 :
scriptfile_getsymbol ( script , & tile0 ) ; break ; //1st tile #
case T_TILE1 :
scriptfile_getsymbol ( script , & tile1 ) ;
if ( tile0 > tile1 )
{
initprintf ( " Warning: backwards tile range on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , voxeltokptr ) ) ;
tilex = tile0 ; tile0 = tile1 ; tile1 = tilex ;
}
if ( ( tile1 < 0 ) | | ( tile0 > = MAXTILES ) )
2007-12-12 17:42:14 +00:00
{ initprintf ( " Invalid tile range on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , voxeltokptr ) ) ; break ; }
2006-04-23 06:44:19 +00:00
# ifdef SUPERBUILD
2006-11-13 23:12:47 +00:00
for ( tilex = tile0 ; tilex < = tile1 ; tilex + + ) tiletovox [ tilex ] = lastvoxid ;
2006-04-23 06:44:19 +00:00
# endif
2006-11-13 23:12:47 +00:00
break ; //last tile number (inclusive)
2007-12-12 17:42:14 +00:00
case T_SCALE :
{
2006-11-13 23:12:47 +00:00
double scale = 1.0 ;
scriptfile_getdouble ( script , & scale ) ;
2006-04-23 06:44:19 +00:00
# ifdef SUPERBUILD
2008-11-26 22:51:56 +00:00
voxscale [ lastvoxid ] = ( int ) ( 65536 * scale ) ;
2006-04-23 06:44:19 +00:00
# endif
2006-11-13 23:12:47 +00:00
break ;
}
2006-04-24 19:04:22 +00:00
}
}
2006-11-13 23:12:47 +00:00
lastvoxid = - 1 ;
}
break ;
2006-04-24 19:04:22 +00:00
case T_SKYBOX :
2006-11-13 23:12:47 +00:00
{
char * skyboxtokptr = script - > ltextptr ;
2007-04-30 19:41:19 +00:00
char * fn [ 6 ] = { 0 , 0 , 0 , 0 , 0 , 0 } , * modelend , happy = 1 , * tfn = NULL ;
2008-03-22 10:23:57 +00:00
int i , tile = - 1 , pal = 0 , ii ;
2006-11-13 23:12:47 +00:00
if ( scriptfile_getbraces ( script , & modelend ) ) break ;
2007-12-12 17:42:14 +00:00
while ( script - > textptr < modelend )
{
switch ( getatoken ( script , skyboxtokens , sizeof ( skyboxtokens ) / sizeof ( tokenlist ) ) )
{
2006-11-13 23:12:47 +00:00
//case T_ERROR: initprintf("Error on line %s:%d in skybox tokens\n",script->filename,linenum); break;
case T_TILE :
2007-12-12 17:42:14 +00:00
scriptfile_getsymbol ( script , & tile ) ; break ;
2006-11-13 23:12:47 +00:00
case T_PAL :
2007-12-12 17:42:14 +00:00
scriptfile_getsymbol ( script , & pal ) ; break ;
2006-11-13 23:12:47 +00:00
case T_FRONT :
scriptfile_getstring ( script , & fn [ 0 ] ) ; break ;
case T_RIGHT :
scriptfile_getstring ( script , & fn [ 1 ] ) ; break ;
case T_BACK :
scriptfile_getstring ( script , & fn [ 2 ] ) ; break ;
case T_LEFT :
scriptfile_getstring ( script , & fn [ 3 ] ) ; break ;
case T_TOP :
scriptfile_getstring ( script , & fn [ 4 ] ) ; break ;
case T_BOTTOM :
scriptfile_getstring ( script , & fn [ 5 ] ) ; break ;
2006-04-24 19:04:22 +00:00
}
2006-11-13 23:12:47 +00:00
}
2006-04-24 19:04:22 +00:00
2006-11-13 23:12:47 +00:00
if ( tile < 0 ) initprintf ( " Error: missing 'tile number' for skybox definition near line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , skyboxtokptr ) ) , happy = 0 ;
2007-12-12 17:42:14 +00:00
for ( i = 0 ; i < 6 ; i + + )
{
2006-11-13 23:12:47 +00:00
if ( ! fn [ i ] ) initprintf ( " Error: missing '%s filename' for skybox definition near line %s:%d \n " , skyfaces [ i ] , script - > filename , scriptfile_getlinum ( script , skyboxtokptr ) ) , happy = 0 ;
2007-04-30 19:41:19 +00:00
ii = pathsearchmode ;
pathsearchmode = 1 ;
2007-12-12 17:42:14 +00:00
if ( findfrompath ( fn [ i ] , & tfn ) < 0 )
{
2007-05-01 04:35:27 +00:00
char buf [ BMAX_PATH ] ;
Bstrcpy ( buf , fn [ i ] ) ;
kzfindfilestart ( buf ) ;
2007-12-12 17:42:14 +00:00
if ( ! kzfindfile ( buf ) )
{
2007-05-01 04:35:27 +00:00
initprintf ( " Error: file '%s' does not exist \n " , fn [ i ] ) ;
happy = 0 ;
2007-12-12 17:42:14 +00:00
}
}
else Bfree ( tfn ) ;
2007-04-30 19:41:19 +00:00
pathsearchmode = ii ;
2006-04-24 19:04:22 +00:00
}
2006-11-13 23:12:47 +00:00
if ( ! happy ) break ;
2006-04-24 19:04:22 +00:00
2006-11-13 23:12:47 +00:00
hicsetskybox ( tile , pal , fn ) ;
}
break ;
case T_TINT :
{
char * tinttokptr = script - > ltextptr ;
int red = 255 , green = 255 , blue = 255 , pal = - 1 , flags = 0 ;
char * tintend ;
if ( scriptfile_getbraces ( script , & tintend ) ) break ;
2007-12-12 17:42:14 +00:00
while ( script - > textptr < tintend )
{
switch ( getatoken ( script , tinttokens , sizeof ( tinttokens ) / sizeof ( tokenlist ) ) )
{
2006-11-13 23:12:47 +00:00
case T_PAL :
scriptfile_getsymbol ( script , & pal ) ; break ;
case T_RED :
scriptfile_getnumber ( script , & red ) ; red = min ( 255 , max ( 0 , red ) ) ; break ;
case T_GREEN :
scriptfile_getnumber ( script , & green ) ; green = min ( 255 , max ( 0 , green ) ) ; break ;
case T_BLUE :
scriptfile_getnumber ( script , & blue ) ; blue = min ( 255 , max ( 0 , blue ) ) ; break ;
case T_FLAGS :
scriptfile_getsymbol ( script , & flags ) ; break ;
2006-04-24 19:04:22 +00:00
}
2006-11-13 23:12:47 +00:00
}
2006-04-24 19:04:22 +00:00
2007-12-12 17:42:14 +00:00
if ( pal < 0 )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Error: missing 'palette number' for tint definition near line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , tinttokptr ) ) ;
break ;
2006-04-24 19:04:22 +00:00
}
2006-11-13 23:12:47 +00:00
hicsetpalettetint ( pal , red , green , blue , flags ) ;
}
break ;
2006-04-24 19:04:22 +00:00
case T_TEXTURE :
2006-11-13 23:12:47 +00:00
{
char * texturetokptr = script - > ltextptr , * textureend ;
2007-02-16 01:34:41 +00:00
int tile = - 1 , token ;
2006-11-13 23:12:47 +00:00
2007-12-20 19:14:38 +00:00
char * fnB = 0 ; double alphacutB = 0 , xscaleB = 0 , yscaleB = 0 ; char flagsB = 0 ;
int palmapbits = 0 ; int palbits = 0 ;
2006-11-13 23:12:47 +00:00
if ( scriptfile_getsymbol ( script , & tile ) ) break ;
if ( scriptfile_getbraces ( script , & textureend ) ) break ;
2007-12-12 17:42:14 +00:00
while ( script - > textptr < textureend )
{
2007-02-16 01:34:41 +00:00
token = getatoken ( script , texturetokens , sizeof ( texturetokens ) / sizeof ( tokenlist ) ) ;
2007-12-12 17:42:14 +00:00
switch ( token )
{
case T_PAL :
{
2006-11-13 23:12:47 +00:00
char * paltokptr = script - > ltextptr , * palend ;
int pal = - 1 , i ;
2007-04-30 19:41:19 +00:00
char * fn = NULL , * tfn = NULL ;
2007-02-17 02:23:50 +00:00
double alphacut = - 1.0 , xscale = 1.0 , yscale = 1.0 ;
2006-11-13 23:12:47 +00:00
char flags = 0 ;
if ( scriptfile_getsymbol ( script , & pal ) ) break ;
if ( scriptfile_getbraces ( script , & palend ) ) break ;
2007-12-12 17:42:14 +00:00
while ( script - > textptr < palend )
{
switch ( getatoken ( script , texturetokens_pal , sizeof ( texturetokens_pal ) / sizeof ( tokenlist ) ) )
{
2006-11-13 23:12:47 +00:00
case T_FILE :
scriptfile_getstring ( script , & fn ) ; break ;
case T_ALPHACUT :
scriptfile_getdouble ( script , & alphacut ) ; break ;
2007-02-17 02:23:50 +00:00
case T_XSCALE :
scriptfile_getdouble ( script , & xscale ) ; break ;
case T_YSCALE :
scriptfile_getdouble ( script , & yscale ) ; break ;
2006-11-13 23:12:47 +00:00
case T_NOCOMPRESS :
flags | = 1 ; break ;
2008-08-26 04:00:42 +00:00
case T_NODOWNSIZE :
flags | = 16 ; break ;
2006-11-13 23:12:47 +00:00
default :
break ;
}
2006-04-24 19:04:22 +00:00
}
2006-11-13 23:12:47 +00:00
if ( ( unsigned ) tile > ( unsigned ) MAXTILES ) break ; // message is printed later
2007-12-12 17:42:14 +00:00
if ( ( unsigned ) pal > = ( ( unsigned ) MAXPALOOKUPS - RESERVEDPALS ) )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Error: missing or invalid 'palette number' for texture definition near "
" line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , paltokptr ) ) ;
break ;
}
2007-12-12 17:42:14 +00:00
if ( ! fn )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Error: missing 'file name' for texture definition near line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , paltokptr ) ) ;
break ;
}
2007-04-30 19:41:19 +00:00
i = pathsearchmode ;
pathsearchmode = 1 ;
2007-12-12 17:42:14 +00:00
if ( findfrompath ( fn , & tfn ) < 0 )
{
2007-05-01 04:35:27 +00:00
char buf [ BMAX_PATH ] ;
Bstrcpy ( buf , fn ) ;
kzfindfilestart ( buf ) ;
2007-12-12 17:42:14 +00:00
if ( ! kzfindfile ( buf ) )
{
2007-05-01 04:35:27 +00:00
initprintf ( " Error: file '%s' does not exist \n " , fn ) ;
2008-01-06 04:07:21 +00:00
pathsearchmode = i ;
2007-05-01 04:35:27 +00:00
break ;
}
2007-12-12 17:42:14 +00:00
}
else Bfree ( tfn ) ;
2007-04-30 19:41:19 +00:00
pathsearchmode = i ;
2007-02-17 02:23:50 +00:00
xscale = 1.0f / xscale ;
yscale = 1.0f / yscale ;
hicsetsubsttex ( tile , pal , fn , alphacut , xscale , yscale , flags ) ;
2007-12-20 19:14:38 +00:00
fnB = fn ; alphacutB = alphacut ; xscaleB = xscale ; yscaleB = yscale ; flagsB = flags ;
if ( pal < 30 ) palbits | = 1 < < pal ;
2007-12-12 17:42:14 +00:00
}
break ;
2008-05-15 03:16:38 +00:00
case T_DETAIL : case T_GLOW :
case T_REDPAL : case T_BLUEPAL : case T_BROWNPAL : case T_GREYPAL : case T_GREENPAL : case T_SPECPAL :
2007-12-12 17:42:14 +00:00
{
2007-01-15 09:08:57 +00:00
char * detailtokptr = script - > ltextptr , * detailend ;
2007-02-16 17:44:59 +00:00
int pal = 0 , i ;
2007-04-30 19:41:19 +00:00
char * fn = NULL , * tfn = NULL ;
2007-03-01 18:19:11 +00:00
double xscale = 1.0 , yscale = 1.0 ;
2007-01-15 09:08:57 +00:00
char flags = 0 ;
if ( scriptfile_getbraces ( script , & detailend ) ) break ;
2007-12-12 17:42:14 +00:00
while ( script - > textptr < detailend )
{
switch ( getatoken ( script , texturetokens_pal , sizeof ( texturetokens_pal ) / sizeof ( tokenlist ) ) )
{
2007-01-15 09:08:57 +00:00
case T_FILE :
scriptfile_getstring ( script , & fn ) ; break ;
2007-02-17 02:23:50 +00:00
case T_XSCALE :
2007-03-01 18:19:11 +00:00
scriptfile_getdouble ( script , & xscale ) ; break ;
case T_YSCALE :
scriptfile_getdouble ( script , & yscale ) ; break ;
2007-01-15 09:08:57 +00:00
case T_NOCOMPRESS :
flags | = 1 ; break ;
2008-08-26 04:00:42 +00:00
case T_NODOWNSIZE :
flags | = 16 ; break ;
2007-01-15 09:08:57 +00:00
default :
break ;
}
}
if ( ( unsigned ) tile > ( unsigned ) MAXTILES ) break ; // message is printed later
2007-12-12 17:42:14 +00:00
if ( ! fn )
{
2007-01-15 09:08:57 +00:00
initprintf ( " Error: missing 'file name' for texture definition near line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , detailtokptr ) ) ;
break ;
}
2007-04-30 19:41:19 +00:00
i = pathsearchmode ;
2007-05-01 04:35:27 +00:00
pathsearchmode = 1 ;
2007-12-12 17:42:14 +00:00
if ( findfrompath ( fn , & tfn ) < 0 )
{
2007-05-01 04:35:27 +00:00
char buf [ BMAX_PATH ] ;
Bstrcpy ( buf , fn ) ;
kzfindfilestart ( buf ) ;
2007-12-12 17:42:14 +00:00
if ( ! kzfindfile ( buf ) )
{
2007-05-01 04:35:27 +00:00
initprintf ( " Error: file '%s' does not exist \n " , fn ) ;
2008-01-06 04:07:21 +00:00
pathsearchmode = i ;
2007-05-01 04:35:27 +00:00
break ;
2007-12-12 17:42:14 +00:00
}
}
else Bfree ( tfn ) ;
2007-04-30 19:41:19 +00:00
pathsearchmode = i ;
2007-01-15 09:08:57 +00:00
2007-12-20 19:14:38 +00:00
switch ( token )
2007-02-16 01:34:41 +00:00
{
2007-12-20 19:14:38 +00:00
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 :
2007-02-16 01:34:41 +00:00
pal = DETAILPAL ;
2007-03-01 18:19:11 +00:00
xscale = 1.0f / xscale ;
2007-03-03 23:09:40 +00:00
yscale = 1.0f / yscale ;
2007-12-20 19:14:38 +00:00
break ;
case T_GLOW :
2007-02-16 01:34:41 +00:00
pal = GLOWPAL ;
2007-12-20 19:14:38 +00:00
break ;
}
2007-03-01 18:19:11 +00:00
hicsetsubsttex ( tile , pal , fn , - 1.0 , xscale , yscale , flags ) ;
2007-12-12 17:42:14 +00:00
}
break ;
2006-11-13 23:12:47 +00:00
default :
2006-04-24 19:04:22 +00:00
break ;
}
}
2006-11-13 23:12:47 +00:00
2008-01-27 23:28:45 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2008-02-01 03:36:54 +00:00
if ( palmapbits & & fnB )
{
2007-12-28 20:04:58 +00:00
int i ;
2007-12-20 19:14:38 +00:00
for ( i = 0 ; i < = 25 ; i + + )
if ( ! ( palbits & ( 1 < < i ) ) & & ( palmapbits & checkpalmaps ( i ) ) )
hicsetsubsttex ( tile , i , fnB , alphacutB , xscaleB , yscaleB , flagsB ) ;
2007-12-28 20:04:58 +00:00
}
2008-01-27 23:28:45 +00:00
# endif
2007-12-20 19:14:38 +00:00
2007-12-12 17:42:14 +00:00
if ( ( unsigned ) tile > = ( unsigned ) MAXTILES )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Error: missing or invalid 'tile number' for texture definition near line %s:%d \n " ,
script - > filename , scriptfile_getlinum ( script , texturetokptr ) ) ;
break ;
}
}
break ;
2006-04-24 19:04:22 +00:00
case T_UNDEFMODEL :
case T_UNDEFMODELRANGE :
2006-11-13 23:12:47 +00:00
{
int r0 , r1 ;
if ( scriptfile_getsymbol ( script , & r0 ) ) break ;
2007-12-12 17:42:14 +00:00
if ( tokn = = T_UNDEFMODELRANGE )
{
2006-11-13 23:12:47 +00:00
if ( scriptfile_getsymbol ( script , & r1 ) ) break ;
2007-12-12 17:42:14 +00:00
if ( r1 < r0 )
{
2006-11-13 23:12:47 +00:00
int t = r1 ;
2006-04-24 19:04:22 +00:00
r1 = r0 ;
2006-11-13 23:12:47 +00:00
r0 = t ;
initprintf ( " Warning: backwards tile range on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
}
2007-12-12 17:42:14 +00:00
if ( r0 < 0 | | r1 > = MAXTILES )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Error: invalid tile range on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
break ;
}
2007-12-12 17:42:14 +00:00
}
else
{
2006-11-13 23:12:47 +00:00
r1 = r0 ;
2007-12-12 17:42:14 +00:00
if ( ( unsigned ) r0 > = ( unsigned ) MAXTILES )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Error: invalid tile number on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
break ;
2006-04-24 19:04:22 +00:00
}
2006-11-13 23:12:47 +00:00
}
2006-04-23 06:44:19 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2006-11-13 23:12:47 +00:00
for ( ; r0 < = r1 ; r0 + + ) md_undefinetile ( r0 ) ;
2006-04-23 06:44:19 +00:00
# endif
2006-11-13 23:12:47 +00:00
}
break ;
2006-04-23 06:44:19 +00:00
2006-04-24 19:04:22 +00:00
case T_UNDEFMODELOF :
2006-11-13 23:12:47 +00:00
{
2008-07-24 11:16:20 +00:00
int r0 ;
# if defined(POLYMOST) && defined(USE_OPENGL)
int mid ;
# endif
2006-04-23 06:44:19 +00:00
2006-11-13 23:12:47 +00:00
if ( scriptfile_getsymbol ( script , & r0 ) ) break ;
2007-12-12 17:42:14 +00:00
if ( ( unsigned ) r0 > = ( unsigned ) MAXTILES )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Error: invalid tile number on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
break ;
}
2006-04-23 06:44:19 +00:00
# if defined(POLYMOST) && defined(USE_OPENGL)
2007-12-20 19:14:38 +00:00
mid = md_tilehasmodel ( r0 , 0 ) ;
2006-11-13 23:12:47 +00:00
if ( mid < 0 ) break ;
2006-04-23 06:44:19 +00:00
2006-11-13 23:12:47 +00:00
md_undefinemodel ( mid ) ;
2006-04-23 06:44:19 +00:00
# endif
2006-11-13 23:12:47 +00:00
}
break ;
2006-04-24 19:04:22 +00:00
case T_UNDEFTEXTURE :
case T_UNDEFTEXTURERANGE :
2006-11-13 23:12:47 +00:00
{
int r0 , r1 , i ;
if ( scriptfile_getsymbol ( script , & r0 ) ) break ;
2007-12-12 17:42:14 +00:00
if ( tokn = = T_UNDEFTEXTURERANGE )
{
2006-11-13 23:12:47 +00:00
if ( scriptfile_getsymbol ( script , & r1 ) ) break ;
2007-12-12 17:42:14 +00:00
if ( r1 < r0 )
{
2006-11-13 23:12:47 +00:00
int t = r1 ;
2006-04-24 19:04:22 +00:00
r1 = r0 ;
2006-11-13 23:12:47 +00:00
r0 = t ;
initprintf ( " Warning: backwards tile range on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
}
2007-12-12 17:42:14 +00:00
if ( r0 < 0 | | r1 > = MAXTILES )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Error: invalid tile range on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
break ;
}
2007-12-12 17:42:14 +00:00
}
else
{
2006-11-13 23:12:47 +00:00
r1 = r0 ;
2007-12-12 17:42:14 +00:00
if ( ( unsigned ) r0 > = ( unsigned ) MAXTILES )
{
2006-11-13 23:12:47 +00:00
initprintf ( " Error: invalid tile number on line %s:%d \n " , script - > filename , scriptfile_getlinum ( script , cmdtokptr ) ) ;
break ;
2006-04-24 19:04:22 +00:00
}
}
2006-11-13 23:12:47 +00:00
for ( ; r0 < = r1 ; r0 + + )
for ( i = MAXPALOOKUPS - 1 ; i > = 0 ; i - - )
hicclearsubst ( r0 , i ) ;
}
break ;
2006-04-24 19:04:22 +00:00
2007-12-20 19:14:38 +00:00
case T_MUSIC :
{
2008-03-08 05:23:15 +00:00
char * dummy , * dummy2 ;
2007-12-20 19:14:38 +00:00
2008-03-08 05:23:15 +00:00
if ( scriptfile_getbraces ( script , & dummy ) ) break ;
while ( script - > textptr < dummy )
2007-12-20 19:14:38 +00:00
{
2008-03-08 05:23:15 +00:00
switch ( getatoken ( script , sound_musictokens , sizeof ( sound_musictokens ) / sizeof ( tokenlist ) ) )
2007-12-20 19:14:38 +00:00
{
case T_ID :
2008-03-08 05:23:15 +00:00
scriptfile_getstring ( script , & dummy2 ) ;
break ;
2007-12-20 19:14:38 +00:00
case T_FILE :
2008-03-08 05:23:15 +00:00
scriptfile_getstring ( script , & dummy2 ) ;
break ;
2007-12-20 19:14:38 +00:00
}
}
}
break ;
case T_SOUND :
{
2008-03-08 05:23:15 +00:00
char * dummy , * dummy2 ;
2007-12-20 19:14:38 +00:00
2008-03-08 05:23:15 +00:00
if ( scriptfile_getbraces ( script , & dummy ) ) break ;
while ( script - > textptr < dummy )
2007-12-20 19:14:38 +00:00
{
2008-03-08 05:23:15 +00:00
switch ( getatoken ( script , sound_musictokens , sizeof ( sound_musictokens ) / sizeof ( tokenlist ) ) )
2007-12-20 19:14:38 +00:00
{
case T_ID :
2008-06-10 19:23:13 +00:00
scriptfile_getsymbol ( script , ( int * ) & dummy2 ) ;
2008-03-08 05:23:15 +00:00
break ;
2007-12-20 19:14:38 +00:00
case T_FILE :
2008-03-08 05:23:15 +00:00
scriptfile_getstring ( script , & dummy2 ) ;
break ;
2007-12-20 19:14:38 +00:00
}
}
}
break ;
2006-04-24 19:04:22 +00:00
default :
initprintf ( " Unknown token. \n " ) ; break ;
}
}
return 0 ;
2006-04-23 06:44:19 +00:00
}
int loaddefinitionsfile ( char * fn )
{
2006-04-24 19:04:22 +00:00
scriptfile * script ;
2006-04-23 06:44:19 +00:00
2006-04-24 19:04:22 +00:00
script = scriptfile_fromfile ( fn ) ;
if ( ! script ) return - 1 ;
2006-04-23 06:44:19 +00:00
2006-04-24 19:04:22 +00:00
defsparser ( script ) ;
2006-04-23 06:44:19 +00:00
2006-04-24 19:04:22 +00:00
scriptfile_close ( script ) ;
scriptfile_clearsymbols ( ) ;
2006-04-23 06:44:19 +00:00
2006-04-24 19:04:22 +00:00
return 0 ;
2006-04-23 06:44:19 +00:00
}
// vim:ts=4: