Merge pull request 'Palette remapping (compatmode)' (#16) from palremap2 into ACS2

Reviewed-on: https://codeberg.org/NepDisk/blankart/pulls/16
This commit is contained in:
NepDisk 2025-01-24 18:16:54 +00:00
commit 05e79fbe75
39 changed files with 506 additions and 333 deletions

View file

@ -162,25 +162,25 @@ consvar_t cons_backcolor = CVAR_INIT ("con_backcolor", "Black", CV_CALL|CV_SAVE,
static CV_PossibleValue_t menuhighlight_cons_t[] =
{
{0, "Gametype Default"},
{V_YELLOWMAP, "Always Yellow"},
{V_PURPLEMAP, "Always Purple"},
{V_GREENMAP, "Always Green"},
{V_BLUEMAP, "Always Blue"},
{V_REDMAP, "Always Red"},
{V_GRAYMAP, "Always Gray"},
{V_ORANGEMAP, "Always Orange"},
{V_SKYMAP, "Always Sky-Blue"},
{V_GOLDMAP, "Always Gold"},
{V_LAVENDERMAP, "Always Lavender"},
{V_TEAMAP, "Always Tea-Green"},
{V_STEELMAP, "Always Steel-Blue"},
{V_PINKMAP, "Always Pink"},
{V_BROWNMAP, "Always Brown"},
{V_PEACHMAP, "Always Peach"},
{0, "Game type"},
{V_YELLOWMAP, "Always yellow"},
{V_PURPLEMAP, "Always purple"},
{V_GREENMAP, "Always green"},
{V_BLUEMAP, "Always blue"},
{V_REDMAP, "Always red"},
{V_GRAYMAP, "Always gray"},
{V_ORANGEMAP, "Always orange"},
{V_SKYMAP, "Always sky-blue"},
{V_GOLDMAP, "Always gold"},
{V_LAVENDERMAP, "Always lavender"},
{V_AQUAMAP, "Always aqua-green"},
{V_MAGENTAMAP, "Always magenta"},
{V_PINKMAP, "Always pink"},
{V_BROWNMAP, "Always brown"},
{V_TANMAP, "Always tan"},
{0, NULL}
};
consvar_t cons_menuhighlight = CVAR_INIT ("menuhighlight", "Gametype Default", CV_SAVE, menuhighlight_cons_t, NULL);
consvar_t cons_menuhighlight = CVAR_INIT ("menuhighlight", "Game type", CV_SAVE, menuhighlight_cons_t, NULL);
static void CON_Print(char *msg);
@ -365,8 +365,10 @@ static void CONS_ChooseWeighted_f(void)
// Font colormap colors
// TODO: This could probably be improved somehow...
// These colormaps are 99% identical, with just a few changed bytes
// This could EASILY be handled by modifying a centralised colormap
// for software depending on the prior state - but yknow, OpenGL...
UINT8 *yellowmap, *purplemap, *greenmap, *bluemap, *graymap, *redmap, *orangemap,\
*skymap, *goldmap, *lavendermap, *teamap, *steelmap, *pinkmap, *brownmap, *peachmap;
*skymap, *goldmap, *lavendermap, *aquamap, *magentamap, *pinkmap, *brownmap, *tanmap;
// Console BG color
UINT8 *consolebgmap = NULL;
@ -385,30 +387,29 @@ void CON_SetupBackColormapEx(INT32 color, boolean prompt)
shift = 6; // 12 colors -- shift of 7 means 6 colors
switch (cons_backcolor.value)
switch (color)
{
case 0: palindex = 15; break; // White
case 1: palindex = 31; break; // Gray
case 2: palindex = 47; break; // Sepia
case 3: palindex = 63; break; // Brown
case 4: palindex = 150; shift = 7; break; // Pink
case 5: palindex = 127; shift = 7; break; // Raspberry
case 6: palindex = 143; break; // Red
case 7: palindex = 86; shift = 7; break; // Creamsicle
case 8: palindex = 95; break; // Orange
case 9: palindex = 119; shift = 7; break; // Gold
case 10: palindex = 111; break; // Yellow
case 11: palindex = 191; shift = 7; break; // Emerald
case 12: palindex = 175; break; // Green
case 13: palindex = 219; break; // Cyan
case 14: palindex = 207; shift = 7; break; // Steel
case 15: palindex = 230; shift = 7; break; // Periwinkle
case 16: palindex = 239; break; // Blue
case 17: palindex = 199; shift = 7; break; // Purple
case 18: palindex = 255; shift = 7; break; // Lavender
case 1: palindex = 31; break; // Black
case 2: palindex = 251; break; // Sepia
case 3: palindex = 239; break; // Brown
case 4: palindex = 215; shift = 7; break; // Pink
case 5: palindex = 37; shift = 7; break; // Raspberry
case 6: palindex = 47; shift = 7; break; // Red
case 7: palindex = 53; shift = 7; break; // Creamsicle
case 8: palindex = 63; break; // Orange
case 9: palindex = 56; shift = 7; break; // Gold
case 10: palindex = 79; shift = 7; break; // Yellow
case 11: palindex = 119; shift = 7; break; // Emerald
case 12: palindex = 111; break; // Green
case 13: palindex = 136; shift = 7; break; // Cyan
case 14: palindex = 175; shift = 7; break; // Steel
case 15: palindex = 166; shift = 7; break; // Periwinkle
case 16: palindex = 159; break; // Blue
case 17: palindex = 187; shift = 7; break; // Purple
case 18: palindex = 199; shift = 7; break; // Lavender
// Default green
default: palindex = 175; break;
default: palindex = 111; break;
}
if (prompt)
@ -461,11 +462,11 @@ static void CON_SetupColormaps(void)
skymap = (orangemap+256);
lavendermap = (skymap+256);
goldmap = (lavendermap+256);
teamap = (goldmap+256);
steelmap = (teamap+256);
pinkmap = (steelmap+256);
aquamap = (goldmap+256);
magentamap = (aquamap+256);
pinkmap = (magentamap+256);
brownmap = (pinkmap+256);
peachmap = (brownmap+256);
tanmap = (brownmap+256);
// setup the other colormaps, for console text
@ -475,21 +476,21 @@ static void CON_SetupColormaps(void)
for (i = 0; i < (256*15); i++, ++memorysrc)
*memorysrc = (UINT8)(i & 0xFF); // remap each color to itself...
purplemap[120] = (UINT8)194;
yellowmap[120] = (UINT8)103;
greenmap[120] = (UINT8)162;
bluemap[120] = (UINT8)228;
redmap[120] = (UINT8)126; // battle
graymap[120] = (UINT8)10;
orangemap[120] = (UINT8)85; // record attack
skymap[120] = (UINT8)214; // race
lavendermap[120] = (UINT8)248;
goldmap[120] = (UINT8)114;
teamap[120] = (UINT8)177;
steelmap[120] = (UINT8)201;
pinkmap[120] = (UINT8)145;
brownmap[120] = (UINT8)48;
peachmap[120] = (UINT8)69; // nice
purplemap[0] = (UINT8)163;
yellowmap[0] = (UINT8)73;
greenmap[0] = (UINT8)98;
bluemap[0] = (UINT8)148;
redmap[0] = (UINT8)34; // battle
graymap[0] = (UINT8)10;
orangemap[0] = (UINT8)52; // record attack
skymap[0] = (UINT8)132; // race
lavendermap[0] = (UINT8)192;
goldmap[0] = (UINT8)65;
aquamap[0] = (UINT8)121;
magentamap[0] = (UINT8)182;
pinkmap[0] = (UINT8)210;
brownmap[0] = (UINT8)224;
tanmap[0] = (UINT8)217; // no longer nice :(
// Init back colormap
CON_SetupBackColormap();

View file

@ -588,7 +588,7 @@ static inline void CL_DrawConnectionStatus(void)
)
{
INT32 i, animtime = ((ccstime / 4) & 15) + 16;
UINT8 palstart = (cl_mode == CL_SEARCHING) ? 128 : 160;
UINT8 palstart = (cl_mode == CL_SEARCHING) ? 32 : 96;
// 15 pal entries total.
const char *cltext;
@ -717,8 +717,8 @@ static inline void CL_DrawConnectionStatus(void)
if (dldlength > 256)
dldlength = 256;
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, 256, 8, 175);
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, dldlength, 8, 160);
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, 256, 8, 111);
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, dldlength, 8, 96);
memset(tempname, 0, sizeof(tempname));
// offset filename to just the name only part

View file

