Merge branch 'next' into knuxtweaks
This commit is contained in:
commit
365e63894f
|
@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.0)
|
||||||
# DO NOT CHANGE THIS SRB2 STRING! Some variable names depend on this string.
|
# DO NOT CHANGE THIS SRB2 STRING! Some variable names depend on this string.
|
||||||
# Version change is fine.
|
# Version change is fine.
|
||||||
project(SRB2
|
project(SRB2
|
||||||
VERSION 2.2.0
|
VERSION 2.2.1
|
||||||
LANGUAGES C)
|
LANGUAGES C)
|
||||||
|
|
||||||
if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR})
|
if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR})
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
version: 2.2.0.{branch}-{build}
|
version: 2.2.1.{branch}-{build}
|
||||||
os: MinGW
|
os: MinGW
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
|
|
120
src/am_map.c
120
src/am_map.c
|
@ -160,6 +160,7 @@ static boolean am_stopped = true;
|
||||||
static INT32 f_x, f_y; // location of window on screen (always zero for both)
|
static INT32 f_x, f_y; // location of window on screen (always zero for both)
|
||||||
static INT32 f_w, f_h; // size of window on screen (always the screen width and height respectively)
|
static INT32 f_w, f_h; // size of window on screen (always the screen width and height respectively)
|
||||||
|
|
||||||
|
static boolean m_keydown[4]; // which window panning keys are being pressed down?
|
||||||
static mpoint_t m_paninc; // how far the window pans each tic (map coords)
|
static mpoint_t m_paninc; // how far the window pans each tic (map coords)
|
||||||
static fixed_t mtof_zoommul; // how far the window zooms in each tic (map coords)
|
static fixed_t mtof_zoommul; // how far the window zooms in each tic (map coords)
|
||||||
static fixed_t ftom_zoommul; // how far the window zooms in each tic (fb coords)
|
static fixed_t ftom_zoommul; // how far the window zooms in each tic (fb coords)
|
||||||
|
@ -205,6 +206,7 @@ static boolean followplayer = true; // specifies whether to follow the player ar
|
||||||
typedef void (*AMDRAWFLINEFUNC) (const fline_t *fl, INT32 color);
|
typedef void (*AMDRAWFLINEFUNC) (const fline_t *fl, INT32 color);
|
||||||
static AMDRAWFLINEFUNC AM_drawFline;
|
static AMDRAWFLINEFUNC AM_drawFline;
|
||||||
|
|
||||||
|
static void AM_drawPixel(INT32 xx, INT32 yy, INT32 cc);
|
||||||
static void AM_drawFline_soft(const fline_t *fl, INT32 color);
|
static void AM_drawFline_soft(const fline_t *fl, INT32 color);
|
||||||
|
|
||||||
static void AM_activateNewScale(void)
|
static void AM_activateNewScale(void)
|
||||||
|
@ -344,22 +346,22 @@ static void AM_initVariables(void)
|
||||||
old_m_h = m_h;
|
old_m_h = m_h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Called when the screen size changes.
|
||||||
|
//
|
||||||
|
static void AM_FrameBufferInit(void)
|
||||||
|
{
|
||||||
|
f_x = f_y = 0;
|
||||||
|
f_w = vid.width;
|
||||||
|
f_h = vid.height;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// should be called at the start of every level
|
// should be called at the start of every level
|
||||||
// right now, i figure it out myself
|
// right now, i figure it out myself
|
||||||
//
|
//
|
||||||
static void AM_LevelInit(void)
|
static void AM_LevelInit(void)
|
||||||
{
|
{
|
||||||
f_x = f_y = 0;
|
|
||||||
f_w = vid.width;
|
|
||||||
f_h = vid.height;
|
|
||||||
|
|
||||||
AM_drawFline = AM_drawFline_soft;
|
|
||||||
#ifdef HWRENDER
|
|
||||||
if (rendermode == render_opengl)
|
|
||||||
AM_drawFline = HWR_drawAMline;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
AM_findMinMaxBoundaries();
|
AM_findMinMaxBoundaries();
|
||||||
scale_mtof = FixedDiv(min_scale_mtof*10, 7*FRACUNIT);
|
scale_mtof = FixedDiv(min_scale_mtof*10, 7*FRACUNIT);
|
||||||
if (scale_mtof > max_scale_mtof)
|
if (scale_mtof > max_scale_mtof)
|
||||||
|
@ -381,7 +383,7 @@ void AM_Stop(void)
|
||||||
*
|
*
|
||||||
* \sa AM_Stop
|
* \sa AM_Stop
|
||||||
*/
|
*/
|
||||||
static inline void AM_Start(void)
|
void AM_Start(void)
|
||||||
{
|
{
|
||||||
static INT32 lastlevel = -1;
|
static INT32 lastlevel = -1;
|
||||||
|
|
||||||
|
@ -389,9 +391,13 @@ static inline void AM_Start(void)
|
||||||
AM_Stop();
|
AM_Stop();
|
||||||
am_stopped = false;
|
am_stopped = false;
|
||||||
if (lastlevel != gamemap || am_recalc) // screen size changed
|
if (lastlevel != gamemap || am_recalc) // screen size changed
|
||||||
|
{
|
||||||
|
AM_FrameBufferInit();
|
||||||
|
if (lastlevel != gamemap)
|
||||||
{
|
{
|
||||||
AM_LevelInit();
|
AM_LevelInit();
|
||||||
lastlevel = gamemap;
|
lastlevel = gamemap;
|
||||||
|
}
|
||||||
am_recalc = false;
|
am_recalc = false;
|
||||||
}
|
}
|
||||||
AM_initVariables();
|
AM_initVariables();
|
||||||
|
@ -417,6 +423,28 @@ static void AM_maxOutWindowScale(void)
|
||||||
AM_activateNewScale();
|
AM_activateNewScale();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// set window panning
|
||||||
|
//
|
||||||
|
static void AM_setWindowPanning(void)
|
||||||
|
{
|
||||||
|
// up and down
|
||||||
|
if (m_keydown[2]) // pan up
|
||||||
|
m_paninc.y = FTOM(F_PANINC);
|
||||||
|
else if (m_keydown[3]) // pan down
|
||||||
|
m_paninc.y = -FTOM(F_PANINC);
|
||||||
|
else
|
||||||
|
m_paninc.y = 0;
|
||||||
|
|
||||||
|
// left and right
|
||||||
|
if (m_keydown[0]) // pan right
|
||||||
|
m_paninc.x = FTOM(F_PANINC);
|
||||||
|
else if (m_keydown[1]) // pan left
|
||||||
|
m_paninc.x = -FTOM(F_PANINC);
|
||||||
|
else
|
||||||
|
m_paninc.x = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/** Responds to user inputs in automap mode.
|
/** Responds to user inputs in automap mode.
|
||||||
*
|
*
|
||||||
* \param ev Event to possibly respond to.
|
* \param ev Event to possibly respond to.
|
||||||
|
@ -449,35 +477,49 @@ boolean AM_Responder(event_t *ev)
|
||||||
{
|
{
|
||||||
case AM_PANRIGHTKEY: // pan right
|
case AM_PANRIGHTKEY: // pan right
|
||||||
if (!followplayer)
|
if (!followplayer)
|
||||||
m_paninc.x = FTOM(F_PANINC);
|
{
|
||||||
|
m_keydown[0] = true;
|
||||||
|
AM_setWindowPanning();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
rc = false;
|
rc = false;
|
||||||
break;
|
break;
|
||||||
case AM_PANLEFTKEY: // pan left
|
case AM_PANLEFTKEY: // pan left
|
||||||
if (!followplayer)
|
if (!followplayer)
|
||||||
m_paninc.x = -FTOM(F_PANINC);
|
{
|
||||||
|
m_keydown[1] = true;
|
||||||
|
AM_setWindowPanning();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
rc = false;
|
rc = false;
|
||||||
break;
|
break;
|
||||||
case AM_PANUPKEY: // pan up
|
case AM_PANUPKEY: // pan up
|
||||||
if (!followplayer)
|
if (!followplayer)
|
||||||
m_paninc.y = FTOM(F_PANINC);
|
{
|
||||||
|
m_keydown[2] = true;
|
||||||
|
AM_setWindowPanning();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
rc = false;
|
rc = false;
|
||||||
break;
|
break;
|
||||||
case AM_PANDOWNKEY: // pan down
|
case AM_PANDOWNKEY: // pan down
|
||||||
if (!followplayer)
|
if (!followplayer)
|
||||||
m_paninc.y = -FTOM(F_PANINC);
|
{
|
||||||
|
m_keydown[3] = true;
|
||||||
|
AM_setWindowPanning();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
rc = false;
|
rc = false;
|
||||||
break;
|
break;
|
||||||
case AM_ZOOMOUTKEY: // zoom out
|
case AM_ZOOMOUTKEY: // zoom out
|
||||||
mtof_zoommul = M_ZOOMOUT;
|
mtof_zoommul = M_ZOOMOUT;
|
||||||
ftom_zoommul = M_ZOOMIN;
|
ftom_zoommul = M_ZOOMIN;
|
||||||
|
AM_setWindowPanning();
|
||||||
break;
|
break;
|
||||||
case AM_ZOOMINKEY: // zoom in
|
case AM_ZOOMINKEY: // zoom in
|
||||||
mtof_zoommul = M_ZOOMIN;
|
mtof_zoommul = M_ZOOMIN;
|
||||||
ftom_zoommul = M_ZOOMOUT;
|
ftom_zoommul = M_ZOOMOUT;
|
||||||
|
AM_setWindowPanning();
|
||||||
break;
|
break;
|
||||||
case AM_TOGGLEKEY:
|
case AM_TOGGLEKEY:
|
||||||
AM_Stop();
|
AM_Stop();
|
||||||
|
@ -491,6 +533,7 @@ boolean AM_Responder(event_t *ev)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
AM_restoreScaleAndLoc();
|
AM_restoreScaleAndLoc();
|
||||||
|
AM_setWindowPanning();
|
||||||
break;
|
break;
|
||||||
case AM_FOLLOWKEY:
|
case AM_FOLLOWKEY:
|
||||||
followplayer = !followplayer;
|
followplayer = !followplayer;
|
||||||
|
@ -510,14 +553,32 @@ boolean AM_Responder(event_t *ev)
|
||||||
switch (ev->data1)
|
switch (ev->data1)
|
||||||
{
|
{
|
||||||
case AM_PANRIGHTKEY:
|
case AM_PANRIGHTKEY:
|
||||||
|
if (!followplayer)
|
||||||
|
{
|
||||||
|
m_keydown[0] = false;
|
||||||
|
AM_setWindowPanning();
|
||||||
|
}
|
||||||
|
break;
|
||||||
case AM_PANLEFTKEY:
|
case AM_PANLEFTKEY:
|
||||||
if (!followplayer)
|
if (!followplayer)
|
||||||
m_paninc.x = 0;
|
{
|
||||||
|
m_keydown[1] = false;
|
||||||
|
AM_setWindowPanning();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case AM_PANUPKEY:
|
case AM_PANUPKEY:
|
||||||
|
if (!followplayer)
|
||||||
|
{
|
||||||
|
m_keydown[2] = false;
|
||||||
|
AM_setWindowPanning();
|
||||||
|
}
|
||||||
|
break;
|
||||||
case AM_PANDOWNKEY:
|
case AM_PANDOWNKEY:
|
||||||
if (!followplayer)
|
if (!followplayer)
|
||||||
m_paninc.y = 0;
|
{
|
||||||
|
m_keydown[3] = false;
|
||||||
|
AM_setWindowPanning();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case AM_ZOOMOUTKEY:
|
case AM_ZOOMOUTKEY:
|
||||||
case AM_ZOOMINKEY:
|
case AM_ZOOMINKEY:
|
||||||
|
@ -718,6 +779,17 @@ static boolean AM_clipMline(const mline_t *ml, fline_t *fl)
|
||||||
}
|
}
|
||||||
#undef DOOUTCODE
|
#undef DOOUTCODE
|
||||||
|
|
||||||
|
//
|
||||||
|
// Draws a pixel.
|
||||||
|
//
|
||||||
|
static void AM_drawPixel(INT32 xx, INT32 yy, INT32 cc)
|
||||||
|
{
|
||||||
|
UINT8 *dest = screens[0];
|
||||||
|
if (xx < 0 || yy < 0 || xx >= vid.width || yy >= vid.height)
|
||||||
|
return; // off the screen
|
||||||
|
dest[(yy*vid.width) + xx] = cc;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Classic Bresenham w/ whatever optimizations needed for speed
|
// Classic Bresenham w/ whatever optimizations needed for speed
|
||||||
//
|
//
|
||||||
|
@ -739,8 +811,6 @@ static void AM_drawFline_soft(const fline_t *fl, INT32 color)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PUTDOT(xx,yy,cc) V_DrawFill(xx,yy,1,1,cc|V_NOSCALESTART);
|
|
||||||
|
|
||||||
dx = fl->b.x - fl->a.x;
|
dx = fl->b.x - fl->a.x;
|
||||||
ax = 2 * (dx < 0 ? -dx : dx);
|
ax = 2 * (dx < 0 ? -dx : dx);
|
||||||
sx = dx < 0 ? -1 : 1;
|
sx = dx < 0 ? -1 : 1;
|
||||||
|
@ -757,7 +827,7 @@ static void AM_drawFline_soft(const fline_t *fl, INT32 color)
|
||||||
d = ay - ax/2;
|
d = ay - ax/2;
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
PUTDOT(x, y, color)
|
AM_drawPixel(x, y, color);
|
||||||
if (x == fl->b.x)
|
if (x == fl->b.x)
|
||||||
return;
|
return;
|
||||||
if (d >= 0)
|
if (d >= 0)
|
||||||
|
@ -774,7 +844,7 @@ static void AM_drawFline_soft(const fline_t *fl, INT32 color)
|
||||||
d = ax - ay/2;
|
d = ax - ay/2;
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
PUTDOT(x, y, color)
|
AM_drawPixel(x, y, color);
|
||||||
if (y == fl->b.y)
|
if (y == fl->b.y)
|
||||||
return;
|
return;
|
||||||
if (d >= 0)
|
if (d >= 0)
|
||||||
|
@ -786,8 +856,6 @@ static void AM_drawFline_soft(const fline_t *fl, INT32 color)
|
||||||
d += ax;
|
d += ax;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef PUTDOT
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -1100,6 +1168,12 @@ void AM_Drawer(void)
|
||||||
if (!automapactive)
|
if (!automapactive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
AM_drawFline = AM_drawFline_soft;
|
||||||
|
#ifdef HWRENDER
|
||||||
|
if (rendermode == render_opengl)
|
||||||
|
AM_drawFline = HWR_drawAMline;
|
||||||
|
#endif
|
||||||
|
|
||||||
AM_clearFB(BACKGROUND);
|
AM_clearFB(BACKGROUND);
|
||||||
if (draw_grid) AM_drawGrid(GRIDCOLORS);
|
if (draw_grid) AM_drawGrid(GRIDCOLORS);
|
||||||
AM_drawWalls();
|
AM_drawWalls();
|
||||||
|
|
|
@ -38,6 +38,9 @@ void AM_Ticker(void);
|
||||||
// Called by main loop, instead of view drawer if automap is active.
|
// Called by main loop, instead of view drawer if automap is active.
|
||||||
void AM_Drawer(void);
|
void AM_Drawer(void);
|
||||||
|
|
||||||
|
// Enables the automap.
|
||||||
|
void AM_Start(void);
|
||||||
|
|
||||||
// Called to force the automap to quit if the level is completed while it is up.
|
// Called to force the automap to quit if the level is completed while it is up.
|
||||||
void AM_Stop(void);
|
void AM_Stop(void);
|
||||||
|
|
||||||
|
|
|
@ -823,8 +823,13 @@ static void COM_Help_f(void)
|
||||||
if (!stricmp(cvar->PossibleValue[MINVAL].strvalue, "MIN"))
|
if (!stricmp(cvar->PossibleValue[MINVAL].strvalue, "MIN"))
|
||||||
{
|
{
|
||||||
if (floatmode)
|
if (floatmode)
|
||||||
CONS_Printf(" range from %f to %f\n", FIXED_TO_FLOAT(cvar->PossibleValue[MINVAL].value),
|
{
|
||||||
FIXED_TO_FLOAT(cvar->PossibleValue[MAXVAL].value));
|
float fu = FIXED_TO_FLOAT(cvar->PossibleValue[MINVAL].value);
|
||||||
|
float ck = FIXED_TO_FLOAT(cvar->PossibleValue[MAXVAL].value);
|
||||||
|
CONS_Printf(" range from %ld%s to %ld%s\n",
|
||||||
|
(long)fu, M_Ftrim(fu),
|
||||||
|
(long)ck, M_Ftrim(ck));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
CONS_Printf(" range from %d to %d\n", cvar->PossibleValue[MINVAL].value,
|
CONS_Printf(" range from %d to %d\n", cvar->PossibleValue[MINVAL].value,
|
||||||
cvar->PossibleValue[MAXVAL].value);
|
cvar->PossibleValue[MAXVAL].value);
|
||||||
|
@ -973,7 +978,10 @@ static void COM_Add_f(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (( cvar->flags & CV_FLOAT ))
|
if (( cvar->flags & CV_FLOAT ))
|
||||||
CV_Set(cvar, va("%f", FIXED_TO_FLOAT (cvar->value) + atof(COM_Argv(2))));
|
{
|
||||||
|
float n =FIXED_TO_FLOAT (cvar->value) + atof(COM_Argv(2));
|
||||||
|
CV_Set(cvar, va("%ld%s", (long)n, M_Ftrim(n)));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
CV_AddValue(cvar, atoi(COM_Argv(2)));
|
CV_AddValue(cvar, atoi(COM_Argv(2)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,12 +26,12 @@
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* Manually defined asset hashes for non-CMake builds
|
/* Manually defined asset hashes for non-CMake builds
|
||||||
* Last updated 2019 / 12 / 06 - v2.2.0 - main assets
|
* Last updated 2020 / 02 / 15 - v2.2.1 - main assets
|
||||||
* Last updated 20?? / ?? / ?? - v2.2.? - patch.pk3
|
* Last updated 20?? / ?? / ?? - v2.2.? - patch.pk3
|
||||||
*/
|
*/
|
||||||
#define ASSET_HASH_SRB2_PK3 "51419a33b4982d840c6772c159ba7c0a"
|
#define ASSET_HASH_SRB2_PK3 "0277c9416756627004e83cbb5b2e3e28"
|
||||||
#define ASSET_HASH_ZONES_PK3 "df74843919fd51af26a0baa8e21e4c19"
|
#define ASSET_HASH_ZONES_PK3 "f7e88afb6af7996a834c7d663144bead"
|
||||||
#define ASSET_HASH_PLAYER_DTA "56a247e074dd0dc794b6617efef1e918"
|
#define ASSET_HASH_PLAYER_DTA "ad49e07b17cc662f1ad70c454910b4ae"
|
||||||
#ifdef USE_PATCH_DTA
|
#ifdef USE_PATCH_DTA
|
||||||
#define ASSET_HASH_PATCH_PK3 "there is no patch.pk3, only zuul"
|
#define ASSET_HASH_PATCH_PK3 "there is no patch.pk3, only zuul"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -613,6 +613,15 @@ void CON_Ticker(void)
|
||||||
con_tick++;
|
con_tick++;
|
||||||
con_tick &= 7;
|
con_tick &= 7;
|
||||||
|
|
||||||
|
// if the menu is open then close the console.
|
||||||
|
if (menuactive && con_destlines)
|
||||||
|
{
|
||||||
|
consoletoggle = false;
|
||||||
|
con_destlines = 0;
|
||||||
|
CON_ClearHUD();
|
||||||
|
I_UpdateMouseGrab();
|
||||||
|
}
|
||||||
|
|
||||||
// console key was pushed
|
// console key was pushed
|
||||||
if (consoletoggle)
|
if (consoletoggle)
|
||||||
{
|
{
|
||||||
|
@ -769,7 +778,7 @@ boolean CON_Responder(event_t *ev)
|
||||||
// check for console toggle key
|
// check for console toggle key
|
||||||
if (ev->type != ev_console)
|
if (ev->type != ev_console)
|
||||||
{
|
{
|
||||||
if (modeattacking || metalrecording || menuactive)
|
if (modeattacking || metalrecording)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (key == gamecontrol[gc_console][0] || key == gamecontrol[gc_console][1])
|
if (key == gamecontrol[gc_console][0] || key == gamecontrol[gc_console][1])
|
||||||
|
@ -784,7 +793,7 @@ boolean CON_Responder(event_t *ev)
|
||||||
// check other keys only if console prompt is active
|
// check other keys only if console prompt is active
|
||||||
if (!consoleready && key < NUMINPUTS) // metzgermeister: boundary check!!
|
if (!consoleready && key < NUMINPUTS) // metzgermeister: boundary check!!
|
||||||
{
|
{
|
||||||
if (! menuactive && bindtable[key])
|
if (bindtable[key])
|
||||||
{
|
{
|
||||||
COM_BufAddText(bindtable[key]);
|
COM_BufAddText(bindtable[key]);
|
||||||
COM_BufAddText("\n");
|
COM_BufAddText("\n");
|
||||||
|
|
|
@ -404,8 +404,8 @@ static void ExtraDataTicker(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If you are a client, you can safely forget the net commands for this tic
|
// If you are a client, you can safely forget the net commands for this tic
|
||||||
// If you are the server, you need to remember them until every client has been aknowledged,
|
// If you are the server, you need to remember them until every client has been acknowledged,
|
||||||
// because if you need to resend a PT_SERVERTICS packet, you need to put the commands in it
|
// because if you need to resend a PT_SERVERTICS packet, you will need to put the commands in it
|
||||||
if (client)
|
if (client)
|
||||||
D_FreeTextcmd(gametic);
|
D_FreeTextcmd(gametic);
|
||||||
}
|
}
|
||||||
|
@ -1278,8 +1278,14 @@ static boolean CL_SendJoin(void)
|
||||||
netbuffer->u.clientcfg.subversion = SUBVERSION;
|
netbuffer->u.clientcfg.subversion = SUBVERSION;
|
||||||
strncpy(netbuffer->u.clientcfg.application, SRB2APPLICATION,
|
strncpy(netbuffer->u.clientcfg.application, SRB2APPLICATION,
|
||||||
sizeof netbuffer->u.clientcfg.application);
|
sizeof netbuffer->u.clientcfg.application);
|
||||||
|
|
||||||
|
CleanupPlayerName(consoleplayer, cv_playername.zstring);
|
||||||
|
if (splitscreen)
|
||||||
|
CleanupPlayerName(1, cv_playername2.zstring);/* 1 is a HACK? oh no */
|
||||||
|
|
||||||
strncpy(netbuffer->u.clientcfg.names[0], cv_playername.zstring, MAXPLAYERNAME);
|
strncpy(netbuffer->u.clientcfg.names[0], cv_playername.zstring, MAXPLAYERNAME);
|
||||||
strncpy(netbuffer->u.clientcfg.names[1], cv_playername2.zstring, MAXPLAYERNAME);
|
strncpy(netbuffer->u.clientcfg.names[1], cv_playername2.zstring, MAXPLAYERNAME);
|
||||||
|
|
||||||
return HSendPacket(servernode, true, 0, sizeof (clientconfig_pak));
|
return HSendPacket(servernode, true, 0, sizeof (clientconfig_pak));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4504,7 +4510,7 @@ static void CL_SendClientCmd(void)
|
||||||
packetsize = sizeof (clientcmd_pak) - sizeof (ticcmd_t) - sizeof (INT16);
|
packetsize = sizeof (clientcmd_pak) - sizeof (ticcmd_t) - sizeof (INT16);
|
||||||
HSendPacket(servernode, false, 0, packetsize);
|
HSendPacket(servernode, false, 0, packetsize);
|
||||||
}
|
}
|
||||||
else if (gamestate != GS_NULL && addedtogame)
|
else if (gamestate != GS_NULL && (addedtogame || dedicated))
|
||||||
{
|
{
|
||||||
G_MoveTiccmd(&netbuffer->u.clientpak.cmd, &localcmds, 1);
|
G_MoveTiccmd(&netbuffer->u.clientpak.cmd, &localcmds, 1);
|
||||||
netbuffer->u.clientpak.consistancy = SHORT(consistancy[gametic%BACKUPTICS]);
|
netbuffer->u.clientpak.consistancy = SHORT(consistancy[gametic%BACKUPTICS]);
|
||||||
|
@ -4678,6 +4684,7 @@ static void Local_Maketic(INT32 realtics)
|
||||||
G_BuildTiccmd(&localcmds2, realtics, 2);
|
G_BuildTiccmd(&localcmds2, realtics, 2);
|
||||||
|
|
||||||
localcmds.angleturn |= TICCMD_RECEIVED;
|
localcmds.angleturn |= TICCMD_RECEIVED;
|
||||||
|
localcmds2.angleturn |= TICCMD_RECEIVED;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This function is utter bullshit and is responsible for
|
// This function is utter bullshit and is responsible for
|
||||||
|
|
34
src/d_main.c
34
src/d_main.c
|
@ -188,14 +188,14 @@ void D_ProcessEvents(void)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// console input
|
|
||||||
if (CON_Responder(ev))
|
|
||||||
continue; // ate the event
|
|
||||||
|
|
||||||
// Menu input
|
// Menu input
|
||||||
if (M_Responder(ev))
|
if (M_Responder(ev))
|
||||||
continue; // menu ate the event
|
continue; // menu ate the event
|
||||||
|
|
||||||
|
// console input
|
||||||
|
if (CON_Responder(ev))
|
||||||
|
continue; // ate the event
|
||||||
|
|
||||||
G_Responder(ev);
|
G_Responder(ev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -266,6 +266,9 @@ static void D_Display(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rendermode == render_soft && !splitscreen)
|
||||||
|
R_CheckViewMorph();
|
||||||
|
|
||||||
// change the view size if needed
|
// change the view size if needed
|
||||||
if (setsizeneeded || setrenderstillneeded)
|
if (setsizeneeded || setrenderstillneeded)
|
||||||
{
|
{
|
||||||
|
@ -446,6 +449,9 @@ static void D_Display(void)
|
||||||
// Image postprocessing effect
|
// Image postprocessing effect
|
||||||
if (rendermode == render_soft)
|
if (rendermode == render_soft)
|
||||||
{
|
{
|
||||||
|
if (!splitscreen)
|
||||||
|
R_ApplyViewMorph();
|
||||||
|
|
||||||
if (postimgtype)
|
if (postimgtype)
|
||||||
V_DoPostProcessor(0, postimgtype, postimgparam);
|
V_DoPostProcessor(0, postimgtype, postimgparam);
|
||||||
if (postimgtype2)
|
if (postimgtype2)
|
||||||
|
@ -502,12 +508,13 @@ static void D_Display(void)
|
||||||
// vid size change is now finished if it was on...
|
// vid size change is now finished if it was on...
|
||||||
vid.recalc = 0;
|
vid.recalc = 0;
|
||||||
|
|
||||||
M_Drawer(); // menu is drawn even on top of everything
|
// FIXME: draw either console or menu, not the two
|
||||||
// focus lost moved to M_Drawer
|
|
||||||
|
|
||||||
if (gamestate != GS_TIMEATTACK)
|
if (gamestate != GS_TIMEATTACK)
|
||||||
CON_Drawer();
|
CON_Drawer();
|
||||||
|
|
||||||
|
M_Drawer(); // menu is drawn even on top of everything
|
||||||
|
// focus lost moved to M_Drawer
|
||||||
|
|
||||||
//
|
//
|
||||||
// wipe update
|
// wipe update
|
||||||
//
|
//
|
||||||
|
@ -1205,15 +1212,10 @@ void D_SRB2Main(void)
|
||||||
|
|
||||||
// load wad, including the main wad file
|
// load wad, including the main wad file
|
||||||
CONS_Printf("W_InitMultipleFiles(): Adding IWAD and main PWADs.\n");
|
CONS_Printf("W_InitMultipleFiles(): Adding IWAD and main PWADs.\n");
|
||||||
if (!W_InitMultipleFiles(startupwadfiles, mainwads))
|
W_InitMultipleFiles(startupwadfiles, mainwads);
|
||||||
#ifdef _DEBUG
|
|
||||||
CONS_Error("A WAD file was not found or not valid.\nCheck the log to see which ones.\n");
|
|
||||||
#else
|
|
||||||
I_Error("A WAD file was not found or not valid.\nCheck the log to see which ones.\n");
|
|
||||||
#endif
|
|
||||||
D_CleanFile();
|
D_CleanFile();
|
||||||
|
|
||||||
#ifndef DEVELOP // md5s last updated 06/12/19 (ddmmyy)
|
#ifndef DEVELOP // md5s last updated 16/02/20 (ddmmyy)
|
||||||
|
|
||||||
// Check MD5s of autoloaded files
|
// Check MD5s of autoloaded files
|
||||||
W_VerifyFileMD5(0, ASSET_HASH_SRB2_PK3); // srb2.pk3
|
W_VerifyFileMD5(0, ASSET_HASH_SRB2_PK3); // srb2.pk3
|
||||||
|
@ -1290,12 +1292,14 @@ void D_SRB2Main(void)
|
||||||
// Lactozilla: Does the render mode need to change?
|
// Lactozilla: Does the render mode need to change?
|
||||||
if ((setrenderneeded != 0) && (setrenderneeded != rendermode))
|
if ((setrenderneeded != 0) && (setrenderneeded != rendermode))
|
||||||
{
|
{
|
||||||
|
CONS_Printf("Switching the renderer...\n");
|
||||||
needpatchflush = true;
|
needpatchflush = true;
|
||||||
needpatchrecache = true;
|
needpatchrecache = true;
|
||||||
VID_CheckRenderer();
|
VID_CheckRenderer();
|
||||||
SCR_ChangeRendererCVars(setrenderneeded);
|
SCR_ChangeRendererCVars(setrenderneeded);
|
||||||
}
|
|
||||||
D_CheckRendererState();
|
D_CheckRendererState();
|
||||||
|
setrenderneeded = 0;
|
||||||
|
}
|
||||||
|
|
||||||
wipegamestate = gamestate;
|
wipegamestate = gamestate;
|
||||||
|
|
||||||
|
|
|
@ -370,7 +370,7 @@ consvar_t cv_advancemap = {"advancemap", "Next", CV_NETVAR, advancemap_cons_t, N
|
||||||
static CV_PossibleValue_t playersforexit_cons_t[] = {{0, "One"}, {1, "1/4"}, {2, "Half"}, {3, "3/4"}, {4, "All"}, {0, NULL}};
|
static CV_PossibleValue_t playersforexit_cons_t[] = {{0, "One"}, {1, "1/4"}, {2, "Half"}, {3, "3/4"}, {4, "All"}, {0, NULL}};
|
||||||
consvar_t cv_playersforexit = {"playersforexit", "All", CV_NETVAR, playersforexit_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_playersforexit = {"playersforexit", "All", CV_NETVAR, playersforexit_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_exitmove = {"exitmove", "Off", CV_NETVAR|CV_CALL, CV_OnOff, ExitMove_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_exitmove = {"exitmove", "On", CV_NETVAR|CV_CALL, CV_OnOff, ExitMove_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_runscripts = {"runscripts", "Yes", 0, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_runscripts = {"runscripts", "Yes", 0, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
@ -632,7 +632,7 @@ void D_RegisterClientCommands(void)
|
||||||
// Set default player names
|
// Set default player names
|
||||||
// Monster Iestyn (12/08/19): not sure where else I could have actually put this, but oh well
|
// Monster Iestyn (12/08/19): not sure where else I could have actually put this, but oh well
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
sprintf(player_names[i], "Player %d", i);
|
sprintf(player_names[i], "Player %d", 1 + i);
|
||||||
|
|
||||||
if (dedicated)
|
if (dedicated)
|
||||||
return;
|
return;
|
||||||
|
@ -677,6 +677,7 @@ void D_RegisterClientCommands(void)
|
||||||
// GIF variables
|
// GIF variables
|
||||||
CV_RegisterVar(&cv_gif_optimize);
|
CV_RegisterVar(&cv_gif_optimize);
|
||||||
CV_RegisterVar(&cv_gif_downscale);
|
CV_RegisterVar(&cv_gif_downscale);
|
||||||
|
CV_RegisterVar(&cv_gif_localcolortable);
|
||||||
|
|
||||||
#ifdef WALLSPLATS
|
#ifdef WALLSPLATS
|
||||||
CV_RegisterVar(&cv_splats);
|
CV_RegisterVar(&cv_splats);
|
||||||
|
@ -1008,7 +1009,7 @@ boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
|
||||||
* SetPlayerName
|
* SetPlayerName
|
||||||
* \author Graue <graue@oceanbase.org>
|
* \author Graue <graue@oceanbase.org>
|
||||||
*/
|
*/
|
||||||
static void CleanupPlayerName(INT32 playernum, const char *newname)
|
void CleanupPlayerName(INT32 playernum, const char *newname)
|
||||||
{
|
{
|
||||||
char *buf;
|
char *buf;
|
||||||
char *p;
|
char *p;
|
||||||
|
@ -1036,6 +1037,17 @@ static void CleanupPlayerName(INT32 playernum, const char *newname)
|
||||||
|
|
||||||
tmpname = p;
|
tmpname = p;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* from EnsurePlayerNameIsGood */
|
||||||
|
if (!isprint(*p) || *p == ';' || (UINT8)*p >= 0x80)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
while (*++p) ;
|
||||||
|
|
||||||
|
if (*p)/* bad char found */
|
||||||
|
break;
|
||||||
|
|
||||||
// Remove trailing spaces.
|
// Remove trailing spaces.
|
||||||
p = &tmpname[strlen(tmpname)-1]; // last character
|
p = &tmpname[strlen(tmpname)-1]; // last character
|
||||||
while (*p == ' ' && p >= tmpname)
|
while (*p == ' ' && p >= tmpname)
|
||||||
|
@ -3737,9 +3749,15 @@ static void ExitMove_OnChange(void)
|
||||||
if (cv_exitmove.value)
|
if (cv_exitmove.value)
|
||||||
{
|
{
|
||||||
for (i = 0; i < MAXPLAYERS; ++i)
|
for (i = 0; i < MAXPLAYERS; ++i)
|
||||||
if (playeringame[i] && players[i].mo
|
if (playeringame[i] && players[i].mo)
|
||||||
&& players[i].mo->target && players[i].mo->target->type == MT_SIGN)
|
{
|
||||||
|
if (players[i].mo->target && players[i].mo->target->type == MT_SIGN)
|
||||||
P_SetTarget(&players[i].mo->target, NULL);
|
P_SetTarget(&players[i].mo->target, NULL);
|
||||||
|
|
||||||
|
if (players[i].pflags & PF_FINISHED)
|
||||||
|
P_GiveFinishFlags(&players[i]);
|
||||||
|
}
|
||||||
|
|
||||||
CONS_Printf(M_GetText("Players can now move after completing the level.\n"));
|
CONS_Printf(M_GetText("Players can now move after completing the level.\n"));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -194,6 +194,7 @@ typedef union {
|
||||||
// add game commands, needs cleanup
|
// add game commands, needs cleanup
|
||||||
void D_RegisterServerCommands(void);
|
void D_RegisterServerCommands(void);
|
||||||
void D_RegisterClientCommands(void);
|
void D_RegisterClientCommands(void);
|
||||||
|
void CleanupPlayerName(INT32 playernum, const char *newname);
|
||||||
boolean EnsurePlayerNameIsGood(char *name, INT32 playernum);
|
boolean EnsurePlayerNameIsGood(char *name, INT32 playernum);
|
||||||
void D_SendPlayerConfig(void);
|
void D_SendPlayerConfig(void);
|
||||||
void Command_ExitGame_f(void);
|
void Command_ExitGame_f(void);
|
||||||
|
|
|
@ -278,6 +278,7 @@ typedef enum
|
||||||
pw_nights_linkfreeze,
|
pw_nights_linkfreeze,
|
||||||
|
|
||||||
pw_nocontrol, //for linedef exec 427
|
pw_nocontrol, //for linedef exec 427
|
||||||
|
pw_justlaunched, // Launched off a slope this tic (0=none, 1=standard launch, 2=half-pipe launch)
|
||||||
|
|
||||||
NUMPOWERS
|
NUMPOWERS
|
||||||
} powertype_t;
|
} powertype_t;
|
||||||
|
@ -324,6 +325,8 @@ typedef struct player_s
|
||||||
// bounded/scaled total momentum.
|
// bounded/scaled total momentum.
|
||||||
fixed_t bob;
|
fixed_t bob;
|
||||||
|
|
||||||
|
angle_t viewrollangle;
|
||||||
|
|
||||||
// Mouse aiming, where the guy is looking at!
|
// Mouse aiming, where the guy is looking at!
|
||||||
// It is updated with cmd->aiming.
|
// It is updated with cmd->aiming.
|
||||||
angle_t aiming;
|
angle_t aiming;
|
||||||
|
|
184
src/dehacked.c
184
src/dehacked.c
|
@ -585,21 +585,30 @@ static void readfreeslots(MYFILE *f)
|
||||||
continue;
|
continue;
|
||||||
// Copy in the spr2 name and increment free_spr2.
|
// Copy in the spr2 name and increment free_spr2.
|
||||||
if (free_spr2 < NUMPLAYERSPRITES) {
|
if (free_spr2 < NUMPLAYERSPRITES) {
|
||||||
CONS_Printf("Sprite SPR2_%s allocated.\n",word);
|
|
||||||
strncpy(spr2names[free_spr2],word,4);
|
strncpy(spr2names[free_spr2],word,4);
|
||||||
spr2defaults[free_spr2] = 0;
|
spr2defaults[free_spr2] = 0;
|
||||||
spr2names[free_spr2++][4] = 0;
|
spr2names[free_spr2++][4] = 0;
|
||||||
} else
|
} else
|
||||||
CONS_Alert(CONS_WARNING, "Ran out of free SPR2 slots!\n");
|
deh_warning("Ran out of free SPR2 slots!\n");
|
||||||
}
|
}
|
||||||
else if (fastcmp(type, "TOL"))
|
else if (fastcmp(type, "TOL"))
|
||||||
{
|
{
|
||||||
if (lastcustomtol > 31)
|
// Search if we already have a typeoflevel by that name...
|
||||||
CONS_Alert(CONS_WARNING, "Ran out of free typeoflevel slots!\n");
|
for (i = 0; TYPEOFLEVEL[i].name; i++)
|
||||||
|
if (fastcmp(word, TYPEOFLEVEL[i].name))
|
||||||
|
break;
|
||||||
|
|
||||||
|
// We found it? Then don't allocate another one.
|
||||||
|
if (TYPEOFLEVEL[i].name)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// We don't, so freeslot it.
|
||||||
|
if (lastcustomtol == (UINT32)MAXTOL) // Unless you have way too many, since they're flags.
|
||||||
|
deh_warning("Ran out of free typeoflevel slots!\n");
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
G_AddTOL((1<<lastcustomtol), word);
|
G_AddTOL(lastcustomtol, word);
|
||||||
lastcustomtol++;
|
lastcustomtol <<= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1105,38 +1114,7 @@ static void readsprite2(MYFILE *f, INT32 num)
|
||||||
Z_Free(s);
|
Z_Free(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
INT32 numtolinfo = NUMBASETOL;
|
// copypasted from readPlayer :]
|
||||||
UINT32 lastcustomtol = 13;
|
|
||||||
|
|
||||||
tolinfo_t TYPEOFLEVEL[NUMMAXTOL] = {
|
|
||||||
{"SOLO",TOL_SP},
|
|
||||||
{"SP",TOL_SP},
|
|
||||||
{"SINGLEPLAYER",TOL_SP},
|
|
||||||
{"SINGLE",TOL_SP},
|
|
||||||
|
|
||||||
{"COOP",TOL_COOP},
|
|
||||||
{"CO-OP",TOL_COOP},
|
|
||||||
|
|
||||||
{"COMPETITION",TOL_COMPETITION},
|
|
||||||
{"RACE",TOL_RACE},
|
|
||||||
|
|
||||||
{"MATCH",TOL_MATCH},
|
|
||||||
{"TAG",TOL_TAG},
|
|
||||||
{"CTF",TOL_CTF},
|
|
||||||
|
|
||||||
{"2D",TOL_2D},
|
|
||||||
{"MARIO",TOL_MARIO},
|
|
||||||
{"NIGHTS",TOL_NIGHTS},
|
|
||||||
{"OLDBRAK",TOL_ERZ3},
|
|
||||||
|
|
||||||
{"XMAS",TOL_XMAS},
|
|
||||||
{"CHRISTMAS",TOL_XMAS},
|
|
||||||
{"WINTER",TOL_XMAS},
|
|
||||||
|
|
||||||
{NULL, 0}
|
|
||||||
};
|
|
||||||
|
|
||||||
// copypasted from readPlayer :sleep:
|
|
||||||
static const char *const GAMETYPERULE_LIST[];
|
static const char *const GAMETYPERULE_LIST[];
|
||||||
static void readgametype(MYFILE *f, char *gtname)
|
static void readgametype(MYFILE *f, char *gtname)
|
||||||
{
|
{
|
||||||
|
@ -1293,9 +1271,6 @@ static void readgametype(MYFILE *f, char *gtname)
|
||||||
UINT32 wordgt = 0;
|
UINT32 wordgt = 0;
|
||||||
for (j = 0; GAMETYPERULE_LIST[j]; j++)
|
for (j = 0; GAMETYPERULE_LIST[j]; j++)
|
||||||
if (fastcmp(word, GAMETYPERULE_LIST[j])) {
|
if (fastcmp(word, GAMETYPERULE_LIST[j])) {
|
||||||
if (!j) // GTR_CAMPAIGN
|
|
||||||
wordgt |= 1;
|
|
||||||
else
|
|
||||||
wordgt |= (1<<j);
|
wordgt |= (1<<j);
|
||||||
if (i || word2[0] == 'T' || word2[0] == 'Y')
|
if (i || word2[0] == 'T' || word2[0] == 'Y')
|
||||||
newgtrules |= wordgt;
|
newgtrules |= wordgt;
|
||||||
|
@ -1831,6 +1806,24 @@ static void readlevelheader(MYFILE *f, INT32 num)
|
||||||
else
|
else
|
||||||
mapheaderinfo[num-1]->levelflags &= ~LF_NOTITLECARD;
|
mapheaderinfo[num-1]->levelflags &= ~LF_NOTITLECARD;
|
||||||
}
|
}
|
||||||
|
else if (fastcmp(word, "SHOWTITLECARDFOR"))
|
||||||
|
{
|
||||||
|
mapheaderinfo[num-1]->levelflags |= LF_NOTITLECARD;
|
||||||
|
tmp = strtok(word2,",");
|
||||||
|
do {
|
||||||
|
if (fastcmp(tmp, "FIRST"))
|
||||||
|
mapheaderinfo[num-1]->levelflags &= ~LF_NOTITLECARDFIRST;
|
||||||
|
else if (fastcmp(tmp, "RESPAWN"))
|
||||||
|
mapheaderinfo[num-1]->levelflags &= ~LF_NOTITLECARDRESPAWN;
|
||||||
|
else if (fastcmp(tmp, "RECORDATTACK"))
|
||||||
|
mapheaderinfo[num-1]->levelflags &= ~LF_NOTITLECARDRECORDATTACK;
|
||||||
|
else if (fastcmp(tmp, "ALL"))
|
||||||
|
mapheaderinfo[num-1]->levelflags &= ~LF_NOTITLECARD;
|
||||||
|
else if (!fastcmp(tmp, "NONE"))
|
||||||
|
deh_warning("Level header %d: unknown titlecard show option %s\n", num, tmp);
|
||||||
|
|
||||||
|
} while((tmp = strtok(NULL,",")) != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
// Individual triggers for menu flags
|
// Individual triggers for menu flags
|
||||||
else if (fastcmp(word, "HIDDEN"))
|
else if (fastcmp(word, "HIDDEN"))
|
||||||
|
@ -4945,19 +4938,19 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_PLAY_SUPER_TRANS3",
|
"S_PLAY_SUPER_TRANS3",
|
||||||
"S_PLAY_SUPER_TRANS4",
|
"S_PLAY_SUPER_TRANS4",
|
||||||
"S_PLAY_SUPER_TRANS5",
|
"S_PLAY_SUPER_TRANS5",
|
||||||
"S_PLAY_SUPER_TRANS6", // This has special significance in the code. If you add more frames, search for it and make the appropriate changes.
|
"S_PLAY_SUPER_TRANS6",
|
||||||
|
|
||||||
// technically the player goes here but it's an infinite tic state
|
// technically the player goes here but it's an infinite tic state
|
||||||
"S_OBJPLACE_DUMMY",
|
"S_OBJPLACE_DUMMY",
|
||||||
|
|
||||||
// 1-Up Box Sprites (uses player sprite)
|
// 1-Up Box Sprites overlay (uses player sprite)
|
||||||
"S_PLAY_BOX1",
|
"S_PLAY_BOX1",
|
||||||
"S_PLAY_BOX2",
|
"S_PLAY_BOX2",
|
||||||
"S_PLAY_ICON1",
|
"S_PLAY_ICON1",
|
||||||
"S_PLAY_ICON2",
|
"S_PLAY_ICON2",
|
||||||
"S_PLAY_ICON3",
|
"S_PLAY_ICON3",
|
||||||
|
|
||||||
// Level end sign (uses player sprite)
|
// Level end sign overlay (uses player sprite)
|
||||||
"S_PLAY_SIGN",
|
"S_PLAY_SIGN",
|
||||||
|
|
||||||
// NiGHTS character (uses player sprite)
|
// NiGHTS character (uses player sprite)
|
||||||
|
@ -5205,7 +5198,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_ROBOHOOD_JUMP2",
|
"S_ROBOHOOD_JUMP2",
|
||||||
"S_ROBOHOOD_JUMP3",
|
"S_ROBOHOOD_JUMP3",
|
||||||
|
|
||||||
// CastleBot FaceStabber
|
// Castlebot Facestabber
|
||||||
"S_FACESTABBER_STND1",
|
"S_FACESTABBER_STND1",
|
||||||
"S_FACESTABBER_STND2",
|
"S_FACESTABBER_STND2",
|
||||||
"S_FACESTABBER_STND3",
|
"S_FACESTABBER_STND3",
|
||||||
|
@ -5425,6 +5418,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_EGGMOBILE_FLEE2",
|
"S_EGGMOBILE_FLEE2",
|
||||||
"S_EGGMOBILE_BALL",
|
"S_EGGMOBILE_BALL",
|
||||||
"S_EGGMOBILE_TARGET",
|
"S_EGGMOBILE_TARGET",
|
||||||
|
|
||||||
"S_BOSSEGLZ1",
|
"S_BOSSEGLZ1",
|
||||||
"S_BOSSEGLZ2",
|
"S_BOSSEGLZ2",
|
||||||
|
|
||||||
|
@ -5477,7 +5471,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_EGGMOBILE3_FLEE1",
|
"S_EGGMOBILE3_FLEE1",
|
||||||
"S_EGGMOBILE3_FLEE2",
|
"S_EGGMOBILE3_FLEE2",
|
||||||
|
|
||||||
// Boss 3 pinch
|
// Boss 3 Pinch
|
||||||
"S_FAKEMOBILE_INIT",
|
"S_FAKEMOBILE_INIT",
|
||||||
"S_FAKEMOBILE",
|
"S_FAKEMOBILE",
|
||||||
"S_FAKEMOBILE_ATK1",
|
"S_FAKEMOBILE_ATK1",
|
||||||
|
@ -5493,7 +5487,6 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_BOSSSEBH2",
|
"S_BOSSSEBH2",
|
||||||
|
|
||||||
// Boss 3 Shockwave
|
// Boss 3 Shockwave
|
||||||
|
|
||||||
"S_SHOCKWAVE1",
|
"S_SHOCKWAVE1",
|
||||||
"S_SHOCKWAVE2",
|
"S_SHOCKWAVE2",
|
||||||
|
|
||||||
|
@ -5530,9 +5523,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_JETFLAME",
|
"S_JETFLAME",
|
||||||
|
|
||||||
// Boss 4 Spectator Eggrobo
|
// Boss 4 Spectator Eggrobo
|
||||||
"S_EGGROBO1_IDLE",
|
"S_EGGROBO1_STND",
|
||||||
"S_EGGROBO1_BSLAP1",
|
"S_EGGROBO1_BSLAP1",
|
||||||
"S_EGGROBO2_BSLAP2",
|
"S_EGGROBO1_BSLAP2",
|
||||||
"S_EGGROBO1_PISSED",
|
"S_EGGROBO1_PISSED",
|
||||||
|
|
||||||
// Boss 4 Spectator Eggrobo jet flame
|
// Boss 4 Spectator Eggrobo jet flame
|
||||||
|
@ -5776,7 +5769,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_CYBRAKDEMON_NAPALM_ATTACK1",
|
"S_CYBRAKDEMON_NAPALM_ATTACK1",
|
||||||
"S_CYBRAKDEMON_NAPALM_ATTACK2",
|
"S_CYBRAKDEMON_NAPALM_ATTACK2",
|
||||||
"S_CYBRAKDEMON_NAPALM_ATTACK3",
|
"S_CYBRAKDEMON_NAPALM_ATTACK3",
|
||||||
"S_CYBRAKDEMON_FINISH_ATTACK", // If just attacked, remove MF2_FRET w/out going back to spawnstate
|
"S_CYBRAKDEMON_FINISH_ATTACK1", // If just attacked, remove MF2_FRET w/out going back to spawnstate
|
||||||
"S_CYBRAKDEMON_FINISH_ATTACK2", // Force a delay between attacks so you don't get bombarded with them back-to-back
|
"S_CYBRAKDEMON_FINISH_ATTACK2", // Force a delay between attacks so you don't get bombarded with them back-to-back
|
||||||
"S_CYBRAKDEMON_PAIN1",
|
"S_CYBRAKDEMON_PAIN1",
|
||||||
"S_CYBRAKDEMON_PAIN2",
|
"S_CYBRAKDEMON_PAIN2",
|
||||||
|
@ -6470,7 +6463,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_LITTLETUMBLEWEED_ROLL7",
|
"S_LITTLETUMBLEWEED_ROLL7",
|
||||||
"S_LITTLETUMBLEWEED_ROLL8",
|
"S_LITTLETUMBLEWEED_ROLL8",
|
||||||
|
|
||||||
// Cacti Sprites
|
// Cacti
|
||||||
"S_CACTI1",
|
"S_CACTI1",
|
||||||
"S_CACTI2",
|
"S_CACTI2",
|
||||||
"S_CACTI3",
|
"S_CACTI3",
|
||||||
|
@ -6485,7 +6478,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_CACTITINYSEG",
|
"S_CACTITINYSEG",
|
||||||
"S_CACTISMALLSEG",
|
"S_CACTISMALLSEG",
|
||||||
|
|
||||||
// Warning signs sprites
|
// Warning signs
|
||||||
"S_ARIDSIGN_CAUTION",
|
"S_ARIDSIGN_CAUTION",
|
||||||
"S_ARIDSIGN_CACTI",
|
"S_ARIDSIGN_CACTI",
|
||||||
"S_ARIDSIGN_SHARPTURN",
|
"S_ARIDSIGN_SHARPTURN",
|
||||||
|
@ -6502,6 +6495,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_TNTBARREL_EXPL4",
|
"S_TNTBARREL_EXPL4",
|
||||||
"S_TNTBARREL_EXPL5",
|
"S_TNTBARREL_EXPL5",
|
||||||
"S_TNTBARREL_EXPL6",
|
"S_TNTBARREL_EXPL6",
|
||||||
|
"S_TNTBARREL_EXPL7",
|
||||||
"S_TNTBARREL_FLYING",
|
"S_TNTBARREL_FLYING",
|
||||||
|
|
||||||
// TNT proximity shell
|
// TNT proximity shell
|
||||||
|
@ -7348,6 +7342,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_BHORIZ7",
|
"S_BHORIZ7",
|
||||||
"S_BHORIZ8",
|
"S_BHORIZ8",
|
||||||
|
|
||||||
|
// Booster
|
||||||
"S_BOOSTERSOUND",
|
"S_BOOSTERSOUND",
|
||||||
"S_YELLOWBOOSTERROLLER",
|
"S_YELLOWBOOSTERROLLER",
|
||||||
"S_YELLOWBOOSTERSEG_LEFT",
|
"S_YELLOWBOOSTERSEG_LEFT",
|
||||||
|
@ -7378,7 +7373,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_SPLISH8",
|
"S_SPLISH8",
|
||||||
"S_SPLISH9",
|
"S_SPLISH9",
|
||||||
|
|
||||||
// Lava splish
|
// Lava Splish
|
||||||
"S_LAVASPLISH",
|
"S_LAVASPLISH",
|
||||||
|
|
||||||
// added water splash
|
// added water splash
|
||||||
|
@ -7483,6 +7478,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
// Got Flag Sign
|
// Got Flag Sign
|
||||||
"S_GOTFLAG",
|
"S_GOTFLAG",
|
||||||
|
|
||||||
|
// Finish flag
|
||||||
|
"S_FINISHFLAG",
|
||||||
|
|
||||||
"S_CORK",
|
"S_CORK",
|
||||||
"S_LHRT",
|
"S_LHRT",
|
||||||
|
|
||||||
|
@ -7974,6 +7972,8 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_ROCKCRUMBLEN",
|
"S_ROCKCRUMBLEN",
|
||||||
"S_ROCKCRUMBLEO",
|
"S_ROCKCRUMBLEO",
|
||||||
"S_ROCKCRUMBLEP",
|
"S_ROCKCRUMBLEP",
|
||||||
|
|
||||||
|
// Level debris
|
||||||
"S_GFZDEBRIS",
|
"S_GFZDEBRIS",
|
||||||
"S_BRICKDEBRIS",
|
"S_BRICKDEBRIS",
|
||||||
"S_WOODDEBRIS",
|
"S_WOODDEBRIS",
|
||||||
|
@ -7993,7 +7993,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_THOK", // Thok! mobj
|
"MT_THOK", // Thok! mobj
|
||||||
"MT_PLAYER",
|
"MT_PLAYER",
|
||||||
"MT_TAILSOVERLAY", // c:
|
"MT_TAILSOVERLAY", // c:
|
||||||
"MT_METALJETFUME", // [:
|
"MT_METALJETFUME",
|
||||||
|
|
||||||
// Enemies
|
// Enemies
|
||||||
"MT_BLUECRAWLA", // Crawla (Blue)
|
"MT_BLUECRAWLA", // Crawla (Blue)
|
||||||
|
@ -8110,7 +8110,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_CYBRAKDEMON_NAPALM_FLAMES",
|
"MT_CYBRAKDEMON_NAPALM_FLAMES",
|
||||||
"MT_CYBRAKDEMON_VILE_EXPLOSION",
|
"MT_CYBRAKDEMON_VILE_EXPLOSION",
|
||||||
|
|
||||||
// Metal Sonic
|
// Metal Sonic (Boss 9)
|
||||||
"MT_METALSONIC_RACE",
|
"MT_METALSONIC_RACE",
|
||||||
"MT_METALSONIC_BATTLE",
|
"MT_METALSONIC_BATTLE",
|
||||||
"MT_MSSHIELD_FRONT",
|
"MT_MSSHIELD_FRONT",
|
||||||
|
@ -8124,7 +8124,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_BOMBSPHERE",
|
"MT_BOMBSPHERE",
|
||||||
"MT_REDTEAMRING", //Rings collectable by red team.
|
"MT_REDTEAMRING", //Rings collectable by red team.
|
||||||
"MT_BLUETEAMRING", //Rings collectable by blue team.
|
"MT_BLUETEAMRING", //Rings collectable by blue team.
|
||||||
"MT_TOKEN", // Special Stage Token
|
"MT_TOKEN", // Special Stage token for special stage
|
||||||
"MT_REDFLAG", // Red CTF Flag
|
"MT_REDFLAG", // Red CTF Flag
|
||||||
"MT_BLUEFLAG", // Blue CTF Flag
|
"MT_BLUEFLAG", // Blue CTF Flag
|
||||||
"MT_EMBLEM",
|
"MT_EMBLEM",
|
||||||
|
@ -8350,22 +8350,22 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
// Arid Canyon Scenery
|
// Arid Canyon Scenery
|
||||||
"MT_BIGTUMBLEWEED",
|
"MT_BIGTUMBLEWEED",
|
||||||
"MT_LITTLETUMBLEWEED",
|
"MT_LITTLETUMBLEWEED",
|
||||||
"MT_CACTI1",
|
"MT_CACTI1", // Tiny Red Flower Cactus
|
||||||
"MT_CACTI2",
|
"MT_CACTI2", // Small Red Flower Cactus
|
||||||
"MT_CACTI3",
|
"MT_CACTI3", // Tiny Blue Flower Cactus
|
||||||
"MT_CACTI4",
|
"MT_CACTI4", // Small Blue Flower Cactus
|
||||||
"MT_CACTI5",
|
"MT_CACTI5", // Prickly Pear
|
||||||
"MT_CACTI6",
|
"MT_CACTI6", // Barrel Cactus
|
||||||
"MT_CACTI7",
|
"MT_CACTI7", // Tall Barrel Cactus
|
||||||
"MT_CACTI8",
|
"MT_CACTI8", // Armed Cactus
|
||||||
"MT_CACTI9",
|
"MT_CACTI9", // Ball Cactus
|
||||||
"MT_CACTI10",
|
"MT_CACTI10", // Tiny Cactus
|
||||||
"MT_CACTI11",
|
"MT_CACTI11", // Small Cactus
|
||||||
"MT_CACTITINYSEG",
|
"MT_CACTITINYSEG", // Tiny Cactus Segment
|
||||||
"MT_CACTISMALLSEG",
|
"MT_CACTISMALLSEG", // Small Cactus Segment
|
||||||
"MT_ARIDSIGN_CAUTION",
|
"MT_ARIDSIGN_CAUTION", // Caution Sign
|
||||||
"MT_ARIDSIGN_CACTI",
|
"MT_ARIDSIGN_CACTI", // Cacti Sign
|
||||||
"MT_ARIDSIGN_SHARPTURN",
|
"MT_ARIDSIGN_SHARPTURN", // Sharp Turn Sign
|
||||||
"MT_OILLAMP",
|
"MT_OILLAMP",
|
||||||
"MT_TNTBARREL",
|
"MT_TNTBARREL",
|
||||||
"MT_PROXIMITYTNT",
|
"MT_PROXIMITYTNT",
|
||||||
|
@ -8420,7 +8420,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_GLAREGOYLEUP",
|
"MT_GLAREGOYLEUP",
|
||||||
"MT_GLAREGOYLEDOWN",
|
"MT_GLAREGOYLEDOWN",
|
||||||
"MT_GLAREGOYLELONG",
|
"MT_GLAREGOYLELONG",
|
||||||
"MT_TARGET",
|
"MT_TARGET", // AKA Red Crystal
|
||||||
"MT_GREENFLAME",
|
"MT_GREENFLAME",
|
||||||
"MT_BLUEGARGOYLE",
|
"MT_BLUEGARGOYLE",
|
||||||
|
|
||||||
|
@ -8471,7 +8471,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_HHZSTALAGMITE_TALL",
|
"MT_HHZSTALAGMITE_TALL",
|
||||||
"MT_HHZSTALAGMITE_SHORT",
|
"MT_HHZSTALAGMITE_SHORT",
|
||||||
|
|
||||||
// Botanic Serenity
|
// Botanic Serenity scenery
|
||||||
"MT_BSZTALLFLOWER_RED",
|
"MT_BSZTALLFLOWER_RED",
|
||||||
"MT_BSZTALLFLOWER_PURPLE",
|
"MT_BSZTALLFLOWER_PURPLE",
|
||||||
"MT_BSZTALLFLOWER_BLUE",
|
"MT_BSZTALLFLOWER_BLUE",
|
||||||
|
@ -8601,6 +8601,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_LOCKONINF", // In-level Target
|
"MT_LOCKONINF", // In-level Target
|
||||||
"MT_TAG", // Tag Sign
|
"MT_TAG", // Tag Sign
|
||||||
"MT_GOTFLAG", // Got Flag sign
|
"MT_GOTFLAG", // Got Flag sign
|
||||||
|
"MT_FINISHFLAG", // Finish flag
|
||||||
|
|
||||||
// Ambient Sounds
|
// Ambient Sounds
|
||||||
"MT_AWATERA", // Ambient Water Sound 1
|
"MT_AWATERA", // Ambient Water Sound 1
|
||||||
|
@ -8751,6 +8752,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_ROCKCRUMBLE14",
|
"MT_ROCKCRUMBLE14",
|
||||||
"MT_ROCKCRUMBLE15",
|
"MT_ROCKCRUMBLE15",
|
||||||
"MT_ROCKCRUMBLE16",
|
"MT_ROCKCRUMBLE16",
|
||||||
|
|
||||||
|
// Level debris
|
||||||
"MT_GFZDEBRIS",
|
"MT_GFZDEBRIS",
|
||||||
"MT_BRICKDEBRIS",
|
"MT_BRICKDEBRIS",
|
||||||
"MT_WOODDEBRIS",
|
"MT_WOODDEBRIS",
|
||||||
|
@ -8989,9 +8992,11 @@ static const char *COLOR_ENUMS[] = {
|
||||||
// Desaturated
|
// Desaturated
|
||||||
"AETHER", // SKINCOLOR_AETHER,
|
"AETHER", // SKINCOLOR_AETHER,
|
||||||
"SLATE", // SKINCOLOR_SLATE,
|
"SLATE", // SKINCOLOR_SLATE,
|
||||||
|
"BLUEBELL", // SKINCOLOR_BLUEBELL,
|
||||||
"PINK", // SKINCOLOR_PINK,
|
"PINK", // SKINCOLOR_PINK,
|
||||||
"YOGURT", // SKINCOLOR_YOGURT,
|
"YOGURT", // SKINCOLOR_YOGURT,
|
||||||
"BROWN", // SKINCOLOR_BROWN,
|
"BROWN", // SKINCOLOR_BROWN,
|
||||||
|
"BRONZE", // SKINCOLOR_BRONZE,
|
||||||
"TAN", // SKINCOLOR_TAN,
|
"TAN", // SKINCOLOR_TAN,
|
||||||
"BEIGE", // SKINCOLOR_BEIGE,
|
"BEIGE", // SKINCOLOR_BEIGE,
|
||||||
"MOSS", // SKINCOLOR_MOSS,
|
"MOSS", // SKINCOLOR_MOSS,
|
||||||
|
@ -9004,9 +9009,11 @@ static const char *COLOR_ENUMS[] = {
|
||||||
"RED", // SKINCOLOR_RED,
|
"RED", // SKINCOLOR_RED,
|
||||||
"CRIMSON", // SKINCOLOR_CRIMSON,
|
"CRIMSON", // SKINCOLOR_CRIMSON,
|
||||||
"FLAME", // SKINCOLOR_FLAME,
|
"FLAME", // SKINCOLOR_FLAME,
|
||||||
|
"KETCHUP", // SKINCOLOR_KETCHUP,
|
||||||
"PEACHY", // SKINCOLOR_PEACHY,
|
"PEACHY", // SKINCOLOR_PEACHY,
|
||||||
"QUAIL", // SKINCOLOR_QUAIL,
|
"QUAIL", // SKINCOLOR_QUAIL,
|
||||||
"SUNSET", // SKINCOLOR_SUNSET,
|
"SUNSET", // SKINCOLOR_SUNSET,
|
||||||
|
"COPPER", // SKINCOLOR_COPPER,
|
||||||
"APRICOT", // SKINCOLOR_APRICOT,
|
"APRICOT", // SKINCOLOR_APRICOT,
|
||||||
"ORANGE", // SKINCOLOR_ORANGE,
|
"ORANGE", // SKINCOLOR_ORANGE,
|
||||||
"RUST", // SKINCOLOR_RUST,
|
"RUST", // SKINCOLOR_RUST,
|
||||||
|
@ -9016,6 +9023,7 @@ static const char *COLOR_ENUMS[] = {
|
||||||
"OLIVE", // SKINCOLOR_OLIVE,
|
"OLIVE", // SKINCOLOR_OLIVE,
|
||||||
"LIME", // SKINCOLOR_LIME,
|
"LIME", // SKINCOLOR_LIME,
|
||||||
"PERIDOT", // SKINCOLOR_PERIDOT,
|
"PERIDOT", // SKINCOLOR_PERIDOT,
|
||||||
|
"APPLE", // SKINCOLOR_APPLE,
|
||||||
"GREEN", // SKINCOLOR_GREEN,
|
"GREEN", // SKINCOLOR_GREEN,
|
||||||
"FOREST", // SKINCOLOR_FOREST,
|
"FOREST", // SKINCOLOR_FOREST,
|
||||||
"EMERALD", // SKINCOLOR_EMERALD,
|
"EMERALD", // SKINCOLOR_EMERALD,
|
||||||
|
@ -9042,6 +9050,7 @@ static const char *COLOR_ENUMS[] = {
|
||||||
"VIOLET", // SKINCOLOR_VIOLET,
|
"VIOLET", // SKINCOLOR_VIOLET,
|
||||||
"LILAC", // SKINCOLOR_LILAC,
|
"LILAC", // SKINCOLOR_LILAC,
|
||||||
"PLUM", // SKINCOLOR_PLUM,
|
"PLUM", // SKINCOLOR_PLUM,
|
||||||
|
"RASPBERRY", // SKINCOLOR_RASPBERRY,
|
||||||
"ROSY", // SKINCOLOR_ROSY,
|
"ROSY", // SKINCOLOR_ROSY,
|
||||||
|
|
||||||
// Super special awesome Super flashing colors!
|
// Super special awesome Super flashing colors!
|
||||||
|
@ -9135,7 +9144,8 @@ static const char *const POWERS_LIST[] = {
|
||||||
"NIGHTS_LINKFREEZE",
|
"NIGHTS_LINKFREEZE",
|
||||||
|
|
||||||
//for linedef exec 427
|
//for linedef exec 427
|
||||||
"NOCONTROL"
|
"NOCONTROL",
|
||||||
|
"JUSTLAUNCHED",
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *const HUDITEMS_LIST[] = {
|
static const char *const HUDITEMS_LIST[] = {
|
||||||
|
@ -9372,6 +9382,9 @@ struct {
|
||||||
{"LF_NOZONE",LF_NOZONE},
|
{"LF_NOZONE",LF_NOZONE},
|
||||||
{"LF_SAVEGAME",LF_SAVEGAME},
|
{"LF_SAVEGAME",LF_SAVEGAME},
|
||||||
{"LF_MIXNIGHTSCOUNTDOWN",LF_MIXNIGHTSCOUNTDOWN},
|
{"LF_MIXNIGHTSCOUNTDOWN",LF_MIXNIGHTSCOUNTDOWN},
|
||||||
|
{"LF_NOTITLECARDFIRST",LF_NOTITLECARDFIRST},
|
||||||
|
{"LF_NOTITLECARDRESPAWN",LF_NOTITLECARDRESPAWN},
|
||||||
|
{"LF_NOTITLECARDRECORDATTACK",LF_NOTITLECARDRECORDATTACK},
|
||||||
{"LF_NOTITLECARD",LF_NOTITLECARD},
|
{"LF_NOTITLECARD",LF_NOTITLECARD},
|
||||||
{"LF_WARNINGTITLE",LF_WARNINGTITLE},
|
{"LF_WARNINGTITLE",LF_WARNINGTITLE},
|
||||||
// And map flags
|
// And map flags
|
||||||
|
@ -10465,18 +10478,25 @@ static inline int lib_freeslot(lua_State *L)
|
||||||
}
|
}
|
||||||
else if (fastcmp(type, "TOL"))
|
else if (fastcmp(type, "TOL"))
|
||||||
{
|
{
|
||||||
if (lastcustomtol > 31)
|
// Search if we already have a typeoflevel by that name...
|
||||||
|
int i;
|
||||||
|
for (i = 0; TYPEOFLEVEL[i].name; i++)
|
||||||
|
if (fastcmp(word, TYPEOFLEVEL[i].name))
|
||||||
|
break;
|
||||||
|
|
||||||
|
// We don't, so allocate a new one.
|
||||||
|
if (TYPEOFLEVEL[i].name == NULL) {
|
||||||
|
if (lastcustomtol == (UINT32)MAXTOL) // Unless you have way too many, since they're flags.
|
||||||
CONS_Alert(CONS_WARNING, "Ran out of free typeoflevel slots!\n");
|
CONS_Alert(CONS_WARNING, "Ran out of free typeoflevel slots!\n");
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
UINT32 newtol = (1<<lastcustomtol);
|
|
||||||
CONS_Printf("TypeOfLevel TOL_%s allocated.\n",word);
|
CONS_Printf("TypeOfLevel TOL_%s allocated.\n",word);
|
||||||
G_AddTOL(newtol, word);
|
G_AddTOL(lastcustomtol, word);
|
||||||
lua_pushinteger(L, newtol);
|
lua_pushinteger(L, lastcustomtol);
|
||||||
lastcustomtol++;
|
lastcustomtol <<= 1;
|
||||||
r++;
|
r++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Z_Free(s);
|
Z_Free(s);
|
||||||
lua_remove(L, 1);
|
lua_remove(L, 1);
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -143,9 +143,9 @@ extern char logfilename[1024];
|
||||||
// we use comprevision and compbranch instead.
|
// we use comprevision and compbranch instead.
|
||||||
#else
|
#else
|
||||||
#define VERSION 202 // Game version
|
#define VERSION 202 // Game version
|
||||||
#define SUBVERSION 0 // more precise version number
|
#define SUBVERSION 1 // more precise version number
|
||||||
#define VERSIONSTRING "v2.2.0"
|
#define VERSIONSTRING "v2.2.1"
|
||||||
#define VERSIONSTRINGW L"v2.2.0"
|
#define VERSIONSTRINGW L"v2.2.1"
|
||||||
// Hey! If you change this, add 1 to the MODVERSION below!
|
// Hey! If you change this, add 1 to the MODVERSION below!
|
||||||
// Otherwise we can't force updates!
|
// Otherwise we can't force updates!
|
||||||
#endif
|
#endif
|
||||||
|
@ -210,7 +210,7 @@ extern char logfilename[1024];
|
||||||
// it's only for detection of the version the player is using so the MS can alert them of an update.
|
// it's only for detection of the version the player is using so the MS can alert them of an update.
|
||||||
// Only set it higher, not lower, obviously.
|
// Only set it higher, not lower, obviously.
|
||||||
// Note that we use this to help keep internal testing in check; this is why v2.2.0 is not version "1".
|
// Note that we use this to help keep internal testing in check; this is why v2.2.0 is not version "1".
|
||||||
#define MODVERSION 40
|
#define MODVERSION 41
|
||||||
|
|
||||||
// To version config.cfg, MAJOREXECVERSION is set equal to MODVERSION automatically.
|
// To version config.cfg, MAJOREXECVERSION is set equal to MODVERSION automatically.
|
||||||
// Increment MINOREXECVERSION whenever a config change is needed that does not correspond
|
// Increment MINOREXECVERSION whenever a config change is needed that does not correspond
|
||||||
|
@ -253,9 +253,11 @@ typedef enum
|
||||||
// Desaturated
|
// Desaturated
|
||||||
SKINCOLOR_AETHER,
|
SKINCOLOR_AETHER,
|
||||||
SKINCOLOR_SLATE,
|
SKINCOLOR_SLATE,
|
||||||
|
SKINCOLOR_BLUEBELL,
|
||||||
SKINCOLOR_PINK,
|
SKINCOLOR_PINK,
|
||||||
SKINCOLOR_YOGURT,
|
SKINCOLOR_YOGURT,
|
||||||
SKINCOLOR_BROWN,
|
SKINCOLOR_BROWN,
|
||||||
|
SKINCOLOR_BRONZE,
|
||||||
SKINCOLOR_TAN,
|
SKINCOLOR_TAN,
|
||||||
SKINCOLOR_BEIGE,
|
SKINCOLOR_BEIGE,
|
||||||
SKINCOLOR_MOSS,
|
SKINCOLOR_MOSS,
|
||||||
|
@ -268,9 +270,11 @@ typedef enum
|
||||||
SKINCOLOR_RED,
|
SKINCOLOR_RED,
|
||||||
SKINCOLOR_CRIMSON,
|
SKINCOLOR_CRIMSON,
|
||||||
SKINCOLOR_FLAME,
|
SKINCOLOR_FLAME,
|
||||||
|
SKINCOLOR_KETCHUP,
|
||||||
SKINCOLOR_PEACHY,
|
SKINCOLOR_PEACHY,
|
||||||
SKINCOLOR_QUAIL,
|
SKINCOLOR_QUAIL,
|
||||||
SKINCOLOR_SUNSET,
|
SKINCOLOR_SUNSET,
|
||||||
|
SKINCOLOR_COPPER,
|
||||||
SKINCOLOR_APRICOT,
|
SKINCOLOR_APRICOT,
|
||||||
SKINCOLOR_ORANGE,
|
SKINCOLOR_ORANGE,
|
||||||
SKINCOLOR_RUST,
|
SKINCOLOR_RUST,
|
||||||
|
@ -280,6 +284,7 @@ typedef enum
|
||||||
SKINCOLOR_OLIVE,
|
SKINCOLOR_OLIVE,
|
||||||
SKINCOLOR_LIME,
|
SKINCOLOR_LIME,
|
||||||
SKINCOLOR_PERIDOT,
|
SKINCOLOR_PERIDOT,
|
||||||
|
SKINCOLOR_APPLE,
|
||||||
SKINCOLOR_GREEN,
|
SKINCOLOR_GREEN,
|
||||||
SKINCOLOR_FOREST,
|
SKINCOLOR_FOREST,
|
||||||
SKINCOLOR_EMERALD,
|
SKINCOLOR_EMERALD,
|
||||||
|
@ -306,6 +311,7 @@ typedef enum
|
||||||
SKINCOLOR_VIOLET,
|
SKINCOLOR_VIOLET,
|
||||||
SKINCOLOR_LILAC,
|
SKINCOLOR_LILAC,
|
||||||
SKINCOLOR_PLUM,
|
SKINCOLOR_PLUM,
|
||||||
|
SKINCOLOR_RASPBERRY,
|
||||||
SKINCOLOR_ROSY,
|
SKINCOLOR_ROSY,
|
||||||
|
|
||||||
// SKINCOLOR_? - one left before we bump up against 0x39, which isn't a HARD limit anymore but would be excessive
|
// SKINCOLOR_? - one left before we bump up against 0x39, which isn't a HARD limit anymore but would be excessive
|
||||||
|
@ -490,6 +496,7 @@ extern INT32 cv_debug;
|
||||||
#define DBG_SETUP 0x0400
|
#define DBG_SETUP 0x0400
|
||||||
#define DBG_LUA 0x0800
|
#define DBG_LUA 0x0800
|
||||||
#define DBG_RANDOMIZER 0x1000
|
#define DBG_RANDOMIZER 0x1000
|
||||||
|
#define DBG_VIEWMORPH 0x2000
|
||||||
|
|
||||||
// =======================
|
// =======================
|
||||||
// Misc stuff for later...
|
// Misc stuff for later...
|
||||||
|
|
|
@ -351,15 +351,19 @@ typedef struct
|
||||||
} mapheader_t;
|
} mapheader_t;
|
||||||
|
|
||||||
// level flags
|
// level flags
|
||||||
#define LF_SCRIPTISFILE 1 ///< True if the script is a file, not a lump.
|
#define LF_SCRIPTISFILE (1<<0) ///< True if the script is a file, not a lump.
|
||||||
#define LF_SPEEDMUSIC 2 ///< Speed up act music for super sneakers
|
#define LF_SPEEDMUSIC (1<<1) ///< Speed up act music for super sneakers
|
||||||
#define LF_NOSSMUSIC 4 ///< Disable Super Sonic music
|
#define LF_NOSSMUSIC (1<<2) ///< Disable Super Sonic music
|
||||||
#define LF_NORELOAD 8 ///< Don't reload level on death
|
#define LF_NORELOAD (1<<3) ///< Don't reload level on death
|
||||||
#define LF_NOZONE 16 ///< Don't include "ZONE" on level title
|
#define LF_NOZONE (1<<4) ///< Don't include "ZONE" on level title
|
||||||
#define LF_SAVEGAME 32 ///< Save the game upon loading this level
|
#define LF_SAVEGAME (1<<5) ///< Save the game upon loading this level
|
||||||
#define LF_MIXNIGHTSCOUNTDOWN 64 ///< Play sfx_timeup instead of music change for NiGHTS countdown
|
#define LF_MIXNIGHTSCOUNTDOWN (1<<6) ///< Play sfx_timeup instead of music change for NiGHTS countdown
|
||||||
#define LF_WARNINGTITLE 128 ///< WARNING! WARNING! WARNING! WARNING!
|
#define LF_WARNINGTITLE (1<<7) ///< WARNING! WARNING! WARNING! WARNING!
|
||||||
#define LF_NOTITLECARD 256 ///< Don't start the title card
|
|
||||||
|
#define LF_NOTITLECARDFIRST (1<<8)
|
||||||
|
#define LF_NOTITLECARDRESPAWN (1<<9)
|
||||||
|
#define LF_NOTITLECARDRECORDATTACK (1<<10)
|
||||||
|
#define LF_NOTITLECARD (LF_NOTITLECARDFIRST|LF_NOTITLECARDRESPAWN|LF_NOTITLECARDRECORDATTACK) ///< Don't start the title card at all
|
||||||
|
|
||||||
#define LF2_HIDEINMENU 1 ///< Hide in the multiplayer menu
|
#define LF2_HIDEINMENU 1 ///< Hide in the multiplayer menu
|
||||||
#define LF2_HIDEINSTATS 2 ///< Hide in the statistics screen
|
#define LF2_HIDEINSTATS 2 ///< Hide in the statistics screen
|
||||||
|
@ -437,6 +441,7 @@ extern const char *Gametype_ConstantNames[NUMGAMETYPES];
|
||||||
extern INT32 pointlimits[NUMGAMETYPES];
|
extern INT32 pointlimits[NUMGAMETYPES];
|
||||||
extern INT32 timelimits[NUMGAMETYPES];
|
extern INT32 timelimits[NUMGAMETYPES];
|
||||||
|
|
||||||
|
// TypeOfLevel things
|
||||||
enum TypeOfLevel
|
enum TypeOfLevel
|
||||||
{
|
{
|
||||||
TOL_SP = 0x01, ///< Single Player
|
TOL_SP = 0x01, ///< Single Player
|
||||||
|
@ -461,16 +466,16 @@ enum TypeOfLevel
|
||||||
TOL_XMAS = 0x1000, ///< Christmas NiGHTS
|
TOL_XMAS = 0x1000, ///< Christmas NiGHTS
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NUMBASETOL 18
|
#define MAXTOL (1<<31)
|
||||||
#define NUMMAXTOL (18 + NUMGAMETYPEFREESLOTS)
|
#define NUMBASETOLNAMES (19)
|
||||||
|
#define NUMTOLNAMES (NUMBASETOLNAMES + NUMGAMETYPEFREESLOTS)
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
UINT32 flag;
|
UINT32 flag;
|
||||||
} tolinfo_t;
|
} tolinfo_t;
|
||||||
extern tolinfo_t TYPEOFLEVEL[NUMMAXTOL];
|
extern tolinfo_t TYPEOFLEVEL[NUMTOLNAMES];
|
||||||
extern INT32 numtolinfo;
|
|
||||||
extern UINT32 lastcustomtol;
|
extern UINT32 lastcustomtol;
|
||||||
|
|
||||||
extern tic_t totalplaytime;
|
extern tic_t totalplaytime;
|
||||||
|
|
|
@ -1120,6 +1120,9 @@ static const char *credits[] = {
|
||||||
"\1Sonic Robo Blast II",
|
"\1Sonic Robo Blast II",
|
||||||
"\1Credits",
|
"\1Credits",
|
||||||
"",
|
"",
|
||||||
|
"\1Producer",
|
||||||
|
"Rob Tisdell",
|
||||||
|
"",
|
||||||
"\1Game Design",
|
"\1Game Design",
|
||||||
"Ben \"Mystic\" Geyer",
|
"Ben \"Mystic\" Geyer",
|
||||||
"\"SSNTails\"",
|
"\"SSNTails\"",
|
||||||
|
@ -1234,7 +1237,7 @@ static const char *credits[] = {
|
||||||
"Thomas \"Shadow Hog\" Igoe",
|
"Thomas \"Shadow Hog\" Igoe",
|
||||||
"Alexander \"DrTapeworm\" Moench-Ford",
|
"Alexander \"DrTapeworm\" Moench-Ford",
|
||||||
"\"Kaito Sinclaire\"",
|
"\"Kaito Sinclaire\"",
|
||||||
"\"QueenDelta\"",
|
"Anna \"QueenDelta\" Sandlin",
|
||||||
"Wessel \"sphere\" Smit",
|
"Wessel \"sphere\" Smit",
|
||||||
"\"Spazzo\"",
|
"\"Spazzo\"",
|
||||||
"\"SSNTails\"",
|
"\"SSNTails\"",
|
||||||
|
@ -1258,7 +1261,7 @@ static const char *credits[] = {
|
||||||
"Cody \"SRB2 Playah\" Koester",
|
"Cody \"SRB2 Playah\" Koester",
|
||||||
"Skye \"OmegaVelocity\" Meredith",
|
"Skye \"OmegaVelocity\" Meredith",
|
||||||
"Stephen \"HEDGESMFG\" Moellering",
|
"Stephen \"HEDGESMFG\" Moellering",
|
||||||
"Nick \"ST218\" Molina",
|
"Rosalie \"ST218\" Molina",
|
||||||
"Samuel \"Prime 2.0\" Peters",
|
"Samuel \"Prime 2.0\" Peters",
|
||||||
"Colin \"Sonict\" Pfaff",
|
"Colin \"Sonict\" Pfaff",
|
||||||
"Bill \"Tets\" Reed",
|
"Bill \"Tets\" Reed",
|
||||||
|
|
|
@ -192,8 +192,7 @@ void F_WipeStageTitle(void)
|
||||||
// draw level title
|
// draw level title
|
||||||
if ((WipeStageTitle && st_overlay)
|
if ((WipeStageTitle && st_overlay)
|
||||||
&& (wipestyle == WIPESTYLE_COLORMAP)
|
&& (wipestyle == WIPESTYLE_COLORMAP)
|
||||||
&& !(mapheaderinfo[gamemap-1]->levelflags & LF_NOTITLECARD)
|
&& G_IsTitleCardAvailable())
|
||||||
&& *mapheaderinfo[gamemap-1]->lvlttl != '\0')
|
|
||||||
{
|
{
|
||||||
ST_runTitleCard();
|
ST_runTitleCard();
|
||||||
ST_drawWipeTitleCard();
|
ST_drawWipeTitleCard();
|
||||||
|
|
72
src/g_game.c
72
src/g_game.c
|
@ -1928,13 +1928,22 @@ void G_PreLevelTitleCard(void)
|
||||||
wipestyleflags = WSF_CROSSFADE;
|
wipestyleflags = WSF_CROSSFADE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static boolean titlecardforreload = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Returns true if the current level has a title card.
|
// Returns true if the current level has a title card.
|
||||||
//
|
//
|
||||||
boolean G_IsTitleCardAvailable(void)
|
boolean G_IsTitleCardAvailable(void)
|
||||||
{
|
{
|
||||||
// The current level header explicitly disabled the title card.
|
// The current level header explicitly disabled the title card.
|
||||||
if (mapheaderinfo[gamemap-1]->levelflags & LF_NOTITLECARD)
|
UINT16 titleflag = LF_NOTITLECARDFIRST;
|
||||||
|
|
||||||
|
if (modeattacking != ATTACKING_NONE)
|
||||||
|
titleflag = LF_NOTITLECARDRECORDATTACK;
|
||||||
|
else if (titlecardforreload)
|
||||||
|
titleflag = LF_NOTITLECARDRESPAWN;
|
||||||
|
|
||||||
|
if (mapheaderinfo[gamemap-1]->levelflags & titleflag)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// The current gametype doesn't have a title card.
|
// The current gametype doesn't have a title card.
|
||||||
|
@ -3024,7 +3033,9 @@ void G_DoReborn(INT32 playernum)
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
LUAh_MapChange(gamemap);
|
LUAh_MapChange(gamemap);
|
||||||
#endif
|
#endif
|
||||||
|
titlecardforreload = true;
|
||||||
G_DoLoadLevel(true);
|
G_DoLoadLevel(true);
|
||||||
|
titlecardforreload = false;
|
||||||
if (metalrecording)
|
if (metalrecording)
|
||||||
G_BeginMetal();
|
G_BeginMetal();
|
||||||
return;
|
return;
|
||||||
|
@ -3203,17 +3214,17 @@ UINT32 gametypedefaultrules[NUMGAMETYPES] =
|
||||||
GTR_RACE|GTR_SPAWNENEMIES|GTR_SPAWNINVUL|GTR_ALLOWEXIT,
|
GTR_RACE|GTR_SPAWNENEMIES|GTR_SPAWNINVUL|GTR_ALLOWEXIT,
|
||||||
|
|
||||||
// Match
|
// Match
|
||||||
GTR_RINGSLINGER|GTR_FIRSTPERSON|GTR_SPECTATORS|GTR_POINTLIMIT|GTR_TIMELIMIT|GTR_POWERSTONES|GTR_DEATHMATCHSTARTS|GTR_SPAWNINVUL|GTR_RESPAWNDELAY|GTR_PITYSHIELD|GTR_DEATHPENALTY,
|
GTR_RINGSLINGER|GTR_FIRSTPERSON|GTR_SPECTATORS|GTR_POINTLIMIT|GTR_TIMELIMIT|GTR_OVERTIME|GTR_POWERSTONES|GTR_DEATHMATCHSTARTS|GTR_SPAWNINVUL|GTR_RESPAWNDELAY|GTR_PITYSHIELD|GTR_DEATHPENALTY,
|
||||||
// Team Match
|
// Team Match
|
||||||
GTR_RINGSLINGER|GTR_FIRSTPERSON|GTR_SPECTATORS|GTR_TEAMS|GTR_POINTLIMIT|GTR_TIMELIMIT|GTR_DEATHMATCHSTARTS|GTR_SPAWNINVUL|GTR_RESPAWNDELAY|GTR_PITYSHIELD,
|
GTR_RINGSLINGER|GTR_FIRSTPERSON|GTR_SPECTATORS|GTR_TEAMS|GTR_POINTLIMIT|GTR_TIMELIMIT|GTR_OVERTIME|GTR_DEATHMATCHSTARTS|GTR_SPAWNINVUL|GTR_RESPAWNDELAY|GTR_PITYSHIELD,
|
||||||
|
|
||||||
// Tag
|
// Tag
|
||||||
GTR_RINGSLINGER|GTR_FIRSTPERSON|GTR_TAG|GTR_SPECTATORS|GTR_POINTLIMIT|GTR_TIMELIMIT|GTR_STARTCOUNTDOWN|GTR_BLINDFOLDED|GTR_DEATHMATCHSTARTS|GTR_SPAWNINVUL|GTR_RESPAWNDELAY,
|
GTR_RINGSLINGER|GTR_FIRSTPERSON|GTR_TAG|GTR_SPECTATORS|GTR_POINTLIMIT|GTR_TIMELIMIT|GTR_OVERTIME|GTR_STARTCOUNTDOWN|GTR_BLINDFOLDED|GTR_DEATHMATCHSTARTS|GTR_SPAWNINVUL|GTR_RESPAWNDELAY,
|
||||||
// Hide and Seek
|
// Hide and Seek
|
||||||
GTR_RINGSLINGER|GTR_FIRSTPERSON|GTR_TAG|GTR_SPECTATORS|GTR_POINTLIMIT|GTR_TIMELIMIT|GTR_STARTCOUNTDOWN|GTR_BLINDFOLDED|GTR_DEATHMATCHSTARTS|GTR_SPAWNINVUL|GTR_RESPAWNDELAY,
|
GTR_RINGSLINGER|GTR_FIRSTPERSON|GTR_TAG|GTR_SPECTATORS|GTR_POINTLIMIT|GTR_TIMELIMIT|GTR_OVERTIME|GTR_STARTCOUNTDOWN|GTR_BLINDFOLDED|GTR_DEATHMATCHSTARTS|GTR_SPAWNINVUL|GTR_RESPAWNDELAY,
|
||||||
|
|
||||||
// CTF
|
// CTF
|
||||||
GTR_RINGSLINGER|GTR_FIRSTPERSON|GTR_SPECTATORS|GTR_TEAMS|GTR_TEAMFLAGS|GTR_POINTLIMIT|GTR_TIMELIMIT|GTR_POWERSTONES|GTR_DEATHMATCHSTARTS|GTR_SPAWNINVUL|GTR_RESPAWNDELAY|GTR_PITYSHIELD,
|
GTR_RINGSLINGER|GTR_FIRSTPERSON|GTR_SPECTATORS|GTR_TEAMS|GTR_TEAMFLAGS|GTR_POINTLIMIT|GTR_TIMELIMIT|GTR_OVERTIME|GTR_POWERSTONES|GTR_DEATHMATCHSTARTS|GTR_SPAWNINVUL|GTR_RESPAWNDELAY|GTR_PITYSHIELD,
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -3256,8 +3267,8 @@ void G_AddGametypeConstant(INT16 gtype, const char *newgtconst)
|
||||||
{
|
{
|
||||||
size_t r = 0; // read
|
size_t r = 0; // read
|
||||||
size_t w = 0; // write
|
size_t w = 0; // write
|
||||||
char *gtconst = Z_Calloc(strlen(newgtconst) + 3, PU_STATIC, NULL);
|
char *gtconst = Z_Calloc(strlen(newgtconst) + 4, PU_STATIC, NULL);
|
||||||
char *tmpconst = Z_Calloc(strlen(newgtconst), PU_STATIC, NULL);
|
char *tmpconst = Z_Calloc(strlen(newgtconst) + 1, PU_STATIC, NULL);
|
||||||
|
|
||||||
// Copy the gametype name.
|
// Copy the gametype name.
|
||||||
strcpy(tmpconst, newgtconst);
|
strcpy(tmpconst, newgtconst);
|
||||||
|
@ -3384,6 +3395,36 @@ UINT32 gametypetol[NUMGAMETYPES] =
|
||||||
TOL_CTF, // CTF
|
TOL_CTF, // CTF
|
||||||
};
|
};
|
||||||
|
|
||||||
|
tolinfo_t TYPEOFLEVEL[NUMTOLNAMES] = {
|
||||||
|
{"SOLO",TOL_SP},
|
||||||
|
{"SP",TOL_SP},
|
||||||
|
{"SINGLEPLAYER",TOL_SP},
|
||||||
|
{"SINGLE",TOL_SP},
|
||||||
|
|
||||||
|
{"COOP",TOL_COOP},
|
||||||
|
{"CO-OP",TOL_COOP},
|
||||||
|
|
||||||
|
{"COMPETITION",TOL_COMPETITION},
|
||||||
|
{"RACE",TOL_RACE},
|
||||||
|
|
||||||
|
{"MATCH",TOL_MATCH},
|
||||||
|
{"TAG",TOL_TAG},
|
||||||
|
{"CTF",TOL_CTF},
|
||||||
|
|
||||||
|
{"2D",TOL_2D},
|
||||||
|
{"MARIO",TOL_MARIO},
|
||||||
|
{"NIGHTS",TOL_NIGHTS},
|
||||||
|
{"OLDBRAK",TOL_ERZ3},
|
||||||
|
|
||||||
|
{"XMAS",TOL_XMAS},
|
||||||
|
{"CHRISTMAS",TOL_XMAS},
|
||||||
|
{"WINTER",TOL_XMAS},
|
||||||
|
|
||||||
|
{NULL, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
UINT32 lastcustomtol = (TOL_XMAS<<1);
|
||||||
|
|
||||||
//
|
//
|
||||||
// G_AddTOL
|
// G_AddTOL
|
||||||
//
|
//
|
||||||
|
@ -3391,16 +3432,16 @@ UINT32 gametypetol[NUMGAMETYPES] =
|
||||||
//
|
//
|
||||||
void G_AddTOL(UINT32 newtol, const char *tolname)
|
void G_AddTOL(UINT32 newtol, const char *tolname)
|
||||||
{
|
{
|
||||||
TYPEOFLEVEL[numtolinfo].name = Z_StrDup(tolname);
|
INT32 i;
|
||||||
TYPEOFLEVEL[numtolinfo].flag = newtol;
|
for (i = 0; TYPEOFLEVEL[i].name; i++)
|
||||||
numtolinfo++;
|
;
|
||||||
|
|
||||||
TYPEOFLEVEL[numtolinfo].name = NULL;
|
TYPEOFLEVEL[i].name = Z_StrDup(tolname);
|
||||||
TYPEOFLEVEL[numtolinfo].flag = 0;
|
TYPEOFLEVEL[i].flag = newtol;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// G_AddTOL
|
// G_AddGametypeTOL
|
||||||
//
|
//
|
||||||
// Assigns a type of level to a gametype.
|
// Assigns a type of level to a gametype.
|
||||||
//
|
//
|
||||||
|
@ -3739,7 +3780,10 @@ static void G_DoCompleted(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == 7)
|
if (i == 7)
|
||||||
|
{
|
||||||
gottoken = false;
|
gottoken = false;
|
||||||
|
token = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spec && !gottoken)
|
if (spec && !gottoken)
|
||||||
|
|
|
@ -48,7 +48,6 @@ struct GLMipmap_s
|
||||||
|
|
||||||
struct GLMipmap_s *nextcolormap;
|
struct GLMipmap_s *nextcolormap;
|
||||||
const UINT8 *colormap;
|
const UINT8 *colormap;
|
||||||
INT32 tcindex;
|
|
||||||
|
|
||||||
// opengl
|
// opengl
|
||||||
struct GLMipmap_s *nextmipmap; // opengl : liste of all texture in opengl driver
|
struct GLMipmap_s *nextmipmap; // opengl : liste of all texture in opengl driver
|
||||||
|
|
|
@ -509,6 +509,7 @@ light_t *t_lspr[NUMSPRITES] =
|
||||||
&lspr[NOLIGHT], // SPR_LCKN
|
&lspr[NOLIGHT], // SPR_LCKN
|
||||||
&lspr[NOLIGHT], // SPR_TTAG
|
&lspr[NOLIGHT], // SPR_TTAG
|
||||||
&lspr[NOLIGHT], // SPR_GFLG
|
&lspr[NOLIGHT], // SPR_GFLG
|
||||||
|
&lspr[NOLIGHT], // SPR_FNSF
|
||||||
|
|
||||||
&lspr[NOLIGHT], // SPR_CORK
|
&lspr[NOLIGHT], // SPR_CORK
|
||||||
&lspr[NOLIGHT], // SPR_LHRT
|
&lspr[NOLIGHT], // SPR_LHRT
|
||||||
|
|
|
@ -5022,12 +5022,7 @@ void HWR_AddTransparentFloor(levelflat_t *levelflat, extrasubsector_t *xsub, boo
|
||||||
|
|
||||||
planeinfo[numplanes].isceiling = isceiling;
|
planeinfo[numplanes].isceiling = isceiling;
|
||||||
planeinfo[numplanes].fixedheight = fixedheight;
|
planeinfo[numplanes].fixedheight = fixedheight;
|
||||||
|
planeinfo[numplanes].lightlevel = (planecolormap && (planecolormap->flags & CMF_FOG)) ? lightlevel : 255;
|
||||||
if (planecolormap && (planecolormap->fog & 1))
|
|
||||||
planeinfo[numplanes].lightlevel = lightlevel;
|
|
||||||
else
|
|
||||||
planeinfo[numplanes].lightlevel = 255;
|
|
||||||
|
|
||||||
planeinfo[numplanes].levelflat = levelflat;
|
planeinfo[numplanes].levelflat = levelflat;
|
||||||
planeinfo[numplanes].xsub = xsub;
|
planeinfo[numplanes].xsub = xsub;
|
||||||
planeinfo[numplanes].alpha = alpha;
|
planeinfo[numplanes].alpha = alpha;
|
||||||
|
@ -5059,12 +5054,7 @@ void HWR_AddTransparentPolyobjectFloor(levelflat_t *levelflat, polyobj_t *polyse
|
||||||
|
|
||||||
polyplaneinfo[numpolyplanes].isceiling = isceiling;
|
polyplaneinfo[numpolyplanes].isceiling = isceiling;
|
||||||
polyplaneinfo[numpolyplanes].fixedheight = fixedheight;
|
polyplaneinfo[numpolyplanes].fixedheight = fixedheight;
|
||||||
|
polyplaneinfo[numpolyplanes].lightlevel = (planecolormap && (planecolormap->flags & CMF_FOG)) ? lightlevel : 255;
|
||||||
if (planecolormap && (planecolormap->fog & 1))
|
|
||||||
polyplaneinfo[numpolyplanes].lightlevel = lightlevel;
|
|
||||||
else
|
|
||||||
polyplaneinfo[numpolyplanes].lightlevel = 255;
|
|
||||||
|
|
||||||
polyplaneinfo[numpolyplanes].levelflat = levelflat;
|
polyplaneinfo[numpolyplanes].levelflat = levelflat;
|
||||||
polyplaneinfo[numpolyplanes].polysector = polysector;
|
polyplaneinfo[numpolyplanes].polysector = polysector;
|
||||||
polyplaneinfo[numpolyplanes].alpha = alpha;
|
polyplaneinfo[numpolyplanes].alpha = alpha;
|
||||||
|
@ -5819,6 +5809,12 @@ static void HWR_DrawSkyBackground(player_t *player)
|
||||||
dometransform.scalez = 1;
|
dometransform.scalez = 1;
|
||||||
dometransform.fovxangle = fpov; // Tails
|
dometransform.fovxangle = fpov; // Tails
|
||||||
dometransform.fovyangle = fpov; // Tails
|
dometransform.fovyangle = fpov; // Tails
|
||||||
|
if (player->viewrollangle != 0)
|
||||||
|
{
|
||||||
|
fixed_t rol = AngleFixed(player->viewrollangle);
|
||||||
|
dometransform.rollangle = FIXED_TO_FLOAT(rol);
|
||||||
|
dometransform.roll = true;
|
||||||
|
}
|
||||||
dometransform.splitscreen = splitscreen;
|
dometransform.splitscreen = splitscreen;
|
||||||
|
|
||||||
HWR_GetTexture(texturetranslation[skytexture]);
|
HWR_GetTexture(texturetranslation[skytexture]);
|
||||||
|
@ -6042,6 +6038,12 @@ void HWR_RenderSkyboxView(INT32 viewnumber, player_t *player)
|
||||||
atransform.scalez = 1;
|
atransform.scalez = 1;
|
||||||
atransform.fovxangle = fpov; // Tails
|
atransform.fovxangle = fpov; // Tails
|
||||||
atransform.fovyangle = fpov; // Tails
|
atransform.fovyangle = fpov; // Tails
|
||||||
|
if (player->viewrollangle != 0)
|
||||||
|
{
|
||||||
|
fixed_t rol = AngleFixed(player->viewrollangle);
|
||||||
|
atransform.rollangle = FIXED_TO_FLOAT(rol);
|
||||||
|
atransform.roll = true;
|
||||||
|
}
|
||||||
atransform.splitscreen = splitscreen;
|
atransform.splitscreen = splitscreen;
|
||||||
|
|
||||||
gr_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l)));
|
gr_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l)));
|
||||||
|
@ -6262,6 +6264,12 @@ void HWR_RenderPlayerView(INT32 viewnumber, player_t *player)
|
||||||
atransform.scalez = 1;
|
atransform.scalez = 1;
|
||||||
atransform.fovxangle = fpov; // Tails
|
atransform.fovxangle = fpov; // Tails
|
||||||
atransform.fovyangle = fpov; // Tails
|
atransform.fovyangle = fpov; // Tails
|
||||||
|
if (player->viewrollangle != 0)
|
||||||
|
{
|
||||||
|
fixed_t rol = AngleFixed(player->viewrollangle);
|
||||||
|
atransform.rollangle = FIXED_TO_FLOAT(rol);
|
||||||
|
atransform.roll = true;
|
||||||
|
}
|
||||||
atransform.splitscreen = splitscreen;
|
atransform.splitscreen = splitscreen;
|
||||||
|
|
||||||
gr_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l)));
|
gr_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l)));
|
||||||
|
|
|
@ -476,8 +476,9 @@ void HWR_InitModels(void)
|
||||||
size_t i;
|
size_t i;
|
||||||
INT32 s;
|
INT32 s;
|
||||||
FILE *f;
|
FILE *f;
|
||||||
char name[18], filename[32];
|
char name[24], filename[32];
|
||||||
float scale, offset;
|
float scale, offset;
|
||||||
|
size_t prefixlen;
|
||||||
|
|
||||||
CONS_Printf("HWR_InitModels()...\n");
|
CONS_Printf("HWR_InitModels()...\n");
|
||||||
for (s = 0; s < MAXSKINS; s++)
|
for (s = 0; s < MAXSKINS; s++)
|
||||||
|
@ -509,46 +510,54 @@ void HWR_InitModels(void)
|
||||||
nomd2s = true;
|
nomd2s = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while (fscanf(f, "%19s %31s %f %f", name, filename, &scale, &offset) == 4)
|
|
||||||
|
// length of the player model prefix
|
||||||
|
prefixlen = strlen(PLAYERMODELPREFIX);
|
||||||
|
|
||||||
|
while (fscanf(f, "%25s %31s %f %f", name, filename, &scale, &offset) == 4)
|
||||||
{
|
{
|
||||||
if (stricmp(name, "PLAY") == 0)
|
char *skinname = name;
|
||||||
|
size_t len = strlen(name);
|
||||||
|
|
||||||
|
// check for the player model prefix.
|
||||||
|
if (!strnicmp(name, PLAYERMODELPREFIX, prefixlen) && (len > prefixlen))
|
||||||
{
|
{
|
||||||
CONS_Printf("Model for sprite PLAY detected in models.dat, use a player skin instead!\n");
|
skinname += prefixlen;
|
||||||
continue;
|
goto addskinmodel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add sprite model
|
||||||
|
if (len == 4) // must be 4 characters long exactly. otherwise it's not a sprite name.
|
||||||
|
{
|
||||||
for (i = 0; i < NUMSPRITES; i++)
|
for (i = 0; i < NUMSPRITES; i++)
|
||||||
{
|
{
|
||||||
if (stricmp(name, sprnames[i]) == 0)
|
if (stricmp(name, sprnames[i]) == 0)
|
||||||
{
|
{
|
||||||
//if (stricmp(name, "PLAY") == 0)
|
|
||||||
//continue;
|
|
||||||
|
|
||||||
//CONS_Debug(DBG_RENDER, " Found: %s %s %f %f\n", name, filename, scale, offset);
|
|
||||||
md2_models[i].scale = scale;
|
md2_models[i].scale = scale;
|
||||||
md2_models[i].offset = offset;
|
md2_models[i].offset = offset;
|
||||||
md2_models[i].notfound = false;
|
md2_models[i].notfound = false;
|
||||||
strcpy(md2_models[i].filename, filename);
|
strcpy(md2_models[i].filename, filename);
|
||||||
goto md2found;
|
goto modelfound;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addskinmodel:
|
||||||
|
// add player model
|
||||||
for (s = 0; s < MAXSKINS; s++)
|
for (s = 0; s < MAXSKINS; s++)
|
||||||
{
|
{
|
||||||
if (stricmp(name, skins[s].name) == 0)
|
if (stricmp(skinname, skins[s].name) == 0)
|
||||||
{
|
{
|
||||||
//CONS_Printf(" Found: %s %s %f %f\n", name, filename, scale, offset);
|
|
||||||
md2_playermodels[s].skin = s;
|
md2_playermodels[s].skin = s;
|
||||||
md2_playermodels[s].scale = scale;
|
md2_playermodels[s].scale = scale;
|
||||||
md2_playermodels[s].offset = offset;
|
md2_playermodels[s].offset = offset;
|
||||||
md2_playermodels[s].notfound = false;
|
md2_playermodels[s].notfound = false;
|
||||||
strcpy(md2_playermodels[s].filename, filename);
|
strcpy(md2_playermodels[s].filename, filename);
|
||||||
goto md2found;
|
goto modelfound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// no sprite/player skin name found?!?
|
|
||||||
//CONS_Printf("Unknown sprite/player skin %s detected in models.dat\n", name);
|
modelfound:
|
||||||
md2found:
|
|
||||||
// move on to next line...
|
// move on to next line...
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -558,8 +567,9 @@ md2found:
|
||||||
void HWR_AddPlayerModel(int skin) // For skins that were added after startup
|
void HWR_AddPlayerModel(int skin) // For skins that were added after startup
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
char name[18], filename[32];
|
char name[24], filename[32];
|
||||||
float scale, offset;
|
float scale, offset;
|
||||||
|
size_t prefixlen;
|
||||||
|
|
||||||
if (nomd2s)
|
if (nomd2s)
|
||||||
return;
|
return;
|
||||||
|
@ -577,32 +587,42 @@ void HWR_AddPlayerModel(int skin) // For skins that were added after startup
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for any model that match the names of player skins!
|
// length of the player model prefix
|
||||||
while (fscanf(f, "%19s %31s %f %f", name, filename, &scale, &offset) == 4)
|
prefixlen = strlen(PLAYERMODELPREFIX);
|
||||||
|
|
||||||
|
// Check for any models that match the names of player skins!
|
||||||
|
while (fscanf(f, "%25s %31s %f %f", name, filename, &scale, &offset) == 4)
|
||||||
{
|
{
|
||||||
if (stricmp(name, skins[skin].name) == 0)
|
char *skinname = name;
|
||||||
|
size_t len = strlen(name);
|
||||||
|
|
||||||
|
// ignore the player model prefix.
|
||||||
|
if (!strnicmp(name, PLAYERMODELPREFIX, prefixlen) && (len > prefixlen))
|
||||||
|
skinname += prefixlen;
|
||||||
|
|
||||||
|
if (stricmp(skinname, skins[skin].name) == 0)
|
||||||
{
|
{
|
||||||
md2_playermodels[skin].skin = skin;
|
md2_playermodels[skin].skin = skin;
|
||||||
md2_playermodels[skin].scale = scale;
|
md2_playermodels[skin].scale = scale;
|
||||||
md2_playermodels[skin].offset = offset;
|
md2_playermodels[skin].offset = offset;
|
||||||
md2_playermodels[skin].notfound = false;
|
md2_playermodels[skin].notfound = false;
|
||||||
strcpy(md2_playermodels[skin].filename, filename);
|
strcpy(md2_playermodels[skin].filename, filename);
|
||||||
goto playermd2found;
|
goto playermodelfound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//CONS_Printf("Model for player skin %s not found\n", skins[skin].name);
|
|
||||||
md2_playermodels[skin].notfound = true;
|
md2_playermodels[skin].notfound = true;
|
||||||
playermd2found:
|
playermodelfound:
|
||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HWR_AddSpriteModel(size_t spritenum) // For sprites that were added after startup
|
void HWR_AddSpriteModel(size_t spritenum) // For sprites that were added after startup
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
// name[18] is used to check for names in the models.dat file that match with sprites or player skins
|
// name[24] is used to check for names in the models.dat file that match with sprites or player skins
|
||||||
// sprite names are always 4 characters long, and names is for player skins can be up to 19 characters long
|
// sprite names are always 4 characters long, and names is for player skins can be up to 19 characters long
|
||||||
char name[18], filename[32];
|
// PLAYERMODELPREFIX is 6 characters long
|
||||||
|
char name[24], filename[32];
|
||||||
float scale, offset;
|
float scale, offset;
|
||||||
|
|
||||||
if (nomd2s)
|
if (nomd2s)
|
||||||
|
@ -622,22 +642,30 @@ void HWR_AddSpriteModel(size_t spritenum) // For sprites that were added after s
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for any MD2s that match the names of sprite names!
|
// Check for any models that match the names of sprite names!
|
||||||
while (fscanf(f, "%19s %31s %f %f", name, filename, &scale, &offset) == 4)
|
while (fscanf(f, "%25s %31s %f %f", name, filename, &scale, &offset) == 4)
|
||||||
{
|
{
|
||||||
|
// length of the sprite name
|
||||||
|
size_t len = strlen(name);
|
||||||
|
if (len != 4) // must be 4 characters long exactly. otherwise it's not a sprite name.
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// check for the player model prefix.
|
||||||
|
if (!strnicmp(name, PLAYERMODELPREFIX, strlen(PLAYERMODELPREFIX)))
|
||||||
|
continue; // that's not a sprite...
|
||||||
|
|
||||||
if (stricmp(name, sprnames[spritenum]) == 0)
|
if (stricmp(name, sprnames[spritenum]) == 0)
|
||||||
{
|
{
|
||||||
md2_models[spritenum].scale = scale;
|
md2_models[spritenum].scale = scale;
|
||||||
md2_models[spritenum].offset = offset;
|
md2_models[spritenum].offset = offset;
|
||||||
md2_models[spritenum].notfound = false;
|
md2_models[spritenum].notfound = false;
|
||||||
strcpy(md2_models[spritenum].filename, filename);
|
strcpy(md2_models[spritenum].filename, filename);
|
||||||
goto spritemd2found;
|
goto spritemodelfound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//CONS_Printf("MD2 for sprite %s not found\n", sprnames[spritenum]);
|
|
||||||
md2_models[spritenum].notfound = true;
|
md2_models[spritenum].notfound = true;
|
||||||
spritemd2found:
|
spritemodelfound:
|
||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1020,32 +1048,13 @@ static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, INT
|
||||||
// mostly copied from HWR_GetMappedPatch, hence the similarities and comment
|
// mostly copied from HWR_GetMappedPatch, hence the similarities and comment
|
||||||
GLMipmap_t *grmip, *newmip;
|
GLMipmap_t *grmip, *newmip;
|
||||||
|
|
||||||
if ((colormap == colormaps || colormap == NULL) && (skinnum > TC_DEFAULT))
|
if (colormap == colormaps || colormap == NULL)
|
||||||
{
|
{
|
||||||
// Don't do any blending
|
// Don't do any blending
|
||||||
HWD.pfnSetTexture(gpatch->mipmap);
|
HWD.pfnSetTexture(gpatch->mipmap);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// search for the mipmap
|
|
||||||
// skip the first (no colormap translated)
|
|
||||||
for (grmip = gpatch->mipmap; grmip->nextcolormap; )
|
|
||||||
{
|
|
||||||
grmip = grmip->nextcolormap;
|
|
||||||
if (grmip->colormap == colormap || (skinnum < TC_DEFAULT && grmip->tcindex == skinnum))
|
|
||||||
{
|
|
||||||
if (grmip->downloaded && grmip->grInfo.data)
|
|
||||||
{
|
|
||||||
HWD.pfnSetTexture(grmip); // found the colormap, set it to the correct texture
|
|
||||||
Z_ChangeTag(grmip->grInfo.data, PU_HWRMODELTEXTURE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If here, the blended texture has not been created
|
|
||||||
// So we create it
|
|
||||||
|
|
||||||
if ((blendgpatch && blendgpatch->mipmap->grInfo.format)
|
if ((blendgpatch && blendgpatch->mipmap->grInfo.format)
|
||||||
&& (gpatch->width != blendgpatch->width || gpatch->height != blendgpatch->height))
|
&& (gpatch->width != blendgpatch->width || gpatch->height != blendgpatch->height))
|
||||||
{
|
{
|
||||||
|
@ -1054,21 +1063,39 @@ static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, INT
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// search for the mipmap
|
||||||
|
// skip the first (no colormap translated)
|
||||||
|
for (grmip = gpatch->mipmap; grmip->nextcolormap; )
|
||||||
|
{
|
||||||
|
grmip = grmip->nextcolormap;
|
||||||
|
if (grmip->colormap == colormap)
|
||||||
|
{
|
||||||
|
if (grmip->downloaded && grmip->grInfo.data)
|
||||||
|
{
|
||||||
|
HWD.pfnSetTexture(grmip); // found the colormap, set it to the correct texture
|
||||||
|
Z_ChangeTag(grmip->grInfo.data, PU_HWRMODELTEXTURE_UNLOCKED);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If here, the blended texture has not been created
|
||||||
|
// So we create it
|
||||||
|
|
||||||
//BP: WARNING: don't free it manually without clearing the cache of harware renderer
|
//BP: WARNING: don't free it manually without clearing the cache of harware renderer
|
||||||
// (it have a liste of mipmap)
|
// (it have a liste of mipmap)
|
||||||
// this malloc is cleared in HWR_FreeTextureCache
|
// this malloc is cleared in HWR_FreeTextureCache
|
||||||
// (...) unfortunately z_malloc fragment alot the memory :(so malloc is better
|
// (...) unfortunately z_malloc fragment alot the memory :(so malloc is better
|
||||||
newmip = calloc(1, sizeof (*newmip));
|
newmip = calloc(1, sizeof (*newmip));
|
||||||
if (newmip == NULL)
|
if (newmip == NULL)
|
||||||
I_Error("%s: Out of memory", "HWR_GetMappedPatch");
|
I_Error("%s: Out of memory", "HWR_GetBlendedTexture");
|
||||||
grmip->nextcolormap = newmip;
|
grmip->nextcolormap = newmip;
|
||||||
newmip->colormap = colormap;
|
newmip->colormap = colormap;
|
||||||
newmip->tcindex = skinnum;
|
|
||||||
|
|
||||||
HWR_CreateBlendedTexture(gpatch, blendgpatch, newmip, skinnum, color);
|
HWR_CreateBlendedTexture(gpatch, blendgpatch, newmip, skinnum, color);
|
||||||
|
|
||||||
HWD.pfnSetTexture(newmip);
|
HWD.pfnSetTexture(newmip);
|
||||||
Z_ChangeTag(newmip->grInfo.data, PU_HWRMODELTEXTURE);
|
Z_ChangeTag(newmip->grInfo.data, PU_HWRMODELTEXTURE_UNLOCKED);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define NORMALFOG 0x00000000
|
#define NORMALFOG 0x00000000
|
||||||
|
@ -1298,7 +1325,7 @@ boolean HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
|
|
||||||
if (gpatch && gpatch->mipmap->grInfo.format) // else if meant that if a texture couldn't be loaded, it would just end up using something else's texture
|
if (gpatch && gpatch->mipmap->grInfo.format) // else if meant that if a texture couldn't be loaded, it would just end up using something else's texture
|
||||||
{
|
{
|
||||||
INT32 skinnum = INT32_MAX;
|
INT32 skinnum = TC_DEFAULT;
|
||||||
|
|
||||||
if ((spr->mobj->flags & (MF_ENEMY|MF_BOSS)) && (spr->mobj->flags2 & MF2_FRET) && !(spr->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash"
|
if ((spr->mobj->flags & (MF_ENEMY|MF_BOSS)) && (spr->mobj->flags2 & MF2_FRET) && !(spr->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash"
|
||||||
{
|
{
|
||||||
|
@ -1329,17 +1356,9 @@ boolean HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Translation or skin number found
|
// Translation or skin number found
|
||||||
if (skinnum != INT32_MAX)
|
|
||||||
{
|
|
||||||
HWR_GetBlendedTexture(gpatch, (GLPatch_t *)md2->blendgrpatch, skinnum, spr->colormap, (skincolors_t)spr->mobj->color);
|
HWR_GetBlendedTexture(gpatch, (GLPatch_t *)md2->blendgrpatch, skinnum, spr->colormap, (skincolors_t)spr->mobj->color);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
// Sorry nothing
|
|
||||||
HWD.pfnSetTexture(gpatch->mipmap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
// Sprite
|
// Sprite
|
||||||
gpatch = spr->gpatch; //W_CachePatchNum(spr->patchlumpnum, PU_CACHE);
|
gpatch = spr->gpatch; //W_CachePatchNum(spr->patchlumpnum, PU_CACHE);
|
||||||
|
|
|
@ -49,4 +49,6 @@ void HWR_AddPlayerModel(INT32 skin);
|
||||||
void HWR_AddSpriteModel(size_t spritenum);
|
void HWR_AddSpriteModel(size_t spritenum);
|
||||||
boolean HWR_DrawModel(gr_vissprite_t *spr);
|
boolean HWR_DrawModel(gr_vissprite_t *spr);
|
||||||
|
|
||||||
|
#define PLAYERMODELPREFIX "PLAYER"
|
||||||
|
|
||||||
#endif // _HW_MD2_H_
|
#endif // _HW_MD2_H_
|
||||||
|
|
|
@ -2238,6 +2238,8 @@ EXPORT void HWRAPI(SetTransform) (FTransform *stransform)
|
||||||
else
|
else
|
||||||
pglScalef(stransform->scalex, stransform->scaley, -stransform->scalez);
|
pglScalef(stransform->scalex, stransform->scaley, -stransform->scalez);
|
||||||
|
|
||||||
|
if (stransform->roll)
|
||||||
|
pglRotatef(stransform->rollangle, 0.0f, 0.0f, 1.0f);
|
||||||
pglRotatef(stransform->anglex , 1.0f, 0.0f, 0.0f);
|
pglRotatef(stransform->anglex , 1.0f, 0.0f, 0.0f);
|
||||||
pglRotatef(stransform->angley+270.0f, 0.0f, 1.0f, 0.0f);
|
pglRotatef(stransform->angley+270.0f, 0.0f, 1.0f, 0.0f);
|
||||||
pglTranslatef(-stransform->x, -stransform->z, -stransform->y);
|
pglTranslatef(-stransform->x, -stransform->z, -stransform->y);
|
||||||
|
|
48
src/info.c
48
src/info.c
|
@ -407,6 +407,7 @@ char sprnames[NUMSPRITES + 1][5] =
|
||||||
"LCKN", // Target
|
"LCKN", // Target
|
||||||
"TTAG", // Tag Sign
|
"TTAG", // Tag Sign
|
||||||
"GFLG", // Got Flag sign
|
"GFLG", // Got Flag sign
|
||||||
|
"FNSF", // Finish flag
|
||||||
|
|
||||||
"CORK",
|
"CORK",
|
||||||
"LHRT",
|
"LHRT",
|
||||||
|
@ -762,7 +763,7 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_PLAY, SPR2_LIFE, 20, {NULL}, 0, 4, S_NULL}, // S_PLAY_ICON3
|
{SPR_PLAY, SPR2_LIFE, 20, {NULL}, 0, 4, S_NULL}, // S_PLAY_ICON3
|
||||||
|
|
||||||
// Level end sign (uses player sprite)
|
// Level end sign (uses player sprite)
|
||||||
{SPR_PLAY, SPR2_SIGN|FF_PAPERSPRITE, -1, {NULL}, 0, 29, S_PLAY_SIGN}, // S_PLAY_SIGN
|
{SPR_PLAY, SPR2_SIGN|FF_PAPERSPRITE, 2, {NULL}, 0, 29, S_PLAY_SIGN}, // S_PLAY_SIGN
|
||||||
|
|
||||||
// NiGHTS Player, transforming
|
// NiGHTS Player, transforming
|
||||||
{SPR_PLAY, SPR2_TRNS|FF_ANIMATE, 7, {NULL}, 0, 4, S_PLAY_NIGHTS_TRANS2}, // S_PLAY_NIGHTS_TRANS1
|
{SPR_PLAY, SPR2_TRNS|FF_ANIMATE, 7, {NULL}, 0, 4, S_PLAY_NIGHTS_TRANS2}, // S_PLAY_NIGHTS_TRANS1
|
||||||
|
@ -2343,12 +2344,13 @@ state_t states[NUMSTATES] =
|
||||||
|
|
||||||
// TNT barrel
|
// TNT barrel
|
||||||
{SPR_BARR, 0, -1, {NULL}, 0, 0, S_NULL}, // S_TNTBARREL_STND1
|
{SPR_BARR, 0, -1, {NULL}, 0, 0, S_NULL}, // S_TNTBARREL_STND1
|
||||||
{SPR_BARX, 0|FF_FULLBRIGHT, 3, {A_SetObjectFlags}, MF_NOCLIP|MF_NOGRAVITY|MF_NOBLOCKMAP, 0, S_TNTBARREL_EXPL2}, // S_TNTBARREL_EXPL1
|
{SPR_BARX, 0, 0, {A_RollAngle}, 0, 1, S_TNTBARREL_EXPL2}, // S_TNTBARREL_EXPL1
|
||||||
{SPR_BARX, 1|FF_FULLBRIGHT, 2, {A_TNTExplode}, MT_TNTDUST, 0, S_TNTBARREL_EXPL3}, // S_TNTBARREL_EXPL2
|
{SPR_BARX, 0|FF_FULLBRIGHT, 3, {A_SetObjectFlags}, MF_NOCLIP|MF_NOGRAVITY|MF_NOBLOCKMAP, 0, S_TNTBARREL_EXPL3}, // S_TNTBARREL_EXPL2
|
||||||
{SPR_BARX, 1|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_TNTBARREL_EXPL4}, // S_TNTBARREL_EXPL3
|
{SPR_BARX, 1|FF_FULLBRIGHT, 2, {A_TNTExplode}, MT_TNTDUST, 0, S_TNTBARREL_EXPL4}, // S_TNTBARREL_EXPL3
|
||||||
{SPR_BARX, 2|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_TNTBARREL_EXPL5}, // S_TNTBARREL_EXPL4
|
{SPR_BARX, 1|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_TNTBARREL_EXPL5}, // S_TNTBARREL_EXPL4
|
||||||
{SPR_BARX, 3|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_TNTBARREL_EXPL6}, // S_TNTBARREL_EXPL5
|
{SPR_BARX, 2|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_TNTBARREL_EXPL6}, // S_TNTBARREL_EXPL5
|
||||||
{SPR_NULL, 0, 35, {NULL}, 0, 0, S_NULL}, // S_TNTBARREL_EXPL6
|
{SPR_BARX, 3|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_TNTBARREL_EXPL7}, // S_TNTBARREL_EXPL6
|
||||||
|
{SPR_NULL, 0, 35, {NULL}, 0, 0, S_NULL}, // S_TNTBARREL_EXPL7
|
||||||
#ifndef ROTSPRITE
|
#ifndef ROTSPRITE
|
||||||
{SPR_BARR, 1|FF_ANIMATE, -1, {NULL}, 7, 2, S_NULL}, // S_TNTBARREL_FLYING
|
{SPR_BARR, 1|FF_ANIMATE, -1, {NULL}, 7, 2, S_NULL}, // S_TNTBARREL_FLYING
|
||||||
#else
|
#else
|
||||||
|
@ -2394,7 +2396,7 @@ state_t states[NUMSTATES] =
|
||||||
|
|
||||||
// Minecart
|
// Minecart
|
||||||
{SPR_NULL, 0, 1, {NULL}, 0, 0, S_MINECART_IDLE}, // S_MINECART_IDLE
|
{SPR_NULL, 0, 1, {NULL}, 0, 0, S_MINECART_IDLE}, // S_MINECART_IDLE
|
||||||
{SPR_NULL, 0, 0, {A_KillSegments}, 0, 0, S_TNTBARREL_EXPL3}, // S_MINECART_DTH1
|
{SPR_NULL, 0, 0, {A_KillSegments}, 0, 0, S_TNTBARREL_EXPL4}, // S_MINECART_DTH1
|
||||||
{SPR_MCRT, 8|FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_MINECARTEND
|
{SPR_MCRT, 8|FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_MINECARTEND
|
||||||
{SPR_MCRT, 0|FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_MINECARTSEG_FRONT
|
{SPR_MCRT, 0|FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_MINECARTSEG_FRONT
|
||||||
{SPR_MCRT, 1|FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_MINECARTSEG_BACK
|
{SPR_MCRT, 1|FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_MINECARTSEG_BACK
|
||||||
|
@ -3350,6 +3352,9 @@ state_t states[NUMSTATES] =
|
||||||
// CTF Sign
|
// CTF Sign
|
||||||
{SPR_GFLG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_GOTFLAG
|
{SPR_GFLG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_GOTFLAG
|
||||||
|
|
||||||
|
// Finish flag
|
||||||
|
{SPR_FNSF, FF_TRANS30, -1, {NULL}, 0, 0, S_NULL}, // S_FINISHFLAG
|
||||||
|
|
||||||
{SPR_CORK, 0, -1, {NULL}, 0, 0, S_NULL}, // S_CORK
|
{SPR_CORK, 0, -1, {NULL}, 0, 0, S_NULL}, // S_CORK
|
||||||
{SPR_LHRT, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LHRT
|
{SPR_LHRT, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LHRT
|
||||||
|
|
||||||
|
@ -17995,6 +18000,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ // MT_FINISHFLAG
|
||||||
|
-1, // doomednum
|
||||||
|
S_FINISHFLAG, // spawnstate
|
||||||
|
1000, // spawnhealth
|
||||||
|
S_NULL, // seestate
|
||||||
|
sfx_None, // seesound
|
||||||
|
8, // reactiontime
|
||||||
|
sfx_None, // attacksound
|
||||||
|
S_NULL, // painstate
|
||||||
|
0, // painchance
|
||||||
|
sfx_None, // painsound
|
||||||
|
S_NULL, // meleestate
|
||||||
|
S_NULL, // missilestate
|
||||||
|
S_NULL, // deathstate
|
||||||
|
S_NULL, // xdeathstate
|
||||||
|
sfx_None, // deathsound
|
||||||
|
4*FRACUNIT, // speed
|
||||||
|
8*FRACUNIT, // radius
|
||||||
|
8*FRACUNIT, // height
|
||||||
|
1, // display offset
|
||||||
|
16, // mass
|
||||||
|
0, // damage
|
||||||
|
sfx_None, // activesound
|
||||||
|
MF_NOBLOCKMAP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags
|
||||||
|
S_NULL // raisestate
|
||||||
|
},
|
||||||
|
|
||||||
// ambient water 1a (large)
|
// ambient water 1a (large)
|
||||||
{ // MT_AWATERA
|
{ // MT_AWATERA
|
||||||
700, // doomednum
|
700, // doomednum
|
||||||
|
|
|
@ -670,6 +670,7 @@ typedef enum sprite
|
||||||
SPR_LCKN, // Target
|
SPR_LCKN, // Target
|
||||||
SPR_TTAG, // Tag Sign
|
SPR_TTAG, // Tag Sign
|
||||||
SPR_GFLG, // Got Flag sign
|
SPR_GFLG, // Got Flag sign
|
||||||
|
SPR_FNSF, // Finish flag
|
||||||
|
|
||||||
SPR_CORK,
|
SPR_CORK,
|
||||||
SPR_LHRT,
|
SPR_LHRT,
|
||||||
|
@ -2503,6 +2504,7 @@ typedef enum state
|
||||||
S_TNTBARREL_EXPL4,
|
S_TNTBARREL_EXPL4,
|
||||||
S_TNTBARREL_EXPL5,
|
S_TNTBARREL_EXPL5,
|
||||||
S_TNTBARREL_EXPL6,
|
S_TNTBARREL_EXPL6,
|
||||||
|
S_TNTBARREL_EXPL7,
|
||||||
S_TNTBARREL_FLYING,
|
S_TNTBARREL_FLYING,
|
||||||
|
|
||||||
// TNT proximity shell
|
// TNT proximity shell
|
||||||
|
@ -3485,6 +3487,9 @@ typedef enum state
|
||||||
// Got Flag Sign
|
// Got Flag Sign
|
||||||
S_GOTFLAG,
|
S_GOTFLAG,
|
||||||
|
|
||||||
|
// Finish flag
|
||||||
|
S_FINISHFLAG,
|
||||||
|
|
||||||
S_CORK,
|
S_CORK,
|
||||||
S_LHRT,
|
S_LHRT,
|
||||||
|
|
||||||
|
@ -4625,6 +4630,7 @@ typedef enum mobj_type
|
||||||
MT_LOCKONINF, // In-level Target
|
MT_LOCKONINF, // In-level Target
|
||||||
MT_TAG, // Tag Sign
|
MT_TAG, // Tag Sign
|
||||||
MT_GOTFLAG, // Got Flag sign
|
MT_GOTFLAG, // Got Flag sign
|
||||||
|
MT_FINISHFLAG, // Finish flag
|
||||||
|
|
||||||
// Ambient Sounds
|
// Ambient Sounds
|
||||||
MT_AWATERA, // Ambient Water Sound 1
|
MT_AWATERA, // Ambient Water Sound 1
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#endif
|
#endif
|
||||||
#include "z_zone.h"
|
#include "z_zone.h"
|
||||||
#include "r_main.h"
|
#include "r_main.h"
|
||||||
|
#include "r_draw.h"
|
||||||
#include "r_things.h"
|
#include "r_things.h"
|
||||||
#include "m_random.h"
|
#include "m_random.h"
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
|
@ -2313,9 +2314,29 @@ static int lib_rTextureNumForName(lua_State *L)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// R_DRAW
|
||||||
|
////////////
|
||||||
|
static int lib_rGetColorByName(lua_State *L)
|
||||||
|
{
|
||||||
|
const char* colorname = luaL_checkstring(L, 1);
|
||||||
|
//HUDSAFE
|
||||||
|
lua_pushinteger(L, R_GetColorByName(colorname));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lua exclusive function, returns the name of a color from the SKINCOLOR_ constant.
|
||||||
|
// SKINCOLOR_GREEN > "Green" for example
|
||||||
|
static int lib_rGetNameByColor(lua_State *L)
|
||||||
|
{
|
||||||
|
UINT8 colornum = (UINT8)luaL_checkinteger(L, 1);
|
||||||
|
if (!colornum || colornum >= MAXSKINCOLORS)
|
||||||
|
return luaL_error(L, "skincolor %d out of range (1 - %d).", colornum, MAXSKINCOLORS-1);
|
||||||
|
lua_pushstring(L, Color_Names[colornum]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
// S_SOUND
|
// S_SOUND
|
||||||
////////////
|
////////////
|
||||||
|
|
||||||
static int lib_sStartSound(lua_State *L)
|
static int lib_sStartSound(lua_State *L)
|
||||||
{
|
{
|
||||||
const void *origin = NULL;
|
const void *origin = NULL;
|
||||||
|
@ -3153,6 +3174,10 @@ static luaL_Reg lib[] = {
|
||||||
{"R_CheckTextureNumForName",lib_rCheckTextureNumForName},
|
{"R_CheckTextureNumForName",lib_rCheckTextureNumForName},
|
||||||
{"R_TextureNumForName",lib_rTextureNumForName},
|
{"R_TextureNumForName",lib_rTextureNumForName},
|
||||||
|
|
||||||
|
// r_draw
|
||||||
|
{"R_GetColorByName", lib_rGetColorByName},
|
||||||
|
{"R_GetNameByColor", lib_rGetNameByColor},
|
||||||
|
|
||||||
// s_sound
|
// s_sound
|
||||||
{"S_StartSound",lib_sStartSound},
|
{"S_StartSound",lib_sStartSound},
|
||||||
{"S_StartSoundAtVolume",lib_sStartSoundAtVolume},
|
{"S_StartSoundAtVolume",lib_sStartSoundAtVolume},
|
||||||
|
|
|
@ -1594,7 +1594,7 @@ boolean LUAh_SeenPlayer(player_t *player, player_t *seenfriend)
|
||||||
hook_p hookp;
|
hook_p hookp;
|
||||||
boolean hasSeenPlayer = true;
|
boolean hasSeenPlayer = true;
|
||||||
if (!gL || !(hooksAvailable[hook_SeenPlayer/8] & (1<<(hook_SeenPlayer%8))))
|
if (!gL || !(hooksAvailable[hook_SeenPlayer/8] & (1<<(hook_SeenPlayer%8))))
|
||||||
return 0;
|
return true;
|
||||||
|
|
||||||
lua_settop(gL, 0);
|
lua_settop(gL, 0);
|
||||||
hud_running = true; // local hook
|
hud_running = true; // local hook
|
||||||
|
|
140
src/lua_hudlib.c
140
src/lua_hudlib.c
|
@ -119,9 +119,25 @@ enum align {
|
||||||
align_center,
|
align_center,
|
||||||
align_right,
|
align_right,
|
||||||
align_fixed,
|
align_fixed,
|
||||||
|
align_fixedcenter,
|
||||||
|
align_fixedright,
|
||||||
align_small,
|
align_small,
|
||||||
|
align_smallfixed,
|
||||||
|
align_smallfixedcenter,
|
||||||
|
align_smallfixedright,
|
||||||
|
align_smallcenter,
|
||||||
align_smallright,
|
align_smallright,
|
||||||
|
align_smallthin,
|
||||||
|
align_smallthincenter,
|
||||||
|
align_smallthinright,
|
||||||
|
align_smallthinfixed,
|
||||||
|
align_smallthinfixedcenter,
|
||||||
|
align_smallthinfixedright,
|
||||||
align_thin,
|
align_thin,
|
||||||
|
align_thinfixed,
|
||||||
|
align_thinfixedcenter,
|
||||||
|
align_thinfixedright,
|
||||||
|
align_thincenter,
|
||||||
align_thinright
|
align_thinright
|
||||||
};
|
};
|
||||||
static const char *const align_opt[] = {
|
static const char *const align_opt[] = {
|
||||||
|
@ -129,9 +145,25 @@ static const char *const align_opt[] = {
|
||||||
"center",
|
"center",
|
||||||
"right",
|
"right",
|
||||||
"fixed",
|
"fixed",
|
||||||
|
"fixed-center",
|
||||||
|
"fixed-right",
|
||||||
"small",
|
"small",
|
||||||
|
"small-fixed",
|
||||||
|
"small-fixed-center",
|
||||||
|
"small-fixed-right",
|
||||||
|
"small-center",
|
||||||
"small-right",
|
"small-right",
|
||||||
|
"small-thin",
|
||||||
|
"small-thin-center",
|
||||||
|
"small-thin-right",
|
||||||
|
"small-thin-fixed",
|
||||||
|
"small-thin-fixed-center",
|
||||||
|
"small-thin-fixed-right",
|
||||||
"thin",
|
"thin",
|
||||||
|
"thin-fixed",
|
||||||
|
"thin-fixed-center",
|
||||||
|
"thin-fixed-right",
|
||||||
|
"thin-center",
|
||||||
"thin-right",
|
"thin-right",
|
||||||
NULL};
|
NULL};
|
||||||
|
|
||||||
|
@ -268,10 +300,14 @@ static int patch_get(lua_State *L)
|
||||||
#endif
|
#endif
|
||||||
enum patch field = luaL_checkoption(L, 2, NULL, patch_opt);
|
enum patch field = luaL_checkoption(L, 2, NULL, patch_opt);
|
||||||
|
|
||||||
// patches are CURRENTLY always valid, expected to be cached with PU_STATIC
|
// patches are invalidated when switching renderers
|
||||||
// this may change in the future, so patch.valid still exists
|
if (!patch) {
|
||||||
if (!patch)
|
if (field == patch_valid) {
|
||||||
|
lua_pushboolean(L, 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
return LUA_ErrInvalid(L, "patch_t");
|
return LUA_ErrInvalid(L, "patch_t");
|
||||||
|
}
|
||||||
|
|
||||||
switch (field)
|
switch (field)
|
||||||
{
|
{
|
||||||
|
@ -424,7 +460,7 @@ static int libd_cachePatch(lua_State *L)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// v.getSpritePatch(sprite, [frame, [angle]])
|
// v.getSpritePatch(sprite, [frame, [angle, [rollangle]]])
|
||||||
static int libd_getSpritePatch(lua_State *L)
|
static int libd_getSpritePatch(lua_State *L)
|
||||||
{
|
{
|
||||||
UINT32 i; // sprite prefix
|
UINT32 i; // sprite prefix
|
||||||
|
@ -475,13 +511,31 @@ static int libd_getSpritePatch(lua_State *L)
|
||||||
if (angle >= ((sprframe->rotate & SRF_3DGE) ? 16 : 8)) // out of range?
|
if (angle >= ((sprframe->rotate & SRF_3DGE) ? 16 : 8)) // out of range?
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
#ifdef ROTSPRITE
|
||||||
|
if (lua_isnumber(L, 4))
|
||||||
|
{
|
||||||
|
// rotsprite?????
|
||||||
|
angle_t rollangle = luaL_checkangle(L, 4);
|
||||||
|
INT32 rot = R_GetRollAngle(rollangle);
|
||||||
|
|
||||||
|
if (rot) {
|
||||||
|
if (!(sprframe->rotsprite.cached & (1<<angle)))
|
||||||
|
R_CacheRotSprite(i, frame, NULL, sprframe, angle, sprframe->flip & (1<<angle));
|
||||||
|
LUA_PushUserdata(L, sprframe->rotsprite.patch[angle][rot], META_PATCH);
|
||||||
|
lua_pushboolean(L, false);
|
||||||
|
lua_pushboolean(L, true);
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// push both the patch and it's "flip" value
|
// push both the patch and it's "flip" value
|
||||||
LUA_PushUserdata(L, W_CachePatchNum(sprframe->lumppat[angle], PU_PATCH), META_PATCH);
|
LUA_PushUserdata(L, W_CachePatchNum(sprframe->lumppat[angle], PU_PATCH), META_PATCH);
|
||||||
lua_pushboolean(L, (sprframe->flip & (1<<angle)) != 0);
|
lua_pushboolean(L, (sprframe->flip & (1<<angle)) != 0);
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// v.getSprite2Patch(skin, sprite, [super?,] [frame, [angle]])
|
// v.getSprite2Patch(skin, sprite, [super?,] [frame, [angle, [rollangle]]])
|
||||||
static int libd_getSprite2Patch(lua_State *L)
|
static int libd_getSprite2Patch(lua_State *L)
|
||||||
{
|
{
|
||||||
INT32 i; // skin number
|
INT32 i; // skin number
|
||||||
|
@ -570,6 +624,24 @@ static int libd_getSprite2Patch(lua_State *L)
|
||||||
if (angle >= ((sprframe->rotate & SRF_3DGE) ? 16 : 8)) // out of range?
|
if (angle >= ((sprframe->rotate & SRF_3DGE) ? 16 : 8)) // out of range?
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
#ifdef ROTSPRITE
|
||||||
|
if (lua_isnumber(L, 4))
|
||||||
|
{
|
||||||
|
// rotsprite?????
|
||||||
|
angle_t rollangle = luaL_checkangle(L, 4);
|
||||||
|
INT32 rot = R_GetRollAngle(rollangle);
|
||||||
|
|
||||||
|
if (rot) {
|
||||||
|
if (!(sprframe->rotsprite.cached & (1<<angle)))
|
||||||
|
R_CacheRotSprite(SPR_PLAY, frame, &skins[i].sprinfo[j], sprframe, angle, sprframe->flip & (1<<angle));
|
||||||
|
LUA_PushUserdata(L, sprframe->rotsprite.patch[angle][rot], META_PATCH);
|
||||||
|
lua_pushboolean(L, false);
|
||||||
|
lua_pushboolean(L, true);
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// push both the patch and it's "flip" value
|
// push both the patch and it's "flip" value
|
||||||
LUA_PushUserdata(L, W_CachePatchNum(sprframe->lumppat[angle], PU_PATCH), META_PATCH);
|
LUA_PushUserdata(L, W_CachePatchNum(sprframe->lumppat[angle], PU_PATCH), META_PATCH);
|
||||||
lua_pushboolean(L, (sprframe->flip & (1<<angle)) != 0);
|
lua_pushboolean(L, (sprframe->flip & (1<<angle)) != 0);
|
||||||
|
@ -735,20 +807,68 @@ static int libd_drawString(lua_State *L)
|
||||||
case align_fixed:
|
case align_fixed:
|
||||||
V_DrawStringAtFixed(x, y, flags, str);
|
V_DrawStringAtFixed(x, y, flags, str);
|
||||||
break;
|
break;
|
||||||
|
case align_fixedcenter:
|
||||||
|
V_DrawCenteredStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_fixedright:
|
||||||
|
V_DrawRightAlignedStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
// hu_font, 0.5x scale
|
// hu_font, 0.5x scale
|
||||||
case align_small:
|
case align_small:
|
||||||
V_DrawSmallString(x, y, flags, str);
|
V_DrawSmallString(x, y, flags, str);
|
||||||
break;
|
break;
|
||||||
|
case align_smallfixed:
|
||||||
|
V_DrawSmallStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallfixedcenter:
|
||||||
|
V_DrawCenteredSmallStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallfixedright:
|
||||||
|
V_DrawRightAlignedSmallStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallcenter:
|
||||||
|
V_DrawCenteredSmallString(x, y, flags, str);
|
||||||
|
break;
|
||||||
case align_smallright:
|
case align_smallright:
|
||||||
V_DrawRightAlignedSmallString(x, y, flags, str);
|
V_DrawRightAlignedSmallString(x, y, flags, str);
|
||||||
break;
|
break;
|
||||||
|
case align_smallthin:
|
||||||
|
V_DrawSmallThinString(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallthincenter:
|
||||||
|
V_DrawCenteredSmallThinString(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallthinright:
|
||||||
|
V_DrawRightAlignedSmallThinString(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallthinfixed:
|
||||||
|
V_DrawSmallThinStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallthinfixedcenter:
|
||||||
|
V_DrawCenteredSmallThinStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallthinfixedright:
|
||||||
|
V_DrawRightAlignedSmallThinStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
// tny_font
|
// tny_font
|
||||||
case align_thin:
|
case align_thin:
|
||||||
V_DrawThinString(x, y, flags, str);
|
V_DrawThinString(x, y, flags, str);
|
||||||
break;
|
break;
|
||||||
|
case align_thincenter:
|
||||||
|
V_DrawCenteredThinString(x, y, flags, str);
|
||||||
|
break;
|
||||||
case align_thinright:
|
case align_thinright:
|
||||||
V_DrawRightAlignedThinString(x, y, flags, str);
|
V_DrawRightAlignedThinString(x, y, flags, str);
|
||||||
break;
|
break;
|
||||||
|
case align_thinfixed:
|
||||||
|
V_DrawThinStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_thinfixedcenter:
|
||||||
|
V_DrawCenteredThinStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_thinfixedright:
|
||||||
|
V_DrawRightAlignedThinStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1214,7 +1334,7 @@ void LUAh_GameHUD(player_t *stplayr)
|
||||||
|
|
||||||
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
||||||
I_Assert(lua_istable(gL, -1));
|
I_Assert(lua_istable(gL, -1));
|
||||||
lua_rawgeti(gL, -1, 2); // HUD[2] = rendering funcs
|
lua_rawgeti(gL, -1, 2+hudhook_game); // HUD[2] = rendering funcs
|
||||||
I_Assert(lua_istable(gL, -1));
|
I_Assert(lua_istable(gL, -1));
|
||||||
|
|
||||||
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
||||||
|
@ -1248,7 +1368,7 @@ void LUAh_ScoresHUD(void)
|
||||||
|
|
||||||
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
||||||
I_Assert(lua_istable(gL, -1));
|
I_Assert(lua_istable(gL, -1));
|
||||||
lua_rawgeti(gL, -1, 3); // HUD[3] = rendering funcs
|
lua_rawgeti(gL, -1, 2+hudhook_scores); // HUD[3] = rendering funcs
|
||||||
I_Assert(lua_istable(gL, -1));
|
I_Assert(lua_istable(gL, -1));
|
||||||
|
|
||||||
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
||||||
|
@ -1273,7 +1393,7 @@ void LUAh_TitleHUD(void)
|
||||||
|
|
||||||
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
||||||
I_Assert(lua_istable(gL, -1));
|
I_Assert(lua_istable(gL, -1));
|
||||||
lua_rawgeti(gL, -1, 4); // HUD[4] = rendering funcs
|
lua_rawgeti(gL, -1, 2+hudhook_title); // HUD[5] = rendering funcs
|
||||||
I_Assert(lua_istable(gL, -1));
|
I_Assert(lua_istable(gL, -1));
|
||||||
|
|
||||||
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
||||||
|
@ -1298,7 +1418,7 @@ void LUAh_TitleCardHUD(player_t *stplayr)
|
||||||
|
|
||||||
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
||||||
I_Assert(lua_istable(gL, -1));
|
I_Assert(lua_istable(gL, -1));
|
||||||
lua_rawgeti(gL, -1, 5); // HUD[5] = rendering funcs
|
lua_rawgeti(gL, -1, 2+hudhook_titlecard); // HUD[6] = rendering funcs
|
||||||
I_Assert(lua_istable(gL, -1));
|
I_Assert(lua_istable(gL, -1));
|
||||||
|
|
||||||
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
||||||
|
@ -1332,7 +1452,7 @@ void LUAh_IntermissionHUD(void)
|
||||||
|
|
||||||
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
||||||
I_Assert(lua_istable(gL, -1));
|
I_Assert(lua_istable(gL, -1));
|
||||||
lua_rawgeti(gL, -1, 4); // HUD[4] = rendering funcs
|
lua_rawgeti(gL, -1, 2+hudhook_intermission); // HUD[4] = rendering funcs
|
||||||
I_Assert(lua_istable(gL, -1));
|
I_Assert(lua_istable(gL, -1));
|
||||||
|
|
||||||
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
||||||
|
|
|
@ -120,6 +120,8 @@ static int player_get(lua_State *L)
|
||||||
lua_pushfixed(L, plr->deltaviewheight);
|
lua_pushfixed(L, plr->deltaviewheight);
|
||||||
else if (fastcmp(field,"bob"))
|
else if (fastcmp(field,"bob"))
|
||||||
lua_pushfixed(L, plr->bob);
|
lua_pushfixed(L, plr->bob);
|
||||||
|
else if (fastcmp(field,"viewrollangle"))
|
||||||
|
lua_pushangle(L, plr->viewrollangle);
|
||||||
else if (fastcmp(field,"aiming"))
|
else if (fastcmp(field,"aiming"))
|
||||||
lua_pushangle(L, plr->aiming);
|
lua_pushangle(L, plr->aiming);
|
||||||
else if (fastcmp(field,"drawangle"))
|
else if (fastcmp(field,"drawangle"))
|
||||||
|
@ -417,6 +419,8 @@ static int player_set(lua_State *L)
|
||||||
plr->deltaviewheight = luaL_checkfixed(L, 3);
|
plr->deltaviewheight = luaL_checkfixed(L, 3);
|
||||||
else if (fastcmp(field,"bob"))
|
else if (fastcmp(field,"bob"))
|
||||||
plr->bob = luaL_checkfixed(L, 3);
|
plr->bob = luaL_checkfixed(L, 3);
|
||||||
|
else if (fastcmp(field,"viewrollangle"))
|
||||||
|
plr->viewrollangle = luaL_checkangle(L, 3);
|
||||||
else if (fastcmp(field,"aiming")) {
|
else if (fastcmp(field,"aiming")) {
|
||||||
plr->aiming = luaL_checkangle(L, 3);
|
plr->aiming = luaL_checkangle(L, 3);
|
||||||
if (plr == &players[consoleplayer])
|
if (plr == &players[consoleplayer])
|
||||||
|
|
|
@ -102,6 +102,9 @@ int LUA_PushGlobals(lua_State *L, const char *word)
|
||||||
} else if (fastcmp(word,"circuitmap")) {
|
} else if (fastcmp(word,"circuitmap")) {
|
||||||
lua_pushboolean(L, circuitmap);
|
lua_pushboolean(L, circuitmap);
|
||||||
return 1;
|
return 1;
|
||||||
|
} else if (fastcmp(word,"stoppedclock")) {
|
||||||
|
lua_pushboolean(L, stoppedclock);
|
||||||
|
return 1;
|
||||||
} else if (fastcmp(word,"netgame")) {
|
} else if (fastcmp(word,"netgame")) {
|
||||||
lua_pushboolean(L, netgame);
|
lua_pushboolean(L, netgame);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
105
src/m_anigif.c
105
src/m_anigif.c
|
@ -19,6 +19,7 @@
|
||||||
#include "v_video.h"
|
#include "v_video.h"
|
||||||
#include "i_video.h"
|
#include "i_video.h"
|
||||||
#include "m_misc.h"
|
#include "m_misc.h"
|
||||||
|
#include "st_stuff.h" // st_palette
|
||||||
|
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
#include "hardware/hw_main.h"
|
#include "hardware/hw_main.h"
|
||||||
|
@ -29,11 +30,17 @@
|
||||||
|
|
||||||
consvar_t cv_gif_optimize = {"gif_optimize", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_gif_optimize = {"gif_optimize", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_gif_downscale = {"gif_downscale", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_gif_downscale = {"gif_downscale", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_gif_localcolortable = {"gif_localcolortable", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
#ifdef HAVE_ANIGIF
|
#ifdef HAVE_ANIGIF
|
||||||
static boolean gif_optimize = false; // So nobody can do something dumb
|
static boolean gif_optimize = false; // So nobody can do something dumb
|
||||||
static boolean gif_downscale = false; // like changing cvars mid output
|
static boolean gif_downscale = false; // like changing cvars mid output
|
||||||
static RGBA_t *gif_palette = NULL;
|
|
||||||
|
// Palette handling
|
||||||
|
static boolean gif_localcolortable = false;
|
||||||
|
static boolean gif_colorprofile = false;
|
||||||
|
static RGBA_t *gif_headerpalette = NULL;
|
||||||
|
static RGBA_t *gif_framepalette = NULL;
|
||||||
|
|
||||||
static FILE *gif_out = NULL;
|
static FILE *gif_out = NULL;
|
||||||
static INT32 gif_frames = 0;
|
static INT32 gif_frames = 0;
|
||||||
|
@ -393,16 +400,47 @@ const UINT8 gifhead_nsid[19] = {0x21,0xFF,0x0B, // extension block + size
|
||||||
0x4E,0x45,0x54,0x53,0x43,0x41,0x50,0x45,0x32,0x2E,0x30, // NETSCAPE2.0
|
0x4E,0x45,0x54,0x53,0x43,0x41,0x50,0x45,0x32,0x2E,0x30, // NETSCAPE2.0
|
||||||
0x03,0x01,0xFF,0xFF,0x00}; // sub-block, repetitions
|
0x03,0x01,0xFF,0xFF,0x00}; // sub-block, repetitions
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// GIF_getpalette
|
||||||
|
// determine the palette for the current frame.
|
||||||
|
//
|
||||||
|
static RGBA_t *GIF_getpalette(size_t palnum)
|
||||||
|
{
|
||||||
|
// In hardware mode, always returns the local palette
|
||||||
|
#ifdef HWRENDER
|
||||||
|
if (rendermode == render_opengl)
|
||||||
|
return pLocalPalette;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
return (gif_colorprofile ? &pLocalPalette[palnum*256] : &pMasterPalette[palnum*256]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// GIF_palwrite
|
||||||
|
// writes the gif palette.
|
||||||
|
// used both for the header and local color tables.
|
||||||
|
//
|
||||||
|
static UINT8 *GIF_palwrite(UINT8 *p, RGBA_t *pal)
|
||||||
|
{
|
||||||
|
INT32 i;
|
||||||
|
for (i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
WRITEUINT8(p, pal[i].s.red);
|
||||||
|
WRITEUINT8(p, pal[i].s.green);
|
||||||
|
WRITEUINT8(p, pal[i].s.blue);
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// GIF_headwrite
|
// GIF_headwrite
|
||||||
// writes the gif header to the currently open output file.
|
// writes the gif header to the currently open output file.
|
||||||
// NOTE that this code does not accomodate for palette changes.
|
|
||||||
//
|
//
|
||||||
static void GIF_headwrite(void)
|
static void GIF_headwrite(void)
|
||||||
{
|
{
|
||||||
UINT8 *gifhead = Z_Malloc(800, PU_STATIC, NULL);
|
UINT8 *gifhead = Z_Malloc(800, PU_STATIC, NULL);
|
||||||
UINT8 *p = gifhead;
|
UINT8 *p = gifhead;
|
||||||
INT32 i;
|
|
||||||
UINT16 rwidth, rheight;
|
UINT16 rwidth, rheight;
|
||||||
|
|
||||||
if (!gif_out)
|
if (!gif_out)
|
||||||
|
@ -423,24 +461,17 @@ static void GIF_headwrite(void)
|
||||||
rwidth = vid.width;
|
rwidth = vid.width;
|
||||||
rheight = vid.height;
|
rheight = vid.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITEUINT16(p, rwidth);
|
WRITEUINT16(p, rwidth);
|
||||||
WRITEUINT16(p, rheight);
|
WRITEUINT16(p, rheight);
|
||||||
|
|
||||||
// colors, aspect, etc
|
// colors, aspect, etc
|
||||||
WRITEUINT8(p, 0xF7);
|
WRITEUINT8(p, 0xF7); // (0xF7 = 1111 0111)
|
||||||
WRITEUINT8(p, 0x00);
|
WRITEUINT8(p, 0x00);
|
||||||
WRITEUINT8(p, 0x00);
|
WRITEUINT8(p, 0x00);
|
||||||
|
|
||||||
// write color table
|
// write color table
|
||||||
{
|
p = GIF_palwrite(p, gif_headerpalette);
|
||||||
RGBA_t *pal = gif_palette;
|
|
||||||
for (i = 0; i < 256; i++)
|
|
||||||
{
|
|
||||||
WRITEUINT8(p, pal[i].s.red);
|
|
||||||
WRITEUINT8(p, pal[i].s.green);
|
|
||||||
WRITEUINT8(p, pal[i].s.blue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// write extension block
|
// write extension block
|
||||||
WRITEMEM(p, gifhead_nsid, sizeof(gifhead_nsid));
|
WRITEMEM(p, gifhead_nsid, sizeof(gifhead_nsid));
|
||||||
|
@ -468,7 +499,7 @@ static void hwrconvert(void)
|
||||||
INT32 x, y;
|
INT32 x, y;
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
InitColorLUT(gif_palette);
|
InitColorLUT(gif_framepalette);
|
||||||
|
|
||||||
for (y = 0; y < vid.height; y++)
|
for (y = 0; y < vid.height; y++)
|
||||||
{
|
{
|
||||||
|
@ -494,6 +525,7 @@ static void GIF_framewrite(void)
|
||||||
UINT8 *p;
|
UINT8 *p;
|
||||||
UINT8 *movie_screen = screens[2];
|
UINT8 *movie_screen = screens[2];
|
||||||
INT32 blitx, blity, blitw, blith;
|
INT32 blitx, blity, blitw, blith;
|
||||||
|
boolean palchanged;
|
||||||
|
|
||||||
if (!gifframe_data)
|
if (!gifframe_data)
|
||||||
gifframe_data = Z_Malloc(gifframe_size, PU_STATIC, NULL);
|
gifframe_data = Z_Malloc(gifframe_size, PU_STATIC, NULL);
|
||||||
|
@ -502,8 +534,18 @@ static void GIF_framewrite(void)
|
||||||
if (!gif_out)
|
if (!gif_out)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Lactozilla: Compare the header's palette with the current frame's palette and see if it changed.
|
||||||
|
if (gif_localcolortable)
|
||||||
|
{
|
||||||
|
gif_framepalette = GIF_getpalette(max(st_palette, 0));
|
||||||
|
palchanged = memcmp(gif_headerpalette, gif_framepalette, sizeof(RGBA_t) * 256);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
palchanged = false;
|
||||||
|
|
||||||
// Compare image data (for optimizing GIF)
|
// Compare image data (for optimizing GIF)
|
||||||
if (gif_optimize && gif_frames > 0)
|
// If the palette has changed, the entire frame is considered to be different.
|
||||||
|
if (gif_optimize && gif_frames > 0 && (!palchanged))
|
||||||
{
|
{
|
||||||
// before blit movie_screen points to last frame, cur_screen points to this frame
|
// before blit movie_screen points to last frame, cur_screen points to this frame
|
||||||
UINT8 *cur_screen = screens[0];
|
UINT8 *cur_screen = screens[0];
|
||||||
|
@ -566,7 +608,20 @@ static void GIF_framewrite(void)
|
||||||
WRITEUINT16(p, (UINT16)(blity / scrbuf_downscaleamt));
|
WRITEUINT16(p, (UINT16)(blity / scrbuf_downscaleamt));
|
||||||
WRITEUINT16(p, (UINT16)(blitw / scrbuf_downscaleamt));
|
WRITEUINT16(p, (UINT16)(blitw / scrbuf_downscaleamt));
|
||||||
WRITEUINT16(p, (UINT16)(blith / scrbuf_downscaleamt));
|
WRITEUINT16(p, (UINT16)(blith / scrbuf_downscaleamt));
|
||||||
|
|
||||||
|
if (!gif_localcolortable)
|
||||||
WRITEUINT8(p, 0); // no local table of colors
|
WRITEUINT8(p, 0); // no local table of colors
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (palchanged)
|
||||||
|
{
|
||||||
|
// The palettes are different, so write the Local Color Table!
|
||||||
|
WRITEUINT8(p, 0x87); // (0x87 = 1000 0111)
|
||||||
|
p = GIF_palwrite(p, gif_framepalette);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
WRITEUINT8(p, 0); // They are equal, no Local Color Table needed.
|
||||||
|
}
|
||||||
|
|
||||||
scrbuf_pos = movie_screen + blitx + (blity * vid.width);
|
scrbuf_pos = movie_screen + blitx + (blity * vid.width);
|
||||||
scrbuf_writeend = scrbuf_pos + (blitw - 1) + ((blith - 1) * vid.width);
|
scrbuf_writeend = scrbuf_pos + (blitw - 1) + ((blith - 1) * vid.width);
|
||||||
|
@ -624,29 +679,15 @@ static void GIF_framewrite(void)
|
||||||
//
|
//
|
||||||
INT32 GIF_open(const char *filename)
|
INT32 GIF_open(const char *filename)
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
if (rendermode != render_soft)
|
|
||||||
{
|
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("GIFs cannot be taken in non-software modes!\n"));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gif_out = fopen(filename, "wb");
|
gif_out = fopen(filename, "wb");
|
||||||
if (!gif_out)
|
if (!gif_out)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
gif_optimize = (!!cv_gif_optimize.value);
|
gif_optimize = (!!cv_gif_optimize.value);
|
||||||
gif_downscale = (!!cv_gif_downscale.value);
|
gif_downscale = (!!cv_gif_downscale.value);
|
||||||
|
gif_localcolortable = (!!cv_gif_localcolortable.value);
|
||||||
// GIF color table
|
gif_colorprofile = (!!cv_screenshot_colorprofile.value);
|
||||||
// In hardware mode, uses the master palette
|
gif_headerpalette = GIF_getpalette(0);
|
||||||
gif_palette = ((cv_screenshot_colorprofile.value
|
|
||||||
#ifdef HWRENDER
|
|
||||||
&& (rendermode == render_soft)
|
|
||||||
#endif
|
|
||||||
) ? pLocalPalette
|
|
||||||
: pMasterPalette);
|
|
||||||
|
|
||||||
GIF_headwrite();
|
GIF_headwrite();
|
||||||
gif_frames = 0;
|
gif_frames = 0;
|
||||||
|
|
|
@ -27,6 +27,6 @@ void GIF_frame(void);
|
||||||
INT32 GIF_close(void);
|
INT32 GIF_close(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern consvar_t cv_gif_optimize, cv_gif_downscale;
|
extern consvar_t cv_gif_optimize, cv_gif_downscale, cv_gif_localcolortable;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
21
src/m_argv.c
21
src/m_argv.c
|
@ -92,36 +92,21 @@ const char *M_GetNextParm(void)
|
||||||
void M_PushSpecialParameters(void)
|
void M_PushSpecialParameters(void)
|
||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
char s[256];
|
|
||||||
boolean onetime = false;
|
|
||||||
|
|
||||||
for (i = 1; i < myargc; i++)
|
for (i = 1; i < myargc; i++)
|
||||||
{
|
{
|
||||||
if (myargv[i][0] == '+')
|
if (myargv[i][0] == '+')
|
||||||
{
|
{
|
||||||
strcpy(s, &myargv[i][1]);
|
COM_BufAddText(&myargv[i][1]);
|
||||||
i++;
|
i++;
|
||||||
|
|
||||||
// get the parameters of the command too
|
// get the parameters of the command too
|
||||||
for (; i < myargc && myargv[i][0] != '+' && myargv[i][0] != '-'; i++)
|
for (; i < myargc && myargv[i][0] != '+' && myargv[i][0] != '-'; i++)
|
||||||
{
|
{
|
||||||
strcat(s, " ");
|
COM_BufAddText(va(" \"%s\"", myargv[i]));
|
||||||
if (!onetime)
|
|
||||||
{
|
|
||||||
strcat(s, "\"");
|
|
||||||
onetime = true;
|
|
||||||
}
|
}
|
||||||
strcat(s, myargv[i]);
|
|
||||||
}
|
|
||||||
if (onetime)
|
|
||||||
{
|
|
||||||
strcat(s, "\"");
|
|
||||||
onetime = false;
|
|
||||||
}
|
|
||||||
strcat(s, "\n");
|
|
||||||
|
|
||||||
// push it
|
// push it
|
||||||
COM_BufAddText(s);
|
COM_BufAddText("\n");
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
147
src/m_menu.c
147
src/m_menu.c
|
@ -231,6 +231,8 @@ static void M_Credits(INT32 choice);
|
||||||
static void M_SoundTest(INT32 choice);
|
static void M_SoundTest(INT32 choice);
|
||||||
static void M_PandorasBox(INT32 choice);
|
static void M_PandorasBox(INT32 choice);
|
||||||
static void M_EmblemHints(INT32 choice);
|
static void M_EmblemHints(INT32 choice);
|
||||||
|
static void M_HandleEmblemHints(INT32 choice);
|
||||||
|
UINT32 hintpage = 1;
|
||||||
static void M_HandleChecklist(INT32 choice);
|
static void M_HandleChecklist(INT32 choice);
|
||||||
menu_t SR_MainDef, SR_UnlockChecklistDef;
|
menu_t SR_MainDef, SR_UnlockChecklistDef;
|
||||||
|
|
||||||
|
@ -323,6 +325,7 @@ menu_t OP_DataOptionsDef, OP_ScreenshotOptionsDef, OP_EraseDataDef;
|
||||||
menu_t OP_ServerOptionsDef;
|
menu_t OP_ServerOptionsDef;
|
||||||
menu_t OP_MonitorToggleDef;
|
menu_t OP_MonitorToggleDef;
|
||||||
static void M_ScreenshotOptions(INT32 choice);
|
static void M_ScreenshotOptions(INT32 choice);
|
||||||
|
static void M_SetupScreenshotMenu(void);
|
||||||
static void M_EraseData(INT32 choice);
|
static void M_EraseData(INT32 choice);
|
||||||
|
|
||||||
static void M_Addons(INT32 choice);
|
static void M_Addons(INT32 choice);
|
||||||
|
@ -364,7 +367,6 @@ static void M_DrawMonitorToggles(void);
|
||||||
static void M_OGL_DrawFogMenu(void);
|
static void M_OGL_DrawFogMenu(void);
|
||||||
#endif
|
#endif
|
||||||
#ifndef NONET
|
#ifndef NONET
|
||||||
static void M_DrawScreenshotMenu(void);
|
|
||||||
static void M_DrawConnectMenu(void);
|
static void M_DrawConnectMenu(void);
|
||||||
static void M_DrawMPMainMenu(void);
|
static void M_DrawMPMainMenu(void);
|
||||||
static void M_DrawRoomMenu(void);
|
static void M_DrawRoomMenu(void);
|
||||||
|
@ -727,8 +729,9 @@ static menuitem_t SR_SoundTestMenu[] =
|
||||||
|
|
||||||
static menuitem_t SR_EmblemHintMenu[] =
|
static menuitem_t SR_EmblemHintMenu[] =
|
||||||
{
|
{
|
||||||
{IT_STRING|IT_CVAR, NULL, "Emblem Radar", &cv_itemfinder, 10},
|
{IT_STRING | IT_ARROWS, NULL, "Page", M_HandleEmblemHints, 10},
|
||||||
{IT_WHITESTRING|IT_SUBMENU, NULL, "Back", &SPauseDef, 20}
|
{IT_STRING|IT_CVAR, NULL, "Emblem Radar", &cv_itemfinder, 20},
|
||||||
|
{IT_WHITESTRING|IT_SUBMENU, NULL, "Back", &SPauseDef, 30}
|
||||||
};
|
};
|
||||||
|
|
||||||
// --------------------------------
|
// --------------------------------
|
||||||
|
@ -1514,6 +1517,7 @@ static menuitem_t OP_ScreenshotOptionsMenu[] =
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Region Optimizing", &cv_gif_optimize, 95},
|
{IT_STRING|IT_CVAR, NULL, "Region Optimizing", &cv_gif_optimize, 95},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Downscaling", &cv_gif_downscale, 100},
|
{IT_STRING|IT_CVAR, NULL, "Downscaling", &cv_gif_downscale, 100},
|
||||||
|
{IT_STRING|IT_CVAR, NULL, "Local Color Table", &cv_gif_localcolortable, 105},
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Memory Level", &cv_zlib_memorya, 95},
|
{IT_STRING|IT_CVAR, NULL, "Memory Level", &cv_zlib_memorya, 95},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Compression Level", &cv_zlib_levela, 100},
|
{IT_STRING|IT_CVAR, NULL, "Compression Level", &cv_zlib_levela, 100},
|
||||||
|
@ -1524,13 +1528,14 @@ static menuitem_t OP_ScreenshotOptionsMenu[] =
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
op_screenshot_colorprofile = 1,
|
op_screenshot_colorprofile = 1,
|
||||||
|
op_screenshot_storagelocation = 3,
|
||||||
op_screenshot_folder = 4,
|
op_screenshot_folder = 4,
|
||||||
op_movie_folder = 11,
|
op_movie_folder = 11,
|
||||||
op_screenshot_capture = 12,
|
op_screenshot_capture = 12,
|
||||||
op_screenshot_gif_start = 13,
|
op_screenshot_gif_start = 13,
|
||||||
op_screenshot_gif_end = 14,
|
op_screenshot_gif_end = 15,
|
||||||
op_screenshot_apng_start = 15,
|
op_screenshot_apng_start = 16,
|
||||||
op_screenshot_apng_end = 18,
|
op_screenshot_apng_end = 19,
|
||||||
};
|
};
|
||||||
|
|
||||||
static menuitem_t OP_EraseDataMenu[] =
|
static menuitem_t OP_EraseDataMenu[] =
|
||||||
|
@ -3028,7 +3033,8 @@ static void M_ChangeCvar(INT32 choice)
|
||||||
|| !(currentMenu->menuitems[itemOn].status & IT_CV_INTEGERSTEP))
|
|| !(currentMenu->menuitems[itemOn].status & IT_CV_INTEGERSTEP))
|
||||||
{
|
{
|
||||||
char s[20];
|
char s[20];
|
||||||
sprintf(s,"%f",FIXED_TO_FLOAT(cv->value)+(choice)*(1.0f/16.0f));
|
float n = FIXED_TO_FLOAT(cv->value)+(choice)*(1.0f/16.0f);
|
||||||
|
sprintf(s,"%ld%s",(long)n,M_Ftrim(n));
|
||||||
CV_Set(cv,s);
|
CV_Set(cv,s);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -3785,6 +3791,9 @@ void M_Ticker(void)
|
||||||
if (--vidm_testingmode == 0)
|
if (--vidm_testingmode == 0)
|
||||||
setmodeneeded = vidm_previousmode + 1;
|
setmodeneeded = vidm_previousmode + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (currentMenu == &OP_ScreenshotOptionsDef)
|
||||||
|
M_SetupScreenshotMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -7234,18 +7243,33 @@ finishchecklist:
|
||||||
}
|
}
|
||||||
|
|
||||||
#define NUMHINTS 5
|
#define NUMHINTS 5
|
||||||
|
|
||||||
static void M_EmblemHints(INT32 choice)
|
static void M_EmblemHints(INT32 choice)
|
||||||
{
|
{
|
||||||
|
INT32 i;
|
||||||
|
UINT32 local = 0;
|
||||||
|
emblem_t *emblem;
|
||||||
|
for (i = 0; i < numemblems; i++)
|
||||||
|
{
|
||||||
|
emblem = &emblemlocations[i];
|
||||||
|
if (emblem->level != gamemap || emblem->type > ET_SKIN)
|
||||||
|
continue;
|
||||||
|
if (++local > NUMHINTS*2)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
(void)choice;
|
(void)choice;
|
||||||
SR_EmblemHintMenu[0].status = (M_SecretUnlocked(SECRET_ITEMFINDER)) ? (IT_CVAR|IT_STRING) : (IT_SECRET);
|
SR_EmblemHintMenu[0].status = (local > NUMHINTS*2) ? (IT_STRING | IT_ARROWS) : (IT_DISABLED);
|
||||||
|
SR_EmblemHintMenu[1].status = (M_SecretUnlocked(SECRET_ITEMFINDER)) ? (IT_CVAR|IT_STRING) : (IT_SECRET);
|
||||||
|
hintpage = 1;
|
||||||
M_SetupNextMenu(&SR_EmblemHintDef);
|
M_SetupNextMenu(&SR_EmblemHintDef);
|
||||||
itemOn = 1; // always start on back.
|
itemOn = 2; // always start on back.
|
||||||
}
|
}
|
||||||
|
|
||||||
static void M_DrawEmblemHints(void)
|
static void M_DrawEmblemHints(void)
|
||||||
{
|
{
|
||||||
INT32 i, j = 0, x, y, left_hints = NUMHINTS;
|
INT32 i, j = 0, x, y, left_hints = NUMHINTS, pageflag = 0;
|
||||||
UINT32 collected = 0, local = 0;
|
UINT32 collected = 0, totalemblems = 0, local = 0;
|
||||||
emblem_t *emblem;
|
emblem_t *emblem;
|
||||||
const char *hint;
|
const char *hint;
|
||||||
|
|
||||||
|
@ -7254,17 +7278,34 @@ static void M_DrawEmblemHints(void)
|
||||||
emblem = &emblemlocations[i];
|
emblem = &emblemlocations[i];
|
||||||
if (emblem->level != gamemap || emblem->type > ET_SKIN)
|
if (emblem->level != gamemap || emblem->type > ET_SKIN)
|
||||||
continue;
|
continue;
|
||||||
if (++local >= NUMHINTS*2)
|
|
||||||
break;
|
local++;
|
||||||
}
|
}
|
||||||
|
|
||||||
x = (local > NUMHINTS ? 4 : 12);
|
x = (local > NUMHINTS ? 4 : 12);
|
||||||
y = 8;
|
y = 8;
|
||||||
|
|
||||||
// If there are more than 1 page's but less than 2 pages' worth of emblems,
|
if (local > NUMHINTS){
|
||||||
|
if (local > ((hintpage-1)*NUMHINTS*2) && local < ((hintpage)*NUMHINTS*2)){
|
||||||
|
if (NUMHINTS % 2 == 1)
|
||||||
|
left_hints = (local - ((hintpage-1)*NUMHINTS*2) + 1) / 2;
|
||||||
|
else
|
||||||
|
left_hints = (local - ((hintpage-1)*NUMHINTS*2)) / 2;
|
||||||
|
}else{
|
||||||
|
left_hints = NUMHINTS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (local > NUMHINTS*2){
|
||||||
|
if (itemOn == 0){
|
||||||
|
pageflag = V_YELLOWMAP;
|
||||||
|
}
|
||||||
|
V_DrawString(currentMenu->x + 40, currentMenu->y + 10, pageflag, va("%d of %d",hintpage, local/(NUMHINTS*2) + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there are more than 1 page's but less than 2 pages' worth of emblems on the last possible page,
|
||||||
// put half (rounded up) of the hints on the left, and half (rounded down) on the right
|
// put half (rounded up) of the hints on the left, and half (rounded down) on the right
|
||||||
if (local > NUMHINTS && local < (NUMHINTS*2)-1)
|
|
||||||
left_hints = (local + 1) / 2;
|
|
||||||
|
|
||||||
if (!local)
|
if (!local)
|
||||||
V_DrawCenteredString(160, 48, V_YELLOWMAP, "No hidden emblems on this map.");
|
V_DrawCenteredString(160, 48, V_YELLOWMAP, "No hidden emblems on this map.");
|
||||||
|
@ -7274,6 +7315,10 @@ static void M_DrawEmblemHints(void)
|
||||||
if (emblem->level != gamemap || emblem->type > ET_SKIN)
|
if (emblem->level != gamemap || emblem->type > ET_SKIN)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
totalemblems++;
|
||||||
|
|
||||||
|
if (totalemblems >= ((hintpage-1)*(NUMHINTS*2) + 1) && totalemblems < (hintpage*NUMHINTS*2)+1){
|
||||||
|
|
||||||
if (emblem->collected)
|
if (emblem->collected)
|
||||||
{
|
{
|
||||||
collected = V_GREENMAP;
|
collected = V_GREENMAP;
|
||||||
|
@ -7291,6 +7336,7 @@ static void M_DrawEmblemHints(void)
|
||||||
else
|
else
|
||||||
hint = M_GetText("No hint available for this emblem.");
|
hint = M_GetText("No hint available for this emblem.");
|
||||||
hint = V_WordWrap(40, BASEVIDWIDTH-12, 0, hint);
|
hint = V_WordWrap(40, BASEVIDWIDTH-12, 0, hint);
|
||||||
|
//always draw tiny if we have more than NUMHINTS*2, visually more appealing
|
||||||
if (local > NUMHINTS)
|
if (local > NUMHINTS)
|
||||||
V_DrawThinString(x+28, y, V_RETURN8|V_ALLOWLOWERCASE|collected, hint);
|
V_DrawThinString(x+28, y, V_RETURN8|V_ALLOWLOWERCASE|collected, hint);
|
||||||
else
|
else
|
||||||
|
@ -7298,6 +7344,9 @@ static void M_DrawEmblemHints(void)
|
||||||
|
|
||||||
y += 28;
|
y += 28;
|
||||||
|
|
||||||
|
// If there are more than 1 page's but less than 2 pages' worth of emblems on the last possible page,
|
||||||
|
// put half (rounded up) of the hints on the left, and half (rounded down) on the right
|
||||||
|
|
||||||
if (++j == left_hints)
|
if (++j == left_hints)
|
||||||
{
|
{
|
||||||
x = 4+(BASEVIDWIDTH/2);
|
x = 4+(BASEVIDWIDTH/2);
|
||||||
|
@ -7306,10 +7355,40 @@ static void M_DrawEmblemHints(void)
|
||||||
else if (j >= NUMHINTS*2)
|
else if (j >= NUMHINTS*2)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
M_DrawGenericMenu();
|
M_DrawGenericMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void M_HandleEmblemHints(INT32 choice)
|
||||||
|
{
|
||||||
|
INT32 i;
|
||||||
|
emblem_t *emblem;
|
||||||
|
UINT32 stageemblems = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < numemblems; i++)
|
||||||
|
{
|
||||||
|
emblem = &emblemlocations[i];
|
||||||
|
if (emblem->level != gamemap || emblem->type > ET_SKIN)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
stageemblems++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (choice == 0){
|
||||||
|
if (hintpage > 1){
|
||||||
|
hintpage--;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if (hintpage < ((stageemblems-1)/(NUMHINTS*2) + 1)){
|
||||||
|
hintpage++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/*static void M_DrawSkyRoom(void)
|
/*static void M_DrawSkyRoom(void)
|
||||||
{
|
{
|
||||||
INT32 i, y = 0;
|
INT32 i, y = 0;
|
||||||
|
@ -8067,10 +8146,18 @@ static void M_DrawLoadGameData(void)
|
||||||
else if (savegameinfo[savetodraw].botskin) // tailsbot or custom
|
else if (savegameinfo[savetodraw].botskin) // tailsbot or custom
|
||||||
col = 134;
|
col = 134;
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if (charskin->prefoppositecolor)
|
||||||
|
{
|
||||||
|
col = charskin->prefoppositecolor - 1;
|
||||||
|
col = Color_Index[col][Color_Opposite[Color_Opposite[col][0] - 1][1]];
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
col = charskin->prefcolor - 1;
|
col = charskin->prefcolor - 1;
|
||||||
col = Color_Index[Color_Opposite[col][0]-1][Color_Opposite[col][1]];
|
col = Color_Index[Color_Opposite[col][0]-1][Color_Opposite[col][1]];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
V_DrawFill(x+6, y+64, 72, 50, col);
|
V_DrawFill(x+6, y+64, 72, 50, col);
|
||||||
}
|
}
|
||||||
|
@ -10846,7 +10933,6 @@ static void M_HandleConnectIP(INT32 choice)
|
||||||
default: // otherwise do nothing.
|
default: // otherwise do nothing.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break; // don't check for typed keys
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (l >= 28-1)
|
if (l >= 28-1)
|
||||||
|
@ -11350,9 +11436,27 @@ static void M_ScreenshotOptions(INT32 choice)
|
||||||
Screenshot_option_Onchange();
|
Screenshot_option_Onchange();
|
||||||
Moviemode_mode_Onchange();
|
Moviemode_mode_Onchange();
|
||||||
|
|
||||||
|
M_SetupScreenshotMenu();
|
||||||
M_SetupNextMenu(&OP_ScreenshotOptionsDef);
|
M_SetupNextMenu(&OP_ScreenshotOptionsDef);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void M_SetupScreenshotMenu(void)
|
||||||
|
{
|
||||||
|
menuitem_t *item = &OP_ScreenshotOptionsMenu[op_screenshot_colorprofile];
|
||||||
|
|
||||||
|
#ifdef HWRENDER
|
||||||
|
// Hide some options based on render mode
|
||||||
|
if (rendermode == render_opengl)
|
||||||
|
{
|
||||||
|
item->status = IT_GRAYEDOUT;
|
||||||
|
if ((currentMenu == &OP_ScreenshotOptionsDef) && (itemOn == op_screenshot_colorprofile)) // Can't select that
|
||||||
|
itemOn = op_screenshot_storagelocation;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
item->status = (IT_STRING | IT_CVAR);
|
||||||
|
}
|
||||||
|
|
||||||
// =============
|
// =============
|
||||||
// JOYSTICK MENU
|
// JOYSTICK MENU
|
||||||
// =============
|
// =============
|
||||||
|
@ -12295,6 +12399,15 @@ static void M_HandleVideoMode(INT32 ch)
|
||||||
static void M_DrawScreenshotMenu(void)
|
static void M_DrawScreenshotMenu(void)
|
||||||
{
|
{
|
||||||
M_DrawGenericScrollMenu();
|
M_DrawGenericScrollMenu();
|
||||||
|
#ifdef HWRENDER
|
||||||
|
if ((rendermode == render_opengl) && (itemOn < 7)) // where it starts to go offscreen; change this number if you change the layout of the screenshot menu
|
||||||
|
{
|
||||||
|
INT32 y = currentMenu->y+currentMenu->menuitems[op_screenshot_colorprofile].alphaKey*2;
|
||||||
|
if (itemOn == 6)
|
||||||
|
y -= 10;
|
||||||
|
V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, y, V_REDMAP, "Yes");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===============
|
// ===============
|
||||||
|
|
18
src/m_misc.c
18
src/m_misc.c
|
@ -2612,3 +2612,21 @@ int M_JumpWordReverse(const char *line, int offset)
|
||||||
offset--;
|
offset--;
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char * M_Ftrim (double f)
|
||||||
|
{
|
||||||
|
static char dig[9];/* "0." + 6 digits (6 is printf's default) */
|
||||||
|
int i;
|
||||||
|
/* I know I said it's the default, but just in case... */
|
||||||
|
sprintf(dig, "%.6f", fabs(modf(f, &f)));
|
||||||
|
/* trim trailing zeroes */
|
||||||
|
for (i = strlen(dig)-1; dig[i] == '0'; --i)
|
||||||
|
;
|
||||||
|
if (dig[i] == '.')/* :NOTHING: */
|
||||||
|
return "";
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dig[i + 1] = '\0';
|
||||||
|
return &dig[1];/* skip the 0 */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -109,6 +109,12 @@ int M_JumpWord (const char *s);
|
||||||
/* E.g. cursor = M_JumpWordReverse(line, cursor); */
|
/* E.g. cursor = M_JumpWordReverse(line, cursor); */
|
||||||
int M_JumpWordReverse (const char *line, int offset);
|
int M_JumpWordReverse (const char *line, int offset);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Return dot and then the fractional part of a float, without
|
||||||
|
trailing zeros, or "" if the fractional part is zero.
|
||||||
|
*/
|
||||||
|
const char * M_Ftrim (double);
|
||||||
|
|
||||||
// counting bits, for weapon ammo code, usually
|
// counting bits, for weapon ammo code, usually
|
||||||
FUNCMATH UINT8 M_CountBits(UINT32 num, UINT8 size);
|
FUNCMATH UINT8 M_CountBits(UINT32 num, UINT8 size);
|
||||||
|
|
||||||
|
|
|
@ -5198,8 +5198,8 @@ void A_SignPlayer(mobj_t *actor)
|
||||||
player_t *player = actor->target ? actor->target->player : NULL;
|
player_t *player = actor->target ? actor->target->player : NULL;
|
||||||
UINT8 skinnum;
|
UINT8 skinnum;
|
||||||
UINT8 skincount = 0;
|
UINT8 skincount = 0;
|
||||||
for (skincount = 0; skincount < numskins; skincount++)
|
for (skinnum = 0; skinnum < numskins; skinnum++)
|
||||||
if (!skincheck(skincount))
|
if (!skincheck(skinnum))
|
||||||
skincount++;
|
skincount++;
|
||||||
skinnum = P_RandomKey(skincount);
|
skinnum = P_RandomKey(skincount);
|
||||||
for (skincount = 0; skincount < numskins; skincount++)
|
for (skincount = 0; skincount < numskins; skincount++)
|
||||||
|
@ -5232,12 +5232,14 @@ void A_SignPlayer(mobj_t *actor)
|
||||||
{
|
{
|
||||||
ov->color = facecolor;
|
ov->color = facecolor;
|
||||||
ov->skin = skin;
|
ov->skin = skin;
|
||||||
|
if ((statenum_t)(ov->state-states) != actor->info->seestate)
|
||||||
P_SetMobjState(ov, actor->info->seestate); // S_PLAY_SIGN
|
P_SetMobjState(ov, actor->info->seestate); // S_PLAY_SIGN
|
||||||
}
|
}
|
||||||
else // CLEAR! sign
|
else // CLEAR! sign
|
||||||
{
|
{
|
||||||
ov->color = SKINCOLOR_NONE;
|
ov->color = SKINCOLOR_NONE;
|
||||||
ov->skin = NULL; // needs to be NULL in the case of SF_HIRES characters
|
ov->skin = NULL; // needs to be NULL in the case of SF_HIRES characters
|
||||||
|
if ((statenum_t)(ov->state-states) != actor->info->missilestate)
|
||||||
P_SetMobjState(ov, actor->info->missilestate); // S_CLEARSIGN
|
P_SetMobjState(ov, actor->info->missilestate); // S_CLEARSIGN
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5245,6 +5247,7 @@ void A_SignPlayer(mobj_t *actor)
|
||||||
{
|
{
|
||||||
ov->color = SKINCOLOR_NONE;
|
ov->color = SKINCOLOR_NONE;
|
||||||
ov->skin = NULL;
|
ov->skin = NULL;
|
||||||
|
if ((statenum_t)(ov->state-states) != actor->info->meleestate)
|
||||||
P_SetMobjState(ov, actor->info->meleestate); // S_EGGMANSIGN
|
P_SetMobjState(ov, actor->info->meleestate); // S_EGGMANSIGN
|
||||||
if (!signcolor)
|
if (!signcolor)
|
||||||
signcolor = SKINCOLOR_CARBON;
|
signcolor = SKINCOLOR_CARBON;
|
||||||
|
|
200
src/p_inter.c
200
src/p_inter.c
|
@ -1428,98 +1428,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
// Misc touchables //
|
// Misc touchables //
|
||||||
// *************** //
|
// *************** //
|
||||||
case MT_STARPOST:
|
case MT_STARPOST:
|
||||||
if (player->bot)
|
P_TouchStarPost(special, player, special->spawnpoint && (special->spawnpoint->options & MTF_OBJECTSPECIAL));
|
||||||
return;
|
|
||||||
// In circuit, player must have touched all previous starposts
|
|
||||||
if (circuitmap
|
|
||||||
&& special->health - player->starpostnum > 1)
|
|
||||||
{
|
|
||||||
// blatant reuse of a variable that's normally unused in circuit
|
|
||||||
if (!player->tossdelay)
|
|
||||||
S_StartSound(toucher, sfx_lose);
|
|
||||||
player->tossdelay = 3;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We could technically have 91.1 Star Posts. 90 is cleaner.
|
|
||||||
if (special->health > 90)
|
|
||||||
{
|
|
||||||
CONS_Debug(DBG_GAMELOGIC, "Bad Starpost Number!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player->starpostnum >= special->health)
|
|
||||||
return; // Already hit this post
|
|
||||||
|
|
||||||
if (cv_coopstarposts.value && G_GametypeUsesCoopStarposts() && (netgame || multiplayer))
|
|
||||||
{
|
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
|
||||||
{
|
|
||||||
if (playeringame[i])
|
|
||||||
{
|
|
||||||
if (players[i].bot) // ignore dumb, stupid tails
|
|
||||||
continue;
|
|
||||||
|
|
||||||
players[i].starposttime = leveltime;
|
|
||||||
players[i].starpostx = player->mo->x>>FRACBITS;
|
|
||||||
players[i].starposty = player->mo->y>>FRACBITS;
|
|
||||||
players[i].starpostz = special->z>>FRACBITS;
|
|
||||||
players[i].starpostangle = special->angle;
|
|
||||||
players[i].starpostscale = player->mo->destscale;
|
|
||||||
if (special->flags2 & MF2_OBJECTFLIP)
|
|
||||||
{
|
|
||||||
players[i].starpostscale *= -1;
|
|
||||||
players[i].starpostz += special->height>>FRACBITS;
|
|
||||||
}
|
|
||||||
players[i].starpostnum = special->health;
|
|
||||||
|
|
||||||
if (cv_coopstarposts.value == 2 && (players[i].playerstate == PST_DEAD || players[i].spectator) && P_GetLives(&players[i]))
|
|
||||||
P_SpectatorJoinGame(&players[i]); //players[i].playerstate = PST_REBORN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
S_StartSound(NULL, special->info->painsound);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Save the player's time and position.
|
|
||||||
player->starposttime = leveltime;
|
|
||||||
player->starpostx = toucher->x>>FRACBITS;
|
|
||||||
player->starposty = toucher->y>>FRACBITS;
|
|
||||||
player->starpostz = special->z>>FRACBITS;
|
|
||||||
player->starpostangle = special->angle;
|
|
||||||
player->starpostscale = player->mo->destscale;
|
|
||||||
if (special->flags2 & MF2_OBJECTFLIP)
|
|
||||||
{
|
|
||||||
player->starpostscale *= -1;
|
|
||||||
player->starpostz += special->height>>FRACBITS;
|
|
||||||
}
|
|
||||||
player->starpostnum = special->health;
|
|
||||||
S_StartSound(toucher, special->info->painsound);
|
|
||||||
}
|
|
||||||
|
|
||||||
P_ClearStarPost(special->health);
|
|
||||||
|
|
||||||
// Find all starposts in the level with this value - INCLUDING this one!
|
|
||||||
if (!(netgame && circuitmap && player != &players[consoleplayer]))
|
|
||||||
{
|
|
||||||
thinker_t *th;
|
|
||||||
mobj_t *mo2;
|
|
||||||
|
|
||||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
|
||||||
{
|
|
||||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
mo2 = (mobj_t *)th;
|
|
||||||
|
|
||||||
if (mo2->type != MT_STARPOST)
|
|
||||||
continue;
|
|
||||||
if (mo2->health != special->health)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
P_SetMobjState(mo2, mo2->info->painstate);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case MT_FAKEMOBILE:
|
case MT_FAKEMOBILE:
|
||||||
|
@ -1872,6 +1781,112 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
special->shadowscale = 0;
|
special->shadowscale = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Saves a player's level progress at a star post
|
||||||
|
*
|
||||||
|
* \param post The star post to trigger
|
||||||
|
* \param player The player that should receive the checkpoint
|
||||||
|
* \param snaptopost If true, the respawn point will use the star post's position, otherwise player x/y and star post z
|
||||||
|
*/
|
||||||
|
void P_TouchStarPost(mobj_t *post, player_t *player, boolean snaptopost)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
mobj_t *toucher = player->mo;
|
||||||
|
mobj_t *checkbase = snaptopost ? post : toucher;
|
||||||
|
|
||||||
|
if (player->bot)
|
||||||
|
return;
|
||||||
|
// In circuit, player must have touched all previous starposts
|
||||||
|
if (circuitmap
|
||||||
|
&& post->health - player->starpostnum > 1)
|
||||||
|
{
|
||||||
|
// blatant reuse of a variable that's normally unused in circuit
|
||||||
|
if (!player->tossdelay)
|
||||||
|
S_StartSound(toucher, sfx_lose);
|
||||||
|
player->tossdelay = 3;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// With the parameter + angle setup, we can go up to 1365 star posts. Who needs that many?
|
||||||
|
if (post->health > 1365)
|
||||||
|
{
|
||||||
|
CONS_Debug(DBG_GAMELOGIC, "Bad Starpost Number!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player->starpostnum >= post->health)
|
||||||
|
return; // Already hit this post
|
||||||
|
|
||||||
|
if (cv_coopstarposts.value && G_GametypeUsesCoopStarposts() && (netgame || multiplayer))
|
||||||
|
{
|
||||||
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
|
{
|
||||||
|
if (playeringame[i])
|
||||||
|
{
|
||||||
|
if (players[i].bot) // ignore dumb, stupid tails
|
||||||
|
continue;
|
||||||
|
|
||||||
|
players[i].starposttime = leveltime;
|
||||||
|
players[i].starpostx = checkbase->x>>FRACBITS;
|
||||||
|
players[i].starposty = checkbase->y>>FRACBITS;
|
||||||
|
players[i].starpostz = post->z>>FRACBITS;
|
||||||
|
players[i].starpostangle = post->angle;
|
||||||
|
players[i].starpostscale = player->mo->destscale;
|
||||||
|
if (post->flags2 & MF2_OBJECTFLIP)
|
||||||
|
{
|
||||||
|
players[i].starpostscale *= -1;
|
||||||
|
players[i].starpostz += post->height>>FRACBITS;
|
||||||
|
}
|
||||||
|
players[i].starpostnum = post->health;
|
||||||
|
|
||||||
|
if (cv_coopstarposts.value == 2 && (players[i].playerstate == PST_DEAD || players[i].spectator) && P_GetLives(&players[i]))
|
||||||
|
P_SpectatorJoinGame(&players[i]); //players[i].playerstate = PST_REBORN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
S_StartSound(NULL, post->info->painsound);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Save the player's time and position.
|
||||||
|
player->starposttime = leveltime;
|
||||||
|
player->starpostx = checkbase->x>>FRACBITS;
|
||||||
|
player->starposty = checkbase->y>>FRACBITS;
|
||||||
|
player->starpostz = post->z>>FRACBITS;
|
||||||
|
player->starpostangle = post->angle;
|
||||||
|
player->starpostscale = player->mo->destscale;
|
||||||
|
if (post->flags2 & MF2_OBJECTFLIP)
|
||||||
|
{
|
||||||
|
player->starpostscale *= -1;
|
||||||
|
player->starpostz += post->height>>FRACBITS;
|
||||||
|
}
|
||||||
|
player->starpostnum = post->health;
|
||||||
|
S_StartSound(toucher, post->info->painsound);
|
||||||
|
}
|
||||||
|
|
||||||
|
P_ClearStarPost(post->health);
|
||||||
|
|
||||||
|
// Find all starposts in the level with this value - INCLUDING this one!
|
||||||
|
if (!(netgame && circuitmap && player != &players[consoleplayer]))
|
||||||
|
{
|
||||||
|
thinker_t *th;
|
||||||
|
mobj_t *mo2;
|
||||||
|
|
||||||
|
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||||
|
{
|
||||||
|
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
mo2 = (mobj_t *)th;
|
||||||
|
|
||||||
|
if (mo2->type != MT_STARPOST)
|
||||||
|
continue;
|
||||||
|
if (mo2->health != post->health)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
P_SetMobjState(mo2, mo2->info->painstate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Prints death messages relating to a dying or hit player.
|
/** Prints death messages relating to a dying or hit player.
|
||||||
*
|
*
|
||||||
* \param player Affected player.
|
* \param player Affected player.
|
||||||
|
@ -2527,6 +2542,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
||||||
else if (!target->player->bot && !target->player->spectator && (target->player->lives != INFLIVES)
|
else if (!target->player->bot && !target->player->spectator && (target->player->lives != INFLIVES)
|
||||||
&& G_GametypeUsesLives())
|
&& G_GametypeUsesLives())
|
||||||
{
|
{
|
||||||
|
if (!(target->player->pflags & PF_FINISHED))
|
||||||
target->player->lives -= 1; // Lose a life Tails 03-11-2000
|
target->player->lives -= 1; // Lose a life Tails 03-11-2000
|
||||||
|
|
||||||
if (target->player->lives <= 0) // Tails 03-14-2000
|
if (target->player->lives <= 0) // Tails 03-14-2000
|
||||||
|
|
|
@ -159,6 +159,7 @@ void P_GivePlayerLives(player_t *player, INT32 numlives);
|
||||||
void P_GiveCoopLives(player_t *player, INT32 numlives, boolean sound);
|
void P_GiveCoopLives(player_t *player, INT32 numlives, boolean sound);
|
||||||
UINT8 P_GetNextEmerald(void);
|
UINT8 P_GetNextEmerald(void);
|
||||||
void P_GiveEmerald(boolean spawnObj);
|
void P_GiveEmerald(boolean spawnObj);
|
||||||
|
void P_GiveFinishFlags(player_t *player);
|
||||||
#if 0
|
#if 0
|
||||||
void P_ResetScore(player_t *player);
|
void P_ResetScore(player_t *player);
|
||||||
#else
|
#else
|
||||||
|
@ -487,6 +488,7 @@ void P_PlayerWeaponPanelOrAmmoBurst(player_t *player);
|
||||||
void P_PlayerEmeraldBurst(player_t *player, boolean toss);
|
void P_PlayerEmeraldBurst(player_t *player, boolean toss);
|
||||||
|
|
||||||
void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck);
|
void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck);
|
||||||
|
void P_TouchStarPost(mobj_t *starpost, player_t *player, boolean snaptopost);
|
||||||
void P_PlayerFlagBurst(player_t *player, boolean toss);
|
void P_PlayerFlagBurst(player_t *player, boolean toss);
|
||||||
void P_CheckTimeLimit(void);
|
void P_CheckTimeLimit(void);
|
||||||
void P_CheckPointLimit(void);
|
void P_CheckPointLimit(void);
|
||||||
|
|
|
@ -592,9 +592,6 @@ static void P_DoTailsCarry(player_t *sonic, player_t *tails)
|
||||||
if (!(tails->pflags & PF_CANCARRY))
|
if (!(tails->pflags & PF_CANCARRY))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (sonic->pflags & PF_FINISHED)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ((sonic->mo->eflags & MFE_VERTICALFLIP) != (tails->mo->eflags & MFE_VERTICALFLIP))
|
if ((sonic->mo->eflags & MFE_VERTICALFLIP) != (tails->mo->eflags & MFE_VERTICALFLIP))
|
||||||
return; // Both should be in same gravity
|
return; // Both should be in same gravity
|
||||||
|
|
||||||
|
|
124
src/p_mobj.c
124
src/p_mobj.c
|
@ -1997,10 +1997,14 @@ void P_XYMovement(mobj_t *mo)
|
||||||
{
|
{
|
||||||
mo->momz = transfermomz;
|
mo->momz = transfermomz;
|
||||||
mo->standingslope = NULL;
|
mo->standingslope = NULL;
|
||||||
if (player && (player->pflags & PF_SPINNING))
|
if (player)
|
||||||
|
{
|
||||||
|
player->powers[pw_justlaunched] = 2;
|
||||||
|
if (player->pflags & PF_SPINNING)
|
||||||
player->pflags |= PF_THOKKED;
|
player->pflags |= PF_THOKKED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (mo->type == MT_SPINFIRE)
|
else if (mo->type == MT_SPINFIRE)
|
||||||
|
@ -2350,6 +2354,7 @@ static void P_RingZMovement(mobj_t *mo)
|
||||||
if (mo->eflags & MFE_APPLYPMOMZ && !P_IsObjectOnGround(mo))
|
if (mo->eflags & MFE_APPLYPMOMZ && !P_IsObjectOnGround(mo))
|
||||||
{
|
{
|
||||||
mo->momz += mo->pmomz;
|
mo->momz += mo->pmomz;
|
||||||
|
mo->pmomz = 0;
|
||||||
mo->eflags &= ~MFE_APPLYPMOMZ;
|
mo->eflags &= ~MFE_APPLYPMOMZ;
|
||||||
}
|
}
|
||||||
mo->z += mo->momz;
|
mo->z += mo->momz;
|
||||||
|
@ -2419,6 +2424,7 @@ static boolean P_ZMovement(mobj_t *mo)
|
||||||
if (mo->eflags & MFE_APPLYPMOMZ && !P_IsObjectOnGround(mo))
|
if (mo->eflags & MFE_APPLYPMOMZ && !P_IsObjectOnGround(mo))
|
||||||
{
|
{
|
||||||
mo->momz += mo->pmomz;
|
mo->momz += mo->pmomz;
|
||||||
|
mo->pmomz = 0;
|
||||||
mo->eflags &= ~MFE_APPLYPMOMZ;
|
mo->eflags &= ~MFE_APPLYPMOMZ;
|
||||||
}
|
}
|
||||||
mo->z += mo->momz;
|
mo->z += mo->momz;
|
||||||
|
@ -2907,6 +2913,7 @@ static void P_PlayerZMovement(mobj_t *mo)
|
||||||
if (mo->eflags & MFE_APPLYPMOMZ && !P_IsObjectOnGround(mo))
|
if (mo->eflags & MFE_APPLYPMOMZ && !P_IsObjectOnGround(mo))
|
||||||
{
|
{
|
||||||
mo->momz += mo->pmomz;
|
mo->momz += mo->pmomz;
|
||||||
|
mo->pmomz = 0;
|
||||||
mo->eflags &= ~MFE_APPLYPMOMZ;
|
mo->eflags &= ~MFE_APPLYPMOMZ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3157,6 +3164,7 @@ static boolean P_SceneryZMovement(mobj_t *mo)
|
||||||
if (mo->eflags & MFE_APPLYPMOMZ && !P_IsObjectOnGround(mo))
|
if (mo->eflags & MFE_APPLYPMOMZ && !P_IsObjectOnGround(mo))
|
||||||
{
|
{
|
||||||
mo->momz += mo->pmomz;
|
mo->momz += mo->pmomz;
|
||||||
|
mo->pmomz = 0;
|
||||||
mo->eflags &= ~MFE_APPLYPMOMZ;
|
mo->eflags &= ~MFE_APPLYPMOMZ;
|
||||||
}
|
}
|
||||||
mo->z += mo->momz;
|
mo->z += mo->momz;
|
||||||
|
@ -3918,6 +3926,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
|
||||||
// Needed for gravity boots
|
// Needed for gravity boots
|
||||||
P_CheckGravity(mobj, false);
|
P_CheckGravity(mobj, false);
|
||||||
|
|
||||||
|
mobj->player->powers[pw_justlaunched] = 0;
|
||||||
if (mobj->momx || mobj->momy)
|
if (mobj->momx || mobj->momy)
|
||||||
{
|
{
|
||||||
P_XYMovement(mobj);
|
P_XYMovement(mobj);
|
||||||
|
@ -7996,6 +8005,37 @@ static void P_MobjSceneryThink(mobj_t *mobj)
|
||||||
mobj->frame = (mobj->frame & ~FF_TRANSMASK) | ((10 - (mobj->fuse*2)) << (FF_TRANSSHIFT));
|
mobj->frame = (mobj->frame & ~FF_TRANSMASK) | ((10 - (mobj->fuse*2)) << (FF_TRANSSHIFT));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case MT_FINISHFLAG:
|
||||||
|
{
|
||||||
|
if (!mobj->target || mobj->target->player->playerstate == PST_DEAD || !cv_exitmove.value)
|
||||||
|
{
|
||||||
|
P_RemoveMobj(mobj);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!camera.chase)
|
||||||
|
mobj->flags2 |= MF2_DONTDRAW;
|
||||||
|
else
|
||||||
|
mobj->flags2 &= ~MF2_DONTDRAW;
|
||||||
|
|
||||||
|
P_UnsetThingPosition(mobj);
|
||||||
|
{
|
||||||
|
fixed_t radius = FixedMul(10*mobj->info->speed, mobj->target->scale);
|
||||||
|
angle_t fa;
|
||||||
|
|
||||||
|
mobj->angle += FixedAngle(mobj->info->speed);
|
||||||
|
|
||||||
|
fa = mobj->angle >> ANGLETOFINESHIFT;
|
||||||
|
|
||||||
|
mobj->x = mobj->target->x + FixedMul(FINECOSINE(fa),radius);
|
||||||
|
mobj->y = mobj->target->y + FixedMul(FINESINE(fa),radius);
|
||||||
|
mobj->z = mobj->target->z + mobj->target->height/2;
|
||||||
|
}
|
||||||
|
P_SetThingPosition(mobj);
|
||||||
|
|
||||||
|
P_SetScale(mobj, mobj->target->scale);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case MT_VWREF:
|
case MT_VWREF:
|
||||||
case MT_VWREB:
|
case MT_VWREB:
|
||||||
{
|
{
|
||||||
|
@ -10457,6 +10497,61 @@ void P_SceneryThinker(mobj_t *mobj)
|
||||||
// GAME SPAWN FUNCTIONS
|
// GAME SPAWN FUNCTIONS
|
||||||
//
|
//
|
||||||
|
|
||||||
|
static fixed_t P_DefaultMobjShadowScale (mobj_t *thing)
|
||||||
|
{
|
||||||
|
switch (thing->type)
|
||||||
|
{
|
||||||
|
case MT_PLAYER:
|
||||||
|
case MT_ROLLOUTROCK:
|
||||||
|
|
||||||
|
case MT_EGGMOBILE4_MACE:
|
||||||
|
case MT_SMALLMACE:
|
||||||
|
case MT_BIGMACE:
|
||||||
|
|
||||||
|
case MT_SMALLGRABCHAIN:
|
||||||
|
case MT_BIGGRABCHAIN:
|
||||||
|
|
||||||
|
case MT_YELLOWSPRINGBALL:
|
||||||
|
case MT_REDSPRINGBALL:
|
||||||
|
|
||||||
|
return FRACUNIT;
|
||||||
|
|
||||||
|
case MT_RING:
|
||||||
|
case MT_FLINGRING:
|
||||||
|
|
||||||
|
case MT_BLUESPHERE:
|
||||||
|
case MT_FLINGBLUESPHERE:
|
||||||
|
case MT_BOMBSPHERE:
|
||||||
|
|
||||||
|
case MT_REDTEAMRING:
|
||||||
|
case MT_BLUETEAMRING:
|
||||||
|
case MT_REDFLAG:
|
||||||
|
case MT_BLUEFLAG:
|
||||||
|
|
||||||
|
case MT_EMBLEM:
|
||||||
|
|
||||||
|
case MT_TOKEN:
|
||||||
|
case MT_EMERALD1:
|
||||||
|
case MT_EMERALD2:
|
||||||
|
case MT_EMERALD3:
|
||||||
|
case MT_EMERALD4:
|
||||||
|
case MT_EMERALD5:
|
||||||
|
case MT_EMERALD6:
|
||||||
|
case MT_EMERALD7:
|
||||||
|
case MT_EMERHUNT:
|
||||||
|
case MT_FLINGEMERALD:
|
||||||
|
|
||||||
|
return 2*FRACUNIT/3;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
if (thing->flags & (MF_ENEMY|MF_BOSS))
|
||||||
|
return FRACUNIT;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// P_SpawnMobj
|
// P_SpawnMobj
|
||||||
//
|
//
|
||||||
|
@ -10558,20 +10653,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
||||||
mobj->z = z;
|
mobj->z = z;
|
||||||
|
|
||||||
// Set shadowscale here, before spawn hook so that Lua can change it
|
// Set shadowscale here, before spawn hook so that Lua can change it
|
||||||
if (
|
mobj->shadowscale = P_DefaultMobjShadowScale(mobj);
|
||||||
type == MT_PLAYER ||
|
|
||||||
type == MT_ROLLOUTROCK ||
|
|
||||||
type == MT_EGGMOBILE4_MACE ||
|
|
||||||
(type >= MT_SMALLMACE && type <= MT_REDSPRINGBALL) ||
|
|
||||||
(mobj->flags & (MF_ENEMY|MF_BOSS))
|
|
||||||
)
|
|
||||||
mobj->shadowscale = FRACUNIT;
|
|
||||||
else if (
|
|
||||||
type >= MT_RING && type <= MT_FLINGEMERALD && type != MT_EMERALDSPAWN
|
|
||||||
)
|
|
||||||
mobj->shadowscale = 2*FRACUNIT/3;
|
|
||||||
else
|
|
||||||
mobj->shadowscale = 0;
|
|
||||||
|
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
// DANGER! This can cause P_SpawnMobj to return NULL!
|
// DANGER! This can cause P_SpawnMobj to return NULL!
|
||||||
|
@ -11512,6 +11594,9 @@ void P_AfterPlayerSpawn(INT32 playernum)
|
||||||
|
|
||||||
if (CheckForReverseGravity)
|
if (CheckForReverseGravity)
|
||||||
P_CheckGravity(mobj, false);
|
P_CheckGravity(mobj, false);
|
||||||
|
|
||||||
|
if (p->pflags & PF_FINISHED)
|
||||||
|
P_GiveFinishFlags(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
// spawn it at a playerspawn mapthing
|
// spawn it at a playerspawn mapthing
|
||||||
|
@ -12931,6 +13016,15 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
|
||||||
thinker_t* th;
|
thinker_t* th;
|
||||||
mobj_t* mo2;
|
mobj_t* mo2;
|
||||||
boolean foundanother = false;
|
boolean foundanother = false;
|
||||||
|
|
||||||
|
if (mthing->extrainfo)
|
||||||
|
// Allow thing Parameter to define star post num too!
|
||||||
|
// For starposts above param 15 (the 16th), add 360 to the angle like before and start parameter from 1 (NOT 0)!
|
||||||
|
// So the 16th starpost is angle=0 param=15, the 17th would be angle=360 param=1.
|
||||||
|
// This seems more intuitive for mappers to use until UDMF is ready, since most SP maps won't have over 16 consecutive star posts.
|
||||||
|
mobj->health = mthing->extrainfo + (mthing->angle/360)*15 + 1;
|
||||||
|
else
|
||||||
|
// Old behavior if Parameter is 0; add 360 to the angle for each consecutive star post.
|
||||||
mobj->health = (mthing->angle/360) + 1;
|
mobj->health = (mthing->angle/360) + 1;
|
||||||
|
|
||||||
// See if other starposts exist in this level that have the same value.
|
// See if other starposts exist in this level that have the same value.
|
||||||
|
|
|
@ -1001,15 +1001,35 @@ static void Polyobj_pushThing(polyobj_t *po, line_t *line, mobj_t *mo)
|
||||||
//
|
//
|
||||||
static void Polyobj_slideThing(mobj_t *mo, fixed_t dx, fixed_t dy)
|
static void Polyobj_slideThing(mobj_t *mo, fixed_t dx, fixed_t dy)
|
||||||
{
|
{
|
||||||
if (mo->player) { // Do something similar to conveyor movement. -Red
|
if (mo->player) { // Finally this doesn't suck eggs -fickle
|
||||||
mo->player->cmomx += dx;
|
fixed_t cdx, cdy;
|
||||||
mo->player->cmomy += dy;
|
|
||||||
|
|
||||||
dx = FixedMul(dx, CARRYFACTOR);
|
cdx = FixedMul(dx, FRACUNIT-CARRYFACTOR);
|
||||||
dy = FixedMul(dy, CARRYFACTOR);
|
cdy = FixedMul(dy, FRACUNIT-CARRYFACTOR);
|
||||||
|
|
||||||
mo->player->cmomx -= dx;
|
if (mo->player->onconveyor == 1)
|
||||||
mo->player->cmomy -= dy;
|
{
|
||||||
|
mo->momx += cdx;
|
||||||
|
mo->momy += cdy;
|
||||||
|
|
||||||
|
// Multiple slides in the same tic, somehow
|
||||||
|
mo->player->cmomx += cdx;
|
||||||
|
mo->player->cmomy += cdy;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (mo->player->onconveyor == 3)
|
||||||
|
{
|
||||||
|
mo->momx += cdx - mo->player->cmomx;
|
||||||
|
mo->momy += cdy - mo->player->cmomy;
|
||||||
|
}
|
||||||
|
|
||||||
|
mo->player->cmomx = cdx;
|
||||||
|
mo->player->cmomy = cdy;
|
||||||
|
}
|
||||||
|
|
||||||
|
dx = FixedMul(dx, FRACUNIT - mo->friction);
|
||||||
|
dy = FixedMul(dy, FRACUNIT - mo->friction);
|
||||||
|
|
||||||
if (mo->player->pflags & PF_SPINNING && (mo->player->rmomx || mo->player->rmomy) && !(mo->player->pflags & PF_STARTDASH)) {
|
if (mo->player->pflags & PF_SPINNING && (mo->player->rmomx || mo->player->rmomy) && !(mo->player->pflags & PF_STARTDASH)) {
|
||||||
#define SPINMULT 5184 // Consider this a substitute for properly calculating FRACUNIT-friction. I'm tired. -Red
|
#define SPINMULT 5184 // Consider this a substitute for properly calculating FRACUNIT-friction. I'm tired. -Red
|
||||||
|
@ -1282,7 +1302,8 @@ static void Polyobj_rotateThings(polyobj_t *po, vertex_t origin, angle_t delta,
|
||||||
{
|
{
|
||||||
static INT32 pomovecount = 10000;
|
static INT32 pomovecount = 10000;
|
||||||
INT32 x, y;
|
INT32 x, y;
|
||||||
angle_t deltafine = delta >> ANGLETOFINESHIFT;
|
angle_t deltafine = (((po->angle + delta) >> ANGLETOFINESHIFT) - (po->angle >> ANGLETOFINESHIFT)) & FINEMASK;
|
||||||
|
// This fineshift trickery replaces the old delta>>ANGLETOFINESHIFT; doing it this way avoids loss of precision causing objects to slide off -fickle
|
||||||
|
|
||||||
pomovecount++;
|
pomovecount++;
|
||||||
|
|
||||||
|
@ -1334,19 +1355,10 @@ static void Polyobj_rotateThings(polyobj_t *po, vertex_t origin, angle_t delta,
|
||||||
oldxoff = mo->x-origin.x;
|
oldxoff = mo->x-origin.x;
|
||||||
oldyoff = mo->y-origin.y;
|
oldyoff = mo->y-origin.y;
|
||||||
|
|
||||||
if (mo->player) // Hack to fix players sliding off of spinning polys -Red
|
newxoff = FixedMul(oldxoff, c)-FixedMul(oldyoff, s) - oldxoff;
|
||||||
{
|
newyoff = FixedMul(oldyoff, c)+FixedMul(oldxoff, s) - oldyoff;
|
||||||
fixed_t temp;
|
|
||||||
|
|
||||||
temp = FixedMul(oldxoff, c)-FixedMul(oldyoff, s);
|
Polyobj_slideThing(mo, newxoff, newyoff);
|
||||||
oldyoff = FixedMul(oldyoff, c)+FixedMul(oldxoff, s);
|
|
||||||
oldxoff = temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
newxoff = FixedMul(oldxoff, c)-FixedMul(oldyoff, s);
|
|
||||||
newyoff = FixedMul(oldyoff, c)+FixedMul(oldxoff, s);
|
|
||||||
|
|
||||||
Polyobj_slideThing(mo, newxoff-oldxoff, newyoff-oldyoff);
|
|
||||||
|
|
||||||
if (turnthings == 2 || (turnthings == 1 && !mo->player)) {
|
if (turnthings == 2 || (turnthings == 1 && !mo->player)) {
|
||||||
mo->angle += delta;
|
mo->angle += delta;
|
||||||
|
|
|
@ -116,6 +116,7 @@ static void P_NetArchivePlayers(void)
|
||||||
|
|
||||||
WRITEANGLE(save_p, players[i].aiming);
|
WRITEANGLE(save_p, players[i].aiming);
|
||||||
WRITEANGLE(save_p, players[i].drawangle);
|
WRITEANGLE(save_p, players[i].drawangle);
|
||||||
|
WRITEANGLE(save_p, players[i].viewrollangle);
|
||||||
WRITEANGLE(save_p, players[i].awayviewaiming);
|
WRITEANGLE(save_p, players[i].awayviewaiming);
|
||||||
WRITEINT32(save_p, players[i].awayviewtics);
|
WRITEINT32(save_p, players[i].awayviewtics);
|
||||||
WRITEINT16(save_p, players[i].rings);
|
WRITEINT16(save_p, players[i].rings);
|
||||||
|
@ -326,6 +327,7 @@ static void P_NetUnArchivePlayers(void)
|
||||||
|
|
||||||
players[i].aiming = READANGLE(save_p);
|
players[i].aiming = READANGLE(save_p);
|
||||||
players[i].drawangle = READANGLE(save_p);
|
players[i].drawangle = READANGLE(save_p);
|
||||||
|
players[i].viewrollangle = READANGLE(save_p);
|
||||||
players[i].awayviewaiming = READANGLE(save_p);
|
players[i].awayviewaiming = READANGLE(save_p);
|
||||||
players[i].awayviewtics = READINT32(save_p);
|
players[i].awayviewtics = READINT32(save_p);
|
||||||
players[i].rings = READINT16(save_p);
|
players[i].rings = READINT16(save_p);
|
||||||
|
@ -609,7 +611,7 @@ static void P_NetArchiveColormaps(void)
|
||||||
|
|
||||||
WRITEUINT8(save_p, exc->fadestart);
|
WRITEUINT8(save_p, exc->fadestart);
|
||||||
WRITEUINT8(save_p, exc->fadeend);
|
WRITEUINT8(save_p, exc->fadeend);
|
||||||
WRITEUINT8(save_p, exc->fog);
|
WRITEUINT8(save_p, exc->flags);
|
||||||
|
|
||||||
WRITEINT32(save_p, exc->rgba);
|
WRITEINT32(save_p, exc->rgba);
|
||||||
WRITEINT32(save_p, exc->fadergba);
|
WRITEINT32(save_p, exc->fadergba);
|
||||||
|
@ -639,7 +641,7 @@ static void P_NetUnArchiveColormaps(void)
|
||||||
|
|
||||||
for (exc = net_colormaps; i < num_net_colormaps; i++, exc = exc_next)
|
for (exc = net_colormaps; i < num_net_colormaps; i++, exc = exc_next)
|
||||||
{
|
{
|
||||||
UINT8 fadestart, fadeend, fog;
|
UINT8 fadestart, fadeend, flags;
|
||||||
INT32 rgba, fadergba;
|
INT32 rgba, fadergba;
|
||||||
#ifdef EXTRACOLORMAPLUMPS
|
#ifdef EXTRACOLORMAPLUMPS
|
||||||
char lumpname[9];
|
char lumpname[9];
|
||||||
|
@ -647,7 +649,7 @@ static void P_NetUnArchiveColormaps(void)
|
||||||
|
|
||||||
fadestart = READUINT8(save_p);
|
fadestart = READUINT8(save_p);
|
||||||
fadeend = READUINT8(save_p);
|
fadeend = READUINT8(save_p);
|
||||||
fog = READUINT8(save_p);
|
flags = READUINT8(save_p);
|
||||||
|
|
||||||
rgba = READINT32(save_p);
|
rgba = READINT32(save_p);
|
||||||
fadergba = READINT32(save_p);
|
fadergba = READINT32(save_p);
|
||||||
|
@ -679,7 +681,7 @@ static void P_NetUnArchiveColormaps(void)
|
||||||
|
|
||||||
exc->fadestart = fadestart;
|
exc->fadestart = fadestart;
|
||||||
exc->fadeend = fadeend;
|
exc->fadeend = fadeend;
|
||||||
exc->fog = fog;
|
exc->flags = flags;
|
||||||
|
|
||||||
exc->rgba = rgba;
|
exc->rgba = rgba;
|
||||||
exc->fadergba = fadergba;
|
exc->fadergba = fadergba;
|
||||||
|
@ -689,7 +691,7 @@ static void P_NetUnArchiveColormaps(void)
|
||||||
exc->lumpname[0] = 0;
|
exc->lumpname[0] = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
existing_exc = R_GetColormapFromListByValues(rgba, fadergba, fadestart, fadeend, fog);
|
existing_exc = R_GetColormapFromListByValues(rgba, fadergba, fadestart, fadeend, flags);
|
||||||
|
|
||||||
if (existing_exc)
|
if (existing_exc)
|
||||||
exc->colormap = existing_exc->colormap;
|
exc->colormap = existing_exc->colormap;
|
||||||
|
@ -1255,6 +1257,7 @@ typedef enum
|
||||||
#endif
|
#endif
|
||||||
MD2_COLORIZED = 1<<12,
|
MD2_COLORIZED = 1<<12,
|
||||||
MD2_ROLLANGLE = 1<<13,
|
MD2_ROLLANGLE = 1<<13,
|
||||||
|
MD2_SHADOWSCALE = 1<<14,
|
||||||
} mobj_diff2_t;
|
} mobj_diff2_t;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
|
@ -1476,6 +1479,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type)
|
||||||
diff2 |= MD2_COLORIZED;
|
diff2 |= MD2_COLORIZED;
|
||||||
if (mobj->rollangle)
|
if (mobj->rollangle)
|
||||||
diff2 |= MD2_ROLLANGLE;
|
diff2 |= MD2_ROLLANGLE;
|
||||||
|
if (mobj->shadowscale)
|
||||||
|
diff2 |= MD2_SHADOWSCALE;
|
||||||
if (diff2 != 0)
|
if (diff2 != 0)
|
||||||
diff |= MD_MORE;
|
diff |= MD_MORE;
|
||||||
|
|
||||||
|
@ -1642,6 +1647,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type)
|
||||||
WRITEUINT8(save_p, mobj->colorized);
|
WRITEUINT8(save_p, mobj->colorized);
|
||||||
if (diff2 & MD2_ROLLANGLE)
|
if (diff2 & MD2_ROLLANGLE)
|
||||||
WRITEANGLE(save_p, mobj->rollangle);
|
WRITEANGLE(save_p, mobj->rollangle);
|
||||||
|
if (diff2 & MD2_SHADOWSCALE)
|
||||||
|
WRITEFIXED(save_p, mobj->shadowscale);
|
||||||
|
|
||||||
WRITEUINT32(save_p, mobj->mobjnum);
|
WRITEUINT32(save_p, mobj->mobjnum);
|
||||||
}
|
}
|
||||||
|
@ -2721,6 +2728,8 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
mobj->colorized = READUINT8(save_p);
|
mobj->colorized = READUINT8(save_p);
|
||||||
if (diff2 & MD2_ROLLANGLE)
|
if (diff2 & MD2_ROLLANGLE)
|
||||||
mobj->rollangle = READANGLE(save_p);
|
mobj->rollangle = READANGLE(save_p);
|
||||||
|
if (diff2 & MD2_SHADOWSCALE)
|
||||||
|
mobj->shadowscale = READFIXED(save_p);
|
||||||
|
|
||||||
if (diff & MD_REDFLAG)
|
if (diff & MD_REDFLAG)
|
||||||
{
|
{
|
||||||
|
|
|
@ -3699,10 +3699,15 @@ void HWR_SetupLevel(void)
|
||||||
// Meaning, they had memory allocated and marked with the PU_LEVEL tag.
|
// Meaning, they had memory allocated and marked with the PU_LEVEL tag.
|
||||||
// Level textures are only reloaded after R_LoadTextures, which is
|
// Level textures are only reloaded after R_LoadTextures, which is
|
||||||
// when the texture list is loaded.
|
// when the texture list is loaded.
|
||||||
|
|
||||||
|
// Sal: Unfortunately, NOT freeing them causes the dreaded Color Bug.
|
||||||
|
HWR_FreeMipmapCache();
|
||||||
|
|
||||||
#ifdef ALAM_LIGHTING
|
#ifdef ALAM_LIGHTING
|
||||||
// BP: reset light between levels (we draw preview frame lights on current frame)
|
// BP: reset light between levels (we draw preview frame lights on current frame)
|
||||||
HWR_ResetLights();
|
HWR_ResetLights();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Correct missing sidedefs & deep water trick
|
// Correct missing sidedefs & deep water trick
|
||||||
HWR_CorrectSWTricks();
|
HWR_CorrectSWTricks();
|
||||||
HWR_CreatePlanePolygons((INT32)numnodes - 1);
|
HWR_CreatePlanePolygons((INT32)numnodes - 1);
|
||||||
|
@ -3826,10 +3831,9 @@ boolean P_AddWadFile(const char *wadfilename)
|
||||||
// UINT16 mapPos, mapNum = 0;
|
// UINT16 mapPos, mapNum = 0;
|
||||||
|
|
||||||
// Init file.
|
// Init file.
|
||||||
if ((numlumps = W_InitFile(wadfilename, false)) == INT16_MAX)
|
if ((numlumps = W_InitFile(wadfilename, false, false)) == INT16_MAX)
|
||||||
{
|
{
|
||||||
refreshdirmenu |= REFRESHDIR_NOTLOADED;
|
refreshdirmenu |= REFRESHDIR_NOTLOADED;
|
||||||
CONS_Printf(M_GetText("Errors occurred while loading %s; not added.\n"), wadfilename);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -726,6 +726,9 @@ void P_SlopeLaunch(mobj_t *mo)
|
||||||
|
|
||||||
//CONS_Printf("Launched off of slope.\n");
|
//CONS_Printf("Launched off of slope.\n");
|
||||||
mo->standingslope = NULL;
|
mo->standingslope = NULL;
|
||||||
|
|
||||||
|
if (mo->player)
|
||||||
|
mo->player->powers[pw_justlaunched] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
19
src/p_spec.c
19
src/p_spec.c
|
@ -3516,7 +3516,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||||
false, // subtract FadeA (no flag for this, just pass negative alpha)
|
false, // subtract FadeA (no flag for this, just pass negative alpha)
|
||||||
false, // subtract FadeStart (we ran out of flags)
|
false, // subtract FadeStart (we ran out of flags)
|
||||||
false, // subtract FadeEnd (we ran out of flags)
|
false, // subtract FadeEnd (we ran out of flags)
|
||||||
false, // ignore Fog (we ran out of flags)
|
false, // ignore Flags (we ran out of flags)
|
||||||
line->flags & ML_DONTPEGBOTTOM,
|
line->flags & ML_DONTPEGBOTTOM,
|
||||||
(line->flags & ML_DONTPEGBOTTOM) ? (sides[line->sidenum[0]].textureoffset >> FRACBITS) : 0,
|
(line->flags & ML_DONTPEGBOTTOM) ? (sides[line->sidenum[0]].textureoffset >> FRACBITS) : 0,
|
||||||
(line->flags & ML_DONTPEGBOTTOM) ? (sides[line->sidenum[0]].rowoffset >> FRACBITS) : 0,
|
(line->flags & ML_DONTPEGBOTTOM) ? (sides[line->sidenum[0]].rowoffset >> FRACBITS) : 0,
|
||||||
|
@ -3883,7 +3883,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||||
false, // subtract FadeA (no flag for this, just pass negative alpha)
|
false, // subtract FadeA (no flag for this, just pass negative alpha)
|
||||||
false, // subtract FadeStart (we ran out of flags)
|
false, // subtract FadeStart (we ran out of flags)
|
||||||
false, // subtract FadeEnd (we ran out of flags)
|
false, // subtract FadeEnd (we ran out of flags)
|
||||||
false, // ignore Fog (we ran out of flags)
|
false, // ignore Flags (we ran out of flags)
|
||||||
line->flags & ML_DONTPEGBOTTOM,
|
line->flags & ML_DONTPEGBOTTOM,
|
||||||
(line->flags & ML_DONTPEGBOTTOM) ? (sides[line->sidenum[0]].textureoffset >> FRACBITS) : 0,
|
(line->flags & ML_DONTPEGBOTTOM) ? (sides[line->sidenum[0]].textureoffset >> FRACBITS) : 0,
|
||||||
(line->flags & ML_DONTPEGBOTTOM) ? (sides[line->sidenum[0]].rowoffset >> FRACBITS) : 0,
|
(line->flags & ML_DONTPEGBOTTOM) ? (sides[line->sidenum[0]].rowoffset >> FRACBITS) : 0,
|
||||||
|
@ -4692,7 +4692,7 @@ DoneSection2:
|
||||||
if (!post)
|
if (!post)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
P_TouchSpecialThing(post, player->mo, false);
|
P_TouchStarPost(post, player, false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7081,10 +7081,9 @@ void P_SpawnSpecials(boolean fromnetsave)
|
||||||
case 202: // Fog
|
case 202: // Fog
|
||||||
ffloorflags = FF_EXISTS|FF_RENDERALL|FF_FOG|FF_BOTHPLANES|FF_INVERTPLANES|FF_ALLSIDES|FF_INVERTSIDES|FF_CUTEXTRA|FF_EXTRA|FF_DOUBLESHADOW|FF_CUTSPRITES;
|
ffloorflags = FF_EXISTS|FF_RENDERALL|FF_FOG|FF_BOTHPLANES|FF_INVERTPLANES|FF_ALLSIDES|FF_INVERTSIDES|FF_CUTEXTRA|FF_EXTRA|FF_DOUBLESHADOW|FF_CUTSPRITES;
|
||||||
sec = sides[*lines[i].sidenum].sector - sectors;
|
sec = sides[*lines[i].sidenum].sector - sectors;
|
||||||
// SoM: Because it's fog, check for an extra colormap and set
|
// SoM: Because it's fog, check for an extra colormap and set the fog flag...
|
||||||
// the fog flag...
|
|
||||||
if (sectors[sec].extra_colormap)
|
if (sectors[sec].extra_colormap)
|
||||||
sectors[sec].extra_colormap->fog = 1;
|
sectors[sec].extra_colormap->flags = CMF_FOG;
|
||||||
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
|
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -8472,7 +8471,7 @@ void T_FadeColormap(fadecolormap_t *d)
|
||||||
extracolormap_t *exc;
|
extracolormap_t *exc;
|
||||||
INT32 duration = d->ticbased ? d->duration : 256;
|
INT32 duration = d->ticbased ? d->duration : 256;
|
||||||
fixed_t factor = min(FixedDiv(duration - d->timer, duration), 1*FRACUNIT);
|
fixed_t factor = min(FixedDiv(duration - d->timer, duration), 1*FRACUNIT);
|
||||||
INT16 cr, cg, cb, ca, fadestart, fadeend, fog;
|
INT16 cr, cg, cb, ca, fadestart, fadeend, flags;
|
||||||
INT32 rgba, fadergba;
|
INT32 rgba, fadergba;
|
||||||
|
|
||||||
// NULL failsafes (or intentionally set to signify default)
|
// NULL failsafes (or intentionally set to signify default)
|
||||||
|
@ -8521,7 +8520,7 @@ void T_FadeColormap(fadecolormap_t *d)
|
||||||
|
|
||||||
fadestart = APPLYFADE(d->dest_exc->fadestart, d->source_exc->fadestart, d->sector->extra_colormap->fadestart);
|
fadestart = APPLYFADE(d->dest_exc->fadestart, d->source_exc->fadestart, d->sector->extra_colormap->fadestart);
|
||||||
fadeend = APPLYFADE(d->dest_exc->fadeend, d->source_exc->fadeend, d->sector->extra_colormap->fadeend);
|
fadeend = APPLYFADE(d->dest_exc->fadeend, d->source_exc->fadeend, d->sector->extra_colormap->fadeend);
|
||||||
fog = abs(factor) > FRACUNIT/2 ? d->dest_exc->fog : d->source_exc->fog; // set new fog flag halfway through fade
|
flags = abs(factor) > FRACUNIT/2 ? d->dest_exc->flags : d->source_exc->flags; // set new flags halfway through fade
|
||||||
|
|
||||||
#undef APPLYFADE
|
#undef APPLYFADE
|
||||||
|
|
||||||
|
@ -8529,12 +8528,12 @@ void T_FadeColormap(fadecolormap_t *d)
|
||||||
// setup new colormap
|
// setup new colormap
|
||||||
//////////////////
|
//////////////////
|
||||||
|
|
||||||
if (!(d->sector->extra_colormap = R_GetColormapFromListByValues(rgba, fadergba, fadestart, fadeend, fog)))
|
if (!(d->sector->extra_colormap = R_GetColormapFromListByValues(rgba, fadergba, fadestart, fadeend, flags)))
|
||||||
{
|
{
|
||||||
exc = R_CreateDefaultColormap(false);
|
exc = R_CreateDefaultColormap(false);
|
||||||
exc->fadestart = fadestart;
|
exc->fadestart = fadestart;
|
||||||
exc->fadeend = fadeend;
|
exc->fadeend = fadeend;
|
||||||
exc->fog = (boolean)fog;
|
exc->flags = flags;
|
||||||
exc->rgba = rgba;
|
exc->rgba = rgba;
|
||||||
exc->fadergba = fadergba;
|
exc->fadergba = fadergba;
|
||||||
exc->colormap = R_CreateLightTable(exc);
|
exc->colormap = R_CreateLightTable(exc);
|
||||||
|
|
41
src/p_user.c
41
src/p_user.c
|
@ -370,6 +370,33 @@ void P_GiveEmerald(boolean spawnObj)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// P_GiveFinishFlags
|
||||||
|
//
|
||||||
|
// Give the player visual indicators
|
||||||
|
// that they've finished the map.
|
||||||
|
//
|
||||||
|
void P_GiveFinishFlags(player_t *player)
|
||||||
|
{
|
||||||
|
angle_t angle = FixedAngle(player->mo->angle << FRACBITS);
|
||||||
|
UINT8 i;
|
||||||
|
|
||||||
|
if (!player->mo)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
angle_t fa = (angle >> ANGLETOFINESHIFT) & FINEMASK;
|
||||||
|
fixed_t xoffs = FINECOSINE(fa);
|
||||||
|
fixed_t yoffs = FINESINE(fa);
|
||||||
|
mobj_t* flag = P_SpawnMobjFromMobj(player->mo, xoffs, yoffs, 0, MT_FINISHFLAG);
|
||||||
|
flag->angle = angle;
|
||||||
|
angle += FixedAngle(120*FRACUNIT);
|
||||||
|
|
||||||
|
P_SetTarget(&flag->target, player->mo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
//
|
//
|
||||||
// P_ResetScore
|
// P_ResetScore
|
||||||
|
@ -2171,6 +2198,7 @@ void P_DoPlayerFinish(player_t *player)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
player->pflags |= PF_FINISHED;
|
player->pflags |= PF_FINISHED;
|
||||||
|
P_GiveFinishFlags(player);
|
||||||
|
|
||||||
if (netgame)
|
if (netgame)
|
||||||
CONS_Printf(M_GetText("%s has completed the level.\n"), player_names[player-players]);
|
CONS_Printf(M_GetText("%s has completed the level.\n"), player_names[player-players]);
|
||||||
|
@ -4541,7 +4569,6 @@ void P_DoJump(player_t *player, boolean soundandstate)
|
||||||
player->mo->z--;
|
player->mo->z--;
|
||||||
if (player->mo->pmomz < 0)
|
if (player->mo->pmomz < 0)
|
||||||
player->mo->momz += player->mo->pmomz; // Add the platform's momentum to your jump.
|
player->mo->momz += player->mo->pmomz; // Add the platform's momentum to your jump.
|
||||||
else
|
|
||||||
player->mo->pmomz = 0;
|
player->mo->pmomz = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -4549,7 +4576,6 @@ void P_DoJump(player_t *player, boolean soundandstate)
|
||||||
player->mo->z++;
|
player->mo->z++;
|
||||||
if (player->mo->pmomz > 0)
|
if (player->mo->pmomz > 0)
|
||||||
player->mo->momz += player->mo->pmomz; // Add the platform's momentum to your jump.
|
player->mo->momz += player->mo->pmomz; // Add the platform's momentum to your jump.
|
||||||
else
|
|
||||||
player->mo->pmomz = 0;
|
player->mo->pmomz = 0;
|
||||||
}
|
}
|
||||||
player->mo->eflags &= ~MFE_APPLYPMOMZ;
|
player->mo->eflags &= ~MFE_APPLYPMOMZ;
|
||||||
|
@ -5747,10 +5773,7 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd)
|
||||||
; // Can't do anything if you're a fish out of water!
|
; // Can't do anything if you're a fish out of water!
|
||||||
else if (player->powers[pw_tailsfly]) // If currently flying, give an ascend boost.
|
else if (player->powers[pw_tailsfly]) // If currently flying, give an ascend boost.
|
||||||
{
|
{
|
||||||
if (!player->fly1)
|
|
||||||
player->fly1 = 20;
|
player->fly1 = 20;
|
||||||
else
|
|
||||||
player->fly1 = 2;
|
|
||||||
|
|
||||||
if (player->charability == CA_SWIM)
|
if (player->charability == CA_SWIM)
|
||||||
player->fly1 /= 2;
|
player->fly1 /= 2;
|
||||||
|
@ -7683,6 +7706,8 @@ static void P_NiGHTSMovement(player_t *player)
|
||||||
else // AngleFixed(R_PointToAngle2()) results in slight inaccuracy! Don't use it unless movement is on both axises.
|
else // AngleFixed(R_PointToAngle2()) results in slight inaccuracy! Don't use it unless movement is on both axises.
|
||||||
newangle = (INT16)FixedInt(AngleFixed(R_PointToAngle2(0,0, cmd->sidemove*FRACUNIT, cmd->forwardmove*FRACUNIT)));
|
newangle = (INT16)FixedInt(AngleFixed(R_PointToAngle2(0,0, cmd->sidemove*FRACUNIT, cmd->forwardmove*FRACUNIT)));
|
||||||
|
|
||||||
|
newangle -= player->viewrollangle / ANG1;
|
||||||
|
|
||||||
if (newangle < 0 && moved)
|
if (newangle < 0 && moved)
|
||||||
newangle = (INT16)(360+newangle);
|
newangle = (INT16)(360+newangle);
|
||||||
}
|
}
|
||||||
|
@ -8743,7 +8768,11 @@ static void P_MovePlayer(player_t *player)
|
||||||
// Descend
|
// Descend
|
||||||
if (cmd->buttons & BT_USE && !(player->pflags & PF_STASIS) && !player->exiting && !(player->mo->eflags & MFE_GOOWATER))
|
if (cmd->buttons & BT_USE && !(player->pflags & PF_STASIS) && !player->exiting && !(player->mo->eflags & MFE_GOOWATER))
|
||||||
if (P_MobjFlip(player->mo)*player->mo->momz > -FixedMul(5*actionspd, player->mo->scale))
|
if (P_MobjFlip(player->mo)*player->mo->momz > -FixedMul(5*actionspd, player->mo->scale))
|
||||||
|
{
|
||||||
|
if (player->fly1 > 2)
|
||||||
|
player->fly1 = 2;
|
||||||
P_SetObjectMomZ(player->mo, -actionspd/2, true);
|
P_SetObjectMomZ(player->mo, -actionspd/2, true);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -12429,6 +12458,8 @@ void P_PlayerThink(player_t *player)
|
||||||
|
|
||||||
#ifdef POLYOBJECTS
|
#ifdef POLYOBJECTS
|
||||||
if (player->onconveyor == 1)
|
if (player->onconveyor == 1)
|
||||||
|
player->onconveyor = 3;
|
||||||
|
else if (player->onconveyor == 3)
|
||||||
player->cmomy = player->cmomx = 0;
|
player->cmomy = player->cmomx = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
60
src/r_data.c
60
src/r_data.c
|
@ -1799,7 +1799,7 @@ extracolormap_t *R_CreateDefaultColormap(boolean lighttable)
|
||||||
extracolormap_t *exc = Z_Calloc(sizeof (*exc), PU_LEVEL, NULL);
|
extracolormap_t *exc = Z_Calloc(sizeof (*exc), PU_LEVEL, NULL);
|
||||||
exc->fadestart = 0;
|
exc->fadestart = 0;
|
||||||
exc->fadeend = 31;
|
exc->fadeend = 31;
|
||||||
exc->fog = 0;
|
exc->flags = 0;
|
||||||
exc->rgba = 0;
|
exc->rgba = 0;
|
||||||
exc->fadergba = 0x19000000;
|
exc->fadergba = 0x19000000;
|
||||||
exc->colormap = lighttable ? R_CreateLightTable(exc) : NULL;
|
exc->colormap = lighttable ? R_CreateLightTable(exc) : NULL;
|
||||||
|
@ -1903,17 +1903,17 @@ void R_AddColormapToList(extracolormap_t *extra_colormap)
|
||||||
//
|
//
|
||||||
#ifdef EXTRACOLORMAPLUMPS
|
#ifdef EXTRACOLORMAPLUMPS
|
||||||
boolean R_CheckDefaultColormapByValues(boolean checkrgba, boolean checkfadergba, boolean checkparams,
|
boolean R_CheckDefaultColormapByValues(boolean checkrgba, boolean checkfadergba, boolean checkparams,
|
||||||
INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 fog, lumpnum_t lump)
|
INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 flags, lumpnum_t lump)
|
||||||
#else
|
#else
|
||||||
boolean R_CheckDefaultColormapByValues(boolean checkrgba, boolean checkfadergba, boolean checkparams,
|
boolean R_CheckDefaultColormapByValues(boolean checkrgba, boolean checkfadergba, boolean checkparams,
|
||||||
INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 fog)
|
INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 flags)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
return (
|
return (
|
||||||
(!checkparams ? true :
|
(!checkparams ? true :
|
||||||
(fadestart == 0
|
(fadestart == 0
|
||||||
&& fadeend == 31
|
&& fadeend == 31
|
||||||
&& !fog)
|
&& !flags)
|
||||||
)
|
)
|
||||||
&& (!checkrgba ? true : rgba == 0)
|
&& (!checkrgba ? true : rgba == 0)
|
||||||
&& (!checkfadergba ? true : fadergba == 0x19000000)
|
&& (!checkfadergba ? true : fadergba == 0x19000000)
|
||||||
|
@ -1930,9 +1930,9 @@ boolean R_CheckDefaultColormap(extracolormap_t *extra_colormap, boolean checkrgb
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
#ifdef EXTRACOLORMAPLUMPS
|
#ifdef EXTRACOLORMAPLUMPS
|
||||||
return R_CheckDefaultColormapByValues(checkrgba, checkfadergba, checkparams, extra_colormap->rgba, extra_colormap->fadergba, extra_colormap->fadestart, extra_colormap->fadeend, extra_colormap->fog, extra_colormap->lump);
|
return R_CheckDefaultColormapByValues(checkrgba, checkfadergba, checkparams, extra_colormap->rgba, extra_colormap->fadergba, extra_colormap->fadestart, extra_colormap->fadeend, extra_colormap->flags, extra_colormap->lump);
|
||||||
#else
|
#else
|
||||||
return R_CheckDefaultColormapByValues(checkrgba, checkfadergba, checkparams, extra_colormap->rgba, extra_colormap->fadergba, extra_colormap->fadestart, extra_colormap->fadeend, extra_colormap->fog);
|
return R_CheckDefaultColormapByValues(checkrgba, checkfadergba, checkparams, extra_colormap->rgba, extra_colormap->fadergba, extra_colormap->fadestart, extra_colormap->fadeend, extra_colormap->flags);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1952,7 +1952,7 @@ boolean R_CheckEqualColormaps(extracolormap_t *exc_a, extracolormap_t *exc_b, bo
|
||||||
(!checkparams ? true :
|
(!checkparams ? true :
|
||||||
(exc_a->fadestart == exc_b->fadestart
|
(exc_a->fadestart == exc_b->fadestart
|
||||||
&& exc_a->fadeend == exc_b->fadeend
|
&& exc_a->fadeend == exc_b->fadeend
|
||||||
&& exc_a->fog == exc_b->fog)
|
&& exc_a->flags == exc_b->flags)
|
||||||
)
|
)
|
||||||
&& (!checkrgba ? true : exc_a->rgba == exc_b->rgba)
|
&& (!checkrgba ? true : exc_a->rgba == exc_b->rgba)
|
||||||
&& (!checkfadergba ? true : exc_a->fadergba == exc_b->fadergba)
|
&& (!checkfadergba ? true : exc_a->fadergba == exc_b->fadergba)
|
||||||
|
@ -1968,9 +1968,9 @@ boolean R_CheckEqualColormaps(extracolormap_t *exc_a, extracolormap_t *exc_b, bo
|
||||||
// NOTE: Returns NULL if no match is found
|
// NOTE: Returns NULL if no match is found
|
||||||
//
|
//
|
||||||
#ifdef EXTRACOLORMAPLUMPS
|
#ifdef EXTRACOLORMAPLUMPS
|
||||||
extracolormap_t *R_GetColormapFromListByValues(INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 fog, lumpnum_t lump)
|
extracolormap_t *R_GetColormapFromListByValues(INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 flags, lumpnum_t lump)
|
||||||
#else
|
#else
|
||||||
extracolormap_t *R_GetColormapFromListByValues(INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 fog)
|
extracolormap_t *R_GetColormapFromListByValues(INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 flags)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
extracolormap_t *exc;
|
extracolormap_t *exc;
|
||||||
|
@ -1982,7 +1982,7 @@ extracolormap_t *R_GetColormapFromListByValues(INT32 rgba, INT32 fadergba, UINT8
|
||||||
&& fadergba == exc->fadergba
|
&& fadergba == exc->fadergba
|
||||||
&& fadestart == exc->fadestart
|
&& fadestart == exc->fadestart
|
||||||
&& fadeend == exc->fadeend
|
&& fadeend == exc->fadeend
|
||||||
&& fog == exc->fog
|
&& flags == exc->flags
|
||||||
#ifdef EXTRACOLORMAPLUMPS
|
#ifdef EXTRACOLORMAPLUMPS
|
||||||
&& (lump != LUMPERROR && lump == exc->lump)
|
&& (lump != LUMPERROR && lump == exc->lump)
|
||||||
#endif
|
#endif
|
||||||
|
@ -2001,9 +2001,9 @@ extracolormap_t *R_GetColormapFromListByValues(INT32 rgba, INT32 fadergba, UINT8
|
||||||
extracolormap_t *R_GetColormapFromList(extracolormap_t *extra_colormap)
|
extracolormap_t *R_GetColormapFromList(extracolormap_t *extra_colormap)
|
||||||
{
|
{
|
||||||
#ifdef EXTRACOLORMAPLUMPS
|
#ifdef EXTRACOLORMAPLUMPS
|
||||||
return R_GetColormapFromListByValues(extra_colormap->rgba, extra_colormap->fadergba, extra_colormap->fadestart, extra_colormap->fadeend, extra_colormap->fog, extra_colormap->lump);
|
return R_GetColormapFromListByValues(extra_colormap->rgba, extra_colormap->fadergba, extra_colormap->fadestart, extra_colormap->fadeend, extra_colormap->flags, extra_colormap->lump);
|
||||||
#else
|
#else
|
||||||
return R_GetColormapFromListByValues(extra_colormap->rgba, extra_colormap->fadergba, extra_colormap->fadestart, extra_colormap->fadeend, extra_colormap->fog);
|
return R_GetColormapFromListByValues(extra_colormap->rgba, extra_colormap->fadergba, extra_colormap->fadestart, extra_colormap->fadeend, extra_colormap->flags);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2035,7 +2035,7 @@ extracolormap_t *R_ColormapForName(char *name)
|
||||||
// is no real way to tell how GL should handle a colormap lump anyway..
|
// is no real way to tell how GL should handle a colormap lump anyway..
|
||||||
exc->fadestart = 0;
|
exc->fadestart = 0;
|
||||||
exc->fadeend = 31;
|
exc->fadeend = 31;
|
||||||
exc->fog = 0;
|
exc->flags = 0;
|
||||||
exc->rgba = 0;
|
exc->rgba = 0;
|
||||||
exc->fadergba = 0x19000000;
|
exc->fadergba = 0x19000000;
|
||||||
|
|
||||||
|
@ -2192,7 +2192,7 @@ extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3)
|
||||||
// default values
|
// default values
|
||||||
UINT8 cr = 0, cg = 0, cb = 0, ca = 0, cfr = 0, cfg = 0, cfb = 0, cfa = 25;
|
UINT8 cr = 0, cg = 0, cb = 0, ca = 0, cfr = 0, cfg = 0, cfb = 0, cfa = 25;
|
||||||
UINT32 fadestart = 0, fadeend = 31;
|
UINT32 fadestart = 0, fadeend = 31;
|
||||||
UINT8 fog = 0;
|
UINT8 flags = 0;
|
||||||
INT32 rgba = 0, fadergba = 0x19000000;
|
INT32 rgba = 0, fadergba = 0x19000000;
|
||||||
|
|
||||||
#define HEX2INT(x) (UINT32)(x >= '0' && x <= '9' ? x - '0' : x >= 'a' && x <= 'f' ? x - 'a' + 10 : x >= 'A' && x <= 'F' ? x - 'A' + 10 : 0)
|
#define HEX2INT(x) (UINT32)(x >= '0' && x <= '9' ? x - '0' : x >= 'a' && x <= 'f' ? x - 'a' + 10 : x >= 'A' && x <= 'F' ? x - 'A' + 10 : 0)
|
||||||
|
@ -2241,12 +2241,12 @@ extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3)
|
||||||
|
|
||||||
#define NUMFROMCHAR(c) (c >= '0' && c <= '9' ? c - '0' : 0)
|
#define NUMFROMCHAR(c) (c >= '0' && c <= '9' ? c - '0' : 0)
|
||||||
|
|
||||||
// Get parameters like fadestart, fadeend, and the fogflag
|
// Get parameters like fadestart, fadeend, and flags
|
||||||
if (p2[0] == '#')
|
if (p2[0] == '#')
|
||||||
{
|
{
|
||||||
if (p2[1])
|
if (p2[1])
|
||||||
{
|
{
|
||||||
fog = NUMFROMCHAR(p2[1]);
|
flags = NUMFROMCHAR(p2[1]);
|
||||||
if (p2[2] && p2[3])
|
if (p2[2] && p2[3])
|
||||||
{
|
{
|
||||||
fadestart = NUMFROMCHAR(p2[3]) + (NUMFROMCHAR(p2[2]) * 10);
|
fadestart = NUMFROMCHAR(p2[3]) + (NUMFROMCHAR(p2[2]) * 10);
|
||||||
|
@ -2313,18 +2313,18 @@ extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3)
|
||||||
|
|
||||||
// Did we just make a default colormap?
|
// Did we just make a default colormap?
|
||||||
#ifdef EXTRACOLORMAPLUMPS
|
#ifdef EXTRACOLORMAPLUMPS
|
||||||
if (R_CheckDefaultColormapByValues(true, true, true, rgba, fadergba, fadestart, fadeend, fog, LUMPERROR))
|
if (R_CheckDefaultColormapByValues(true, true, true, rgba, fadergba, fadestart, fadeend, flags, LUMPERROR))
|
||||||
return NULL;
|
return NULL;
|
||||||
#else
|
#else
|
||||||
if (R_CheckDefaultColormapByValues(true, true, true, rgba, fadergba, fadestart, fadeend, fog))
|
if (R_CheckDefaultColormapByValues(true, true, true, rgba, fadergba, fadestart, fadeend, flags))
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Look for existing colormaps
|
// Look for existing colormaps
|
||||||
#ifdef EXTRACOLORMAPLUMPS
|
#ifdef EXTRACOLORMAPLUMPS
|
||||||
exc = R_GetColormapFromListByValues(rgba, fadergba, fadestart, fadeend, fog, LUMPERROR);
|
exc = R_GetColormapFromListByValues(rgba, fadergba, fadestart, fadeend, flags, LUMPERROR);
|
||||||
#else
|
#else
|
||||||
exc = R_GetColormapFromListByValues(rgba, fadergba, fadestart, fadeend, fog);
|
exc = R_GetColormapFromListByValues(rgba, fadergba, fadestart, fadeend, flags);
|
||||||
#endif
|
#endif
|
||||||
if (exc)
|
if (exc)
|
||||||
return exc;
|
return exc;
|
||||||
|
@ -2336,7 +2336,7 @@ extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3)
|
||||||
|
|
||||||
extra_colormap->fadestart = (UINT16)fadestart;
|
extra_colormap->fadestart = (UINT16)fadestart;
|
||||||
extra_colormap->fadeend = (UINT16)fadeend;
|
extra_colormap->fadeend = (UINT16)fadeend;
|
||||||
extra_colormap->fog = fog;
|
extra_colormap->flags = flags;
|
||||||
|
|
||||||
extra_colormap->rgba = rgba;
|
extra_colormap->rgba = rgba;
|
||||||
extra_colormap->fadergba = fadergba;
|
extra_colormap->fadergba = fadergba;
|
||||||
|
@ -2363,7 +2363,7 @@ extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3)
|
||||||
extracolormap_t *R_AddColormaps(extracolormap_t *exc_augend, extracolormap_t *exc_addend,
|
extracolormap_t *R_AddColormaps(extracolormap_t *exc_augend, extracolormap_t *exc_addend,
|
||||||
boolean subR, boolean subG, boolean subB, boolean subA,
|
boolean subR, boolean subG, boolean subB, boolean subA,
|
||||||
boolean subFadeR, boolean subFadeG, boolean subFadeB, boolean subFadeA,
|
boolean subFadeR, boolean subFadeG, boolean subFadeB, boolean subFadeA,
|
||||||
boolean subFadeStart, boolean subFadeEnd, boolean ignoreFog,
|
boolean subFadeStart, boolean subFadeEnd, boolean ignoreFlags,
|
||||||
boolean useAltAlpha, INT16 altAlpha, INT16 altFadeAlpha,
|
boolean useAltAlpha, INT16 altAlpha, INT16 altFadeAlpha,
|
||||||
boolean lighttable)
|
boolean lighttable)
|
||||||
{
|
{
|
||||||
|
@ -2451,8 +2451,8 @@ extracolormap_t *R_AddColormaps(extracolormap_t *exc_augend, extracolormap_t *ex
|
||||||
// HACK: fadeend defaults to 31, so don't add anything in this case
|
// HACK: fadeend defaults to 31, so don't add anything in this case
|
||||||
, 31), 0);
|
, 31), 0);
|
||||||
|
|
||||||
if (!ignoreFog) // overwrite fog with new value
|
if (!ignoreFlags) // overwrite flags with new value
|
||||||
exc_augend->fog = exc_addend->fog;
|
exc_augend->flags = exc_addend->flags;
|
||||||
|
|
||||||
///////////////////
|
///////////////////
|
||||||
// put it together
|
// put it together
|
||||||
|
@ -2465,16 +2465,20 @@ extracolormap_t *R_AddColormaps(extracolormap_t *exc_augend, extracolormap_t *ex
|
||||||
|
|
||||||
// Thanks to quake2 source!
|
// Thanks to quake2 source!
|
||||||
// utils3/qdata/images.c
|
// utils3/qdata/images.c
|
||||||
UINT8 NearestColor(UINT8 r, UINT8 g, UINT8 b)
|
UINT8 NearestPaletteColor(UINT8 r, UINT8 g, UINT8 b, RGBA_t *palette)
|
||||||
{
|
{
|
||||||
int dr, dg, db;
|
int dr, dg, db;
|
||||||
int distortion, bestdistortion = 256 * 256 * 4, bestcolor = 0, i;
|
int distortion, bestdistortion = 256 * 256 * 4, bestcolor = 0, i;
|
||||||
|
|
||||||
|
// Use master palette if none specified
|
||||||
|
if (palette == NULL)
|
||||||
|
palette = pMasterPalette;
|
||||||
|
|
||||||
for (i = 0; i < 256; i++)
|
for (i = 0; i < 256; i++)
|
||||||
{
|
{
|
||||||
dr = r - pMasterPalette[i].s.red;
|
dr = r - palette[i].s.red;
|
||||||
dg = g - pMasterPalette[i].s.green;
|
dg = g - palette[i].s.green;
|
||||||
db = b - pMasterPalette[i].s.blue;
|
db = b - palette[i].s.blue;
|
||||||
distortion = dr*dr + dg*dg + db*db;
|
distortion = dr*dr + dg*dg + db*db;
|
||||||
if (distortion < bestdistortion)
|
if (distortion < bestdistortion)
|
||||||
{
|
{
|
||||||
|
|
13
src/r_data.h
13
src/r_data.h
|
@ -135,12 +135,12 @@ void R_AddColormapToList(extracolormap_t *extra_colormap);
|
||||||
|
|
||||||
#ifdef EXTRACOLORMAPLUMPS
|
#ifdef EXTRACOLORMAPLUMPS
|
||||||
boolean R_CheckDefaultColormapByValues(boolean checkrgba, boolean checkfadergba, boolean checkparams,
|
boolean R_CheckDefaultColormapByValues(boolean checkrgba, boolean checkfadergba, boolean checkparams,
|
||||||
INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 fog, lumpnum_t lump);
|
INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 flags, lumpnum_t lump);
|
||||||
extracolormap_t *R_GetColormapFromListByValues(INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 fog, lumpnum_t lump);
|
extracolormap_t *R_GetColormapFromListByValues(INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 flags, lumpnum_t lump);
|
||||||
#else
|
#else
|
||||||
boolean R_CheckDefaultColormapByValues(boolean checkrgba, boolean checkfadergba, boolean checkparams,
|
boolean R_CheckDefaultColormapByValues(boolean checkrgba, boolean checkfadergba, boolean checkparams,
|
||||||
INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 fog);
|
INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 flags);
|
||||||
extracolormap_t *R_GetColormapFromListByValues(INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 fog);
|
extracolormap_t *R_GetColormapFromListByValues(INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 flags);
|
||||||
#endif
|
#endif
|
||||||
boolean R_CheckDefaultColormap(extracolormap_t *extra_colormap, boolean checkrgba, boolean checkfadergba, boolean checkparams);
|
boolean R_CheckDefaultColormap(extracolormap_t *extra_colormap, boolean checkrgba, boolean checkfadergba, boolean checkparams);
|
||||||
boolean R_CheckEqualColormaps(extracolormap_t *exc_a, extracolormap_t *exc_b, boolean checkrgba, boolean checkfadergba, boolean checkparams);
|
boolean R_CheckEqualColormaps(extracolormap_t *exc_a, extracolormap_t *exc_b, boolean checkrgba, boolean checkfadergba, boolean checkparams);
|
||||||
|
@ -151,7 +151,7 @@ extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3);
|
||||||
extracolormap_t *R_AddColormaps(extracolormap_t *exc_augend, extracolormap_t *exc_addend,
|
extracolormap_t *R_AddColormaps(extracolormap_t *exc_augend, extracolormap_t *exc_addend,
|
||||||
boolean subR, boolean subG, boolean subB, boolean subA,
|
boolean subR, boolean subG, boolean subB, boolean subA,
|
||||||
boolean subFadeR, boolean subFadeG, boolean subFadeB, boolean subFadeA,
|
boolean subFadeR, boolean subFadeG, boolean subFadeB, boolean subFadeA,
|
||||||
boolean subFadeStart, boolean subFadeEnd, boolean ignoreFog,
|
boolean subFadeStart, boolean subFadeEnd, boolean ignoreFlags,
|
||||||
boolean useAltAlpha, INT16 altAlpha, INT16 altFadeAlpha,
|
boolean useAltAlpha, INT16 altAlpha, INT16 altFadeAlpha,
|
||||||
boolean lighttable);
|
boolean lighttable);
|
||||||
#ifdef EXTRACOLORMAPLUMPS
|
#ifdef EXTRACOLORMAPLUMPS
|
||||||
|
@ -171,7 +171,8 @@ const char *R_NameForColormap(extracolormap_t *extra_colormap);
|
||||||
#define R_PutRgbaRGB(r, g, b) (R_PutRgbaR(r) + R_PutRgbaG(g) + R_PutRgbaB(b))
|
#define R_PutRgbaRGB(r, g, b) (R_PutRgbaR(r) + R_PutRgbaG(g) + R_PutRgbaB(b))
|
||||||
#define R_PutRgbaRGBA(r, g, b, a) (R_PutRgbaRGB(r, g, b) + R_PutRgbaA(a))
|
#define R_PutRgbaRGBA(r, g, b, a) (R_PutRgbaRGB(r, g, b) + R_PutRgbaA(a))
|
||||||
|
|
||||||
UINT8 NearestColor(UINT8 r, UINT8 g, UINT8 b);
|
UINT8 NearestPaletteColor(UINT8 r, UINT8 g, UINT8 b, RGBA_t *palette);
|
||||||
|
#define NearestColor(r, g, b) NearestPaletteColor(r, g, b, NULL)
|
||||||
|
|
||||||
extern INT32 numtextures;
|
extern INT32 numtextures;
|
||||||
|
|
||||||
|
|
|
@ -53,11 +53,14 @@ typedef struct
|
||||||
// Could even use more than 32 levels.
|
// Could even use more than 32 levels.
|
||||||
typedef UINT8 lighttable_t;
|
typedef UINT8 lighttable_t;
|
||||||
|
|
||||||
|
#define CMF_FADEFULLBRIGHTSPRITES 1
|
||||||
|
#define CMF_FOG 4
|
||||||
|
|
||||||
// ExtraColormap type. Use for extra_colormaps from now on.
|
// ExtraColormap type. Use for extra_colormaps from now on.
|
||||||
typedef struct extracolormap_s
|
typedef struct extracolormap_s
|
||||||
{
|
{
|
||||||
UINT8 fadestart, fadeend;
|
UINT8 fadestart, fadeend;
|
||||||
UINT8 fog; // categorical value, not boolean
|
UINT8 flags;
|
||||||
|
|
||||||
// store rgba values in combined bitwise
|
// store rgba values in combined bitwise
|
||||||
// also used in OpenGL instead lighttables
|
// also used in OpenGL instead lighttables
|
||||||
|
|
18
src/r_draw.c
18
src/r_draw.c
|
@ -153,9 +153,11 @@ const UINT8 Color_Index[MAXTRANSLATIONS-1][16] = {
|
||||||
// Desaturated
|
// Desaturated
|
||||||
{0x00, 0x00, 0x01, 0x02, 0x02, 0x03, 0x91, 0x91, 0x91, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xaf}, // SKINCOLOR_AETHER
|
{0x00, 0x00, 0x01, 0x02, 0x02, 0x03, 0x91, 0x91, 0x91, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xaf}, // SKINCOLOR_AETHER
|
||||||
{0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0xaa, 0xaa, 0xaa, 0xab, 0xac, 0xac, 0xad, 0xad, 0xae, 0xaf}, // SKINCOLOR_SLATE
|
{0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0xaa, 0xaa, 0xaa, 0xab, 0xac, 0xac, 0xad, 0xad, 0xae, 0xaf}, // SKINCOLOR_SLATE
|
||||||
|
{0x90, 0x91, 0x92, 0x93, 0x94, 0x94, 0x95, 0xac, 0xac, 0xad, 0xad, 0xa8, 0xa8, 0xa9, 0xfd, 0xfe}, // SKINCOLOR_BLUEBELL
|
||||||
{0xd0, 0xd0, 0xd1, 0xd1, 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0x2b, 0x2c, 0x2e}, // SKINCOLOR_PINK
|
{0xd0, 0xd0, 0xd1, 0xd1, 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0x2b, 0x2c, 0x2e}, // SKINCOLOR_PINK
|
||||||
{0xd0, 0x30, 0xd8, 0xd9, 0xda, 0xdb, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe3, 0xe6, 0xe8, 0xe9}, // SKINCOLOR_YOGURT
|
{0xd0, 0x30, 0xd8, 0xd9, 0xda, 0xdb, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe3, 0xe6, 0xe8, 0xe9}, // SKINCOLOR_YOGURT
|
||||||
{0xdf, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef}, // SKINCOLOR_BROWN
|
{0xdf, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef}, // SKINCOLOR_BROWN
|
||||||
|
{0xde, 0xe0, 0xe1, 0xe4, 0xe7, 0xe9, 0xeb, 0xec, 0xed, 0xed, 0xed, 0x19, 0x19, 0x1b, 0x1d, 0x1e}, // SKINCOLOR_BRONZE
|
||||||
{0x51, 0x51, 0x54, 0x54, 0x55, 0x55, 0x56, 0x56, 0x56, 0x57, 0xf5, 0xf5, 0xf9, 0xf9, 0xed, 0xed}, // SKINCOLOR_TAN
|
{0x51, 0x51, 0x54, 0x54, 0x55, 0x55, 0x56, 0x56, 0x56, 0x57, 0xf5, 0xf5, 0xf9, 0xf9, 0xed, 0xed}, // SKINCOLOR_TAN
|
||||||
{0x54, 0x55, 0x56, 0x56, 0xf2, 0xf3, 0xf3, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfb, 0xed, 0xed}, // SKINCOLOR_BEIGE
|
{0x54, 0x55, 0x56, 0x56, 0xf2, 0xf3, 0xf3, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfb, 0xed, 0xed}, // SKINCOLOR_BEIGE
|
||||||
{0x58, 0x58, 0x59, 0x59, 0x5a, 0x5a, 0x5b, 0x5b, 0x5b, 0x5c, 0x5d, 0x5d, 0x5e, 0x5e, 0x5f, 0x5f}, // SKINCOLOR_MOSS
|
{0x58, 0x58, 0x59, 0x59, 0x5a, 0x5a, 0x5b, 0x5b, 0x5b, 0x5c, 0x5d, 0x5d, 0x5e, 0x5e, 0x5f, 0x5f}, // SKINCOLOR_MOSS
|
||||||
|
@ -168,9 +170,11 @@ const UINT8 Color_Index[MAXTRANSLATIONS-1][16] = {
|
||||||
{0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x47, 0x2e, 0x2f}, // SKINCOLOR_RED
|
{0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x47, 0x2e, 0x2f}, // SKINCOLOR_RED
|
||||||
{0x27, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2b, 0x2c, 0x2d, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x1f}, // SKINCOLOR_CRIMSON
|
{0x27, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2b, 0x2c, 0x2d, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x1f}, // SKINCOLOR_CRIMSON
|
||||||
{0x31, 0x32, 0x33, 0x36, 0x22, 0x22, 0x25, 0x25, 0x25, 0xcd, 0xcf, 0xcf, 0xc5, 0xc5, 0xc7, 0xc7}, // SKINCOLOR_FLAME
|
{0x31, 0x32, 0x33, 0x36, 0x22, 0x22, 0x25, 0x25, 0x25, 0xcd, 0xcf, 0xcf, 0xc5, 0xc5, 0xc7, 0xc7}, // SKINCOLOR_FLAME
|
||||||
|
{0x48, 0x49, 0x40, 0x33, 0x34, 0x36, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2b, 0x2c, 0x47, 0x2e, 0x2f}, // SKINCOLOR_KETCHUP
|
||||||
{0xd0, 0x30, 0x31, 0x31, 0x32, 0x32, 0xdc, 0xdc, 0xdc, 0xd3, 0xd4, 0xd4, 0xcc, 0xcd, 0xce, 0xcf}, // SKINCOLOR_PEACHY
|
{0xd0, 0x30, 0x31, 0x31, 0x32, 0x32, 0xdc, 0xdc, 0xdc, 0xd3, 0xd4, 0xd4, 0xcc, 0xcd, 0xce, 0xcf}, // SKINCOLOR_PEACHY
|
||||||
{0xd8, 0xd9, 0xdb, 0xdc, 0xde, 0xdf, 0xd5, 0xd5, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0x1d, 0x1f}, // SKINCOLOR_QUAIL
|
{0xd8, 0xd9, 0xdb, 0xdc, 0xde, 0xdf, 0xd5, 0xd5, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0x1d, 0x1f}, // SKINCOLOR_QUAIL
|
||||||
{0x51, 0x52, 0x40, 0x40, 0x34, 0x36, 0xd5, 0xd5, 0xd6, 0xd7, 0xcf, 0xcf, 0xc6, 0xc6, 0xc7, 0xfe}, // SKINCOLOR_SUNSET
|
{0x51, 0x52, 0x40, 0x40, 0x34, 0x36, 0xd5, 0xd5, 0xd6, 0xd7, 0xcf, 0xcf, 0xc6, 0xc6, 0xc7, 0xfe}, // SKINCOLOR_SUNSET
|
||||||
|
{0x58, 0x54, 0x40, 0x34, 0x35, 0x38, 0x3a, 0x3c, 0x3d, 0x2a, 0x2b, 0x2c, 0x2c, 0xba, 0xba, 0xbb}, // SKINCOLOR_COPPER
|
||||||
{0x00, 0xd8, 0xd9, 0xda, 0xdb, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e}, // SKINCOLOR_APRICOT
|
{0x00, 0xd8, 0xd9, 0xda, 0xdb, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e}, // SKINCOLOR_APRICOT
|
||||||
{0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x2c}, // SKINCOLOR_ORANGE
|
{0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x2c}, // SKINCOLOR_ORANGE
|
||||||
{0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3f, 0x2c, 0x2d, 0x47, 0x2e, 0x2f, 0x2f}, // SKINCOLOR_RUST
|
{0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3f, 0x2c, 0x2d, 0x47, 0x2e, 0x2f, 0x2f}, // SKINCOLOR_RUST
|
||||||
|
@ -180,6 +184,7 @@ const UINT8 Color_Index[MAXTRANSLATIONS-1][16] = {
|
||||||
{0x4b, 0x4b, 0x4c, 0x4c, 0x4d, 0x4e, 0xe7, 0xe7, 0xe9, 0xc5, 0xc5, 0xc6, 0xc6, 0xc7, 0xc7, 0xfd}, // SKINCOLOR_OLIVE
|
{0x4b, 0x4b, 0x4c, 0x4c, 0x4d, 0x4e, 0xe7, 0xe7, 0xe9, 0xc5, 0xc5, 0xc6, 0xc6, 0xc7, 0xc7, 0xfd}, // SKINCOLOR_OLIVE
|
||||||
{0x50, 0x51, 0x52, 0x53, 0x48, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f}, // SKINCOLOR_LIME
|
{0x50, 0x51, 0x52, 0x53, 0x48, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f}, // SKINCOLOR_LIME
|
||||||
{0x58, 0x58, 0xbc, 0xbc, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbf, 0x5e, 0x5e, 0x5f, 0x5f, 0x77, 0x77}, // SKINCOLOR_PERIDOT
|
{0x58, 0x58, 0xbc, 0xbc, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbf, 0x5e, 0x5e, 0x5f, 0x5f, 0x77, 0x77}, // SKINCOLOR_PERIDOT
|
||||||
|
{0x49, 0x49, 0xbc, 0xbd, 0xbe, 0xbe, 0xbe, 0x67, 0x69, 0x6a, 0x6b, 0x6b, 0x6c, 0x6d, 0x6d, 0x6d}, // SKINCOLOR_APPLE
|
||||||
{0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f}, // SKINCOLOR_GREEN
|
{0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f}, // SKINCOLOR_GREEN
|
||||||
{0x65, 0x66, 0x67, 0x68, 0x69, 0x69, 0x6a, 0x6b, 0x6b, 0x6c, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6f}, // SKINCOLOR_FOREST
|
{0x65, 0x66, 0x67, 0x68, 0x69, 0x69, 0x6a, 0x6b, 0x6b, 0x6c, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6f}, // SKINCOLOR_FOREST
|
||||||
{0x70, 0x70, 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77}, // SKINCOLOR_EMERALD
|
{0x70, 0x70, 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77}, // SKINCOLOR_EMERALD
|
||||||
|
@ -206,6 +211,7 @@ const UINT8 Color_Index[MAXTRANSLATIONS-1][16] = {
|
||||||
{0xd0, 0xd1, 0xd2, 0xca, 0xcc, 0xb8, 0xb9, 0xb9, 0xba, 0xa8, 0xa8, 0xa9, 0xa9, 0xfd, 0xfe, 0xfe}, // SKINCOLOR_VIOLET
|
{0xd0, 0xd1, 0xd2, 0xca, 0xcc, 0xb8, 0xb9, 0xb9, 0xba, 0xa8, 0xa8, 0xa9, 0xa9, 0xfd, 0xfe, 0xfe}, // SKINCOLOR_VIOLET
|
||||||
{0x00, 0xd0, 0xd1, 0xd2, 0xd3, 0xc1, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, 0xc6, 0xfe, 0x1f}, // SKINCOLOR_LILAC
|
{0x00, 0xd0, 0xd1, 0xd2, 0xd3, 0xc1, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, 0xc6, 0xfe, 0x1f}, // SKINCOLOR_LILAC
|
||||||
{0xc8, 0xd3, 0xd5, 0xd6, 0xd7, 0xce, 0xcf, 0xb9, 0xb9, 0xba, 0xba, 0xa9, 0xa9, 0xa9, 0xfd, 0xfe}, // SKINCOLOR_PLUM
|
{0xc8, 0xd3, 0xd5, 0xd6, 0xd7, 0xce, 0xcf, 0xb9, 0xb9, 0xba, 0xba, 0xa9, 0xa9, 0xa9, 0xfd, 0xfe}, // SKINCOLOR_PLUM
|
||||||
|
{0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xcd, 0xce, 0xb9, 0xb9, 0xba, 0xba, 0xbb, 0xfe, 0xfe}, // SKINCOLOR_RASPBERRY
|
||||||
{0xfc, 0xc8, 0xc8, 0xc9, 0xc9, 0xca, 0xca, 0xcb, 0xcb, 0xcc, 0xcc, 0xcd, 0xcd, 0xce, 0xce, 0xcf}, // SKINCOLOR_ROSY
|
{0xfc, 0xc8, 0xc8, 0xc9, 0xc9, 0xca, 0xca, 0xcb, 0xcb, 0xcc, 0xcc, 0xcd, 0xcd, 0xce, 0xce, 0xcf}, // SKINCOLOR_ROSY
|
||||||
|
|
||||||
// {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // SKINCOLOR_?
|
// {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // SKINCOLOR_?
|
||||||
|
@ -285,9 +291,11 @@ const char *Color_Names[MAXSKINCOLORS + NUMSUPERCOLORS] =
|
||||||
// Desaturated
|
// Desaturated
|
||||||
"Aether", // SKINCOLOR_AETHER,
|
"Aether", // SKINCOLOR_AETHER,
|
||||||
"Slate", // SKINCOLOR_SLATE,
|
"Slate", // SKINCOLOR_SLATE,
|
||||||
|
"Bluebell", // SKINCOLOR_BLUEBELL,
|
||||||
"Pink", // SKINCOLOR_PINK,
|
"Pink", // SKINCOLOR_PINK,
|
||||||
"Yogurt", // SKINCOLOR_YOGURT,
|
"Yogurt", // SKINCOLOR_YOGURT,
|
||||||
"Brown", // SKINCOLOR_BROWN,
|
"Brown", // SKINCOLOR_BROWN,
|
||||||
|
"Bronze", // SKINCOLOR_BRONZE,
|
||||||
"Tan", // SKINCOLOR_TAN,
|
"Tan", // SKINCOLOR_TAN,
|
||||||
"Beige", // SKINCOLOR_BEIGE,
|
"Beige", // SKINCOLOR_BEIGE,
|
||||||
"Moss", // SKINCOLOR_MOSS,
|
"Moss", // SKINCOLOR_MOSS,
|
||||||
|
@ -300,9 +308,11 @@ const char *Color_Names[MAXSKINCOLORS + NUMSUPERCOLORS] =
|
||||||
"Red", // SKINCOLOR_RED,
|
"Red", // SKINCOLOR_RED,
|
||||||
"Crimson", // SKINCOLOR_CRIMSON,
|
"Crimson", // SKINCOLOR_CRIMSON,
|
||||||
"Flame", // SKINCOLOR_FLAME,
|
"Flame", // SKINCOLOR_FLAME,
|
||||||
|
"Ketchup", // SKINCOLOR_KETCHUP,
|
||||||
"Peachy", // SKINCOLOR_PEACHY,
|
"Peachy", // SKINCOLOR_PEACHY,
|
||||||
"Quail", // SKINCOLOR_QUAIL,
|
"Quail", // SKINCOLOR_QUAIL,
|
||||||
"Sunset", // SKINCOLOR_SUNSET,
|
"Sunset", // SKINCOLOR_SUNSET,
|
||||||
|
"Copper", // SKINCOLOR_COPPER,
|
||||||
"Apricot", // SKINCOLOR_APRICOT,
|
"Apricot", // SKINCOLOR_APRICOT,
|
||||||
"Orange", // SKINCOLOR_ORANGE,
|
"Orange", // SKINCOLOR_ORANGE,
|
||||||
"Rust", // SKINCOLOR_RUST,
|
"Rust", // SKINCOLOR_RUST,
|
||||||
|
@ -312,6 +322,7 @@ const char *Color_Names[MAXSKINCOLORS + NUMSUPERCOLORS] =
|
||||||
"Olive", // SKINCOLOR_OLIVE,
|
"Olive", // SKINCOLOR_OLIVE,
|
||||||
"Lime", // SKINCOLOR_LIME,
|
"Lime", // SKINCOLOR_LIME,
|
||||||
"Peridot", // SKINCOLOR_PERIDOT,
|
"Peridot", // SKINCOLOR_PERIDOT,
|
||||||
|
"Apple", // SKINCOLOR_APPLE,
|
||||||
"Green", // SKINCOLOR_GREEN,
|
"Green", // SKINCOLOR_GREEN,
|
||||||
"Forest", // SKINCOLOR_FOREST,
|
"Forest", // SKINCOLOR_FOREST,
|
||||||
"Emerald", // SKINCOLOR_EMERALD,
|
"Emerald", // SKINCOLOR_EMERALD,
|
||||||
|
@ -338,6 +349,7 @@ const char *Color_Names[MAXSKINCOLORS + NUMSUPERCOLORS] =
|
||||||
"Violet", // SKINCOLOR_VIOLET,
|
"Violet", // SKINCOLOR_VIOLET,
|
||||||
"Lilac", // SKINCOLOR_LILAC,
|
"Lilac", // SKINCOLOR_LILAC,
|
||||||
"Plum", // SKINCOLOR_PLUM,
|
"Plum", // SKINCOLOR_PLUM,
|
||||||
|
"Raspberry", // SKINCOLOR_RASPBERRY,
|
||||||
"Rosy", // SKINCOLOR_ROSY,
|
"Rosy", // SKINCOLOR_ROSY,
|
||||||
|
|
||||||
// Super behaves by different rules (one name per 5 colours), and will be accessed exclusively via R_GetSuperColorByName instead of R_GetColorByName.
|
// Super behaves by different rules (one name per 5 colours), and will be accessed exclusively via R_GetSuperColorByName instead of R_GetColorByName.
|
||||||
|
@ -375,9 +387,11 @@ const UINT8 Color_Opposite[MAXSKINCOLORS - 1][2] =
|
||||||
// Desaturated
|
// Desaturated
|
||||||
{SKINCOLOR_GREY, 15}, // SKINCOLOR_AETHER,
|
{SKINCOLOR_GREY, 15}, // SKINCOLOR_AETHER,
|
||||||
{SKINCOLOR_SILVER, 12}, // SKINCOLOR_SLATE,
|
{SKINCOLOR_SILVER, 12}, // SKINCOLOR_SLATE,
|
||||||
|
{SKINCOLOR_COPPER, 4}, // SKINCOLOR_BLUEBELL,
|
||||||
{SKINCOLOR_AZURE, 9}, // SKINCOLOR_PINK,
|
{SKINCOLOR_AZURE, 9}, // SKINCOLOR_PINK,
|
||||||
{SKINCOLOR_RUST, 7}, // SKINCOLOR_YOGURT,
|
{SKINCOLOR_RUST, 7}, // SKINCOLOR_YOGURT,
|
||||||
{SKINCOLOR_TAN, 2}, // SKINCOLOR_BROWN,
|
{SKINCOLOR_TAN, 2}, // SKINCOLOR_BROWN,
|
||||||
|
{SKINCOLOR_KETCHUP, 0}, // SKINCOLOR_BRONZE,
|
||||||
{SKINCOLOR_BROWN, 12}, // SKINCOLOR_TAN,
|
{SKINCOLOR_BROWN, 12}, // SKINCOLOR_TAN,
|
||||||
{SKINCOLOR_MOSS, 5}, // SKINCOLOR_BEIGE,
|
{SKINCOLOR_MOSS, 5}, // SKINCOLOR_BEIGE,
|
||||||
{SKINCOLOR_BEIGE, 13}, // SKINCOLOR_MOSS,
|
{SKINCOLOR_BEIGE, 13}, // SKINCOLOR_MOSS,
|
||||||
|
@ -390,9 +404,11 @@ const UINT8 Color_Opposite[MAXSKINCOLORS - 1][2] =
|
||||||
{SKINCOLOR_GREEN, 10}, // SKINCOLOR_RED,
|
{SKINCOLOR_GREEN, 10}, // SKINCOLOR_RED,
|
||||||
{SKINCOLOR_ICY, 10}, // SKINCOLOR_CRIMSON,
|
{SKINCOLOR_ICY, 10}, // SKINCOLOR_CRIMSON,
|
||||||
{SKINCOLOR_PURPLE, 8}, // SKINCOLOR_FLAME,
|
{SKINCOLOR_PURPLE, 8}, // SKINCOLOR_FLAME,
|
||||||
|
{SKINCOLOR_BRONZE, 8}, // SKINCOLOR_KETCHUP,
|
||||||
{SKINCOLOR_TEAL, 7}, // SKINCOLOR_PEACHY,
|
{SKINCOLOR_TEAL, 7}, // SKINCOLOR_PEACHY,
|
||||||
{SKINCOLOR_WAVE, 5}, // SKINCOLOR_QUAIL,
|
{SKINCOLOR_WAVE, 5}, // SKINCOLOR_QUAIL,
|
||||||
{SKINCOLOR_SAPPHIRE, 5}, // SKINCOLOR_SUNSET,
|
{SKINCOLOR_SAPPHIRE, 5}, // SKINCOLOR_SUNSET,
|
||||||
|
{SKINCOLOR_BLUEBELL, 5}, // SKINCOLOR_COPPER
|
||||||
{SKINCOLOR_CYAN, 4}, // SKINCOLOR_APRICOT,
|
{SKINCOLOR_CYAN, 4}, // SKINCOLOR_APRICOT,
|
||||||
{SKINCOLOR_BLUE, 4}, // SKINCOLOR_ORANGE,
|
{SKINCOLOR_BLUE, 4}, // SKINCOLOR_ORANGE,
|
||||||
{SKINCOLOR_YOGURT, 8}, // SKINCOLOR_RUST,
|
{SKINCOLOR_YOGURT, 8}, // SKINCOLOR_RUST,
|
||||||
|
@ -402,6 +418,7 @@ const UINT8 Color_Opposite[MAXSKINCOLORS - 1][2] =
|
||||||
{SKINCOLOR_DUSK, 3}, // SKINCOLOR_OLIVE,
|
{SKINCOLOR_DUSK, 3}, // SKINCOLOR_OLIVE,
|
||||||
{SKINCOLOR_MAGENTA, 9}, // SKINCOLOR_LIME,
|
{SKINCOLOR_MAGENTA, 9}, // SKINCOLOR_LIME,
|
||||||
{SKINCOLOR_COBALT, 2}, // SKINCOLOR_PERIDOT,
|
{SKINCOLOR_COBALT, 2}, // SKINCOLOR_PERIDOT,
|
||||||
|
{SKINCOLOR_RASPBERRY, 13}, // SKINCOLOR_APPLE,
|
||||||
{SKINCOLOR_RED, 6}, // SKINCOLOR_GREEN,
|
{SKINCOLOR_RED, 6}, // SKINCOLOR_GREEN,
|
||||||
{SKINCOLOR_SALMON, 9}, // SKINCOLOR_FOREST,
|
{SKINCOLOR_SALMON, 9}, // SKINCOLOR_FOREST,
|
||||||
{SKINCOLOR_RUBY, 4}, // SKINCOLOR_EMERALD,
|
{SKINCOLOR_RUBY, 4}, // SKINCOLOR_EMERALD,
|
||||||
|
@ -428,6 +445,7 @@ const UINT8 Color_Opposite[MAXSKINCOLORS - 1][2] =
|
||||||
{SKINCOLOR_MINT, 6}, // SKINCOLOR_VIOLET,
|
{SKINCOLOR_MINT, 6}, // SKINCOLOR_VIOLET,
|
||||||
{SKINCOLOR_VAPOR, 4}, // SKINCOLOR_LILAC,
|
{SKINCOLOR_VAPOR, 4}, // SKINCOLOR_LILAC,
|
||||||
{SKINCOLOR_MINT, 7}, // SKINCOLOR_PLUM,
|
{SKINCOLOR_MINT, 7}, // SKINCOLOR_PLUM,
|
||||||
|
{SKINCOLOR_APPLE, 13}, // SKINCOLOR_RASPBERRY
|
||||||
{SKINCOLOR_AQUA, 1} // SKINCOLOR_ROSY,
|
{SKINCOLOR_AQUA, 1} // SKINCOLOR_ROSY,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -644,6 +644,7 @@ void R_CalcTiltedLighting(fixed_t start, fixed_t end)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define PLANELIGHTFLOAT (BASEVIDWIDTH * BASEVIDWIDTH / vid.width / (zeroheight - FIXED_TO_FLOAT(viewz)) / 21.0f * FIXED_TO_FLOAT(fovtan))
|
||||||
|
|
||||||
/** \brief The R_DrawTiltedSpan_8 function
|
/** \brief The R_DrawTiltedSpan_8 function
|
||||||
Draw slopes! Holy sheit!
|
Draw slopes! Holy sheit!
|
||||||
|
@ -669,7 +670,7 @@ void R_DrawTiltedSpan_8(void)
|
||||||
|
|
||||||
// Lighting is simple. It's just linear interpolation from start to end
|
// Lighting is simple. It's just linear interpolation from start to end
|
||||||
{
|
{
|
||||||
float planelightfloat = BASEVIDWIDTH*BASEVIDWIDTH/vid.width / (zeroheight - FIXED_TO_FLOAT(viewz)) / 21.0f;
|
float planelightfloat = PLANELIGHTFLOAT;
|
||||||
float lightstart, lightend;
|
float lightstart, lightend;
|
||||||
|
|
||||||
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
||||||
|
@ -805,7 +806,7 @@ void R_DrawTiltedTranslucentSpan_8(void)
|
||||||
|
|
||||||
// Lighting is simple. It's just linear interpolation from start to end
|
// Lighting is simple. It's just linear interpolation from start to end
|
||||||
{
|
{
|
||||||
float planelightfloat = BASEVIDWIDTH*BASEVIDWIDTH/vid.width / (zeroheight - FIXED_TO_FLOAT(viewz)) / 21.0f;
|
float planelightfloat = PLANELIGHTFLOAT;
|
||||||
float lightstart, lightend;
|
float lightstart, lightend;
|
||||||
|
|
||||||
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
||||||
|
@ -942,7 +943,7 @@ void R_DrawTiltedTranslucentWaterSpan_8(void)
|
||||||
|
|
||||||
// Lighting is simple. It's just linear interpolation from start to end
|
// Lighting is simple. It's just linear interpolation from start to end
|
||||||
{
|
{
|
||||||
float planelightfloat = BASEVIDWIDTH*BASEVIDWIDTH/vid.width / (zeroheight - FIXED_TO_FLOAT(viewz)) / 21.0f;
|
float planelightfloat = PLANELIGHTFLOAT;
|
||||||
float lightstart, lightend;
|
float lightstart, lightend;
|
||||||
|
|
||||||
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
||||||
|
@ -1078,7 +1079,7 @@ void R_DrawTiltedSplat_8(void)
|
||||||
|
|
||||||
// Lighting is simple. It's just linear interpolation from start to end
|
// Lighting is simple. It's just linear interpolation from start to end
|
||||||
{
|
{
|
||||||
float planelightfloat = BASEVIDWIDTH*BASEVIDWIDTH/vid.width / (zeroheight - FIXED_TO_FLOAT(viewz)) / 21.0f;
|
float planelightfloat = PLANELIGHTFLOAT;
|
||||||
float lightstart, lightend;
|
float lightstart, lightend;
|
||||||
|
|
||||||
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
||||||
|
|
|
@ -62,6 +62,9 @@ void R_DrawSpan_NPO2_8 (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
|
|
||||||
|
#define PLANELIGHTFLOAT (BASEVIDWIDTH * BASEVIDWIDTH / vid.width / (zeroheight - FIXED_TO_FLOAT(viewz)) / 21.0f * FIXED_TO_FLOAT(fovtan))
|
||||||
|
|
||||||
/** \brief The R_DrawTiltedSpan_NPO2_8 function
|
/** \brief The R_DrawTiltedSpan_NPO2_8 function
|
||||||
Draw slopes! Holy sheit!
|
Draw slopes! Holy sheit!
|
||||||
*/
|
*/
|
||||||
|
@ -86,7 +89,7 @@ void R_DrawTiltedSpan_NPO2_8(void)
|
||||||
|
|
||||||
// Lighting is simple. It's just linear interpolation from start to end
|
// Lighting is simple. It's just linear interpolation from start to end
|
||||||
{
|
{
|
||||||
float planelightfloat = BASEVIDWIDTH*BASEVIDWIDTH/vid.width / (zeroheight - FIXED_TO_FLOAT(viewz)) / 21.0f;
|
float planelightfloat = PLANELIGHTFLOAT;
|
||||||
float lightstart, lightend;
|
float lightstart, lightend;
|
||||||
|
|
||||||
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
||||||
|
@ -282,7 +285,7 @@ void R_DrawTiltedTranslucentSpan_NPO2_8(void)
|
||||||
|
|
||||||
// Lighting is simple. It's just linear interpolation from start to end
|
// Lighting is simple. It's just linear interpolation from start to end
|
||||||
{
|
{
|
||||||
float planelightfloat = BASEVIDWIDTH*BASEVIDWIDTH/vid.width / (zeroheight - FIXED_TO_FLOAT(viewz)) / 21.0f;
|
float planelightfloat = PLANELIGHTFLOAT;
|
||||||
float lightstart, lightend;
|
float lightstart, lightend;
|
||||||
|
|
||||||
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
||||||
|
@ -476,7 +479,7 @@ void R_DrawTiltedSplat_NPO2_8(void)
|
||||||
|
|
||||||
// Lighting is simple. It's just linear interpolation from start to end
|
// Lighting is simple. It's just linear interpolation from start to end
|
||||||
{
|
{
|
||||||
float planelightfloat = BASEVIDWIDTH*BASEVIDWIDTH/vid.width / (zeroheight - FIXED_TO_FLOAT(viewz)) / 21.0f;
|
float planelightfloat = PLANELIGHTFLOAT;
|
||||||
float lightstart, lightend;
|
float lightstart, lightend;
|
||||||
|
|
||||||
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
||||||
|
@ -869,7 +872,7 @@ void R_DrawTiltedTranslucentWaterSpan_NPO2_8(void)
|
||||||
|
|
||||||
// Lighting is simple. It's just linear interpolation from start to end
|
// Lighting is simple. It's just linear interpolation from start to end
|
||||||
{
|
{
|
||||||
float planelightfloat = BASEVIDWIDTH*BASEVIDWIDTH/vid.width / (zeroheight - FIXED_TO_FLOAT(viewz)) / 21.0f;
|
float planelightfloat = PLANELIGHTFLOAT;
|
||||||
float lightstart, lightend;
|
float lightstart, lightend;
|
||||||
|
|
||||||
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
lightend = (iz + ds_szp->x*width) * planelightfloat;
|
||||||
|
|
318
src/r_main.c
318
src/r_main.c
|
@ -547,6 +547,303 @@ static inline void R_InitLightTables(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//#define WOUGHMP_WOUGHMP // I got a fish-eye lens - I'll make a rap video with a couple of friends
|
||||||
|
// it's kinda laggy sometimes
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
angle_t rollangle; // pre-shifted by fineshift
|
||||||
|
#ifdef WOUGHMP_WOUGHMP
|
||||||
|
fixed_t fisheye;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fixed_t zoomneeded;
|
||||||
|
INT32 *scrmap;
|
||||||
|
INT32 scrmapsize;
|
||||||
|
|
||||||
|
INT32 x1; // clip rendering horizontally for efficiency
|
||||||
|
INT16 ceilingclip[MAXVIDWIDTH], floorclip[MAXVIDWIDTH];
|
||||||
|
|
||||||
|
boolean use;
|
||||||
|
} viewmorph = {
|
||||||
|
0,
|
||||||
|
#ifdef WOUGHMP_WOUGHMP
|
||||||
|
0,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
FRACUNIT,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
|
||||||
|
0,
|
||||||
|
{}, {},
|
||||||
|
|
||||||
|
false
|
||||||
|
};
|
||||||
|
|
||||||
|
void R_CheckViewMorph(void)
|
||||||
|
{
|
||||||
|
float zoomfactor, rollcos, rollsin;
|
||||||
|
float x1, y1, x2, y2;
|
||||||
|
fixed_t temp;
|
||||||
|
INT32 end, vx, vy, pos, usedpos;
|
||||||
|
INT32 usedx, usedy, halfwidth = vid.width/2, halfheight = vid.height/2;
|
||||||
|
#ifdef WOUGHMP_WOUGHMP
|
||||||
|
float fisheyemap[MAXVIDWIDTH/2 + 1];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
angle_t rollangle = players[displayplayer].viewrollangle;
|
||||||
|
#ifdef WOUGHMP_WOUGHMP
|
||||||
|
fixed_t fisheye = cv_cam2_turnmultiplier.value; // temporary test value
|
||||||
|
#endif
|
||||||
|
|
||||||
|
rollangle >>= ANGLETOFINESHIFT;
|
||||||
|
rollangle = ((rollangle+2) & ~3) & FINEMASK; // Limit the distinct number of angles to reduce recalcs from angles changing a lot.
|
||||||
|
|
||||||
|
#ifdef WOUGHMP_WOUGHMP
|
||||||
|
fisheye &= ~0x7FF; // Same
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (rollangle == viewmorph.rollangle &&
|
||||||
|
#ifdef WOUGHMP_WOUGHMP
|
||||||
|
fisheye == viewmorph.fisheye &&
|
||||||
|
#endif
|
||||||
|
viewmorph.scrmapsize == vid.width*vid.height)
|
||||||
|
return; // No change
|
||||||
|
|
||||||
|
viewmorph.rollangle = rollangle;
|
||||||
|
#ifdef WOUGHMP_WOUGHMP
|
||||||
|
viewmorph.fisheye = fisheye;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (viewmorph.rollangle == 0
|
||||||
|
#ifdef WOUGHMP_WOUGHMP
|
||||||
|
&& viewmorph.fisheye == 0
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
{
|
||||||
|
viewmorph.use = false;
|
||||||
|
viewmorph.x1 = 0;
|
||||||
|
if (viewmorph.zoomneeded != FRACUNIT)
|
||||||
|
R_SetViewSize();
|
||||||
|
viewmorph.zoomneeded = FRACUNIT;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (viewmorph.scrmapsize != vid.width*vid.height)
|
||||||
|
{
|
||||||
|
if (viewmorph.scrmap)
|
||||||
|
free(viewmorph.scrmap);
|
||||||
|
viewmorph.scrmap = malloc(vid.width*vid.height * sizeof(INT32));
|
||||||
|
viewmorph.scrmapsize = vid.width*vid.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp = FINECOSINE(rollangle);
|
||||||
|
rollcos = FIXED_TO_FLOAT(temp);
|
||||||
|
temp = FINESINE(rollangle);
|
||||||
|
rollsin = FIXED_TO_FLOAT(temp);
|
||||||
|
|
||||||
|
// Calculate maximum zoom needed
|
||||||
|
x1 = (vid.width*fabsf(rollcos) + vid.height*fabsf(rollsin)) / vid.width;
|
||||||
|
y1 = (vid.height*fabsf(rollcos) + vid.width*fabsf(rollsin)) / vid.height;
|
||||||
|
|
||||||
|
#ifdef WOUGHMP_WOUGHMP
|
||||||
|
if (fisheye)
|
||||||
|
{
|
||||||
|
float f = FIXED_TO_FLOAT(fisheye);
|
||||||
|
for (vx = 0; vx <= halfwidth; vx++)
|
||||||
|
fisheyemap[vx] = 1.0f / cos(atan(vx * f / halfwidth));
|
||||||
|
|
||||||
|
f = cos(atan(f));
|
||||||
|
if (f < 1.0f)
|
||||||
|
{
|
||||||
|
x1 /= f;
|
||||||
|
y1 /= f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
temp = max(x1, y1)*FRACUNIT;
|
||||||
|
if (temp < FRACUNIT)
|
||||||
|
temp = FRACUNIT;
|
||||||
|
else
|
||||||
|
temp |= 0x3FFF; // Limit how many times the viewport needs to be recalculated
|
||||||
|
|
||||||
|
//CONS_Printf("Setting zoom to %f\n", FIXED_TO_FLOAT(temp));
|
||||||
|
|
||||||
|
if (temp != viewmorph.zoomneeded)
|
||||||
|
{
|
||||||
|
viewmorph.zoomneeded = temp;
|
||||||
|
R_SetViewSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
zoomfactor = FIXED_TO_FLOAT(viewmorph.zoomneeded);
|
||||||
|
|
||||||
|
end = vid.width * vid.height - 1;
|
||||||
|
|
||||||
|
pos = 0;
|
||||||
|
|
||||||
|
// Pre-multiply rollcos and rollsin to use for positional stuff
|
||||||
|
rollcos /= zoomfactor;
|
||||||
|
rollsin /= zoomfactor;
|
||||||
|
|
||||||
|
x1 = -(halfwidth * rollcos - halfheight * rollsin);
|
||||||
|
y1 = -(halfheight * rollcos + halfwidth * rollsin);
|
||||||
|
|
||||||
|
#ifdef WOUGHMP_WOUGHMP
|
||||||
|
if (fisheye)
|
||||||
|
viewmorph.x1 = (INT32)(halfwidth - (halfwidth * fabsf(rollcos) + halfheight * fabsf(rollsin)) * fisheyemap[halfwidth]);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
viewmorph.x1 = (INT32)(halfwidth - (halfwidth * fabsf(rollcos) + halfheight * fabsf(rollsin)));
|
||||||
|
//CONS_Printf("saving %d cols\n", viewmorph.x1);
|
||||||
|
|
||||||
|
// Set ceilingclip and floorclip
|
||||||
|
for (vx = 0; vx < vid.width; vx++)
|
||||||
|
{
|
||||||
|
viewmorph.ceilingclip[vx] = vid.height;
|
||||||
|
viewmorph.floorclip[vx] = -1;
|
||||||
|
}
|
||||||
|
x2 = x1;
|
||||||
|
y2 = y1;
|
||||||
|
for (vx = 0; vx < vid.width; vx++)
|
||||||
|
{
|
||||||
|
INT16 xa, ya, xb, yb;
|
||||||
|
xa = x2+halfwidth;
|
||||||
|
ya = y2+halfheight-1;
|
||||||
|
xb = vid.width-1-xa;
|
||||||
|
yb = vid.height-1-ya;
|
||||||
|
|
||||||
|
viewmorph.ceilingclip[xa] = min(viewmorph.ceilingclip[xa], ya);
|
||||||
|
viewmorph.floorclip[xa] = max(viewmorph.floorclip[xa], ya);
|
||||||
|
viewmorph.ceilingclip[xb] = min(viewmorph.ceilingclip[xb], yb);
|
||||||
|
viewmorph.floorclip[xb] = max(viewmorph.floorclip[xb], yb);
|
||||||
|
x2 += rollcos;
|
||||||
|
y2 += rollsin;
|
||||||
|
}
|
||||||
|
x2 = x1;
|
||||||
|
y2 = y1;
|
||||||
|
for (vy = 0; vy < vid.height; vy++)
|
||||||
|
{
|
||||||
|
INT16 xa, ya, xb, yb;
|
||||||
|
xa = x2+halfwidth;
|
||||||
|
ya = y2+halfheight;
|
||||||
|
xb = vid.width-1-xa;
|
||||||
|
yb = vid.height-1-ya;
|
||||||
|
|
||||||
|
viewmorph.ceilingclip[xa] = min(viewmorph.ceilingclip[xa], ya);
|
||||||
|
viewmorph.floorclip[xa] = max(viewmorph.floorclip[xa], ya);
|
||||||
|
viewmorph.ceilingclip[xb] = min(viewmorph.ceilingclip[xb], yb);
|
||||||
|
viewmorph.floorclip[xb] = max(viewmorph.floorclip[xb], yb);
|
||||||
|
x2 -= rollsin;
|
||||||
|
y2 += rollcos;
|
||||||
|
}
|
||||||
|
|
||||||
|
//CONS_Printf("Top left corner is %f %f\n", x1, y1);
|
||||||
|
|
||||||
|
#ifdef WOUGHMP_WOUGHMP
|
||||||
|
if (fisheye)
|
||||||
|
{
|
||||||
|
for (vy = 0; vy < halfheight; vy++)
|
||||||
|
{
|
||||||
|
x2 = x1;
|
||||||
|
y2 = y1;
|
||||||
|
x1 -= rollsin;
|
||||||
|
y1 += rollcos;
|
||||||
|
|
||||||
|
for (vx = 0; vx < vid.width; vx++)
|
||||||
|
{
|
||||||
|
usedx = halfwidth + x2*fisheyemap[(int) floorf(fabsf(y2*zoomfactor))];
|
||||||
|
usedy = halfheight + y2*fisheyemap[(int) floorf(fabsf(x2*zoomfactor))];
|
||||||
|
|
||||||
|
usedpos = usedx + usedy*vid.width;
|
||||||
|
|
||||||
|
viewmorph.scrmap[pos] = usedpos;
|
||||||
|
viewmorph.scrmap[end-pos] = end-usedpos;
|
||||||
|
|
||||||
|
x2 += rollcos;
|
||||||
|
y2 += rollsin;
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
x1 += halfwidth;
|
||||||
|
y1 += halfheight;
|
||||||
|
|
||||||
|
for (vy = 0; vy < halfheight; vy++)
|
||||||
|
{
|
||||||
|
x2 = x1;
|
||||||
|
y2 = y1;
|
||||||
|
x1 -= rollsin;
|
||||||
|
y1 += rollcos;
|
||||||
|
|
||||||
|
for (vx = 0; vx < vid.width; vx++)
|
||||||
|
{
|
||||||
|
usedx = x2;
|
||||||
|
usedy = y2;
|
||||||
|
|
||||||
|
usedpos = usedx + usedy*vid.width;
|
||||||
|
|
||||||
|
viewmorph.scrmap[pos] = usedpos;
|
||||||
|
viewmorph.scrmap[end-pos] = end-usedpos;
|
||||||
|
|
||||||
|
x2 += rollcos;
|
||||||
|
y2 += rollsin;
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifdef WOUGHMP_WOUGHMP
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
viewmorph.use = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void R_ApplyViewMorph(void)
|
||||||
|
{
|
||||||
|
UINT8 *tmpscr = screens[4];
|
||||||
|
UINT8 *srcscr = screens[0];
|
||||||
|
INT32 p, end = vid.width * vid.height;
|
||||||
|
|
||||||
|
if (!viewmorph.use)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (cv_debug & DBG_VIEWMORPH)
|
||||||
|
{
|
||||||
|
UINT8 border = 32;
|
||||||
|
UINT8 grid = 160;
|
||||||
|
INT32 ws = vid.width / 4;
|
||||||
|
INT32 hs = vid.width * (vid.height / 4);
|
||||||
|
|
||||||
|
memcpy(tmpscr, srcscr, vid.width*vid.height);
|
||||||
|
for (p = 0; p < vid.width; p++)
|
||||||
|
{
|
||||||
|
tmpscr[viewmorph.scrmap[p]] = border;
|
||||||
|
tmpscr[viewmorph.scrmap[p + hs]] = grid;
|
||||||
|
tmpscr[viewmorph.scrmap[p + hs*2]] = grid;
|
||||||
|
tmpscr[viewmorph.scrmap[p + hs*3]] = grid;
|
||||||
|
tmpscr[viewmorph.scrmap[end - 1 - p]] = border;
|
||||||
|
}
|
||||||
|
for (p = vid.width; p < end; p += vid.width)
|
||||||
|
{
|
||||||
|
tmpscr[viewmorph.scrmap[p]] = border;
|
||||||
|
tmpscr[viewmorph.scrmap[p + ws]] = grid;
|
||||||
|
tmpscr[viewmorph.scrmap[p + ws*2]] = grid;
|
||||||
|
tmpscr[viewmorph.scrmap[p + ws*3]] = grid;
|
||||||
|
tmpscr[viewmorph.scrmap[end - 1 - p]] = border;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
for (p = 0; p < end; p++)
|
||||||
|
tmpscr[p] = srcscr[viewmorph.scrmap[p]];
|
||||||
|
|
||||||
|
VID_BlitLinearScreen(tmpscr, screens[0],
|
||||||
|
vid.width*vid.bpp, vid.height, vid.width*vid.bpp, vid.width);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// R_SetViewSize
|
// R_SetViewSize
|
||||||
|
@ -595,7 +892,7 @@ void R_ExecuteSetViewSize(void)
|
||||||
centeryfrac = centery<<FRACBITS;
|
centeryfrac = centery<<FRACBITS;
|
||||||
|
|
||||||
fov = FixedAngle(cv_fov.value/2) + ANGLE_90;
|
fov = FixedAngle(cv_fov.value/2) + ANGLE_90;
|
||||||
fovtan = FINETANGENT(fov >> ANGLETOFINESHIFT);
|
fovtan = FixedMul(FINETANGENT(fov >> ANGLETOFINESHIFT), viewmorph.zoomneeded);
|
||||||
if (splitscreen == 1) // Splitscreen FOV should be adjusted to maintain expected vertical view
|
if (splitscreen == 1) // Splitscreen FOV should be adjusted to maintain expected vertical view
|
||||||
fovtan = 17*fovtan/10;
|
fovtan = 17*fovtan/10;
|
||||||
|
|
||||||
|
@ -744,7 +1041,7 @@ subsector_t *R_PointInSubsectorOrNull(fixed_t x, fixed_t y)
|
||||||
//
|
//
|
||||||
|
|
||||||
// WARNING: a should be unsigned but to add with 2048, it isn't!
|
// WARNING: a should be unsigned but to add with 2048, it isn't!
|
||||||
#define AIMINGTODY(a) FixedDiv((FINETANGENT((2048+(((INT32)a)>>ANGLETOFINESHIFT)) & FINEMASK)*160)>>FRACBITS, fovtan)
|
#define AIMINGTODY(a) ((FINETANGENT((2048+(((INT32)a)>>ANGLETOFINESHIFT)) & FINEMASK)*160)/fovtan)
|
||||||
|
|
||||||
// recalc necessary stuff for mouseaiming
|
// recalc necessary stuff for mouseaiming
|
||||||
// slopes are already calculated for the full possible view (which is 4*viewheight).
|
// slopes are already calculated for the full possible view (which is 4*viewheight).
|
||||||
|
@ -1081,9 +1378,22 @@ void R_RenderPlayerView(player_t *player)
|
||||||
validcount++;
|
validcount++;
|
||||||
|
|
||||||
// Clear buffers.
|
// Clear buffers.
|
||||||
R_ClearClipSegs();
|
|
||||||
R_ClearDrawSegs();
|
|
||||||
R_ClearPlanes();
|
R_ClearPlanes();
|
||||||
|
if (viewmorph.use)
|
||||||
|
{
|
||||||
|
portalclipstart = viewmorph.x1;
|
||||||
|
portalclipend = viewwidth-viewmorph.x1-1;
|
||||||
|
R_PortalClearClipSegs(portalclipstart, portalclipend);
|
||||||
|
memcpy(ceilingclip, viewmorph.ceilingclip, sizeof(INT16)*vid.width);
|
||||||
|
memcpy(floorclip, viewmorph.floorclip, sizeof(INT16)*vid.width);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
portalclipstart = 0;
|
||||||
|
portalclipend = viewwidth-1;
|
||||||
|
R_ClearClipSegs();
|
||||||
|
}
|
||||||
|
R_ClearDrawSegs();
|
||||||
R_ClearSprites();
|
R_ClearSprites();
|
||||||
#ifdef FLOORSPLATS
|
#ifdef FLOORSPLATS
|
||||||
R_ClearVisibleFloorSplats();
|
R_ClearVisibleFloorSplats();
|
||||||
|
|
|
@ -26,6 +26,7 @@ extern INT32 centerx, centery;
|
||||||
|
|
||||||
extern fixed_t centerxfrac, centeryfrac;
|
extern fixed_t centerxfrac, centeryfrac;
|
||||||
extern fixed_t projection, projectiony;
|
extern fixed_t projection, projectiony;
|
||||||
|
extern fixed_t fovtan; // field of view
|
||||||
|
|
||||||
extern size_t validcount, linecount, loopcount, framecount;
|
extern size_t validcount, linecount, loopcount, framecount;
|
||||||
|
|
||||||
|
@ -45,6 +46,8 @@ extern size_t validcount, linecount, loopcount, framecount;
|
||||||
#define MAXLIGHTZ 128
|
#define MAXLIGHTZ 128
|
||||||
#define LIGHTZSHIFT 20
|
#define LIGHTZSHIFT 20
|
||||||
|
|
||||||
|
#define LIGHTRESOLUTIONFIX (640*fovtan/vid.width)
|
||||||
|
|
||||||
extern lighttable_t *scalelight[LIGHTLEVELS][MAXLIGHTSCALE];
|
extern lighttable_t *scalelight[LIGHTLEVELS][MAXLIGHTSCALE];
|
||||||
extern lighttable_t *scalelightfixed[MAXLIGHTSCALE];
|
extern lighttable_t *scalelightfixed[MAXLIGHTSCALE];
|
||||||
extern lighttable_t *zlight[LIGHTLEVELS][MAXLIGHTZ];
|
extern lighttable_t *zlight[LIGHTLEVELS][MAXLIGHTZ];
|
||||||
|
@ -91,6 +94,9 @@ void R_InitHardwareMode(void);
|
||||||
#endif
|
#endif
|
||||||
void R_ReloadHUDGraphics(void);
|
void R_ReloadHUDGraphics(void);
|
||||||
|
|
||||||
|
void R_CheckViewMorph(void);
|
||||||
|
void R_ApplyViewMorph(void);
|
||||||
|
|
||||||
// just sets setsizeneeded true
|
// just sets setsizeneeded true
|
||||||
extern boolean setsizeneeded;
|
extern boolean setsizeneeded;
|
||||||
void R_SetViewSize(void);
|
void R_SetViewSize(void);
|
||||||
|
|
|
@ -1196,7 +1196,7 @@ void R_CacheRotSprite(spritenum_t sprnum, UINT8 frame, spriteinfo_t *sprinfo, sp
|
||||||
INT32 angle;
|
INT32 angle;
|
||||||
patch_t *patch;
|
patch_t *patch;
|
||||||
patch_t *newpatch;
|
patch_t *newpatch;
|
||||||
UINT16 *rawsrc, *rawdst;
|
UINT16 *rawdst;
|
||||||
size_t size;
|
size_t size;
|
||||||
INT32 bflip = (flip != 0x00);
|
INT32 bflip = (flip != 0x00);
|
||||||
|
|
||||||
|
@ -1212,14 +1212,25 @@ void R_CacheRotSprite(spritenum_t sprnum, UINT8 frame, spriteinfo_t *sprinfo, sp
|
||||||
INT32 width, height, leftoffset;
|
INT32 width, height, leftoffset;
|
||||||
fixed_t ca, sa;
|
fixed_t ca, sa;
|
||||||
lumpnum_t lump = sprframe->lumppat[rot];
|
lumpnum_t lump = sprframe->lumppat[rot];
|
||||||
|
#ifndef NO_PNG_LUMPS
|
||||||
|
size_t lumplength;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (lump == LUMPERROR)
|
if (lump == LUMPERROR)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
patch = (patch_t *)W_CacheLumpNum(lump, PU_STATIC);
|
||||||
|
#ifndef NO_PNG_LUMPS
|
||||||
|
lumplength = W_LumpLength(lump);
|
||||||
|
|
||||||
|
if (R_IsLumpPNG((UINT8 *)patch, lumplength))
|
||||||
|
patch = R_PNGToPatch((UINT8 *)patch, lumplength, NULL);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
// Because there's something wrong with SPR_DFLM, I guess
|
// Because there's something wrong with SPR_DFLM, I guess
|
||||||
if (!R_CheckIfPatch(lump))
|
if (!R_CheckIfPatch(lump))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
patch = (patch_t *)W_CacheLumpNum(lump, PU_STATIC);
|
|
||||||
width = patch->width;
|
width = patch->width;
|
||||||
height = patch->height;
|
height = patch->height;
|
||||||
leftoffset = patch->leftoffset;
|
leftoffset = patch->leftoffset;
|
||||||
|
@ -1242,16 +1253,6 @@ void R_CacheRotSprite(spritenum_t sprnum, UINT8 frame, spriteinfo_t *sprinfo, sp
|
||||||
leftoffset = width - leftoffset;
|
leftoffset = width - leftoffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw the sprite to a temporary buffer.
|
|
||||||
size = (width*height);
|
|
||||||
rawsrc = Z_Malloc(size * sizeof(UINT16), PU_STATIC, NULL);
|
|
||||||
|
|
||||||
// can't memset here
|
|
||||||
for (i = 0; i < size; i++)
|
|
||||||
rawsrc[i] = 0xFF00;
|
|
||||||
|
|
||||||
R_PatchToMaskedFlat(patch, rawsrc, bflip);
|
|
||||||
|
|
||||||
// Don't cache angle = 0
|
// Don't cache angle = 0
|
||||||
for (angle = 1; angle < ROTANGLES; angle++)
|
for (angle = 1; angle < ROTANGLES; angle++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -44,9 +44,6 @@
|
||||||
// Quincunx antialiasing of flats!
|
// Quincunx antialiasing of flats!
|
||||||
//#define QUINCUNX
|
//#define QUINCUNX
|
||||||
|
|
||||||
// good night sweet prince
|
|
||||||
#define SHITPLANESPARENCY
|
|
||||||
|
|
||||||
//SoM: 3/23/2000: Use Boom visplane hashing.
|
//SoM: 3/23/2000: Use Boom visplane hashing.
|
||||||
|
|
||||||
visplane_t *visplanes[MAXVISPLANES];
|
visplane_t *visplanes[MAXVISPLANES];
|
||||||
|
@ -995,11 +992,7 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
else // Opaque, but allow transparent flat pixels
|
else // Opaque, but allow transparent flat pixels
|
||||||
spanfunctype = SPANDRAWFUNC_SPLAT;
|
spanfunctype = SPANDRAWFUNC_SPLAT;
|
||||||
|
|
||||||
#ifdef SHITPLANESPARENCY
|
if ((spanfunctype == SPANDRAWFUNC_SPLAT) || (pl->extra_colormap && (pl->extra_colormap->flags & CMF_FOG)))
|
||||||
if ((spanfunctype == SPANDRAWFUNC_SPLAT) != (pl->extra_colormap && (pl->extra_colormap->fog & 4)))
|
|
||||||
#else
|
|
||||||
if (!pl->extra_colormap || !(pl->extra_colormap->fog & 2))
|
|
||||||
#endif
|
|
||||||
light = (pl->lightlevel >> LIGHTSEGSHIFT);
|
light = (pl->lightlevel >> LIGHTSEGSHIFT);
|
||||||
else
|
else
|
||||||
light = LIGHTLEVELS-1;
|
light = LIGHTLEVELS-1;
|
||||||
|
@ -1053,11 +1046,7 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
else // Opaque, but allow transparent flat pixels
|
else // Opaque, but allow transparent flat pixels
|
||||||
spanfunctype = SPANDRAWFUNC_SPLAT;
|
spanfunctype = SPANDRAWFUNC_SPLAT;
|
||||||
|
|
||||||
#ifdef SHITPLANESPARENCY
|
if ((spanfunctype == SPANDRAWFUNC_SPLAT) || (pl->extra_colormap && (pl->extra_colormap->flags & CMF_FOG)))
|
||||||
if ((spanfunctype == SPANDRAWFUNC_SPLAT) != (pl->extra_colormap && (pl->extra_colormap->fog & 4)))
|
|
||||||
#else
|
|
||||||
if (!pl->extra_colormap || !(pl->extra_colormap->fog & 2))
|
|
||||||
#endif
|
|
||||||
light = (pl->lightlevel >> LIGHTSEGSHIFT);
|
light = (pl->lightlevel >> LIGHTSEGSHIFT);
|
||||||
else
|
else
|
||||||
light = LIGHTLEVELS-1;
|
light = LIGHTLEVELS-1;
|
||||||
|
|
40
src/r_segs.c
40
src/r_segs.c
|
@ -199,7 +199,7 @@ static void R_DrawWallSplats(void)
|
||||||
// draw the columns
|
// draw the columns
|
||||||
for (dc_x = x1; dc_x <= x2; dc_x++, spryscale += rw_scalestep)
|
for (dc_x = x1; dc_x <= x2; dc_x++, spryscale += rw_scalestep)
|
||||||
{
|
{
|
||||||
pindex = FixedMul(spryscale, FixedDiv(640, vid.width))>>LIGHTSCALESHIFT;
|
pindex = FixedMul(spryscale, LIGHTRESOLUTIONFIX)>>LIGHTSCALESHIFT;
|
||||||
if (pindex >= MAXLIGHTSCALE)
|
if (pindex >= MAXLIGHTSCALE)
|
||||||
pindex = MAXLIGHTSCALE - 1;
|
pindex = MAXLIGHTSCALE - 1;
|
||||||
dc_colormap = walllights[pindex];
|
dc_colormap = walllights[pindex];
|
||||||
|
@ -418,14 +418,14 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
rlight->extra_colormap = *light->extra_colormap;
|
rlight->extra_colormap = *light->extra_colormap;
|
||||||
rlight->flags = light->flags;
|
rlight->flags = light->flags;
|
||||||
|
|
||||||
if (rlight->flags & FF_FOG || (rlight->extra_colormap && rlight->extra_colormap->fog))
|
if ((colfunc != colfuncs[COLDRAWFUNC_FUZZY])
|
||||||
|
|| (rlight->flags & FF_FOG)
|
||||||
|
|| (rlight->extra_colormap && (rlight->extra_colormap->flags & CMF_FOG)))
|
||||||
lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT);
|
||||||
else if (colfunc == colfuncs[COLDRAWFUNC_FUZZY])
|
|
||||||
lightnum = LIGHTLEVELS - 1;
|
|
||||||
else
|
else
|
||||||
lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = LIGHTLEVELS - 1;
|
||||||
|
|
||||||
if (rlight->extra_colormap && rlight->extra_colormap->fog)
|
if (rlight->extra_colormap && (rlight->extra_colormap->flags & CMF_FOG))
|
||||||
;
|
;
|
||||||
else if (curline->v1->y == curline->v2->y)
|
else if (curline->v1->y == curline->v2->y)
|
||||||
lightnum--;
|
lightnum--;
|
||||||
|
@ -437,18 +437,14 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (colfunc == colfuncs[COLDRAWFUNC_FUZZY])
|
if ((colfunc != colfuncs[COLDRAWFUNC_FUZZY])
|
||||||
{
|
|| (frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG)))
|
||||||
if (frontsector->extra_colormap && frontsector->extra_colormap->fog)
|
|
||||||
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
|
||||||
else
|
else
|
||||||
lightnum = LIGHTLEVELS - 1;
|
lightnum = LIGHTLEVELS - 1;
|
||||||
}
|
|
||||||
else
|
|
||||||
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
|
|
||||||
|
|
||||||
if (colfunc == colfuncs[COLDRAWFUNC_FOG]
|
if (colfunc == colfuncs[COLDRAWFUNC_FOG]
|
||||||
|| (frontsector->extra_colormap && frontsector->extra_colormap->fog))
|
|| (frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG)))
|
||||||
;
|
;
|
||||||
else if (curline->v1->y == curline->v2->y)
|
else if (curline->v1->y == curline->v2->y)
|
||||||
lightnum--;
|
lightnum--;
|
||||||
|
@ -599,7 +595,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
else
|
else
|
||||||
xwalllights = scalelight[rlight->lightnum];
|
xwalllights = scalelight[rlight->lightnum];
|
||||||
|
|
||||||
pindex = FixedMul(spryscale, FixedDiv(640, vid.width))>>LIGHTSCALESHIFT;
|
pindex = FixedMul(spryscale, LIGHTRESOLUTIONFIX)>>LIGHTSCALESHIFT;
|
||||||
|
|
||||||
if (pindex >= MAXLIGHTSCALE)
|
if (pindex >= MAXLIGHTSCALE)
|
||||||
pindex = MAXLIGHTSCALE - 1;
|
pindex = MAXLIGHTSCALE - 1;
|
||||||
|
@ -644,7 +640,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate lighting
|
// calculate lighting
|
||||||
pindex = FixedMul(spryscale, FixedDiv(640, vid.width))>>LIGHTSCALESHIFT;
|
pindex = FixedMul(spryscale, LIGHTRESOLUTIONFIX)>>LIGHTSCALESHIFT;
|
||||||
|
|
||||||
if (pindex >= MAXLIGHTSCALE)
|
if (pindex >= MAXLIGHTSCALE)
|
||||||
pindex = MAXLIGHTSCALE - 1;
|
pindex = MAXLIGHTSCALE - 1;
|
||||||
|
@ -947,7 +943,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
else
|
else
|
||||||
rlight->lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT);
|
rlight->lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT);
|
||||||
|
|
||||||
if (pfloor->flags & FF_FOG || rlight->flags & FF_FOG || (rlight->extra_colormap && rlight->extra_colormap->fog))
|
if (pfloor->flags & FF_FOG || rlight->flags & FF_FOG || (rlight->extra_colormap && (rlight->extra_colormap->flags & CMF_FOG)))
|
||||||
;
|
;
|
||||||
else if (curline->v1->y == curline->v2->y)
|
else if (curline->v1->y == curline->v2->y)
|
||||||
rlight->lightnum--;
|
rlight->lightnum--;
|
||||||
|
@ -962,7 +958,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Get correct light level!
|
// Get correct light level!
|
||||||
if ((frontsector->extra_colormap && frontsector->extra_colormap->fog))
|
if ((frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG)))
|
||||||
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
|
||||||
else if (pfloor->flags & FF_FOG)
|
else if (pfloor->flags & FF_FOG)
|
||||||
lightnum = (pfloor->master->frontsector->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = (pfloor->master->frontsector->lightlevel >> LIGHTSEGSHIFT);
|
||||||
|
@ -972,7 +968,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
lightnum = R_FakeFlat(frontsector, &tempsec, &templight, &templight, false)
|
lightnum = R_FakeFlat(frontsector, &tempsec, &templight, &templight, false)
|
||||||
->lightlevel >> LIGHTSEGSHIFT;
|
->lightlevel >> LIGHTSEGSHIFT;
|
||||||
|
|
||||||
if (pfloor->flags & FF_FOG || (frontsector->extra_colormap && frontsector->extra_colormap->fog));
|
if (pfloor->flags & FF_FOG || (frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG)));
|
||||||
else if (curline->v1->y == curline->v2->y)
|
else if (curline->v1->y == curline->v2->y)
|
||||||
lightnum--;
|
lightnum--;
|
||||||
else if (curline->v1->x == curline->v2->x)
|
else if (curline->v1->x == curline->v2->x)
|
||||||
|
@ -1188,7 +1184,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
else
|
else
|
||||||
xwalllights = scalelight[lightnum];
|
xwalllights = scalelight[lightnum];
|
||||||
|
|
||||||
pindex = FixedMul(spryscale, FixedDiv(640, vid.width))>>LIGHTSCALESHIFT;
|
pindex = FixedMul(spryscale, LIGHTRESOLUTIONFIX)>>LIGHTSCALESHIFT;
|
||||||
|
|
||||||
if (pindex >= MAXLIGHTSCALE)
|
if (pindex >= MAXLIGHTSCALE)
|
||||||
pindex = MAXLIGHTSCALE-1;
|
pindex = MAXLIGHTSCALE-1;
|
||||||
|
@ -1281,7 +1277,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate lighting
|
// calculate lighting
|
||||||
pindex = FixedMul(spryscale, FixedDiv(640, vid.width))>>LIGHTSCALESHIFT;
|
pindex = FixedMul(spryscale, LIGHTRESOLUTIONFIX)>>LIGHTSCALESHIFT;
|
||||||
|
|
||||||
if (pindex >= MAXLIGHTSCALE)
|
if (pindex >= MAXLIGHTSCALE)
|
||||||
pindex = MAXLIGHTSCALE - 1;
|
pindex = MAXLIGHTSCALE - 1;
|
||||||
|
@ -1486,7 +1482,7 @@ static void R_RenderSegLoop (void)
|
||||||
if (segtextured)
|
if (segtextured)
|
||||||
{
|
{
|
||||||
// calculate lighting
|
// calculate lighting
|
||||||
pindex = FixedMul(rw_scale, FixedDiv(640, vid.width))>>LIGHTSCALESHIFT;
|
pindex = FixedMul(rw_scale, LIGHTRESOLUTIONFIX)>>LIGHTSCALESHIFT;
|
||||||
|
|
||||||
if (pindex >= MAXLIGHTSCALE)
|
if (pindex >= MAXLIGHTSCALE)
|
||||||
pindex = MAXLIGHTSCALE-1;
|
pindex = MAXLIGHTSCALE-1;
|
||||||
|
@ -1521,7 +1517,7 @@ static void R_RenderSegLoop (void)
|
||||||
else
|
else
|
||||||
xwalllights = scalelight[lightnum];
|
xwalllights = scalelight[lightnum];
|
||||||
|
|
||||||
pindex = FixedMul(rw_scale, FixedDiv(640, vid.width))>>LIGHTSCALESHIFT;
|
pindex = FixedMul(rw_scale, LIGHTRESOLUTIONFIX)>>LIGHTSCALESHIFT;
|
||||||
|
|
||||||
if (pindex >= MAXLIGHTSCALE)
|
if (pindex >= MAXLIGHTSCALE)
|
||||||
pindex = MAXLIGHTSCALE-1;
|
pindex = MAXLIGHTSCALE-1;
|
||||||
|
|
|
@ -76,5 +76,5 @@ void R_SetupSkyDraw(void)
|
||||||
void R_SetSkyScale(void)
|
void R_SetSkyScale(void)
|
||||||
{
|
{
|
||||||
fixed_t difference = vid.fdupx-(vid.dupx<<FRACBITS);
|
fixed_t difference = vid.fdupx-(vid.dupx<<FRACBITS);
|
||||||
skyscale = FixedDiv(FRACUNIT, vid.fdupx+difference);
|
skyscale = FixedDiv(fovtan, vid.fdupx+difference);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1094,10 +1094,10 @@ static void R_SplitSprite(vissprite_t *sprite)
|
||||||
|
|
||||||
newsprite->extra_colormap = *sector->lightlist[i].extra_colormap;
|
newsprite->extra_colormap = *sector->lightlist[i].extra_colormap;
|
||||||
|
|
||||||
if (!((newsprite->cut & SC_FULLBRIGHT)
|
if (!(newsprite->cut & SC_FULLBRIGHT)
|
||||||
&& (!newsprite->extra_colormap || !(newsprite->extra_colormap->fog & 1))))
|
|| (newsprite->extra_colormap && (newsprite->extra_colormap->flags & CMF_FADEFULLBRIGHTSPRITES)))
|
||||||
{
|
{
|
||||||
lindex = FixedMul(sprite->xscale, FixedDiv(640, vid.width))>>(LIGHTSCALESHIFT);
|
lindex = FixedMul(sprite->xscale, LIGHTRESOLUTIONFIX)>>(LIGHTSCALESHIFT);
|
||||||
|
|
||||||
if (lindex >= MAXLIGHTSCALE)
|
if (lindex >= MAXLIGHTSCALE)
|
||||||
lindex = MAXLIGHTSCALE-1;
|
lindex = MAXLIGHTSCALE-1;
|
||||||
|
@ -1307,17 +1307,8 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale,
|
||||||
|
|
||||||
shadow->mobj = thing; // Easy access! Tails 06-07-2002
|
shadow->mobj = thing; // Easy access! Tails 06-07-2002
|
||||||
|
|
||||||
shadow->x1 = x1 < 0 ? 0 : x1;
|
shadow->x1 = x1 < portalclipstart ? portalclipstart : x1;
|
||||||
shadow->x2 = x2 >= viewwidth ? viewwidth-1 : x2;
|
shadow->x2 = x2 >= portalclipend ? portalclipend-1 : x2;
|
||||||
|
|
||||||
// PORTAL SEMI-CLIPPING
|
|
||||||
if (portalrender)
|
|
||||||
{
|
|
||||||
if (shadow->x1 < portalclipstart)
|
|
||||||
shadow->x1 = portalclipstart;
|
|
||||||
if (shadow->x2 >= portalclipend)
|
|
||||||
shadow->x2 = portalclipend-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
shadow->xscale = FixedMul(xscale, shadowxscale); //SoM: 4/17/2000
|
shadow->xscale = FixedMul(xscale, shadowxscale); //SoM: 4/17/2000
|
||||||
shadow->scale = FixedMul(yscale, shadowyscale);
|
shadow->scale = FixedMul(yscale, shadowyscale);
|
||||||
|
@ -1815,17 +1806,8 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
|
|
||||||
vis->mobj = thing; // Easy access! Tails 06-07-2002
|
vis->mobj = thing; // Easy access! Tails 06-07-2002
|
||||||
|
|
||||||
vis->x1 = x1 < 0 ? 0 : x1;
|
vis->x1 = x1 < portalclipstart ? portalclipstart : x1;
|
||||||
vis->x2 = x2 >= viewwidth ? viewwidth-1 : x2;
|
vis->x2 = x2 >= portalclipend ? portalclipend-1 : x2;
|
||||||
|
|
||||||
// PORTAL SEMI-CLIPPING
|
|
||||||
if (portalrender)
|
|
||||||
{
|
|
||||||
if (vis->x1 < portalclipstart)
|
|
||||||
vis->x1 = portalclipstart;
|
|
||||||
if (vis->x2 >= portalclipend)
|
|
||||||
vis->x2 = portalclipend-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
vis->xscale = xscale; //SoM: 4/17/2000
|
vis->xscale = xscale; //SoM: 4/17/2000
|
||||||
vis->sector = thing->subsector->sector;
|
vis->sector = thing->subsector->sector;
|
||||||
|
@ -1882,7 +1864,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
vis->cut |= SC_FULLBRIGHT;
|
vis->cut |= SC_FULLBRIGHT;
|
||||||
|
|
||||||
if (vis->cut & SC_FULLBRIGHT
|
if (vis->cut & SC_FULLBRIGHT
|
||||||
&& (!vis->extra_colormap || !(vis->extra_colormap->fog & 1)))
|
&& (!vis->extra_colormap || !(vis->extra_colormap->flags & CMF_FADEFULLBRIGHTSPRITES)))
|
||||||
{
|
{
|
||||||
// full bright: goggles
|
// full bright: goggles
|
||||||
vis->colormap = colormaps;
|
vis->colormap = colormaps;
|
||||||
|
@ -1890,7 +1872,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// diminished light
|
// diminished light
|
||||||
lindex = FixedMul(xscale, FixedDiv(640, vid.width))>>(LIGHTSCALESHIFT);
|
lindex = FixedMul(xscale, LIGHTRESOLUTIONFIX)>>(LIGHTSCALESHIFT);
|
||||||
|
|
||||||
if (lindex >= MAXLIGHTSCALE)
|
if (lindex >= MAXLIGHTSCALE)
|
||||||
lindex = MAXLIGHTSCALE-1;
|
lindex = MAXLIGHTSCALE-1;
|
||||||
|
@ -2034,17 +2016,8 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing)
|
||||||
vis->shear.tan = 0;
|
vis->shear.tan = 0;
|
||||||
vis->shear.offset = 0;
|
vis->shear.offset = 0;
|
||||||
|
|
||||||
vis->x1 = x1 < 0 ? 0 : x1;
|
vis->x1 = x1 < portalclipstart ? portalclipstart : x1;
|
||||||
vis->x2 = x2 >= viewwidth ? viewwidth-1 : x2;
|
vis->x2 = x2 >= portalclipend ? portalclipend-1 : x2;
|
||||||
|
|
||||||
// PORTAL SEMI-CLIPPING
|
|
||||||
if (portalrender)
|
|
||||||
{
|
|
||||||
if (vis->x1 < portalclipstart)
|
|
||||||
vis->x1 = portalclipstart;
|
|
||||||
if (vis->x2 >= portalclipend)
|
|
||||||
vis->x2 = portalclipend-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
vis->xscale = xscale; //SoM: 4/17/2000
|
vis->xscale = xscale; //SoM: 4/17/2000
|
||||||
vis->sector = thing->subsector->sector;
|
vis->sector = thing->subsector->sector;
|
||||||
|
@ -3463,6 +3436,7 @@ static boolean R_ProcessPatchableFields(skin_t *skin, char *stoken, char *value)
|
||||||
GETFLAG(DASHMODE)
|
GETFLAG(DASHMODE)
|
||||||
GETFLAG(FASTEDGE)
|
GETFLAG(FASTEDGE)
|
||||||
GETFLAG(MULTIABILITY)
|
GETFLAG(MULTIABILITY)
|
||||||
|
GETFLAG(NONIGHTSROTATION)
|
||||||
#undef GETFLAG
|
#undef GETFLAG
|
||||||
|
|
||||||
else // let's check if it's a sound, otherwise error out
|
else // let's check if it's a sound, otherwise error out
|
||||||
|
|
|
@ -360,10 +360,13 @@ void SCR_Recalc(void)
|
||||||
vid.fsmalldupy = vid.smalldupy*FRACUNIT;
|
vid.fsmalldupy = vid.smalldupy*FRACUNIT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// toggle off automap because some screensize-dependent values will
|
// toggle off (then back on) the automap because some screensize-dependent values will
|
||||||
// be calculated next time the automap is activated.
|
// be calculated next time the automap is activated.
|
||||||
if (automapactive)
|
if (automapactive)
|
||||||
AM_Stop();
|
{
|
||||||
|
am_recalc = true;
|
||||||
|
AM_Start();
|
||||||
|
}
|
||||||
|
|
||||||
// set the screen[x] ptrs on the new vidbuffers
|
// set the screen[x] ptrs on the new vidbuffers
|
||||||
V_Init();
|
V_Init();
|
||||||
|
|
|
@ -1499,7 +1499,6 @@ void VID_CheckRenderer(void)
|
||||||
{
|
{
|
||||||
I_StartupHardwareGraphics();
|
I_StartupHardwareGraphics();
|
||||||
R_InitHardwareMode();
|
R_InitHardwareMode();
|
||||||
HWR_Switch();
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -1219,7 +1219,7 @@
|
||||||
C01FCF4B08A954540054247B /* Debug */ = {
|
C01FCF4B08A954540054247B /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CURRENT_PROJECT_VERSION = 2.2.0;
|
CURRENT_PROJECT_VERSION = 2.2.1;
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
NORMALSRB2,
|
NORMALSRB2,
|
||||||
|
@ -1231,7 +1231,7 @@
|
||||||
C01FCF4C08A954540054247B /* Release */ = {
|
C01FCF4C08A954540054247B /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CURRENT_PROJECT_VERSION = 2.2.0;
|
CURRENT_PROJECT_VERSION = 2.2.1;
|
||||||
GCC_ENABLE_FIX_AND_CONTINUE = NO;
|
GCC_ENABLE_FIX_AND_CONTINUE = NO;
|
||||||
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
|
|
@ -128,6 +128,7 @@ static patch_t *minus5sec;
|
||||||
static patch_t *minicaps;
|
static patch_t *minicaps;
|
||||||
static patch_t *gotrflag;
|
static patch_t *gotrflag;
|
||||||
static patch_t *gotbflag;
|
static patch_t *gotbflag;
|
||||||
|
static patch_t *fnshico;
|
||||||
|
|
||||||
static boolean facefreed[MAXPLAYERS];
|
static boolean facefreed[MAXPLAYERS];
|
||||||
|
|
||||||
|
@ -310,6 +311,7 @@ void ST_LoadGraphics(void)
|
||||||
bmatcico = W_CachePatchName("BMATCICO", PU_HUDGFX);
|
bmatcico = W_CachePatchName("BMATCICO", PU_HUDGFX);
|
||||||
gotrflag = W_CachePatchName("GOTRFLAG", PU_HUDGFX);
|
gotrflag = W_CachePatchName("GOTRFLAG", PU_HUDGFX);
|
||||||
gotbflag = W_CachePatchName("GOTBFLAG", PU_HUDGFX);
|
gotbflag = W_CachePatchName("GOTBFLAG", PU_HUDGFX);
|
||||||
|
fnshico = W_CachePatchName("FNSHICO", PU_HUDGFX);
|
||||||
nonicon = W_CachePatchName("NONICON", PU_HUDGFX);
|
nonicon = W_CachePatchName("NONICON", PU_HUDGFX);
|
||||||
nonicon2 = W_CachePatchName("NONICON2", PU_HUDGFX);
|
nonicon2 = W_CachePatchName("NONICON2", PU_HUDGFX);
|
||||||
|
|
||||||
|
@ -944,7 +946,7 @@ static void ST_drawLivesArea(void)
|
||||||
'\x16' | 0x80 | hudinfo[HUD_LIVES].f|V_PERPLAYER|V_HUDTRANS, false);
|
'\x16' | 0x80 | hudinfo[HUD_LIVES].f|V_PERPLAYER|V_HUDTRANS, false);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (stplyr->playerstate == PST_DEAD && !(stplyr->spectator) && (livescount || stplyr->deadtimer < (TICRATE<<1)))
|
if (stplyr->playerstate == PST_DEAD && !(stplyr->spectator) && (livescount || stplyr->deadtimer < (TICRATE<<1)) && !(stplyr->pflags & PF_FINISHED))
|
||||||
livescount++;
|
livescount++;
|
||||||
if (livescount > 99)
|
if (livescount > 99)
|
||||||
livescount = 99;
|
livescount = 99;
|
||||||
|
@ -1434,7 +1436,7 @@ static void ST_drawPowerupHUD(void)
|
||||||
UINT16 invulntime = 0;
|
UINT16 invulntime = 0;
|
||||||
INT32 offs = hudinfo[HUD_POWERUPS].x;
|
INT32 offs = hudinfo[HUD_POWERUPS].x;
|
||||||
const UINT8 q = ((splitscreen && stplyr == &players[secondarydisplayplayer]) ? 1 : 0);
|
const UINT8 q = ((splitscreen && stplyr == &players[secondarydisplayplayer]) ? 1 : 0);
|
||||||
static INT32 flagoffs[2] = {0, 0}, shieldoffs[2] = {0, 0};
|
static INT32 flagoffs[2] = {0, 0}, shieldoffs[2] = {0, 0}, finishoffs[2] = {0, 0};
|
||||||
#define ICONSEP (16+4) // matches weapon rings HUD
|
#define ICONSEP (16+4) // matches weapon rings HUD
|
||||||
|
|
||||||
if (F_GetPromptHideHud(hudinfo[HUD_POWERUPS].y))
|
if (F_GetPromptHideHud(hudinfo[HUD_POWERUPS].y))
|
||||||
|
@ -1443,6 +1445,26 @@ static void ST_drawPowerupHUD(void)
|
||||||
if (stplyr->spectator || stplyr->playerstate != PST_LIVE)
|
if (stplyr->spectator || stplyr->playerstate != PST_LIVE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// ---------
|
||||||
|
// Finish icon
|
||||||
|
// ---------
|
||||||
|
|
||||||
|
// Let's have a power-like icon to represent finishing the level!
|
||||||
|
if (stplyr->pflags & PF_FINISHED && cv_exitmove.value)
|
||||||
|
{
|
||||||
|
finishoffs[q] = ICONSEP;
|
||||||
|
V_DrawSmallScaledPatch(offs, hudinfo[HUD_POWERUPS].y, V_PERPLAYER|hudinfo[HUD_POWERUPS].f|V_HUDTRANS, fnshico);
|
||||||
|
}
|
||||||
|
else if (finishoffs[q])
|
||||||
|
{
|
||||||
|
if (finishoffs[q] > 1)
|
||||||
|
finishoffs[q] = 2*finishoffs[q]/3;
|
||||||
|
else
|
||||||
|
finishoffs[q] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
offs -= finishoffs[q];
|
||||||
|
|
||||||
// -------
|
// -------
|
||||||
// Shields
|
// Shields
|
||||||
// -------
|
// -------
|
||||||
|
@ -2625,7 +2647,7 @@ static void ST_overlayDrawer(void)
|
||||||
// Check for a valid level title
|
// Check for a valid level title
|
||||||
// If the HUD is enabled
|
// If the HUD is enabled
|
||||||
// And, if Lua is running, if the HUD library has the stage title enabled
|
// And, if Lua is running, if the HUD library has the stage title enabled
|
||||||
if (!(mapheaderinfo[gamemap-1]->levelflags & LF_NOTITLECARD) && *mapheaderinfo[gamemap-1]->lvlttl != '\0' && !(hu_showscores && (netgame || multiplayer)))
|
if (G_IsTitleCardAvailable() && *mapheaderinfo[gamemap-1]->lvlttl != '\0' && !(hu_showscores && (netgame || multiplayer)))
|
||||||
{
|
{
|
||||||
stagetitle = true;
|
stagetitle = true;
|
||||||
ST_preDrawTitleCard();
|
ST_preDrawTitleCard();
|
||||||
|
|
405
src/v_video.c
405
src/v_video.c
|
@ -2299,6 +2299,13 @@ void V_DrawSmallString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void V_DrawCenteredSmallString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
x -= V_SmallStringWidth(string, option)/2;
|
||||||
|
V_DrawSmallString(x, y, option, string);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void V_DrawRightAlignedSmallString(INT32 x, INT32 y, INT32 option, const char *string)
|
void V_DrawRightAlignedSmallString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||||
{
|
{
|
||||||
x -= V_SmallStringWidth(string, option);
|
x -= V_SmallStringWidth(string, option);
|
||||||
|
@ -2404,12 +2411,44 @@ void V_DrawThinString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void V_DrawCenteredThinString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
x -= V_ThinStringWidth(string, option)/2;
|
||||||
|
V_DrawThinString(x, y, option, string);
|
||||||
|
}
|
||||||
|
|
||||||
void V_DrawRightAlignedThinString(INT32 x, INT32 y, INT32 option, const char *string)
|
void V_DrawRightAlignedThinString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||||
{
|
{
|
||||||
x -= V_ThinStringWidth(string, option);
|
x -= V_ThinStringWidth(string, option);
|
||||||
V_DrawThinString(x, y, option, string);
|
V_DrawThinString(x, y, option, string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Write a string using the tny_font, 0.5x scale
|
||||||
|
// NOTE: the text is centered for screens larger than the base width
|
||||||
|
//
|
||||||
|
// Literally a wrapper. ~Golden
|
||||||
|
void V_DrawSmallThinString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
x <<= FRACBITS;
|
||||||
|
y <<= FRACBITS;
|
||||||
|
V_DrawSmallThinStringAtFixed((fixed_t)x, (fixed_t)y, option, string);
|
||||||
|
}
|
||||||
|
|
||||||
|
void V_DrawCenteredSmallThinString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
x <<= FRACBITS;
|
||||||
|
y <<= FRACBITS;
|
||||||
|
V_DrawCenteredSmallThinStringAtFixed((fixed_t)x, (fixed_t)y, option, string);
|
||||||
|
}
|
||||||
|
|
||||||
|
void V_DrawRightAlignedSmallThinString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
x <<= FRACBITS;
|
||||||
|
y <<= FRACBITS;
|
||||||
|
V_DrawRightAlignedSmallThinStringAtFixed((fixed_t)x, (fixed_t)y, option, string);
|
||||||
|
}
|
||||||
|
|
||||||
// Draws a string at a fixed_t location.
|
// Draws a string at a fixed_t location.
|
||||||
void V_DrawStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
|
void V_DrawStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
|
||||||
{
|
{
|
||||||
|
@ -2511,6 +2550,360 @@ void V_DrawStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void V_DrawCenteredStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
x -= (V_StringWidth(string, option) / 2)<<FRACBITS;
|
||||||
|
V_DrawStringAtFixed(x, y, option, string);
|
||||||
|
}
|
||||||
|
|
||||||
|
void V_DrawRightAlignedStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
x -= V_StringWidth(string, option)<<FRACBITS;
|
||||||
|
V_DrawStringAtFixed(x, y, option, string);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draws a small string at a fixed_t location.
|
||||||
|
void V_DrawSmallStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
fixed_t cx = x, cy = y;
|
||||||
|
INT32 w, c, dupx, dupy, scrwidth, center = 0, left = 0;
|
||||||
|
const char *ch = string;
|
||||||
|
INT32 charflags = 0;
|
||||||
|
const UINT8 *colormap = NULL;
|
||||||
|
INT32 spacewidth = 2, charwidth = 0;
|
||||||
|
|
||||||
|
INT32 lowercase = (option & V_ALLOWLOWERCASE);
|
||||||
|
option &= ~V_FLIP; // which is also shared with V_ALLOWLOWERCASE...
|
||||||
|
|
||||||
|
if (option & V_NOSCALESTART)
|
||||||
|
{
|
||||||
|
dupx = vid.dupx;
|
||||||
|
dupy = vid.dupy;
|
||||||
|
scrwidth = vid.width;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dupx = dupy = 1;
|
||||||
|
scrwidth = vid.width/vid.dupx;
|
||||||
|
left = (scrwidth - BASEVIDWIDTH)/2;
|
||||||
|
scrwidth -= left;
|
||||||
|
}
|
||||||
|
|
||||||
|
charflags = (option & V_CHARCOLORMASK);
|
||||||
|
|
||||||
|
switch (option & V_SPACINGMASK)
|
||||||
|
{
|
||||||
|
case V_MONOSPACE:
|
||||||
|
spacewidth = 4;
|
||||||
|
/* FALLTHRU */
|
||||||
|
case V_OLDSPACING:
|
||||||
|
charwidth = 4;
|
||||||
|
break;
|
||||||
|
case V_6WIDTHSPACE:
|
||||||
|
spacewidth = 3;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;ch++)
|
||||||
|
{
|
||||||
|
if (!*ch)
|
||||||
|
break;
|
||||||
|
if (*ch & 0x80) //color parsing -x 2.16.09
|
||||||
|
{
|
||||||
|
// manually set flags override color codes
|
||||||
|
if (!(option & V_CHARCOLORMASK))
|
||||||
|
charflags = ((*ch & 0x7f) << V_CHARCOLORSHIFT) & V_CHARCOLORMASK;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (*ch == '\n')
|
||||||
|
{
|
||||||
|
cx = x;
|
||||||
|
|
||||||
|
if (option & V_RETURN8)
|
||||||
|
cy += (4*dupy)<<FRACBITS;
|
||||||
|
else
|
||||||
|
cy += (6*dupy)<<FRACBITS;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
c = *ch;
|
||||||
|
if (!lowercase)
|
||||||
|
c = toupper(c);
|
||||||
|
c -= HU_FONTSTART;
|
||||||
|
|
||||||
|
// character does not exist or is a space
|
||||||
|
if (c < 0 || c >= HU_FONTSIZE || !hu_font[c])
|
||||||
|
{
|
||||||
|
cx += (spacewidth * dupx)<<FRACBITS;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (charwidth)
|
||||||
|
{
|
||||||
|
w = charwidth * dupx;
|
||||||
|
center = w/2 - SHORT(hu_font[c]->width)*(dupx/4);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
w = SHORT(hu_font[c]->width) * dupx / 2;
|
||||||
|
|
||||||
|
if ((cx>>FRACBITS) > scrwidth)
|
||||||
|
break;
|
||||||
|
if ((cx>>FRACBITS)+left + w < 0) //left boundary check
|
||||||
|
{
|
||||||
|
cx += w<<FRACBITS;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
colormap = V_GetStringColormap(charflags);
|
||||||
|
|
||||||
|
V_DrawFixedPatch(cx + (center<<FRACBITS), cy, FRACUNIT/2, option, hu_font[c], colormap);
|
||||||
|
|
||||||
|
cx += w<<FRACBITS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void V_DrawCenteredSmallStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
x -= (V_SmallStringWidth(string, option) / 2)<<FRACBITS;
|
||||||
|
V_DrawSmallStringAtFixed(x, y, option, string);
|
||||||
|
}
|
||||||
|
|
||||||
|
void V_DrawRightAlignedSmallStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
x -= V_SmallStringWidth(string, option)<<FRACBITS;
|
||||||
|
V_DrawSmallStringAtFixed(x, y, option, string);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draws a thin string at a fixed_t location.
|
||||||
|
void V_DrawThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
fixed_t cx = x, cy = y;
|
||||||
|
INT32 w, c, dupx, dupy, scrwidth, center = 0, left = 0;
|
||||||
|
const char *ch = string;
|
||||||
|
INT32 charflags = 0;
|
||||||
|
const UINT8 *colormap = NULL;
|
||||||
|
INT32 spacewidth = 2, charwidth = 0;
|
||||||
|
|
||||||
|
INT32 lowercase = (option & V_ALLOWLOWERCASE);
|
||||||
|
option &= ~V_FLIP; // which is also shared with V_ALLOWLOWERCASE...
|
||||||
|
|
||||||
|
if (option & V_NOSCALESTART)
|
||||||
|
{
|
||||||
|
dupx = vid.dupx;
|
||||||
|
dupy = vid.dupy;
|
||||||
|
scrwidth = vid.width;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dupx = dupy = 1;
|
||||||
|
scrwidth = vid.width/vid.dupx;
|
||||||
|
left = (scrwidth - BASEVIDWIDTH)/2;
|
||||||
|
scrwidth -= left;
|
||||||
|
}
|
||||||
|
|
||||||
|
charflags = (option & V_CHARCOLORMASK);
|
||||||
|
|
||||||
|
switch (option & V_SPACINGMASK)
|
||||||
|
{
|
||||||
|
case V_MONOSPACE:
|
||||||
|
spacewidth = 8;
|
||||||
|
/* FALLTHRU */
|
||||||
|
case V_OLDSPACING:
|
||||||
|
charwidth = 8;
|
||||||
|
break;
|
||||||
|
case V_6WIDTHSPACE:
|
||||||
|
spacewidth = 6;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;ch++)
|
||||||
|
{
|
||||||
|
if (!*ch)
|
||||||
|
break;
|
||||||
|
if (*ch & 0x80) //color parsing -x 2.16.09
|
||||||
|
{
|
||||||
|
// manually set flags override color codes
|
||||||
|
if (!(option & V_CHARCOLORMASK))
|
||||||
|
charflags = ((*ch & 0x7f) << V_CHARCOLORSHIFT) & V_CHARCOLORMASK;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (*ch == '\n')
|
||||||
|
{
|
||||||
|
cx = x;
|
||||||
|
|
||||||
|
if (option & V_RETURN8)
|
||||||
|
cy += (8*dupy)<<FRACBITS;
|
||||||
|
else
|
||||||
|
cy += (12*dupy)<<FRACBITS;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
c = *ch;
|
||||||
|
if (!lowercase || !tny_font[c-HU_FONTSTART])
|
||||||
|
c = toupper(c);
|
||||||
|
c -= HU_FONTSTART;
|
||||||
|
|
||||||
|
// character does not exist or is a space
|
||||||
|
if (c < 0 || c >= HU_FONTSIZE || !tny_font[c])
|
||||||
|
{
|
||||||
|
cx += (spacewidth * dupx)<<FRACBITS;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (charwidth)
|
||||||
|
{
|
||||||
|
w = charwidth * dupx;
|
||||||
|
center = w/2 - SHORT(tny_font[c]->width)*(dupx/2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
w = SHORT(tny_font[c]->width) * dupx;
|
||||||
|
|
||||||
|
if ((cx>>FRACBITS) > scrwidth)
|
||||||
|
break;
|
||||||
|
if ((cx>>FRACBITS)+left + w < 0) //left boundary check
|
||||||
|
{
|
||||||
|
cx += w<<FRACBITS;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
colormap = V_GetStringColormap(charflags);
|
||||||
|
|
||||||
|
V_DrawFixedPatch(cx + (center<<FRACBITS), cy, FRACUNIT, option, tny_font[c], colormap);
|
||||||
|
|
||||||
|
cx += w<<FRACBITS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void V_DrawCenteredThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
x -= (V_ThinStringWidth(string, option) / 2)<<FRACBITS;
|
||||||
|
V_DrawThinStringAtFixed(x, y, option, string);
|
||||||
|
}
|
||||||
|
|
||||||
|
void V_DrawRightAlignedThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
x -= V_ThinStringWidth(string, option)<<FRACBITS;
|
||||||
|
V_DrawThinStringAtFixed(x, y, option, string);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draws a small string at a fixed_t location.
|
||||||
|
void V_DrawSmallThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
fixed_t cx = x, cy = y;
|
||||||
|
INT32 w, c, dupx, dupy, scrwidth, center = 0, left = 0;
|
||||||
|
const char *ch = string;
|
||||||
|
INT32 charflags = 0;
|
||||||
|
const UINT8 *colormap = NULL;
|
||||||
|
INT32 spacewidth = 2<<FRACBITS, charwidth = 0;
|
||||||
|
|
||||||
|
INT32 lowercase = (option & V_ALLOWLOWERCASE);
|
||||||
|
option &= ~V_FLIP; // which is also shared with V_ALLOWLOWERCASE...
|
||||||
|
|
||||||
|
if (option & V_NOSCALESTART)
|
||||||
|
{
|
||||||
|
dupx = vid.dupx<<FRACBITS;
|
||||||
|
dupy = vid.dupy<<FRACBITS;
|
||||||
|
scrwidth = vid.width;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dupx = dupy = FRACUNIT;
|
||||||
|
scrwidth = FixedDiv(vid.width<<FRACBITS, vid.dupx);
|
||||||
|
left = ((scrwidth - (BASEVIDWIDTH<<FRACBITS))/2);
|
||||||
|
scrwidth -= left;
|
||||||
|
}
|
||||||
|
|
||||||
|
charflags = (option & V_CHARCOLORMASK);
|
||||||
|
|
||||||
|
switch (option & V_SPACINGMASK)
|
||||||
|
{
|
||||||
|
case V_MONOSPACE:
|
||||||
|
spacewidth = 4<<FRACBITS;
|
||||||
|
/* FALLTHRU */
|
||||||
|
case V_OLDSPACING:
|
||||||
|
charwidth = 4<<FRACBITS;
|
||||||
|
break;
|
||||||
|
case V_6WIDTHSPACE:
|
||||||
|
spacewidth = 3<<FRACBITS;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;ch++)
|
||||||
|
{
|
||||||
|
if (!*ch)
|
||||||
|
break;
|
||||||
|
if (*ch & 0x80) //color parsing -x 2.16.09
|
||||||
|
{
|
||||||
|
// manually set flags override color codes
|
||||||
|
if (!(option & V_CHARCOLORMASK))
|
||||||
|
charflags = ((*ch & 0x7f) << V_CHARCOLORSHIFT) & V_CHARCOLORMASK;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (*ch == '\n')
|
||||||
|
{
|
||||||
|
cx = x;
|
||||||
|
|
||||||
|
if (option & V_RETURN8)
|
||||||
|
cy += 4*dupy;
|
||||||
|
else
|
||||||
|
cy += 6*dupy;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
c = *ch;
|
||||||
|
if (!lowercase)
|
||||||
|
c = toupper(c);
|
||||||
|
c -= HU_FONTSTART;
|
||||||
|
|
||||||
|
// character does not exist or is a space
|
||||||
|
if (c < 0 || c >= HU_FONTSIZE || !tny_font[c])
|
||||||
|
{
|
||||||
|
cx += FixedMul(spacewidth, dupx);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (charwidth)
|
||||||
|
{
|
||||||
|
w = FixedMul(charwidth, dupx);
|
||||||
|
center = w/2 - SHORT(tny_font[c]->width)*(dupx/4);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
w = SHORT(tny_font[c]->width) * dupx / 2;
|
||||||
|
|
||||||
|
if (cx > scrwidth)
|
||||||
|
break;
|
||||||
|
if (cx+left + w < 0) //left boundary check
|
||||||
|
{
|
||||||
|
cx += w;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
colormap = V_GetStringColormap(charflags);
|
||||||
|
|
||||||
|
V_DrawFixedPatch(cx + center, cy, FRACUNIT/2, option, tny_font[c], colormap);
|
||||||
|
|
||||||
|
cx += w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void V_DrawCenteredSmallThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
x -= V_SmallThinStringWidth(string, option)/4;
|
||||||
|
V_DrawSmallThinStringAtFixed(x, y, option, string);
|
||||||
|
}
|
||||||
|
|
||||||
|
void V_DrawRightAlignedSmallThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
|
||||||
|
{
|
||||||
|
x -= V_SmallThinStringWidth(string, option)/2;
|
||||||
|
V_DrawSmallThinStringAtFixed(x, y, option, string);
|
||||||
|
}
|
||||||
|
|
||||||
// Draws a tallnum. Replaces two functions in y_inter and st_stuff
|
// Draws a tallnum. Replaces two functions in y_inter and st_stuff
|
||||||
void V_DrawTallNum(INT32 x, INT32 y, INT32 flags, INT32 num)
|
void V_DrawTallNum(INT32 x, INT32 y, INT32 flags, INT32 num)
|
||||||
{
|
{
|
||||||
|
@ -3068,6 +3461,15 @@ INT32 V_ThinStringWidth(const char *string, INT32 option)
|
||||||
return w;
|
return w;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find string width from tny_font chars, 0.5x scale
|
||||||
|
//
|
||||||
|
INT32 V_SmallThinStringWidth(const char *string, INT32 option)
|
||||||
|
{
|
||||||
|
INT32 w = V_ThinStringWidth(string, option)<<FRACBITS;
|
||||||
|
return w/2 + FRACUNIT; // +FRACUNIT because otherwise it's offset wrong.
|
||||||
|
}
|
||||||
|
|
||||||
boolean *heatshifter = NULL;
|
boolean *heatshifter = NULL;
|
||||||
INT32 lastheight = 0;
|
INT32 lastheight = 0;
|
||||||
INT32 heatindex[2] = { 0, 0 };
|
INT32 heatindex[2] = { 0, 0 };
|
||||||
|
@ -3244,7 +3646,6 @@ Unoptimized version
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Taken from my videos-in-SRB2 project
|
|
||||||
// Generates a color look-up table
|
// Generates a color look-up table
|
||||||
// which has up to 64 colors at each channel
|
// which has up to 64 colors at each channel
|
||||||
// (see the defines in v_video.h)
|
// (see the defines in v_video.h)
|
||||||
|
@ -3261,7 +3662,7 @@ void InitColorLUT(RGBA_t *palette)
|
||||||
for (r = 0; r < CLUTSIZE; r++)
|
for (r = 0; r < CLUTSIZE; r++)
|
||||||
for (g = 0; g < CLUTSIZE; g++)
|
for (g = 0; g < CLUTSIZE; g++)
|
||||||
for (b = 0; b < CLUTSIZE; b++)
|
for (b = 0; b < CLUTSIZE; b++)
|
||||||
colorlookup[r][g][b] = NearestColor(r << SHIFTCOLORBITS, g << SHIFTCOLORBITS, b << SHIFTCOLORBITS);
|
colorlookup[r][g][b] = NearestPaletteColor(r << SHIFTCOLORBITS, g << SHIFTCOLORBITS, b << SHIFTCOLORBITS, palette);
|
||||||
clutinit = true;
|
clutinit = true;
|
||||||
lastpalette = palette;
|
lastpalette = palette;
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,10 +37,7 @@ cv_allcaps;
|
||||||
// Allocates buffer screens, call before R_Init.
|
// Allocates buffer screens, call before R_Init.
|
||||||
void V_Init(void);
|
void V_Init(void);
|
||||||
|
|
||||||
// Taken from my videos-in-SRB2 project
|
// Color look-up table
|
||||||
// Generates a color look-up table
|
|
||||||
// which has up to 64 colors at each channel
|
|
||||||
|
|
||||||
#define COLORBITS 6
|
#define COLORBITS 6
|
||||||
#define SHIFTCOLORBITS (8-COLORBITS)
|
#define SHIFTCOLORBITS (8-COLORBITS)
|
||||||
#define CLUTSIZE (1<<COLORBITS)
|
#define CLUTSIZE (1<<COLORBITS)
|
||||||
|
@ -205,13 +202,38 @@ void V_DrawRightAlignedString(INT32 x, INT32 y, INT32 option, const char *string
|
||||||
|
|
||||||
// draw a string using the hu_font, 0.5x scale
|
// draw a string using the hu_font, 0.5x scale
|
||||||
void V_DrawSmallString(INT32 x, INT32 y, INT32 option, const char *string);
|
void V_DrawSmallString(INT32 x, INT32 y, INT32 option, const char *string);
|
||||||
|
void V_DrawCenteredSmallString(INT32 x, INT32 y, INT32 option, const char *string);
|
||||||
void V_DrawRightAlignedSmallString(INT32 x, INT32 y, INT32 option, const char *string);
|
void V_DrawRightAlignedSmallString(INT32 x, INT32 y, INT32 option, const char *string);
|
||||||
|
|
||||||
// draw a string using the tny_font
|
// draw a string using the tny_font
|
||||||
void V_DrawThinString(INT32 x, INT32 y, INT32 option, const char *string);
|
void V_DrawThinString(INT32 x, INT32 y, INT32 option, const char *string);
|
||||||
|
void V_DrawCenteredThinString(INT32 x, INT32 y, INT32 option, const char *string);
|
||||||
void V_DrawRightAlignedThinString(INT32 x, INT32 y, INT32 option, const char *string);
|
void V_DrawRightAlignedThinString(INT32 x, INT32 y, INT32 option, const char *string);
|
||||||
|
|
||||||
|
// draw a string using the tny_font, 0.5x scale
|
||||||
|
void V_DrawSmallThinString(INT32 x, INT32 y, INT32 option, const char *string);
|
||||||
|
void V_DrawCenteredSmallThinString(INT32 x, INT32 y, INT32 option, const char *string);
|
||||||
|
void V_DrawRightAlignedSmallThinString(INT32 x, INT32 y, INT32 option, const char *string);
|
||||||
|
|
||||||
|
// draw a string using the hu_font at fixed_t coordinates
|
||||||
void V_DrawStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
|
void V_DrawStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
|
||||||
|
void V_DrawCenteredStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
|
||||||
|
void V_DrawRightAlignedStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
|
||||||
|
|
||||||
|
// draw a string using the hu_font at fixed_t coordinates, 0.5x scale
|
||||||
|
void V_DrawSmallStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
|
||||||
|
void V_DrawCenteredSmallStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
|
||||||
|
void V_DrawRightAlignedSmallStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
|
||||||
|
|
||||||
|
// draw a string using the tny_font at fixed_t coordinates
|
||||||
|
void V_DrawThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
|
||||||
|
void V_DrawCenteredThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
|
||||||
|
void V_DrawRightAlignedThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
|
||||||
|
|
||||||
|
// draw a string using the tny_font at fixed_t coordinates, 0.5x scale
|
||||||
|
void V_DrawSmallThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
|
||||||
|
void V_DrawCenteredSmallThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
|
||||||
|
void V_DrawRightAlignedSmallThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
|
||||||
|
|
||||||
// Draw tall nums, used for menu, HUD, intermission
|
// Draw tall nums, used for menu, HUD, intermission
|
||||||
void V_DrawTallNum(INT32 x, INT32 y, INT32 flags, INT32 num);
|
void V_DrawTallNum(INT32 x, INT32 y, INT32 flags, INT32 num);
|
||||||
|
@ -237,6 +259,8 @@ INT32 V_StringWidth(const char *string, INT32 option);
|
||||||
INT32 V_SmallStringWidth(const char *string, INT32 option);
|
INT32 V_SmallStringWidth(const char *string, INT32 option);
|
||||||
// Find string width from tny_font chars
|
// Find string width from tny_font chars
|
||||||
INT32 V_ThinStringWidth(const char *string, INT32 option);
|
INT32 V_ThinStringWidth(const char *string, INT32 option);
|
||||||
|
// Find string width from tny_font chars, 0.5x scale
|
||||||
|
INT32 V_SmallThinStringWidth(const char *string, INT32 option);
|
||||||
|
|
||||||
void V_DoPostProcessor(INT32 view, postimg_t type, INT32 param);
|
void V_DoPostProcessor(INT32 view, postimg_t type, INT32 param);
|
||||||
|
|
||||||
|
|
63
src/w_wad.c
63
src/w_wad.c
|
@ -637,6 +637,21 @@ static lumpinfo_t* ResGetLumpsZip (FILE* handle, UINT16* nlmp)
|
||||||
return lumpinfo;
|
return lumpinfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static UINT16 W_InitFileError (const char *filename, boolean exitworthy)
|
||||||
|
{
|
||||||
|
if (exitworthy)
|
||||||
|
{
|
||||||
|
#ifdef _DEBUG
|
||||||
|
CONS_Error("A WAD file was not found or not valid.\nCheck the log to see which ones.\n");
|
||||||
|
#else
|
||||||
|
I_Error("A WAD file was not found or not valid.\nCheck the log to see which ones.\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
CONS_Printf(M_GetText("Errors occurred while loading %s; not added.\n"), filename);
|
||||||
|
return INT16_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
// Allocate a wadfile, setup the lumpinfo (directory) and
|
// Allocate a wadfile, setup the lumpinfo (directory) and
|
||||||
// lumpcache, add the wadfile to the current active wadfiles
|
// lumpcache, add the wadfile to the current active wadfiles
|
||||||
//
|
//
|
||||||
|
@ -648,7 +663,7 @@ static lumpinfo_t* ResGetLumpsZip (FILE* handle, UINT16* nlmp)
|
||||||
//
|
//
|
||||||
// Can now load dehacked files (.soc)
|
// Can now load dehacked files (.soc)
|
||||||
//
|
//
|
||||||
UINT16 W_InitFile(const char *filename, boolean mainfile)
|
UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup)
|
||||||
{
|
{
|
||||||
FILE *handle;
|
FILE *handle;
|
||||||
lumpinfo_t *lumpinfo = NULL;
|
lumpinfo_t *lumpinfo = NULL;
|
||||||
|
@ -681,12 +696,12 @@ UINT16 W_InitFile(const char *filename, boolean mainfile)
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("Maximum wad files reached\n"));
|
CONS_Alert(CONS_ERROR, M_GetText("Maximum wad files reached\n"));
|
||||||
refreshdirmenu |= REFRESHDIR_MAX;
|
refreshdirmenu |= REFRESHDIR_MAX;
|
||||||
return INT16_MAX;
|
return W_InitFileError(filename, startup);
|
||||||
}
|
}
|
||||||
|
|
||||||
// open wad file
|
// open wad file
|
||||||
if ((handle = W_OpenWadFile(&filename, true)) == NULL)
|
if ((handle = W_OpenWadFile(&filename, true)) == NULL)
|
||||||
return INT16_MAX;
|
return W_InitFileError(filename, startup);
|
||||||
|
|
||||||
// Check if wad files will overflow fileneededbuffer. Only the filename part
|
// Check if wad files will overflow fileneededbuffer. Only the filename part
|
||||||
// is send in the packet; cf.
|
// is send in the packet; cf.
|
||||||
|
@ -701,7 +716,7 @@ UINT16 W_InitFile(const char *filename, boolean mainfile)
|
||||||
refreshdirmenu |= REFRESHDIR_MAX;
|
refreshdirmenu |= REFRESHDIR_MAX;
|
||||||
if (handle)
|
if (handle)
|
||||||
fclose(handle);
|
fclose(handle);
|
||||||
return INT16_MAX;
|
return W_InitFileError(filename, startup);
|
||||||
}
|
}
|
||||||
|
|
||||||
packetsizetally = packetsize;
|
packetsizetally = packetsize;
|
||||||
|
@ -722,7 +737,7 @@ UINT16 W_InitFile(const char *filename, boolean mainfile)
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("%s is already loaded\n"), filename);
|
CONS_Alert(CONS_ERROR, M_GetText("%s is already loaded\n"), filename);
|
||||||
if (handle)
|
if (handle)
|
||||||
fclose(handle);
|
fclose(handle);
|
||||||
return INT16_MAX;
|
return W_InitFileError(filename, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -750,7 +765,7 @@ UINT16 W_InitFile(const char *filename, boolean mainfile)
|
||||||
if (lumpinfo == NULL)
|
if (lumpinfo == NULL)
|
||||||
{
|
{
|
||||||
fclose(handle);
|
fclose(handle);
|
||||||
return INT16_MAX;
|
return W_InitFileError(filename, startup);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -822,13 +837,9 @@ UINT16 W_InitFile(const char *filename, boolean mainfile)
|
||||||
* backwards, so a later file overrides all earlier ones.
|
* backwards, so a later file overrides all earlier ones.
|
||||||
*
|
*
|
||||||
* \param filenames A null-terminated list of files to use.
|
* \param filenames A null-terminated list of files to use.
|
||||||
* \return 1 if all files were loaded, 0 if at least one was missing or
|
|
||||||
* invalid.
|
|
||||||
*/
|
*/
|
||||||
INT32 W_InitMultipleFiles(char **filenames, UINT16 mainfiles)
|
void W_InitMultipleFiles(char **filenames, UINT16 mainfiles)
|
||||||
{
|
{
|
||||||
INT32 rc = 1;
|
|
||||||
|
|
||||||
// open all the files, load headers, and count lumps
|
// open all the files, load headers, and count lumps
|
||||||
numwadfiles = 0;
|
numwadfiles = 0;
|
||||||
|
|
||||||
|
@ -836,13 +847,8 @@ INT32 W_InitMultipleFiles(char **filenames, UINT16 mainfiles)
|
||||||
for (; *filenames; filenames++)
|
for (; *filenames; filenames++)
|
||||||
{
|
{
|
||||||
//CONS_Debug(DBG_SETUP, "Loading %s\n", *filenames);
|
//CONS_Debug(DBG_SETUP, "Loading %s\n", *filenames);
|
||||||
rc &= (W_InitFile(*filenames, numwadfiles < mainfiles) != INT16_MAX) ? 1 : 0;
|
W_InitFile(*filenames, numwadfiles < mainfiles, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!numwadfiles)
|
|
||||||
I_Error("W_InitMultipleFiles: no files found");
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Make sure a lump number is valid.
|
/** Make sure a lump number is valid.
|
||||||
|
@ -1475,7 +1481,7 @@ void W_FlushCachedPatches(void)
|
||||||
Z_FreeTag(PU_HWRPATCHINFO);
|
Z_FreeTag(PU_HWRPATCHINFO);
|
||||||
Z_FreeTag(PU_HWRMODELTEXTURE);
|
Z_FreeTag(PU_HWRMODELTEXTURE);
|
||||||
Z_FreeTag(PU_HWRCACHE);
|
Z_FreeTag(PU_HWRCACHE);
|
||||||
Z_FreeTags(PU_HWRCACHE_UNLOCKED, PU_HWRPATCHINFO_UNLOCKED);
|
Z_FreeTags(PU_HWRCACHE_UNLOCKED, PU_HWRMODELTEXTURE_UNLOCKED);
|
||||||
}
|
}
|
||||||
needpatchflush = false;
|
needpatchflush = false;
|
||||||
}
|
}
|
||||||
|
@ -1691,7 +1697,7 @@ W_VerifyName (const char *name, lumpchecklist_t *checklist, boolean status)
|
||||||
size_t j;
|
size_t j;
|
||||||
for (j = 0; checklist[j].len && checklist[j].name; ++j)
|
for (j = 0; checklist[j].len && checklist[j].name; ++j)
|
||||||
{
|
{
|
||||||
if (( strncmp(name, checklist[j].name,
|
if (( strncasecmp(name, checklist[j].name,
|
||||||
checklist[j].len) != false ) == status)
|
checklist[j].len) != false ) == status)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
|
@ -1746,6 +1752,19 @@ W_VerifyWAD (FILE *fp, lumpchecklist_t *checklist, boolean status)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// List of blacklisted folders to use when checking the PK3
|
||||||
|
static lumpchecklist_t folderblacklist[] =
|
||||||
|
{
|
||||||
|
{"Lua/", 4},
|
||||||
|
{"SOC/", 4},
|
||||||
|
{"Sprites/", 8},
|
||||||
|
{"Textures/", 9},
|
||||||
|
{"Patches/", 8},
|
||||||
|
{"Flats/", 6},
|
||||||
|
{"Fades/", 6},
|
||||||
|
{NULL, 0},
|
||||||
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
W_VerifyPK3 (FILE *fp, lumpchecklist_t *checklist, boolean status)
|
W_VerifyPK3 (FILE *fp, lumpchecklist_t *checklist, boolean status)
|
||||||
{
|
{
|
||||||
|
@ -1797,7 +1816,7 @@ W_VerifyPK3 (FILE *fp, lumpchecklist_t *checklist, boolean status)
|
||||||
else
|
else
|
||||||
trimname = fullname; // Care taken for root files.
|
trimname = fullname; // Care taken for root files.
|
||||||
|
|
||||||
if (*trimname) // Ignore directories
|
if (*trimname) // Ignore directories, well kinda
|
||||||
{
|
{
|
||||||
if ((dotpos = strrchr(trimname, '.')) == 0)
|
if ((dotpos = strrchr(trimname, '.')) == 0)
|
||||||
dotpos = fullname + strlen(fullname); // Watch for files without extension.
|
dotpos = fullname + strlen(fullname); // Watch for files without extension.
|
||||||
|
@ -1807,6 +1826,10 @@ W_VerifyPK3 (FILE *fp, lumpchecklist_t *checklist, boolean status)
|
||||||
|
|
||||||
if (! W_VerifyName(lumpname, checklist, status))
|
if (! W_VerifyName(lumpname, checklist, status))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Check for directories next, if it's blacklisted it will return false
|
||||||
|
if (W_VerifyName(fullname, folderblacklist, status))
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(fullname);
|
free(fullname);
|
||||||
|
|
|
@ -146,11 +146,10 @@ 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
|
// 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);
|
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
|
// 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);
|
UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup);
|
||||||
|
|
||||||
// W_InitMultipleFiles returns 1 if all is okay, 0 otherwise,
|
// W_InitMultipleFiles exits if a file was not found, but not if all is okay.
|
||||||
// so that it stops with a message if a file was not found, but not if all is okay.
|
void W_InitMultipleFiles(char **filenames, UINT16 mainfiles);
|
||||||
INT32 W_InitMultipleFiles(char **filenames, UINT16 mainfiles);
|
|
||||||
|
|
||||||
const char *W_CheckNameForNumPwad(UINT16 wad, UINT16 lump);
|
const char *W_CheckNameForNumPwad(UINT16 wad, UINT16 lump);
|
||||||
const char *W_CheckNameForNum(lumpnum_t lumpnum);
|
const char *W_CheckNameForNum(lumpnum_t lumpnum);
|
||||||
|
|
21
src/z_zone.c
21
src/z_zone.c
|
@ -232,12 +232,12 @@ void Z_Free(void *ptr)
|
||||||
|
|
||||||
// Free the memory and get rid of the block.
|
// Free the memory and get rid of the block.
|
||||||
free(block->real);
|
free(block->real);
|
||||||
block->prev->next = block->next;
|
|
||||||
block->next->prev = block->prev;
|
|
||||||
free(block);
|
|
||||||
#ifdef VALGRIND_DESTROY_MEMPOOL
|
#ifdef VALGRIND_DESTROY_MEMPOOL
|
||||||
VALGRIND_DESTROY_MEMPOOL(block);
|
VALGRIND_DESTROY_MEMPOOL(block);
|
||||||
#endif
|
#endif
|
||||||
|
block->prev->next = block->next;
|
||||||
|
block->next->prev = block->prev;
|
||||||
|
free(block);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** malloc() that doesn't accept failure.
|
/** malloc() that doesn't accept failure.
|
||||||
|
@ -317,13 +317,9 @@ void *Z_MallocAlign(size_t size, INT32 tag, void *user, INT32 alignbits)
|
||||||
// The mem header lives 'sizeof (memhdr_t)' bytes before given.
|
// The mem header lives 'sizeof (memhdr_t)' bytes before given.
|
||||||
hdr = (memhdr_t *)((UINT8 *)given - sizeof *hdr);
|
hdr = (memhdr_t *)((UINT8 *)given - sizeof *hdr);
|
||||||
|
|
||||||
#ifdef VALGRIND_CREATE_MEMPOOL
|
#ifdef HAVE_VALGRIND
|
||||||
VALGRIND_CREATE_MEMPOOL(block, padsize, Z_calloc);
|
|
||||||
Z_calloc = false;
|
Z_calloc = false;
|
||||||
#endif
|
#endif
|
||||||
#ifdef VALGRIND_MEMPOOL_ALLOC
|
|
||||||
VALGRIND_MEMPOOL_ALLOC(block, hdr, size + sizeof *hdr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
block->next = head.next;
|
block->next = head.next;
|
||||||
block->prev = &head;
|
block->prev = &head;
|
||||||
|
@ -341,6 +337,13 @@ void *Z_MallocAlign(size_t size, INT32 tag, void *user, INT32 alignbits)
|
||||||
block->size = blocksize;
|
block->size = blocksize;
|
||||||
block->realsize = size;
|
block->realsize = size;
|
||||||
|
|
||||||
|
#ifdef VALGRIND_CREATE_MEMPOOL
|
||||||
|
VALGRIND_CREATE_MEMPOOL(block, padsize, Z_calloc);
|
||||||
|
#endif
|
||||||
|
//#ifdef VALGRIND_MEMPOOL_ALLOC
|
||||||
|
// VALGRIND_MEMPOOL_ALLOC(block, hdr, size + sizeof *hdr);
|
||||||
|
//#endif
|
||||||
|
|
||||||
hdr->id = ZONEID;
|
hdr->id = ZONEID;
|
||||||
hdr->block = block;
|
hdr->block = block;
|
||||||
|
|
||||||
|
@ -516,6 +519,7 @@ void Z_FlushCachedPatches(void)
|
||||||
Z_FreeTag(PU_HWRCACHE);
|
Z_FreeTag(PU_HWRCACHE);
|
||||||
Z_FreeTag(PU_HWRCACHE_UNLOCKED);
|
Z_FreeTag(PU_HWRCACHE_UNLOCKED);
|
||||||
Z_FreeTag(PU_HWRPATCHINFO_UNLOCKED);
|
Z_FreeTag(PU_HWRPATCHINFO_UNLOCKED);
|
||||||
|
Z_FreeTag(PU_HWRMODELTEXTURE_UNLOCKED);
|
||||||
}
|
}
|
||||||
|
|
||||||
// happens before a renderer switch
|
// happens before a renderer switch
|
||||||
|
@ -812,6 +816,7 @@ static void Command_Memfree_f(void)
|
||||||
CONS_Printf(M_GetText("Mipmap patches : %7s KB\n"), sizeu1(Z_TagUsage(PU_HWRPATCHCOLMIPMAP)>>10));
|
CONS_Printf(M_GetText("Mipmap patches : %7s KB\n"), sizeu1(Z_TagUsage(PU_HWRPATCHCOLMIPMAP)>>10));
|
||||||
CONS_Printf(M_GetText("HW Texture cache : %7s KB\n"), sizeu1(Z_TagUsage(PU_HWRCACHE)>>10));
|
CONS_Printf(M_GetText("HW Texture cache : %7s KB\n"), sizeu1(Z_TagUsage(PU_HWRCACHE)>>10));
|
||||||
CONS_Printf(M_GetText("Plane polygons : %7s KB\n"), sizeu1(Z_TagUsage(PU_HWRPLANE)>>10));
|
CONS_Printf(M_GetText("Plane polygons : %7s KB\n"), sizeu1(Z_TagUsage(PU_HWRPLANE)>>10));
|
||||||
|
CONS_Printf(M_GetText("HW model textures : %7s KB\n"), sizeu1(Z_TagUsage(PU_HWRMODELTEXTURE)>>10));
|
||||||
CONS_Printf(M_GetText("HW Texture used : %7d KB\n"), HWR_GetTextureUsed()>>10);
|
CONS_Printf(M_GetText("HW Texture used : %7d KB\n"), HWR_GetTextureUsed()>>10);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -64,6 +64,7 @@ enum
|
||||||
// 'second-level' cache for graphics
|
// 'second-level' cache for graphics
|
||||||
// stored in hardware format and downloaded as needed
|
// stored in hardware format and downloaded as needed
|
||||||
PU_HWRPATCHINFO_UNLOCKED = 103, // 'unlocked' PU_HWRPATCHINFO memory
|
PU_HWRPATCHINFO_UNLOCKED = 103, // 'unlocked' PU_HWRPATCHINFO memory
|
||||||
|
PU_HWRMODELTEXTURE_UNLOCKED = 104, // 'unlocked' PU_HWRMODELTEXTURE memory
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in a new issue