Prototype for user-defined tile groups

git-svn-id: https://svn.eduke32.com/eduke32@536 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2007-04-21 20:25:07 +00:00
parent 423a486b61
commit fc287ec735
4 changed files with 261 additions and 178 deletions

View file

@ -1489,6 +1489,7 @@ void editinput(void)
}
}
}
# if 0
if (keystatus[0x2f] > 0) //V
{
if (searchstat == 0) templong = wall[searchwall].picnum;
@ -1510,7 +1511,7 @@ void editinput(void)
asksave = 1;
keystatus[0x2f] = 0;
}
#endif
if (keystatus[0x1a]) // [
{
keystatus[0x1a] = 0;
@ -2439,7 +2440,7 @@ char changechar(char dachar, long dadir, char smooshyalign, char boundcheck)
}
return(dachar);
}
#if 0
long gettile(long tilenum)
{
char snotbuf[80], ch;
@ -2740,6 +2741,7 @@ long drawtilescreen(long pictopleft, long picbox)
return(0);
}
#endif
void overheadeditor(void)
{

View file

@ -1755,13 +1755,13 @@ static long m32gettile(long idInitialTile)
nYTiles = ydim / ZoomToThumbSize[s_Zoom];
nDisplayedTiles = nXTiles * nYTiles;
if (0 == nDisplayedTiles)
if (!nDisplayedTiles)
{
// Eh-up, resolution changed since we were last displaying tiles.
s_Zoom--;
}
}
while (0 == nDisplayedTiles) ;
while (!nDisplayedTiles);
keystatus[0x2F] = 0;
@ -1868,7 +1868,7 @@ static long m32gettile(long idInitialTile)
// Check : If no tiles used at all then switch to displaying all tiles
//
if (0 == localartfreq[0])
if (!localartfreq[0])
{
localartlookupnum = MAXTILES;
@ -1911,6 +1911,7 @@ static long m32gettile(long idInitialTile)
{
if (quitevent) quitevent = 0;
}
idle();
// These two lines are so obvious I don't need to comment them ...;-)
synctics = totalclock-lockclock;
@ -2005,14 +2006,14 @@ static long m32gettile(long idInitialTile)
// Ensure tilenum is within valid range
//
while (iTile < 0)
if (iTile < 0)
{
iTile += nXTiles;
iTile = 0;
}
while (iTile >= MAXTILES) // shouldn't this be the count of num tiles ???
if (iTile >= MAXTILES) // shouldn't this be the count of num tiles ???
{
iTile -= nXTiles;
iTile = MAXTILES-1;
}
// 'V' KEYPRESS
@ -2037,6 +2038,7 @@ static long m32gettile(long idInitialTile)
SelectAllTiles(iTile);
iTile = FIRST_USER_ART_TILE;
keystatus[0x16] = 0;
}
// 'A' KEYPRESS : Go straight to start of Atomic edition's art
@ -2045,6 +2047,7 @@ static long m32gettile(long idInitialTile)
SelectAllTiles(iTile);
iTile = FIRST_ATOMIC_TILE;
keystatus[0x1e] = 0;
}
// 'T' KEYPRESS = Select from pre-defined tileset
@ -2055,6 +2058,18 @@ static long m32gettile(long idInitialTile)
iTile = OnSelectTile(iTile);
}
// 'E' KEYPRESS : Go straight to start of extended art
if (keystatus[0x12])
{
SelectAllTiles(iTile);
if (iTile == FIRST_EXTENDED_TILE)
iTile = SECOND_EXTENDED_TILE;
else iTile = FIRST_EXTENDED_TILE;
keystatus[0x12] = 0;
}
//
// Adjust top-left to ensure tilenum is within displayed range of tiles
//
@ -2134,6 +2149,7 @@ static long OnGotoTile(long iTile)
{
if (quitevent) quitevent = 0;
}
idle();
ch = bgetchar();
@ -2195,6 +2211,15 @@ static long OnSelectTile(long iTile)
long i, j;
char ch;
for (i = 0; (unsigned)i < NUM_TILE_GROUPS; i++)
{
if (s_TileGroups[i].pIds != NULL)
break;
}
if (i == NUM_TILE_GROUPS) // no tile groups
return (iTile);
SelectAllTiles(iTile);
bflushchars();
@ -2209,6 +2234,7 @@ static long OnSelectTile(long iTile)
for (i = 0; (unsigned)i < NUM_TILE_GROUPS; i++)
{
if (s_TileGroups[i].szText != NULL)
printext256(10L, (i+1)*16, whitecol, -1, s_TileGroups[i].szText, 0);
}
showframe(1);
@ -2219,17 +2245,19 @@ static long OnSelectTile(long iTile)
bDone = 0;
while (keystatus[1] == 0 && (0 == bDone))
while (keystatus[1] == 0 && (!bDone))
{
if (handleevents())
{
if (quitevent) quitevent = 0;
}
idle();
ch = bgetchar();
for (i = 0; (unsigned)i < NUM_TILE_GROUPS; i++)
{
if (s_TileGroups[i].pIds != NULL)
if ((ch == s_TileGroups[i].key1) || (ch == s_TileGroups[i].key2))
{
iTile = LoadTileSet(iTile, s_TileGroups[i].pIds, s_TileGroups[i].nIds);
@ -2252,7 +2280,7 @@ const char * GetTilePixels(const long idTile)
if ((idTile >= 0) && (idTile < MAXTILES))
{
if (0 == waloff[idTile])
if (!waloff[idTile])
{
loadtile(idTile);
}
@ -3290,11 +3318,11 @@ static void Keys3d(void)
sprite[searchwall].cstat = i;
if (sprite[searchwall].cstat&16)
sprintf(getmessage,"Sprite (%d) wall aligned",searchwall);
sprintf(getmessage,"Sprite (%d) now wall aligned",searchwall);
else if (sprite[searchwall].cstat&32)
sprintf(getmessage,"Sprite (%d) floor aligned",searchwall);
sprintf(getmessage,"Sprite (%d) now floor aligned",searchwall);
else
sprintf(getmessage,"Sprite (%d) un-aligned",searchwall);
sprintf(getmessage,"Sprite (%d) now view aligned",searchwall);
message(getmessage);
asksave = 1;
}
@ -4498,11 +4526,11 @@ static void Keys2d(void)
sprite[cursprite].cstat = i;
if (sprite[cursprite].cstat&16)
sprintf(getmessage,"Sprite (%d) is wall aligned",cursprite);
sprintf(getmessage,"Sprite (%d) now wall aligned",cursprite);
else if (sprite[cursprite].cstat&32)
sprintf(getmessage,"Sprite (%d) is floor aligned",cursprite);
sprintf(getmessage,"Sprite (%d) now floor aligned",cursprite);
else
sprintf(getmessage,"Sprite (%d) is un-aligned",cursprite);
sprintf(getmessage,"Sprite (%d) now view aligned",cursprite);
message(getmessage);
asksave = 1;
@ -5426,7 +5454,13 @@ enum {
T_EOF = -2,
T_ERROR = -1,
T_INCLUDE = 0,
T_LOADGRP = 1,
T_DEFINE = 1,
T_LOADGRP,
T_TILEGROUP,
T_NAME,
T_TILE,
T_TILERANGE,
T_KEY
};
typedef struct
@ -5456,17 +5490,14 @@ static int getatoken(scriptfile *sf, tokenlist *tl, int ntokens)
static tokenlist grptokens[] =
{
{ "include", T_INCLUDE },
{ "#include", T_INCLUDE },
{ "loadgrp", T_LOADGRP },
};
int loadgroupfiles(char *fn)
int parsegroupfiles(scriptfile *script)
{
int tokn;
char *cmdtokptr;
scriptfile *script;
script = scriptfile_fromfile(fn);
if (!script) return -1;
while (1)
{
@ -5502,7 +5533,7 @@ int loadgroupfiles(char *fn)
}
else
{
loadgroupfiles((char *)included);
parsegroupfiles(included);
scriptfile_close(included);
}
}
@ -5515,6 +5546,165 @@ int loadgroupfiles(char *fn)
break;
}
}
return 0;
}
int loadgroupfiles(char *fn)
{
scriptfile *script;
script = scriptfile_fromfile(fn);
if (!script) return -1;
parsegroupfiles(script);
scriptfile_close(script);
scriptfile_clearsymbols();
return 0;
}
static tokenlist tgtokens[] =
{
{ "include", T_INCLUDE },
{ "#include", T_INCLUDE },
{ "define", T_DEFINE },
{ "#define", T_DEFINE },
{ "tilegroup", T_TILEGROUP },
};
static tokenlist tgtokens2[] =
{
{ "tilegroup", T_TILEGROUP },
{ "name", T_NAME },
{ "tile", T_TILE },
{ "tilerange", T_TILERANGE },
{ "key", T_KEY },
};
int parsetilegroups(scriptfile *script)
{
int tokn;
char *cmdtokptr;
while (1)
{
tokn = getatoken(script,tgtokens,sizeof(tgtokens)/sizeof(tokenlist));
cmdtokptr = script->ltextptr;
switch (tokn)
{
case T_INCLUDE:
{
char *fn;
if (!scriptfile_getstring(script,&fn))
{
scriptfile *included;
included = scriptfile_fromfile(fn);
if (!included)
{
initprintf("Warning: Failed including %s on line %s:%d\n",
fn, script->filename,scriptfile_getlinum(script,cmdtokptr));
}
else
{
parsetilegroups(included);
scriptfile_close(included);
}
}
break;
}
case T_DEFINE:
{
char *name;
int number;
if (scriptfile_getstring(script,&name)) break;
if (scriptfile_getsymbol(script,&number)) break;
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;
}
case T_TILEGROUP:
{
char *end, *name;
int g, i;
if (scriptfile_getnumber(script,&g)) break;
if ((unsigned)g >= NUM_TILE_GROUPS) break;
if (s_TileGroups[g].pIds == NULL)
s_TileGroups[g].pIds = Bcalloc(MAX_TILE_GROUP_ENTRIES,sizeof(long));
// if (scriptfile_getstring(script,&name)) break;
if (scriptfile_getbraces(script,&end)) break;
while (script->textptr < end)
{
int token = getatoken(script,tgtokens2,sizeof(tgtokens2)/sizeof(tokenlist));
switch (token)
{
case T_NAME:
{
if (scriptfile_getstring(script,&name)) break;
if (s_TileGroups[g].szText != NULL)
Bfree(s_TileGroups[g].szText);
s_TileGroups[g].szText = strdup(name);
break;
}
case T_TILE:
{
if (scriptfile_getsymbol(script,&i)) break;
if (i >= 0 && i < MAXTILES && s_TileGroups[g].nIds < MAX_TILE_GROUP_ENTRIES)
s_TileGroups[g].pIds[s_TileGroups[g].nIds++] = i;
// OSD_Printf("added tile %d to group %d\n",i,g);
break;
}
case T_TILERANGE:
{
int j;
if (scriptfile_getsymbol(script,&i)) break;
if (scriptfile_getsymbol(script,&j)) break;
if (i < 0 || i >= MAXTILES || j < 0 || j >= MAXTILES) break;
while (s_TileGroups[g].nIds < MAX_TILE_GROUP_ENTRIES && i < j)
{
s_TileGroups[g].pIds[s_TileGroups[g].nIds++] = i++;
// OSD_Printf("added tile %d to group %d\n",i,g);
}
break;
}
case T_KEY:
{
char *c;
if (scriptfile_getstring(script,&c)) break;
s_TileGroups[g].key1 = Btoupper(c[0]);
s_TileGroups[g].key2 = Btolower(c[0]);
break;
}
}
}
break;
}
case T_EOF:
return(0);
default:
break;
}
}
return 0;
}
int loadtilegroups(char *fn)
{
scriptfile *script;
script = scriptfile_fromfile(fn);
if (!script) return -1;
parsetilegroups(script);
scriptfile_close(script);
scriptfile_clearsymbols();
@ -5684,14 +5874,25 @@ int ExtInit(void)
OSD_SetParameters(0,2, 0,0, 4,0);
registerosdcommands();
loadtilegroups("tiles.cfg");
return rv;
}
void ExtUnInit(void)
{
int i;
// setvmode(0x03);
uninitgroupfile();
writesetup(setupfilename);
for (i = 0; (unsigned)i < NUM_TILE_GROUPS; i++)
{
if (s_TileGroups[i].pIds != NULL)
Bfree(s_TileGroups[i].pIds);
if (s_TileGroups[i].szText != NULL)
Bfree(s_TileGroups[i].szText);
}
}
void ExtPreCheckKeys(void) // just before drawrooms

