commit
b805380294
41
src/d_main.c
41
src/d_main.c
|
@ -301,7 +301,7 @@ static void D_Display(void)
|
||||||
if (rendermode != render_none)
|
if (rendermode != render_none)
|
||||||
{
|
{
|
||||||
// Fade to black first
|
// Fade to black first
|
||||||
if (gamestate != GS_LEVEL // fades to black on its own timing, always
|
if (!(gamestate == GS_LEVEL || (gamestate == GS_TITLESCREEN && titlemapinaction)) // fades to black on its own timing, always
|
||||||
&& wipedefs[wipedefindex] != UINT8_MAX)
|
&& wipedefs[wipedefindex] != UINT8_MAX)
|
||||||
{
|
{
|
||||||
F_WipeStartScreen();
|
F_WipeStartScreen();
|
||||||
|
@ -317,6 +317,12 @@ static void D_Display(void)
|
||||||
// do buffered drawing
|
// do buffered drawing
|
||||||
switch (gamestate)
|
switch (gamestate)
|
||||||
{
|
{
|
||||||
|
case GS_TITLESCREEN:
|
||||||
|
if (!titlemapinaction) {
|
||||||
|
F_TitleScreenDrawer();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Intentional fall-through
|
||||||
case GS_LEVEL:
|
case GS_LEVEL:
|
||||||
if (!gametic)
|
if (!gametic)
|
||||||
break;
|
break;
|
||||||
|
@ -365,10 +371,6 @@ static void D_Display(void)
|
||||||
HU_Drawer();
|
HU_Drawer();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GS_TITLESCREEN:
|
|
||||||
F_TitleScreenDrawer();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GS_WAITINGPLAYERS:
|
case GS_WAITINGPLAYERS:
|
||||||
// The clientconnect drawer is independent...
|
// The clientconnect drawer is independent...
|
||||||
case GS_DEDICATEDSERVER:
|
case GS_DEDICATEDSERVER:
|
||||||
|
@ -378,9 +380,10 @@ static void D_Display(void)
|
||||||
|
|
||||||
// clean up border stuff
|
// clean up border stuff
|
||||||
// see if the border needs to be initially drawn
|
// see if the border needs to be initially drawn
|
||||||
if (gamestate == GS_LEVEL)
|
if (gamestate == GS_LEVEL || (gamestate == GS_TITLESCREEN && titlemapinaction))
|
||||||
{
|
{
|
||||||
// draw the view directly
|
// draw the view directly
|
||||||
|
|
||||||
if (!automapactive && !dedicated && cv_renderview.value)
|
if (!automapactive && !dedicated && cv_renderview.value)
|
||||||
{
|
{
|
||||||
if (players[displayplayer].mo || players[displayplayer].playerstate == PST_DEAD)
|
if (players[displayplayer].mo || players[displayplayer].playerstate == PST_DEAD)
|
||||||
|
@ -438,9 +441,13 @@ static void D_Display(void)
|
||||||
lastdraw = false;
|
lastdraw = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ST_Drawer();
|
if (gamestate == GS_LEVEL)
|
||||||
|
{
|
||||||
HU_Drawer();
|
ST_Drawer();
|
||||||
|
HU_Drawer();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
F_TitleScreenDrawer();
|
||||||
}
|
}
|
||||||
|
|
||||||
// change gamma if needed
|
// change gamma if needed
|
||||||
|
@ -680,6 +687,9 @@ void D_AdvanceDemo(void)
|
||||||
void D_StartTitle(void)
|
void D_StartTitle(void)
|
||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
|
|
||||||
|
S_StopMusic();
|
||||||
|
|
||||||
if (netgame)
|
if (netgame)
|
||||||
{
|
{
|
||||||
if (gametype == GT_COOP)
|
if (gametype == GT_COOP)
|
||||||
|
@ -1345,6 +1355,19 @@ void D_SRB2Main(void)
|
||||||
ultimatemode = true;
|
ultimatemode = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// rei/miru: bootmap (Idea: starts the game on a predefined map)
|
||||||
|
if (bootmap && !(M_CheckParm("-warp") && M_IsNextParm()))
|
||||||
|
{
|
||||||
|
pstartmap = bootmap;
|
||||||
|
|
||||||
|
if (pstartmap < 1 || pstartmap > NUMMAPS)
|
||||||
|
I_Error("Cannot warp to map %d (out of range)\n", pstartmap);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
autostart = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (autostart || netgame || M_CheckParm("+connect") || M_CheckParm("-connect"))
|
if (autostart || netgame || M_CheckParm("+connect") || M_CheckParm("-connect"))
|
||||||
{
|
{
|
||||||
gameaction = ga_nothing;
|
gameaction = ga_nothing;
|
||||||
|
|
|
@ -77,6 +77,8 @@ boolean deh_loaded = false;
|
||||||
static int dbg_line;
|
static int dbg_line;
|
||||||
|
|
||||||
static boolean gamedataadded = false;
|
static boolean gamedataadded = false;
|
||||||
|
static boolean titlechanged = false;
|
||||||
|
static boolean introchanged = false;
|
||||||
|
|
||||||
ATTRINLINE static FUNCINLINE char myfget_color(MYFILE *f)
|
ATTRINLINE static FUNCINLINE char myfget_color(MYFILE *f)
|
||||||
{
|
{
|
||||||
|
@ -2667,14 +2669,38 @@ static void readmaincfg(MYFILE *f)
|
||||||
// range check, you morons.
|
// range check, you morons.
|
||||||
if (introtoplay > 128)
|
if (introtoplay > 128)
|
||||||
introtoplay = 128;
|
introtoplay = 128;
|
||||||
|
introchanged = true;
|
||||||
}
|
}
|
||||||
else if (fastcmp(word, "LOOPTITLE"))
|
else if (fastcmp(word, "LOOPTITLE"))
|
||||||
{
|
{
|
||||||
looptitle = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y');
|
looptitle = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y');
|
||||||
|
titlechanged = true;
|
||||||
|
}
|
||||||
|
else if (fastcmp(word, "TITLEMAP"))
|
||||||
|
{
|
||||||
|
// Support using the actual map name,
|
||||||
|
// i.e., Level AB, Level FZ, etc.
|
||||||
|
|
||||||
|
// Convert to map number
|
||||||
|
if (word2[0] >= 'A' && word2[0] <= 'Z')
|
||||||
|
value = M_MapNumber(word2[0], word2[1]);
|
||||||
|
else
|
||||||
|
value = get_number(word2);
|
||||||
|
|
||||||
|
DEH_WriteUndoline(word, va("%d", titlemap), UNDO_NONE);
|
||||||
|
titlemap = (INT16)value;
|
||||||
|
titlechanged = true;
|
||||||
|
}
|
||||||
|
else if (fastcmp(word, "HIDETITLEPICS"))
|
||||||
|
{
|
||||||
|
DEH_WriteUndoline(word, va("%d", hidetitlepics), UNDO_NONE);
|
||||||
|
hidetitlepics = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y');
|
||||||
|
titlechanged = true;
|
||||||
}
|
}
|
||||||
else if (fastcmp(word, "TITLESCROLLSPEED"))
|
else if (fastcmp(word, "TITLESCROLLSPEED"))
|
||||||
{
|
{
|
||||||
titlescrollspeed = get_number(word2);
|
titlescrollspeed = get_number(word2);
|
||||||
|
titlechanged = true;
|
||||||
}
|
}
|
||||||
else if (fastcmp(word, "CREDITSCUTSCENE"))
|
else if (fastcmp(word, "CREDITSCUTSCENE"))
|
||||||
{
|
{
|
||||||
|
@ -2690,14 +2716,17 @@ static void readmaincfg(MYFILE *f)
|
||||||
else if (fastcmp(word, "NUMDEMOS"))
|
else if (fastcmp(word, "NUMDEMOS"))
|
||||||
{
|
{
|
||||||
numDemos = (UINT8)get_number(word2);
|
numDemos = (UINT8)get_number(word2);
|
||||||
|
titlechanged = true;
|
||||||
}
|
}
|
||||||
else if (fastcmp(word, "DEMODELAYTIME"))
|
else if (fastcmp(word, "DEMODELAYTIME"))
|
||||||
{
|
{
|
||||||
demoDelayTime = get_number(word2);
|
demoDelayTime = get_number(word2);
|
||||||
|
titlechanged = true;
|
||||||
}
|
}
|
||||||
else if (fastcmp(word, "DEMOIDLETIME"))
|
else if (fastcmp(word, "DEMOIDLETIME"))
|
||||||
{
|
{
|
||||||
demoIdleTime = get_number(word2);
|
demoIdleTime = get_number(word2);
|
||||||
|
titlechanged = true;
|
||||||
}
|
}
|
||||||
else if (fastcmp(word, "USE1UPSOUND"))
|
else if (fastcmp(word, "USE1UPSOUND"))
|
||||||
{
|
{
|
||||||
|
@ -2731,14 +2760,32 @@ static void readmaincfg(MYFILE *f)
|
||||||
strlcat(savegamename, "%u.ssg", sizeof(savegamename));
|
strlcat(savegamename, "%u.ssg", sizeof(savegamename));
|
||||||
|
|
||||||
gamedataadded = true;
|
gamedataadded = true;
|
||||||
|
titlechanged = true;
|
||||||
}
|
}
|
||||||
else if (fastcmp(word, "RESETDATA"))
|
else if (fastcmp(word, "RESETDATA"))
|
||||||
{
|
{
|
||||||
P_ResetData(value);
|
P_ResetData(value);
|
||||||
|
titlechanged = true;
|
||||||
}
|
}
|
||||||
else if (fastcmp(word, "CUSTOMVERSION"))
|
else if (fastcmp(word, "CUSTOMVERSION"))
|
||||||
{
|
{
|
||||||
strlcpy(customversionstring, word2, sizeof (customversionstring));
|
strlcpy(customversionstring, word2, sizeof (customversionstring));
|
||||||
|
//titlechanged = true;
|
||||||
|
}
|
||||||
|
else if (fastcmp(word, "BOOTMAP"))
|
||||||
|
{
|
||||||
|
// Support using the actual map name,
|
||||||
|
// i.e., Level AB, Level FZ, etc.
|
||||||
|
|
||||||
|
// Convert to map number
|
||||||
|
if (word2[0] >= 'A' && word2[0] <= 'Z')
|
||||||
|
value = M_MapNumber(word2[0], word2[1]);
|
||||||
|
else
|
||||||
|
value = get_number(word2);
|
||||||
|
|
||||||
|
DEH_WriteUndoline(word, va("%d", bootmap), UNDO_NONE);
|
||||||
|
bootmap = (INT16)value;
|
||||||
|
//titlechanged = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
deh_warning("Maincfg: unknown word '%s'", word);
|
deh_warning("Maincfg: unknown word '%s'", word);
|
||||||
|
@ -2935,7 +2982,7 @@ static void DEH_LoadDehackedFile(MYFILE *f)
|
||||||
|
|
||||||
deh_num_warning = 0;
|
deh_num_warning = 0;
|
||||||
|
|
||||||
gamedataadded = false;
|
gamedataadded = titlechanged = introchanged = false;
|
||||||
|
|
||||||
// it doesn't test the version of SRB2 and version of dehacked file
|
// it doesn't test the version of SRB2 and version of dehacked file
|
||||||
dbg_line = -1; // start at -1 so the first line is 0.
|
dbg_line = -1; // start at -1 so the first line is 0.
|
||||||
|
@ -3236,6 +3283,14 @@ static void DEH_LoadDehackedFile(MYFILE *f)
|
||||||
if (gamedataadded)
|
if (gamedataadded)
|
||||||
G_LoadGameData();
|
G_LoadGameData();
|
||||||
|
|
||||||
|
if (gamestate == GS_TITLESCREEN)
|
||||||
|
{
|
||||||
|
if (introchanged)
|
||||||
|
COM_BufAddText("playintro");
|
||||||
|
else if (titlechanged)
|
||||||
|
COM_BufAddText("exitgame"); // Command_ExitGame_f() but delayed
|
||||||
|
}
|
||||||
|
|
||||||
dbg_line = -1;
|
dbg_line = -1;
|
||||||
if (deh_num_warning)
|
if (deh_num_warning)
|
||||||
{
|
{
|
||||||
|
@ -8119,6 +8174,12 @@ static inline int lib_getenum(lua_State *L)
|
||||||
} else if (fastcmp(word,"paused")) {
|
} else if (fastcmp(word,"paused")) {
|
||||||
lua_pushboolean(L, paused);
|
lua_pushboolean(L, paused);
|
||||||
return 1;
|
return 1;
|
||||||
|
} else if (fastcmp(word,"titlemap")) {
|
||||||
|
lua_pushinteger(L, titlemap);
|
||||||
|
return 1;
|
||||||
|
} else if (fastcmp(word,"titlemapinaction")) {
|
||||||
|
lua_pushboolean(L, (titlemapinaction != TITLEMAP_OFF));
|
||||||
|
return 1;
|
||||||
} else if (fastcmp(word,"gametype")) {
|
} else if (fastcmp(word,"gametype")) {
|
||||||
lua_pushinteger(L, gametype);
|
lua_pushinteger(L, gametype);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -125,6 +125,10 @@ extern INT16 spstage_start;
|
||||||
extern INT16 sstage_start;
|
extern INT16 sstage_start;
|
||||||
extern INT16 sstage_end;
|
extern INT16 sstage_end;
|
||||||
|
|
||||||
|
extern INT16 titlemap;
|
||||||
|
extern boolean hidetitlepics;
|
||||||
|
extern INT16 bootmap; //bootmap for loading a map on startup
|
||||||
|
|
||||||
extern boolean looptitle;
|
extern boolean looptitle;
|
||||||
extern boolean useNightsSS;
|
extern boolean useNightsSS;
|
||||||
|
|
||||||
|
|
140
src/f_finale.c
140
src/f_finale.c
|
@ -31,11 +31,18 @@
|
||||||
#include "m_random.h"
|
#include "m_random.h"
|
||||||
#include "y_inter.h"
|
#include "y_inter.h"
|
||||||
#include "m_cond.h"
|
#include "m_cond.h"
|
||||||
|
#include "p_local.h"
|
||||||
|
#include "p_setup.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
#include "lua_hud.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
// Stage of animation:
|
// Stage of animation:
|
||||||
// 0 = text, 1 = art screen
|
// 0 = text, 1 = art screen
|
||||||
static INT32 finalecount;
|
static INT32 finalecount;
|
||||||
INT32 titlescrollspeed = 80;
|
INT32 titlescrollspeed = 80;
|
||||||
|
UINT8 titlemapinaction = TITLEMAP_OFF;
|
||||||
|
|
||||||
static INT32 timetonext; // Delay between screen changes
|
static INT32 timetonext; // Delay between screen changes
|
||||||
static INT32 continuetime; // Short delay when continuing
|
static INT32 continuetime; // Short delay when continuing
|
||||||
|
@ -217,17 +224,19 @@ static void F_SkyScroll(INT32 scrollspeed)
|
||||||
{
|
{
|
||||||
INT32 scrolled, x, mx, fakedwidth;
|
INT32 scrolled, x, mx, fakedwidth;
|
||||||
patch_t *pat;
|
patch_t *pat;
|
||||||
|
INT16 patwidth;
|
||||||
|
|
||||||
pat = W_CachePatchName("TITLESKY", PU_CACHE);
|
pat = W_CachePatchName("TITLESKY", PU_CACHE);
|
||||||
|
|
||||||
animtimer = ((finalecount*scrollspeed)/16) % SHORT(pat->width);
|
patwidth = SHORT(pat->width);
|
||||||
|
animtimer = ((finalecount*scrollspeed)/16 + patwidth) % patwidth;
|
||||||
|
|
||||||
fakedwidth = vid.width / vid.dupx;
|
fakedwidth = vid.width / vid.dupx;
|
||||||
|
|
||||||
if (rendermode == render_soft)
|
if (rendermode == render_soft)
|
||||||
{ // if only hardware rendering could be this elegant and complete
|
{ // if only hardware rendering could be this elegant and complete
|
||||||
scrolled = (SHORT(pat->width) - animtimer) - 1;
|
scrolled = (patwidth - animtimer) - 1;
|
||||||
for (x = 0, mx = scrolled; x < fakedwidth; x++, mx = (mx+1)%SHORT(pat->width))
|
for (x = 0, mx = scrolled; x < fakedwidth; x++, mx = (mx+1)%patwidth)
|
||||||
F_DrawPatchCol(x, pat, mx);
|
F_DrawPatchCol(x, pat, mx);
|
||||||
}
|
}
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
|
@ -235,8 +244,8 @@ static void F_SkyScroll(INT32 scrollspeed)
|
||||||
{ // if only software rendering could be this simple and retarded
|
{ // if only software rendering could be this simple and retarded
|
||||||
scrolled = animtimer;
|
scrolled = animtimer;
|
||||||
if (scrolled > 0)
|
if (scrolled > 0)
|
||||||
V_DrawScaledPatch(scrolled - SHORT(pat->width), 0, 0, pat);
|
V_DrawScaledPatch(scrolled - patwidth, 0, 0, pat);
|
||||||
for (x = 0; x < fakedwidth; x += SHORT(pat->width))
|
for (x = 0; x < fakedwidth; x += patwidth)
|
||||||
V_DrawScaledPatch(x + scrolled, 0, 0, pat);
|
V_DrawScaledPatch(x + scrolled, 0, 0, pat);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -278,6 +287,8 @@ void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean reset
|
||||||
|
|
||||||
void F_StartIntro(void)
|
void F_StartIntro(void)
|
||||||
{
|
{
|
||||||
|
S_StopMusic();
|
||||||
|
|
||||||
if (introtoplay)
|
if (introtoplay)
|
||||||
{
|
{
|
||||||
if (!cutscenes[introtoplay - 1])
|
if (!cutscenes[introtoplay - 1])
|
||||||
|
@ -998,7 +1009,7 @@ static const char *credits[] = {
|
||||||
"",
|
"",
|
||||||
"\1Sprite Artists",
|
"\1Sprite Artists",
|
||||||
"Odi \"Iceman404\" Atunzu",
|
"Odi \"Iceman404\" Atunzu",
|
||||||
"Victor \"VAdaPEGA\" Ara\x1Fjo", // Araújo -- sorry for our limited font! D:
|
"Victor \"VAdaPEGA\" Ara\x1Fjo", // Araújo -- sorry for our limited font! D:
|
||||||
"Jim \"MotorRoach\" DeMello",
|
"Jim \"MotorRoach\" DeMello",
|
||||||
"Desmond \"Blade\" DesJardins",
|
"Desmond \"Blade\" DesJardins",
|
||||||
"Sherman \"CoatRack\" DesJardins",
|
"Sherman \"CoatRack\" DesJardins",
|
||||||
|
@ -1415,17 +1426,72 @@ void F_GameEndTicker(void)
|
||||||
// ==============
|
// ==============
|
||||||
void F_StartTitleScreen(void)
|
void F_StartTitleScreen(void)
|
||||||
{
|
{
|
||||||
|
S_ChangeMusicInternal("_title", looptitle);
|
||||||
|
|
||||||
if (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS)
|
if (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS)
|
||||||
finalecount = 0;
|
finalecount = 0;
|
||||||
else
|
else
|
||||||
wipegamestate = GS_TITLESCREEN;
|
wipegamestate = GS_TITLESCREEN;
|
||||||
|
|
||||||
|
if (titlemap)
|
||||||
|
{
|
||||||
|
mapthing_t *startpos;
|
||||||
|
|
||||||
|
gamestate_t prevwipegamestate = wipegamestate;
|
||||||
|
titlemapinaction = TITLEMAP_LOADING;
|
||||||
|
gamemap = titlemap;
|
||||||
|
|
||||||
|
if (!mapheaderinfo[gamemap-1])
|
||||||
|
P_AllocMapHeader(gamemap-1);
|
||||||
|
|
||||||
|
maptol = mapheaderinfo[gamemap-1]->typeoflevel;
|
||||||
|
globalweather = mapheaderinfo[gamemap-1]->weather;
|
||||||
|
|
||||||
|
G_DoLoadLevel(true);
|
||||||
|
if (!titlemap)
|
||||||
|
return;
|
||||||
|
|
||||||
|
players[displayplayer].playerstate = PST_DEAD; // Don't spawn the player in dummy (I'm still a filthy cheater)
|
||||||
|
|
||||||
|
// Set Default Position
|
||||||
|
if (playerstarts[0])
|
||||||
|
startpos = playerstarts[0];
|
||||||
|
else if (deathmatchstarts[0])
|
||||||
|
startpos = deathmatchstarts[0];
|
||||||
|
else
|
||||||
|
startpos = NULL;
|
||||||
|
|
||||||
|
if (startpos)
|
||||||
|
{
|
||||||
|
camera.x = startpos->x << FRACBITS;
|
||||||
|
camera.y = startpos->y << FRACBITS;
|
||||||
|
camera.subsector = R_PointInSubsector(camera.x, camera.y);
|
||||||
|
camera.z = camera.subsector->sector->floorheight + ((startpos->options >> ZSHIFT) << FRACBITS);
|
||||||
|
camera.angle = (startpos->angle % 360)*ANG1;
|
||||||
|
camera.aiming = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
camera.x = camera.y = camera.z = camera.angle = camera.aiming = 0;
|
||||||
|
camera.subsector = NULL; // toast is filthy too
|
||||||
|
}
|
||||||
|
|
||||||
|
camera.chase = true;
|
||||||
|
camera.height = 0;
|
||||||
|
|
||||||
|
wipegamestate = prevwipegamestate;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
titlemapinaction = TITLEMAP_OFF;
|
||||||
|
gamemap = 1; // g_game.c
|
||||||
|
CON_ClearHUD();
|
||||||
|
}
|
||||||
|
|
||||||
G_SetGamestate(GS_TITLESCREEN);
|
G_SetGamestate(GS_TITLESCREEN);
|
||||||
CON_ClearHUD();
|
|
||||||
|
|
||||||
// IWAD dependent stuff.
|
// IWAD dependent stuff.
|
||||||
|
|
||||||
S_ChangeMusicInternal("_title", looptitle);
|
|
||||||
|
|
||||||
animtimer = 0;
|
animtimer = 0;
|
||||||
|
|
||||||
demoDelayLeft = demoDelayTime;
|
demoDelayLeft = demoDelayTime;
|
||||||
|
@ -1455,12 +1521,21 @@ void F_TitleScreenDrawer(void)
|
||||||
return; // We likely came here from retrying. Don't do a damn thing.
|
return; // We likely came here from retrying. Don't do a damn thing.
|
||||||
|
|
||||||
// Draw that sky!
|
// Draw that sky!
|
||||||
F_SkyScroll(titlescrollspeed);
|
if (!titlemapinaction)
|
||||||
|
F_SkyScroll(titlescrollspeed);
|
||||||
|
|
||||||
// Don't draw outside of the title screewn, or if the patch isn't there.
|
// Don't draw outside of the title screewn, or if the patch isn't there.
|
||||||
if (!ttwing || (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS))
|
if (!ttwing || (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// rei|miru: use title pics?
|
||||||
|
if (hidetitlepics)
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
goto luahook;
|
||||||
|
#else
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
V_DrawScaledPatch(30, 14, 0, ttwing);
|
V_DrawScaledPatch(30, 14, 0, ttwing);
|
||||||
|
|
||||||
if (finalecount < 57)
|
if (finalecount < 57)
|
||||||
|
@ -1497,6 +1572,11 @@ void F_TitleScreenDrawer(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
V_DrawScaledPatch(48, 142, 0,ttbanner);
|
V_DrawScaledPatch(48, 142, 0,ttbanner);
|
||||||
|
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
luahook:
|
||||||
|
LUAh_TitleHUD();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// (no longer) De-Demo'd Title Screen
|
// (no longer) De-Demo'd Title Screen
|
||||||
|
@ -1509,6 +1589,46 @@ void F_TitleScreenTicker(boolean run)
|
||||||
if (gameaction != ga_nothing || gamestate != GS_TITLESCREEN)
|
if (gameaction != ga_nothing || gamestate != GS_TITLESCREEN)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Execute the titlemap camera settings
|
||||||
|
if (titlemapinaction)
|
||||||
|
{
|
||||||
|
thinker_t *th;
|
||||||
|
mobj_t *mo2;
|
||||||
|
mobj_t *cameraref = NULL;
|
||||||
|
|
||||||
|
for (th = thinkercap.next; th != &thinkercap; th = th->next)
|
||||||
|
{
|
||||||
|
if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker
|
||||||
|
continue;
|
||||||
|
|
||||||
|
mo2 = (mobj_t *)th;
|
||||||
|
|
||||||
|
if (!mo2)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (mo2->type != MT_ALTVIEWMAN)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
cameraref = mo2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cameraref)
|
||||||
|
{
|
||||||
|
camera.x = cameraref->x;
|
||||||
|
camera.y = cameraref->y;
|
||||||
|
camera.z = cameraref->z;
|
||||||
|
camera.angle = cameraref->angle;
|
||||||
|
camera.aiming = cameraref->cusval;
|
||||||
|
camera.subsector = cameraref->subsector;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Default behavior: Do a lil' camera spin if a title map is loaded;
|
||||||
|
camera.angle += titlescrollspeed*ANG1/64;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// no demos to play? or, are they disabled?
|
// no demos to play? or, are they disabled?
|
||||||
if (!cv_rollingdemos.value || !numDemos)
|
if (!cv_rollingdemos.value || !numDemos)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -62,6 +62,15 @@ void F_ContinueDrawer(void);
|
||||||
|
|
||||||
extern INT32 titlescrollspeed;
|
extern INT32 titlescrollspeed;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
TITLEMAP_OFF = 0,
|
||||||
|
TITLEMAP_LOADING,
|
||||||
|
TITLEMAP_RUNNING
|
||||||
|
} titlemap_enum;
|
||||||
|
|
||||||
|
extern UINT8 titlemapinaction;
|
||||||
|
|
||||||
//
|
//
|
||||||
// WIPE
|
// WIPE
|
||||||
//
|
//
|
||||||
|
|
22
src/g_game.c
22
src/g_game.c
|
@ -121,6 +121,10 @@ INT16 spstage_start;
|
||||||
INT16 sstage_start;
|
INT16 sstage_start;
|
||||||
INT16 sstage_end;
|
INT16 sstage_end;
|
||||||
|
|
||||||
|
INT16 titlemap = 0;
|
||||||
|
boolean hidetitlepics = false;
|
||||||
|
INT16 bootmap; //bootmap for loading a map on startup
|
||||||
|
|
||||||
boolean looptitle = false;
|
boolean looptitle = false;
|
||||||
boolean useNightsSS = false;
|
boolean useNightsSS = false;
|
||||||
|
|
||||||
|
@ -1633,6 +1637,21 @@ void G_DoLoadLevel(boolean resetplayer)
|
||||||
if (gamestate == GS_INTERMISSION)
|
if (gamestate == GS_INTERMISSION)
|
||||||
Y_EndIntermission();
|
Y_EndIntermission();
|
||||||
|
|
||||||
|
// cleanup
|
||||||
|
if (titlemapinaction == TITLEMAP_LOADING)
|
||||||
|
{
|
||||||
|
if (W_CheckNumForName(G_BuildMapName(gamemap)) == LUMPERROR)
|
||||||
|
{
|
||||||
|
titlemap = 0; // let's not infinite recursion ok
|
||||||
|
Command_ExitGame_f();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
titlemapinaction = TITLEMAP_RUNNING;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
titlemapinaction = TITLEMAP_OFF;
|
||||||
|
|
||||||
G_SetGamestate(GS_LEVEL);
|
G_SetGamestate(GS_LEVEL);
|
||||||
|
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
|
@ -1642,7 +1661,7 @@ void G_DoLoadLevel(boolean resetplayer)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup the level.
|
// Setup the level.
|
||||||
if (!P_SetupLevel(false))
|
if (!P_SetupLevel(false)) // this never returns false?
|
||||||
{
|
{
|
||||||
// fail so reset game stuff
|
// fail so reset game stuff
|
||||||
Command_ExitGame_f();
|
Command_ExitGame_f();
|
||||||
|
@ -1991,6 +2010,7 @@ void G_Ticker(boolean run)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GS_TITLESCREEN:
|
case GS_TITLESCREEN:
|
||||||
|
if (titlemapinaction) P_Ticker(run); // then intentionally fall through
|
||||||
case GS_WAITINGPLAYERS:
|
case GS_WAITINGPLAYERS:
|
||||||
F_TitleScreenTicker(run);
|
F_TitleScreenTicker(run);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -42,3 +42,4 @@ boolean LUA_HudEnabled(enum hud option);
|
||||||
|
|
||||||
void LUAh_GameHUD(player_t *stplyr);
|
void LUAh_GameHUD(player_t *stplyr);
|
||||||
void LUAh_ScoresHUD(void);
|
void LUAh_ScoresHUD(void);
|
||||||
|
void LUAh_TitleHUD(void);
|
||||||
|
|
|
@ -88,11 +88,13 @@ static const char *const patch_opt[] = {
|
||||||
|
|
||||||
enum hudhook {
|
enum hudhook {
|
||||||
hudhook_game = 0,
|
hudhook_game = 0,
|
||||||
hudhook_scores
|
hudhook_scores,
|
||||||
|
hudhook_title
|
||||||
};
|
};
|
||||||
static const char *const hudhook_opt[] = {
|
static const char *const hudhook_opt[] = {
|
||||||
"game",
|
"game",
|
||||||
"scores",
|
"scores",
|
||||||
|
"title",
|
||||||
NULL};
|
NULL};
|
||||||
|
|
||||||
// alignment types for v.drawString
|
// alignment types for v.drawString
|
||||||
|
@ -808,6 +810,9 @@ int LUA_HudLib(lua_State *L)
|
||||||
|
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
lua_rawseti(L, -2, 3); // HUD[2] = scores rendering functions array
|
lua_rawseti(L, -2, 3); // HUD[2] = scores rendering functions array
|
||||||
|
|
||||||
|
lua_newtable(L);
|
||||||
|
lua_rawseti(L, -2, 4); // HUD[3] = title rendering functions array
|
||||||
lua_setfield(L, LUA_REGISTRYINDEX, "HUD");
|
lua_setfield(L, LUA_REGISTRYINDEX, "HUD");
|
||||||
|
|
||||||
luaL_newmetatable(L, META_HUDINFO);
|
luaL_newmetatable(L, META_HUDINFO);
|
||||||
|
@ -920,4 +925,29 @@ void LUAh_ScoresHUD(void)
|
||||||
hud_running = false;
|
hud_running = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LUAh_TitleHUD(void)
|
||||||
|
{
|
||||||
|
if (!gL || !(hudAvailable & (1<<hudhook_title)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
hud_running = true;
|
||||||
|
lua_pop(gL, -1);
|
||||||
|
|
||||||
|
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
||||||
|
I_Assert(lua_istable(gL, -1));
|
||||||
|
lua_rawgeti(gL, -1, 4); // HUD[4] = rendering funcs
|
||||||
|
I_Assert(lua_istable(gL, -1));
|
||||||
|
|
||||||
|
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
||||||
|
I_Assert(lua_istable(gL, -1));
|
||||||
|
lua_remove(gL, -3); // pop HUD
|
||||||
|
lua_pushnil(gL);
|
||||||
|
while (lua_next(gL, -3) != 0) {
|
||||||
|
lua_pushvalue(gL, -3); // graphics library (HUD[1])
|
||||||
|
LUA_Call(gL, 1);
|
||||||
|
}
|
||||||
|
lua_pop(gL, -1);
|
||||||
|
hud_running = false;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
#include "p_slopes.h"
|
#include "p_slopes.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "f_finale.h"
|
||||||
|
|
||||||
// protos.
|
// protos.
|
||||||
static CV_PossibleValue_t viewheight_cons_t[] = {{16, "MIN"}, {56, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t viewheight_cons_t[] = {{16, "MIN"}, {56, "MAX"}, {0, NULL}};
|
||||||
|
@ -8415,6 +8416,9 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
||||||
#endif
|
#endif
|
||||||
switch (mobj->type)
|
switch (mobj->type)
|
||||||
{
|
{
|
||||||
|
case MT_ALTVIEWMAN:
|
||||||
|
if (titlemapinaction) mobj->flags &= ~MF_NOTHINK;
|
||||||
|
break;
|
||||||
case MT_CYBRAKDEMON_NAPALM_BOMB_LARGE:
|
case MT_CYBRAKDEMON_NAPALM_BOMB_LARGE:
|
||||||
mobj->fuse = mobj->info->mass;
|
mobj->fuse = mobj->info->mass;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -2667,7 +2667,9 @@ boolean P_SetupLevel(boolean skipprecip)
|
||||||
|
|
||||||
// As oddly named as this is, this handles music only.
|
// As oddly named as this is, this handles music only.
|
||||||
// We should be fine starting it here.
|
// We should be fine starting it here.
|
||||||
S_Start();
|
/// ... as long as this isn't a titlemap transition, that is
|
||||||
|
if (!titlemapinaction)
|
||||||
|
S_Start();
|
||||||
|
|
||||||
// Let's fade to black here
|
// Let's fade to black here
|
||||||
// But only if we didn't do the special stage wipe
|
// But only if we didn't do the special stage wipe
|
||||||
|
@ -2681,7 +2683,7 @@ boolean P_SetupLevel(boolean skipprecip)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print "SPEEDING OFF TO [ZONE] [ACT 1]..."
|
// Print "SPEEDING OFF TO [ZONE] [ACT 1]..."
|
||||||
if (rendermode != render_none)
|
if (!titlemapinaction && rendermode != render_none)
|
||||||
{
|
{
|
||||||
// Don't include these in the fade!
|
// Don't include these in the fade!
|
||||||
char tx[64];
|
char tx[64];
|
||||||
|
|
|
@ -165,7 +165,7 @@ fixed_t P_ReturnThrustY(mobj_t *mo, angle_t angle, fixed_t move)
|
||||||
boolean P_AutoPause(void)
|
boolean P_AutoPause(void)
|
||||||
{
|
{
|
||||||
// Don't pause even on menu-up or focus-lost in netgames or record attack
|
// Don't pause even on menu-up or focus-lost in netgames or record attack
|
||||||
if (netgame || modeattacking)
|
if (netgame || modeattacking || gamestate == GS_TITLESCREEN)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return (menuactive || window_notinfocus);
|
return (menuactive || window_notinfocus);
|
||||||
|
|
|
@ -914,7 +914,7 @@ void R_SetupFrame(player_t *player, boolean skybox)
|
||||||
chasecam = (cv_chasecam.value != 0);
|
chasecam = (cv_chasecam.value != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player->climbing || (player->powers[pw_carry] == CR_NIGHTSMODE) || player->playerstate == PST_DEAD)
|
if (player->climbing || (player->powers[pw_carry] == CR_NIGHTSMODE) || player->playerstate == PST_DEAD || gamestate == GS_TITLESCREEN)
|
||||||
chasecam = true; // force chasecam on
|
chasecam = true; // force chasecam on
|
||||||
else if (player->spectator) // no spectator chasecam
|
else if (player->spectator) // no spectator chasecam
|
||||||
chasecam = false; // force chasecam off
|
chasecam = false; // force chasecam off
|
||||||
|
|
|
@ -64,10 +64,6 @@ void R_SetupSkyDraw(void)
|
||||||
// the horizon line in a 256x128 sky texture
|
// the horizon line in a 256x128 sky texture
|
||||||
skytexturemid = (textures[skytexture]->height/2)<<FRACBITS;
|
skytexturemid = (textures[skytexture]->height/2)<<FRACBITS;
|
||||||
|
|
||||||
// get the right drawer, it was set by screen.c, depending on the
|
|
||||||
// current video mode bytes per pixel (quick fix)
|
|
||||||
wallcolfunc = walldrawerfunc;
|
|
||||||
|
|
||||||
R_SetSkyScale();
|
R_SetSkyScale();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -173,6 +173,9 @@ void SCR_SetMode(void)
|
||||||
if (SCR_IsAspectCorrect(vid.width, vid.height))
|
if (SCR_IsAspectCorrect(vid.width, vid.height))
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("Resolution is not aspect-correct!\nUse a multiple of %dx%d\n"), BASEVIDWIDTH, BASEVIDHEIGHT);
|
CONS_Alert(CONS_WARNING, M_GetText("Resolution is not aspect-correct!\nUse a multiple of %dx%d\n"), BASEVIDWIDTH, BASEVIDHEIGHT);
|
||||||
#endif*/
|
#endif*/
|
||||||
|
|
||||||
|
wallcolfunc = walldrawerfunc;
|
||||||
|
|
||||||
// set the apprpriate drawer for the sky (tall or INT16)
|
// set the apprpriate drawer for the sky (tall or INT16)
|
||||||
setmodeneeded = 0;
|
setmodeneeded = 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue