Replaced the laggy randomised-at-runtime static with sufficiently random low-impact pregenerated static. Requires new patch.dta. https://cdn.discordapp.com/attachments/293238104096112641/372770688890830859/srb20003.gif

This commit is contained in:
toasterbabe 2017-10-25 16:40:21 +01:00
parent 9ffb5c0fb0
commit 9a10dfeaee
5 changed files with 85 additions and 58 deletions

View file

@ -7331,7 +7331,6 @@ struct {
{"V_70TRANS",V_70TRANS}, {"V_70TRANS",V_70TRANS},
{"V_80TRANS",V_80TRANS}, {"V_80TRANS",V_80TRANS},
{"V_90TRANS",V_90TRANS}, {"V_90TRANS",V_90TRANS},
{"V_STATIC",V_STATIC},
{"V_HUDTRANSHALF",V_HUDTRANSHALF}, {"V_HUDTRANSHALF",V_HUDTRANSHALF},
{"V_HUDTRANS",V_HUDTRANS}, {"V_HUDTRANS",V_HUDTRANS},
{"V_HUDTRANSDOUBLE",V_HUDTRANSDOUBLE}, {"V_HUDTRANSDOUBLE",V_HUDTRANSDOUBLE},

View file

@ -3085,6 +3085,26 @@ void M_DrawTextBox(INT32 x, INT32 y, INT32 width, INT32 boxlines)
*/ */
} }
#define scale FRACUNIT/2
static fixed_t staticalong = 0;
static void M_DrawStaticBox(fixed_t x, fixed_t y, INT32 flags, fixed_t w, fixed_t h)
{
patch_t *patch = W_CachePatchName("LSSTATIC", PU_CACHE);
INT32 pw = SHORT(patch->width);
fixed_t sw = FixedDiv(w, scale);
if (staticalong >= (pw - sw))
staticalong = 0;
V_DrawCroppedPatch(x<<FRACBITS, y<<FRACBITS, scale, flags, patch, staticalong, 0, sw, FixedDiv(h, scale));
staticalong += P_RandomRange(sw/2, 2*sw);
}
#undef scale
// //
// Draw border for the savegame description // Draw border for the savegame description
// //
@ -4323,7 +4343,10 @@ static void M_DrawLevelPlatterWideMap(UINT8 row, UINT8 col, INT32 x, INT32 y, bo
// A 564x100 image of the level as entry MAPxxW // A 564x100 image of the level as entry MAPxxW
if (!(levelselect.rows[row].mapavailable[col])) if (!(levelselect.rows[row].mapavailable[col]))
V_DrawSmallScaledPatch(x, y, V_STATIC, levselp[1][2]); // static - make secret maps look ENTICING {
V_DrawSmallScaledPatch(x, y, 0, levselp[1][2]);
M_DrawStaticBox(x, y, V_80TRANS, 282, 50);
}
else else
{ {
if (W_CheckNumForName(va("%sW", G_BuildMapName(map))) != LUMPERROR) if (W_CheckNumForName(va("%sW", G_BuildMapName(map))) != LUMPERROR)
@ -4351,7 +4374,10 @@ static void M_DrawLevelPlatterMap(UINT8 row, UINT8 col, INT32 x, INT32 y, boolea
// A 160x100 image of the level as entry MAPxxP // A 160x100 image of the level as entry MAPxxP
if (!(levelselect.rows[row].mapavailable[col])) if (!(levelselect.rows[row].mapavailable[col]))
V_DrawSmallScaledPatch(x, y, V_STATIC, levselp[0][2]); // static - make secret maps look ENTICING {
V_DrawSmallScaledPatch(x, y, 0, levselp[0][2]);
M_DrawStaticBox(x, y, V_80TRANS, 80, 50);
}
else else
{ {
if (W_CheckNumForName(va("%sP", G_BuildMapName(map))) != LUMPERROR) if (W_CheckNumForName(va("%sP", G_BuildMapName(map))) != LUMPERROR)
@ -6134,12 +6160,14 @@ static void M_DrawLoadGameData(void)
if (savetodraw == saveSlotSelected) if (savetodraw == saveSlotSelected)
V_DrawFill(x, y+9, 80, 1, yellowmap[3]); V_DrawFill(x, y+9, 80, 1, yellowmap[3]);
y += 11; y += 11;
V_DrawSmallScaledPatch(x, y, V_STATIC, savselp[4]); V_DrawSmallScaledPatch(x, y, 0, savselp[4]);
M_DrawStaticBox(x, y, V_80TRANS, 80, 50);
y += 41; y += 41;
if (ultimate_selectable) if (ultimate_selectable)
V_DrawRightAlignedThinString(x + 79, y, V_REDMAP, "ULTIMATE."); V_DrawRightAlignedThinString(x + 79, y, V_REDMAP, "ULTIMATE.");
else else
V_DrawRightAlignedThinString(x + 79, y, V_GRAYMAP, "DON'T SAVE!"); V_DrawRightAlignedThinString(x + 79, y, V_GRAYMAP, "DON'T SAVE!");
continue; continue;
} }
@ -6197,28 +6225,28 @@ static void M_DrawLoadGameData(void)
// level image area // level image area
{ {
patch_t *patch;
INT32 flags = 0;
if ((savegameinfo[savetodraw].lives == -42) if ((savegameinfo[savetodraw].lives == -42)
|| (savegameinfo[savetodraw].lives == -666)) || (savegameinfo[savetodraw].lives == -666))
{ {
patch = savselp[3]; V_DrawFill(x, y, 80, 50, 31);
flags = V_STATIC; M_DrawStaticBox(x, y, V_80TRANS, 80, 50);
} }
else if (savegameinfo[savetodraw].gamemap & 8192)
patch = savselp[6];
else else
{ {
lumpnum_t lumpnum = W_CheckNumForName(va("%sP", G_BuildMapName((savegameinfo[savetodraw].gamemap) & 8191))); patch_t *patch;
if (lumpnum != LUMPERROR) if (savegameinfo[savetodraw].gamemap & 8192)
patch = W_CachePatchNum(lumpnum, PU_CACHE); patch = savselp[3];
else else
patch = savselp[5]; {
lumpnum_t lumpnum = W_CheckNumForName(va("%sP", G_BuildMapName((savegameinfo[savetodraw].gamemap) & 8191)));
if (lumpnum != LUMPERROR)
patch = W_CachePatchNum(lumpnum, PU_CACHE);
else
patch = savselp[5];
}
V_DrawSmallScaledPatch(x, y, 0, patch);
} }
V_DrawSmallScaledPatch(x, y, flags, patch);
y += 41; y += 41;
if (savegameinfo[savetodraw].lives == -42) if (savegameinfo[savetodraw].lives == -42)
@ -6569,17 +6597,15 @@ static void M_ReadSaveStrings(void)
W_UnlockCachedPatch(savselp[3]); W_UnlockCachedPatch(savselp[3]);
W_UnlockCachedPatch(savselp[4]); W_UnlockCachedPatch(savselp[4]);
W_UnlockCachedPatch(savselp[5]); W_UnlockCachedPatch(savselp[5]);
W_UnlockCachedPatch(savselp[6]);
} }
savselp[0] = W_CachePatchName("SAVEBACK", PU_STATIC); savselp[0] = W_CachePatchName("SAVEBACK", PU_STATIC);
savselp[1] = W_CachePatchName("SAVENONE", PU_STATIC); savselp[1] = W_CachePatchName("SAVENONE", PU_STATIC);
savselp[2] = W_CachePatchName("ULTIMATE", PU_STATIC); savselp[2] = W_CachePatchName("ULTIMATE", PU_STATIC);
savselp[3] = W_CachePatchName("BLACKLVL", PU_STATIC); savselp[3] = W_CachePatchName("GAMEDONE", PU_STATIC);
savselp[4] = W_CachePatchName("BLACXLVL", PU_STATIC); savselp[4] = W_CachePatchName("BLACXLVL", PU_STATIC);
savselp[5] = W_CachePatchName("BLANKLVL", PU_STATIC); savselp[5] = W_CachePatchName("BLANKLVL", PU_STATIC);
savselp[6] = W_CachePatchName("GAMEDONE", PU_STATIC);
} }
// //

