In loadlookups(), look for gap of 4 consecutive unused pals for fog pals.

As opposed to the previous way, where the first fog pals was <numlookups>+1,
where <numlookups> is the first byte value of LOOKUP.DAT. This allows to
pack e.g. lookups [1 .. 25] and [30 .. <lastpal>] into LOOKUP.DAT and have fog
pals be generated at pals [26 .. 29] (i.e. the additional lookups don't
shift the fog pals, making user maps depending on these numbers not look as
intended.)

git-svn-id: https://svn.eduke32.com/eduke32@4335 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2014-02-16 19:16:05 +00:00
parent 7e7507746d
commit df25e3cd7c
8 changed files with 44 additions and 23 deletions

View file

@ -173,7 +173,6 @@ extern int32_t g_iReturnVar;
extern int32_t g_doScreenShot; extern int32_t g_doScreenShot;
extern int32_t m32_sortvar1, m32_sortvar2; extern int32_t m32_sortvar1, m32_sortvar2;
//extern int32_t g_numRealPalettes;
//extern int32_t g_scriptDebug; //extern int32_t g_scriptDebug;
extern int32_t g_numQuoteRedefinitions; extern int32_t g_numQuoteRedefinitions;

View file

@ -8150,37 +8150,36 @@ static int32_t loadpalette(void)
// //
// Returns: // Returns:
// - if generated fog shade tables, their first palnum P (fog pals are [P .. P+3]) // - if generated fog shade tables, their first palnum P (fog pals are [P .. P+3])
// - if didn't (no room), 0
// - on error, -1 // - on error, -1
int32_t loadlookups(int32_t fp, uint8_t **basepaltabptr) int32_t loadlookups(int32_t fp, uint8_t **basepaltabptr)
{ {
uint8_t numlookups; uint8_t numlookups;
char remapbuf[256]; char remapbuf[256];
int32_t j; int32_t j, firstfogpal=0;
if (kread(fp, &numlookups, 1) != 1) if (kread(fp, &numlookups, 1) != 1)
return -1; return -1;
for (j=numlookups+1; j<MAXPALOOKUPS; j++)
makepalookup(j, NULL, 0,0,0, 1);
for (j=0; j<numlookups; j++) for (j=0; j<numlookups; j++)
{ {
uint8_t palnum; uint8_t palnum;
if (kread(fp, &palnum, 1) != 1) if (kread(fp, &palnum, 1) != 1)
return -1; return -1;
if (palnum == 0)
{
initprintf("ERROR: attempt to load lookup at pal 0\n");
return -1;
}
if (kread(fp, remapbuf, 256) != 256) if (kread(fp, remapbuf, 256) != 256)
return -1; return -1;
makepalookup(palnum, remapbuf, 0,0,0, 1); makepalookup(palnum, remapbuf, 0,0,0, 1);
} }
numlookups++;
makepalookup(numlookups, NULL, 15, 15, 15, 1);
makepalookup(numlookups + 1, NULL, 15, 0, 0, 1);
makepalookup(numlookups + 2, NULL, 0, 15, 0, 1);
makepalookup(numlookups + 3, NULL, 0, 0, 15, 1);
for (j=1; j<=5; j++) for (j=1; j<=5; j++)
{ {
// Account for TITLE and REALMS swap between basepal number and on-disk order. // Account for TITLE and REALMS swap between basepal number and on-disk order.
@ -8191,7 +8190,25 @@ int32_t loadlookups(int32_t fp, uint8_t **basepaltabptr)
return -1; return -1;
} }
return numlookups; // Find a gap of four consecutive unused pal numbers to generate fog shade tables.
for (j=1; j<=255-3; j++)
if (!palookup[j] && !palookup[j+1] && !palookup[j+2] && !palookup[j+3])
{
makepalookup(j, NULL, 15, 15, 15, 1);
makepalookup(j+1, NULL, 15, 0, 0, 1);
makepalookup(j+2, NULL, 0, 15, 0, 1);
makepalookup(j+3, NULL, 0, 0, 15, 1);
firstfogpal = j;
break;
}
// Alias remaining unused pal numbers to the base shade table.
for (j=1; j<MAXPALOOKUPS; j++)
if (!palookup[j])
makepalookup(j, NULL, 0,0,0, 1);
return firstfogpal;
} }
// Finds a color index in [0 .. lastokcol] closest to (r, g, b). // Finds a color index in [0 .. lastokcol] closest to (r, g, b).

View file