@ -613,7 +613,7 @@ static bool D_Display(void)
}
if (demo.rewinding)
V_DrawFadeScreen(TC_RAINBOW, (leveltime & 0x20) ? SKINCOLOR_PASTEL : SKINCOLOR_MOONSLAM);
V_DrawFadeScreen(TC_RAINBOW, (leveltime & 0x20) ? SKINCOLOR_PASTEL : SKINCOLOR_MOONSET);
// vid size change is now finished if it was on...
vid.recalc = 0;
@ -1137,7 +1137,7 @@ static void ChangeDirForUrlHandler(void)
static boolean AddIWAD(void)
{
char * path = va(pandf,srb2path,"main.pk3");
char * path = va(pandf,srb2path,"srb2.srb");
if (FIL_ReadFileOK(path))
{
@ -1155,7 +1155,7 @@ static void IdentifyVersion(void)
const char *srb2waddir = NULL;
#if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL)
// change to the directory where 'main.pk3' is found
// change to the directory where 'srb2.srb' is found
srb2waddir = I_LocateWad();
#endif
@ -1175,7 +1175,7 @@ static void IdentifyVersion(void)
// Load the IWAD
if (! AddIWAD())
{
I_Error("main.pk3 not found! Expected in %s\n", srb2waddir);
I_Error("srb2.srb not found! Expected in %s\n", srb2waddir);
}
// will be overwritten in case of -cdrom or unix/win home
@ -1185,7 +1185,7 @@ static void IdentifyVersion(void)
// if you change the ordering of this or add/remove a file, be sure to update the md5
// checking in D_SRB2Main
#define SRB2NAME "srb2.srb"
#define MAINNAME "main.pk3"
#define TEXTURESNAME "textures.kart"
#define MAPSNAME "maps.kart"
#define PATCHNAME "patch.pk3"
@ -1195,7 +1195,7 @@ static void IdentifyVersion(void)
#define GRAPHICSNAME "gfx.kart"
#define SOUNDSNAME "sounds.kart"
D_AddFile(startupiwads, va(pandf,srb2waddir,SRB2NAME));
D_AddFile(startupiwads, va(pandf,srb2waddir,MAINNAME));
D_AddFile(startupiwads, va(pandf,srb2waddir,GRAPHICSNAME));
D_AddFile(startupiwads, va(pandf,srb2waddir,TEXTURESNAME));
D_AddFile(startupiwads, va(pandf,srb2waddir,CHARSNAME));
@ -1205,7 +1205,7 @@ static void IdentifyVersion(void)
D_AddFile(startupiwads, va(pandf,srb2waddir,PATCHNAME));
#endif
////
#undef SRB2NAME
#undef MAINNAME
#undef TEXTURESNAME
#undef MAPSNAME
#undef PATCHNAME
@ -1483,8 +1483,8 @@ void D_SRB2Main(void)
#ifndef DEVELOP
// Check MD5s of autoloaded files
// Note: Do not add any files that ignore MD5!
W_VerifyFileMD5(mainwads, ASSET_HASH_MAIN_PK3); // main.pk3
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_SRB2_SRB); // gfx.pk3
W_VerifyFileMD5(mainwads, ASSET_HASH_SRB2_SRB); // srb2.srb
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_MAIN_PK3); // main.pk3
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_GFX_KART); // gfx.pk3
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_TEXTURES_KART); // textures.pk3
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_CHARS_PK3); // chars.pk3
@ -1494,7 +1494,7 @@ void D_SRB2Main(void)
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_PATCH_PK3); // patch.pk3
#endif
#else
mainwads++; // srb2.srb
mainwads++; // main.pk3
mainwads++; // gfx.kart
mainwads++; // textures.kart
mainwads++; // chars.pk3
@ -1506,6 +1506,8 @@ void D_SRB2Main(void)
#endif //ifndef DEVELOP
R_InitPaletteRemap();
// now do it again for the SOC colors in main.pk3!
M_InitPlayerSetupColors();

View file

@ -4381,9 +4381,24 @@ static void Command_Addfile(void)
const char *addedfiles[argc]; // list of filenames already processed
size_t numfilesadded = 0; // the amount of filenames processed
if (argc < 2)
size_t docompat = COM_CheckPartialParm("-c");
size_t nocompat = COM_CheckPartialParm("-n");
wadcompat_t compat = WC_AUTO;
if (docompat && nocompat)
{
CONS_Printf(M_GetText("addfile <filename.pk3/wad/lua/soc> [filename2...] [...]: Load add-ons\n"));
CONS_Printf(M_GetText("Please specify only one of -c or -n\n"));
return;
}
else if (docompat)
compat = WC_ON;
else if (nocompat)
compat = WC_OFF;
if (argc < 2 + (docompat || nocompat))
{
CONS_Printf(M_GetText("addfile [-c|-n] <filename.pk3/wad/lua/soc> [filename2...]: Load add-ons\n"
"-c forces compatmode, -n disables it.\n"));
return;
}
@ -4398,6 +4413,9 @@ static void Command_Addfile(void)
int musiconly; // W_VerifyNMUSlumps isn't boolean
boolean fileadded = false;
if (curarg == docompat || curarg == nocompat)
continue;
fn = COM_Argv(curarg);
// For the amount of filenames previously processed...
@ -4445,7 +4463,7 @@ static void Command_Addfile(void)
// Add file on your client directly if it is trivial, or you aren't in a netgame.
if (!(netgame || multiplayer) || musiconly)
{
P_AddWadFile(fn);
P_AddWadFile(fn, compat);
addedfiles[numfilesadded++] = fn;
continue;
}
@ -4504,6 +4522,8 @@ static void Command_Addfile(void)
WRITEMEM(buf_p, md5sum, 16);
}
WRITEUINT8(buf_p, compat);
addedfiles[numfilesadded++] = fn;
if (IsPlayerAdmin(consoleplayer) && (!server)) // Request to add file
@ -4524,6 +4544,7 @@ static void Got_RequestAddfilecmd(UINT8 **cp, INT32 playernum)
READSTRINGN(*cp, filename, 240);
READMEM(*cp, md5sum, 16);
wadcompat_t compat = READUINT8(*cp);
// Only the server processes this message.
if (client)
@ -4569,7 +4590,7 @@ static void Got_RequestAddfilecmd(UINT8 **cp, INT32 playernum)
return;
}
COM_BufAddText(va("addfile %s\n", filename));
COM_BufAddText(va("addfile %s %s\n", compat == WC_ON ? "-c" : (compat == WC_OFF ? "-n" : ""), filename));
}
static void Got_Addfilecmd(UINT8 **cp, INT32 playernum)
@ -4580,6 +4601,7 @@ static void Got_Addfilecmd(UINT8 **cp, INT32 playernum)
READSTRINGN(*cp, filename, 240);
READMEM(*cp, md5sum, 16);
wadcompat_t compat = READUINT8(*cp);
if (playernum != serverplayer)
{
@ -4591,7 +4613,7 @@ static void Got_Addfilecmd(UINT8 **cp, INT32 playernum)
ncs = findfile(filename,md5sum,true);
if (ncs != FS_FOUND || !P_AddWadFile(filename))
if (ncs != FS_FOUND || !P_AddWadFile(filename, compat))
{
Command_ExitGame_f();
if (ncs == FS_FOUND)
@ -4634,6 +4656,8 @@ static void Command_ListWADS_f(void)
CONS_Printf("\x82 * %.2d\x80: %s\n", i, tempname);
else if (!wadfiles[i]->important)
CONS_Printf("\x86 %.2d: %s\n", i, tempname);
else if (wadfiles[i]->compatmode)
CONS_Printf("\x8a %.2d: %s\n", i, tempname);
else
CONS_Printf(" %.2d: %s\n", i, tempname);
}

View file

@ -214,6 +214,7 @@ UINT8 *PutFileNeeded(UINT16 firstfile)
WRITEUINT32(p, wadfiles[i]->filesize);
WRITESTRINGN(p, wadfilename, MAX_WADPATH);
WRITEMEM(p, wadfiles[i]->md5sum, 16);
WRITEUINT8(p, wadfiles[i]->compatmode);
}
if (netbuffer->packettype == PT_MOREFILESNEEDED)
netbuffer->u.filesneededcfg.num = count;
@ -247,6 +248,7 @@ void D_ParseFileneeded(INT32 fileneedednum_parm, UINT8 *fileneededstr, UINT16 fi
fileneeded[i].file = NULL; // The file isn't open yet
READSTRINGN(p, fileneeded[i].filename, MAX_WADPATH); // The next bytes are the file name
READMEM(p, fileneeded[i].md5sum, 16); // The last 16 bytes are the file checksum
fileneeded[i].compatmode = READUINT8(p);
}
}
@ -581,6 +583,10 @@ INT32 CL_CheckFiles(void)
if (memcmp(wadfiles[j]->md5sum, fileneeded[i].md5sum, 16))
return 2;
// compatmode has to match too!
if (wadfiles[j]->compatmode != fileneeded[i].compatmode)
return 2;
// It's accounted for! let's keep going.
CONS_Debug(DBG_NETPLAY, "'%s' accounted for\n", fileneeded[i].filename);
fileneeded[i].status = FS_OPEN;
@ -652,7 +658,7 @@ boolean CL_LoadServerFiles(void)
continue; // Already loaded
else if (fileneeded[i].status == FS_FOUND)
{
P_PartialAddWadFile(fileneeded[i].filename);
P_PartialAddWadFile(fileneeded[i].filename, fileneeded[i].compatmode ? WC_ON : WC_OFF);
G_SetGameModified(true, false);
fileneeded[i].status = FS_OPEN;
return false;

View file

@ -48,6 +48,7 @@ struct fileneeded_t
UINT8 md5sum[16];
filestatus_t status; // The value returned by recsearch
boolean justdownloaded; // To prevent late fragments from causing an I_Error
boolean compatmode;
// Used only for download
FILE *file;

View file

@ -1199,11 +1199,11 @@ struct int_const_s const INT_CONST[] = {
{"V_SKYMAP",V_SKYMAP},
{"V_LAVENDERMAP",V_LAVENDERMAP},
{"V_GOLDMAP",V_GOLDMAP},
{"V_TEAMAP",V_TEAMAP},
{"V_STEELMAP",V_STEELMAP},
{"V_AQUAMAP",V_AQUAMAP},
{"V_MAGENTAMAP",V_MAGENTAMAP},
{"V_PINKMAP",V_PINKMAP},
{"V_BROWNMAP",V_BROWNMAP},
{"V_PEACHMAP",V_PEACHMAP},
{"V_TANMAP",V_TANMAP},
{"V_TRANSLUCENT",V_TRANSLUCENT},
{"V_10TRANS",V_10TRANS},

View file

@ -217,6 +217,10 @@ extern char logfilename[1024];
#define MAXCOLORNAME 32
#define NUMCOLORFREESLOTS UINT16_MAX
// surely nobody's gonna change the palette a second time :Clueless:
#define FADECOLOR 0 // 120
#define ENCOREFADECOLOR 209 // 122
// Master Server compatibility ONLY
#define MSCOMPAT_MAXPLAYERS (32)
@ -240,7 +244,7 @@ typedef enum
MAXSKINCOLORS,
FIRSTRAINBOWCOLOR = SKINCOLOR_PINK,
FIRSTSUPERCOLOR = SKINCOLOR_SUPER1,
FIRSTSUPERCOLOR = SKINCOLOR_SUPERSILVER1,
NUMSUPERCOLORS = ((SKINCOLOR_FIRSTFREESLOT - FIRSTSUPERCOLOR)/5)
} skincolornum_t;

View file

@ -1371,7 +1371,7 @@ skippedghosttic:
g->mo->color = skin->supercolor;
}
else
g->mo->color = SKINCOLOR_SUPER1;
g->mo->color = SKINCOLOR_SUPERGOLD1;
g->mo->color += abs( ( (signed)( (unsigned)leveltime >> 1 ) % 9) - 4);
break;
case GHC_INVINCIBLE: // Mario invincibility (P_CheckInvincibilityTimer)
@ -2053,6 +2053,7 @@ void G_BeginRecording(void)
nameonly(( filename = va("%s", wadfiles[i]->filename) ));
WRITESTRINGN(demobuf.p, filename, MAX_WADPATH);
WRITEMEM(demobuf.p, wadfiles[i]->md5sum, 16);
WRITEUINT8(demobuf.p, wadfiles[i]->compatmode);
totalfiles++;
}
@ -2285,6 +2286,7 @@ static void G_LoadDemoExtraFiles(UINT8 **pp)
boolean toomany = false;
boolean alreadyloaded;
UINT8 i, j;
boolean compatmode;
totalfiles = READUINT8((*pp));
for (i = 0; i < totalfiles; ++i)
@ -2297,6 +2299,7 @@ static void G_LoadDemoExtraFiles(UINT8 **pp)
SKIPSTRING((*pp));
}
READMEM((*pp), md5sum, 16);
compatmode = READUINT8((*pp));
if (!toomany)
{
@ -2339,7 +2342,7 @@ static void G_LoadDemoExtraFiles(UINT8 **pp)
}
else
{
P_PartialAddWadFile(filename);
P_PartialAddWadFile(filename, compatmode ? WC_ON : WC_OFF);
}
}
}
@ -2385,6 +2388,7 @@ static UINT8 G_CheckDemoExtraFiles(UINT8 **pp, boolean quick)
SKIPSTRING((*pp));
}
READMEM((*pp), md5sum, 16);
(void)READUINT8((*pp)); // compatmode
if (!toomany)
{

View file

@ -3418,15 +3418,15 @@ UINT8 G_GetGametypeColor(INT16 gt)
{
if (modeattacking // == ATTACKING_TIME
|| gamestate == GS_TIMEATTACK)
return orangemap[120];
return orangemap[0];
if (gt == GT_BATTLE)
return redmap[120];
return redmap[0];
if (gt == GT_RACE)
return skymap[120];
return skymap[0];
return 247; // FALLBACK
return 255; // FALLBACK
}
/** Get the typeoflevel flag needed to indicate support of a gametype.

View file

@ -522,12 +522,18 @@ static void HWR_GenerateTexture(GLMapTexture_t *grtex, INT32 texnum, boolean noe
#endif
#ifdef WALLFLATS
if (texture->type == TEXTURETYPE_FLAT)
{
if (W_NeedPaletteRemap())
R_DoPaletteRemapFlat(pdata, lumplength);
realpatch = (softwarepatch_t *)Picture_Convert(PICFMT_FLAT, pdata, PICFMT_DOOMPATCH, 0, NULL, texture->width, texture->height, 0, 0, 0);
}
else
#endif
{
(void)lumplength;
dealloc = false;
if (W_NeedPaletteRemap())
R_DoPaletteRemapPatch(realpatch, lumplength);
}
HWR_DrawTexturePatchInCache(&grtex->mipmap, blockwidth, blockheight, texture, patch, realpatch);
@ -878,6 +884,11 @@ static void HWR_CacheFlat(GLMipmap_t *grMipmap, lumpnum_t flatlumpnum)
W_ReadLump(flatlumpnum, Z_Malloc(W_LumpLength(flatlumpnum),
PU_HWRCACHE, &grMipmap->data));
// palette remapping
// have to do this here since the lump isn't cached
if (wadfiles[WADFILENUM(flatlumpnum)]->compatmode)
R_DoPaletteRemapFlat(grMipmap->data, size);
flat = grMipmap->data;
for (steppy = 0; steppy < size; steppy++)
if (flat[steppy] != HWR_PATCHES_CHROMAKEY_COLORINDEX)

View file

@ -40,8 +40,8 @@ typedef unsigned char FBOOLEAN;
// ==========================================================================
// byte value for paletted graphics, which represent the transparent color
#define HWR_PATCHES_CHROMAKEY_COLORINDEX 247
//#define HWR_CHROMAKEY_EQUIVALENTCOLORINDEX 220
#define HWR_PATCHES_CHROMAKEY_COLORINDEX 255
//#define HWR_CHROMAKEY_EQUIVALENTCOLORINDEX 130
// the chroma key color shows on border sprites, set it to black
#define HWR_PATCHES_CHROMAKEY_COLORVALUE (0x00000000) //RGBA format as in grSstWinOpen()

View file

@ -793,7 +793,7 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
{
UINT16 chatcolor = skincolors[players[playernum].skincolor].chatcolor;
if (chatcolor > V_PEACHMAP)
if (chatcolor > V_TANMAP)
{
sprintf(color_prefix, "%c", '\x80');
}
@ -832,7 +832,7 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
{
UINT16 chatcolor = skincolors[players[playernum].skincolor].chatcolor;
if (chatcolor > V_PEACHMAP)
if (chatcolor > V_TANMAP)
{
sprintf(color_prefix, "%c", '\x80');
}

View file

@ -11,44 +11,39 @@ _(ARTICHOKE)
_(PIGEON)
_(SEPIA)
_(BEIGE)
_(WALNUT)
_(CARAMEL)
_(PEACH)
_(BROWN)
_(LEATHER)
_(SALMON)
_(PINK)
_(ROSE)
_(BRICK)
_(CINNAMON)
_(RUBY)
_(RASPBERRY)
_(CHERRY)
_(RED)
_(CRIMSON)
_(MAROON)
_(LEMONADE)
_(FLAME)
_(SCARLET)
_(KETCHUP)
_(DAWN)
_(SUNSET)
_(SUNSLAM)
_(CREAMSICLE)
_(ORANGE)
_(PUMPKIN)
_(ROSEWOOD)
_(BURGUNDY)
_(TANGERINE)
_(PEACH)
_(CARAMEL)
_(TAN)
_(CREAM)
_(GOLD)
_(ROYAL)
_(BRONZE)
_(COPPER)
_(QUARRY)
_(YELLOW)
_(MUSTARD)
_(CROCODILE)
_(BANANA)
_(OLIVE)
_(CROCODILE)
_(PERIDOT)
_(VOMIT)
_(GARDEN)
_(LIME)
@ -57,19 +52,19 @@ _(TEA)
_(PISTACHIO)
_(MOSS)
_(CAMOUFLAGE)
_(ROBOHOOD)
_(MINT)
_(GREEN)
_(PINETREE)
_(EMERALD)
_(TURTLE)
_(SWAMP)
_(DREAM)
_(PLAGUE)
_(EMERALD)
_(ALGAE)
_(CARIBBEAN)
_(AZURE)
_(AQUA)
_(AQUAMARINE)
_(TURQUOISE)
_(TEAL)
_(ROBIN)
_(CYAN)
_(JAWZ) // Oni's torment
_(CERULEAN)
@ -78,20 +73,23 @@ _(PLATINUM)
_(SLATE)
_(STEEL)
_(THUNDER)
_(NOVA)
_(RUST)
_(WRISTWATCH)
_(JET)
_(SAPPHIRE) // sweet mother, i cannot weave - slender aphrodite has overcome me with longing for a girl
_(ULTRAMARINE)
_(PERIWINKLE)
_(BLUE)
_(MIDNIGHT)
_(BLUEBERRY)
_(NOVA)
_(PASTEL)
_(MOONSLAM)
_(ULTRAVIOLET)
_(DUSK)
_(BUBBLEGUM)
_(THISTLE)
_(PURPLE)
_(PASTEL)
_(MOONSET)
_(DUSK)
_(VIOLET)
_(MAGENTA)
_(FUCHSIA)
_(TOXIC)
_(MAUVE)
@ -99,174 +97,70 @@ _(LAVENDER)
_(BYZANTIUM)
_(POMEGRANATE)
_(LILAC)
_(BONE) // vanilla colors - shoutouts to Sonic Team Jr.
_(CARBON)
_(INK)
_(GHOST)
_(MARBLE)
_(BLUEBELL)
_(CHOCOLATE)
_(TAN)
_(PEACHY)
_(QUAIL)
_(LANTERN)
_(APRICOT)
_(SANDY)
_(BANANA)
_(SUNFLOWER)
_(OLIVINE)
_(PERIDOT)
_(APPLE)
_(SEAFOAM)
_(FOREST)
_(TOPAZ)
_(FROST)
_(WAVE)
_(ICY)
_(PEACOCK)
_(VAPOR)
_(GEMSTONE)
_(NEON)
_(PLUM)
_(VIOLET)
_(MAGENTA)
_(THISTLE)
_(DIAMOND) // custom color expansion begins here
_(RAVEN)
_(MUD)
_(EARTHWORM)
_(YOGURT)
_(PEARL)
_(STRAWBERRY)
_(SODA)
_(BLOODCELL)
_(MAHOGANY)
_(FIERY)
_(SPICE)
_(KING)
_(HOTDOG)
_(CARNATION)
_(CANDY)
_(NEBULA)
_(STEAMPUNK)
_(AMBER)
_(CARROT)
_(CHEESE)
_(DUNE)
_(BRASS)
_(CITRINE)
_(LEMON)
_(CASKET)
_(KHAKI)
_(LIGHT)
_(PEPPERMINT)
_(LASER)
_(ASPARAGUS)
_(ARMY)
_(CROW)
_(CHARTEUSE)
_(SLIME)
_(LEAF)
_(JUNGLE)
_(EVERGREEN)
_(TROPIC)
_(IGUANA)
_(SPEARMINT)
_(PATINA)
_(LAKESIDE)
_(ELECTRIC)
_(TURQUOISE)
_(PEGASUS)
_(PLASMA)
_(COMET)
_(LIGHTNING)
_(VACATION)
_(ULTRAMARINE)
_(DEPTHS)
_(DIANNE)
_(EXOTIC)
_(SNOW)
_(MOON)
_(LUNAR)
_(ONYX)
_(LAPIS)
_(ORCA)
_(STORM)
_(MIDNIGHT)
_(COTTONCANDY) // this color was a pain to get right
_(CYBER) // this one too
_(AMETHYST)
_(IRIS)
_(GOTHIC)
_(GRAPE)
_(INDIGO)
_(SAKURA)
_(DISCO)
_(MULBERRY)
_(BOYSENBERRY)
_(MYSTIC)
_(WICKED)
_(BLOSSOM)
_(TAFFY)
// Super special awesome Super flashing colors!
// Super Sonic Yellow
_(SUPER1)
_(SUPER2)
_(SUPER3)
_(SUPER4)
_(SUPER5)
_(SUPERSILVER1)
_(SUPERSILVER2)
_(SUPERSILVER3)
_(SUPERSILVER4)
_(SUPERSILVER5)
// Super Tails Orange
_(TSUPER1)
_(TSUPER2)
_(TSUPER3)
_(TSUPER4)
_(TSUPER5)
_(SUPERRED1)
_(SUPERRED2)
_(SUPERRED3)
_(SUPERRED4)
_(SUPERRED5)
// Super Knuckles Red
_(KSUPER1)
_(KSUPER2)
_(KSUPER3)
_(KSUPER4)
_(KSUPER5)
_(SUPERORANGE1)
_(SUPERORANGE2)
_(SUPERORANGE3)
_(SUPERORANGE4)
_(SUPERORANGE5)
// Hyper Sonic Pink
_(PSUPER1)
_(PSUPER2)
_(PSUPER3)
_(PSUPER4)
_(PSUPER5)
_(SUPERGOLD1)
_(SUPERGOLD2)
_(SUPERGOLD3)
_(SUPERGOLD4)
_(SUPERGOLD5)
// Hyper Sonic Blue
_(BSUPER1)
_(BSUPER2)
_(BSUPER3)
_(BSUPER4)
_(BSUPER5)
_(SUPERPERIDOT1)
_(SUPERPERIDOT2)
_(SUPERPERIDOT3)
_(SUPERPERIDOT4)
_(SUPERPERIDOT5)
// Aqua Super
_(ASUPER1)
_(ASUPER2)
_(ASUPER3)
_(ASUPER4)
_(ASUPER5)
_(SUPERSKY1)
_(SUPERSKY2)
_(SUPERSKY3)
_(SUPERSKY4)
_(SUPERSKY5)
// Hyper Sonic Green
_(GSUPER1)
_(GSUPER2)
_(GSUPER3)
_(GSUPER4)
_(GSUPER5)
_(SUPERPURPLE1)
_(SUPERPURPLE2)
_(SUPERPURPLE3)
_(SUPERPURPLE4)
_(SUPERPURPLE5)
// Hyper Sonic White
_(WSUPER1)
_(WSUPER2)
_(WSUPER3)
_(WSUPER4)
_(WSUPER5)
_(SUPERRUST1)
_(SUPERRUST2)
_(SUPERRUST3)
_(SUPERRUST4)
_(SUPERRUST5)
// Creamy Super (Shadow?)
_(CSUPER1)
_(CSUPER2)
_(CSUPER3)
_(CSUPER4)
_(CSUPER5)
_(SUPERTAN1)
_(SUPERTAN2)
_(SUPERTAN3)
_(SUPERTAN4)
_(SUPERTAN5)
_(CHAOSEMERALD1)
_(CHAOSEMERALD2)
_(CHAOSEMERALD3)
_(CHAOSEMERALD4)
_(CHAOSEMERALD5)
_(CHAOSEMERALD6)
_(CHAOSEMERALD7)
_(INVINCFLASH)

View file

@ -121,7 +121,7 @@ void K_GenerateKartColormap(UINT8 *dest_colormap, INT32 skinnum, skincolornum_t
if (skinnum == TC_BOSS)
dest_colormap[31] = 0;
else if (skinnum == TC_METALSONIC)
dest_colormap[239] = 0;
dest_colormap[143] = 0;
return;
}

View file

@ -20,7 +20,7 @@ extern "C" {
#endif
#define SKIN_RAMP_LENGTH 16
#define DEFAULT_STARTTRANSCOLOR 160
#define DEFAULT_STARTTRANSCOLOR 96
#define NUM_PALETTE_ENTRIES 256
/*--------------------------------------------------

View file

@ -2297,7 +2297,26 @@ void K_SpawnNormalSpeedLines(player_t *player)
P_SetScale(fast, 3*fast->scale/2);
}
if (player->tripwireLeniency)
if (player->eggmanexplode)
{
// Make it red when you have the eggman speed boost
fast->color = SKINCOLOR_RED;
fast->colorized = true;
}
else if (player->invincibilitytimer)
{
const tic_t defaultTime = itemtime+(2*TICRATE);
if (player->invincibilitytimer > defaultTime)
{
fast->color = player->mo->color;
}
else
{
fast->color = SKINCOLOR_INVINCFLASH;
}
fast->colorized = true;
}
else if (player->tripwireLeniency)
{
// Make it pink+blue+big when you can go through tripwire
fast->color = (leveltime & 1) ? SKINCOLOR_LILAC : SKINCOLOR_JAWZ;

View file

@ -65,6 +65,9 @@ static int nextid;
// After a hook errors once, don't print the error again.
static UINT8 * hooksErrored;
// compat mode for each hook
static UINT8 * hookCompat;
static int errorRef;
static boolean mobj_hook_available(int hook_type, mobjtype_t mobj_type)
@ -187,10 +190,17 @@ static void add_hook_ref(lua_State *L, int idx)
BIT_ARRAY_SIZE (nextid + 1) * sizeof *hooksErrored,
PU_STATIC, &hooksErrored);
hooksErrored[nextid >> 3] = 0;
Z_Realloc(hookCompat,
BIT_ARRAY_SIZE (nextid + 1) * sizeof *hookCompat,
PU_STATIC, &hookCompat);
hookCompat[nextid >> 3] = 0;
}
Z_Realloc(hookRefs, (nextid + 1) * sizeof *hookRefs, PU_STATIC, &hookRefs);
if (lua_compatmode)
set_bit_array(hookCompat, nextid);
// set the hook function in the registry.
lua_pushvalue(L, idx);
hookRefs[nextid++] = luaL_ref(L, LUA_REGISTRYINDEX);
@ -388,6 +398,7 @@ static void init_hook_call
static void get_hook(Hook_State *hook, const int *ids, int n)
{
hook->id = ids[n];
lua_compatmode = in_bit_array(hookCompat, hook->id);
lua_getref(gL, hookRefs[hook->id]);
}
@ -396,6 +407,7 @@ static void get_hook_from_table(Hook_State *hook, int n)
lua_rawgeti(gL, -1, n);
hook->id = lua_tonumber(gL, -1);
lua_pop(gL, 1);
lua_compatmode = in_bit_array(hookCompat, hook->id);
lua_getref(gL, hookRefs[hook->id]);
}

View file

@ -838,6 +838,9 @@ static int libd_drawFill(lua_State *L)
HUDONLY
if (lua_compatmode)
c = (c & ~0xff) | R_GetPaletteRemap(c & 0xff);
lua_getfield(L, LUA_REGISTRYINDEX, "HUD_DRAW_LIST");
list = (huddrawlist_h) lua_touserdata(L, -1);
lua_pop(L, 1);
@ -864,6 +867,9 @@ static int libd_fadeScreen(lua_State *L)
if (strength > maxstrength)
return luaL_error(L, "%s fade strength %d out of range (0 - %d)", ((color & 0xFF00) ? "COLORMAP" : "TRANSMAP"), strength, maxstrength);
if (lua_compatmode && !(color & 0xFF00))
color = R_GetPaletteRemap(color);
lua_getfield(L, LUA_REGISTRYINDEX, "HUD_DRAW_LIST");
list = (huddrawlist_h) lua_touserdata(L, -1);
lua_pop(L, 1);

View file

@ -150,6 +150,8 @@ int LUA_Call(lua_State *L, int nargs, int nresults, int errorhandlerindex)
return err;
}
boolean lua_compatmode = false;
// Moved here from lib_getenum.
int LUA_PushGlobals(lua_State *L, const char *word)
{
@ -408,6 +410,9 @@ int LUA_PushGlobals(lua_State *L, const char *word)
} else if (fastcmp(word, "gamestate")) {
lua_pushinteger(L, gamestate);
return 1;
} else if (fastcmp(word, "compatmode")) {
lua_pushboolean(L, lua_compatmode);
return 1;
}
return 0;
@ -640,6 +645,8 @@ void LUA_LoadLump(UINT16 wad, UINT16 lump, boolean noresults)
name[len] = '\0';
}
lua_compatmode = wadfiles[wad]->compatmode;
LUA_LoadFile(&f, name, noresults); // actually load file!
// Okay, we've modified the game beyond the point of no return.

View file

@ -48,6 +48,7 @@ void LUA_ClearExtVars(void);
void LUA_ClearState(void);
extern INT32 lua_lumploading; // is LUA_LoadLump being called?
extern boolean lua_compatmode; // compatmode enabled for this lump/hook?
int LUA_GetErrorMessage(lua_State *L);
int LUA_Call(lua_State *L, int nargs, int nresults, int errorhandlerindex);

View file

@ -3755,7 +3755,7 @@ static void M_DrawSlider(INT32 x, INT32 y, const consvar_t *cv, boolean ontop)
void M_DrawTextBox(INT32 x, INT32 y, INT32 width, INT32 boxlines)
{
// Solid color textbox.
V_DrawFill(x+5, y+5, width*8+6, boxlines*8+6, 239);
V_DrawFill(x+5, y+5, width*8+6, boxlines*8+6, 159);
//V_DrawFill(x+8, y+8, width*8, boxlines*8, 31);
/*
patch_t *p;
@ -4916,10 +4916,10 @@ static void M_DrawTemperature(INT32 x, fixed_t t)
t = (FixedMul(h<<FRACBITS, t)>>FRACBITS);
// border
V_DrawFill(x - 1, vpadding, 1, h, 120);
V_DrawFill(x + width, vpadding, 1, h, 120);
V_DrawFill(x - 1, vpadding-1, width+2, 1, 120);
V_DrawFill(x - 1, vpadding+h, width+2, 1, 120);
V_DrawFill(x - 1, vpadding, 1, h, 0);
V_DrawFill(x + width, vpadding, 1, h, 0);
V_DrawFill(x - 1, vpadding-1, width+2, 1, 0);
V_DrawFill(x - 1, vpadding+h, width+2, 1, 0);
// bar itself
y = h;
@ -5074,14 +5074,14 @@ static void M_DrawAddons(void)
x = currentMenu->x;
y = currentMenu->y + 1;
hilicol = V_GetStringColormap(highlightflags)[120];
hilicol = V_GetStringColormap(highlightflags)[0];
V_DrawString(x-21, (y - 16) + (lsheadingheight - 12), highlightflags|V_ALLOWLOWERCASE, M_AddonsHeaderPath());
V_DrawFill(x-21, (y - 16) + (lsheadingheight - 3), MAXSTRINGLENGTH*8+6, 1, hilicol);
V_DrawFill(x-21, (y - 16) + (lsheadingheight - 2), MAXSTRINGLENGTH*8+6, 1, 30);
m = (BASEVIDHEIGHT - currentMenu->y + 2) - (y - 1);
V_DrawFill(x - 21, y - 1, MAXSTRINGLENGTH*8+6, m, 239);
V_DrawFill(x - 21, y - 1, MAXSTRINGLENGTH*8+6, m, 159);
// scrollbar!
if (sizedirmenu <= (2*numaddonsshown + 1))
@ -5809,8 +5809,8 @@ static void M_DrawReplayHut(void)
y = sizedirmenu*10 + currentMenu->menuitems[replaylistitem].alphaKey + 30;
if (y > SCALEDVIEWHEIGHT-80)
{
V_DrawFill(BASEVIDWIDTH-4, 75, 4, SCALEDVIEWHEIGHT-80, V_SNAPTOTOP|V_SNAPTORIGHT|239);
V_DrawFill(BASEVIDWIDTH-3, 76 + (SCALEDVIEWHEIGHT-80) * replayhutmenuy / y, 2, (((SCALEDVIEWHEIGHT-80) * (SCALEDVIEWHEIGHT-80))-1) / y - 1, V_SNAPTOTOP|V_SNAPTORIGHT|229);
V_DrawFill(BASEVIDWIDTH-4, 75, 4, SCALEDVIEWHEIGHT-80, V_SNAPTOTOP|V_SNAPTORIGHT|159);
V_DrawFill(BASEVIDWIDTH-3, 76 + (SCALEDVIEWHEIGHT-80) * replayhutmenuy / y, 2, (((SCALEDVIEWHEIGHT-80) * (SCALEDVIEWHEIGHT-80))-1) / y - 1, V_SNAPTOTOP|V_SNAPTORIGHT|149);
}
// Draw the cursor
@ -5819,7 +5819,7 @@ static void M_DrawReplayHut(void)
V_DrawString(currentMenu->x, cursory, V_SNAPTOTOP|V_SNAPTOLEFT|highlightflags, currentMenu->menuitems[itemOn].text);
// Now draw some replay info!
V_DrawFill(10, 10, 300, 60, V_SNAPTOTOP|239);
V_DrawFill(10, 10, 300, 60, V_SNAPTOTOP|159);
if (itemOn == replaylistitem)
{
@ -5905,7 +5905,7 @@ static void M_DrawReplayStartMenu(void)
}
}
V_DrawFill(10, 10, 300, 60, V_SNAPTOTOP|239);
V_DrawFill(10, 10, 300, 60, V_SNAPTOTOP|159);
DrawReplayHutReplayInfo();
V_DrawString(10, 72, V_SNAPTOTOP|highlightflags|V_ALLOWLOWERCASE, demolist[dir_on[menudepthleft]].title);
@ -7949,7 +7949,7 @@ void M_DrawTimeAttackMenu(void)
time = mainrecords[cv_nextmap.value-1]->time;
}
V_DrawFill((BASEVIDWIDTH - dupadjust)>>1, 78, dupadjust, 36, 239);
V_DrawFill((BASEVIDWIDTH - dupadjust)>>1, 78, dupadjust, 36, 159);
if (levellistmode != LLM_ITEMBREAKER)
{
@ -9140,7 +9140,7 @@ Update the maxplayers label...
#ifndef NONET
y += MP_MainMenu[8].alphaKey;
V_DrawFill(x+5, y+4+5, /*16*8 + 6,*/ BASEVIDWIDTH - 2*(x+5), 8+6, 239);
V_DrawFill(x+5, y+4+5, /*16*8 + 6,*/ BASEVIDWIDTH - 2*(x+5), 8+6, 159);
// draw name string
V_DrawString(x+8,y+12, V_ALLOWLOWERCASE, setupm_ip);
@ -9640,7 +9640,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
flags |= V_FLIP; // This sprite is left/right flipped!
// draw box around guy
V_DrawFill(mx + 43 - (charw/2), my+65, charw, 84, 239);
V_DrawFill(mx + 43 - (charw/2), my+65, charw, 84, 159);
// draw player sprite
if (setupm_fakecolor->color) // inverse should never happen

View file

@ -2534,16 +2534,16 @@ void A_Boss1Laser(mobj_t *actor)
tic_t dur;
static const UINT8 LASERCOLORS[] =
{
SKINCOLOR_KSUPER3,
SKINCOLOR_KSUPER4,
SKINCOLOR_KSUPER5,
SKINCOLOR_SUPERRED3,
SKINCOLOR_SUPERRED4,
SKINCOLOR_SUPERRED5,
SKINCOLOR_KETCHUP,
SKINCOLOR_RED,
SKINCOLOR_RED,
SKINCOLOR_KETCHUP,
SKINCOLOR_KSUPER5,
SKINCOLOR_KSUPER4,
SKINCOLOR_KSUPER3,
SKINCOLOR_SUPERRED5,
SKINCOLOR_SUPERRED4,
SKINCOLOR_SUPERRED3,
};
if (LUA_CallAction(A_BOSS1LASER, actor))
@ -10232,8 +10232,8 @@ void P_InternalFlickySetColor(mobj_t *actor, UINT8 color)
SKINCOLOR_BEIGE,
SKINCOLOR_LAVENDER,
SKINCOLOR_RUBY,
SKINCOLOR_ORANGE,
SKINCOLOR_SUNSET,
SKINCOLOR_BLOSSOM,
SKINCOLOR_SUNSLAM,
SKINCOLOR_ORANGE,
SKINCOLOR_YELLOW,
};
@ -12706,7 +12706,7 @@ void A_RolloutSpawn(mobj_t *actor)
if (actor->target->flags2 & MF2_AMBUSH)
{
actor->target->color = SKINCOLOR_BROWN;
actor->target->color = SKINCOLOR_SUPERRUST3;
actor->target->colorized = true;
}
}