View file

@ -8443,11 +8443,10 @@ static void autoloadgrps(const char *fn)
while (findfiles) { Bsprintf(tempbuf,"autoload/%s/%s",fn,findfiles->name); initprintf("Using group file '%s'.\n",tempbuf); initgroupfile(tempbuf); findfiles = findfiles->next; }
}
static int loadgroupfiles(const char *fn)
static int parsegroupfiles(scriptfile *script)
{
int tokn;
char *cmdtokptr;
scriptfile *script;
tokenlist grptokens[] =
{
@ -8457,9 +8456,6 @@ static int loadgroupfiles(const char *fn)
{ "cachesize", T_CACHESIZE },
};
script = scriptfile_fromfile((char *)fn);
if (!script) return -1;
while (1)
{
tokn = getatoken(script,grptokens,sizeof(grptokens)/sizeof(tokenlist));
@ -8510,7 +8506,7 @@ static int loadgroupfiles(const char *fn)
}
else
{
loadgroupfiles((const char *)included);
parsegroupfiles(included);
scriptfile_close(included);
}
}
@ -8522,6 +8518,17 @@ static int loadgroupfiles(const char *fn)
break;
}
}
return 0;
}
static int loadgroupfiles(const char *fn)
{
scriptfile *script;
script = scriptfile_fromfile((char *)fn);
if (!script) return -1;
parsegroupfiles(script);
scriptfile_close(script);
scriptfile_clearsymbols();

View file

@ -178,164 +178,37 @@ static const long ZoomToThumbSize[] =
#define INITIAL_ZOOM 2
// If I wasn't a lazy sod I'd have made these loadable from external config files.
///////////////////
// ACTOR SPRITES //
///////////////////
static const long s_idActors[] =
struct
{
LIZTROOP, LIZTROOPRUNNING, LIZTROOPSTAYPUT, LIZTROOPSHOOT, LIZTROOPJETPACK,
LIZTROOPONTOILET, LIZTROOPJUSTSIT, LIZTROOPDUCKING,
PIGCOP, PIGCOPSTAYPUT, PIGCOPDIVE,
LIZMAN, LIZMANSTAYPUT, LIZMANSPITTING, LIZMANFEEDING, LIZMANJUMP,
COMMANDER, COMMANDERSTAYPUT,
OCTABRAIN, OCTABRAINSTAYPUT,
ORGANTIC,
NEWBEAST, NEWBEASTSTAYPUT, NEWBEASTJUMP,
EGG, GREENSLIME, ROTATEGUN, RECON, TANK, BOUNCEMINE,
FLOORFLAME,
// FEMS
FEM1, FEM2, FEM3, FEM4, FEM5, FEM6, FEM7, FEM8, FEM9, FEM10, NAKED1,
// Lil' critters
SHARK,
// BIG critters
BOSS1, BOSS1STAYPUT, BOSS1SHOOT, BOSS1LOB,
BOSS2,
BOSS3,
BOSS4, BOSS4STAYPUT
} ;
#define NUM_ACTORS (sizeof(s_idActors)/sizeof(s_idActors[0]))
/////////////////
// DOOR TILES ///
/////////////////
// Not all of these are tuely door tiles but are useable as such
static const long s_idDoors[] =
{
DOORTILE1, DOORTILE2, DOORTILE3, DOORTILE4, DOORTILE5,
DOORTILE6, DOORTILE7, DOORTILE8, DOORTILE9, DOORTILE10,
312, 313, 314, 345,
DOORTILE22, DOORTILE18, DOORTILE19, DOORTILE20,
450, 455, 457, 458, 459, 469, 470, 477,
DOORTILE14,
719, 735, 771,
DOORTILE16,
843, 858, 883,
DOORTILE15, DOORTILE21,
1173,
DOORTILE11,DOORTILE12,
353, 355,
// Related items
DOORSHOCK, ACCESSCARD
};
#define NUM_DOORS (sizeof(s_idDoors)/sizeof(s_idDoors[0]))
//////////////////
// SWITCH TILES //
//////////////////
static const long s_idSwitches[] =
{
ACCESSSWITCH,ACCESSSWITCH2, SLOTDOOR, LIGHTSWITCH, SPACEDOORSWITCH, SPACELIGHTSWITCH,
FRANKENSTINESWITCH, MULTISWITCH,
DIPSWITCH, DIPSWITCH2, DIPSWITCH3, TECHSWITCH,
LIGHTSWITCH2, LIGHTSWITCH2+1,
POWERSWITCH1, LOCKSWITCH1, POWERSWITCH2, HANDSWITCH, PULLSWITCH,
ALIENSWITCH, HANDPRINTSWITCH, NUKEBUTTON,
TARGET,
4083, 4954 // Busted switches (Atomic)
} ;
#define NUM_SWITCHES (sizeof(s_idSwitches)/sizeof(s_idSwitches[0]))
///////////////////
// GOODIES TILES //
///////////////////
static const long s_idGoodies[] =
{
// Ammo
AMMO,SHOTGUNAMMO, BATTERYAMMO, RPGAMMO, HEAVYHBOMB, FREEZEAMMO, GROWAMMO, CRYSTALAMMO,
DEVISTATORAMMO, HBOMBAMMO,
// Items (health,etc)
COLA, SIXPAK, FIRSTAID, SHIELD, STEROIDS, AIRTANK, JETPACK, HEATSENSOR, ACCESSCARD,
BOOTS, ATOMICHEALTH,
// Weapons
FIRSTGUNSPRITE, CHAINGUNSPRITE, RPGSPRITE, FREEZESPRITE, SHRINKERSPRITE,
TRIPBOMBSPRITE, SHOTGUNSPRITE, DEVISTATORSPRITE
} ;
#define NUM_GOODIES (sizeof(s_idGoodies)/sizeof(s_idGoodies[0]))
////////////////////////
// ITEMS THAT RESPAWN //
////////////////////////
// Thought there were more than just these :-(
static const long s_idRespawns[] =
{
CANWITHSOMETHING, CANWITHSOMETHING2, CANWITHSOMETHING3, CANWITHSOMETHING4,
// FEMS
FEM1, FEM2, FEM3, FEM4, FEM5, FEM6, FEM7, FEM8, FEM9, FEM10, NAKED1,
} ;
#define NUM_RESPAWNS (sizeof(s_idRespawns)/sizeof(s_idRespawns[0]))
////////////////////////
// EXPLOSION AND FIRE //
////////////////////////
static const long s_idExplosions[] =
{
CRACK1, CRACK2, CRACK3, CRACK4,
FIREEXT, SEENINE, OOZFILTER,
EXPLODINGBARREL, EXPLODINGBARREL2, FIREBARREL, GUNPOWDERBARREL,
REACTOR2SPARK, BOLT1, SIDEBOLT1,
CEILINGSTEAM,
FIREVASE, 2066, BURNING, FIRE, BURNING2, FIRE2
} ;
#define NUM_EXPLOSIONS (sizeof(s_idExplosions)/sizeof(s_idExplosions[0]))
////////////////////////////////////////////////////////////////
// BUILD STRUCTURE USED IN SELECTING ONE OF ABOVE LTILE LISTS //
////////////////////////////////////////////////////////////////
const struct
{
const long *pIds ; // ptr to list of tile Ids
long *pIds ; // ptr to list of tile Ids
long nIds ; // num of tile ids
char key1 ; // key1 and key2 are two alternative keypresses used to
char key2 ; // select tile set. Bodge to do eary upper/lower case handling
char *szText ; // description to present to user.
} s_TileGroups[] =
{
{ s_idActors, NUM_ACTORS, 'A', 'a', "(A) Actor group" },
{ s_idDoors, NUM_DOORS, 'D', 'd', "(D) Door group" },
{ s_idGoodies, NUM_GOODIES, 'G', 'g', "(G) Goodies (ammo, weapons, etc)" },
{ s_idRespawns, NUM_RESPAWNS, 'R', 'r', "(R) Respawning Items" },
{ s_idSwitches, NUM_SWITCHES, 'S', 's', "(S) Switch group" },
{ s_idExplosions, NUM_EXPLOSIONS, 'X', 'x', "(X) eXplosions, fire, sparks, etc" }
{ NULL, 0, 0, 0, NULL },
{ NULL, 0, 0, 0, NULL },
{ NULL, 0, 0, 0, NULL },
{ NULL, 0, 0, 0, NULL },
{ NULL, 0, 0, 0, NULL },
{ NULL, 0, 0, 0, NULL },
{ NULL, 0, 0, 0, NULL },
{ NULL, 0, 0, 0, NULL },
{ NULL, 0, 0, 0, NULL },
{ NULL, 0, 0, 0, NULL },
} ;
#define NUM_TILE_GROUPS (sizeof(s_TileGroups)/sizeof(s_TileGroups[0]))
#define MAX_TILE_GROUP_ENTRIES 128
#define FIRST_USER_ART_TILE 3584
// Some atomic tiles are sprinkled in the V1.3d's area but
// this is where the main atomic tiles start :-
#define FIRST_ATOMIC_TILE 4096
#define FIRST_EXTENDED_TILE 6144
#define SECOND_EXTENDED_TILE 9216
extern short localartfreq[MAXTILES];
extern short localartlookup[MAXTILES], localartlookupnum;