@ -2856,10 +2856,10 @@ static int32_t ReadPaletteTable(void)
} }
} }
num_tables = loadlookups(fp, basepaltable); g_firstFogPal = loadlookups(fp, basepaltable);
kclose(fp); kclose(fp);
if (num_tables < 0) if (g_firstFogPal < 0)
{ {
initprintf("ERROR loading PALOOKUP.DAT: failed reading enough data\n"); initprintf("ERROR loading PALOOKUP.DAT: failed reading enough data\n");
return 1; return 1;
@ -10938,13 +10938,17 @@ void ExtAnalyzeSprites(int32_t ourx, int32_t oury, int32_t oura, int32_t smoothr
if (shadepreview) if (shadepreview)
{ {
int32_t wallaligned = (tspr->cstat & 16); int32_t wallaligned = (tspr->cstat & 16);
int32_t fpal;
if (tspr->sectnum<0) if (tspr->sectnum<0)
continue; continue;
fpal = sector[tspr->sectnum].floorpal;
// 1st rule // 1st rule
if (sector[tspr->sectnum].floorpal > 0 && sector[tspr->sectnum].floorpal < num_tables) // Compare with game.c:G_MaybeTakeOnFloorPal()
tspr->pal = sector[tspr->sectnum].floorpal; if (fpal > 0 && g_firstFogPal > 0 && !(fpal >= g_firstFogPal && fpal <= g_firstFogPal+3))
tspr->pal = fpal;
// 2nd and 3rd rule minus "actor condition" // 2nd and 3rd rule minus "actor condition"
if (!wallaligned && (tspr->cstat&2048)==0) if (!wallaligned && (tspr->cstat&2048)==0)

View file

@ -6979,11 +6979,14 @@ SPAWN_END:
return i; return i;
} }
static int32_t g_firstFogPal;
static int32_t G_MaybeTakeOnFloorPal(spritetype *datspr, int32_t sect) static int32_t G_MaybeTakeOnFloorPal(spritetype *datspr, int32_t sect)
{ {
int32_t dapal = sector[sect].floorpal; int32_t dapal = sector[sect].floorpal;
if (dapal && !g_noFloorPal[dapal] && dapal < g_numRealPalettes if (dapal && g_firstFogPal && !(dapal >= g_firstFogPal && dapal <= g_firstFogPal+3)
&& !g_noFloorPal[dapal]
&& !A_CheckSpriteFlags(datspr->owner,SPRITE_NOPAL)) && !A_CheckSpriteFlags(datspr->owner,SPRITE_NOPAL))
{ {
datspr->pal = dapal; datspr->pal = dapal;
@ -10637,10 +10640,10 @@ static void G_LoadExtraPalettes(void)
if (fp == -1) if (fp == -1)
G_GameExit("\nERROR: File 'lookup.dat' not found."); G_GameExit("\nERROR: File 'lookup.dat' not found.");
g_numRealPalettes = loadlookups(fp, basepaltable); g_firstFogPal = loadlookups(fp, basepaltable);
kclose(fp); kclose(fp);
if (g_numRealPalettes < 0) if (g_firstFogPal < 0)
G_GameExit("\nERROR loading 'lookup.dat': failed reading enough data."); G_GameExit("\nERROR loading 'lookup.dat': failed reading enough data.");
// Make color index 255 of default/water/slime palette black. // Make color index 255 of default/water/slime palette black.

View file

@ -96,7 +96,6 @@ G_EXTERN int32_t g_groupFileHandle;
G_EXTERN int32_t g_impactDamage,g_maxPlayerHealth; G_EXTERN int32_t g_impactDamage,g_maxPlayerHealth;
G_EXTERN int32_t g_musicSize; G_EXTERN int32_t g_musicSize;
G_EXTERN int32_t g_numLabels,g_numDefaultLabels; G_EXTERN int32_t g_numLabels,g_numDefaultLabels;
G_EXTERN int32_t g_numRealPalettes;
G_EXTERN int32_t g_scriptDebug; G_EXTERN int32_t g_scriptDebug;
G_EXTERN int32_t g_showShareware; G_EXTERN int32_t g_showShareware;
G_EXTERN int8_t g_numPlayerSprites; G_EXTERN int8_t g_numPlayerSprites;

View file

@ -84,7 +84,7 @@ static uint8_t *basepaltable[BASEPALCOUNT] = {
}; };
static int32_t num_tables; static int32_t g_firstFogPal;
static int32_t updownunits=1024; static int32_t updownunits=1024;

View file

@ -1467,7 +1467,7 @@ int32_t registerosdcommands(void)
{ "cl_weaponsway", "enable/disable player weapon swaying", (void *)&ud.weaponsway, CVAR_BOOL, 0, 1 }, { "cl_weaponsway", "enable/disable player weapon swaying", (void *)&ud.weaponsway, CVAR_BOOL, 0, 1 },
{ "cl_weaponswitch", "enable/disable auto weapon switching", (void *)&ud.weaponswitch, CVAR_INT|CVAR_MULTI, 0, 7 }, { "cl_weaponswitch", "enable/disable auto weapon switching", (void *)&ud.weaponswitch, CVAR_INT|CVAR_MULTI, 0, 7 },
{ "color", "changes player palette", (void *)&ud.color, CVAR_INT|CVAR_MULTI, 0, g_numRealPalettes }, { "color", "changes player palette", (void *)&ud.color, CVAR_INT|CVAR_MULTI, 0, MAXPALOOKUPS-1 },
{ "crosshairscale","changes the size of the crosshair", (void *)&ud.crosshairscale, CVAR_INT, 10, 100 }, { "crosshairscale","changes the size of the crosshair", (void *)&ud.crosshairscale, CVAR_INT, 10, 100 },

View file

@ -32,7 +32,6 @@ extern halfdimen_t g_halfScreen;
extern int32_t g_halveScreenArea; extern int32_t g_halveScreenArea;
extern int32_t g_levelTextTime; extern int32_t g_levelTextTime;
extern int32_t g_numRealPalettes;
extern int32_t voting,vote_map,vote_episode; extern int32_t voting,vote_map,vote_episode;
extern palette_t CrosshairColors; extern palette_t CrosshairColors;
void G_SetupFilenameBasedMusic(char *levnamebuf, const char *boardfilename, int32_t level_number); void G_SetupFilenameBasedMusic(char *levnamebuf, const char *boardfilename, int32_t level_number);