View file

@ -9418,7 +9418,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
mobj->flags2 |= MF2_INVERTAIMABLE;
break;
case MT_FLICKY_08:
mobj->color = (P_RandomChance(FRACUNIT/2) ? SKINCOLOR_RED : SKINCOLOR_ULTRAMARINE);
mobj->color = (P_RandomChance(FRACUNIT/2) ? SKINCOLOR_RED : SKINCOLOR_AQUAMARINE);
break;
case MT_BALLOON:
{

View file

@ -8162,13 +8162,13 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate)
S_StartSound(NULL, sfx_ruby1);
F_WipeStartScreen();
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 122);
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, ENCOREFADECOLOR);
F_WipeEndScreen();
F_RunWipe(wipedefs[wipe_encore_towhite], false);
F_WipeStartScreen();
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 120);
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, FADECOLOR);
F_WipeEndScreen();
F_RunWipe(wipedefs[wipe_level_final], false);
@ -8247,7 +8247,7 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate)
}
}
levelfadecol = (encoremode && !ranspecialwipe ? 122 : 120);
levelfadecol = (encoremode && !ranspecialwipe ? ENCOREFADECOLOR : FADECOLOR);
// Let's fade to white here
// But only if we didn't do the encore startup wipe
@ -8583,7 +8583,7 @@ boolean P_RunSOC(const char *socfilename)
lumpnum_t lump;
if (strstr(socfilename, ".soc") != NULL)
return P_AddWadFile(socfilename);
return P_AddWadFile(socfilename, WC_AUTO);
lump = W_CheckNumForName(socfilename);
if (lump == LUMPERROR)
@ -8665,11 +8665,11 @@ static lumpinfo_t* FindFolder(const char *folName, UINT16 *start, UINT16 *end, l
// Add a wadfile to the active wad files,
// replace sounds, musics, patches, textures, sprites and maps
//
boolean P_AddWadFile(const char *wadfilename)
boolean P_AddWadFile(const char *wadfilename, wadcompat_t compat)
{
UINT16 wadnum;
if ((wadnum = P_PartialAddWadFile(wadfilename)) == UINT16_MAX)
if ((wadnum = P_PartialAddWadFile(wadfilename, compat)) == UINT16_MAX)
return false;
P_MultiSetupWadFiles(true);
@ -8680,7 +8680,7 @@ boolean P_AddWadFile(const char *wadfilename)
// Add a WAD file and do the per-WAD setup stages.
// Call P_MultiSetupWadFiles as soon as possible after any number of these.
//
UINT16 P_PartialAddWadFile(const char *wadfilename)
UINT16 P_PartialAddWadFile(const char *wadfilename, wadcompat_t compat)
{
size_t i, j, sreplaces = 0, mreplaces = 0, digmreplaces = 0;
UINT16 numlumps, wadnum;
@ -8702,7 +8702,7 @@ UINT16 P_PartialAddWadFile(const char *wadfilename)
// UINT16 mapPos, mapNum = 0;
// Init file.
if ((numlumps = W_InitFile(wadfilename, false, false)) == INT16_MAX)
if ((numlumps = W_InitFile(wadfilename, false, false, compat)) == INT16_MAX)
{
refreshdirmenu |= REFRESHDIR_NOTLOADED;
return UINT16_MAX;

View file

@ -18,6 +18,7 @@
#include "doomstat.h"
#include "r_defs.h"
#include "k_terrain.h"
#include "w_wad.h"
#ifdef __cplusplus
extern "C" {
@ -110,12 +111,12 @@ void P_PostLoadLevel(void);
#ifdef HWRENDER
void HWR_LoadLevel(void);
#endif
boolean P_AddWadFile(const char *wadfilename);
boolean P_AddWadFile(const char *wadfilename, wadcompat_t compat);
// WARNING: The following functions should be grouped as follows:
// any amount of PartialAdds followed by MultiSetups until returned true,
// as soon as possible.
UINT16 P_PartialAddWadFile(const char *wadfilename);
UINT16 P_PartialAddWadFile(const char *wadfilename, wadcompat_t compat);
// Run a single stage of multisetup, or all of them if fullsetup set.
// fullsetup true: run everything
// otherwise

View file

@ -292,6 +292,7 @@ void R_ReInitColormaps(UINT16 num, lumpnum_t newencoremap)
char colormap[9] = "COLORMAP";
lumpnum_t lump;
const lumpnum_t basecolormaplump = W_GetNumForName(colormap);
boolean remap = false;
if (num > 0 && num <= 10000)
snprintf(colormap, 8, "CLM%04u", num-1);
@ -301,6 +302,7 @@ void R_ReInitColormaps(UINT16 num, lumpnum_t newencoremap)
lump = basecolormaplump;
else
{
remap = wadfiles[WADFILENUM(lump)]->compatmode;
if (W_LumpLength(lump) != W_LumpLength(basecolormaplump))
{
CONS_Alert(CONS_WARNING, "%s lump size does not match COLORMAP, results may be unexpected.\n", colormap);
@ -309,6 +311,19 @@ void R_ReInitColormaps(UINT16 num, lumpnum_t newencoremap)
W_ReadLumpHeader(lump, colormaps, W_LumpLength(basecolormaplump), 0U);
if (remap)
{
lighttable_t *copy = malloc(W_LumpLength(basecolormaplump));
memcpy(copy, colormaps, W_LumpLength(basecolormaplump));
for (int p = 0; p < LIGHTLEVELS; p++)
{
for (int i = 0; i < 256; i++)
// 2.2 colormap index to 2.1, then 2.1 palette color to 2.2
colormaps[p*256 + i] = R_GetPaletteRemap(copy[p*256 + R_InvPaletteRemap(i)]);
}
free(copy);
}
// Encore mode.
if (newencoremap != LUMPERROR)
{
@ -320,6 +335,16 @@ void R_ReInitColormaps(UINT16 num, lumpnum_t newencoremap)
colormap_p = colormap_p2 = colormaps;
colormap_p += COLORMAP_REMAPOFFSET;
remap = wadfiles[WADFILENUM(newencoremap)]->compatmode;
if (remap)
{
UINT8 *copy = malloc(256);
memcpy(copy, encoremap, 256);
for (i = 0; i < 256; i++)
encoremap[i] = R_GetPaletteRemap(copy[R_InvPaletteRemap(i)]);
free(copy);
}
for (p = 0; p < LIGHTLEVELS; p++)
{
for (i = 0; i < 256; i++)

View file

@ -108,6 +108,7 @@ UINT8 r8_flatcolor;
UINT8 *transtables; // translucency tables
UINT8 *blendtables[NUMBLENDMAPS];
UINT8 *palremap, *invremap;
/** \brief R_DrawTransColumn uses this
*/
@ -149,10 +150,6 @@ float zeroheight;
#define INTERMISSION_TT_CACHE_INDEX (MAXSKINS + 8)
#define TT_CACHE_SIZE (MAXSKINS + 9)
#define SKIN_RAMP_LENGTH 16
#define DEFAULT_STARTTRANSCOLOR 160
#define NUM_PALETTE_ENTRIES 256
static UINT8 **translationtablecache[TT_CACHE_SIZE] = {NULL};
UINT8 skincolor_modified[MAXSKINCOLORS];
@ -344,6 +341,24 @@ UINT8 *R_GetBlendTable(int style, INT32 alphalevel)
return transtables + (ClipTransLevel(alphalevel) << FF_TRANSSHIFT);
}
void R_InitPaletteRemap(void)
{
palremap = static_cast<UINT8 *>(Z_Malloc(256, PU_STATIC, NULL));
invremap = static_cast<UINT8 *>(Z_Malloc(256, PU_STATIC, NULL));
W_ReadLump(W_GetNumForName("PALREMAP"), palremap);
W_ReadLump(W_GetNumForName("INVREMAP"), invremap);
}
UINT8 R_GetPaletteRemap(UINT8 color)
{
return palremap[color];
}
UINT8 R_InvPaletteRemap(UINT8 color)
{
return invremap[color];
}
/** \brief Retrieves a translation colormap from the cache.
\param skinnum number of skin, TC_DEFAULT or TC_BOSS

View file

@ -167,11 +167,16 @@ enum
extern UINT8 *blendtables[NUMBLENDMAPS];
extern UINT8 *palremap, *invremap;
void R_InitTranslucencyTables(void);
void R_GenerateBlendTables(void);
void R_InitPaletteRemap(void);
UINT8 *R_GetTranslucencyTable(INT32 alphalevel);
UINT8 *R_GetBlendTable(int style, INT32 alphalevel);
UINT8 R_GetPaletteRemap(UINT8 color);
UINT8 R_InvPaletteRemap(UINT8 color);
// Color ramp modification should force a recache
extern UINT8 skincolor_modified[];
@ -188,7 +193,7 @@ void R_FillBackScreen(void);
void R_DrawViewBorder(void);
#endif
#define TRANSPARENTPIXEL 247
#define TRANSPARENTPIXEL 255
#define BRIGHTPIXEL 0
// -----------------

View file

@ -109,9 +109,9 @@ static void Sk_SetDefaultValue(skin_t *skin)
skin->flags = 0;
strcpy(skin->realname, "Someone");
skin->starttranscolor = 160;
skin->starttranscolor = 96;
skin->prefcolor = SKINCOLOR_GREEN;
skin->supercolor = SKINCOLOR_SUPER1;
skin->supercolor = SKINCOLOR_SUPERGOLD1;
skin->prefoppositecolor = 0; // use tables
skin->kartspeed = 5;
@ -459,7 +459,7 @@ static boolean R_ProcessPatchableFields(skin_t *skin, char *stoken, char *value)
else if (!stricmp(stoken, "supercolor"))
{
UINT16 color = R_GetSuperColorByName(value);
skin->supercolor = (color ? color : SKINCOLOR_SUPER1);
skin->supercolor = (color ? color : SKINCOLOR_SUPERGOLD1);
}
#define GETFLOAT(field) else if (!stricmp(stoken, #field)) skin->field = FLOAT_TO_FIXED(atof(value));

View file

@ -295,6 +295,28 @@ static boolean R_CheckTextureLumpLength(texture_t *texture, size_t patch)
return true;
}
void R_DoPaletteRemapPatch(softwarepatch_t *patch, size_t size)
{
(void)size;
UINT32 *columns = patch->columnofs;
for (INT16 i = 0; i < patch->width; i++)
{
UINT8 *p = (UINT8 *)patch + columns[i];
while (*p++ != 0xff) // topdelta
{
int length = *p++;
for (length += 2; length--; p++)
*p = R_GetPaletteRemap(*p);
}
}
}
void R_DoPaletteRemapFlat(UINT8 *data, size_t size)
{
for (size_t i = 0; i < size; i++, data++)
*data = R_GetPaletteRemap(*data);
}
//
// R_GenerateTexture
//
@ -363,6 +385,9 @@ UINT8 *R_GenerateTexture(size_t texnum)
goto multipatch;
#endif
if (W_NeedPaletteRemap())
R_DoPaletteRemapPatch(realpatch, lumplength);
// Check the patch for holes.
if (texture->width > SHORT(realpatch->width) || texture->height > SHORT(realpatch->height))
holey = true;
@ -458,12 +483,18 @@ UINT8 *R_GenerateTexture(size_t texnum)
#endif
#ifdef WALLFLATS
if (texture->type == TEXTURETYPE_FLAT)
{
if (W_NeedPaletteRemap())
R_DoPaletteRemapFlat(pdata, lumplength);
realpatch = (softwarepatch_t *)Picture_Convert(PICFMT_FLAT, pdata, PICFMT_DOOMPATCH, 0, NULL, texture->width, texture->height, 0, 0, 0);
}
else
#endif
{
(void)lumplength;
dealloc = false;
if (W_NeedPaletteRemap())
R_DoPaletteRemapPatch(realpatch, lumplength);
}
x1 = patch->originx;
@ -893,7 +924,10 @@ UINT8 *R_GetBrightmapColumn(fixed_t tex, INT32 col)
void *R_GetFlat(lumpnum_t flatlumpnum)
{
return W_CacheLumpNum(flatlumpnum, PU_LEVEL);
void *flat = W_CacheLumpNum(flatlumpnum, PU_LEVEL);
if (W_NeedPaletteRemap())
R_DoPaletteRemapFlat(flat, W_LumpLength(flatlumpnum));
return flat;
}
//

View file

@ -94,6 +94,8 @@ boolean R_TextureHasBrightmap(INT32 texnum);
boolean R_TextureCanRemap(INT32 texnum);
void R_CheckTextureCache(INT32 tex);
void R_ClearTextureNumCache(boolean btell);
void R_DoPaletteRemapPatch(softwarepatch_t *patch, size_t size);
void R_DoPaletteRemapFlat(UINT8 *data, size_t size);
// Retrieve texture data.
void *R_GetLevelFlat(drawspandata_t* ds, levelflat_t *levelflat);

View file

@ -895,9 +895,9 @@ void ST_Drawer(void)
if (timeinmap < 15)
{
if (timeinmap <= 5)
V_DrawFill(0,0,BASEVIDWIDTH,BASEVIDHEIGHT,120); // Pure white on first few frames, to hide SRB2's awful level load artifacts
V_DrawFill(0,0,BASEVIDWIDTH,BASEVIDHEIGHT,FADECOLOR); // Pure white on first few frames, to hide SRB2's awful level load artifacts
else
V_DrawFadeScreen(120, 15-timeinmap); // Then gradually fade out from there
V_DrawFadeScreen(FADECOLOR, 15-timeinmap); // Then gradually fade out from there
}
if (stagetitle)

View file

@ -17,7 +17,7 @@
[BITS 32]
%define FRACBITS 16
%define TRANSPARENTPIXEL 247
%define TRANSPARENTPIXEL 255
%ifdef LINUX
%macro cextern 1

View file

@ -18,7 +18,7 @@
[BITS 32]
%define FRACBITS 16
%define TRANSPARENTPIXEL 247
%define TRANSPARENTPIXEL 255
%ifdef LINUX
%macro cextern 1

View file

@ -312,6 +312,9 @@ UINT32 V_GammaCorrect(UINT32 input, double power)
static void LoadPalette(const char *lumpname)
{
lumpnum_t lumpnum = W_GetNumForName(lumpname);
boolean remap = wadfiles[WADFILENUM(lumpnum)]->compatmode;
if (remap) // if we're remapping, start with PLAYPAL as a base
lumpnum = W_GetNumForName("PLAYPAL");
size_t i, palsize = W_LumpLength(lumpnum)/3;
UINT8 *pal;
@ -329,26 +332,51 @@ static void LoadPalette(const char *lumpname)
pLocalPalette = pMasterPalette;
pGammaCorrectedPalette = Z_Malloc(sizeof (*pGammaCorrectedPalette)*palsize, PU_STATIC, NULL);
// load the new palette (or PLAYPAL if remapping)
pal = W_CacheLumpNum(lumpnum, PU_CACHE);
for (i = 0; i < palsize; i++)
{
RGBA_t pGCP;
pMasterPalette[i].s.red = *pal++;
pMasterPalette[i].s.green = *pal++;
pMasterPalette[i].s.blue = *pal++;
pMasterPalette[i].s.alpha = 0xFF;
}
RGBA_t *target = NULL;
if (remap)
{
// get the target palette we want
lumpnum = W_GetNumForName(lumpname);
pal = W_CacheLumpNum(lumpnum, PU_CACHE);
palsize = W_LumpLength(lumpnum)/3;
target = malloc(sizeof (*target)*palsize);
for (i = 0; i < palsize; i++)
{
target[i].s.red = *pal++;
target[i].s.green = *pal++;
target[i].s.blue = *pal++;
target[i].s.alpha = 0xFF;
}
}
for (i = 0; i < palsize; i++)
{
if (remap) // now map the target palette (2.1) to master palette (2.2)
pMasterPalette[i].rgba = target[R_InvPaletteRemap(i)].rgba;
pGammaCorrectedPalette[i].rgba = V_GammaDecode(pMasterPalette[i].rgba);
if (!Cubeapply)
continue;
// Short hand this so its easier to type
pGCP = pGammaCorrectedPalette[i];
RGBA_t pGCP = pGammaCorrectedPalette[i];
V_CubeApply(&pGCP.s.red,&pGCP.s.green,&pGCP.s.blue);
pLocalPalette[i].rgba = V_GammaEncode(pGammaCorrectedPalette[i].rgba);
}
if (remap)
free(target);
}
void V_CubeApply(UINT8 *red, UINT8 *green, UINT8 *blue)

View file

@ -119,11 +119,11 @@ void V_CubeApply(UINT8 *red, UINT8 *green, UINT8 *blue);
#define V_SKYMAP 0x00008000
#define V_LAVENDERMAP 0x00009000
#define V_GOLDMAP 0x0000A000
#define V_TEAMAP 0x0000B000
#define V_STEELMAP 0x0000C000
#define V_AQUAMAP 0x0000B000
#define V_MAGENTAMAP 0x0000C000
#define V_PINKMAP 0x0000D000
#define V_BROWNMAP 0x0000E000
#define V_PEACHMAP 0x0000F000
#define V_TANMAP 0x0000F000
// use bits 17-20 for alpha transparency
#define V_ALPHASHIFT 16

View file

@ -291,6 +291,33 @@ static inline void W_LoadDehackedLumps(UINT16 wadnum, boolean mainfile)
#endif
}
static inline boolean CheckCompatFilename(char *filename)
{
// check for a K prefix
char *basename = strrchr(filename, *PATHSEP);
return toupper(basename ? basename[1] : filename[0]) == 'K';
}
// try to figure out if a PK3 file needs compatmode enabled (palette remap)
static inline boolean CheckCompatZip(UINT16 wadnum)
{
if (CheckCompatFilename(wadfiles[wadnum]->filename))
return true;
// assume RR/2.2 for PK3s so basegame assets work
return false;
}
// ditto, but for WADs
static inline boolean CheckCompatWad(UINT16 wadnum)
{
if (CheckCompatFilename(wadfiles[wadnum]->filename))
return true;
// assume Kart/2.1 for WADs so basegame assets work
return true;
}
/** Compute MD5 message digest for bytes read from STREAM of this filname.
*
* The resulting message digest number will be written into the 16 bytes
@ -712,7 +739,7 @@ static UINT16 W_InitFileError (const char *filename, boolean exitworthy)
//
// Can now load dehacked files (.soc)
//
UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup)
UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup, wadcompat_t compat)
{
FILE *handle;
lumpinfo_t *lumpinfo = NULL;
@ -852,6 +879,21 @@ UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup)
}
#endif // HWRENDER
// check if compatmode is needed
if (compat != WC_AUTO)
wadfile->compatmode = compat == WC_ON ? true : false;
else switch (wadfile->type)
{
case RET_WAD:
wadfile->compatmode = CheckCompatWad(numwadfiles - 1);
break;
case RET_PK3:
wadfile->compatmode = CheckCompatZip(numwadfiles - 1);
break;
default:
break;
}
// TODO: HACK ALERT - Load Lua & SOC stuff right here. I feel like this should be out of this place, but... Let's stick with this for now.
switch (wadfile->type)
{
@ -901,7 +943,7 @@ INT32 W_InitMultipleFiles(char **filenames, boolean addons)
G_SetGameModified(true, false);
//CONS_Debug(DBG_SETUP, "Loading %s\n", *filenames);
rc = W_InitFile(*filenames, !addons, true);
rc = W_InitFile(*filenames, !addons, true, WC_AUTO);
if (rc == INT16_MAX)
CONS_Printf(M_GetText("Errors occurred while loading %s; not added.\n"), *filenames);
overallrc &= (rc != INT16_MAX) ? 1 : 0;
@ -1445,6 +1487,18 @@ void zerr(int ret)
}
#endif
// only do palette swapping ONCE, when caching the whole patch
// dumb hack but it works!
static boolean dopalswap = false;
// returns true if the most recently loaded lump is freshly cached, AND comes from a compatmode file
boolean W_NeedPaletteRemap(void)
{
boolean r = dopalswap;
dopalswap = false;
return r;
}
/** Reads bytes from the head of a lump.
* Note: If the lump is compressed, the whole thing has to be read anyway.
*
@ -1633,11 +1687,15 @@ void *W_CacheLumpNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
lumpcache = wadfiles[wad]->lumpcache;
if (!lumpcache[lump])
{
dopalswap = wadfiles[wad]->compatmode;
void *ptr = Z_Malloc(W_LumpLengthPwad(wad, lump), tag, &lumpcache[lump]);
W_ReadLumpHeaderPwad(wad, lump, ptr, 0, 0); // read the lump in full
}
else
{
dopalswap = false;
Z_ChangeTag(lumpcache[lump], tag);
}
return lumpcache[lump];
}
@ -1779,6 +1837,10 @@ void *W_CacheSoftwarePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
ptr = Picture_PNGConvert((UINT8 *)lumpdata, PICFMT_DOOMPATCH, NULL, NULL, NULL, NULL, len, &len, 0);
#endif
// we already know this is a patch, do palette remapping here
if (wadfiles[wad]->compatmode)
R_DoPaletteRemapPatch(ptr, wadfiles[wad]->lumpinfo[lump].size);
dest = Z_Calloc(sizeof(patch_t), tag, &lumpcache[lump]);
Patch_Create(ptr, len, dest);

View file

@ -128,8 +128,16 @@ struct wadfile_t
UINT8 md5sum[16];
boolean important; // also network - !W_VerifyNMUSlumps
boolean compatmode;
};
typedef enum wadcompat
{
WC_AUTO, // haha WC
WC_ON,
WC_OFF,
} wadcompat_t;
#define WADFILENUM(lumpnum) (UINT16)((lumpnum)>>16) // wad flumpnum>>16) // wad file number in upper word
#define LUMPNUM(lumpnum) (UINT16)((lumpnum)&0xFFFF) // lump number for this pwad
@ -143,7 +151,7 @@ void W_Shutdown(void);
// Opens a WAD file. Returns the FILE * handle for the file, or NULL if not found or could not be opened
FILE *W_OpenWadFile(const char **filename, boolean useerrors);
// Load and add a wadfile to the active wad files, returns numbers of lumps, INT16_MAX on error
UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup);
UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup, wadcompat_t compat);
// W_InitMultipleFiles returns 1 if all is okay, 0 otherwise,
// so that it stops with a message if a file was not found, but not if all is okay.
@ -195,6 +203,7 @@ void *W_CacheLumpNumForce(lumpnum_t lumpnum, INT32 tag);
boolean W_IsLumpCached(lumpnum_t lump, void *ptr);
boolean W_IsPatchCached(lumpnum_t lump, void *ptr);
boolean W_NeedPaletteRemap(void);
void *W_CacheLumpName(const char *name, INT32 tag);
void *W_CachePatchName(const char *name, INT32 tag);