View file

@ -525,22 +525,6 @@ static inline UINT8 transmappedpdraw(const UINT8 *dest, const UINT8 *source, fix
return *(v_translevel + (((*(v_colormap + source[ofs>>FRACBITS]))<<8)&0xff00) + (*dest&0xff)); return *(v_translevel + (((*(v_colormap + source[ofs>>FRACBITS]))<<8)&0xff00) + (*dest&0xff));
} }
static UINT8 staticstep = 0;
static fixed_t staticval = 0;
static inline UINT8 staticpdraw(const UINT8 *dest, const UINT8 *source, fixed_t ofs)
{
UINT8 val = source[ofs>>FRACBITS];
(void)dest;
if ((++staticstep) >= 4)
{
staticstep = 0;
staticval = M_RandomFixed();
}
if (val < 7) return val;
return ((staticval>>staticstep)&7)+(val-7);
}
// Draws a patch scaled to arbitrary size. // Draws a patch scaled to arbitrary size.
void V_DrawFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_t *patch, const UINT8 *colormap) void V_DrawFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_t *patch, const UINT8 *colormap)
{ {
@ -571,25 +555,18 @@ void V_DrawFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_t
patchdrawfunc = standardpdraw; patchdrawfunc = standardpdraw;
v_translevel = NULL; v_translevel = NULL;
if ((alphalevel = ((scrn & V_ALPHAMASK) >> V_ALPHASHIFT)) == 12) // static if ((alphalevel = ((scrn & V_ALPHAMASK) >> V_ALPHASHIFT)))
{ {
alphalevel = 0; if (alphalevel == 13)
patchdrawfunc = staticpdraw; alphalevel = hudminusalpha[cv_translucenthud.value];
} else if (alphalevel == 14)
else alphalevel = 10 - cv_translucenthud.value;
{ else if (alphalevel == 15)
if (alphalevel) alphalevel = hudplusalpha[cv_translucenthud.value];
{
if (alphalevel == 13) if (alphalevel >= 10)
alphalevel = hudminusalpha[cv_translucenthud.value]; return; // invis
else if (alphalevel == 14)
alphalevel = 10 - cv_translucenthud.value;
else if (alphalevel == 15)
alphalevel = hudplusalpha[cv_translucenthud.value];
if (alphalevel >= 10)
return; // invis
}
if (alphalevel) if (alphalevel)
{ {
v_translevel = transtables + ((alphalevel-1)<<FF_TRANSSHIFT); v_translevel = transtables + ((alphalevel-1)<<FF_TRANSSHIFT);
@ -763,6 +740,10 @@ void V_DrawFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_t
// Draws a patch cropped and scaled to arbitrary size. // Draws a patch cropped and scaled to arbitrary size.
void V_DrawCroppedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_t *patch, fixed_t sx, fixed_t sy, fixed_t w, fixed_t h) void V_DrawCroppedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_t *patch, fixed_t sx, fixed_t sy, fixed_t w, fixed_t h)
{ {
UINT8 (*patchdrawfunc)(const UINT8*, const UINT8*, fixed_t);
UINT32 alphalevel = 0;
// boolean flip = false;
fixed_t col, ofs, colfrac, rowfrac, fdup; fixed_t col, ofs, colfrac, rowfrac, fdup;
INT32 dupx, dupy; INT32 dupx, dupy;
const column_t *column; const column_t *column;
@ -781,6 +762,28 @@ void V_DrawCroppedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_
} }
#endif #endif
patchdrawfunc = standardpdraw;
v_translevel = NULL;
if ((alphalevel = ((scrn & V_ALPHAMASK) >> V_ALPHASHIFT)))
{
if (alphalevel == 13)
alphalevel = hudminusalpha[cv_translucenthud.value];
else if (alphalevel == 14)
alphalevel = 10 - cv_translucenthud.value;
else if (alphalevel == 15)
alphalevel = hudplusalpha[cv_translucenthud.value];
if (alphalevel >= 10)
return; // invis
if (alphalevel)
{
v_translevel = transtables + ((alphalevel-1)<<FF_TRANSSHIFT);
patchdrawfunc = translucentpdraw;
}
}
// only use one dup, to avoid stretching (har har) // only use one dup, to avoid stretching (har har)
dupx = dupy = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy); dupx = dupy = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy);
fdup = FixedMul(dupx<<FRACBITS, pscale); fdup = FixedMul(dupx<<FRACBITS, pscale);
@ -844,7 +847,7 @@ void V_DrawCroppedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_
desttop += (y*vid.width) + x; desttop += (y*vid.width) + x;
} }
for (col = sx<<FRACBITS; (col>>FRACBITS) < SHORT(patch->width) && (col>>FRACBITS) < w; col += colfrac, ++x, desttop++) for (col = sx<<FRACBITS; (col>>FRACBITS) < SHORT(patch->width) && ((col>>FRACBITS) - sx) < w; col += colfrac, ++x, desttop++)
{ {
INT32 topdelta, prevdelta = -1; INT32 topdelta, prevdelta = -1;
if (x < 0) // don't draw off the left of the screen (WRAP PREVENTION) if (x < 0) // don't draw off the left of the screen (WRAP PREVENTION)
@ -863,10 +866,10 @@ void V_DrawCroppedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_
dest = desttop; dest = desttop;
dest += FixedInt(FixedMul(topdelta<<FRACBITS,fdup))*vid.width; dest += FixedInt(FixedMul(topdelta<<FRACBITS,fdup))*vid.width;
for (ofs = sy<<FRACBITS; dest < deststop && (ofs>>FRACBITS) < column->length && ((ofs>>FRACBITS) + topdelta) < h; ofs += rowfrac) for (ofs = sy<<FRACBITS; dest < deststop && (ofs>>FRACBITS) < column->length && (((ofs>>FRACBITS) - sy) + topdelta) < h; ofs += rowfrac)
{ {
if (dest >= screens[scrn&V_PARAMMASK]) // don't draw off the top of the screen (CRASH PREVENTION) if (dest >= screens[scrn&V_PARAMMASK]) // don't draw off the top of the screen (CRASH PREVENTION)
*dest = source[ofs>>FRACBITS]; *dest = patchdrawfunc(dest, source, ofs);
dest += vid.width; dest += vid.width;
} }
column = (const column_t *)((const UINT8 *)column + column->length + 4); column = (const column_t *)((const UINT8 *)column + column->length + 4);

View file

@ -94,7 +94,6 @@ extern RGBA_t *pMasterPalette;
#define V_70TRANS 0x00070000 #define V_70TRANS 0x00070000
#define V_80TRANS 0x00080000 // used to be V_8020TRANS #define V_80TRANS 0x00080000 // used to be V_8020TRANS
#define V_90TRANS 0x00090000 #define V_90TRANS 0x00090000
#define V_STATIC 0x000C0000 // ogl unsupported kthnxbai
#define V_HUDTRANSHALF 0x000D0000 #define V_HUDTRANSHALF 0x000D0000
#define V_HUDTRANS 0x000E0000 // draw the hud translucent #define V_HUDTRANS 0x000E0000 // draw the hud translucent
#define V_HUDTRANSDOUBLE 0x000F0000 #define V_HUDTRANSDOUBLE 0x000F0000

View file

@ -205,7 +205,7 @@ static void Y_IntermissionTokenDrawer(void)
calc = (lowy - y)*2; calc = (lowy - y)*2;
if (calc > 0) if (calc > 0)
V_DrawCroppedPatch(32<<FRACBITS, y<<FRACBITS, FRACUNIT/2, 0, tokenicon, 32*FRACUNIT, y<<FRACBITS, SHORT(tokenicon->width), calc); V_DrawCroppedPatch(32<<FRACBITS, y<<FRACBITS, FRACUNIT/2, 0, tokenicon, 32<<FRACBITS, y<<FRACBITS, SHORT(tokenicon->width), calc);
} }
// //