From f7cc62d9d98ba28d2a5c6032a050f311b460db10 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Thu, 15 Nov 2018 15:51:29 -0500 Subject: [PATCH 01/50] Define menu enum, encode hierachy by number places --- src/m_menu.h | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/src/m_menu.h b/src/m_menu.h index ad32de1b1..e5d508d7f 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -22,6 +22,99 @@ // // MENUS // + +// Menu IDs sectioned by numeric places to signify hierarchy +typedef enum +{ + MM_NONE = 0, + + MM_MAIN = 10000, + + // Single Player + MM_SP_MAIN = 11000, + + MM_SP_LOAD = 11100, + MM_SP_PLAYER = 11110, + + MM_SP_LEVELSELECT = 11200, + MM_SP_LEVELSTATS = 11300, + + MM_SP_TIMEATTACK = 11400, + MM_SP_GUESTREPLAY = 11410, + MM_SP_REPLAY = 11420, + MM_SP_GHOST = 11430, + + MM_SP_NIGHTSATTACK = 11500, + MM_SP_NIGHTS_GUESTREPLAY = 11510, + MM_SP_NIGHTS_REPLAY = 11520, + MM_SP_NIGHTS_GHOST = 11530, + + // Multiplayer + MM_MP_MAIN = 12000, + MM_MP_SPLITSCREEN = 12100, // SplitServer + MM_MP_SPLIT_PLAYERSETUP = 12110, // MP_PlayerSetupDef for #defined NONET + MM_MP_SERVER = 12200, + MM_MP_CONNECT = 12300, + MM_MP_ROOM = 12400, + MM_MP_PLAYERSETUP = 12500, // MP_PlayerSetupDef shared with SPLITSCREEN if #defined NONET + + // Options + MM_OP_MAIN = 13000, + + MM_OP_P1CONTROLS = 13100, + MM_OP_P1CONTROLCHANGE = 13110, // OP_ChangeControlsDef shared with P2 + MM_OP_P1MOUSE = 13120, + MM_OP_P1JOYSTICK = 13130, + MM_OP_P1JOYSTICKSET = 13131, // OP_JoystickSetDef shared with P2 + + MM_OP_P2CONTROLS = 13200, + MM_OP_P2CONTROLCHANGE = 13120, + MM_OP_P2MOUSE = 13220, + MM_OP_P2JOYSTICK = 13230, + MM_OP_P2JOYSTICKSET = 13231, + + MM_OP_VIDEO = 13300, + MM_OP_VIDEOMODE = 13310, + MM_OP_COLOR = 13320, + MM_OP_OPENGL = 13330, + MM_OP_OPENGL_LIGHTING = 13331, + MM_OP_OPENGL_FOG = 13332, + MM_OP_OPENGL_COLOR = 13333, + + MM_OP_SOUND = 13400, + + MM_OP_SERVER = 13500, + MM_OP_MONITORTOGGLE = 13510, + + MM_OP_DATA = 13600, + MM_OP_ADDONS = 13610, + MM_OP_SCREENSHOTS = 13620, + MM_OP_ERASEDATA = 13630, + + // Secrets + MM_SR_MAIN = 14000, + MM_SR_PANDORA = 14100, + MM_SR_LEVELSELECT = 14200, + MM_SR_UNLOCKCHECKLIST = 14300, + MM_SR_EMBLEMHINT = 14400, + + // Addons (Part of MISC, but let's make it our own) + MM_AD_MAIN = 15000 + + // MISC + MM_MESSAGE = 20000, + MM_SPAUSE = 30000, + + MM_MPAUSE = 40000, + MM_SCRAMBLETEAM = 41000, + MM_CHANGETEAM = 42000, + MM_CHANGELEVEL = 43000, + + MM_MAPAUSE = 50000, + MM_HELP = 60000 +} menutype_t; + + // Called by main loop, // saves config file and calls I_Quit when user exits. // Even when the menu is not displayed, From c8f5aa688a9f9c515d7e91e21bd608007ffbf51a Mon Sep 17 00:00:00 2001 From: mazmazz Date: Thu, 15 Nov 2018 16:05:09 -0500 Subject: [PATCH 02/50] Express menu defs as flags --- src/m_menu.h | 146 ++++++++++++++++++++++++++------------------------- 1 file changed, 75 insertions(+), 71 deletions(-) diff --git a/src/m_menu.h b/src/m_menu.h index e5d508d7f..b649d9420 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -26,93 +26,97 @@ // Menu IDs sectioned by numeric places to signify hierarchy typedef enum { - MM_NONE = 0, - - MM_MAIN = 10000, + MM_MAIN = 1, // Single Player - MM_SP_MAIN = 11000, + MM_SP_MAIN = 1<<1, - MM_SP_LOAD = 11100, - MM_SP_PLAYER = 11110, + MM_SP_LOAD = 1<<2, + MM_SP_PLAYER = 1<<3, - MM_SP_LEVELSELECT = 11200, - MM_SP_LEVELSTATS = 11300, + MM_SP_LEVELSELECT = 1<<4, + MM_SP_LEVELSTATS = 1<<5, - MM_SP_TIMEATTACK = 11400, - MM_SP_GUESTREPLAY = 11410, - MM_SP_REPLAY = 11420, - MM_SP_GHOST = 11430, + MM_SP_TIMEATTACK = 1<<6, + MM_SP_TIMEATTACK_LEVELSELECT = 1<<7, + MM_SP_GUESTREPLAY = 1<<8, + MM_SP_REPLAY = 1<<9, + MM_SP_GHOST = 1<<10, - MM_SP_NIGHTSATTACK = 11500, - MM_SP_NIGHTS_GUESTREPLAY = 11510, - MM_SP_NIGHTS_REPLAY = 11520, - MM_SP_NIGHTS_GHOST = 11530, + MM_SP_NIGHTSATTACK = 1<<11, + MM_SP_NIGHTSATTACK_LEVELSELECT = 1<<12, + MM_SP_NIGHTS_GUESTREPLAY = 1<<13, + MM_SP_NIGHTS_REPLAY = 1<<14, + MM_SP_NIGHTS_GHOST = 1<<15, // Multiplayer - MM_MP_MAIN = 12000, - MM_MP_SPLITSCREEN = 12100, // SplitServer - MM_MP_SPLIT_PLAYERSETUP = 12110, // MP_PlayerSetupDef for #defined NONET - MM_MP_SERVER = 12200, - MM_MP_CONNECT = 12300, - MM_MP_ROOM = 12400, - MM_MP_PLAYERSETUP = 12500, // MP_PlayerSetupDef shared with SPLITSCREEN if #defined NONET - - // Options - MM_OP_MAIN = 13000, - - MM_OP_P1CONTROLS = 13100, - MM_OP_P1CONTROLCHANGE = 13110, // OP_ChangeControlsDef shared with P2 - MM_OP_P1MOUSE = 13120, - MM_OP_P1JOYSTICK = 13130, - MM_OP_P1JOYSTICKSET = 13131, // OP_JoystickSetDef shared with P2 - - MM_OP_P2CONTROLS = 13200, - MM_OP_P2CONTROLCHANGE = 13120, - MM_OP_P2MOUSE = 13220, - MM_OP_P2JOYSTICK = 13230, - MM_OP_P2JOYSTICKSET = 13231, - - MM_OP_VIDEO = 13300, - MM_OP_VIDEOMODE = 13310, - MM_OP_COLOR = 13320, - MM_OP_OPENGL = 13330, - MM_OP_OPENGL_LIGHTING = 13331, - MM_OP_OPENGL_FOG = 13332, - MM_OP_OPENGL_COLOR = 13333, - - MM_OP_SOUND = 13400, - - MM_OP_SERVER = 13500, - MM_OP_MONITORTOGGLE = 13510, - - MM_OP_DATA = 13600, - MM_OP_ADDONS = 13610, - MM_OP_SCREENSHOTS = 13620, - MM_OP_ERASEDATA = 13630, + MM_MP_MAIN = 1<<16, + MM_MP_SPLITSCREEN = 1<<17, // SplitServer + MM_MP_SERVER = 1<<18, + MM_MP_CONNECT = 1<<19, + MM_MP_ROOM = 1<<20, + MM_MP_PLAYERSETUP = 1<<21, // MP_PlayerSetupDef shared with SPLITSCREEN if #defined NONET // Secrets - MM_SR_MAIN = 14000, - MM_SR_PANDORA = 14100, - MM_SR_LEVELSELECT = 14200, - MM_SR_UNLOCKCHECKLIST = 14300, - MM_SR_EMBLEMHINT = 14400, + MM_SR_MAIN = 1<<22, + MM_SR_PANDORA = 1<<23, + MM_SR_LEVELSELECT = 1<<24, + MM_SR_UNLOCKCHECKLIST = 1<<25, + MM_SR_EMBLEMHINT = 1<<26, // Addons (Part of MISC, but let's make it our own) - MM_AD_MAIN = 15000 + MM_AD_MAIN = 1<<27, + + MM_ALL = 1<<28, // MISC - MM_MESSAGE = 20000, - MM_SPAUSE = 30000, + // MM_MESSAGE = 20000, + // MM_SPAUSE = 30000, - MM_MPAUSE = 40000, - MM_SCRAMBLETEAM = 41000, - MM_CHANGETEAM = 42000, - MM_CHANGELEVEL = 43000, + // MM_MPAUSE = 40000, + // MM_SCRAMBLETEAM = 41000, + // MM_CHANGETEAM = 42000, + // MM_CHANGELEVEL = 43000, - MM_MAPAUSE = 50000, - MM_HELP = 60000 -} menutype_t; + // MM_MAPAUSE = 50000, + // MM_HELP = 60000 +} menutype_t; // up to 1<<31 + +typedef enum +{ + // Options + MM2_OP_MAIN = 1, + + MM2_OP_P1CONTROLS = 1<<1, + MM2_OP_CHANGECONTROLS = 1<<2, // OP_ChangeControlsDef shared with P2 + MM2_OP_P1MOUSE = 1<<3, + MM2_OP_P1JOYSTICK = 1<<4, + MM2_OP_JOYSTICKSET = 1<<5, // OP_JoystickSetDef shared with P2 + + MM2_OP_P2CONTROLS = 1<<6, + MM2_OP_P2MOUSE = 1<<7, + MM2_OP_P2JOYSTICK = 1<<8, + + MM2_OP_VIDEO = 1<<9, + MM2_OP_VIDEOMODE = 1<<10, + MM2_OP_COLOR = 1<<11, + MM2_OP_OPENGL = 1<<12, + MM2_OP_OPENGL_LIGHTING = 1<<13, + MM2_OP_OPENGL_FOG = 1<<14, + MM2_OP_OPENGL_COLOR = 1<<15, + + MM2_OP_SOUND = 1<<16, + + MM2_OP_SERVER = 1<<17, + MM2_OP_MONITORTOGGLE = 1<<18, + + MM2_OP_DATA = 1<<19, + MM2_OP_ADDONS = 1<<20, + MM2_OP_SCREENSHOTS = 1<<21, + MM2_OP_ERASEDATA = 1<<22, + + MM2_ALL = 1<<23 +} menutype2_t; // up to 1<<31 // Called by main loop, From 9dab65fce055599e78041833f7c4956e8b1df5c4 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Thu, 15 Nov 2018 19:41:27 -0500 Subject: [PATCH 03/50] Add MM menutype flags to menu defs --- src/m_menu.c | 110 +++++++++++++++++++++++++++++++++++++++++---------- src/m_menu.h | 26 +++++++++--- 2 files changed, 110 insertions(+), 26 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index e973cea55..a7ef7f582 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1473,10 +1473,12 @@ static menuitem_t OP_MonitorToggleMenu[] = // ========================================================================== // Main Menu and related -menu_t MainDef = CENTERMENUSTYLE(NULL, MainMenu, NULL, 72); +menu_t MainDef = CENTERMENUSTYLE(MM_MAIN, 0, NULL, MainMenu, NULL, 72); menu_t MISC_AddonsDef = { + MM_AD_MAIN, + 0, NULL, sizeof (MISC_AddonsMenu)/sizeof (menuitem_t), &MainDef, @@ -1492,12 +1494,14 @@ menu_t SPauseDef = PAUSEMENUSTYLE(SPauseMenu, 40, 72); menu_t MPauseDef = PAUSEMENUSTYLE(MPauseMenu, 40, 72); // Misc Main Menu -menu_t MISC_ScrambleTeamDef = DEFAULTMENUSTYLE(NULL, MISC_ScrambleTeamMenu, &MPauseDef, 27, 40); -menu_t MISC_ChangeTeamDef = DEFAULTMENUSTYLE(NULL, MISC_ChangeTeamMenu, &MPauseDef, 27, 40); +menu_t MISC_ScrambleTeamDef = DEFAULTMENUSTYLE(0, 0, NULL, MISC_ScrambleTeamMenu, &MPauseDef, 27, 40); +menu_t MISC_ChangeTeamDef = DEFAULTMENUSTYLE(0, 0, NULL, MISC_ChangeTeamMenu, &MPauseDef, 27, 40); // MP Gametype and map change menu menu_t MISC_ChangeLevelDef = { + 0, + 0, NULL, sizeof (MISC_ChangeLevelMenu)/sizeof (menuitem_t), &MainDef, // Doesn't matter. @@ -1513,6 +1517,8 @@ menu_t MISC_HelpDef = IMAGEDEF(MISC_HelpMenu); // Sky Room menu_t SR_PandoraDef = { + MM_SR_MAIN|MM_SR_PANDORA, + 0, "M_PANDRA", sizeof (SR_PandorasBox)/sizeof (menuitem_t), &SPauseDef, @@ -1524,6 +1530,8 @@ menu_t SR_PandoraDef = }; menu_t SR_MainDef = { + MM_SR_MAIN, + 0, "M_SECRET", sizeof (SR_MainMenu)/sizeof (menuitem_t), &MainDef, @@ -1534,10 +1542,12 @@ menu_t SR_MainDef = NULL }; -menu_t SR_LevelSelectDef = MAPPLATTERMENUSTYLE(NULL, SR_LevelSelectMenu); +menu_t SR_LevelSelectDef = MAPPLATTERMENUSTYLE(MM_SR_MAIN|MM_SR_LEVELSELECT, 0, NULL, SR_LevelSelectMenu); menu_t SR_UnlockChecklistDef = { + MM_SR_MAIN|MM_SR_UNLOCKCHECKLIST, + 0, "M_SECRET", 1, &SR_MainDef, @@ -1549,6 +1559,8 @@ menu_t SR_UnlockChecklistDef = }; menu_t SR_EmblemHintDef = { + MM_SR_MAIN|MM_SR_EMBLEMHINT, + 0, NULL, sizeof (SR_EmblemHintMenu)/sizeof (menuitem_t), &SPauseDef, @@ -1562,6 +1574,8 @@ menu_t SR_EmblemHintDef = // Single Player menu_t SP_MainDef = //CENTERMENUSTYLE(NULL, SP_MainMenu, &MainDef, 72); { + MM_SP_MAIN, + 0, NULL, sizeof(SP_MainMenu)/sizeof(menuitem_t), &MainDef, @@ -1574,6 +1588,8 @@ menu_t SP_MainDef = //CENTERMENUSTYLE(NULL, SP_MainMenu, &MainDef, 72); menu_t SP_LoadDef = { + MM_SP_MAIN|MM_SP_LOAD, + 0, "M_PICKG", 1, &SP_MainDef, @@ -1584,10 +1600,12 @@ menu_t SP_LoadDef = NULL }; -menu_t SP_LevelSelectDef = MAPPLATTERMENUSTYLE(NULL, SP_LevelSelectMenu); +menu_t SP_LevelSelectDef = MAPPLATTERMENUSTYLE(MM_SP_MAIN|MM_SP_LOAD|MM_SP_LEVELSELECT, 0, NULL, SP_LevelSelectMenu); menu_t SP_LevelStatsDef = { + MM_SP_MAIN|MM_SP_LEVELSTATS, + 0, "M_STATS", 1, &SP_MainDef, @@ -1598,10 +1616,12 @@ menu_t SP_LevelStatsDef = NULL }; -menu_t SP_TimeAttackLevelSelectDef = MAPPLATTERMENUSTYLE("M_ATTACK", SP_TimeAttackLevelSelectMenu); +menu_t SP_TimeAttackLevelSelectDef = MAPPLATTERMENUSTYLE(MM_SP_MAIN|MM_SP_TIMEATTACK|MM_SP_TIMEATTACK_LEVELSELECT, 0, "M_ATTACK", SP_TimeAttackLevelSelectMenu); static menu_t SP_TimeAttackDef = { + MM_SP_MAIN|MM_SP_TIMEATTACK, + 0, "M_ATTACK", sizeof (SP_TimeAttackMenu)/sizeof (menuitem_t), &MainDef, // Doesn't matter. @@ -1613,6 +1633,8 @@ static menu_t SP_TimeAttackDef = }; static menu_t SP_ReplayDef = { + MM_SP_MAIN|MM_SP_TIMEATTACK|MM_SP_REPLAY, + 0, "M_ATTACK", sizeof(SP_ReplayMenu)/sizeof(menuitem_t), &SP_TimeAttackDef, @@ -1624,6 +1646,8 @@ static menu_t SP_ReplayDef = }; static menu_t SP_GuestReplayDef = { + MM_SP_MAIN|MM_SP_TIMEATTACK|MM_SP_GUESTREPLAY, + 0, "M_ATTACK", sizeof(SP_GuestReplayMenu)/sizeof(menuitem_t), &SP_TimeAttackDef, @@ -1635,6 +1659,8 @@ static menu_t SP_GuestReplayDef = }; static menu_t SP_GhostDef = { + MM_SP_MAIN|MM_SP_TIMEATTACK|MM_SP_GHOST, + 0, "M_ATTACK", sizeof(SP_GhostMenu)/sizeof(menuitem_t), &SP_TimeAttackDef, @@ -1645,10 +1671,12 @@ static menu_t SP_GhostDef = NULL }; -menu_t SP_NightsAttackLevelSelectDef = MAPPLATTERMENUSTYLE("M_NIGHTS", SP_NightsAttackLevelSelectMenu); +menu_t SP_NightsAttackLevelSelectDef = MAPPLATTERMENUSTYLE(MM_SP_MAIN|MM_SP_NIGHTSATTACK|MM_SP_NIGHTSATTACK_LEVELSELECT, 0, "M_NIGHTS", SP_NightsAttackLevelSelectMenu); static menu_t SP_NightsAttackDef = { + MM_SP_MAIN|MM_SP_NIGHTSATTACK, + 0, "M_NIGHTS", sizeof (SP_NightsAttackMenu)/sizeof (menuitem_t), &MainDef, // Doesn't matter. @@ -1660,6 +1688,8 @@ static menu_t SP_NightsAttackDef = }; static menu_t SP_NightsReplayDef = { + MM_SP_MAIN|MM_SP_NIGHTSATTACK|MM_SP_NIGHTS_REPLAY, + 0, "M_NIGHTS", sizeof(SP_NightsReplayMenu)/sizeof(menuitem_t), &SP_NightsAttackDef, @@ -1671,6 +1701,8 @@ static menu_t SP_NightsReplayDef = }; static menu_t SP_NightsGuestReplayDef = { + MM_SP_MAIN|MM_SP_NIGHTSATTACK|MM_SP_NIGHTS_GUESTREPLAY, + 0, "M_NIGHTS", sizeof(SP_NightsGuestReplayMenu)/sizeof(menuitem_t), &SP_NightsAttackDef, @@ -1682,6 +1714,8 @@ static menu_t SP_NightsGuestReplayDef = }; static menu_t SP_NightsGhostDef = { + MM_SP_MAIN|MM_SP_NIGHTSATTACK|MM_SP_NIGHTS_GHOST, + 0, "M_NIGHTS", sizeof(SP_NightsGhostMenu)/sizeof(menuitem_t), &SP_NightsAttackDef, @@ -1695,6 +1729,8 @@ static menu_t SP_NightsGhostDef = menu_t SP_PlayerDef = { + MM_SP_MAIN|MM_SP_LOAD|MM_SP_PLAYER, + 0, "M_PICKP", sizeof (SP_PlayerMenu)/sizeof (menuitem_t), &SP_MainDef, @@ -1709,6 +1745,8 @@ menu_t SP_PlayerDef = menu_t MP_SplitServerDef = { + MM_MP_MAIN|MM_MP_SPLITSCREEN, + 0, "M_MULTI", sizeof (MP_SplitServerMenu)/sizeof (menuitem_t), #ifndef NONET @@ -1727,6 +1765,8 @@ menu_t MP_SplitServerDef = menu_t MP_MainDef = { + MM_MP_MAIN, + 0, "M_MULTI", sizeof (MP_MainMenu)/sizeof (menuitem_t), &MainDef, @@ -1739,6 +1779,8 @@ menu_t MP_MainDef = menu_t MP_ServerDef = { + MM_MP_MAIN|MM_MP_SERVER, + 0, "M_MULTI", sizeof (MP_ServerMenu)/sizeof (menuitem_t), &MP_MainDef, @@ -1751,6 +1793,8 @@ menu_t MP_ServerDef = menu_t MP_ConnectDef = { + MM_MP_MAIN|MM_MP_CONNECT, + 0, "M_MULTI", sizeof (MP_ConnectMenu)/sizeof (menuitem_t), &MP_MainDef, @@ -1763,6 +1807,8 @@ menu_t MP_ConnectDef = menu_t MP_RoomDef = { + MM_MP_MAIN|MM_MP_ROOM, + 0, "M_MULTI", sizeof (MP_RoomMenu)/sizeof (menuitem_t), &MP_ConnectDef, @@ -1776,6 +1822,8 @@ menu_t MP_RoomDef = menu_t MP_PlayerSetupDef = { + MM_MP_MAIN|MM_MP_PLAYERSETUP, + 0, "M_SPLAYR", sizeof (MP_PlayerSetupMenu)/sizeof (menuitem_t), &MainDef, // doesn't matter @@ -1787,16 +1835,18 @@ menu_t MP_PlayerSetupDef = }; // Options -menu_t OP_MainDef = DEFAULTMENUSTYLE("M_OPTTTL", OP_MainMenu, &MainDef, 50, 30); -menu_t OP_ChangeControlsDef = CONTROLMENUSTYLE(OP_ChangeControlsMenu, &OP_MainDef); -menu_t OP_P1ControlsDef = DEFAULTMENUSTYLE("M_CONTRO", OP_P1ControlsMenu, &OP_MainDef, 50, 30); -menu_t OP_P2ControlsDef = DEFAULTMENUSTYLE("M_CONTRO", OP_P2ControlsMenu, &OP_MainDef, 50, 30); -menu_t OP_MouseOptionsDef = DEFAULTMENUSTYLE("M_CONTRO", OP_MouseOptionsMenu, &OP_P1ControlsDef, 35, 30); -menu_t OP_Mouse2OptionsDef = DEFAULTMENUSTYLE("M_CONTRO", OP_Mouse2OptionsMenu, &OP_P2ControlsDef, 35, 30); -menu_t OP_Joystick1Def = DEFAULTMENUSTYLE("M_CONTRO", OP_Joystick1Menu, &OP_P1ControlsDef, 50, 30); -menu_t OP_Joystick2Def = DEFAULTMENUSTYLE("M_CONTRO", OP_Joystick2Menu, &OP_P2ControlsDef, 50, 30); +menu_t OP_MainDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN, "M_OPTTTL", OP_MainMenu, &MainDef, 50, 30); +menu_t OP_ChangeControlsDef = CONTROLMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_CHANGECONTROLS, OP_ChangeControlsMenu, &OP_MainDef); +menu_t OP_P1ControlsDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_P1CONTROLS, "M_CONTRO", OP_P1ControlsMenu, &OP_MainDef, 50, 30); +menu_t OP_P2ControlsDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_P2CONTROLS, "M_CONTRO", OP_P2ControlsMenu, &OP_MainDef, 50, 30); +menu_t OP_MouseOptionsDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_P1CONTROLS|MM2_OP_P1MOUSE, "M_CONTRO", OP_MouseOptionsMenu, &OP_P1ControlsDef, 35, 30); +menu_t OP_Mouse2OptionsDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_P2CONTROLS|MM2_OP_P2MOUSE, "M_CONTRO", OP_Mouse2OptionsMenu, &OP_P2ControlsDef, 35, 30); +menu_t OP_Joystick1Def = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_P1CONTROLS|MM2_OP_P1JOYSTICK, "M_CONTRO", OP_Joystick1Menu, &OP_P1ControlsDef, 50, 30); +menu_t OP_Joystick2Def = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_P2CONTROLS|MM2_OP_P2JOYSTICK, "M_CONTRO", OP_Joystick2Menu, &OP_P2ControlsDef, 50, 30); menu_t OP_JoystickSetDef = { + 0, + MM2_OP_MAIN|MM2_OP_JOYSTICKSET, "M_CONTRO", sizeof (OP_JoystickSetMenu)/sizeof (menuitem_t), &OP_Joystick1Def, @@ -1809,6 +1859,8 @@ menu_t OP_JoystickSetDef = menu_t OP_VideoOptionsDef = { + 0, + MM2_OP_MAIN|MM2_OP_VIDEO, "M_VIDEO", sizeof (OP_VideoOptionsMenu)/sizeof (menuitem_t), &OP_MainDef, @@ -1820,6 +1872,8 @@ menu_t OP_VideoOptionsDef = }; menu_t OP_VideoModeDef = { + 0, + MM2_OP_MAIN|MM2_OP_VIDEO|MM2_OP_VIDEOMODE, "M_VIDEO", 1, &OP_VideoOptionsDef, @@ -1831,6 +1885,8 @@ menu_t OP_VideoModeDef = }; menu_t OP_ColorOptionsDef = { + 0, + MM2_OP_MAIN|MM2_OP_VIDEO|MM2_OP_COLOR, "M_VIDEO", sizeof (OP_ColorOptionsMenu)/sizeof (menuitem_t), &OP_VideoOptionsDef, @@ -1842,6 +1898,8 @@ menu_t OP_ColorOptionsDef = }; menu_t OP_SoundOptionsDef = { + 0, + MM2_OP_MAIN|MM2_OP_SOUND, "M_SOUND", sizeof (OP_SoundOptionsMenu)/sizeof (menuitem_t), &OP_MainDef, @@ -1852,10 +1910,12 @@ menu_t OP_SoundOptionsDef = NULL }; -menu_t OP_ServerOptionsDef = DEFAULTSCROLLMENUSTYLE("M_SERVER", OP_ServerOptionsMenu, &OP_MainDef, 30, 30); +menu_t OP_ServerOptionsDef = DEFAULTSCROLLMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_SERVER, "M_SERVER", OP_ServerOptionsMenu, &OP_MainDef, 30, 30); menu_t OP_MonitorToggleDef = { + 0, + MM2_OP_MAIN|MM2_OP_SERVER|MM2_OP_MONITORTOGGLE, "M_SERVER", sizeof (OP_MonitorToggleMenu)/sizeof (menuitem_t), &OP_ServerOptionsDef, @@ -1867,12 +1927,14 @@ menu_t OP_MonitorToggleDef = }; #ifdef HWRENDER -menu_t OP_OpenGLOptionsDef = DEFAULTMENUSTYLE("M_VIDEO", OP_OpenGLOptionsMenu, &OP_VideoOptionsDef, 30, 30); +menu_t OP_OpenGLOptionsDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_VIDEO|MM2_OP_OPENGL, "M_VIDEO", OP_OpenGLOptionsMenu, &OP_VideoOptionsDef, 30, 30); #ifdef ALAM_LIGHTING -menu_t OP_OpenGLLightingDef = DEFAULTMENUSTYLE("M_VIDEO", OP_OpenGLLightingMenu, &OP_OpenGLOptionsDef, 60, 40); +menu_t OP_OpenGLLightingDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_VIDEO|MM2_OP_OPENGL|MM2_OP_OPENGL_LIGHTING, "M_VIDEO", OP_OpenGLLightingMenu, &OP_OpenGLOptionsDef, 60, 40); #endif menu_t OP_OpenGLFogDef = { + 0, + MM2_OP_MAIN|MM2_OP_VIDEO|MM2_OP_OPENGL|MM2_OP_OPENGL_FOG, "M_VIDEO", sizeof (OP_OpenGLFogMenu)/sizeof (menuitem_t), &OP_OpenGLOptionsDef, @@ -1884,6 +1946,8 @@ menu_t OP_OpenGLFogDef = }; menu_t OP_OpenGLColorDef = { + 0, + MM2_OP_MAIN|MM2_OP_VIDEO|MM2_OP_OPENGL|MM2_OP_OPENGL_COLOR, "M_VIDEO", sizeof (OP_OpenGLColorMenu)/sizeof (menuitem_t), &OP_OpenGLOptionsDef, @@ -1894,10 +1958,12 @@ menu_t OP_OpenGLColorDef = NULL }; #endif -menu_t OP_DataOptionsDef = DEFAULTMENUSTYLE("M_DATA", OP_DataOptionsMenu, &OP_MainDef, 60, 30); +menu_t OP_DataOptionsDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_DATA, "M_DATA", OP_DataOptionsMenu, &OP_MainDef, 60, 30); menu_t OP_ScreenshotOptionsDef = { + 0, + MM2_OP_MAIN|MM2_OP_DATA|MM2_OP_SCREENSHOTS, "M_DATA", sizeof (OP_ScreenshotOptionsMenu)/sizeof (menuitem_t), &OP_DataOptionsDef, @@ -1908,9 +1974,9 @@ menu_t OP_ScreenshotOptionsDef = NULL }; -menu_t OP_AddonsOptionsDef = DEFAULTMENUSTYLE("M_ADDONS", OP_AddonsOptionsMenu, &OP_DataOptionsDef, 30, 30); +menu_t OP_AddonsOptionsDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_DATA|MM2_OP_ADDONS, "M_ADDONS", OP_AddonsOptionsMenu, &OP_DataOptionsDef, 30, 30); -menu_t OP_EraseDataDef = DEFAULTMENUSTYLE("M_DATA", OP_EraseDataMenu, &OP_DataOptionsDef, 60, 30); +menu_t OP_EraseDataDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_DATA|MM2_OP_ERASEDATA, "M_DATA", OP_EraseDataMenu, &OP_DataOptionsDef, 60, 30); // ========================================================================== // CVAR ONCHANGE EVENTS GO HERE @@ -4516,6 +4582,8 @@ static menuitem_t MessageMenu[] = menu_t MessageDef = { + 0, + 0, NULL, // title 1, // # of menu items NULL, // previous menu (TO HACK) diff --git a/src/m_menu.h b/src/m_menu.h index b649d9420..26c2ce318 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -250,6 +250,8 @@ typedef struct menuitem_s typedef struct menu_s { + UINT32 menutype; // Flags to encode ID and hierarchy + UINT32 menutype2; // More flags to encode ID and hierarchy const char *menutitlepic; INT16 numitems; // # of menu items struct menu_s *prevMenu; // previous menu @@ -354,8 +356,10 @@ void Screenshot_option_Onchange(void); void Addons_option_Onchange(void); // These defines make it a little easier to make menus -#define DEFAULTMENUSTYLE(header, source, prev, x, y)\ +#define DEFAULTMENUSTYLE(flags, flags2, header, source, prev, x, y)\ {\ + flags,\ + flags2,\ header,\ sizeof(source)/sizeof(menuitem_t),\ prev,\ @@ -366,8 +370,10 @@ void Addons_option_Onchange(void); NULL\ } -#define DEFAULTSCROLLMENUSTYLE(header, source, prev, x, y)\ +#define DEFAULTSCROLLMENUSTYLE(flags, flags2, header, source, prev, x, y)\ {\ + flags,\ + flags2,\ header,\ sizeof(source)/sizeof(menuitem_t),\ prev,\ @@ -380,6 +386,8 @@ void Addons_option_Onchange(void); #define PAUSEMENUSTYLE(source, x, y)\ {\ + 0,\ + 0,\ NULL,\ sizeof(source)/sizeof(menuitem_t),\ NULL,\ @@ -390,8 +398,10 @@ void Addons_option_Onchange(void); NULL\ } -#define CENTERMENUSTYLE(header, source, prev, y)\ +#define CENTERMENUSTYLE(flags, flags2, header, source, prev, y)\ {\ + flags,\ + flags2,\ header,\ sizeof(source)/sizeof(menuitem_t),\ prev,\ @@ -402,8 +412,10 @@ void Addons_option_Onchange(void); NULL\ } -#define MAPPLATTERMENUSTYLE(header, source)\ +#define MAPPLATTERMENUSTYLE(flags, flags2, header, source)\ {\ + flags,\ + flags2,\ header,\ sizeof (source)/sizeof (menuitem_t),\ &MainDef,\ @@ -414,8 +426,10 @@ void Addons_option_Onchange(void); NULL\ } -#define CONTROLMENUSTYLE(source, prev)\ +#define CONTROLMENUSTYLE(flags, flags2, source, prev)\ {\ + flags,\ + flags2,\ "M_CONTRO",\ sizeof (source)/sizeof (menuitem_t),\ prev,\ @@ -428,6 +442,8 @@ void Addons_option_Onchange(void); #define IMAGEDEF(source)\ {\ + 0,\ + 0,\ NULL,\ sizeof (source)/sizeof (menuitem_t),\ NULL,\ From b69756f5e55cde3abb9aa8c93bb37479b4e8a40f Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 16 Nov 2018 09:22:27 -0500 Subject: [PATCH 04/50] Use bitshifting for menu IDs and hierarchy instead --- src/m_menu.c | 176 +++++++++++++++++++++++++------------------------ src/m_menu.h | 180 ++++++++++++++++++++++++--------------------------- 2 files changed, 176 insertions(+), 180 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index a7ef7f582..b16083695 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1473,12 +1473,11 @@ static menuitem_t OP_MonitorToggleMenu[] = // ========================================================================== // Main Menu and related -menu_t MainDef = CENTERMENUSTYLE(MM_MAIN, 0, NULL, MainMenu, NULL, 72); +menu_t MainDef = CENTERMENUSTYLE(MM_MAIN, NULL, MainMenu, NULL, 72); menu_t MISC_AddonsDef = { MM_AD_MAIN, - 0, NULL, sizeof (MISC_AddonsMenu)/sizeof (menuitem_t), &MainDef, @@ -1494,14 +1493,13 @@ menu_t SPauseDef = PAUSEMENUSTYLE(SPauseMenu, 40, 72); menu_t MPauseDef = PAUSEMENUSTYLE(MPauseMenu, 40, 72); // Misc Main Menu -menu_t MISC_ScrambleTeamDef = DEFAULTMENUSTYLE(0, 0, NULL, MISC_ScrambleTeamMenu, &MPauseDef, 27, 40); -menu_t MISC_ChangeTeamDef = DEFAULTMENUSTYLE(0, 0, NULL, MISC_ChangeTeamMenu, &MPauseDef, 27, 40); +menu_t MISC_ScrambleTeamDef = DEFAULTMENUSTYLE(MM_SPECIAL, NULL, MISC_ScrambleTeamMenu, &MPauseDef, 27, 40); +menu_t MISC_ChangeTeamDef = DEFAULTMENUSTYLE(MM_SPECIAL, NULL, MISC_ChangeTeamMenu, &MPauseDef, 27, 40); // MP Gametype and map change menu menu_t MISC_ChangeLevelDef = { - 0, - 0, + MM_SPECIAL, NULL, sizeof (MISC_ChangeLevelMenu)/sizeof (menuitem_t), &MainDef, // Doesn't matter. @@ -1517,8 +1515,7 @@ menu_t MISC_HelpDef = IMAGEDEF(MISC_HelpMenu); // Sky Room menu_t SR_PandoraDef = { - MM_SR_MAIN|MM_SR_PANDORA, - 0, + MM_SR_MAIN + (MM_SR_PANDORA << 6), "M_PANDRA", sizeof (SR_PandorasBox)/sizeof (menuitem_t), &SPauseDef, @@ -1531,7 +1528,6 @@ menu_t SR_PandoraDef = menu_t SR_MainDef = { MM_SR_MAIN, - 0, "M_SECRET", sizeof (SR_MainMenu)/sizeof (menuitem_t), &MainDef, @@ -1542,12 +1538,13 @@ menu_t SR_MainDef = NULL }; -menu_t SR_LevelSelectDef = MAPPLATTERMENUSTYLE(MM_SR_MAIN|MM_SR_LEVELSELECT, 0, NULL, SR_LevelSelectMenu); +menu_t SR_LevelSelectDef = MAPPLATTERMENUSTYLE( + MM_SR_MAIN + (MM_SR_LEVELSELECT << 6), + NULL, SR_LevelSelectMenu); menu_t SR_UnlockChecklistDef = { - MM_SR_MAIN|MM_SR_UNLOCKCHECKLIST, - 0, + MM_SR_MAIN + (MM_SR_UNLOCKCHECKLIST << 6), "M_SECRET", 1, &SR_MainDef, @@ -1559,8 +1556,7 @@ menu_t SR_UnlockChecklistDef = }; menu_t SR_EmblemHintDef = { - MM_SR_MAIN|MM_SR_EMBLEMHINT, - 0, + MM_SR_MAIN + (MM_SR_EMBLEMHINT << 6), NULL, sizeof (SR_EmblemHintMenu)/sizeof (menuitem_t), &SPauseDef, @@ -1575,7 +1571,6 @@ menu_t SR_EmblemHintDef = menu_t SP_MainDef = //CENTERMENUSTYLE(NULL, SP_MainMenu, &MainDef, 72); { MM_SP_MAIN, - 0, NULL, sizeof(SP_MainMenu)/sizeof(menuitem_t), &MainDef, @@ -1588,8 +1583,7 @@ menu_t SP_MainDef = //CENTERMENUSTYLE(NULL, SP_MainMenu, &MainDef, 72); menu_t SP_LoadDef = { - MM_SP_MAIN|MM_SP_LOAD, - 0, + MM_SP_MAIN + (MM_SP_LOAD << 6), "M_PICKG", 1, &SP_MainDef, @@ -1600,12 +1594,13 @@ menu_t SP_LoadDef = NULL }; -menu_t SP_LevelSelectDef = MAPPLATTERMENUSTYLE(MM_SP_MAIN|MM_SP_LOAD|MM_SP_LEVELSELECT, 0, NULL, SP_LevelSelectMenu); +menu_t SP_LevelSelectDef = MAPPLATTERMENUSTYLE( + MM_SP_MAIN + (MM_SP_LOAD << 6) + (MM_SP_PLAYER << 12) + (MM_SP_LEVELSELECT << 18), + NULL, SP_LevelSelectMenu); menu_t SP_LevelStatsDef = { - MM_SP_MAIN|MM_SP_LEVELSTATS, - 0, + MM_SP_MAIN + (MM_SP_LEVELSTATS << 6), "M_STATS", 1, &SP_MainDef, @@ -1616,12 +1611,13 @@ menu_t SP_LevelStatsDef = NULL }; -menu_t SP_TimeAttackLevelSelectDef = MAPPLATTERMENUSTYLE(MM_SP_MAIN|MM_SP_TIMEATTACK|MM_SP_TIMEATTACK_LEVELSELECT, 0, "M_ATTACK", SP_TimeAttackLevelSelectMenu); +menu_t SP_TimeAttackLevelSelectDef = MAPPLATTERMENUSTYLE( + MM_SP_MAIN + (MM_SP_TIMEATTACK << 6) + (MM_SP_TIMEATTACK_LEVELSELECT << 12), + "M_ATTACK", SP_TimeAttackLevelSelectMenu); static menu_t SP_TimeAttackDef = { - MM_SP_MAIN|MM_SP_TIMEATTACK, - 0, + MM_SP_MAIN + (MM_SP_TIMEATTACK << 6), "M_ATTACK", sizeof (SP_TimeAttackMenu)/sizeof (menuitem_t), &MainDef, // Doesn't matter. @@ -1633,8 +1629,7 @@ static menu_t SP_TimeAttackDef = }; static menu_t SP_ReplayDef = { - MM_SP_MAIN|MM_SP_TIMEATTACK|MM_SP_REPLAY, - 0, + MM_SP_MAIN + (MM_SP_TIMEATTACK << 6) + (MM_SP_REPLAY << 12), "M_ATTACK", sizeof(SP_ReplayMenu)/sizeof(menuitem_t), &SP_TimeAttackDef, @@ -1646,8 +1641,7 @@ static menu_t SP_ReplayDef = }; static menu_t SP_GuestReplayDef = { - MM_SP_MAIN|MM_SP_TIMEATTACK|MM_SP_GUESTREPLAY, - 0, + MM_SP_MAIN + (MM_SP_TIMEATTACK << 6) + (MM_SP_GUESTREPLAY << 12), "M_ATTACK", sizeof(SP_GuestReplayMenu)/sizeof(menuitem_t), &SP_TimeAttackDef, @@ -1659,8 +1653,7 @@ static menu_t SP_GuestReplayDef = }; static menu_t SP_GhostDef = { - MM_SP_MAIN|MM_SP_TIMEATTACK|MM_SP_GHOST, - 0, + MM_SP_MAIN + (MM_SP_TIMEATTACK << 6) + (MM_SP_GHOST << 12), "M_ATTACK", sizeof(SP_GhostMenu)/sizeof(menuitem_t), &SP_TimeAttackDef, @@ -1671,12 +1664,13 @@ static menu_t SP_GhostDef = NULL }; -menu_t SP_NightsAttackLevelSelectDef = MAPPLATTERMENUSTYLE(MM_SP_MAIN|MM_SP_NIGHTSATTACK|MM_SP_NIGHTSATTACK_LEVELSELECT, 0, "M_NIGHTS", SP_NightsAttackLevelSelectMenu); +menu_t SP_NightsAttackLevelSelectDef = MAPPLATTERMENUSTYLE( + MM_SP_MAIN + (MM_SP_NIGHTSATTACK << 6) + (MM_SP_NIGHTS_LEVELSELECT << 12), + "M_NIGHTS", SP_NightsAttackLevelSelectMenu); static menu_t SP_NightsAttackDef = { - MM_SP_MAIN|MM_SP_NIGHTSATTACK, - 0, + MM_SP_MAIN + (MM_SP_NIGHTSATTACK << 6), "M_NIGHTS", sizeof (SP_NightsAttackMenu)/sizeof (menuitem_t), &MainDef, // Doesn't matter. @@ -1688,8 +1682,7 @@ static menu_t SP_NightsAttackDef = }; static menu_t SP_NightsReplayDef = { - MM_SP_MAIN|MM_SP_NIGHTSATTACK|MM_SP_NIGHTS_REPLAY, - 0, + MM_SP_MAIN + (MM_SP_NIGHTSATTACK << 6) + (MM_SP_NIGHTS_REPLAY << 12), "M_NIGHTS", sizeof(SP_NightsReplayMenu)/sizeof(menuitem_t), &SP_NightsAttackDef, @@ -1701,8 +1694,7 @@ static menu_t SP_NightsReplayDef = }; static menu_t SP_NightsGuestReplayDef = { - MM_SP_MAIN|MM_SP_NIGHTSATTACK|MM_SP_NIGHTS_GUESTREPLAY, - 0, + MM_SP_MAIN + (MM_SP_NIGHTSATTACK << 6) + (MM_SP_NIGHTS_GUESTREPLAY << 12), "M_NIGHTS", sizeof(SP_NightsGuestReplayMenu)/sizeof(menuitem_t), &SP_NightsAttackDef, @@ -1714,8 +1706,7 @@ static menu_t SP_NightsGuestReplayDef = }; static menu_t SP_NightsGhostDef = { - MM_SP_MAIN|MM_SP_NIGHTSATTACK|MM_SP_NIGHTS_GHOST, - 0, + MM_SP_MAIN + (MM_SP_NIGHTSATTACK << 6) + (MM_SP_NIGHTS_GHOST << 12), "M_NIGHTS", sizeof(SP_NightsGhostMenu)/sizeof(menuitem_t), &SP_NightsAttackDef, @@ -1729,8 +1720,7 @@ static menu_t SP_NightsGhostDef = menu_t SP_PlayerDef = { - MM_SP_MAIN|MM_SP_LOAD|MM_SP_PLAYER, - 0, + MM_SP_MAIN + (MM_SP_LOAD << 6) + (MM_SP_PLAYER << 12), "M_PICKP", sizeof (SP_PlayerMenu)/sizeof (menuitem_t), &SP_MainDef, @@ -1745,8 +1735,7 @@ menu_t SP_PlayerDef = menu_t MP_SplitServerDef = { - MM_MP_MAIN|MM_MP_SPLITSCREEN, - 0, + MM_MP_MAIN + (MM_MP_SPLITSCREEN << 6), "M_MULTI", sizeof (MP_SplitServerMenu)/sizeof (menuitem_t), #ifndef NONET @@ -1766,7 +1755,6 @@ menu_t MP_SplitServerDef = menu_t MP_MainDef = { MM_MP_MAIN, - 0, "M_MULTI", sizeof (MP_MainMenu)/sizeof (menuitem_t), &MainDef, @@ -1779,8 +1767,7 @@ menu_t MP_MainDef = menu_t MP_ServerDef = { - MM_MP_MAIN|MM_MP_SERVER, - 0, + MM_MP_MAIN + (MM_MP_SERVER << 6), "M_MULTI", sizeof (MP_ServerMenu)/sizeof (menuitem_t), &MP_MainDef, @@ -1793,8 +1780,7 @@ menu_t MP_ServerDef = menu_t MP_ConnectDef = { - MM_MP_MAIN|MM_MP_CONNECT, - 0, + MM_MP_MAIN + (MM_MP_CONNECT << 6), "M_MULTI", sizeof (MP_ConnectMenu)/sizeof (menuitem_t), &MP_MainDef, @@ -1807,8 +1793,7 @@ menu_t MP_ConnectDef = menu_t MP_RoomDef = { - MM_MP_MAIN|MM_MP_ROOM, - 0, + MM_MP_MAIN + (MM_MP_ROOM << 6), "M_MULTI", sizeof (MP_RoomMenu)/sizeof (menuitem_t), &MP_ConnectDef, @@ -1822,8 +1807,11 @@ menu_t MP_RoomDef = menu_t MP_PlayerSetupDef = { - MM_MP_MAIN|MM_MP_PLAYERSETUP, - 0, +#ifdef NONET + MM_MP_MAIN + (MM_MP_SPLITSCREEN << 6) + (MM_MP_PLAYERSETUP << 12), +#else + MM_MP_MAIN + (MM_MP_PLAYERSETUP << 6), +#endif "M_SPLAYR", sizeof (MP_PlayerSetupMenu)/sizeof (menuitem_t), &MainDef, // doesn't matter @@ -1835,18 +1823,33 @@ menu_t MP_PlayerSetupDef = }; // Options -menu_t OP_MainDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN, "M_OPTTTL", OP_MainMenu, &MainDef, 50, 30); -menu_t OP_ChangeControlsDef = CONTROLMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_CHANGECONTROLS, OP_ChangeControlsMenu, &OP_MainDef); -menu_t OP_P1ControlsDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_P1CONTROLS, "M_CONTRO", OP_P1ControlsMenu, &OP_MainDef, 50, 30); -menu_t OP_P2ControlsDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_P2CONTROLS, "M_CONTRO", OP_P2ControlsMenu, &OP_MainDef, 50, 30); -menu_t OP_MouseOptionsDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_P1CONTROLS|MM2_OP_P1MOUSE, "M_CONTRO", OP_MouseOptionsMenu, &OP_P1ControlsDef, 35, 30); -menu_t OP_Mouse2OptionsDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_P2CONTROLS|MM2_OP_P2MOUSE, "M_CONTRO", OP_Mouse2OptionsMenu, &OP_P2ControlsDef, 35, 30); -menu_t OP_Joystick1Def = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_P1CONTROLS|MM2_OP_P1JOYSTICK, "M_CONTRO", OP_Joystick1Menu, &OP_P1ControlsDef, 50, 30); -menu_t OP_Joystick2Def = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_P2CONTROLS|MM2_OP_P2JOYSTICK, "M_CONTRO", OP_Joystick2Menu, &OP_P2ControlsDef, 50, 30); +menu_t OP_MainDef = DEFAULTMENUSTYLE( + MM_OP_MAIN, + "M_OPTTTL", OP_MainMenu, &MainDef, 50, 30); +menu_t OP_ChangeControlsDef = CONTROLMENUSTYLE( + MM_OP_MAIN + (MM_OP_CHANGECONTROLS << 12), // second level (<<6) set on runtime + OP_ChangeControlsMenu, &OP_MainDef); +menu_t OP_P1ControlsDef = DEFAULTMENUSTYLE( + MM_OP_MAIN + (MM_OP_P1CONTROLS << 6), + "M_CONTRO", OP_P1ControlsMenu, &OP_MainDef, 50, 30); +menu_t OP_P2ControlsDef = DEFAULTMENUSTYLE( + MM_OP_MAIN + (MM_OP_P2CONTROLS << 6), + "M_CONTRO", OP_P2ControlsMenu, &OP_MainDef, 50, 30); +menu_t OP_MouseOptionsDef = DEFAULTMENUSTYLE( + MM_OP_MAIN + (MM_OP_P1CONTROLS << 6) + (MM_OP_P1MOUSE << 12), + "M_CONTRO", OP_MouseOptionsMenu, &OP_P1ControlsDef, 35, 30); +menu_t OP_Mouse2OptionsDef = DEFAULTMENUSTYLE( + MM_OP_MAIN + (MM_OP_P2CONTROLS << 6) + (MM_OP_P2MOUSE << 12), + "M_CONTRO", OP_Mouse2OptionsMenu, &OP_P2ControlsDef, 35, 30); +menu_t OP_Joystick1Def = DEFAULTMENUSTYLE( + MM_OP_MAIN + (MM_OP_P1CONTROLS << 6) + (MM_OP_P1JOYSTICK << 12), + "M_CONTRO", OP_Joystick1Menu, &OP_P1ControlsDef, 50, 30); +menu_t OP_Joystick2Def = DEFAULTMENUSTYLE( + MM_OP_MAIN + (MM_OP_P2CONTROLS << 6) + (MM_OP_P2JOYSTICK << 12), + "M_CONTRO", OP_Joystick2Menu, &OP_P2ControlsDef, 50, 30); menu_t OP_JoystickSetDef = { - 0, - MM2_OP_MAIN|MM2_OP_JOYSTICKSET, + MM_OP_MAIN + (MM_OP_JOYSTICKSET << 12), // second level (<<6) set on runtime "M_CONTRO", sizeof (OP_JoystickSetMenu)/sizeof (menuitem_t), &OP_Joystick1Def, @@ -1859,8 +1862,7 @@ menu_t OP_JoystickSetDef = menu_t OP_VideoOptionsDef = { - 0, - MM2_OP_MAIN|MM2_OP_VIDEO, + MM_OP_MAIN + (MM_OP_VIDEO << 6), "M_VIDEO", sizeof (OP_VideoOptionsMenu)/sizeof (menuitem_t), &OP_MainDef, @@ -1872,8 +1874,7 @@ menu_t OP_VideoOptionsDef = }; menu_t OP_VideoModeDef = { - 0, - MM2_OP_MAIN|MM2_OP_VIDEO|MM2_OP_VIDEOMODE, + MM_OP_MAIN + (MM_OP_VIDEO << 6) + (MM_OP_VIDEOMODE << 12), "M_VIDEO", 1, &OP_VideoOptionsDef, @@ -1885,8 +1886,7 @@ menu_t OP_VideoModeDef = }; menu_t OP_ColorOptionsDef = { - 0, - MM2_OP_MAIN|MM2_OP_VIDEO|MM2_OP_COLOR, + MM_OP_MAIN + (MM_OP_VIDEO << 6) + (MM_OP_COLOR << 12), "M_VIDEO", sizeof (OP_ColorOptionsMenu)/sizeof (menuitem_t), &OP_VideoOptionsDef, @@ -1898,8 +1898,7 @@ menu_t OP_ColorOptionsDef = }; menu_t OP_SoundOptionsDef = { - 0, - MM2_OP_MAIN|MM2_OP_SOUND, + MM_OP_MAIN + (MM_OP_SOUND << 6), "M_SOUND", sizeof (OP_SoundOptionsMenu)/sizeof (menuitem_t), &OP_MainDef, @@ -1910,12 +1909,13 @@ menu_t OP_SoundOptionsDef = NULL }; -menu_t OP_ServerOptionsDef = DEFAULTSCROLLMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_SERVER, "M_SERVER", OP_ServerOptionsMenu, &OP_MainDef, 30, 30); +menu_t OP_ServerOptionsDef = DEFAULTSCROLLMENUSTYLE( + MM_OP_MAIN + (MM_OP_SERVER << 6), + "M_SERVER", OP_ServerOptionsMenu, &OP_MainDef, 30, 30); menu_t OP_MonitorToggleDef = { - 0, - MM2_OP_MAIN|MM2_OP_SERVER|MM2_OP_MONITORTOGGLE, + MM_OP_MAIN + (MM_OP_SERVER << 6) + (MM_OP_MONITORTOGGLE << 12), "M_SERVER", sizeof (OP_MonitorToggleMenu)/sizeof (menuitem_t), &OP_ServerOptionsDef, @@ -1927,14 +1927,17 @@ menu_t OP_MonitorToggleDef = }; #ifdef HWRENDER -menu_t OP_OpenGLOptionsDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_VIDEO|MM2_OP_OPENGL, "M_VIDEO", OP_OpenGLOptionsMenu, &OP_VideoOptionsDef, 30, 30); +menu_t OP_OpenGLOptionsDef = DEFAULTMENUSTYLE( + MM_OP_MAIN + (MM_OP_VIDEO << 6) + (MM_OP_OPENGL << 12), + "M_VIDEO", OP_OpenGLOptionsMenu, &OP_VideoOptionsDef, 30, 30); #ifdef ALAM_LIGHTING -menu_t OP_OpenGLLightingDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_VIDEO|MM2_OP_OPENGL|MM2_OP_OPENGL_LIGHTING, "M_VIDEO", OP_OpenGLLightingMenu, &OP_OpenGLOptionsDef, 60, 40); +menu_t OP_OpenGLLightingDef = DEFAULTMENUSTYLE( + MM_OP_MAIN + (MM_OP_VIDEO << 6) + (MM_OP_OPENGL << 12) + (MM_OP_OPENGL_LIGHTING << 18), + "M_VIDEO", OP_OpenGLLightingMenu, &OP_OpenGLOptionsDef, 60, 40); #endif menu_t OP_OpenGLFogDef = { - 0, - MM2_OP_MAIN|MM2_OP_VIDEO|MM2_OP_OPENGL|MM2_OP_OPENGL_FOG, + MM_OP_MAIN + (MM_OP_VIDEO << 6) + (MM_OP_OPENGL << 12) + (MM_OP_OPENGL_FOG << 18), "M_VIDEO", sizeof (OP_OpenGLFogMenu)/sizeof (menuitem_t), &OP_OpenGLOptionsDef, @@ -1946,8 +1949,7 @@ menu_t OP_OpenGLFogDef = }; menu_t OP_OpenGLColorDef = { - 0, - MM2_OP_MAIN|MM2_OP_VIDEO|MM2_OP_OPENGL|MM2_OP_OPENGL_COLOR, + MM_OP_MAIN + (MM_OP_VIDEO << 6) + (MM_OP_OPENGL << 12) + (MM_OP_OPENGL_COLOR << 18), "M_VIDEO", sizeof (OP_OpenGLColorMenu)/sizeof (menuitem_t), &OP_OpenGLOptionsDef, @@ -1958,12 +1960,13 @@ menu_t OP_OpenGLColorDef = NULL }; #endif -menu_t OP_DataOptionsDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_DATA, "M_DATA", OP_DataOptionsMenu, &OP_MainDef, 60, 30); +menu_t OP_DataOptionsDef = DEFAULTMENUSTYLE( + MM_OP_MAIN + (MM_OP_DATA << 6), + "M_DATA", OP_DataOptionsMenu, &OP_MainDef, 60, 30); menu_t OP_ScreenshotOptionsDef = { - 0, - MM2_OP_MAIN|MM2_OP_DATA|MM2_OP_SCREENSHOTS, + MM_OP_MAIN + (MM_OP_DATA << 6) + (MM_OP_SCREENSHOTS << 12), "M_DATA", sizeof (OP_ScreenshotOptionsMenu)/sizeof (menuitem_t), &OP_DataOptionsDef, @@ -1974,9 +1977,13 @@ menu_t OP_ScreenshotOptionsDef = NULL }; -menu_t OP_AddonsOptionsDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_DATA|MM2_OP_ADDONS, "M_ADDONS", OP_AddonsOptionsMenu, &OP_DataOptionsDef, 30, 30); +menu_t OP_AddonsOptionsDef = DEFAULTMENUSTYLE( + MM_OP_MAIN + (MM_OP_DATA << 6) + (MM_OP_ADDONS << 12), + "M_ADDONS", OP_AddonsOptionsMenu, &OP_DataOptionsDef, 30, 30); -menu_t OP_EraseDataDef = DEFAULTMENUSTYLE(0, MM2_OP_MAIN|MM2_OP_DATA|MM2_OP_ERASEDATA, "M_DATA", OP_EraseDataMenu, &OP_DataOptionsDef, 60, 30); +menu_t OP_EraseDataDef = DEFAULTMENUSTYLE( + MM_OP_MAIN + (MM_OP_DATA << 6) + (MM_OP_ERASEDATA << 12), + "M_DATA", OP_EraseDataMenu, &OP_DataOptionsDef, 60, 30); // ========================================================================== // CVAR ONCHANGE EVENTS GO HERE @@ -4582,8 +4589,7 @@ static menuitem_t MessageMenu[] = menu_t MessageDef = { - 0, - 0, + MM_SPECIAL, NULL, // title 1, // # of menu items NULL, // previous menu (TO HACK) diff --git a/src/m_menu.h b/src/m_menu.h index 26c2ce318..ae438a054 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -26,97 +26,95 @@ // Menu IDs sectioned by numeric places to signify hierarchy typedef enum { - MM_MAIN = 1, + MM_NONE, + + MM_MAIN, // Single Player - MM_SP_MAIN = 1<<1, + MM_SP_MAIN, - MM_SP_LOAD = 1<<2, - MM_SP_PLAYER = 1<<3, + MM_SP_LOAD, + MM_SP_PLAYER, - MM_SP_LEVELSELECT = 1<<4, - MM_SP_LEVELSTATS = 1<<5, + MM_SP_LEVELSELECT, + MM_SP_LEVELSTATS, - MM_SP_TIMEATTACK = 1<<6, - MM_SP_TIMEATTACK_LEVELSELECT = 1<<7, - MM_SP_GUESTREPLAY = 1<<8, - MM_SP_REPLAY = 1<<9, - MM_SP_GHOST = 1<<10, + MM_SP_TIMEATTACK, + MM_SP_TIMEATTACK_LEVELSELECT, + MM_SP_GUESTREPLAY, + MM_SP_REPLAY, + MM_SP_GHOST, - MM_SP_NIGHTSATTACK = 1<<11, - MM_SP_NIGHTSATTACK_LEVELSELECT = 1<<12, - MM_SP_NIGHTS_GUESTREPLAY = 1<<13, - MM_SP_NIGHTS_REPLAY = 1<<14, - MM_SP_NIGHTS_GHOST = 1<<15, + MM_SP_NIGHTSATTACK, + MM_SP_NIGHTS_LEVELSELECT, + MM_SP_NIGHTS_GUESTREPLAY, + MM_SP_NIGHTS_REPLAY, + MM_SP_NIGHTS_GHOST, // Multiplayer - MM_MP_MAIN = 1<<16, - MM_MP_SPLITSCREEN = 1<<17, // SplitServer - MM_MP_SERVER = 1<<18, - MM_MP_CONNECT = 1<<19, - MM_MP_ROOM = 1<<20, - MM_MP_PLAYERSETUP = 1<<21, // MP_PlayerSetupDef shared with SPLITSCREEN if #defined NONET + MM_MP_MAIN, + MM_MP_SPLITSCREEN, // SplitServer + MM_MP_SERVER, + MM_MP_CONNECT, + MM_MP_ROOM, + MM_MP_PLAYERSETUP, // MP_PlayerSetupDef shared with SPLITSCREEN if #defined NONET + + // Options + MM_OP_MAIN, + + MM_OP_P1CONTROLS, + MM_OP_CHANGECONTROLS, // OP_ChangeControlsDef shared with P2 + MM_OP_P1MOUSE, + MM_OP_P1JOYSTICK, + MM_OP_JOYSTICKSET, // OP_JoystickSetDef shared with P2 + + MM_OP_P2CONTROLS, + MM_OP_P2MOUSE, + MM_OP_P2JOYSTICK, + + MM_OP_VIDEO, + MM_OP_VIDEOMODE, + MM_OP_COLOR, + MM_OP_OPENGL, + MM_OP_OPENGL_LIGHTING, + MM_OP_OPENGL_FOG, + MM_OP_OPENGL_COLOR, + + MM_OP_SOUND, + + MM_OP_SERVER, + MM_OP_MONITORTOGGLE, + + MM_OP_DATA, + MM_OP_ADDONS, + MM_OP_SCREENSHOTS, + MM_OP_ERASEDATA, // Secrets - MM_SR_MAIN = 1<<22, - MM_SR_PANDORA = 1<<23, - MM_SR_LEVELSELECT = 1<<24, - MM_SR_UNLOCKCHECKLIST = 1<<25, - MM_SR_EMBLEMHINT = 1<<26, + MM_SR_MAIN, + MM_SR_PANDORA, + MM_SR_LEVELSELECT, + MM_SR_UNLOCKCHECKLIST, + MM_SR_EMBLEMHINT, // Addons (Part of MISC, but let's make it our own) - MM_AD_MAIN = 1<<27, - - MM_ALL = 1<<28, + MM_AD_MAIN, // MISC - // MM_MESSAGE = 20000, - // MM_SPAUSE = 30000, + // MM_MESSAGE, + // MM_SPAUSE, - // MM_MPAUSE = 40000, - // MM_SCRAMBLETEAM = 41000, - // MM_CHANGETEAM = 42000, - // MM_CHANGELEVEL = 43000, + // MM_MPAUSE, + // MM_SCRAMBLETEAM, + // MM_CHANGETEAM, + // MM_CHANGELEVEL, - // MM_MAPAUSE = 50000, - // MM_HELP = 60000 -} menutype_t; // up to 1<<31 + // MM_MAPAUSE, + // MM_HELP, -typedef enum -{ - // Options - MM2_OP_MAIN = 1, - - MM2_OP_P1CONTROLS = 1<<1, - MM2_OP_CHANGECONTROLS = 1<<2, // OP_ChangeControlsDef shared with P2 - MM2_OP_P1MOUSE = 1<<3, - MM2_OP_P1JOYSTICK = 1<<4, - MM2_OP_JOYSTICKSET = 1<<5, // OP_JoystickSetDef shared with P2 - - MM2_OP_P2CONTROLS = 1<<6, - MM2_OP_P2MOUSE = 1<<7, - MM2_OP_P2JOYSTICK = 1<<8, - - MM2_OP_VIDEO = 1<<9, - MM2_OP_VIDEOMODE = 1<<10, - MM2_OP_COLOR = 1<<11, - MM2_OP_OPENGL = 1<<12, - MM2_OP_OPENGL_LIGHTING = 1<<13, - MM2_OP_OPENGL_FOG = 1<<14, - MM2_OP_OPENGL_COLOR = 1<<15, - - MM2_OP_SOUND = 1<<16, - - MM2_OP_SERVER = 1<<17, - MM2_OP_MONITORTOGGLE = 1<<18, - - MM2_OP_DATA = 1<<19, - MM2_OP_ADDONS = 1<<20, - MM2_OP_SCREENSHOTS = 1<<21, - MM2_OP_ERASEDATA = 1<<22, - - MM2_ALL = 1<<23 -} menutype2_t; // up to 1<<31 + MM_SPECIAL, + NUM_MM, +} menutype_t; // up to 63; MM_SPECIAL = 53 // Called by main loop, @@ -250,8 +248,7 @@ typedef struct menuitem_s typedef struct menu_s { - UINT32 menutype; // Flags to encode ID and hierarchy - UINT32 menutype2; // More flags to encode ID and hierarchy + UINT32 menuid; // ID to encode menu type and hierarchy const char *menutitlepic; INT16 numitems; // # of menu items struct menu_s *prevMenu; // previous menu @@ -356,10 +353,9 @@ void Screenshot_option_Onchange(void); void Addons_option_Onchange(void); // These defines make it a little easier to make menus -#define DEFAULTMENUSTYLE(flags, flags2, header, source, prev, x, y)\ +#define DEFAULTMENUSTYLE(id, header, source, prev, x, y)\ {\ - flags,\ - flags2,\ + id,\ header,\ sizeof(source)/sizeof(menuitem_t),\ prev,\ @@ -370,10 +366,9 @@ void Addons_option_Onchange(void); NULL\ } -#define DEFAULTSCROLLMENUSTYLE(flags, flags2, header, source, prev, x, y)\ +#define DEFAULTSCROLLMENUSTYLE(id, header, source, prev, x, y)\ {\ - flags,\ - flags2,\ + id,\ header,\ sizeof(source)/sizeof(menuitem_t),\ prev,\ @@ -386,8 +381,7 @@ void Addons_option_Onchange(void); #define PAUSEMENUSTYLE(source, x, y)\ {\ - 0,\ - 0,\ + MM_SPECIAL,\ NULL,\ sizeof(source)/sizeof(menuitem_t),\ NULL,\ @@ -398,10 +392,9 @@ void Addons_option_Onchange(void); NULL\ } -#define CENTERMENUSTYLE(flags, flags2, header, source, prev, y)\ +#define CENTERMENUSTYLE(id, header, source, prev, y)\ {\ - flags,\ - flags2,\ + id,\ header,\ sizeof(source)/sizeof(menuitem_t),\ prev,\ @@ -412,10 +405,9 @@ void Addons_option_Onchange(void); NULL\ } -#define MAPPLATTERMENUSTYLE(flags, flags2, header, source)\ +#define MAPPLATTERMENUSTYLE(id, header, source)\ {\ - flags,\ - flags2,\ + id,\ header,\ sizeof (source)/sizeof (menuitem_t),\ &MainDef,\ @@ -426,10 +418,9 @@ void Addons_option_Onchange(void); NULL\ } -#define CONTROLMENUSTYLE(flags, flags2, source, prev)\ +#define CONTROLMENUSTYLE(id, source, prev)\ {\ - flags,\ - flags2,\ + id,\ "M_CONTRO",\ sizeof (source)/sizeof (menuitem_t),\ prev,\ @@ -442,8 +433,7 @@ void Addons_option_Onchange(void); #define IMAGEDEF(source)\ {\ - 0,\ - 0,\ + MM_SPECIAL,\ NULL,\ sizeof (source)/sizeof (menuitem_t),\ NULL,\ From 3ec96d8b991da968ad352505934d47fc2f86744f Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 16 Nov 2018 09:46:32 -0500 Subject: [PATCH 05/50] Menutypes for dehacked --- src/dehacked.c | 114 +++++++++++++++++++++++++++++++++++++++++++++++++ src/m_menu.h | 2 +- 2 files changed, 115 insertions(+), 1 deletion(-) diff --git a/src/dehacked.c b/src/dehacked.c index c023e6831..5c41f1d50 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7751,6 +7751,96 @@ static const char *const HUDITEMS_LIST[] = { "LAP" }; +static const char *const MENUTYPES_LIST[] = { + "NONE", + + "MAIN", + + // Single Player + "SP_MAIN", + + "SP_LOAD", + "SP_PLAYER", + + "SP_LEVELSELECT", + "SP_LEVELSTATS", + + "SP_TIMEATTACK", + "SP_TIMEATTACK_LEVELSELECT", + "SP_GUESTREPLAY", + "SP_REPLAY", + "SP_GHOST", + + "SP_NIGHTSATTACK", + "SP_NIGHTS_LEVELSELECT", + "SP_NIGHTS_GUESTREPLAY", + "SP_NIGHTS_REPLAY", + "SP_NIGHTS_GHOST", + + // Multiplayer + "MP_MAIN", + "MP_SPLITSCREEN", // SplitServer + "MP_SERVER", + "MP_CONNECT", + "MP_ROOM", + "MP_PLAYERSETUP", // MP_PlayerSetupDef shared with SPLITSCREEN if #defined NONET + + // Options + "OP_MAIN", + + "OP_P1CONTROLS", + "OP_CHANGECONTROLS", // OP_ChangeControlsDef shared with P2 + "OP_P1MOUSE", + "OP_P1JOYSTICK", + "OP_JOYSTICKSET", // OP_JoystickSetDef shared with P2 + + "OP_P2CONTROLS", + "OP_P2MOUSE", + "OP_P2JOYSTICK", + + "OP_VIDEO", + "OP_VIDEOMODE", + "OP_COLOR", + "OP_OPENGL", + "OP_OPENGL_LIGHTING", + "OP_OPENGL_FOG", + "OP_OPENGL_COLOR", + + "OP_SOUND", + + "OP_SERVER", + "OP_MONITORTOGGLE", + + "OP_DATA", + "OP_ADDONS", + "OP_SCREENSHOTS", + "OP_ERASEDATA", + + // Secrets + "SR_MAIN", + "SR_PANDORA", + "SR_LEVELSELECT", + "SR_UNLOCKCHECKLIST", + "SR_EMBLEMHINT", + + // Addons (Part of MISC, but let's make it our own) + "AD_MAIN", + + // MISC + // "MESSAGE", + // "SPAUSE", + + // "MPAUSE", + // "SCRAMBLETEAM", + // "CHANGETEAM", + // "CHANGELEVEL", + + // "MAPAUSE", + // "HELP", + + "SPECIAL" +}; + struct { const char *n; // has to be able to hold both fixed_t and angle_t, so drastic measure!! @@ -8450,6 +8540,20 @@ static hudnum_t get_huditem(const char *word) return HUD_LIVES; } +static menutype_t get_menutype(const char *word) +{ // Returns the value of MM_ enumerations + menutype_t i; + if (*word >= '0' && *word <= '9') + return atoi(word); + if (fastncmp("MM_",word,3)) + word += 3; // take off the MM_ + for (i = 0; i < NUMMENUTYPES; i++) + if (fastcmp(word, MENUTYPES_LIST[i])) + return i; + deh_warning("Couldn't find menutype named 'MM_%s'",word); + return MM_NONE; +} + #ifndef HAVE_BLUA static powertype_t get_power(const char *word) { // Returns the vlaue of pw_ enumerations @@ -9114,6 +9218,16 @@ static inline int lib_getenum(lua_State *L) if (mathlib) return luaL_error(L, "skincolor '%s' could not be found.\n", word); return 0; } + else if (fastncmp("MM_",word,3)) { + p = word+3; + for (i = 0; i < NUMMENUTYPES; i++) + if (fastcmp(p, MENUTYPES_LIST[i])) { + lua_pushinteger(L, i); + return 1; + } + if (mathlib) return luaL_error(L, "menutype '%s' could not be found.\n", word); + return 0; + } else if (!mathlib && fastncmp("A_",word,2)) { char *caps; // Try to get a Lua action first. diff --git a/src/m_menu.h b/src/m_menu.h index ae438a054..2c35dbf83 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -113,7 +113,7 @@ typedef enum // MM_HELP, MM_SPECIAL, - NUM_MM, + NUMMENUTYPES, } menutype_t; // up to 63; MM_SPECIAL = 53 From 75dab7850f1ad70cbe9039b4236e073bb1773e9d Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 16 Nov 2018 09:56:22 -0500 Subject: [PATCH 06/50] Refactor MM_ menu types to MN_ --- src/dehacked.c | 12 ++--- src/m_menu.c | 112 +++++++++++++++++++++---------------------- src/m_menu.h | 128 ++++++++++++++++++++++++------------------------- 3 files changed, 126 insertions(+), 126 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 5c41f1d50..ed50aa970 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8541,17 +8541,17 @@ static hudnum_t get_huditem(const char *word) } static menutype_t get_menutype(const char *word) -{ // Returns the value of MM_ enumerations +{ // Returns the value of MN_ enumerations menutype_t i; if (*word >= '0' && *word <= '9') return atoi(word); - if (fastncmp("MM_",word,3)) - word += 3; // take off the MM_ + if (fastncmp("MN_",word,3)) + word += 3; // take off the MN_ for (i = 0; i < NUMMENUTYPES; i++) if (fastcmp(word, MENUTYPES_LIST[i])) return i; - deh_warning("Couldn't find menutype named 'MM_%s'",word); - return MM_NONE; + deh_warning("Couldn't find menutype named 'MN_%s'",word); + return MN_NONE; } #ifndef HAVE_BLUA @@ -9218,7 +9218,7 @@ static inline int lib_getenum(lua_State *L) if (mathlib) return luaL_error(L, "skincolor '%s' could not be found.\n", word); return 0; } - else if (fastncmp("MM_",word,3)) { + else if (fastncmp("MN_",word,3)) { p = word+3; for (i = 0; i < NUMMENUTYPES; i++) if (fastcmp(p, MENUTYPES_LIST[i])) { diff --git a/src/m_menu.c b/src/m_menu.c index b16083695..741694ffa 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1473,11 +1473,11 @@ static menuitem_t OP_MonitorToggleMenu[] = // ========================================================================== // Main Menu and related -menu_t MainDef = CENTERMENUSTYLE(MM_MAIN, NULL, MainMenu, NULL, 72); +menu_t MainDef = CENTERMENUSTYLE(MN_MAIN, NULL, MainMenu, NULL, 72); menu_t MISC_AddonsDef = { - MM_AD_MAIN, + MN_AD_MAIN, NULL, sizeof (MISC_AddonsMenu)/sizeof (menuitem_t), &MainDef, @@ -1493,13 +1493,13 @@ menu_t SPauseDef = PAUSEMENUSTYLE(SPauseMenu, 40, 72); menu_t MPauseDef = PAUSEMENUSTYLE(MPauseMenu, 40, 72); // Misc Main Menu -menu_t MISC_ScrambleTeamDef = DEFAULTMENUSTYLE(MM_SPECIAL, NULL, MISC_ScrambleTeamMenu, &MPauseDef, 27, 40); -menu_t MISC_ChangeTeamDef = DEFAULTMENUSTYLE(MM_SPECIAL, NULL, MISC_ChangeTeamMenu, &MPauseDef, 27, 40); +menu_t MISC_ScrambleTeamDef = DEFAULTMENUSTYLE(MN_SPECIAL, NULL, MISC_ScrambleTeamMenu, &MPauseDef, 27, 40); +menu_t MISC_ChangeTeamDef = DEFAULTMENUSTYLE(MN_SPECIAL, NULL, MISC_ChangeTeamMenu, &MPauseDef, 27, 40); // MP Gametype and map change menu menu_t MISC_ChangeLevelDef = { - MM_SPECIAL, + MN_SPECIAL, NULL, sizeof (MISC_ChangeLevelMenu)/sizeof (menuitem_t), &MainDef, // Doesn't matter. @@ -1515,7 +1515,7 @@ menu_t MISC_HelpDef = IMAGEDEF(MISC_HelpMenu); // Sky Room menu_t SR_PandoraDef = { - MM_SR_MAIN + (MM_SR_PANDORA << 6), + MN_SR_MAIN + (MN_SR_PANDORA << 6), "M_PANDRA", sizeof (SR_PandorasBox)/sizeof (menuitem_t), &SPauseDef, @@ -1527,7 +1527,7 @@ menu_t SR_PandoraDef = }; menu_t SR_MainDef = { - MM_SR_MAIN, + MN_SR_MAIN, "M_SECRET", sizeof (SR_MainMenu)/sizeof (menuitem_t), &MainDef, @@ -1539,12 +1539,12 @@ menu_t SR_MainDef = }; menu_t SR_LevelSelectDef = MAPPLATTERMENUSTYLE( - MM_SR_MAIN + (MM_SR_LEVELSELECT << 6), + MN_SR_MAIN + (MN_SR_LEVELSELECT << 6), NULL, SR_LevelSelectMenu); menu_t SR_UnlockChecklistDef = { - MM_SR_MAIN + (MM_SR_UNLOCKCHECKLIST << 6), + MN_SR_MAIN + (MN_SR_UNLOCKCHECKLIST << 6), "M_SECRET", 1, &SR_MainDef, @@ -1556,7 +1556,7 @@ menu_t SR_UnlockChecklistDef = }; menu_t SR_EmblemHintDef = { - MM_SR_MAIN + (MM_SR_EMBLEMHINT << 6), + MN_SR_MAIN + (MN_SR_EMBLEMHINT << 6), NULL, sizeof (SR_EmblemHintMenu)/sizeof (menuitem_t), &SPauseDef, @@ -1570,7 +1570,7 @@ menu_t SR_EmblemHintDef = // Single Player menu_t SP_MainDef = //CENTERMENUSTYLE(NULL, SP_MainMenu, &MainDef, 72); { - MM_SP_MAIN, + MN_SP_MAIN, NULL, sizeof(SP_MainMenu)/sizeof(menuitem_t), &MainDef, @@ -1583,7 +1583,7 @@ menu_t SP_MainDef = //CENTERMENUSTYLE(NULL, SP_MainMenu, &MainDef, 72); menu_t SP_LoadDef = { - MM_SP_MAIN + (MM_SP_LOAD << 6), + MN_SP_MAIN + (MN_SP_LOAD << 6), "M_PICKG", 1, &SP_MainDef, @@ -1595,12 +1595,12 @@ menu_t SP_LoadDef = }; menu_t SP_LevelSelectDef = MAPPLATTERMENUSTYLE( - MM_SP_MAIN + (MM_SP_LOAD << 6) + (MM_SP_PLAYER << 12) + (MM_SP_LEVELSELECT << 18), + MN_SP_MAIN + (MN_SP_LOAD << 6) + (MN_SP_PLAYER << 12) + (MN_SP_LEVELSELECT << 18), NULL, SP_LevelSelectMenu); menu_t SP_LevelStatsDef = { - MM_SP_MAIN + (MM_SP_LEVELSTATS << 6), + MN_SP_MAIN + (MN_SP_LEVELSTATS << 6), "M_STATS", 1, &SP_MainDef, @@ -1612,12 +1612,12 @@ menu_t SP_LevelStatsDef = }; menu_t SP_TimeAttackLevelSelectDef = MAPPLATTERMENUSTYLE( - MM_SP_MAIN + (MM_SP_TIMEATTACK << 6) + (MM_SP_TIMEATTACK_LEVELSELECT << 12), + MN_SP_MAIN + (MN_SP_TIMEATTACK << 6) + (MN_SP_TIMEATTACK_LEVELSELECT << 12), "M_ATTACK", SP_TimeAttackLevelSelectMenu); static menu_t SP_TimeAttackDef = { - MM_SP_MAIN + (MM_SP_TIMEATTACK << 6), + MN_SP_MAIN + (MN_SP_TIMEATTACK << 6), "M_ATTACK", sizeof (SP_TimeAttackMenu)/sizeof (menuitem_t), &MainDef, // Doesn't matter. @@ -1629,7 +1629,7 @@ static menu_t SP_TimeAttackDef = }; static menu_t SP_ReplayDef = { - MM_SP_MAIN + (MM_SP_TIMEATTACK << 6) + (MM_SP_REPLAY << 12), + MN_SP_MAIN + (MN_SP_TIMEATTACK << 6) + (MN_SP_REPLAY << 12), "M_ATTACK", sizeof(SP_ReplayMenu)/sizeof(menuitem_t), &SP_TimeAttackDef, @@ -1641,7 +1641,7 @@ static menu_t SP_ReplayDef = }; static menu_t SP_GuestReplayDef = { - MM_SP_MAIN + (MM_SP_TIMEATTACK << 6) + (MM_SP_GUESTREPLAY << 12), + MN_SP_MAIN + (MN_SP_TIMEATTACK << 6) + (MN_SP_GUESTREPLAY << 12), "M_ATTACK", sizeof(SP_GuestReplayMenu)/sizeof(menuitem_t), &SP_TimeAttackDef, @@ -1653,7 +1653,7 @@ static menu_t SP_GuestReplayDef = }; static menu_t SP_GhostDef = { - MM_SP_MAIN + (MM_SP_TIMEATTACK << 6) + (MM_SP_GHOST << 12), + MN_SP_MAIN + (MN_SP_TIMEATTACK << 6) + (MN_SP_GHOST << 12), "M_ATTACK", sizeof(SP_GhostMenu)/sizeof(menuitem_t), &SP_TimeAttackDef, @@ -1665,12 +1665,12 @@ static menu_t SP_GhostDef = }; menu_t SP_NightsAttackLevelSelectDef = MAPPLATTERMENUSTYLE( - MM_SP_MAIN + (MM_SP_NIGHTSATTACK << 6) + (MM_SP_NIGHTS_LEVELSELECT << 12), + MN_SP_MAIN + (MN_SP_NIGHTSATTACK << 6) + (MN_SP_NIGHTS_LEVELSELECT << 12), "M_NIGHTS", SP_NightsAttackLevelSelectMenu); static menu_t SP_NightsAttackDef = { - MM_SP_MAIN + (MM_SP_NIGHTSATTACK << 6), + MN_SP_MAIN + (MN_SP_NIGHTSATTACK << 6), "M_NIGHTS", sizeof (SP_NightsAttackMenu)/sizeof (menuitem_t), &MainDef, // Doesn't matter. @@ -1682,7 +1682,7 @@ static menu_t SP_NightsAttackDef = }; static menu_t SP_NightsReplayDef = { - MM_SP_MAIN + (MM_SP_NIGHTSATTACK << 6) + (MM_SP_NIGHTS_REPLAY << 12), + MN_SP_MAIN + (MN_SP_NIGHTSATTACK << 6) + (MN_SP_NIGHTS_REPLAY << 12), "M_NIGHTS", sizeof(SP_NightsReplayMenu)/sizeof(menuitem_t), &SP_NightsAttackDef, @@ -1694,7 +1694,7 @@ static menu_t SP_NightsReplayDef = }; static menu_t SP_NightsGuestReplayDef = { - MM_SP_MAIN + (MM_SP_NIGHTSATTACK << 6) + (MM_SP_NIGHTS_GUESTREPLAY << 12), + MN_SP_MAIN + (MN_SP_NIGHTSATTACK << 6) + (MN_SP_NIGHTS_GUESTREPLAY << 12), "M_NIGHTS", sizeof(SP_NightsGuestReplayMenu)/sizeof(menuitem_t), &SP_NightsAttackDef, @@ -1706,7 +1706,7 @@ static menu_t SP_NightsGuestReplayDef = }; static menu_t SP_NightsGhostDef = { - MM_SP_MAIN + (MM_SP_NIGHTSATTACK << 6) + (MM_SP_NIGHTS_GHOST << 12), + MN_SP_MAIN + (MN_SP_NIGHTSATTACK << 6) + (MN_SP_NIGHTS_GHOST << 12), "M_NIGHTS", sizeof(SP_NightsGhostMenu)/sizeof(menuitem_t), &SP_NightsAttackDef, @@ -1720,7 +1720,7 @@ static menu_t SP_NightsGhostDef = menu_t SP_PlayerDef = { - MM_SP_MAIN + (MM_SP_LOAD << 6) + (MM_SP_PLAYER << 12), + MN_SP_MAIN + (MN_SP_LOAD << 6) + (MN_SP_PLAYER << 12), "M_PICKP", sizeof (SP_PlayerMenu)/sizeof (menuitem_t), &SP_MainDef, @@ -1735,7 +1735,7 @@ menu_t SP_PlayerDef = menu_t MP_SplitServerDef = { - MM_MP_MAIN + (MM_MP_SPLITSCREEN << 6), + MN_MP_MAIN + (MN_MP_SPLITSCREEN << 6), "M_MULTI", sizeof (MP_SplitServerMenu)/sizeof (menuitem_t), #ifndef NONET @@ -1754,7 +1754,7 @@ menu_t MP_SplitServerDef = menu_t MP_MainDef = { - MM_MP_MAIN, + MN_MP_MAIN, "M_MULTI", sizeof (MP_MainMenu)/sizeof (menuitem_t), &MainDef, @@ -1767,7 +1767,7 @@ menu_t MP_MainDef = menu_t MP_ServerDef = { - MM_MP_MAIN + (MM_MP_SERVER << 6), + MN_MP_MAIN + (MN_MP_SERVER << 6), "M_MULTI", sizeof (MP_ServerMenu)/sizeof (menuitem_t), &MP_MainDef, @@ -1780,7 +1780,7 @@ menu_t MP_ServerDef = menu_t MP_ConnectDef = { - MM_MP_MAIN + (MM_MP_CONNECT << 6), + MN_MP_MAIN + (MN_MP_CONNECT << 6), "M_MULTI", sizeof (MP_ConnectMenu)/sizeof (menuitem_t), &MP_MainDef, @@ -1793,7 +1793,7 @@ menu_t MP_ConnectDef = menu_t MP_RoomDef = { - MM_MP_MAIN + (MM_MP_ROOM << 6), + MN_MP_MAIN + (MN_MP_ROOM << 6), "M_MULTI", sizeof (MP_RoomMenu)/sizeof (menuitem_t), &MP_ConnectDef, @@ -1808,9 +1808,9 @@ menu_t MP_RoomDef = menu_t MP_PlayerSetupDef = { #ifdef NONET - MM_MP_MAIN + (MM_MP_SPLITSCREEN << 6) + (MM_MP_PLAYERSETUP << 12), + MN_MP_MAIN + (MN_MP_SPLITSCREEN << 6) + (MN_MP_PLAYERSETUP << 12), #else - MM_MP_MAIN + (MM_MP_PLAYERSETUP << 6), + MN_MP_MAIN + (MN_MP_PLAYERSETUP << 6), #endif "M_SPLAYR", sizeof (MP_PlayerSetupMenu)/sizeof (menuitem_t), @@ -1824,32 +1824,32 @@ menu_t MP_PlayerSetupDef = // Options menu_t OP_MainDef = DEFAULTMENUSTYLE( - MM_OP_MAIN, + MN_OP_MAIN, "M_OPTTTL", OP_MainMenu, &MainDef, 50, 30); menu_t OP_ChangeControlsDef = CONTROLMENUSTYLE( - MM_OP_MAIN + (MM_OP_CHANGECONTROLS << 12), // second level (<<6) set on runtime + MN_OP_MAIN + (MN_OP_CHANGECONTROLS << 12), // second level (<<6) set on runtime OP_ChangeControlsMenu, &OP_MainDef); menu_t OP_P1ControlsDef = DEFAULTMENUSTYLE( - MM_OP_MAIN + (MM_OP_P1CONTROLS << 6), + MN_OP_MAIN + (MN_OP_P1CONTROLS << 6), "M_CONTRO", OP_P1ControlsMenu, &OP_MainDef, 50, 30); menu_t OP_P2ControlsDef = DEFAULTMENUSTYLE( - MM_OP_MAIN + (MM_OP_P2CONTROLS << 6), + MN_OP_MAIN + (MN_OP_P2CONTROLS << 6), "M_CONTRO", OP_P2ControlsMenu, &OP_MainDef, 50, 30); menu_t OP_MouseOptionsDef = DEFAULTMENUSTYLE( - MM_OP_MAIN + (MM_OP_P1CONTROLS << 6) + (MM_OP_P1MOUSE << 12), + MN_OP_MAIN + (MN_OP_P1CONTROLS << 6) + (MN_OP_P1MOUSE << 12), "M_CONTRO", OP_MouseOptionsMenu, &OP_P1ControlsDef, 35, 30); menu_t OP_Mouse2OptionsDef = DEFAULTMENUSTYLE( - MM_OP_MAIN + (MM_OP_P2CONTROLS << 6) + (MM_OP_P2MOUSE << 12), + MN_OP_MAIN + (MN_OP_P2CONTROLS << 6) + (MN_OP_P2MOUSE << 12), "M_CONTRO", OP_Mouse2OptionsMenu, &OP_P2ControlsDef, 35, 30); menu_t OP_Joystick1Def = DEFAULTMENUSTYLE( - MM_OP_MAIN + (MM_OP_P1CONTROLS << 6) + (MM_OP_P1JOYSTICK << 12), + MN_OP_MAIN + (MN_OP_P1CONTROLS << 6) + (MN_OP_P1JOYSTICK << 12), "M_CONTRO", OP_Joystick1Menu, &OP_P1ControlsDef, 50, 30); menu_t OP_Joystick2Def = DEFAULTMENUSTYLE( - MM_OP_MAIN + (MM_OP_P2CONTROLS << 6) + (MM_OP_P2JOYSTICK << 12), + MN_OP_MAIN + (MN_OP_P2CONTROLS << 6) + (MN_OP_P2JOYSTICK << 12), "M_CONTRO", OP_Joystick2Menu, &OP_P2ControlsDef, 50, 30); menu_t OP_JoystickSetDef = { - MM_OP_MAIN + (MM_OP_JOYSTICKSET << 12), // second level (<<6) set on runtime + MN_OP_MAIN + (MN_OP_JOYSTICKSET << 12), // second level (<<6) set on runtime "M_CONTRO", sizeof (OP_JoystickSetMenu)/sizeof (menuitem_t), &OP_Joystick1Def, @@ -1862,7 +1862,7 @@ menu_t OP_JoystickSetDef = menu_t OP_VideoOptionsDef = { - MM_OP_MAIN + (MM_OP_VIDEO << 6), + MN_OP_MAIN + (MN_OP_VIDEO << 6), "M_VIDEO", sizeof (OP_VideoOptionsMenu)/sizeof (menuitem_t), &OP_MainDef, @@ -1874,7 +1874,7 @@ menu_t OP_VideoOptionsDef = }; menu_t OP_VideoModeDef = { - MM_OP_MAIN + (MM_OP_VIDEO << 6) + (MM_OP_VIDEOMODE << 12), + MN_OP_MAIN + (MN_OP_VIDEO << 6) + (MN_OP_VIDEOMODE << 12), "M_VIDEO", 1, &OP_VideoOptionsDef, @@ -1886,7 +1886,7 @@ menu_t OP_VideoModeDef = }; menu_t OP_ColorOptionsDef = { - MM_OP_MAIN + (MM_OP_VIDEO << 6) + (MM_OP_COLOR << 12), + MN_OP_MAIN + (MN_OP_VIDEO << 6) + (MN_OP_COLOR << 12), "M_VIDEO", sizeof (OP_ColorOptionsMenu)/sizeof (menuitem_t), &OP_VideoOptionsDef, @@ -1898,7 +1898,7 @@ menu_t OP_ColorOptionsDef = }; menu_t OP_SoundOptionsDef = { - MM_OP_MAIN + (MM_OP_SOUND << 6), + MN_OP_MAIN + (MN_OP_SOUND << 6), "M_SOUND", sizeof (OP_SoundOptionsMenu)/sizeof (menuitem_t), &OP_MainDef, @@ -1910,12 +1910,12 @@ menu_t OP_SoundOptionsDef = }; menu_t OP_ServerOptionsDef = DEFAULTSCROLLMENUSTYLE( - MM_OP_MAIN + (MM_OP_SERVER << 6), + MN_OP_MAIN + (MN_OP_SERVER << 6), "M_SERVER", OP_ServerOptionsMenu, &OP_MainDef, 30, 30); menu_t OP_MonitorToggleDef = { - MM_OP_MAIN + (MM_OP_SERVER << 6) + (MM_OP_MONITORTOGGLE << 12), + MN_OP_MAIN + (MN_OP_SERVER << 6) + (MN_OP_MONITORTOGGLE << 12), "M_SERVER", sizeof (OP_MonitorToggleMenu)/sizeof (menuitem_t), &OP_ServerOptionsDef, @@ -1928,16 +1928,16 @@ menu_t OP_MonitorToggleDef = #ifdef HWRENDER menu_t OP_OpenGLOptionsDef = DEFAULTMENUSTYLE( - MM_OP_MAIN + (MM_OP_VIDEO << 6) + (MM_OP_OPENGL << 12), + MN_OP_MAIN + (MN_OP_VIDEO << 6) + (MN_OP_OPENGL << 12), "M_VIDEO", OP_OpenGLOptionsMenu, &OP_VideoOptionsDef, 30, 30); #ifdef ALAM_LIGHTING menu_t OP_OpenGLLightingDef = DEFAULTMENUSTYLE( - MM_OP_MAIN + (MM_OP_VIDEO << 6) + (MM_OP_OPENGL << 12) + (MM_OP_OPENGL_LIGHTING << 18), + MN_OP_MAIN + (MN_OP_VIDEO << 6) + (MN_OP_OPENGL << 12) + (MN_OP_OPENGL_LIGHTING << 18), "M_VIDEO", OP_OpenGLLightingMenu, &OP_OpenGLOptionsDef, 60, 40); #endif menu_t OP_OpenGLFogDef = { - MM_OP_MAIN + (MM_OP_VIDEO << 6) + (MM_OP_OPENGL << 12) + (MM_OP_OPENGL_FOG << 18), + MN_OP_MAIN + (MN_OP_VIDEO << 6) + (MN_OP_OPENGL << 12) + (MN_OP_OPENGL_FOG << 18), "M_VIDEO", sizeof (OP_OpenGLFogMenu)/sizeof (menuitem_t), &OP_OpenGLOptionsDef, @@ -1949,7 +1949,7 @@ menu_t OP_OpenGLFogDef = }; menu_t OP_OpenGLColorDef = { - MM_OP_MAIN + (MM_OP_VIDEO << 6) + (MM_OP_OPENGL << 12) + (MM_OP_OPENGL_COLOR << 18), + MN_OP_MAIN + (MN_OP_VIDEO << 6) + (MN_OP_OPENGL << 12) + (MN_OP_OPENGL_COLOR << 18), "M_VIDEO", sizeof (OP_OpenGLColorMenu)/sizeof (menuitem_t), &OP_OpenGLOptionsDef, @@ -1961,12 +1961,12 @@ menu_t OP_OpenGLColorDef = }; #endif menu_t OP_DataOptionsDef = DEFAULTMENUSTYLE( - MM_OP_MAIN + (MM_OP_DATA << 6), + MN_OP_MAIN + (MN_OP_DATA << 6), "M_DATA", OP_DataOptionsMenu, &OP_MainDef, 60, 30); menu_t OP_ScreenshotOptionsDef = { - MM_OP_MAIN + (MM_OP_DATA << 6) + (MM_OP_SCREENSHOTS << 12), + MN_OP_MAIN + (MN_OP_DATA << 6) + (MN_OP_SCREENSHOTS << 12), "M_DATA", sizeof (OP_ScreenshotOptionsMenu)/sizeof (menuitem_t), &OP_DataOptionsDef, @@ -1978,11 +1978,11 @@ menu_t OP_ScreenshotOptionsDef = }; menu_t OP_AddonsOptionsDef = DEFAULTMENUSTYLE( - MM_OP_MAIN + (MM_OP_DATA << 6) + (MM_OP_ADDONS << 12), + MN_OP_MAIN + (MN_OP_DATA << 6) + (MN_OP_ADDONS << 12), "M_ADDONS", OP_AddonsOptionsMenu, &OP_DataOptionsDef, 30, 30); menu_t OP_EraseDataDef = DEFAULTMENUSTYLE( - MM_OP_MAIN + (MM_OP_DATA << 6) + (MM_OP_ERASEDATA << 12), + MN_OP_MAIN + (MN_OP_DATA << 6) + (MN_OP_ERASEDATA << 12), "M_DATA", OP_EraseDataMenu, &OP_DataOptionsDef, 60, 30); // ========================================================================== @@ -4589,7 +4589,7 @@ static menuitem_t MessageMenu[] = menu_t MessageDef = { - MM_SPECIAL, + MN_SPECIAL, NULL, // title 1, // # of menu items NULL, // previous menu (TO HACK) diff --git a/src/m_menu.h b/src/m_menu.h index 2c35dbf83..300697104 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -26,95 +26,95 @@ // Menu IDs sectioned by numeric places to signify hierarchy typedef enum { - MM_NONE, + MN_NONE, - MM_MAIN, + MN_MAIN, // Single Player - MM_SP_MAIN, + MN_SP_MAIN, - MM_SP_LOAD, - MM_SP_PLAYER, + MN_SP_LOAD, + MN_SP_PLAYER, - MM_SP_LEVELSELECT, - MM_SP_LEVELSTATS, + MN_SP_LEVELSELECT, + MN_SP_LEVELSTATS, - MM_SP_TIMEATTACK, - MM_SP_TIMEATTACK_LEVELSELECT, - MM_SP_GUESTREPLAY, - MM_SP_REPLAY, - MM_SP_GHOST, + MN_SP_TIMEATTACK, + MN_SP_TIMEATTACK_LEVELSELECT, + MN_SP_GUESTREPLAY, + MN_SP_REPLAY, + MN_SP_GHOST, - MM_SP_NIGHTSATTACK, - MM_SP_NIGHTS_LEVELSELECT, - MM_SP_NIGHTS_GUESTREPLAY, - MM_SP_NIGHTS_REPLAY, - MM_SP_NIGHTS_GHOST, + MN_SP_NIGHTSATTACK, + MN_SP_NIGHTS_LEVELSELECT, + MN_SP_NIGHTS_GUESTREPLAY, + MN_SP_NIGHTS_REPLAY, + MN_SP_NIGHTS_GHOST, // Multiplayer - MM_MP_MAIN, - MM_MP_SPLITSCREEN, // SplitServer - MM_MP_SERVER, - MM_MP_CONNECT, - MM_MP_ROOM, - MM_MP_PLAYERSETUP, // MP_PlayerSetupDef shared with SPLITSCREEN if #defined NONET + MN_MP_MAIN, + MN_MP_SPLITSCREEN, // SplitServer + MN_MP_SERVER, + MN_MP_CONNECT, + MN_MP_ROOM, + MN_MP_PLAYERSETUP, // MP_PlayerSetupDef shared with SPLITSCREEN if #defined NONET // Options - MM_OP_MAIN, + MN_OP_MAIN, - MM_OP_P1CONTROLS, - MM_OP_CHANGECONTROLS, // OP_ChangeControlsDef shared with P2 - MM_OP_P1MOUSE, - MM_OP_P1JOYSTICK, - MM_OP_JOYSTICKSET, // OP_JoystickSetDef shared with P2 + MN_OP_P1CONTROLS, + MN_OP_CHANGECONTROLS, // OP_ChangeControlsDef shared with P2 + MN_OP_P1MOUSE, + MN_OP_P1JOYSTICK, + MN_OP_JOYSTICKSET, // OP_JoystickSetDef shared with P2 - MM_OP_P2CONTROLS, - MM_OP_P2MOUSE, - MM_OP_P2JOYSTICK, + MN_OP_P2CONTROLS, + MN_OP_P2MOUSE, + MN_OP_P2JOYSTICK, - MM_OP_VIDEO, - MM_OP_VIDEOMODE, - MM_OP_COLOR, - MM_OP_OPENGL, - MM_OP_OPENGL_LIGHTING, - MM_OP_OPENGL_FOG, - MM_OP_OPENGL_COLOR, + MN_OP_VIDEO, + MN_OP_VIDEOMODE, + MN_OP_COLOR, + MN_OP_OPENGL, + MN_OP_OPENGL_LIGHTING, + MN_OP_OPENGL_FOG, + MN_OP_OPENGL_COLOR, - MM_OP_SOUND, + MN_OP_SOUND, - MM_OP_SERVER, - MM_OP_MONITORTOGGLE, + MN_OP_SERVER, + MN_OP_MONITORTOGGLE, - MM_OP_DATA, - MM_OP_ADDONS, - MM_OP_SCREENSHOTS, - MM_OP_ERASEDATA, + MN_OP_DATA, + MN_OP_ADDONS, + MN_OP_SCREENSHOTS, + MN_OP_ERASEDATA, // Secrets - MM_SR_MAIN, - MM_SR_PANDORA, - MM_SR_LEVELSELECT, - MM_SR_UNLOCKCHECKLIST, - MM_SR_EMBLEMHINT, + MN_SR_MAIN, + MN_SR_PANDORA, + MN_SR_LEVELSELECT, + MN_SR_UNLOCKCHECKLIST, + MN_SR_EMBLEMHINT, // Addons (Part of MISC, but let's make it our own) - MM_AD_MAIN, + MN_AD_MAIN, // MISC - // MM_MESSAGE, - // MM_SPAUSE, + // MN_MESSAGE, + // MN_SPAUSE, - // MM_MPAUSE, - // MM_SCRAMBLETEAM, - // MM_CHANGETEAM, - // MM_CHANGELEVEL, + // MN_MPAUSE, + // MN_SCRAMBLETEAM, + // MN_CHANGETEAM, + // MN_CHANGELEVEL, - // MM_MAPAUSE, - // MM_HELP, + // MN_MAPAUSE, + // MN_HELP, - MM_SPECIAL, + MN_SPECIAL, NUMMENUTYPES, -} menutype_t; // up to 63; MM_SPECIAL = 53 +} menutype_t; // up to 63; MN_SPECIAL = 53 // Called by main loop, @@ -381,7 +381,7 @@ void Addons_option_Onchange(void); #define PAUSEMENUSTYLE(source, x, y)\ {\ - MM_SPECIAL,\ + MN_SPECIAL,\ NULL,\ sizeof(source)/sizeof(menuitem_t),\ NULL,\ @@ -433,7 +433,7 @@ void Addons_option_Onchange(void); #define IMAGEDEF(source)\ {\ - MM_SPECIAL,\ + MN_SPECIAL,\ NULL,\ sizeof (source)/sizeof (menuitem_t),\ NULL,\ From 15c0bab0c99f138b74fec07ba9eccb2deeecb10a Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 16 Nov 2018 12:07:47 -0500 Subject: [PATCH 07/50] Title screen menu SOC --- src/dehacked.c | 239 ++++++++++++++++++++++++++++++++++++++++++++++++- src/m_menu.c | 3 + src/m_menu.h | 14 +++ 3 files changed, 255 insertions(+), 1 deletion(-) diff --git a/src/dehacked.c b/src/dehacked.c index ed50aa970..678ecb7c4 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -72,6 +72,7 @@ static sfxenum_t get_sfx(const char *word); static UINT16 get_mus(const char *word, UINT8 dehacked_mode); #endif static hudnum_t get_huditem(const char *word); +static menutype_t get_menutype(const char *word); #ifndef HAVE_BLUA static powertype_t get_power(const char *word); #endif @@ -1913,6 +1914,230 @@ static void readtextprompt(MYFILE *f, INT32 num) Z_Free(s); } +static void readmenu(MYFILE *f, INT32 num) +{ + char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL); + char *word = s; + char *word2; + char *tmp; + INT32 value; + + do + { + if (myfgets(s, MAXLINELEN, f)) + { + if (s[0] == '\n') + break; + + // First remove trailing newline, if there is one + tmp = strchr(s, '\n'); + if (tmp) + *tmp = '\0'; + + tmp = strchr(s, '#'); + if (tmp) + *tmp = '\0'; + if (s == tmp) + continue; // Skip comment lines, but don't break. + + // Get the part before the " = " + tmp = strchr(s, '='); + if (tmp) + *(tmp-1) = '\0'; + else if (!strncmp(word, "MENU", 4)) + { + // HACK: readtitlescreen fails to read the next menu because it skips this line + // which already has the next menu's type + // so just loop ourselves here + tmp = strchr(s, ' '); + if (tmp) + { + word2 = (tmp += 1); + strupr(word2); + num = get_number(word2); + if (num >= 0 && num < NUMMENUTYPES) + continue; + else + { + // zero-based, but start at 1 + deh_warning("Menu number %d out of range (1 - %d)", num, NUMMENUTYPES-1); + break; + } + } + else + break; + + continue; + } + strupr(word); + + // Now get the part after + word2 = (tmp += 2); + strupr(word2); + + value = atoi(word2); // used for numerical settings + + //CONS_Printf("Menu %d> %s | %s\n", num, word, word2); + + if (fastcmp(word, "BACKGROUNDNAME")) + { + strncpy(menumeta[num].bgname, word2, 8); + titlechanged = true; + } + else if (fastcmp(word, "HIDETITLEPICS") || fastcmp(word, "HIDEPICS")) + { + menumeta[num].hidetitlepics = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); + titlechanged = true; + } + else if (fastcmp(word, "TITLESCROLLSPEED") || fastcmp(word, "TITLESCROLLXSPEED") + || fastcmp(word, "SCROLLSPEED") || fastcmp(word, "SCROLLXSPEED")) + { + menumeta[num].titlescrollspeed = get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLESCROLLYSPEED") || fastcmp(word, "SCROLLYSPEED")) + { + menumeta[num].titlescrollyspeed = get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "EXITPARENTS")) + { + menumeta[num].exitparents = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); + titlechanged = true; + } + else if (fastcmp(word, "ENTERTAG")) + { + menumeta[num].entertag = value; + titlechanged = true; + } + else if (fastcmp(word, "EXITTAG")) + { + menumeta[num].exittag = value; + titlechanged = true; + } + } + } while (!myfeof(f)); // finish when the line is empty + + Z_Free(s); +} + +static void readtitlescreen(MYFILE *f) +{ + char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL); + char *word = s; + char *word2; + char *tmp; + INT32 value; + + do + { + if (myfgets(s, MAXLINELEN, f)) + { + if (s[0] == '\n') + break; + + // First remove trailing newline, if there is one + tmp = strchr(s, '\n'); + if (tmp) + *tmp = '\0'; + + tmp = strchr(s, '#'); + if (tmp) + *tmp = '\0'; + if (s == tmp) + continue; // Skip comment lines, but don't break. + + // Get the part before the " = " + tmp = strchr(s, '='); + if (tmp) + *(tmp-1) = '\0'; + else + { + tmp = strchr(s, ' '); + if (tmp) + *(tmp) = '\0'; + else + break; + } + strupr(word); + + // Now get the part after + word2 = (*tmp == '=') ? (tmp += 2) : (tmp += 1); + strupr(word2); + + value = atoi(word2); // used for numerical settings + + //CONS_Printf("Title> %s | %s\n", word, word2); + + // NOTE: If you change these TITLE or DEMO parameters, + // also change them in `readmaincfg` + if (fastcmp(word, "LOOPTITLE")) + { + 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); + + titlemap = (INT16)value; + titlechanged = true; + } + // HIDETITLEPICS and TITLESCROLLSPEED are also in `readmenu`, per menu + if (fastcmp(word, "HIDETITLEPICS")) + { + hidetitlepics = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); + titlechanged = true; + } + else if (fastcmp(word, "TITLESCROLLSPEED") || fastcmp(word, "TITLESCROLLXSPEED")) + { + titlescrollspeed = get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "NUMDEMOS")) + { + numDemos = (UINT8)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "DEMODELAYTIME")) + { + demoDelayTime = get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "DEMOIDLETIME")) + { + demoIdleTime = get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "MENU")) + { + value = get_number(word2); + if (value >= 0 && value < NUMMENUTYPES) + readmenu(f, value); + else + // zero-based, but start at 1 + deh_warning("Menu number %d out of range (1 - %d)", value, NUMMENUTYPES-1); + + // HACK: Menu line seeking is broken; it feeds us the next line + // AFTER the menu block ends + // So in the next loop here, we're SKIPPING this next line + // We loop through MENU blocks in readmenu already, + // so just end iterating here. + break; + } + } + } while (!myfeof(f)); // finish when the line is empty + + Z_Free(s); +} + static void readhuditem(MYFILE *f, INT32 num) { char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL); @@ -3136,6 +3361,8 @@ static void readmaincfg(MYFILE *f) introtoplay = 128; introchanged = true; } + // NOTE: If you change these TITLE or DEMO parameters, + // also change them in `readtitlescreen` else if (fastcmp(word, "LOOPTITLE")) { looptitle = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); @@ -3160,7 +3387,7 @@ static void readmaincfg(MYFILE *f) hidetitlepics = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } - else if (fastcmp(word, "TITLESCROLLSPEED")) + else if (fastcmp(word, "TITLESCROLLSPEED") || fastcmp(word, "TITLESCROLLXSPEED")) { titlescrollspeed = get_number(word2); titlechanged = true; @@ -3509,6 +3736,11 @@ static void DEH_LoadDehackedFile(MYFILE *f) readmaincfg(f); continue; } + else if (fastcmp(word, "TITLESCREEN")) + { + readtitlescreen(f); + continue; + } else if (fastcmp(word, "WIPES")) { readwipes(f); @@ -8750,6 +8982,11 @@ static fixed_t find_const(const char **rword) free(word); return r; } + else if (fastncmp("MN_",word,4)) { + r = get_menutype(word); + free(word); + return r; + } else if (fastncmp("HUD_",word,4)) { r = get_huditem(word); free(word); diff --git a/src/m_menu.c b/src/m_menu.c index 741694ffa..866177ca8 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -153,6 +153,9 @@ description_t description[32] = {false, "???", "", "", 0, 0}, {false, "???", "", "", 0, 0} }; + +menumeta_t menumeta[NUMMENUTYPES]; + INT16 char_on = -1, startchar = 1; static char *char_notes = NULL; static fixed_t char_scroll = 0; diff --git a/src/m_menu.h b/src/m_menu.h index 300697104..9a901db1b 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -116,6 +116,20 @@ typedef enum NUMMENUTYPES, } menutype_t; // up to 63; MN_SPECIAL = 53 +// Menu parameters +typedef struct +{ + char bgname[8]; // name for background gfx lump; lays over titlemap if this is set + boolean hidetitlepics; // hide title gfx per menu; inherits global setting + INT32 titlescrollspeed; // background gfx scroll per menu; inherits global setting + INT32 titlescrollyspeed; // y scroll + + boolean exitparents; // run exit line exec on parent menus when entering a child menu + INT32 entertag; // line exec to run on menu enter, if titlemap + INT32 exittag; // line exec to run on menu exit, if titlemap +} menumeta_t; + +extern menumeta_t menumeta[NUMMENUTYPES]; // Called by main loop, // saves config file and calls I_Quit when user exits. From 199bc155bc765d5e16085d6da3ba76853612e021 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 16 Nov 2018 12:12:11 -0500 Subject: [PATCH 08/50] Make MENU dehacked block top-level; TITLESCREEN is not necessary --- src/dehacked.c | 166 +++++-------------------------------------------- 1 file changed, 16 insertions(+), 150 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 678ecb7c4..a7adb51b8 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1944,31 +1944,8 @@ static void readmenu(MYFILE *f, INT32 num) tmp = strchr(s, '='); if (tmp) *(tmp-1) = '\0'; - else if (!strncmp(word, "MENU", 4)) - { - // HACK: readtitlescreen fails to read the next menu because it skips this line - // which already has the next menu's type - // so just loop ourselves here - tmp = strchr(s, ' '); - if (tmp) - { - word2 = (tmp += 1); - strupr(word2); - num = get_number(word2); - if (num >= 0 && num < NUMMENUTYPES) - continue; - else - { - // zero-based, but start at 1 - deh_warning("Menu number %d out of range (1 - %d)", num, NUMMENUTYPES-1); - break; - } - } - else - break; - - continue; - } + else + break; strupr(word); // Now get the part after @@ -1977,7 +1954,7 @@ static void readmenu(MYFILE *f, INT32 num) value = atoi(word2); // used for numerical settings - //CONS_Printf("Menu %d> %s | %s\n", num, word, word2); + CONS_Printf("Menu %d> %s | %s\n", num, word, word2); if (fastcmp(word, "BACKGROUNDNAME")) { @@ -2021,123 +1998,6 @@ static void readmenu(MYFILE *f, INT32 num) Z_Free(s); } -static void readtitlescreen(MYFILE *f) -{ - char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL); - char *word = s; - char *word2; - char *tmp; - INT32 value; - - do - { - if (myfgets(s, MAXLINELEN, f)) - { - if (s[0] == '\n') - break; - - // First remove trailing newline, if there is one - tmp = strchr(s, '\n'); - if (tmp) - *tmp = '\0'; - - tmp = strchr(s, '#'); - if (tmp) - *tmp = '\0'; - if (s == tmp) - continue; // Skip comment lines, but don't break. - - // Get the part before the " = " - tmp = strchr(s, '='); - if (tmp) - *(tmp-1) = '\0'; - else - { - tmp = strchr(s, ' '); - if (tmp) - *(tmp) = '\0'; - else - break; - } - strupr(word); - - // Now get the part after - word2 = (*tmp == '=') ? (tmp += 2) : (tmp += 1); - strupr(word2); - - value = atoi(word2); // used for numerical settings - - //CONS_Printf("Title> %s | %s\n", word, word2); - - // NOTE: If you change these TITLE or DEMO parameters, - // also change them in `readmaincfg` - if (fastcmp(word, "LOOPTITLE")) - { - 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); - - titlemap = (INT16)value; - titlechanged = true; - } - // HIDETITLEPICS and TITLESCROLLSPEED are also in `readmenu`, per menu - if (fastcmp(word, "HIDETITLEPICS")) - { - hidetitlepics = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); - titlechanged = true; - } - else if (fastcmp(word, "TITLESCROLLSPEED") || fastcmp(word, "TITLESCROLLXSPEED")) - { - titlescrollspeed = get_number(word2); - titlechanged = true; - } - else if (fastcmp(word, "NUMDEMOS")) - { - numDemos = (UINT8)get_number(word2); - titlechanged = true; - } - else if (fastcmp(word, "DEMODELAYTIME")) - { - demoDelayTime = get_number(word2); - titlechanged = true; - } - else if (fastcmp(word, "DEMOIDLETIME")) - { - demoIdleTime = get_number(word2); - titlechanged = true; - } - else if (fastcmp(word, "MENU")) - { - value = get_number(word2); - if (value >= 0 && value < NUMMENUTYPES) - readmenu(f, value); - else - // zero-based, but start at 1 - deh_warning("Menu number %d out of range (1 - %d)", value, NUMMENUTYPES-1); - - // HACK: Menu line seeking is broken; it feeds us the next line - // AFTER the menu block ends - // So in the next loop here, we're SKIPPING this next line - // We loop through MENU blocks in readmenu already, - // so just end iterating here. - break; - } - } - } while (!myfeof(f)); // finish when the line is empty - - Z_Free(s); -} - static void readhuditem(MYFILE *f, INT32 num) { char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL); @@ -3361,8 +3221,6 @@ static void readmaincfg(MYFILE *f) introtoplay = 128; introchanged = true; } - // NOTE: If you change these TITLE or DEMO parameters, - // also change them in `readtitlescreen` else if (fastcmp(word, "LOOPTITLE")) { looptitle = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); @@ -3736,11 +3594,6 @@ static void DEH_LoadDehackedFile(MYFILE *f) readmaincfg(f); continue; } - else if (fastcmp(word, "TITLESCREEN")) - { - readtitlescreen(f); - continue; - } else if (fastcmp(word, "WIPES")) { readwipes(f); @@ -3894,6 +3747,19 @@ static void DEH_LoadDehackedFile(MYFILE *f) ignorelines(f); } } + else if (fastcmp(word, "MENU")) + { + if (i == 0 && word2[0] != '0') // If word2 isn't a number + i = get_menutype(word2); // find a huditem by name + if (i >= 1 && i < NUMMENUTYPES) + readmenu(f, i); + else + { + // zero-based, but let's start at 1 + deh_warning("Menu number %d out of range (1 - %d)", i, NUMMENUTYPES-1); + ignorelines(f); + } + } else if (fastcmp(word, "EMBLEM")) { if (!gamedataadded) From c4cddf8741c4b5ff9588850f0af1a0636f583773 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 16 Nov 2018 14:16:41 -0500 Subject: [PATCH 09/50] Menumeta iterators --- src/m_menu.c | 125 ++++++++++++++++++++++++++++++++++++++++++++++++--- src/m_menu.h | 12 ++++- 2 files changed, 129 insertions(+), 8 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 866177ca8..661ce04a7 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -154,8 +154,6 @@ description_t description[32] = {false, "???", "", "", 0, 0} }; -menumeta_t menumeta[NUMMENUTYPES]; - INT16 char_on = -1, startchar = 1; static char *char_notes = NULL; static fixed_t char_scroll = 0; @@ -2189,6 +2187,119 @@ void Addons_option_Onchange(void) // current menudef menu_t *currentMenu = &MainDef; +// ========================================================================= +// MENU METADATA LOGIC (BACKGROUNDS) +// ========================================================================= + +menumeta_t menumeta[NUMMENUTYPES]; + +// UINT32 menutype - current menutype_t +// INT32 level - current level up the tree, higher means younger +// INT32 *retval - Return value +// void *input - Pointer to input of any type +// +// return true - stop iterating +// return false - continue +typedef boolean (*menutree_iterator)(UINT32, INT32, INT32 *, void **); + +static INT32 M_IterateMenuTree(menutree_iterator itfunc, void **input) +{ + INT32 i, retval = 0; + UINT32 bitmask, menutype; + + for (i = NUMMENULEVELS; i >= 0; i--) + { + bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); + menutype = (currentMenu->menuid & bitmask) >> (MENUBITS*i); + if (itfunc(menutype, i, &retval, &input)) + break; + } + + return retval; +} + +static INT32 M_IterateMenuTreeFromTop(menutree_iterator itfunc, void **input) +{ + INT32 i, retval = 0; + UINT32 bitmask, menutype; + + for (i = 0; i <= NUMMENULEVELS; i++) + { + bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); + menutype = (currentMenu->menuid & bitmask) >> (MENUBITS*i); + if (itfunc(menutype, i, &retval, &input)) + break; + } + + return retval; +} + +// ==================================== +// ITERATORS +// ==================================== + +static boolean MIT_GetEdgeMenu(UINT32 menutype, INT32 level, INT32 *retval, void **input) +{ + if (menutype) + { + *retval = menutype; + return true; + } + return false; +} + +static boolean MIT_GetEdgeLevel(UINT32 menutype, INT32 level, INT32 *retval, void **input) +{ + if (menutype) + { + *retval = level; + return true; + } + return false; +} + +static boolean MIT_DrawBackground(UINT32 menutype, INT32 level, INT32 *retval, void **input) +{ + char *defaultname = (char*)*input; + + if (menumeta[menutype].bgname[0]) + { + V_DrawPatchFill(W_CachePatchName(menumeta[menutype].bgname, PU_CACHE)); + return true; + } + else if (!level && defaultname && defaultname[0]) + V_DrawPatchFill(W_CachePatchName(defaultname, PU_CACHE)); + return false; +} + +// ==================================== +// TREE RETRIEVAL +// ==================================== + +static UINT8 M_GetYoungestChildMenu() // aka the active menu +{ + return M_IterateMenuTree(MIT_GetEdgeMenu, NULL); +} + +static UINT8 M_GetOldestParentMenu() +{ + return M_IterateMenuTreeFromTop(MIT_GetEdgeMenu, NULL); +} + +static UINT8 M_GetYoungestChildLevel() // aka the active menu +{ + return M_IterateMenuTree(MIT_GetEdgeLevel, NULL); +} + +// ==================================== +// EFFECTS +// ==================================== + +static void M_DrawBackground(char *defaultname) +{ + M_IterateMenuTree(MIT_DrawBackground, defaultname); +} + // ========================================================================= // BASIC MENU HANDLING // ========================================================================= @@ -4516,7 +4627,7 @@ static void M_DrawLevelPlatterMenu(void) const INT32 cursorx = (sizeselect ? 0 : (lscol*lshseperation)); if (gamestate == GS_TIMEATTACK) - V_DrawPatchFill(W_CachePatchName("SRB2BACK", PU_CACHE)); + M_DrawBackground("SRB2BACK"); // finds row at top of the screen while (y > -8) @@ -4718,7 +4829,7 @@ static void M_DrawMessageMenu(void) // hack: draw RA background in RA menus if (gamestate == GS_TIMEATTACK) - V_DrawPatchFill(W_CachePatchName("SRB2BACK", PU_CACHE)); + M_DrawBackground("SRB2BACK"); M_DrawTextBox(currentMenu->x, y - 8, (max+7)>>3, mlines); @@ -7112,7 +7223,7 @@ static void M_DrawSetupChoosePlayerMenu(void) // Black BG V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - //V_DrawPatchFill(W_CachePatchName("SRB2BACK", PU_CACHE)); + //M_DrawBackground("SRB2BACK"); // Character select profile images!1 M_DrawTextBox(0, my, 16, 20); @@ -7502,7 +7613,7 @@ void M_DrawTimeAttackMenu(void) S_ChangeMusicInternal("_inter", true); // Eww, but needed for when user hits escape during demo playback - V_DrawPatchFill(W_CachePatchName("SRB2BACK", PU_CACHE)); + M_DrawBackground("SRB2BACK"); M_DrawMenuTitle(); @@ -7691,7 +7802,7 @@ void M_DrawNightsAttackMenu(void) S_ChangeMusicInternal("_inter", true); // Eww, but needed for when user hits escape during demo playback - V_DrawPatchFill(W_CachePatchName("SRB2BACK", PU_CACHE)); + M_DrawBackground("SRB2BACK"); M_DrawMenuTitle(); diff --git a/src/m_menu.h b/src/m_menu.h index 9a901db1b..078b9bb23 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -23,6 +23,11 @@ // MENUS // +// If menu hierarchies go deeper, change this up to 5. +// Zero-based, inclusive. +#define NUMMENULEVELS 3 +#define MENUBITS 6 + // Menu IDs sectioned by numeric places to signify hierarchy typedef enum { @@ -121,9 +126,14 @@ typedef struct { char bgname[8]; // name for background gfx lump; lays over titlemap if this is set boolean hidetitlepics; // hide title gfx per menu; inherits global setting - INT32 titlescrollspeed; // background gfx scroll per menu; inherits global setting + INT32 titlescrollxspeed; // background gfx scroll per menu; inherits global setting INT32 titlescrollyspeed; // y scroll + char musname[7]; ///< Music track to play. "" for no music. + UINT16 mustrack; ///< Subsong to play. Only really relevant for music modules and specific formats supported by GME. 0 to ignore. + boolean muslooping; ///< Loop the music + + boolean fadescreen; // darken background when displaying this menu boolean exitparents; // run exit line exec on parent menus when entering a child menu INT32 entertag; // line exec to run on menu enter, if titlemap INT32 exittag; // line exec to run on menu exit, if titlemap From 9c76c613849007e801cf332905fe25385e17dd6a Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 16 Nov 2018 14:18:35 -0500 Subject: [PATCH 10/50] Extra title SOCs: Music and FadeScreen. TitleScrollYSpeed in MainCfg --- src/dehacked.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/dehacked.c b/src/dehacked.c index a7adb51b8..ba51ac52c 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1977,6 +1977,41 @@ static void readmenu(MYFILE *f, INT32 num) menumeta[num].titlescrollyspeed = get_number(word2); titlechanged = true; } + else if (fastcmp(word, "MUSIC")) + { + strncpy(menumeta[num].musname, word2, 7); + menumeta[num].musname[6] = 0; + titlechanged = true; + } +#ifdef MUSICSLOT_COMPATIBILITY + else if (fastcmp(word, "MUSICSLOT")) + { + value = get_mus(word2, true); + if (value && value <= 1035) + snprintf(menumeta[num].musname, 7, "%sM", G_BuildMapName(value)); + else if (value && value <= 1050) + strncpy(menumeta[num].musname, compat_special_music_slots[value - 1036], 7); + else + menumeta[num].musname[0] = 0; // becomes empty string + menumeta[num].musname[6] = 0; + titlechanged = true; + } +#endif + else if (fastcmp(word, "MUSICTRACK")) + { + menumeta[num].mustrack = ((UINT16)value - 1); + titlechanged = true; + } + else if (fastcmp(word, "MUSICLOOP")) + { + menumeta[num].muslooping = (UINT8)(value || word2[0] == 'T' || word2[0] == 'Y'); + titlechanged = true; + } + else if (fastcmp(word, "FADESCREEN")) + { + menumeta[num].fadescreen = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); + titlechanged = true; + } else if (fastcmp(word, "EXITPARENTS")) { menumeta[num].exitparents = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); @@ -3250,6 +3285,11 @@ static void readmaincfg(MYFILE *f) titlescrollspeed = get_number(word2); titlechanged = true; } + else if (fastcmp(word, "TITLESCROLLYSPEED")) + { + titlescrollyspeed = get_number(word2); + titlechanged = true; + } else if (fastcmp(word, "CREDITSCUTSCENE")) { creditscutscene = (UINT8)get_number(word2); From 4d3ddda5b50b2f562b4515782cb3c2f3263e990a Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 16 Nov 2018 14:34:28 -0500 Subject: [PATCH 11/50] Sky scroll attempt --- src/dehacked.c | 4 ++-- src/f_finale.c | 54 ++++++++++++++++++++++++++++++++++---------------- src/f_finale.h | 3 ++- 3 files changed, 41 insertions(+), 20 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index ba51ac52c..286a4729b 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1969,7 +1969,7 @@ static void readmenu(MYFILE *f, INT32 num) else if (fastcmp(word, "TITLESCROLLSPEED") || fastcmp(word, "TITLESCROLLXSPEED") || fastcmp(word, "SCROLLSPEED") || fastcmp(word, "SCROLLXSPEED")) { - menumeta[num].titlescrollspeed = get_number(word2); + menumeta[num].titlescrollxspeed = get_number(word2); titlechanged = true; } else if (fastcmp(word, "TITLESCROLLYSPEED") || fastcmp(word, "SCROLLYSPEED")) @@ -3282,7 +3282,7 @@ static void readmaincfg(MYFILE *f) } else if (fastcmp(word, "TITLESCROLLSPEED") || fastcmp(word, "TITLESCROLLXSPEED")) { - titlescrollspeed = get_number(word2); + titlescrollxspeed = get_number(word2); titlechanged = true; } else if (fastcmp(word, "TITLESCROLLYSPEED")) diff --git a/src/f_finale.c b/src/f_finale.c index e8d5f4a05..2ce885502 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -43,14 +43,15 @@ // Stage of animation: // 0 = text, 1 = art screen static INT32 finalecount; -INT32 titlescrollspeed = 80; +INT32 titlescrollxspeed = 80; +INT32 titlescrollyspeed = 0; UINT8 titlemapinaction = TITLEMAP_OFF; static INT32 timetonext; // Delay between screen changes static INT32 continuetime; // Short delay when continuing static tic_t animtimer; // Used for some animation timings -static INT16 skullAnimCounter; // Chevron animation +static tic_t skullAnimCounter; // Prompts: Chevron animation; Title screen: Y animation timing static INT32 roidtics; // Asteroid spinning static INT32 deplete; @@ -79,7 +80,7 @@ static patch_t *ttspop5; static patch_t *ttspop6; static patch_t *ttspop7; -static void F_SkyScroll(INT32 scrollspeed); +static void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, char *patchname); // // PROMPT STATE @@ -184,7 +185,7 @@ static void F_NewCutscene(const char *basetext) // // F_DrawPatchCol // -static void F_DrawPatchCol(INT32 x, patch_t *patch, INT32 col) +static void F_DrawPatchCol(INT32 x, INT32 yoffs, patch_t *patch, INT32 col) { const column_t *column; const UINT8 *source; @@ -235,39 +236,55 @@ static void F_DrawPatchCol(INT32 x, patch_t *patch, INT32 col) // // F_SkyScroll // -static void F_SkyScroll(INT32 scrollspeed) +static void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, char *patchname) { INT32 scrolled, x, mx, fakedwidth; + INT32 yscrolled, y, my, fakedheight; patch_t *pat; - INT16 patwidth; + INT16 patwidth, patheight; + + if (!patchname || !patchname[0]) + { + V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); + return; + } pat = W_CachePatchName("TITLESKY", PU_CACHE); patwidth = SHORT(pat->width); - animtimer = ((finalecount*scrollspeed)/16 + patwidth) % patwidth; + animtimer = ((finalecount*scrollxspeed)/16 + patwidth) % patwidth; + + patheight = SHORT(pat->height); + skullAnimCounter = ((finalecount*scrollyspeed)/16 + patheight) % patheight; fakedwidth = vid.width / vid.dupx; + fakedheight = vid.height / vid.dupy; if (rendermode == render_soft) { // if only hardware rendering could be this elegant and complete scrolled = (patwidth - animtimer) - 1; + yscrolled = (patheight - skullAnimCounter) - 1; for (x = 0, mx = scrolled; x < fakedwidth; x++, mx = (mx+1)%patwidth) - F_DrawPatchCol(x, pat, mx); + { + for (y = 0, my = yscrolled; y < fakedheight; y++, my = (my+1)%patheight) + F_DrawPatchCol(x, y, pat, mx); + } } #ifdef HWRENDER else if (rendermode != render_none) { // if only software rendering could be this simple and retarded INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy); - INT32 y, pw = patwidth * dupz, ph = SHORT(pat->height) * dupz; + INT32 pw = patwidth * dupz, ph = patheight * dupz; scrolled = animtimer * dupz; + yscrolled = skullAnimCounter * dupz; for (x = 0; x < vid.width; x += pw) { for (y = 0; y < vid.height; y += ph) { if (scrolled > 0) - V_DrawScaledPatch(scrolled - pw, y, V_NOSCALESTART, pat); + V_DrawScaledPatch(scrolled - pw, yscrolled - ph, V_NOSCALESTART, pat); - V_DrawScaledPatch(x + scrolled, y, V_NOSCALESTART, pat); + V_DrawScaledPatch(x + scrolled, y + yscrolled, V_NOSCALESTART, pat); } } } @@ -474,7 +491,7 @@ void F_StartIntro(void) F_NewCutscene(introtext[0]); intro_scenenum = 0; - finalecount = animtimer = stoptimer = 0; + finalecount = animtimer = skullAnimCounter = stoptimer = 0; roidtics = BASEVIDWIDTH - 64; timetonext = introscenetime[intro_scenenum]; } @@ -706,7 +723,7 @@ static void F_IntroDrawScene(void) } else { - F_SkyScroll(80*4); + F_SkyScroll(80*4, 0, "TITLESKY"); if (timetonext == 6) { stoptimer = finalecount; @@ -1449,7 +1466,10 @@ void F_GameEndTicker(void) // ============== void F_StartTitleScreen(void) { - S_ChangeMusicInternal("_title", looptitle); + if (menumeta[MN_MAIN].musname[0]) + S_ChangeMusic(menumeta[MN_MAIN].musname, menumeta[MN_MAIN].mustrack, menumeta[MN_MAIN].muslooping); + else + S_ChangeMusicInternal("_title", looptitle); if (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS) finalecount = 0; @@ -1515,7 +1535,7 @@ void F_StartTitleScreen(void) // IWAD dependent stuff. - animtimer = 0; + animtimer = skullAnimCounter = 0; demoDelayLeft = demoDelayTime; demoIdleLeft = demoIdleTime; @@ -1545,7 +1565,7 @@ void F_TitleScreenDrawer(void) // Draw that sky! if (!titlemapinaction) - F_SkyScroll(titlescrollspeed); + F_SkyScroll(titlescrollxspeed, titlescrollyspeed, "TITLESKY"); // Don't draw outside of the title screewn, or if the patch isn't there. if (!ttwing || (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS)) @@ -1648,7 +1668,7 @@ void F_TitleScreenTicker(boolean run) else { // Default behavior: Do a lil' camera spin if a title map is loaded; - camera.angle += titlescrollspeed*ANG1/64; + camera.angle += titlescrollxspeed*ANG1/64; } } diff --git a/src/f_finale.h b/src/f_finale.h index 8e8a06365..d2cc4da07 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -69,7 +69,8 @@ void F_StartContinue(void); void F_ContinueTicker(void); void F_ContinueDrawer(void); -extern INT32 titlescrollspeed; +extern INT32 titlescrollxspeed; +extern INT32 titlescrollyspeed; typedef enum { From 0e0437b8947e843b1953ba38f90bf2f0cfc8d24c Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 16 Nov 2018 14:18:35 -0500 Subject: [PATCH 12/50] Extra title SOCs: Music and FadeScreen. TitleScrollYSpeed in MainCfg --- src/dehacked.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- src/f_finale.c | 7 ++++--- src/f_finale.h | 3 ++- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index a7adb51b8..286a4729b 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1969,7 +1969,7 @@ static void readmenu(MYFILE *f, INT32 num) else if (fastcmp(word, "TITLESCROLLSPEED") || fastcmp(word, "TITLESCROLLXSPEED") || fastcmp(word, "SCROLLSPEED") || fastcmp(word, "SCROLLXSPEED")) { - menumeta[num].titlescrollspeed = get_number(word2); + menumeta[num].titlescrollxspeed = get_number(word2); titlechanged = true; } else if (fastcmp(word, "TITLESCROLLYSPEED") || fastcmp(word, "SCROLLYSPEED")) @@ -1977,6 +1977,41 @@ static void readmenu(MYFILE *f, INT32 num) menumeta[num].titlescrollyspeed = get_number(word2); titlechanged = true; } + else if (fastcmp(word, "MUSIC")) + { + strncpy(menumeta[num].musname, word2, 7); + menumeta[num].musname[6] = 0; + titlechanged = true; + } +#ifdef MUSICSLOT_COMPATIBILITY + else if (fastcmp(word, "MUSICSLOT")) + { + value = get_mus(word2, true); + if (value && value <= 1035) + snprintf(menumeta[num].musname, 7, "%sM", G_BuildMapName(value)); + else if (value && value <= 1050) + strncpy(menumeta[num].musname, compat_special_music_slots[value - 1036], 7); + else + menumeta[num].musname[0] = 0; // becomes empty string + menumeta[num].musname[6] = 0; + titlechanged = true; + } +#endif + else if (fastcmp(word, "MUSICTRACK")) + { + menumeta[num].mustrack = ((UINT16)value - 1); + titlechanged = true; + } + else if (fastcmp(word, "MUSICLOOP")) + { + menumeta[num].muslooping = (UINT8)(value || word2[0] == 'T' || word2[0] == 'Y'); + titlechanged = true; + } + else if (fastcmp(word, "FADESCREEN")) + { + menumeta[num].fadescreen = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); + titlechanged = true; + } else if (fastcmp(word, "EXITPARENTS")) { menumeta[num].exitparents = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); @@ -3247,7 +3282,12 @@ static void readmaincfg(MYFILE *f) } else if (fastcmp(word, "TITLESCROLLSPEED") || fastcmp(word, "TITLESCROLLXSPEED")) { - titlescrollspeed = get_number(word2); + titlescrollxspeed = get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLESCROLLYSPEED")) + { + titlescrollyspeed = get_number(word2); titlechanged = true; } else if (fastcmp(word, "CREDITSCUTSCENE")) diff --git a/src/f_finale.c b/src/f_finale.c index e8d5f4a05..b90285a7b 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -43,7 +43,8 @@ // Stage of animation: // 0 = text, 1 = art screen static INT32 finalecount; -INT32 titlescrollspeed = 80; +INT32 titlescrollxspeed = 80; +INT32 titlescrollyspeed = 0; UINT8 titlemapinaction = TITLEMAP_OFF; static INT32 timetonext; // Delay between screen changes @@ -1545,7 +1546,7 @@ void F_TitleScreenDrawer(void) // Draw that sky! if (!titlemapinaction) - F_SkyScroll(titlescrollspeed); + F_SkyScroll(titlescrollxspeed); // Don't draw outside of the title screewn, or if the patch isn't there. if (!ttwing || (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS)) @@ -1648,7 +1649,7 @@ void F_TitleScreenTicker(boolean run) else { // Default behavior: Do a lil' camera spin if a title map is loaded; - camera.angle += titlescrollspeed*ANG1/64; + camera.angle += titlescrollxspeed*ANG1/64; } } diff --git a/src/f_finale.h b/src/f_finale.h index 8e8a06365..d2cc4da07 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -69,7 +69,8 @@ void F_StartContinue(void); void F_ContinueTicker(void); void F_ContinueDrawer(void); -extern INT32 titlescrollspeed; +extern INT32 titlescrollxspeed; +extern INT32 titlescrollyspeed; typedef enum { From 1e6369e8deba44911aea78c49c5912a4a8d76ee2 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 16 Nov 2018 18:26:26 -0500 Subject: [PATCH 13/50] Implement scrolling menu backgrounds --- src/d_main.c | 2 + src/f_finale.c | 130 +++++++++++++++---------------------------------- src/f_finale.h | 1 + src/m_menu.c | 23 ++++++++- src/m_menu.h | 2 + 5 files changed, 64 insertions(+), 94 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 35f1da7b8..ec9677173 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -732,6 +732,8 @@ void D_StartTitle(void) F_StartTitleScreen(); CON_ToggleOff(); + currentMenu = &MainDef; // reset the current menu ID + // Reset the palette if (rendermode != render_none) V_SetPaletteLump("PLAYPAL"); diff --git a/src/f_finale.c b/src/f_finale.c index 9c1d50993..6c2695a2c 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -80,7 +80,7 @@ static patch_t *ttspop5; static patch_t *ttspop6; static patch_t *ttspop7; -static void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, char *patchname); +void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, char *patchname); // // PROMPT STATE @@ -182,111 +182,58 @@ static void F_NewCutscene(const char *basetext) cutscene_textcount = TICRATE/2; } -// -// F_DrawPatchCol -// -static void F_DrawPatchCol(INT32 x, INT32 yoffs, patch_t *patch, INT32 col) -{ - const column_t *column; - const UINT8 *source; - UINT8 *desttop, *dest = NULL; - const UINT8 *deststop, *destbottom; - size_t count; - - desttop = screens[0] + x*vid.dupx; - deststop = screens[0] + vid.rowbytes * vid.height; - destbottom = desttop + vid.height*vid.width; - - do { - INT32 topdelta, prevdelta = -1; - column = (column_t *)((UINT8 *)patch + LONG(patch->columnofs[col])); - - // step through the posts in a column - while (column->topdelta != 0xff) - { - topdelta = column->topdelta; - if (topdelta <= prevdelta) - topdelta += prevdelta; - prevdelta = topdelta; - source = (const UINT8 *)column + 3; - dest = desttop + topdelta*vid.width; - count = column->length; - - while (count--) - { - INT32 dupycount = vid.dupy; - - while (dupycount-- && dest < destbottom) - { - INT32 dupxcount = vid.dupx; - while (dupxcount-- && dest <= deststop) - *dest++ = *source; - - dest += (vid.width - vid.dupx); - } - source++; - } - column = (const column_t *)((const UINT8 *)column + column->length + 4); - } - - desttop += SHORT(patch->height)*vid.dupy*vid.width; - } while(dest < destbottom); -} - // // F_SkyScroll // -static void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, char *patchname) +void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, char *patchname) { - INT32 scrolled, x, mx, fakedwidth; - INT32 yscrolled, y, my, fakedheight; - patch_t *pat; + INT32 xscrolled, x, xneg = (scrollxspeed > 0) - (scrollxspeed < 0), tilex; + INT32 yscrolled, y, yneg = (scrollyspeed > 0) - (scrollyspeed < 0), tiley; + boolean xispos = (scrollxspeed >= 0), yispos = (scrollyspeed >= 0); + INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy); INT16 patwidth, patheight; + INT32 pw, ph; // scaled by dupz + patch_t *pat; + INT32 i, j; + + if (rendermode == render_none) + return; if (!patchname || !patchname[0]) { - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); + V_DrawFill(0, 0, vid.width, vid.height, 31); return; } - pat = W_CachePatchName("TITLESKY", PU_CACHE); + pat = W_CachePatchName(patchname, PU_CACHE); patwidth = SHORT(pat->width); - animtimer = ((finalecount*scrollxspeed)/16 + patwidth) % patwidth; - patheight = SHORT(pat->height); - skullAnimCounter = ((finalecount*scrollyspeed)/16 + patheight) % patheight; + pw = patwidth * dupz; + ph = patheight * dupz; - if (rendermode == render_soft && !scrollyspeed) - { // if only hardware rendering could be this elegant and complete - // keep the old behavior for non-vertical scrolling because *shrug* - fakedwidth = vid.width / vid.dupx; - fakedheight = vid.height / vid.dupy; - scrolled = (patwidth - animtimer) - 1; - yscrolled = (patheight - skullAnimCounter) - 1; - for (x = 0, mx = scrolled; x < fakedwidth; x++, mx = (mx+1)%patwidth) - { - for (y = 0, my = yscrolled; y < fakedheight; y++, my = (my+1)%patheight) - F_DrawPatchCol(x, y, pat, mx); - } - } - else if (rendermode != render_none) - { // if only software rendering could be this simple and retarded - // but this does work! because post scrolling goes over my head :upside_down: - INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy); - INT32 pw = patwidth * dupz, ph = patheight * dupz; - scrolled = animtimer * dupz; - yscrolled = skullAnimCounter * dupz; - CONS_Printf("XScroll %d> YScroll %d\n", scrolled, yscrolled); - for (x = 0; x < vid.width; x += pw) - { - for (y = 0; y < vid.height; y += ph) - { - if (scrolled > 0) - V_DrawScaledPatch(scrolled - pw, yscrolled - ph/2, V_NOSCALESTART, pat); + tilex = max(FixedCeil(FixedDiv(vid.width, pw)) >> FRACBITS, 1)+2; // one tile on both sides of center + tiley = max(FixedCeil(FixedDiv(vid.height, ph)) >> FRACBITS, 1)+2; - V_DrawScaledPatch(x + scrolled, yscrolled - ph/2, V_NOSCALESTART, pat); - } + animtimer = ((finalecount*scrollxspeed)/16 + patwidth*xneg) % (patwidth); + skullAnimCounter = ((finalecount*scrollyspeed)/16 + patheight*yneg) % (patheight); + + // coordinate offsets + xscrolled = animtimer * dupz; + yscrolled = skullAnimCounter * dupz; + + for (x = (xispos) ? -pw*(tilex-1)+pw : 0, i = 0; + i < tilex; + x += pw, i++) + { + for (y = (yispos) ? -ph*(tiley-1)+ph : 0, j = 0; + j < tiley; + y += ph, j++) + { + V_DrawScaledPatch( + (xispos) ? xscrolled - x : x + xscrolled, + (yispos) ? yscrolled - y : y + yscrolled, + V_NOSCALESTART, pat); } } @@ -1564,8 +1511,7 @@ void F_TitleScreenDrawer(void) return; // We likely came here from retrying. Don't do a damn thing. // Draw that sky! - if (!titlemapinaction) - F_SkyScroll(titlescrollxspeed, titlescrollyspeed, "TITLESKY"); + M_DrawScrollingBackground("TITLESKY"); // Don't draw outside of the title screewn, or if the patch isn't there. if (!ttwing || (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS)) diff --git a/src/f_finale.h b/src/f_finale.h index d2cc4da07..0b84bd5b0 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -40,6 +40,7 @@ void F_TextPromptTicker(void); void F_GameEndDrawer(void); void F_IntroDrawer(void); void F_TitleScreenDrawer(void); +void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, char *patchname); void F_GameEvaluationDrawer(void); void F_StartGameEvaluation(void); diff --git a/src/m_menu.c b/src/m_menu.c index 661ce04a7..4b113e560 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2202,7 +2202,7 @@ menumeta_t menumeta[NUMMENUTYPES]; // return false - continue typedef boolean (*menutree_iterator)(UINT32, INT32, INT32 *, void **); -static INT32 M_IterateMenuTree(menutree_iterator itfunc, void **input) +static INT32 M_IterateMenuTree(menutree_iterator itfunc, void *input) { INT32 i, retval = 0; UINT32 bitmask, menutype; @@ -2218,7 +2218,7 @@ static INT32 M_IterateMenuTree(menutree_iterator itfunc, void **input) return retval; } -static INT32 M_IterateMenuTreeFromTop(menutree_iterator itfunc, void **input) +static INT32 M_IterateMenuTreeFromTop(menutree_iterator itfunc, void *input) { INT32 i, retval = 0; UINT32 bitmask, menutype; @@ -2272,6 +2272,20 @@ static boolean MIT_DrawBackground(UINT32 menutype, INT32 level, INT32 *retval, v return false; } +static boolean MIT_DrawScrollingBackground(UINT32 menutype, INT32 level, INT32 *retval, void **input) +{ + char *defaultname = (char*)*input; + + if (menumeta[menutype].bgname[0]) + { + F_SkyScroll(menumeta[menutype].titlescrollxspeed, menumeta[menutype].titlescrollyspeed, menumeta[menutype].bgname); + return true; + } + else if (!level && defaultname && defaultname[0]) + F_SkyScroll(titlescrollxspeed, titlescrollyspeed, defaultname); + return false; +} + // ==================================== // TREE RETRIEVAL // ==================================== @@ -2300,6 +2314,11 @@ static void M_DrawBackground(char *defaultname) M_IterateMenuTree(MIT_DrawBackground, defaultname); } +void M_DrawScrollingBackground(char *defaultname) +{ + M_IterateMenuTree(MIT_DrawScrollingBackground, defaultname); +} + // ========================================================================= // BASIC MENU HANDLING // ========================================================================= diff --git a/src/m_menu.h b/src/m_menu.h index 078b9bb23..e33642b0d 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -141,6 +141,8 @@ typedef struct extern menumeta_t menumeta[NUMMENUTYPES]; +void M_DrawScrollingBackground(char *defaultname); + // Called by main loop, // saves config file and calls I_Quit when user exits. // Even when the menu is not displayed, From d2bbddbed4988b583b1b360f98175ee651d5118f Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 17 Nov 2018 01:21:21 -0500 Subject: [PATCH 14/50] Implemented features * M_SkyScroll optimization with still speeds; refactor background drawing * Music (in time attack screens so far) * FadeStrength * HideTitlePics * Scrolling backgrounds in Time Attack (moved F_SkyScroll to m_menu) --- src/d_main.c | 3 + src/dehacked.c | 7 +- src/f_finale.c | 69 ++------------- src/f_finale.h | 1 - src/g_game.c | 2 + src/m_menu.c | 233 +++++++++++++++++++++++++++++++++++++++++-------- src/m_menu.h | 10 ++- 7 files changed, 221 insertions(+), 104 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index ec9677173..fa89e549e 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1096,6 +1096,9 @@ void D_SRB2Main(void) // adapt tables to SRB2's needs, including extra slots for dehacked file support P_PatchInfoTables(); + // initiate menu metadata before SOCcing them + MN_InitInfoTables(); + //---------------------------------------------------- READY TIME // we need to check for dedicated before initialization of some subsystems diff --git a/src/dehacked.c b/src/dehacked.c index 286a4729b..c3db3f57e 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1963,6 +1963,7 @@ static void readmenu(MYFILE *f, INT32 num) } else if (fastcmp(word, "HIDETITLEPICS") || fastcmp(word, "HIDEPICS")) { + // true by default, except MM_MAIN menumeta[num].hidetitlepics = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } @@ -2004,12 +2005,14 @@ static void readmenu(MYFILE *f, INT32 num) } else if (fastcmp(word, "MUSICLOOP")) { + // true by default except MM_MAIN menumeta[num].muslooping = (UINT8)(value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } - else if (fastcmp(word, "FADESCREEN")) + else if (fastcmp(word, "FADESTRENGTH")) { - menumeta[num].fadescreen = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); + // one-based, <= 0 means use default value. 1-32 + menumeta[num].fadestrength = value-1; titlechanged = true; } else if (fastcmp(word, "EXITPARENTS")) diff --git a/src/f_finale.c b/src/f_finale.c index 6c2695a2c..c6963cdfa 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -80,8 +80,6 @@ static patch_t *ttspop5; static patch_t *ttspop6; static patch_t *ttspop7; -void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, char *patchname); - // // PROMPT STATE // @@ -182,64 +180,6 @@ static void F_NewCutscene(const char *basetext) cutscene_textcount = TICRATE/2; } -// -// F_SkyScroll -// -void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, char *patchname) -{ - INT32 xscrolled, x, xneg = (scrollxspeed > 0) - (scrollxspeed < 0), tilex; - INT32 yscrolled, y, yneg = (scrollyspeed > 0) - (scrollyspeed < 0), tiley; - boolean xispos = (scrollxspeed >= 0), yispos = (scrollyspeed >= 0); - INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy); - INT16 patwidth, patheight; - INT32 pw, ph; // scaled by dupz - patch_t *pat; - INT32 i, j; - - if (rendermode == render_none) - return; - - if (!patchname || !patchname[0]) - { - V_DrawFill(0, 0, vid.width, vid.height, 31); - return; - } - - pat = W_CachePatchName(patchname, PU_CACHE); - - patwidth = SHORT(pat->width); - patheight = SHORT(pat->height); - pw = patwidth * dupz; - ph = patheight * dupz; - - tilex = max(FixedCeil(FixedDiv(vid.width, pw)) >> FRACBITS, 1)+2; // one tile on both sides of center - tiley = max(FixedCeil(FixedDiv(vid.height, ph)) >> FRACBITS, 1)+2; - - animtimer = ((finalecount*scrollxspeed)/16 + patwidth*xneg) % (patwidth); - skullAnimCounter = ((finalecount*scrollyspeed)/16 + patheight*yneg) % (patheight); - - // coordinate offsets - xscrolled = animtimer * dupz; - yscrolled = skullAnimCounter * dupz; - - for (x = (xispos) ? -pw*(tilex-1)+pw : 0, i = 0; - i < tilex; - x += pw, i++) - { - for (y = (yispos) ? -ph*(tiley-1)+ph : 0, j = 0; - j < tiley; - y += ph, j++) - { - V_DrawScaledPatch( - (xispos) ? xscrolled - x : x + xscrolled, - (yispos) ? yscrolled - y : y + yscrolled, - V_NOSCALESTART, pat); - } - } - - W_UnlockCachedPatch(pat); -} - // ============= // INTRO SCENE // ============= @@ -670,7 +610,7 @@ static void F_IntroDrawScene(void) } else { - F_SkyScroll(80*4, 0, "TITLESKY"); + M_SkyScroll(80*4, 0, "TITLESKY"); if (timetonext == 6) { stoptimer = finalecount; @@ -1413,6 +1353,8 @@ void F_GameEndTicker(void) // ============== void F_StartTitleScreen(void) { + MN_Start(); + if (menumeta[MN_MAIN].musname[0]) S_ChangeMusic(menumeta[MN_MAIN].musname, menumeta[MN_MAIN].mustrack, menumeta[MN_MAIN].muslooping); else @@ -1507,6 +1449,8 @@ void F_StartTitleScreen(void) // (no longer) De-Demo'd Title Screen void F_TitleScreenDrawer(void) { + boolean hidepics; + if (modeattacking) return; // We likely came here from retrying. Don't do a damn thing. @@ -1518,7 +1462,8 @@ void F_TitleScreenDrawer(void) return; // rei|miru: use title pics? - if (hidetitlepics) + hidepics = M_GetHideTitlePics(); + if (hidepics) #ifdef HAVE_BLUA goto luahook; #else diff --git a/src/f_finale.h b/src/f_finale.h index 0b84bd5b0..d2cc4da07 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -40,7 +40,6 @@ void F_TextPromptTicker(void); void F_GameEndDrawer(void); void F_IntroDrawer(void); void F_TitleScreenDrawer(void); -void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, char *patchname); void F_GameEvaluationDrawer(void); void F_StartGameEvaluation(void); diff --git a/src/g_game.c b/src/g_game.c index e250bacc5..c04e707cd 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1954,6 +1954,7 @@ void G_Ticker(boolean run) break; case GS_TIMEATTACK: + MN_Ticker(run); break; case GS_INTRO: @@ -1993,6 +1994,7 @@ void G_Ticker(boolean run) if (titlemapinaction) P_Ticker(run); // then intentionally fall through /* FALLTHRU */ case GS_WAITINGPLAYERS: + MN_Ticker(run); F_TitleScreenTicker(run); break; diff --git a/src/m_menu.c b/src/m_menu.c index 4b113e560..8899e2a73 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2192,6 +2192,16 @@ menu_t *currentMenu = &MainDef; // ========================================================================= menumeta_t menumeta[NUMMENUTYPES]; +static tic_t xscrolltimer; +static tic_t yscrolltimer; +static INT32 menuanimtimer; + +typedef struct +{ + char musname[7]; + UINT16 mustrack; + boolean muslooping; +} menumetamusic_t; // UINT32 menutype - current menutype_t // INT32 level - current level up the tree, higher means younger @@ -2258,31 +2268,58 @@ static boolean MIT_GetEdgeLevel(UINT32 menutype, INT32 level, INT32 *retval, voi return false; } -static boolean MIT_DrawBackground(UINT32 menutype, INT32 level, INT32 *retval, void **input) -{ - char *defaultname = (char*)*input; - - if (menumeta[menutype].bgname[0]) - { - V_DrawPatchFill(W_CachePatchName(menumeta[menutype].bgname, PU_CACHE)); - return true; - } - else if (!level && defaultname && defaultname[0]) - V_DrawPatchFill(W_CachePatchName(defaultname, PU_CACHE)); - return false; -} - static boolean MIT_DrawScrollingBackground(UINT32 menutype, INT32 level, INT32 *retval, void **input) { char *defaultname = (char*)*input; if (menumeta[menutype].bgname[0]) { - F_SkyScroll(menumeta[menutype].titlescrollxspeed, menumeta[menutype].titlescrollyspeed, menumeta[menutype].bgname); + M_SkyScroll(menumeta[menutype].titlescrollxspeed, menumeta[menutype].titlescrollyspeed, menumeta[menutype].bgname); return true; } else if (!level && defaultname && defaultname[0]) - F_SkyScroll(titlescrollxspeed, titlescrollyspeed, defaultname); + M_SkyScroll(titlescrollxspeed, titlescrollyspeed, defaultname); + return false; +} + +static boolean MIT_ChangeMusic(UINT32 menutype, INT32 level, INT32 *retval, void **input) +{ + menumetamusic_t *defaultmusic = (menumetamusic_t*)*input; + + if (menumeta[menutype].musname[0]) + { + S_ChangeMusic(menumeta[menutype].musname, menumeta[menutype].mustrack, menumeta[menutype].muslooping); + return true; + } + else if (!level && defaultmusic && defaultmusic->musname[0]) + S_ChangeMusic(defaultmusic->musname, defaultmusic->mustrack, defaultmusic->muslooping); + return false; +} + +static boolean MIT_FadeScreen(UINT32 menutype, INT32 level, INT32 *retval, void **input) +{ + UINT8 defaultvalue = *(UINT8*)*input; + if (menumeta[menutype].fadestrength >= 0) + { + if (menumeta[menutype].fadestrength % 32) + V_DrawFadeScreen(0xFF00, menumeta[menutype].fadestrength % 32); + return true; + } + else if (!level && (defaultvalue % 32)) + V_DrawFadeScreen(0xFF00, defaultvalue % 32); + return false; +} + +static boolean MIT_GetHideTitlePics(UINT32 menutype, INT32 level, INT32 *retval, void **input) +{ + (void)input; + if (menumeta[menutype].hidetitlepics >= 0) + { + *retval = menumeta[menutype].hidetitlepics; + return true; + } + else if (!level) + *retval = -1; return false; } @@ -2309,16 +2346,37 @@ static UINT8 M_GetYoungestChildLevel() // aka the active menu // EFFECTS // ==================================== -static void M_DrawBackground(char *defaultname) -{ - M_IterateMenuTree(MIT_DrawBackground, defaultname); -} - void M_DrawScrollingBackground(char *defaultname) { M_IterateMenuTree(MIT_DrawScrollingBackground, defaultname); } +static void M_ChangeMusic(char *defaultmusname, boolean defaultmuslooping) +{ + menumetamusic_t defaultmusic; + + if (!defaultmusname) + defaultmusname = ""; + + strncpy(defaultmusic.musname, defaultmusname, 7); + defaultmusic.musname[6] = 0; + defaultmusic.mustrack = 0; + defaultmusic.muslooping = defaultmuslooping; + + M_IterateMenuTree(MIT_ChangeMusic, &defaultmusic); +} + +static void M_DrawFadeScreen(UINT8 defaultvalue) +{ + M_IterateMenuTree(MIT_FadeScreen, &defaultvalue); +} + +boolean M_GetHideTitlePics(void) +{ + INT32 retval = M_IterateMenuTree(MIT_GetHideTitlePics, NULL); + return (retval >= 0 ? retval : hidetitlepics); +} + // ========================================================================= // BASIC MENU HANDLING // ========================================================================= @@ -2807,7 +2865,7 @@ void M_Drawer(void) { // now that's more readable with a faded background (yeah like Quake...) if (!WipeInAction) - V_DrawFadeScreen(0xFF00, 16); + M_DrawFadeScreen(16); if (currentMenu->drawroutine) currentMenu->drawroutine(); // call current menu Draw routine @@ -3108,6 +3166,103 @@ void M_Init(void) #endif } +// ========================================================================== +// COMMON MENU DRAW ROUTINES +// ========================================================================== + +void MN_InitInfoTables(void) +{ + INT32 i; + + // Called in d_main before SOC can get to the tables + // Set menumeta defaults + for (i = 0; i < NUMMENUTYPES; i++) + { + if (i != MN_MAIN) + { + menumeta[i].muslooping = true; + } + // so-called "undefined" + menumeta[i].fadestrength = -1; + menumeta[i].hidetitlepics = -1; // inherits global hidetitlepics + } +} + +void MN_Start(void) +{ + menuanimtimer = 0; +} + +void MN_Ticker(boolean run) +{ + if (run) + menuanimtimer++; +} + +// +// M_SkyScroll +// +void M_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, char *patchname) +{ + INT32 xscrolled, x, xneg = (scrollxspeed > 0) - (scrollxspeed < 0), tilex; + INT32 yscrolled, y, yneg = (scrollyspeed > 0) - (scrollyspeed < 0), tiley; + boolean xispos = (scrollxspeed >= 0), yispos = (scrollyspeed >= 0); + INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy); + INT16 patwidth, patheight; + INT32 pw, ph; // scaled by dupz + patch_t *pat; + INT32 i, j; + + if (rendermode == render_none) + return; + + if (!patchname || !patchname[0]) + { + V_DrawFill(0, 0, vid.width, vid.height, 31); + return; + } + + if (!scrollxspeed && !scrollyspeed) + { + V_DrawPatchFill(W_CachePatchName(patchname, PU_CACHE)); + return; + } + + pat = W_CachePatchName(patchname, PU_CACHE); + + patwidth = SHORT(pat->width); + patheight = SHORT(pat->height); + pw = patwidth * dupz; + ph = patheight * dupz; + + tilex = max(FixedCeil(FixedDiv(vid.width, pw)) >> FRACBITS, 1)+2; // one tile on both sides of center + tiley = max(FixedCeil(FixedDiv(vid.height, ph)) >> FRACBITS, 1)+2; + + xscrolltimer = ((menuanimtimer*scrollxspeed)/16 + patwidth*xneg) % (patwidth); + yscrolltimer = ((menuanimtimer*scrollyspeed)/16 + patheight*yneg) % (patheight); + + // coordinate offsets + xscrolled = xscrolltimer * dupz; + yscrolled = yscrolltimer * dupz; + + for (x = (xispos) ? -pw*(tilex-1)+pw : 0, i = 0; + i < tilex; + x += pw, i++) + { + for (y = (yispos) ? -ph*(tiley-1)+ph : 0, j = 0; + j < tiley; + y += ph, j++) + { + V_DrawScaledPatch( + (xispos) ? xscrolled - x : x + xscrolled, + (yispos) ? yscrolled - y : y + yscrolled, + V_NOSCALESTART, pat); + } + } + + W_UnlockCachedPatch(pat); +} + // ========================================================================== // SPECIAL MENU OPTION DRAW ROUTINES GO HERE // ========================================================================== @@ -4646,7 +4801,10 @@ static void M_DrawLevelPlatterMenu(void) const INT32 cursorx = (sizeselect ? 0 : (lscol*lshseperation)); if (gamestate == GS_TIMEATTACK) - M_DrawBackground("SRB2BACK"); + { + M_DrawScrollingBackground("SRB2BACK"); + M_DrawFadeScreen(0); + } // finds row at top of the screen while (y > -8) @@ -4848,7 +5006,7 @@ static void M_DrawMessageMenu(void) // hack: draw RA background in RA menus if (gamestate == GS_TIMEATTACK) - M_DrawBackground("SRB2BACK"); + M_DrawScrollingBackground("SRB2BACK"); M_DrawTextBox(currentMenu->x, y - 8, (max+7)>>3, mlines); @@ -7142,12 +7300,8 @@ static void M_SetupChoosePlayer(INT32 choice) return; } - if (Playing() == false) - { - S_StopMusic(); - S_ChangeMusicInternal("_chsel", true); - } + M_ChangeMusic("_chsel", true); SP_PlayerDef.prevMenu = currentMenu; M_SetupNextMenu(&SP_PlayerDef); @@ -7242,7 +7396,7 @@ static void M_DrawSetupChoosePlayerMenu(void) // Black BG V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - //M_DrawBackground("SRB2BACK"); + //M_DrawScrollingBackground("SRB2BACK"); // Character select profile images!1 M_DrawTextBox(0, my, 16, 20); @@ -7629,10 +7783,13 @@ void M_DrawTimeAttackMenu(void) INT32 i, x, y, cursory = 0; UINT16 dispstatus; patch_t *PictureOfUrFace; + menutype_t menutype = M_GetYoungestChildMenu(); - S_ChangeMusicInternal("_inter", true); // Eww, but needed for when user hits escape during demo playback + M_ChangeMusic("_inter", true); // Eww, but needed for when user hits escape during demo playback - M_DrawBackground("SRB2BACK"); + M_DrawScrollingBackground("SRB2BACK"); + + M_DrawFadeScreen(0); M_DrawMenuTitle(); @@ -7808,7 +7965,7 @@ static void M_TimeAttack(INT32 choice) Nextmap_OnChange(); G_SetGamestate(GS_TIMEATTACK); - S_ChangeMusicInternal("_inter", true); + M_ChangeMusic("_inter", true); itemOn = tastart; // "Start" is selected. } @@ -7819,9 +7976,11 @@ void M_DrawNightsAttackMenu(void) INT32 i, x, y, cursory = 0; UINT16 dispstatus; - S_ChangeMusicInternal("_inter", true); // Eww, but needed for when user hits escape during demo playback + M_ChangeMusic("_inter", true); // Eww, but needed for when user hits escape during demo playback - M_DrawBackground("SRB2BACK"); + M_DrawScrollingBackground("SRB2BACK"); + + M_DrawFadeScreen(0); M_DrawMenuTitle(); @@ -7985,7 +8144,7 @@ static void M_NightsAttack(INT32 choice) Nextmap_OnChange(); G_SetGamestate(GS_TIMEATTACK); - S_ChangeMusicInternal("_inter", true); + M_ChangeMusic("_inter", true); itemOn = nastart; // "Start" is selected. } @@ -8219,7 +8378,7 @@ static void M_ModeAttackEndGame(INT32 choice) itemOn = currentMenu->lastOn; G_SetGamestate(GS_TIMEATTACK); modeattacking = ATTACKING_NONE; - S_ChangeMusicInternal("_inter", true); + M_ChangeMusic("_inter", true); Nextmap_OnChange(); } diff --git a/src/m_menu.h b/src/m_menu.h index e33642b0d..979165e98 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -125,7 +125,7 @@ typedef enum typedef struct { char bgname[8]; // name for background gfx lump; lays over titlemap if this is set - boolean hidetitlepics; // hide title gfx per menu; inherits global setting + SINT8 hidetitlepics; // hide title gfx per menu; -1 means undefined, inherits global setting INT32 titlescrollxspeed; // background gfx scroll per menu; inherits global setting INT32 titlescrollyspeed; // y scroll @@ -133,7 +133,7 @@ typedef struct UINT16 mustrack; ///< Subsong to play. Only really relevant for music modules and specific formats supported by GME. 0 to ignore. boolean muslooping; ///< Loop the music - boolean fadescreen; // darken background when displaying this menu + SINT8 fadestrength; // darken background when displaying this menu, strength 0-31 or -1 for undefined boolean exitparents; // run exit line exec on parent menus when entering a child menu INT32 entertag; // line exec to run on menu enter, if titlemap INT32 exittag; // line exec to run on menu exit, if titlemap @@ -142,6 +142,12 @@ typedef struct extern menumeta_t menumeta[NUMMENUTYPES]; void M_DrawScrollingBackground(char *defaultname); +void M_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, char *patchname); +boolean M_GetHideTitlePics(void); +void MN_Ticker(boolean run); +void MN_Start(void); +void MN_InitInfoTables(void); + // Called by main loop, // saves config file and calls I_Quit when user exits. From 758647fab294af5ec08107767e3a32d63b69799b Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 17 Nov 2018 16:32:30 -0500 Subject: [PATCH 15/50] More title screen features; menu meta state implementation (active and previous menu types) * Draw background over titlemap * HIDEBACKGROUND to show titlemap * Specify NOMUSIC or IGNOREMUSIC (to not change music) * Linedef execs implemented for tree hierarchy, including bubbling (NOENTERBUBBLE/NOEXITBUBBLE) * Specify ENTERWIPE and EXITWIPE * Menuid hierarchy fixes (Control mapping, joystick setup) * Time attack handling fixes * Specify custom wipes on runtime for D_Display and P_SetupLevel (for titlemap) * Allow for forcing and skipping a wipe * Wipe utility functions F_GetWipeLength and F_WipeExists --- src/d_main.c | 36 +++++- src/dehacked.c | 41 +++++- src/doomstat.h | 2 + src/f_finale.c | 9 +- src/f_finale.h | 5 + src/f_wipe.c | 45 +++++++ src/m_menu.c | 345 ++++++++++++++++++++++++++++++++++++++++++------- src/m_menu.h | 8 +- src/p_setup.c | 8 +- 9 files changed, 438 insertions(+), 61 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index fa89e549e..ef2d481bf 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -233,6 +233,9 @@ void D_ProcessEvents(void) // wipegamestate can be set to -1 to force a wipe on the next draw // added comment : there is a wipe eatch change of the gamestate gamestate_t wipegamestate = GS_LEVEL; +// -1: Default; 0-n: Wipe index; INT16_MAX: do not wipe +INT16 wipetypepre = -1; +INT16 wipetypepost = -1; static void D_Display(void) { @@ -266,7 +269,7 @@ static void D_Display(void) // save the current screen if about to wipe wipe = (gamestate != wipegamestate); - if (wipe) + if (wipe && wipetypepre != INT16_MAX) { // set for all later wipedefindex = gamestate; // wipe_xxx_toblack @@ -278,21 +281,29 @@ static void D_Display(void) wipedefindex = wipe_multinter_toblack; } + if (wipetypepre < 0 || !F_WipeExists(wipetypepre)) + wipetypepre = wipedefs[wipedefindex]; + if (rendermode != render_none) { // Fade to black first - if (!(gamestate == GS_LEVEL || (gamestate == GS_TITLESCREEN && titlemapinaction)) // fades to black on its own timing, always - && wipedefs[wipedefindex] != UINT8_MAX) + if ((wipegamestate == FORCEWIPE || + !(gamestate == GS_LEVEL || (gamestate == GS_TITLESCREEN && titlemapinaction))) // fades to black on its own timing, always + && wipetypepre != UINT8_MAX) { F_WipeStartScreen(); V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); F_WipeEndScreen(); - F_RunWipe(wipedefs[wipedefindex], gamestate != GS_TIMEATTACK); + F_RunWipe(wipetypepre, gamestate != GS_TIMEATTACK && gamestate != GS_TITLESCREEN); } F_WipeStartScreen(); } + + wipetypepre = -1; } + else + wipetypepre = -1; // do buffered drawing switch (gamestate) @@ -359,6 +370,10 @@ static void D_Display(void) break; } + // Run menu state updates and linedef execs in titlemap + if (wipe && (gamestate == GS_TITLESCREEN || gamestate == GS_TIMEATTACK)) + M_ApplyMenuMetaState(); + // clean up border stuff // see if the border needs to be initially drawn if (gamestate == GS_LEVEL || (gamestate == GS_TITLESCREEN && titlemapinaction)) @@ -465,18 +480,25 @@ static void D_Display(void) // // wipe update // - if (wipe) + if (wipe && wipetypepost != INT16_MAX) { // note: moved up here because NetUpdate does input changes // and input during wipe tends to mess things up wipedefindex += WIPEFINALSHIFT; + if (wipetypepost < 0 || !F_WipeExists(wipetypepost)) + wipetypepost = wipedefs[wipedefindex]; + if (rendermode != render_none) { F_WipeEndScreen(); - F_RunWipe(wipedefs[wipedefindex], gamestate != GS_TIMEATTACK); + F_RunWipe(wipetypepost, gamestate != GS_TIMEATTACK && gamestate != GS_TITLESCREEN); } + + wipetypepost = -1; } + else + wipetypepost = -1; NetUpdate(); // send out any new accumulation @@ -729,6 +751,7 @@ void D_StartTitle(void) gametype = GT_COOP; paused = false; advancedemo = false; + MN_Start(); F_StartTitleScreen(); CON_ToggleOff(); @@ -1378,6 +1401,7 @@ void D_SRB2Main(void) { CON_ToggleOff(); CON_ClearHUD(); + MN_Start(); F_StartTitleScreen(); } else diff --git a/src/dehacked.c b/src/dehacked.c index c3db3f57e..7d37494dc 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1954,13 +1954,19 @@ static void readmenu(MYFILE *f, INT32 num) value = atoi(word2); // used for numerical settings - CONS_Printf("Menu %d> %s | %s\n", num, word, word2); - if (fastcmp(word, "BACKGROUNDNAME")) { strncpy(menumeta[num].bgname, word2, 8); titlechanged = true; } + else if (fastcmp(word, "HIDEBACKGROUND")) + { + // HACK: Use CHAR_MAX to signal that we want to hide the background + // Only effective during titlemap + menumeta[num].bgname[0] = CHAR_MAX; + menumeta[num].bgname[1] = 0; + titlechanged = true; + } else if (fastcmp(word, "HIDETITLEPICS") || fastcmp(word, "HIDEPICS")) { // true by default, except MM_MAIN @@ -2006,7 +2012,17 @@ static void readmenu(MYFILE *f, INT32 num) else if (fastcmp(word, "MUSICLOOP")) { // true by default except MM_MAIN - menumeta[num].muslooping = (UINT8)(value || word2[0] == 'T' || word2[0] == 'Y'); + menumeta[num].muslooping = (value || word2[0] == 'T' || word2[0] == 'Y'); + titlechanged = true; + } + else if (fastcmp(word, "NOMUSIC")) + { + menumeta[num].musstop = (value || word2[0] == 'T' || word2[0] == 'Y'); + titlechanged = true; + } + else if (fastcmp(word, "IGNOREMUSIC")) + { + menumeta[num].musignore = (value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } else if (fastcmp(word, "FADESTRENGTH")) @@ -2015,9 +2031,14 @@ static void readmenu(MYFILE *f, INT32 num) menumeta[num].fadestrength = value-1; titlechanged = true; } - else if (fastcmp(word, "EXITPARENTS")) + else if (fastcmp(word, "NOENTERBUBBLE")) { - menumeta[num].exitparents = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); + menumeta[num].enterbubble = !(value || word2[0] == 'T' || word2[0] == 'Y'); + titlechanged = true; + } + else if (fastcmp(word, "NOEXITBUBBLE")) + { + menumeta[num].exitbubble = !(value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } else if (fastcmp(word, "ENTERTAG")) @@ -2030,6 +2051,16 @@ static void readmenu(MYFILE *f, INT32 num) menumeta[num].exittag = value; titlechanged = true; } + else if (fastcmp(word, "ENTERWIPE")) + { + menumeta[num].enterwipe = value; + titlechanged = true; + } + else if (fastcmp(word, "EXITWIPE")) + { + menumeta[num].exitwipe = value; + titlechanged = true; + } } } while (!myfeof(f)); // finish when the line is empty diff --git a/src/doomstat.h b/src/doomstat.h index 337eff7a9..1ff261d64 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -546,6 +546,8 @@ extern boolean precache; // wipegamestate can be set to -1 // to force a wipe on the next draw extern gamestate_t wipegamestate; +extern INT16 wipetypepre; +extern INT16 wipetypepost; // debug flag to cancel adaptiveness extern boolean singletics; diff --git a/src/f_finale.c b/src/f_finale.c index c6963cdfa..4a1267265 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -1353,15 +1353,16 @@ void F_GameEndTicker(void) // ============== void F_StartTitleScreen(void) { - MN_Start(); - if (menumeta[MN_MAIN].musname[0]) S_ChangeMusic(menumeta[MN_MAIN].musname, menumeta[MN_MAIN].mustrack, menumeta[MN_MAIN].muslooping); else S_ChangeMusicInternal("_title", looptitle); if (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS) + { finalecount = 0; + wipetypepost = menumeta[MN_MAIN].enterwipe; + } else wipegamestate = GS_TITLESCREEN; @@ -1411,6 +1412,10 @@ void F_StartTitleScreen(void) camera.chase = true; camera.height = 0; + // Run enter linedef exec for MN_MAIN, since this is where we start + if (menumeta[MN_MAIN].entertag) + P_LinedefExecute(menumeta[MN_MAIN].entertag, players[displayplayer].mo, NULL); + wipegamestate = prevwipegamestate; } else diff --git a/src/f_finale.h b/src/f_finale.h index d2cc4da07..3a9ad2091 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -84,12 +84,17 @@ extern UINT8 titlemapinaction; // // WIPE // +// HACK for menu fading while titlemapinaction; skips the level check +#define FORCEWIPE -2 + extern boolean WipeInAction; extern INT32 lastwipetic; void F_WipeStartScreen(void); void F_WipeEndScreen(void); void F_RunWipe(UINT8 wipetype, boolean drawMenu); +tic_t F_GetWipeLength(UINT8 wipetype); +boolean F_WipeExists(UINT8 wipetype); enum { diff --git a/src/f_wipe.c b/src/f_wipe.c index 49ab9cc01..3e0d474c6 100644 --- a/src/f_wipe.c +++ b/src/f_wipe.c @@ -378,3 +378,48 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu) WipeInAction = false; #endif } + +/** Returns tic length of wipe + * One lump equals one tic + */ +tic_t F_GetWipeLength(UINT8 wipetype) +{ +#ifdef NOWIPE + return 0; +#else + static char lumpname[10] = "FADEmmss"; + lumpnum_t lumpnum; + UINT8 wipeframe; + + if (wipetype > 99) + return 0; + + for (wipeframe = 0; wipeframe < 100; wipeframe++) + { + sprintf(&lumpname[4], "%.2hu%.2hu", (UINT16)wipetype, (UINT16)wipeframe); + + lumpnum = W_CheckNumForName(lumpname); + if (lumpnum == LUMPERROR) + return --wipeframe; + } + return --wipeframe; +#endif +} + +boolean F_WipeExists(UINT8 wipetype) +{ +#ifdef NOWIPE + return false; +#else + static char lumpname[10] = "FADEmm00"; + lumpnum_t lumpnum; + + if (wipetype > 99) + return false; + + sprintf(&lumpname[4], "%.2hu00", (UINT16)wipetype); + + lumpnum = W_CheckNumForName(lumpname); + return !(lumpnum == LUMPERROR); +#endif +} diff --git a/src/m_menu.c b/src/m_menu.c index 8899e2a73..fcab1043b 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1809,9 +1809,9 @@ menu_t MP_RoomDef = menu_t MP_PlayerSetupDef = { #ifdef NONET - MN_MP_MAIN + (MN_MP_SPLITSCREEN << 6) + (MN_MP_PLAYERSETUP << 12), -#else MN_MP_MAIN + (MN_MP_PLAYERSETUP << 6), +#else + MN_MP_MAIN + (MN_MP_SPLITSCREEN << 6) + (MN_MP_PLAYERSETUP << 12), #endif "M_SPLAYR", sizeof (MP_PlayerSetupMenu)/sizeof (menuitem_t), @@ -1850,7 +1850,7 @@ menu_t OP_Joystick2Def = DEFAULTMENUSTYLE( "M_CONTRO", OP_Joystick2Menu, &OP_P2ControlsDef, 50, 30); menu_t OP_JoystickSetDef = { - MN_OP_MAIN + (MN_OP_JOYSTICKSET << 12), // second level (<<6) set on runtime + MN_OP_MAIN + (MN_OP_JOYSTICKSET << MENUBITS*3), // second (<<6) and third level (<<12) set on runtime "M_CONTRO", sizeof (OP_JoystickSetMenu)/sizeof (menuitem_t), &OP_Joystick1Def, @@ -2196,6 +2196,10 @@ static tic_t xscrolltimer; static tic_t yscrolltimer; static INT32 menuanimtimer; +// menu IDs are equal to current/prevMenu in most cases, except MM_SPECIAL when we don't want to operate on Message, Pause, etc. +static UINT32 prevMenuId = 0; +static UINT32 activeMenuId = 0; + typedef struct { char musname[7]; @@ -2203,6 +2207,38 @@ typedef struct boolean muslooping; } menumetamusic_t; +void MN_InitInfoTables(void) +{ + INT32 i; + + // Called in d_main before SOC can get to the tables + // Set menumeta defaults + for (i = 0; i < NUMMENUTYPES; i++) + { + if (i != MN_MAIN) + { + menumeta[i].muslooping = true; + } + if (i == MN_SP_TIMEATTACK || i == MN_SP_NIGHTSATTACK) + strncpy(menumeta[i].musname, "_inter", 7); + if (i == MN_SP_PLAYER) + strncpy(menumeta[i].musname, "_chsel", 7); + + // so-called "undefined" + menumeta[i].fadestrength = -1; + menumeta[i].hidetitlepics = -1; // inherits global hidetitlepics + menumeta[i].enterwipe = -1; + menumeta[i].exitwipe = -1; + // default true + menumeta[i].enterbubble = true; + menumeta[i].exitbubble = true; + } +} + +// ==================================== +// TREE ITERATION +// ==================================== + // UINT32 menutype - current menutype_t // INT32 level - current level up the tree, higher means younger // INT32 *retval - Return value @@ -2210,7 +2246,7 @@ typedef struct // // return true - stop iterating // return false - continue -typedef boolean (*menutree_iterator)(UINT32, INT32, INT32 *, void **); +typedef boolean (*menutree_iterator)(UINT32, INT32, INT32 *, void **, boolean fromoldest); static INT32 M_IterateMenuTree(menutree_iterator itfunc, void *input) { @@ -2220,8 +2256,8 @@ static INT32 M_IterateMenuTree(menutree_iterator itfunc, void *input) for (i = NUMMENULEVELS; i >= 0; i--) { bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); - menutype = (currentMenu->menuid & bitmask) >> (MENUBITS*i); - if (itfunc(menutype, i, &retval, &input)) + menutype = (activeMenuId & bitmask) >> (MENUBITS*i); + if (itfunc(menutype, i, &retval, &input, false)) break; } @@ -2236,8 +2272,8 @@ static INT32 M_IterateMenuTreeFromTop(menutree_iterator itfunc, void *input) for (i = 0; i <= NUMMENULEVELS; i++) { bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); - menutype = (currentMenu->menuid & bitmask) >> (MENUBITS*i); - if (itfunc(menutype, i, &retval, &input)) + menutype = (activeMenuId & bitmask) >> (MENUBITS*i); + if (itfunc(menutype, i, &retval, &input, true)) break; } @@ -2248,17 +2284,32 @@ static INT32 M_IterateMenuTreeFromTop(menutree_iterator itfunc, void *input) // ITERATORS // ==================================== -static boolean MIT_GetEdgeMenu(UINT32 menutype, INT32 level, INT32 *retval, void **input) +static boolean MIT_GetMenuAtLevel(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { + INT32 *inputptr = (INT32*)*input; + INT32 targetlevel = *inputptr; if (menutype) { - *retval = menutype; - return true; + // \todo offset targetlevel by failed initial attempts + if (level == targetlevel || targetlevel < 0) + { + *retval = menutype; + return true; + } + } + else if (targetlevel >= 0) + { + // offset targetlevel by failed attempts; this should only happen in beginning of iteration + if (fromoldest) + (*inputptr)++; + else + (*inputptr)--; // iterating backwards, so count from highest } return false; } -static boolean MIT_GetEdgeLevel(UINT32 menutype, INT32 level, INT32 *retval, void **input) +#if 0 +static boolean MIT_GetEdgeLevel(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { if (menutype) { @@ -2267,22 +2318,36 @@ static boolean MIT_GetEdgeLevel(UINT32 menutype, INT32 level, INT32 *retval, voi } return false; } +#endif -static boolean MIT_DrawScrollingBackground(UINT32 menutype, INT32 level, INT32 *retval, void **input) +static boolean MIT_HasMenuType(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) +{ + menutype_t inputtype = *(menutype_t*)*input; + if (menutype == inputtype) + { + *retval = true; + return true; + } + return false; +} + +static boolean MIT_DrawScrollingBackground(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { char *defaultname = (char*)*input; - if (menumeta[menutype].bgname[0]) + if (menumeta[menutype].bgname[0] && menumeta[menutype].bgname[0] != CHAR_MAX) { M_SkyScroll(menumeta[menutype].titlescrollxspeed, menumeta[menutype].titlescrollyspeed, menumeta[menutype].bgname); return true; } - else if (!level && defaultname && defaultname[0]) + else if (menumeta[menutype].bgname[0] == CHAR_MAX && titlemapinaction) // hide the background + return true; + else if (!level && defaultname && defaultname[0] && !titlemapinaction) // hide the background by default in titlemap M_SkyScroll(titlescrollxspeed, titlescrollyspeed, defaultname); return false; } -static boolean MIT_ChangeMusic(UINT32 menutype, INT32 level, INT32 *retval, void **input) +static boolean MIT_ChangeMusic(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { menumetamusic_t *defaultmusic = (menumetamusic_t*)*input; @@ -2291,12 +2356,19 @@ static boolean MIT_ChangeMusic(UINT32 menutype, INT32 level, INT32 *retval, void S_ChangeMusic(menumeta[menutype].musname, menumeta[menutype].mustrack, menumeta[menutype].muslooping); return true; } + else if (menumeta[menutype].musstop) + { + S_StopMusic(); + return true; + } + else if (menumeta[menutype].musignore) + return true; else if (!level && defaultmusic && defaultmusic->musname[0]) S_ChangeMusic(defaultmusic->musname, defaultmusic->mustrack, defaultmusic->muslooping); return false; } -static boolean MIT_FadeScreen(UINT32 menutype, INT32 level, INT32 *retval, void **input) +static boolean MIT_FadeScreen(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { UINT8 defaultvalue = *(UINT8*)*input; if (menumeta[menutype].fadestrength >= 0) @@ -2310,7 +2382,7 @@ static boolean MIT_FadeScreen(UINT32 menutype, INT32 level, INT32 *retval, void return false; } -static boolean MIT_GetHideTitlePics(UINT32 menutype, INT32 level, INT32 *retval, void **input) +static boolean MIT_GetHideTitlePics(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { (void)input; if (menumeta[menutype].hidetitlepics >= 0) @@ -2327,20 +2399,44 @@ static boolean MIT_GetHideTitlePics(UINT32 menutype, INT32 level, INT32 *retval, // TREE RETRIEVAL // ==================================== +#if 0 +// level is nth level relative to top or bottom from tree +static menutype_t M_GetMenuAtLevel(INT32 level, boolean fromoldest) +{ + if (fromoldest) + return M_IterateMenuTreeFromTop(MIT_GetMenuAtLevel, &level); + else + { + if (level >= 0) + level = NUMMENULEVELS - level; // iterating backwards, so count from highest value + return M_IterateMenuTree(MIT_GetMenuAtLevel, &level); + } +} +#endif + static UINT8 M_GetYoungestChildMenu() // aka the active menu { - return M_IterateMenuTree(MIT_GetEdgeMenu, NULL); + INT32 targetlevel = -1; + return M_IterateMenuTree(MIT_GetMenuAtLevel, &targetlevel); } +#if 0 static UINT8 M_GetOldestParentMenu() { - return M_IterateMenuTreeFromTop(MIT_GetEdgeMenu, NULL); + INT32 targetlevel = -1; + return M_IterateMenuTreeFromTop(MIT_GetMenuAtLevel, &targetlevel); } static UINT8 M_GetYoungestChildLevel() // aka the active menu { return M_IterateMenuTree(MIT_GetEdgeLevel, NULL); } +#endif + +static boolean M_HasMenuType(menutype_t needletype) +{ + return M_IterateMenuTreeFromTop(MIT_HasMenuType, &needletype); +} // ==================================== // EFFECTS @@ -2377,6 +2473,162 @@ boolean M_GetHideTitlePics(void) return (retval >= 0 ? retval : hidetitlepics); } +// ==================================== +// MENU STATE +// ==================================== + +static INT32 exitlevel, enterlevel, anceslevel; +static INT16 exittype, entertype; +static INT16 exitwipe, enterwipe; +static boolean exitbubble, enterbubble; +static INT16 exittag, entertag; + +static void M_HandleMenuMetaState(menu_t *newMenu) +{ + INT32 i; + UINT32 bitmask; + SINT8 prevtype, activetype, menutype; + + if (M_HasMenuType(MN_SPECIAL)) + return; + + if (currentMenu && newMenu && currentMenu->menuid == newMenu->menuid) // same menu? + return; + + exittype = entertype = exitlevel = enterlevel = anceslevel = exitwipe = enterwipe = -1; + exitbubble = enterbubble = true; + + prevMenuId = currentMenu ? currentMenu->menuid : 0; + activeMenuId = newMenu ? newMenu->menuid : 0; + + // don't do the below during the in-game menus + if (gamestate != GS_TITLESCREEN && gamestate != GS_TIMEATTACK) + return; + + // Loop through both menu IDs in parallel and look for type changes + // The youngest child in activeMenuId is the entered menu + // The youngest child in prevMenuId is the exited menu + + // 0. Get the type and level of each menu, and level of common ancestor + // 1. Get the wipes for both, then run the exit wipe + // 2. Change music (so that execs can change it again later) + // 3. Run each exit exec on the prevMenuId up to the common ancestor (UNLESS NoBubbleExecs) + // 4. Run each entrance exec on the activeMenuId down from the common ancestor (UNLESS NoBubbleExecs) + // 5. Run the entrance wipe + + // Get the parameters for each menu + for (i = NUMMENULEVELS; i >= 0; i--) + { + bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); + prevtype = (prevMenuId & bitmask) >> (MENUBITS*i); + activetype = (activeMenuId & bitmask) >> (MENUBITS*i); + + if (prevtype && (exittype < 0)) + { + exittype = prevtype; + exitlevel = i; + exitwipe = menumeta[exittype].exitwipe; + exitbubble = menumeta[exittype].exitbubble; + exittag = menumeta[exittype].exittag; + } + + if (activetype && (entertype < 0)) + { + entertype = activetype; + enterlevel = i; + enterwipe = menumeta[entertype].enterwipe; + enterbubble = menumeta[entertype].enterbubble; + entertag = menumeta[entertype].entertag; + } + + if (prevtype && activetype && prevtype == activetype && anceslevel < 0) + { + anceslevel = i; + break; + } + } + + // Change the music + M_ChangeMusic("_title", false); + + // Run the linedef execs + if (titlemapinaction) + { + // Run the exit tags + if (enterlevel <= exitlevel) // equals is an edge case + { + if (exitbubble) + { + for (i = exitlevel; i > anceslevel; i--) // don't run the common ancestor's exit tag + { + bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); + menutype = (prevMenuId & bitmask) >> (MENUBITS*i); + if (menumeta[menutype].exittag) + P_LinedefExecute(menumeta[menutype].exittag, players[displayplayer].mo, NULL); + } + } + else if (exittag) + P_LinedefExecute(exittag, players[displayplayer].mo, NULL); + } + + // Run the enter tags + if (enterlevel >= exitlevel) // equals is an edge case + { + if (enterbubble) + { + for (i = anceslevel+1; i <= enterlevel; i++) // don't run the common ancestor's enter tag + { + bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); + menutype = (activeMenuId & bitmask) >> (MENUBITS*i); + if (menumeta[menutype].entertag) + P_LinedefExecute(menumeta[menutype].entertag, players[displayplayer].mo, NULL); + } + } + else if (entertag) + P_LinedefExecute(entertag, players[displayplayer].mo, NULL); + } + } + + + // Set the wipes for next frame + if ( + (exitwipe >= 0 && enterlevel <= exitlevel) || + (enterwipe >= 0 && enterlevel >= exitlevel) + ) + { + if (gamestate == GS_TIMEATTACK) + wipetypepre = (exitwipe && enterlevel <= exitlevel) ? exitwipe : -1; // force default + else + // HACK: INT16_MAX signals to not wipe + // because 0 is a valid index and -1 means default + wipetypepre = (exitwipe && enterlevel <= exitlevel) ? exitwipe : INT16_MAX; + wipetypepost = (enterwipe && enterlevel >= exitlevel) ? enterwipe : INT16_MAX; + wipegamestate = FORCEWIPE; + // D_Display runs the next step of processing + } + else + M_ApplyMenuMetaState(); // run the next step now +} + +void M_ApplyMenuMetaState(void) +{ +#if 0 + INT32 i; + UINT32 bitmask, menutype; + + if (gamestate != GS_TITLESCREEN && gamestate != GS_TIMEATTACK) + return; + + // 3. Run each exit exec on the prevMenuId up to the common ancestor (UNLESS NoBubbleExecs) + // 4. Run each entrance exec on the activeMenuId down from the common ancestor (UNLESS NoBubbleExecs) + + // \todo placeholder -- do we want any logic to happen between wipes? + // do we want to split linedef execs between pre-wipe and tween-wipe? + + // D_Display runs the enter wipe, if applicable +#endif +} + // ========================================================================= // BASIC MENU HANDLING // ========================================================================= @@ -2402,6 +2654,7 @@ static void M_GoBack(INT32 choice) Z_Free(levelselect.rows); levelselect.rows = NULL; menuactive = false; + wipetypepre = menumeta[M_GetYoungestChildMenu(currentMenu->menuid)].exitwipe; D_StartTitle(); } else @@ -3062,6 +3315,9 @@ void M_SetupNextMenu(menu_t *menudef) if (currentMenu != menudef && !currentMenu->quitroutine()) return; // we can't quit this menu (also used to set parameter from the menu) } + + M_HandleMenuMetaState(menudef); + currentMenu = menudef; itemOn = currentMenu->lastOn; @@ -3170,27 +3426,11 @@ void M_Init(void) // COMMON MENU DRAW ROUTINES // ========================================================================== -void MN_InitInfoTables(void) -{ - INT32 i; - - // Called in d_main before SOC can get to the tables - // Set menumeta defaults - for (i = 0; i < NUMMENUTYPES; i++) - { - if (i != MN_MAIN) - { - menumeta[i].muslooping = true; - } - // so-called "undefined" - menumeta[i].fadestrength = -1; - menumeta[i].hidetitlepics = -1; // inherits global hidetitlepics - } -} - void MN_Start(void) { menuanimtimer = 0; + prevMenuId = 0; + activeMenuId = MainDef.menuid; } void MN_Ticker(boolean run) @@ -5006,7 +5246,10 @@ static void M_DrawMessageMenu(void) // hack: draw RA background in RA menus if (gamestate == GS_TIMEATTACK) + { M_DrawScrollingBackground("SRB2BACK"); + M_DrawFadeScreen(0); + } M_DrawTextBox(currentMenu->x, y - 8, (max+7)>>3, mlines); @@ -7397,6 +7640,7 @@ static void M_DrawSetupChoosePlayerMenu(void) // Black BG V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); //M_DrawScrollingBackground("SRB2BACK"); + //M_DrawFadeScreen(0); // Character select profile images!1 M_DrawTextBox(0, my, 16, 20); @@ -7783,7 +8027,6 @@ void M_DrawTimeAttackMenu(void) INT32 i, x, y, cursory = 0; UINT16 dispstatus; patch_t *PictureOfUrFace; - menutype_t menutype = M_GetYoungestChildMenu(); M_ChangeMusic("_inter", true); // Eww, but needed for when user hits escape during demo playback @@ -7958,15 +8201,13 @@ static void M_TimeAttack(INT32 choice) M_PatchSkinNameTable(); + G_SetGamestate(GS_TIMEATTACK); // do this before M_SetupNextMenu so that menu meta state knows that we're switching M_SetupNextMenu(&SP_TimeAttackDef); if (!M_CanShowLevelInList(cv_nextmap.value-1, -1) && levelselect.rows[0].maplist[0]) CV_SetValue(&cv_nextmap, levelselect.rows[0].maplist[0]); else Nextmap_OnChange(); - G_SetGamestate(GS_TIMEATTACK); - M_ChangeMusic("_inter", true); - itemOn = tastart; // "Start" is selected. } @@ -8137,15 +8378,13 @@ static void M_NightsAttack(INT32 choice) // This is really just to make sure Sonic is the played character, just in case M_PatchSkinNameTable(); + G_SetGamestate(GS_TIMEATTACK); // do this before M_SetupNextMenu so that menu meta state knows that we're switching M_SetupNextMenu(&SP_NightsAttackDef); if (!M_CanShowLevelInList(cv_nextmap.value-1, -1) && levelselect.rows[0].maplist[0]) CV_SetValue(&cv_nextmap, levelselect.rows[0].maplist[0]); else Nextmap_OnChange(); - G_SetGamestate(GS_TIMEATTACK); - M_ChangeMusic("_inter", true); - itemOn = nastart; // "Start" is selected. } @@ -8370,15 +8609,17 @@ static void M_ModeAttackEndGame(INT32 choice) default: case ATTACKING_RECORD: currentMenu = &SP_TimeAttackDef; + wipetypepost = menumeta[MN_SP_TIMEATTACK].enterwipe; break; case ATTACKING_NIGHTS: currentMenu = &SP_NightsAttackDef; + wipetypepost = menumeta[MN_SP_NIGHTSATTACK].enterwipe; break; } itemOn = currentMenu->lastOn; G_SetGamestate(GS_TIMEATTACK); modeattacking = ATTACKING_NONE; - M_ChangeMusic("_inter", true); + M_ChangeMusic("_title", true); Nextmap_OnChange(); } @@ -9556,6 +9797,10 @@ static void M_Setup1PJoystickMenu(INT32 choice) { setupcontrols_secondaryplayer = false; OP_JoystickSetDef.prevMenu = &OP_Joystick1Def; + OP_JoystickSetDef.menuid &= ~(((1 << MENUBITS) - 1) << MENUBITS); + OP_JoystickSetDef.menuid &= ~(((1 << MENUBITS) - 1) << (MENUBITS*2)); + OP_JoystickSetDef.menuid |= MN_OP_P1CONTROLS << MENUBITS; + OP_JoystickSetDef.menuid |= MN_OP_P1JOYSTICK << (MENUBITS*2); M_SetupJoystickMenu(choice); } @@ -9563,6 +9808,10 @@ static void M_Setup2PJoystickMenu(INT32 choice) { setupcontrols_secondaryplayer = true; OP_JoystickSetDef.prevMenu = &OP_Joystick2Def; + OP_JoystickSetDef.menuid &= ~(((1 << MENUBITS) - 1) << MENUBITS); + OP_JoystickSetDef.menuid &= ~(((1 << MENUBITS) - 1) << (MENUBITS*2)); + OP_JoystickSetDef.menuid |= MN_OP_P2CONTROLS << MENUBITS; + OP_JoystickSetDef.menuid |= MN_OP_P2JOYSTICK << (MENUBITS*2); M_SetupJoystickMenu(choice); } @@ -9600,6 +9849,8 @@ static void M_Setup1PControlsMenu(INT32 choice) OP_ChangeControlsMenu[23+3].status = IT_CALL|IT_STRING2; OP_ChangeControlsDef.prevMenu = &OP_P1ControlsDef; + OP_ChangeControlsDef.menuid &= ~(((1 << MENUBITS) - 1) << MENUBITS); // remove first level (<< 6) + OP_ChangeControlsDef.menuid |= MN_OP_P1CONTROLS << MENUBITS; // combine first level (<< 6) M_SetupNextMenu(&OP_ChangeControlsDef); } @@ -9625,6 +9876,8 @@ static void M_Setup2PControlsMenu(INT32 choice) OP_ChangeControlsMenu[23+3].status = IT_GRAYEDOUT2; OP_ChangeControlsDef.prevMenu = &OP_P2ControlsDef; + OP_ChangeControlsDef.menuid &= ~(((1 << MENUBITS) - 1) << MENUBITS); // remove first level (<< 6) + OP_ChangeControlsDef.menuid |= MN_OP_P2CONTROLS << MENUBITS; // combine first level (<< 6) M_SetupNextMenu(&OP_ChangeControlsDef); } diff --git a/src/m_menu.h b/src/m_menu.h index 979165e98..bb58e706e 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -132,11 +132,16 @@ typedef struct char musname[7]; ///< Music track to play. "" for no music. UINT16 mustrack; ///< Subsong to play. Only really relevant for music modules and specific formats supported by GME. 0 to ignore. boolean muslooping; ///< Loop the music + boolean musstop; ///< Don't play any music + boolean musignore; ///< Let the current music keep playing SINT8 fadestrength; // darken background when displaying this menu, strength 0-31 or -1 for undefined - boolean exitparents; // run exit line exec on parent menus when entering a child menu + boolean enterbubble; // run all entrance line execs after common ancestor and up to child. If false, only run the child's exec + boolean exitbubble; // run all exit line execs from child and up to before common ancestor. If false, only run the child's exec INT32 entertag; // line exec to run on menu enter, if titlemap INT32 exittag; // line exec to run on menu exit, if titlemap + INT16 enterwipe; // wipe type to run on menu enter, -1 means default + INT16 exitwipe; // wipe type to run on menu exit, -1 means default } menumeta_t; extern menumeta_t menumeta[NUMMENUTYPES]; @@ -147,6 +152,7 @@ boolean M_GetHideTitlePics(void); void MN_Ticker(boolean run); void MN_Start(void); void MN_InitInfoTables(void); +void M_ApplyMenuMetaState(void); // Called by main loop, diff --git a/src/p_setup.c b/src/p_setup.c index c1e8c17e3..61fe952ac 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2737,7 +2737,13 @@ boolean P_SetupLevel(boolean skipprecip) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); F_WipeEndScreen(); - F_RunWipe(wipedefs[wipe_level_toblack], false); + // for titlemap: run a specific wipe if specified + // needed for exiting time attack + if (wipetypepre != INT16_MAX) + F_RunWipe( + (wipetypepre >= 0 && F_WipeExists(wipetypepre)) ? wipetypepre : wipedefs[wipe_level_toblack], + false); + wipetypepre = -1; } // Print "SPEEDING OFF TO [ZONE] [ACT 1]..." From f3be97a95a1baa15825f7d1b86dbc7a8a1e99861 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 18 Nov 2018 01:53:18 -0500 Subject: [PATCH 16/50] Allow changing titlemap's cameraref via Line 422 Cut-Away View; change music too --- src/f_finale.c | 28 ++++++++++++++++++---------- src/f_finale.h | 1 + src/p_spec.c | 12 ++++++++++-- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index 4a1267265..fc9849a3f 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -1351,6 +1351,8 @@ void F_GameEndTicker(void) // ============== // TITLE SCREEN // ============== +mobj_t *titlemapcameraref = NULL; + void F_StartTitleScreen(void) { if (menumeta[MN_MAIN].musname[0]) @@ -1535,22 +1537,28 @@ void F_TitleScreenTicker(boolean run) mobj_t *mo2; mobj_t *cameraref = NULL; - for (th = thinkercap.next; th != &thinkercap; th = th->next) + // If there's a Line 422 Switch Cut-Away view, don't force us. + if (!titlemapcameraref || titlemapcameraref->type != MT_ALTVIEWMAN) { - if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker - continue; + 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; + mo2 = (mobj_t *)th; - if (!mo2) - continue; + if (!mo2) + continue; - if (mo2->type != MT_ALTVIEWMAN) - continue; + if (mo2->type != MT_ALTVIEWMAN) + continue; - cameraref = mo2; - break; + cameraref = titlemapcameraref = mo2; + break; + } } + else + cameraref = titlemapcameraref; if (cameraref) { diff --git a/src/f_finale.h b/src/f_finale.h index 3a9ad2091..c1cc49ec4 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -80,6 +80,7 @@ typedef enum } titlemap_enum; extern UINT8 titlemapinaction; +extern mobj_t *titlemapcameraref; // // WIPE diff --git a/src/p_spec.c b/src/p_spec.c index abd11361b..b2e2f0865 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2591,7 +2591,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 413: // Change music // console player only unless NOCLIMB is set - if ((line->flags & ML_NOCLIMB) || (mo && mo->player && P_IsLocalPlayer(mo->player))) + if ((line->flags & ML_NOCLIMB) || (mo && mo->player && P_IsLocalPlayer(mo->player)) || titlemapinaction) { UINT16 tracknum = (UINT16)sides[line->sidenum[0]].bottomtexture; @@ -2890,7 +2890,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) { mobj_t *altview; - if (!mo || !mo->player) // only players have views + if ((!mo || !mo->player) && !titlemapinaction) // only players have views, and title screens return; if ((secnum = P_FindSectorFromLineTag(line, -1)) < 0) @@ -2900,6 +2900,14 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (!altview) return; + // If titlemap, set the camera ref for title's thinker + // This is not revoked until overwritten; awayviewtics is ignored + if (titlemapinaction) + { + titlemapcameraref = altview; + return; + } + P_SetTarget(&mo->player->awayviewmobj, altview); mo->player->awayviewtics = P_AproxDistance(line->dx, line->dy)>>FRACBITS; From 3c2d30072e3f85054bbbffb62cd5a28aee5a0380 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 18 Nov 2018 02:49:08 -0500 Subject: [PATCH 17/50] Allow backgrounds for player select --- src/m_menu.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index fcab1043b..bc884246d 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2342,8 +2342,13 @@ static boolean MIT_DrawScrollingBackground(UINT32 menutype, INT32 level, INT32 * } else if (menumeta[menutype].bgname[0] == CHAR_MAX && titlemapinaction) // hide the background return true; - else if (!level && defaultname && defaultname[0] && !titlemapinaction) // hide the background by default in titlemap - M_SkyScroll(titlescrollxspeed, titlescrollyspeed, defaultname); + else if (!level) + { + if (defaultname && defaultname[0] && !titlemapinaction) // hide the background by default in titlemap + M_SkyScroll(titlescrollxspeed, titlescrollyspeed, defaultname); + else if (currentMenu == &SP_PlayerDef) // black bg + V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); + } return false; } @@ -7638,9 +7643,9 @@ static void M_DrawSetupChoosePlayerMenu(void) UINT8 prev, next; // Black BG - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - //M_DrawScrollingBackground("SRB2BACK"); - //M_DrawFadeScreen(0); + //V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); + M_DrawScrollingBackground("SRB2BACK"); + M_DrawFadeScreen(0); // Character select profile images!1 M_DrawTextBox(0, my, 16, 20); From 3acabdab9356ab1ec71ccaf6234ad2bc8acdc176 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 18 Nov 2018 03:08:59 -0500 Subject: [PATCH 18/50] Fix MN_SPECIAL check for menu meta state --- src/m_menu.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index bc884246d..c516fe69b 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2264,6 +2264,7 @@ static INT32 M_IterateMenuTree(menutree_iterator itfunc, void *input) return retval; } +#if 0 static INT32 M_IterateMenuTreeFromTop(menutree_iterator itfunc, void *input) { INT32 i, retval = 0; @@ -2279,6 +2280,7 @@ static INT32 M_IterateMenuTreeFromTop(menutree_iterator itfunc, void *input) return retval; } +#endif // ==================================== // ITERATORS @@ -2318,7 +2320,7 @@ static boolean MIT_GetEdgeLevel(UINT32 menutype, INT32 level, INT32 *retval, voi } return false; } -#endif + static boolean MIT_HasMenuType(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { @@ -2330,6 +2332,7 @@ static boolean MIT_HasMenuType(UINT32 menutype, INT32 level, INT32 *retval, void } return false; } +#endif static boolean MIT_DrawScrollingBackground(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { @@ -2436,12 +2439,12 @@ static UINT8 M_GetYoungestChildLevel() // aka the active menu { return M_IterateMenuTree(MIT_GetEdgeLevel, NULL); } -#endif static boolean M_HasMenuType(menutype_t needletype) { return M_IterateMenuTreeFromTop(MIT_HasMenuType, &needletype); } +#endif // ==================================== // EFFECTS @@ -2494,9 +2497,19 @@ static void M_HandleMenuMetaState(menu_t *newMenu) UINT32 bitmask; SINT8 prevtype, activetype, menutype; - if (M_HasMenuType(MN_SPECIAL)) + if (!newMenu) return; + // Look for MN_SPECIAL here, because our iterators can't look at new menu IDs + for (i = 0; i <= NUMMENULEVELS; i++) + { + bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); + menutype = (newMenu->menuid & bitmask) >> (MENUBITS*i); + prevtype = (currentMenu->menuid & bitmask) >> (MENUBITS*i); + if (menutype == MN_SPECIAL || prevtype == MN_SPECIAL) + return; + } + if (currentMenu && newMenu && currentMenu->menuid == newMenu->menuid) // same menu? return; From 5fc91e84051ec5a031c85e7074b67835b0f39651 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 18 Nov 2018 03:19:32 -0500 Subject: [PATCH 19/50] Fix lingering titlemapcameraref when reloading title screen --- src/f_finale.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/f_finale.c b/src/f_finale.c index fc9849a3f..1d780e6fd 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -1374,6 +1374,7 @@ void F_StartTitleScreen(void) gamestate_t prevwipegamestate = wipegamestate; titlemapinaction = TITLEMAP_LOADING; + titlemapcameraref = NULL; gamemap = titlemap; if (!mapheaderinfo[gamemap-1]) From 3d1e5fa7e8269fd3043e8e20b31e45594a78b05b Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 18 Nov 2018 03:32:19 -0500 Subject: [PATCH 20/50] Allow inherited wipes when switching menus without a common ancestor (Multiplayer > Server Settings) --- src/m_menu.c | 47 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index c516fe69b..3b7c9dbee 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2566,6 +2566,44 @@ static void M_HandleMenuMetaState(menu_t *newMenu) } } + // if no common ancestor (top menu), force a wipe. Look for a specified wipe first. + if (anceslevel < 0 && exitwipe < 0) + { + for (i = NUMMENULEVELS; i >= 0; i--) + { + bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); + prevtype = (prevMenuId & bitmask) >> (MENUBITS*i); + + if (menumeta[prevtype].exitwipe >= 0) + { + exitwipe = menumeta[prevtype].exitwipe; + break; + } + } + + if (exitwipe < 0) + exitwipe = menumeta[MN_MAIN].exitwipe; + } + + // do the same for enter wipe + if (anceslevel < 0 && enterwipe < 0) + { + for (i = NUMMENULEVELS; i >= 0; i--) + { + bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); + activetype = (activeMenuId & bitmask) >> (MENUBITS*i); + + if (menumeta[activetype].enterwipe >= 0) + { + exitwipe = menumeta[activetype].enterwipe; + break; + } + } + + if (enterwipe < 0) + enterwipe = menumeta[MN_MAIN].enterwipe; + } + // Change the music M_ChangeMusic("_title", false); @@ -2611,16 +2649,17 @@ static void M_HandleMenuMetaState(menu_t *newMenu) // Set the wipes for next frame if ( (exitwipe >= 0 && enterlevel <= exitlevel) || - (enterwipe >= 0 && enterlevel >= exitlevel) + (enterwipe >= 0 && enterlevel >= exitlevel) || + anceslevel < 0 ) { if (gamestate == GS_TIMEATTACK) - wipetypepre = (exitwipe && enterlevel <= exitlevel) ? exitwipe : -1; // force default + wipetypepre = ((exitwipe && enterlevel <= exitlevel) || anceslevel < 0) ? exitwipe : -1; // force default else // HACK: INT16_MAX signals to not wipe // because 0 is a valid index and -1 means default - wipetypepre = (exitwipe && enterlevel <= exitlevel) ? exitwipe : INT16_MAX; - wipetypepost = (enterwipe && enterlevel >= exitlevel) ? enterwipe : INT16_MAX; + wipetypepre = ((exitwipe && enterlevel <= exitlevel) || anceslevel < 0) ? exitwipe : INT16_MAX; + wipetypepost = ((enterwipe && enterlevel >= exitlevel) || anceslevel < 0) ? enterwipe : INT16_MAX; wipegamestate = FORCEWIPE; // D_Display runs the next step of processing } From 765e4b3134455022463e4b6f625ac5220d223c9d Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 18 Nov 2018 04:32:38 -0500 Subject: [PATCH 21/50] Compiler fixes --- src/d_main.c | 2 +- src/m_menu.c | 22 ++++++++++++++++++---- src/m_menu.h | 4 ++-- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index ef2d481bf..185672099 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -287,7 +287,7 @@ static void D_Display(void) if (rendermode != render_none) { // Fade to black first - if ((wipegamestate == FORCEWIPE || + if ((wipegamestate == (gamestate_t)FORCEWIPE || !(gamestate == GS_LEVEL || (gamestate == GS_TITLESCREEN && titlemapinaction))) // fades to black on its own timing, always && wipetypepre != UINT8_MAX) { diff --git a/src/m_menu.c b/src/m_menu.c index 3b7c9dbee..c89e303a3 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2338,6 +2338,9 @@ static boolean MIT_DrawScrollingBackground(UINT32 menutype, INT32 level, INT32 * { char *defaultname = (char*)*input; + (void)retval; + (void)fromoldest; + if (menumeta[menutype].bgname[0] && menumeta[menutype].bgname[0] != CHAR_MAX) { M_SkyScroll(menumeta[menutype].titlescrollxspeed, menumeta[menutype].titlescrollyspeed, menumeta[menutype].bgname); @@ -2359,6 +2362,9 @@ static boolean MIT_ChangeMusic(UINT32 menutype, INT32 level, INT32 *retval, void { menumetamusic_t *defaultmusic = (menumetamusic_t*)*input; + (void)retval; + (void)fromoldest; + if (menumeta[menutype].musname[0]) { S_ChangeMusic(menumeta[menutype].musname, menumeta[menutype].mustrack, menumeta[menutype].muslooping); @@ -2379,6 +2385,10 @@ static boolean MIT_ChangeMusic(UINT32 menutype, INT32 level, INT32 *retval, void static boolean MIT_FadeScreen(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { UINT8 defaultvalue = *(UINT8*)*input; + + (void)retval; + (void)fromoldest; + if (menumeta[menutype].fadestrength >= 0) { if (menumeta[menutype].fadestrength % 32) @@ -2393,6 +2403,8 @@ static boolean MIT_FadeScreen(UINT32 menutype, INT32 level, INT32 *retval, void static boolean MIT_GetHideTitlePics(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { (void)input; + (void)fromoldest; + if (menumeta[menutype].hidetitlepics >= 0) { *retval = menumeta[menutype].hidetitlepics; @@ -2450,12 +2462,14 @@ static boolean M_HasMenuType(menutype_t needletype) // EFFECTS // ==================================== -void M_DrawScrollingBackground(char *defaultname) +void M_DrawScrollingBackground(const char *defaultname) { - M_IterateMenuTree(MIT_DrawScrollingBackground, defaultname); + char name[8]; + strncpy(name, defaultname, 8); + M_IterateMenuTree(MIT_DrawScrollingBackground, &name); } -static void M_ChangeMusic(char *defaultmusname, boolean defaultmuslooping) +static void M_ChangeMusic(const char *defaultmusname, boolean defaultmuslooping) { menumetamusic_t defaultmusic; @@ -3499,7 +3513,7 @@ void MN_Ticker(boolean run) // // M_SkyScroll // -void M_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, char *patchname) +void M_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, const char *patchname) { INT32 xscrolled, x, xneg = (scrollxspeed > 0) - (scrollxspeed < 0), tilex; INT32 yscrolled, y, yneg = (scrollyspeed > 0) - (scrollyspeed < 0), tiley; diff --git a/src/m_menu.h b/src/m_menu.h index bb58e706e..8b1d1055e 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -146,8 +146,8 @@ typedef struct extern menumeta_t menumeta[NUMMENUTYPES]; -void M_DrawScrollingBackground(char *defaultname); -void M_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, char *patchname); +void M_DrawScrollingBackground(const char *defaultname); +void M_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, const char *patchname); boolean M_GetHideTitlePics(void); void MN_Ticker(boolean run); void MN_Start(void); From 53b956f540c8a1d253fd4a762f5f97102f5c96f8 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 18 Nov 2018 04:39:34 -0500 Subject: [PATCH 22/50] Mirror a wipe if it's forced off and the counter-wipe is specified --- src/m_menu.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/m_menu.c b/src/m_menu.c index c89e303a3..fd035eb6a 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2675,6 +2675,14 @@ static void M_HandleMenuMetaState(menu_t *newMenu) wipetypepre = ((exitwipe && enterlevel <= exitlevel) || anceslevel < 0) ? exitwipe : INT16_MAX; wipetypepost = ((enterwipe && enterlevel >= exitlevel) || anceslevel < 0) ? enterwipe : INT16_MAX; wipegamestate = FORCEWIPE; + + // If just one of the above is a force not-wipe, + // mirror the other wipe. + if (wipetypepre != INT16_MAX && wipetypepost == INT16_MAX) + wipetypepost = wipetypepre; + else if (wipetypepost != INT16_MAX && wipetypepre == INT16_MAX) + wipetypepre = wipetypepost; + // D_Display runs the next step of processing } else From 4fa6895f60d7f306517d343177bd2ba56b06de60 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 18 Nov 2018 12:56:37 -0500 Subject: [PATCH 23/50] Fixed skullAnimCounter type for text prompts --- src/f_finale.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/f_finale.c b/src/f_finale.c index 1d780e6fd..7ba510651 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -51,7 +51,7 @@ static INT32 timetonext; // Delay between screen changes static INT32 continuetime; // Short delay when continuing static tic_t animtimer; // Used for some animation timings -static tic_t skullAnimCounter; // Prompts: Chevron animation; Title screen: Y animation timing +static INT16 skullAnimCounter; // Prompts: Chevron animation; Title screen: Y animation timing static INT32 roidtics; // Asteroid spinning static INT32 deplete; From 094ec7ce3c47b33e594607f29826abf0c6b67dc5 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Tue, 20 Nov 2018 17:28:26 -0500 Subject: [PATCH 24/50] Performance improvements * Don't loop every frame for menu drawing parameters * Fixed in-game escape menu not dimming correctly * Fixed glitches on default title screen parameters --- src/d_clisrv.c | 6 +- src/d_main.c | 8 ++- src/dehacked.c | 10 +-- src/f_finale.c | 7 +- src/m_menu.c | 187 ++++++++++++++++++++++++++++++++++--------------- src/m_menu.h | 15 +++- 6 files changed, 162 insertions(+), 71 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index b720dbf16..271a09363 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1126,7 +1126,8 @@ static inline void CL_DrawConnectionStatus(void) INT32 ccstime = I_GetTime(); // Draw background fade - V_DrawFadeScreen(0xFF00, 16); + if (!menuactive) // menu already draws its own fade + V_DrawFadeScreen(0xFF00, curfadevalue); // Draw the bottom box. M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1); @@ -1983,6 +1984,7 @@ static boolean CL_ServerConnectionTicker(boolean viams, const char *tmpsave, tic #ifdef CLIENT_LOADINGSCREEN if (client && cl_mode != CL_CONNECTED && cl_mode != CL_ABORTED) { + MN_Ticker(true); // title sky F_TitleScreenTicker(true); F_TitleScreenDrawer(); CL_DrawConnectionStatus(); @@ -2407,7 +2409,7 @@ static void CL_RemovePlayer(INT32 playernum, INT32 reason) } } } - + #ifdef HAVE_BLUA LUAh_PlayerQuit(&players[playernum], reason); // Lua hook for player quitting #endif diff --git a/src/d_main.c b/src/d_main.c index 185672099..df40f16d2 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -309,7 +309,7 @@ static void D_Display(void) switch (gamestate) { case GS_TITLESCREEN: - if (!titlemapinaction) { + if (!titlemapinaction || !curbghide) { F_TitleScreenDrawer(); break; } @@ -376,7 +376,7 @@ static void D_Display(void) // clean up border stuff // see if the border needs to be initially drawn - if (gamestate == GS_LEVEL || (gamestate == GS_TITLESCREEN && titlemapinaction)) + if (gamestate == GS_LEVEL || (gamestate == GS_TITLESCREEN && titlemapinaction && curbghide)) { // draw the view directly @@ -1122,6 +1122,10 @@ void D_SRB2Main(void) // initiate menu metadata before SOCcing them MN_InitInfoTables(); + // init title screen display params + if (M_CheckParm("-connect")) + MN_Start(); + //---------------------------------------------------- READY TIME // we need to check for dedicated before initialization of some subsystems diff --git a/src/dehacked.c b/src/dehacked.c index 7d37494dc..7c107eedf 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1961,10 +1961,12 @@ static void readmenu(MYFILE *f, INT32 num) } else if (fastcmp(word, "HIDEBACKGROUND")) { - // HACK: Use CHAR_MAX to signal that we want to hide the background - // Only effective during titlemap - menumeta[num].bgname[0] = CHAR_MAX; - menumeta[num].bgname[1] = 0; + menumeta[num].bghide = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); + titlechanged = true; + } + else if (fastcmp(word, "BACKGROUNDCOLOR")) + { + menumeta[num].bgcolor = value; titlechanged = true; } else if (fastcmp(word, "HIDETITLEPICS") || fastcmp(word, "HIDEPICS")) diff --git a/src/f_finale.c b/src/f_finale.c index 7ba510651..525ba2e28 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -1463,14 +1463,17 @@ void F_TitleScreenDrawer(void) return; // We likely came here from retrying. Don't do a damn thing. // Draw that sky! - M_DrawScrollingBackground("TITLESKY"); + if (curbgcolor >= 0) + V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor); + else if (!curbghide || !titlemapinaction) + M_SkyScroll(curbgxspeed, curbgyspeed, curbgname); // Don't draw outside of the title screewn, or if the patch isn't there. if (!ttwing || (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS)) return; // rei|miru: use title pics? - hidepics = M_GetHideTitlePics(); + hidepics = curhidepics; if (hidepics) #ifdef HAVE_BLUA goto luahook; diff --git a/src/m_menu.c b/src/m_menu.c index fd035eb6a..5efed4b7f 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2200,6 +2200,15 @@ static INT32 menuanimtimer; static UINT32 prevMenuId = 0; static UINT32 activeMenuId = 0; +// menu presentation state +char curbgname[8]; +SINT8 curfadevalue; +boolean curhidepics; +INT32 curbgcolor; +INT32 curbgxspeed; +INT32 curbgyspeed; +boolean curbghide; + typedef struct { char musname[7]; @@ -2215,23 +2224,24 @@ void MN_InitInfoTables(void) // Set menumeta defaults for (i = 0; i < NUMMENUTYPES; i++) { + // so-called "undefined" + menumeta[i].fadestrength = -1; + menumeta[i].hidetitlepics = -1; // inherits global hidetitlepics + menumeta[i].enterwipe = -1; + menumeta[i].exitwipe = -1; + menumeta[i].bgcolor = -1; + // default true + menumeta[i].enterbubble = true; + menumeta[i].exitbubble = true; + if (i != MN_MAIN) { menumeta[i].muslooping = true; } if (i == MN_SP_TIMEATTACK || i == MN_SP_NIGHTSATTACK) strncpy(menumeta[i].musname, "_inter", 7); - if (i == MN_SP_PLAYER) + else if (i == MN_SP_PLAYER) strncpy(menumeta[i].musname, "_chsel", 7); - - // so-called "undefined" - menumeta[i].fadestrength = -1; - menumeta[i].hidetitlepics = -1; // inherits global hidetitlepics - menumeta[i].enterwipe = -1; - menumeta[i].exitwipe = -1; - // default true - menumeta[i].enterbubble = true; - menumeta[i].exitbubble = true; } } @@ -2334,26 +2344,42 @@ static boolean MIT_HasMenuType(UINT32 menutype, INT32 level, INT32 *retval, void } #endif -static boolean MIT_DrawScrollingBackground(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) +static boolean MIT_SetCurBackground(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { char *defaultname = (char*)*input; (void)retval; (void)fromoldest; - if (menumeta[menutype].bgname[0] && menumeta[menutype].bgname[0] != CHAR_MAX) + if (menumeta[menutype].bgcolor >= 0) { - M_SkyScroll(menumeta[menutype].titlescrollxspeed, menumeta[menutype].titlescrollyspeed, menumeta[menutype].bgname); + curbgcolor = menumeta[menutype].bgcolor; return true; } - else if (menumeta[menutype].bgname[0] == CHAR_MAX && titlemapinaction) // hide the background + else if (menumeta[menutype].bgname[0] && (!menumeta[menutype].bghide || !titlemapinaction)) + { + strncpy(curbgname, menumeta[menutype].bgname, 8); + curbgxspeed = menumeta[menutype].titlescrollxspeed; + curbgyspeed = menumeta[menutype].titlescrollyspeed; return true; + } + else if (menumeta[menutype].bghide && titlemapinaction) // hide the background + { + curbghide = true; + return true; + } else if (!level) { - if (defaultname && defaultname[0] && !titlemapinaction) // hide the background by default in titlemap - M_SkyScroll(titlescrollxspeed, titlescrollyspeed, defaultname); - else if (currentMenu == &SP_PlayerDef) // black bg - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); + if (M_GetYoungestChildMenu() == MN_SP_PLAYER || !defaultname || !defaultname[0]) + curbgcolor = 31; + else if (titlemapinaction) // hide the background by default in titlemap + curbghide = true; + else + { + strncpy(curbgname, defaultname, 8); + curbgxspeed = (gamestate == GS_TIMEATTACK) ? 0 : titlescrollxspeed; + curbgyspeed = (gamestate == GS_TIMEATTACK) ? 0 : titlescrollyspeed; + } } return false; } @@ -2382,7 +2408,7 @@ static boolean MIT_ChangeMusic(UINT32 menutype, INT32 level, INT32 *retval, void return false; } -static boolean MIT_FadeScreen(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) +static boolean MIT_SetCurFadeValue(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { UINT8 defaultvalue = *(UINT8*)*input; @@ -2391,27 +2417,27 @@ static boolean MIT_FadeScreen(UINT32 menutype, INT32 level, INT32 *retval, void if (menumeta[menutype].fadestrength >= 0) { - if (menumeta[menutype].fadestrength % 32) - V_DrawFadeScreen(0xFF00, menumeta[menutype].fadestrength % 32); + curfadevalue = (menumeta[menutype].fadestrength % 32); return true; } - else if (!level && (defaultvalue % 32)) - V_DrawFadeScreen(0xFF00, defaultvalue % 32); + else if (!level) + curfadevalue = (gamestate == GS_TIMEATTACK) ? 0 : (defaultvalue % 32); return false; } -static boolean MIT_GetHideTitlePics(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) +static boolean MIT_SetCurHideTitlePics(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { (void)input; + (void)retval; (void)fromoldest; if (menumeta[menutype].hidetitlepics >= 0) { - *retval = menumeta[menutype].hidetitlepics; + curhidepics = menumeta[menutype].hidetitlepics; return true; } else if (!level) - *retval = -1; + curhidepics = hidetitlepics; return false; } @@ -2434,7 +2460,7 @@ static menutype_t M_GetMenuAtLevel(INT32 level, boolean fromoldest) } #endif -static UINT8 M_GetYoungestChildMenu() // aka the active menu +UINT8 M_GetYoungestChildMenu(void) // aka the active menu { INT32 targetlevel = -1; return M_IterateMenuTree(MIT_GetMenuAtLevel, &targetlevel); @@ -2462,13 +2488,6 @@ static boolean M_HasMenuType(menutype_t needletype) // EFFECTS // ==================================== -void M_DrawScrollingBackground(const char *defaultname) -{ - char name[8]; - strncpy(name, defaultname, 8); - M_IterateMenuTree(MIT_DrawScrollingBackground, &name); -} - static void M_ChangeMusic(const char *defaultmusname, boolean defaultmuslooping) { menumetamusic_t defaultmusic; @@ -2484,15 +2503,21 @@ static void M_ChangeMusic(const char *defaultmusname, boolean defaultmuslooping) M_IterateMenuTree(MIT_ChangeMusic, &defaultmusic); } -static void M_DrawFadeScreen(UINT8 defaultvalue) +static void M_SetCurBackground(const char *defaultname) { - M_IterateMenuTree(MIT_FadeScreen, &defaultvalue); + char name[8]; + strncpy(name, defaultname, 8); + M_IterateMenuTree(MIT_SetCurBackground, &name); } -boolean M_GetHideTitlePics(void) +static void M_SetCurFadeValue(UINT8 defaultvalue) { - INT32 retval = M_IterateMenuTree(MIT_GetHideTitlePics, NULL); - return (retval >= 0 ? retval : hidetitlepics); + M_IterateMenuTree(MIT_SetCurFadeValue, &defaultvalue); +} + +static void M_SetCurHideTitlePics(void) +{ + M_IterateMenuTree(MIT_SetCurHideTitlePics, NULL); } // ==================================== @@ -2533,10 +2558,24 @@ static void M_HandleMenuMetaState(menu_t *newMenu) prevMenuId = currentMenu ? currentMenu->menuid : 0; activeMenuId = newMenu ? newMenu->menuid : 0; + // Set defaults for presentation values + strncpy(curbgname, "TITLESKY", 8); + curfadevalue = 16; + curhidepics = hidetitlepics; + curbgcolor = -1; + curbgxspeed = titlescrollxspeed; + curbgyspeed = titlescrollyspeed; + curbghide = false; + // don't do the below during the in-game menus if (gamestate != GS_TITLESCREEN && gamestate != GS_TIMEATTACK) return; + // Find current presentation values + M_SetCurBackground((gamestate == GS_TIMEATTACK) ? "SRB2BACK" : "TITLESKY"); + M_SetCurFadeValue(16); + M_SetCurHideTitlePics(); + // Loop through both menu IDs in parallel and look for type changes // The youngest child in activeMenuId is the entered menu // The youngest child in prevMenuId is the exited menu @@ -2581,7 +2620,8 @@ static void M_HandleMenuMetaState(menu_t *newMenu) } // if no common ancestor (top menu), force a wipe. Look for a specified wipe first. - if (anceslevel < 0 && exitwipe < 0) + // Don't force a wipe if you're actually going to/from the main menu + if (anceslevel < 0 && exitwipe < 0 && newMenu != &MainDef && currentMenu != &MainDef) { for (i = NUMMENULEVELS; i >= 0; i--) { @@ -2600,7 +2640,7 @@ static void M_HandleMenuMetaState(menu_t *newMenu) } // do the same for enter wipe - if (anceslevel < 0 && enterwipe < 0) + if (anceslevel < 0 && enterwipe < 0 && newMenu != &MainDef && currentMenu != &MainDef) { for (i = NUMMENULEVELS; i >= 0; i--) { @@ -2664,7 +2704,7 @@ static void M_HandleMenuMetaState(menu_t *newMenu) if ( (exitwipe >= 0 && enterlevel <= exitlevel) || (enterwipe >= 0 && enterlevel >= exitlevel) || - anceslevel < 0 + (anceslevel < 0 && newMenu != &MainDef && currentMenu != &MainDef) ) { if (gamestate == GS_TIMEATTACK) @@ -2733,7 +2773,7 @@ static void M_GoBack(INT32 choice) Z_Free(levelselect.rows); levelselect.rows = NULL; menuactive = false; - wipetypepre = menumeta[M_GetYoungestChildMenu(currentMenu->menuid)].exitwipe; + wipetypepre = menumeta[M_GetYoungestChildMenu()].exitwipe; D_StartTitle(); } else @@ -3196,8 +3236,8 @@ void M_Drawer(void) if (menuactive) { // now that's more readable with a faded background (yeah like Quake...) - if (!WipeInAction) - M_DrawFadeScreen(16); + if (!WipeInAction && (curfadevalue || (gamestate != GS_TITLESCREEN && gamestate != GS_TIMEATTACK))) + V_DrawFadeScreen(0xFF00, (gamestate != GS_TITLESCREEN && gamestate != GS_TIMEATTACK) ? 16 : curfadevalue); if (currentMenu->drawroutine) currentMenu->drawroutine(); // call current menu Draw routine @@ -3510,6 +3550,20 @@ void MN_Start(void) menuanimtimer = 0; prevMenuId = 0; activeMenuId = MainDef.menuid; + + // Set defaults for presentation values + strncpy(curbgname, "TITLESKY", 8); + curfadevalue = 16; + curhidepics = hidetitlepics; + curbgcolor = -1; + curbgxspeed = titlescrollxspeed; + curbgyspeed = titlescrollyspeed; + curbghide = false; + + // Find current presentation values + M_SetCurBackground((gamestate == GS_TIMEATTACK) ? "SRB2BACK" : "TITLESKY"); + M_SetCurFadeValue(16); + M_SetCurHideTitlePics(); } void MN_Ticker(boolean run) @@ -5121,8 +5175,12 @@ static void M_DrawLevelPlatterMenu(void) if (gamestate == GS_TIMEATTACK) { - M_DrawScrollingBackground("SRB2BACK"); - M_DrawFadeScreen(0); + if (curbgcolor >= 0) + V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor); + else if (!curbghide || !titlemapinaction) + M_SkyScroll(curbgxspeed, curbgyspeed, curbgname); + if (curfadevalue) + V_DrawFadeScreen(0xFF00, curfadevalue); } // finds row at top of the screen @@ -5326,8 +5384,12 @@ static void M_DrawMessageMenu(void) // hack: draw RA background in RA menus if (gamestate == GS_TIMEATTACK) { - M_DrawScrollingBackground("SRB2BACK"); - M_DrawFadeScreen(0); + if (curbgcolor >= 0) + V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor); + else if (!curbghide || !titlemapinaction) + M_SkyScroll(curbgxspeed, curbgyspeed, curbgname); + if (curfadevalue) + V_DrawFadeScreen(0xFF00, curfadevalue); } M_DrawTextBox(currentMenu->x, y - 8, (max+7)>>3, mlines); @@ -7717,9 +7779,12 @@ static void M_DrawSetupChoosePlayerMenu(void) UINT8 prev, next; // Black BG - //V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - M_DrawScrollingBackground("SRB2BACK"); - M_DrawFadeScreen(0); + if (curbgcolor >= 0) + V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor); + else if (!curbghide || !titlemapinaction) + M_SkyScroll(curbgxspeed, curbgyspeed, curbgname); + if (curfadevalue) + V_DrawFadeScreen(0xFF00, curfadevalue); // Character select profile images!1 M_DrawTextBox(0, my, 16, 20); @@ -8109,9 +8174,12 @@ void M_DrawTimeAttackMenu(void) M_ChangeMusic("_inter", true); // Eww, but needed for when user hits escape during demo playback - M_DrawScrollingBackground("SRB2BACK"); - - M_DrawFadeScreen(0); + if (curbgcolor >= 0) + V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor); + else if (!curbghide || !titlemapinaction) + M_SkyScroll(curbgxspeed, curbgyspeed, curbgname); + if (curfadevalue) + V_DrawFadeScreen(0xFF00, curfadevalue); M_DrawMenuTitle(); @@ -8298,9 +8366,12 @@ void M_DrawNightsAttackMenu(void) M_ChangeMusic("_inter", true); // Eww, but needed for when user hits escape during demo playback - M_DrawScrollingBackground("SRB2BACK"); - - M_DrawFadeScreen(0); + if (curbgcolor >= 0) + V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor); + else if (!curbghide || !titlemapinaction) + M_SkyScroll(curbgxspeed, curbgyspeed, curbgname); + if (curfadevalue) + V_DrawFadeScreen(0xFF00, curfadevalue); M_DrawMenuTitle(); diff --git a/src/m_menu.h b/src/m_menu.h index 8b1d1055e..8d7db6675 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -128,6 +128,8 @@ typedef struct SINT8 hidetitlepics; // hide title gfx per menu; -1 means undefined, inherits global setting INT32 titlescrollxspeed; // background gfx scroll per menu; inherits global setting INT32 titlescrollyspeed; // y scroll + INT32 bgcolor; // fill color, overrides bg name. -1 means follow bg name rules. + boolean bghide; // for titlemaps, hide the background. char musname[7]; ///< Music track to play. "" for no music. UINT16 mustrack; ///< Subsong to play. Only really relevant for music modules and specific formats supported by GME. 0 to ignore. @@ -145,15 +147,22 @@ typedef struct } menumeta_t; extern menumeta_t menumeta[NUMMENUTYPES]; +extern char curbgname[8]; +extern SINT8 curfadevalue; +extern boolean curhidepics; +extern INT32 curbgcolor; +extern INT32 curbgxspeed; +extern INT32 curbgyspeed; +extern boolean curbghide; + +#define TITLEBACKGROUNDACTIVE (curfadevalue >= 0 || curbgname[0]) -void M_DrawScrollingBackground(const char *defaultname); void M_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, const char *patchname); -boolean M_GetHideTitlePics(void); void MN_Ticker(boolean run); void MN_Start(void); void MN_InitInfoTables(void); void M_ApplyMenuMetaState(void); - +UINT8 M_GetYoungestChildMenu(void); // Called by main loop, // saves config file and calls I_Quit when user exits. From 5870d145b29c325f4b2f01527e23af3826bd2577 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Tue, 20 Nov 2018 18:13:18 -0500 Subject: [PATCH 25/50] Draw connection screen correctly; make scroll speed inherit global setting --- src/d_clisrv.c | 2 +- src/f_finale.c | 2 +- src/m_menu.c | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 271a09363..c8a017947 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1127,7 +1127,7 @@ static inline void CL_DrawConnectionStatus(void) // Draw background fade if (!menuactive) // menu already draws its own fade - V_DrawFadeScreen(0xFF00, curfadevalue); + V_DrawFadeScreen(0xFF00, 16); // force default // Draw the bottom box. M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1); diff --git a/src/f_finale.c b/src/f_finale.c index 525ba2e28..583910f67 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -1465,7 +1465,7 @@ void F_TitleScreenDrawer(void) // Draw that sky! if (curbgcolor >= 0) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor); - else if (!curbghide || !titlemapinaction) + else if (!curbghide || !titlemapinaction || gamestate == GS_WAITINGPLAYERS) M_SkyScroll(curbgxspeed, curbgyspeed, curbgname); // Don't draw outside of the title screewn, or if the patch isn't there. diff --git a/src/m_menu.c b/src/m_menu.c index 5efed4b7f..32885bc64 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2230,6 +2230,8 @@ void MN_InitInfoTables(void) menumeta[i].enterwipe = -1; menumeta[i].exitwipe = -1; menumeta[i].bgcolor = -1; + menumeta[i].titlescrollxspeed = INT32_MAX; + menumeta[i].titlescrollyspeed = INT32_MAX; // default true menumeta[i].enterbubble = true; menumeta[i].exitbubble = true; @@ -2359,8 +2361,8 @@ static boolean MIT_SetCurBackground(UINT32 menutype, INT32 level, INT32 *retval, else if (menumeta[menutype].bgname[0] && (!menumeta[menutype].bghide || !titlemapinaction)) { strncpy(curbgname, menumeta[menutype].bgname, 8); - curbgxspeed = menumeta[menutype].titlescrollxspeed; - curbgyspeed = menumeta[menutype].titlescrollyspeed; + curbgxspeed = menumeta[menutype].titlescrollxspeed != INT32_MAX ? menumeta[menutype].titlescrollxspeed : titlescrollxspeed; + curbgyspeed = menumeta[menutype].titlescrollyspeed != INT32_MAX ? menumeta[menutype].titlescrollyspeed : titlescrollyspeed; return true; } else if (menumeta[menutype].bghide && titlemapinaction) // hide the background From eb95289ea4e50780cf8b4167e50167acb97f7667 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 25 Nov 2018 15:08:12 -0500 Subject: [PATCH 26/50] Rearranged menu presentation methods * Menu parameter retrieval and hierarchy in m_menu * Presentation logic (background display) in f_finale --- src/d_clisrv.c | 2 +- src/d_main.c | 10 +- src/dehacked.c | 46 ++++----- src/f_finale.c | 124 ++++++++++++++++++++-- src/f_finale.h | 15 +++ src/g_game.c | 4 +- src/m_menu.c | 276 +++++++++++++++---------------------------------- src/m_menu.h | 27 ++--- 8 files changed, 256 insertions(+), 248 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 2262b70bb..b24a0f89a 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1984,7 +1984,7 @@ static boolean CL_ServerConnectionTicker(boolean viams, const char *tmpsave, tic #ifdef CLIENT_LOADINGSCREEN if (client && cl_mode != CL_CONNECTED && cl_mode != CL_ABORTED) { - MN_Ticker(true); // title sky + F_MenuPresTicker(true); // title sky F_TitleScreenTicker(true); F_TitleScreenDrawer(); CL_DrawConnectionStatus(); diff --git a/src/d_main.c b/src/d_main.c index df40f16d2..d5cc0f018 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -372,7 +372,7 @@ static void D_Display(void) // Run menu state updates and linedef execs in titlemap if (wipe && (gamestate == GS_TITLESCREEN || gamestate == GS_TIMEATTACK)) - M_ApplyMenuMetaState(); + M_ApplyMenuPresState(); // clean up border stuff // see if the border needs to be initially drawn @@ -751,7 +751,7 @@ void D_StartTitle(void) gametype = GT_COOP; paused = false; advancedemo = false; - MN_Start(); + F_InitMenuPresValues(); F_StartTitleScreen(); CON_ToggleOff(); @@ -1120,11 +1120,11 @@ void D_SRB2Main(void) P_PatchInfoTables(); // initiate menu metadata before SOCcing them - MN_InitInfoTables(); + M_InitMenuPresTables(); // init title screen display params if (M_CheckParm("-connect")) - MN_Start(); + F_InitMenuPresValues(); //---------------------------------------------------- READY TIME // we need to check for dedicated before initialization of some subsystems @@ -1405,7 +1405,7 @@ void D_SRB2Main(void) { CON_ToggleOff(); CON_ClearHUD(); - MN_Start(); + F_InitMenuPresValues(); F_StartTitleScreen(); } else diff --git a/src/dehacked.c b/src/dehacked.c index c63952639..daa81c202 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1956,40 +1956,40 @@ static void readmenu(MYFILE *f, INT32 num) if (fastcmp(word, "BACKGROUNDNAME")) { - strncpy(menumeta[num].bgname, word2, 8); + strncpy(menupres[num].bgname, word2, 8); titlechanged = true; } else if (fastcmp(word, "HIDEBACKGROUND")) { - menumeta[num].bghide = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); + menupres[num].bghide = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } else if (fastcmp(word, "BACKGROUNDCOLOR")) { - menumeta[num].bgcolor = value; + menupres[num].bgcolor = value; titlechanged = true; } else if (fastcmp(word, "HIDETITLEPICS") || fastcmp(word, "HIDEPICS")) { // true by default, except MM_MAIN - menumeta[num].hidetitlepics = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); + menupres[num].hidetitlepics = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } else if (fastcmp(word, "TITLESCROLLSPEED") || fastcmp(word, "TITLESCROLLXSPEED") || fastcmp(word, "SCROLLSPEED") || fastcmp(word, "SCROLLXSPEED")) { - menumeta[num].titlescrollxspeed = get_number(word2); + menupres[num].titlescrollxspeed = get_number(word2); titlechanged = true; } else if (fastcmp(word, "TITLESCROLLYSPEED") || fastcmp(word, "SCROLLYSPEED")) { - menumeta[num].titlescrollyspeed = get_number(word2); + menupres[num].titlescrollyspeed = get_number(word2); titlechanged = true; } else if (fastcmp(word, "MUSIC")) { - strncpy(menumeta[num].musname, word2, 7); - menumeta[num].musname[6] = 0; + strncpy(menupres[num].musname, word2, 7); + menupres[num].musname[6] = 0; titlechanged = true; } #ifdef MUSICSLOT_COMPATIBILITY @@ -1997,70 +1997,70 @@ static void readmenu(MYFILE *f, INT32 num) { value = get_mus(word2, true); if (value && value <= 1035) - snprintf(menumeta[num].musname, 7, "%sM", G_BuildMapName(value)); + snprintf(menupres[num].musname, 7, "%sM", G_BuildMapName(value)); else if (value && value <= 1050) - strncpy(menumeta[num].musname, compat_special_music_slots[value - 1036], 7); + strncpy(menupres[num].musname, compat_special_music_slots[value - 1036], 7); else - menumeta[num].musname[0] = 0; // becomes empty string - menumeta[num].musname[6] = 0; + menupres[num].musname[0] = 0; // becomes empty string + menupres[num].musname[6] = 0; titlechanged = true; } #endif else if (fastcmp(word, "MUSICTRACK")) { - menumeta[num].mustrack = ((UINT16)value - 1); + menupres[num].mustrack = ((UINT16)value - 1); titlechanged = true; } else if (fastcmp(word, "MUSICLOOP")) { // true by default except MM_MAIN - menumeta[num].muslooping = (value || word2[0] == 'T' || word2[0] == 'Y'); + menupres[num].muslooping = (value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } else if (fastcmp(word, "NOMUSIC")) { - menumeta[num].musstop = (value || word2[0] == 'T' || word2[0] == 'Y'); + menupres[num].musstop = (value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } else if (fastcmp(word, "IGNOREMUSIC")) { - menumeta[num].musignore = (value || word2[0] == 'T' || word2[0] == 'Y'); + menupres[num].musignore = (value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } else if (fastcmp(word, "FADESTRENGTH")) { // one-based, <= 0 means use default value. 1-32 - menumeta[num].fadestrength = value-1; + menupres[num].fadestrength = value-1; titlechanged = true; } else if (fastcmp(word, "NOENTERBUBBLE")) { - menumeta[num].enterbubble = !(value || word2[0] == 'T' || word2[0] == 'Y'); + menupres[num].enterbubble = !(value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } else if (fastcmp(word, "NOEXITBUBBLE")) { - menumeta[num].exitbubble = !(value || word2[0] == 'T' || word2[0] == 'Y'); + menupres[num].exitbubble = !(value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } else if (fastcmp(word, "ENTERTAG")) { - menumeta[num].entertag = value; + menupres[num].entertag = value; titlechanged = true; } else if (fastcmp(word, "EXITTAG")) { - menumeta[num].exittag = value; + menupres[num].exittag = value; titlechanged = true; } else if (fastcmp(word, "ENTERWIPE")) { - menumeta[num].enterwipe = value; + menupres[num].enterwipe = value; titlechanged = true; } else if (fastcmp(word, "EXITWIPE")) { - menumeta[num].exitwipe = value; + menupres[num].exitwipe = value; titlechanged = true; } } diff --git a/src/f_finale.c b/src/f_finale.c index 583910f67..5b2474a1f 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -51,7 +51,7 @@ static INT32 timetonext; // Delay between screen changes static INT32 continuetime; // Short delay when continuing static tic_t animtimer; // Used for some animation timings -static INT16 skullAnimCounter; // Prompts: Chevron animation; Title screen: Y animation timing +static INT16 skullAnimCounter; // Prompts: Chevron animation static INT32 roidtics; // Asteroid spinning static INT32 deplete; @@ -60,6 +60,20 @@ static tic_t stoptimer; static boolean keypressed = false; // (no longer) De-Demo'd Title Screen +static tic_t xscrolltimer; +static tic_t yscrolltimer; +static INT32 menuanimtimer; // Title screen: background animation timing +mobj_t *titlemapcameraref = NULL; + +// menu presentation state +char curbgname[8]; +SINT8 curfadevalue; +boolean curhidepics; +INT32 curbgcolor; +INT32 curbgxspeed; +INT32 curbgyspeed; +boolean curbghide; + static UINT8 curDemo = 0; static UINT32 demoDelayLeft; static UINT32 demoIdleLeft; @@ -610,7 +624,7 @@ static void F_IntroDrawScene(void) } else { - M_SkyScroll(80*4, 0, "TITLESKY"); + F_SkyScroll(80*4, 0, "TITLESKY"); if (timetonext == 6) { stoptimer = finalecount; @@ -1351,19 +1365,103 @@ void F_GameEndTicker(void) // ============== // TITLE SCREEN // ============== -mobj_t *titlemapcameraref = NULL; + +void F_InitMenuPresValues(void) +{ + menuanimtimer = 0; + prevMenuId = 0; + activeMenuId = MainDef.menuid; + + // Set defaults for presentation values + strncpy(curbgname, "TITLESKY", 8); + curfadevalue = 16; + curhidepics = hidetitlepics; + curbgcolor = -1; + curbgxspeed = titlescrollxspeed; + curbgyspeed = titlescrollyspeed; + curbghide = false; + + // Find current presentation values + M_SetMenuCurBackground((gamestate == GS_TIMEATTACK) ? "SRB2BACK" : "TITLESKY"); + M_SetMenuCurFadeValue(16); + M_SetMenuCurHideTitlePics(); +} + +// +// F_SkyScroll +// +void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, const char *patchname) +{ + INT32 xscrolled, x, xneg = (scrollxspeed > 0) - (scrollxspeed < 0), tilex; + INT32 yscrolled, y, yneg = (scrollyspeed > 0) - (scrollyspeed < 0), tiley; + boolean xispos = (scrollxspeed >= 0), yispos = (scrollyspeed >= 0); + INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy); + INT16 patwidth, patheight; + INT32 pw, ph; // scaled by dupz + patch_t *pat; + INT32 i, j; + + if (rendermode == render_none) + return; + + if (!patchname || !patchname[0]) + { + V_DrawFill(0, 0, vid.width, vid.height, 31); + return; + } + + if (!scrollxspeed && !scrollyspeed) + { + V_DrawPatchFill(W_CachePatchName(patchname, PU_CACHE)); + return; + } + + pat = W_CachePatchName(patchname, PU_CACHE); + + patwidth = SHORT(pat->width); + patheight = SHORT(pat->height); + pw = patwidth * dupz; + ph = patheight * dupz; + + tilex = max(FixedCeil(FixedDiv(vid.width, pw)) >> FRACBITS, 1)+2; // one tile on both sides of center + tiley = max(FixedCeil(FixedDiv(vid.height, ph)) >> FRACBITS, 1)+2; + + xscrolltimer = ((menuanimtimer*scrollxspeed)/16 + patwidth*xneg) % (patwidth); + yscrolltimer = ((menuanimtimer*scrollyspeed)/16 + patheight*yneg) % (patheight); + + // coordinate offsets + xscrolled = xscrolltimer * dupz; + yscrolled = yscrolltimer * dupz; + + for (x = (xispos) ? -pw*(tilex-1)+pw : 0, i = 0; + i < tilex; + x += pw, i++) + { + for (y = (yispos) ? -ph*(tiley-1)+ph : 0, j = 0; + j < tiley; + y += ph, j++) + { + V_DrawScaledPatch( + (xispos) ? xscrolled - x : x + xscrolled, + (yispos) ? yscrolled - y : y + yscrolled, + V_NOSCALESTART, pat); + } + } + + W_UnlockCachedPatch(pat); +} void F_StartTitleScreen(void) { - if (menumeta[MN_MAIN].musname[0]) - S_ChangeMusic(menumeta[MN_MAIN].musname, menumeta[MN_MAIN].mustrack, menumeta[MN_MAIN].muslooping); + if (menupres[MN_MAIN].musname[0]) + S_ChangeMusic(menupres[MN_MAIN].musname, menupres[MN_MAIN].mustrack, menupres[MN_MAIN].muslooping); else S_ChangeMusicInternal("_title", looptitle); if (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS) { finalecount = 0; - wipetypepost = menumeta[MN_MAIN].enterwipe; + wipetypepost = menupres[MN_MAIN].enterwipe; } else wipegamestate = GS_TITLESCREEN; @@ -1416,8 +1514,8 @@ void F_StartTitleScreen(void) camera.height = 0; // Run enter linedef exec for MN_MAIN, since this is where we start - if (menumeta[MN_MAIN].entertag) - P_LinedefExecute(menumeta[MN_MAIN].entertag, players[displayplayer].mo, NULL); + if (menupres[MN_MAIN].entertag) + P_LinedefExecute(menupres[MN_MAIN].entertag, players[displayplayer].mo, NULL); wipegamestate = prevwipegamestate; } @@ -1466,7 +1564,7 @@ void F_TitleScreenDrawer(void) if (curbgcolor >= 0) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor); else if (!curbghide || !titlemapinaction || gamestate == GS_WAITINGPLAYERS) - M_SkyScroll(curbgxspeed, curbgyspeed, curbgname); + F_SkyScroll(curbgxspeed, curbgyspeed, curbgname); // Don't draw outside of the title screewn, or if the patch isn't there. if (!ttwing || (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS)) @@ -1524,6 +1622,14 @@ luahook: #endif } +// separate animation timer for backgrounds, since we also count +// during GS_TIMEATTACK +void F_MenuPresTicker(boolean run) +{ + if (run) + menuanimtimer++; +} + // (no longer) De-Demo'd Title Screen void F_TitleScreenTicker(boolean run) { diff --git a/src/f_finale.h b/src/f_finale.h index c1cc49ec4..de4bf4ba6 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -40,6 +40,7 @@ void F_TextPromptTicker(void); void F_GameEndDrawer(void); void F_IntroDrawer(void); void F_TitleScreenDrawer(void); +void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, const char *patchname); void F_GameEvaluationDrawer(void); void F_StartGameEvaluation(void); @@ -79,8 +80,22 @@ typedef enum TITLEMAP_RUNNING } titlemap_enum; +// Current menu parameters + extern UINT8 titlemapinaction; extern mobj_t *titlemapcameraref; +extern char curbgname[8]; +extern SINT8 curfadevalue; +extern boolean curhidepics; +extern INT32 curbgcolor; +extern INT32 curbgxspeed; +extern INT32 curbgyspeed; +extern boolean curbghide; + +#define TITLEBACKGROUNDACTIVE (curfadevalue >= 0 || curbgname[0]) + +void F_InitMenuPresValues(void); +void F_MenuPresTicker(boolean run); // // WIPE diff --git a/src/g_game.c b/src/g_game.c index e9cce9ef1..dbe03f289 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1924,7 +1924,7 @@ void G_Ticker(boolean run) break; case GS_TIMEATTACK: - MN_Ticker(run); + F_MenuPresTicker(run); break; case GS_INTRO: @@ -1964,7 +1964,7 @@ void G_Ticker(boolean run) if (titlemapinaction) P_Ticker(run); // then intentionally fall through /* FALLTHRU */ case GS_WAITINGPLAYERS: - MN_Ticker(run); + F_MenuPresTicker(run); F_TitleScreenTicker(run); break; diff --git a/src/m_menu.c b/src/m_menu.c index 32885bc64..d5f489068 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2188,62 +2188,43 @@ void Addons_option_Onchange(void) menu_t *currentMenu = &MainDef; // ========================================================================= -// MENU METADATA LOGIC (BACKGROUNDS) +// MENU PRESENTATION PARAMETER HANDLING (BACKGROUNDS) // ========================================================================= -menumeta_t menumeta[NUMMENUTYPES]; -static tic_t xscrolltimer; -static tic_t yscrolltimer; -static INT32 menuanimtimer; +// menu IDs are equal to current/prevMenu in most cases, except MN_SPECIAL when we don't want to operate on Message, Pause, etc. +UINT32 prevMenuId = 0; +UINT32 activeMenuId = 0; -// menu IDs are equal to current/prevMenu in most cases, except MM_SPECIAL when we don't want to operate on Message, Pause, etc. -static UINT32 prevMenuId = 0; -static UINT32 activeMenuId = 0; +menupres_t menupres[NUMMENUTYPES]; -// menu presentation state -char curbgname[8]; -SINT8 curfadevalue; -boolean curhidepics; -INT32 curbgcolor; -INT32 curbgxspeed; -INT32 curbgyspeed; -boolean curbghide; - -typedef struct -{ - char musname[7]; - UINT16 mustrack; - boolean muslooping; -} menumetamusic_t; - -void MN_InitInfoTables(void) +void M_InitMenuPresTables(void) { INT32 i; // Called in d_main before SOC can get to the tables - // Set menumeta defaults + // Set menupres defaults for (i = 0; i < NUMMENUTYPES; i++) { // so-called "undefined" - menumeta[i].fadestrength = -1; - menumeta[i].hidetitlepics = -1; // inherits global hidetitlepics - menumeta[i].enterwipe = -1; - menumeta[i].exitwipe = -1; - menumeta[i].bgcolor = -1; - menumeta[i].titlescrollxspeed = INT32_MAX; - menumeta[i].titlescrollyspeed = INT32_MAX; + menupres[i].fadestrength = -1; + menupres[i].hidetitlepics = -1; // inherits global hidetitlepics + menupres[i].enterwipe = -1; + menupres[i].exitwipe = -1; + menupres[i].bgcolor = -1; + menupres[i].titlescrollxspeed = INT32_MAX; + menupres[i].titlescrollyspeed = INT32_MAX; // default true - menumeta[i].enterbubble = true; - menumeta[i].exitbubble = true; + menupres[i].enterbubble = true; + menupres[i].exitbubble = true; if (i != MN_MAIN) { - menumeta[i].muslooping = true; + menupres[i].muslooping = true; } if (i == MN_SP_TIMEATTACK || i == MN_SP_NIGHTSATTACK) - strncpy(menumeta[i].musname, "_inter", 7); + strncpy(menupres[i].musname, "_inter", 7); else if (i == MN_SP_PLAYER) - strncpy(menumeta[i].musname, "_chsel", 7); + strncpy(menupres[i].musname, "_chsel", 7); } } @@ -2260,6 +2241,15 @@ void MN_InitInfoTables(void) // return false - continue typedef boolean (*menutree_iterator)(UINT32, INT32, INT32 *, void **, boolean fromoldest); +// HACK: Used in the ChangeMusic iterator because we only allow +// a single input. Maybe someday use this struct program-wide. +typedef struct +{ + char musname[7]; + UINT16 mustrack; + boolean muslooping; +} menupresmusic_t; + static INT32 M_IterateMenuTree(menutree_iterator itfunc, void *input) { INT32 i, retval = 0; @@ -2304,7 +2294,6 @@ static boolean MIT_GetMenuAtLevel(UINT32 menutype, INT32 level, INT32 *retval, v INT32 targetlevel = *inputptr; if (menutype) { - // \todo offset targetlevel by failed initial attempts if (level == targetlevel || targetlevel < 0) { *retval = menutype; @@ -2353,19 +2342,19 @@ static boolean MIT_SetCurBackground(UINT32 menutype, INT32 level, INT32 *retval, (void)retval; (void)fromoldest; - if (menumeta[menutype].bgcolor >= 0) + if (menupres[menutype].bgcolor >= 0) { - curbgcolor = menumeta[menutype].bgcolor; + curbgcolor = menupres[menutype].bgcolor; return true; } - else if (menumeta[menutype].bgname[0] && (!menumeta[menutype].bghide || !titlemapinaction)) + else if (menupres[menutype].bgname[0] && (!menupres[menutype].bghide || !titlemapinaction)) { - strncpy(curbgname, menumeta[menutype].bgname, 8); - curbgxspeed = menumeta[menutype].titlescrollxspeed != INT32_MAX ? menumeta[menutype].titlescrollxspeed : titlescrollxspeed; - curbgyspeed = menumeta[menutype].titlescrollyspeed != INT32_MAX ? menumeta[menutype].titlescrollyspeed : titlescrollyspeed; + strncpy(curbgname, menupres[menutype].bgname, 8); + curbgxspeed = menupres[menutype].titlescrollxspeed != INT32_MAX ? menupres[menutype].titlescrollxspeed : titlescrollxspeed; + curbgyspeed = menupres[menutype].titlescrollyspeed != INT32_MAX ? menupres[menutype].titlescrollyspeed : titlescrollyspeed; return true; } - else if (menumeta[menutype].bghide && titlemapinaction) // hide the background + else if (menupres[menutype].bghide && titlemapinaction) // hide the background { curbghide = true; return true; @@ -2388,22 +2377,22 @@ static boolean MIT_SetCurBackground(UINT32 menutype, INT32 level, INT32 *retval, static boolean MIT_ChangeMusic(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { - menumetamusic_t *defaultmusic = (menumetamusic_t*)*input; + menupresmusic_t *defaultmusic = (menupresmusic_t*)*input; (void)retval; (void)fromoldest; - if (menumeta[menutype].musname[0]) + if (menupres[menutype].musname[0]) { - S_ChangeMusic(menumeta[menutype].musname, menumeta[menutype].mustrack, menumeta[menutype].muslooping); + S_ChangeMusic(menupres[menutype].musname, menupres[menutype].mustrack, menupres[menutype].muslooping); return true; } - else if (menumeta[menutype].musstop) + else if (menupres[menutype].musstop) { S_StopMusic(); return true; } - else if (menumeta[menutype].musignore) + else if (menupres[menutype].musignore) return true; else if (!level && defaultmusic && defaultmusic->musname[0]) S_ChangeMusic(defaultmusic->musname, defaultmusic->mustrack, defaultmusic->muslooping); @@ -2417,9 +2406,9 @@ static boolean MIT_SetCurFadeValue(UINT32 menutype, INT32 level, INT32 *retval, (void)retval; (void)fromoldest; - if (menumeta[menutype].fadestrength >= 0) + if (menupres[menutype].fadestrength >= 0) { - curfadevalue = (menumeta[menutype].fadestrength % 32); + curfadevalue = (menupres[menutype].fadestrength % 32); return true; } else if (!level) @@ -2433,9 +2422,9 @@ static boolean MIT_SetCurHideTitlePics(UINT32 menutype, INT32 level, INT32 *retv (void)retval; (void)fromoldest; - if (menumeta[menutype].hidetitlepics >= 0) + if (menupres[menutype].hidetitlepics >= 0) { - curhidepics = menumeta[menutype].hidetitlepics; + curhidepics = menupres[menutype].hidetitlepics; return true; } else if (!level) @@ -2490,9 +2479,9 @@ static boolean M_HasMenuType(menutype_t needletype) // EFFECTS // ==================================== -static void M_ChangeMusic(const char *defaultmusname, boolean defaultmuslooping) +void M_ChangeMenuMusic(const char *defaultmusname, boolean defaultmuslooping) { - menumetamusic_t defaultmusic; + menupresmusic_t defaultmusic; if (!defaultmusname) defaultmusname = ""; @@ -2505,19 +2494,19 @@ static void M_ChangeMusic(const char *defaultmusname, boolean defaultmuslooping) M_IterateMenuTree(MIT_ChangeMusic, &defaultmusic); } -static void M_SetCurBackground(const char *defaultname) +void M_SetMenuCurBackground(const char *defaultname) { char name[8]; strncpy(name, defaultname, 8); M_IterateMenuTree(MIT_SetCurBackground, &name); } -static void M_SetCurFadeValue(UINT8 defaultvalue) +void M_SetMenuCurFadeValue(UINT8 defaultvalue) { M_IterateMenuTree(MIT_SetCurFadeValue, &defaultvalue); } -static void M_SetCurHideTitlePics(void) +void M_SetMenuCurHideTitlePics(void) { M_IterateMenuTree(MIT_SetCurHideTitlePics, NULL); } @@ -2532,7 +2521,7 @@ static INT16 exitwipe, enterwipe; static boolean exitbubble, enterbubble; static INT16 exittag, entertag; -static void M_HandleMenuMetaState(menu_t *newMenu) +static void M_HandleMenuPresState(menu_t *newMenu) { INT32 i; UINT32 bitmask; @@ -2574,9 +2563,9 @@ static void M_HandleMenuMetaState(menu_t *newMenu) return; // Find current presentation values - M_SetCurBackground((gamestate == GS_TIMEATTACK) ? "SRB2BACK" : "TITLESKY"); - M_SetCurFadeValue(16); - M_SetCurHideTitlePics(); + M_SetMenuCurBackground((gamestate == GS_TIMEATTACK) ? "SRB2BACK" : "TITLESKY"); + M_SetMenuCurFadeValue(16); + M_SetMenuCurHideTitlePics(); // Loop through both menu IDs in parallel and look for type changes // The youngest child in activeMenuId is the entered menu @@ -2600,18 +2589,18 @@ static void M_HandleMenuMetaState(menu_t *newMenu) { exittype = prevtype; exitlevel = i; - exitwipe = menumeta[exittype].exitwipe; - exitbubble = menumeta[exittype].exitbubble; - exittag = menumeta[exittype].exittag; + exitwipe = menupres[exittype].exitwipe; + exitbubble = menupres[exittype].exitbubble; + exittag = menupres[exittype].exittag; } if (activetype && (entertype < 0)) { entertype = activetype; enterlevel = i; - enterwipe = menumeta[entertype].enterwipe; - enterbubble = menumeta[entertype].enterbubble; - entertag = menumeta[entertype].entertag; + enterwipe = menupres[entertype].enterwipe; + enterbubble = menupres[entertype].enterbubble; + entertag = menupres[entertype].entertag; } if (prevtype && activetype && prevtype == activetype && anceslevel < 0) @@ -2630,15 +2619,15 @@ static void M_HandleMenuMetaState(menu_t *newMenu) bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); prevtype = (prevMenuId & bitmask) >> (MENUBITS*i); - if (menumeta[prevtype].exitwipe >= 0) + if (menupres[prevtype].exitwipe >= 0) { - exitwipe = menumeta[prevtype].exitwipe; + exitwipe = menupres[prevtype].exitwipe; break; } } if (exitwipe < 0) - exitwipe = menumeta[MN_MAIN].exitwipe; + exitwipe = menupres[MN_MAIN].exitwipe; } // do the same for enter wipe @@ -2649,19 +2638,19 @@ static void M_HandleMenuMetaState(menu_t *newMenu) bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); activetype = (activeMenuId & bitmask) >> (MENUBITS*i); - if (menumeta[activetype].enterwipe >= 0) + if (menupres[activetype].enterwipe >= 0) { - exitwipe = menumeta[activetype].enterwipe; + exitwipe = menupres[activetype].enterwipe; break; } } if (enterwipe < 0) - enterwipe = menumeta[MN_MAIN].enterwipe; + enterwipe = menupres[MN_MAIN].enterwipe; } // Change the music - M_ChangeMusic("_title", false); + M_ChangeMenuMusic("_title", false); // Run the linedef execs if (titlemapinaction) @@ -2675,8 +2664,8 @@ static void M_HandleMenuMetaState(menu_t *newMenu) { bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); menutype = (prevMenuId & bitmask) >> (MENUBITS*i); - if (menumeta[menutype].exittag) - P_LinedefExecute(menumeta[menutype].exittag, players[displayplayer].mo, NULL); + if (menupres[menutype].exittag) + P_LinedefExecute(menupres[menutype].exittag, players[displayplayer].mo, NULL); } } else if (exittag) @@ -2692,8 +2681,8 @@ static void M_HandleMenuMetaState(menu_t *newMenu) { bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); menutype = (activeMenuId & bitmask) >> (MENUBITS*i); - if (menumeta[menutype].entertag) - P_LinedefExecute(menumeta[menutype].entertag, players[displayplayer].mo, NULL); + if (menupres[menutype].entertag) + P_LinedefExecute(menupres[menutype].entertag, players[displayplayer].mo, NULL); } } else if (entertag) @@ -2728,10 +2717,10 @@ static void M_HandleMenuMetaState(menu_t *newMenu) // D_Display runs the next step of processing } else - M_ApplyMenuMetaState(); // run the next step now + M_ApplyMenuPresState(); // run the next step now } -void M_ApplyMenuMetaState(void) +void M_ApplyMenuPresState(void) { #if 0 INT32 i; @@ -2775,7 +2764,7 @@ static void M_GoBack(INT32 choice) Z_Free(levelselect.rows); levelselect.rows = NULL; menuactive = false; - wipetypepre = menumeta[M_GetYoungestChildMenu()].exitwipe; + wipetypepre = menupres[M_GetYoungestChildMenu()].exitwipe; D_StartTitle(); } else @@ -3437,7 +3426,7 @@ void M_SetupNextMenu(menu_t *menudef) return; // we can't quit this menu (also used to set parameter from the menu) } - M_HandleMenuMetaState(menudef); + M_HandleMenuPresState(menudef); currentMenu = menudef; itemOn = currentMenu->lastOn; @@ -3543,101 +3532,6 @@ void M_Init(void) #endif } -// ========================================================================== -// COMMON MENU DRAW ROUTINES -// ========================================================================== - -void MN_Start(void) -{ - menuanimtimer = 0; - prevMenuId = 0; - activeMenuId = MainDef.menuid; - - // Set defaults for presentation values - strncpy(curbgname, "TITLESKY", 8); - curfadevalue = 16; - curhidepics = hidetitlepics; - curbgcolor = -1; - curbgxspeed = titlescrollxspeed; - curbgyspeed = titlescrollyspeed; - curbghide = false; - - // Find current presentation values - M_SetCurBackground((gamestate == GS_TIMEATTACK) ? "SRB2BACK" : "TITLESKY"); - M_SetCurFadeValue(16); - M_SetCurHideTitlePics(); -} - -void MN_Ticker(boolean run) -{ - if (run) - menuanimtimer++; -} - -// -// M_SkyScroll -// -void M_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, const char *patchname) -{ - INT32 xscrolled, x, xneg = (scrollxspeed > 0) - (scrollxspeed < 0), tilex; - INT32 yscrolled, y, yneg = (scrollyspeed > 0) - (scrollyspeed < 0), tiley; - boolean xispos = (scrollxspeed >= 0), yispos = (scrollyspeed >= 0); - INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy); - INT16 patwidth, patheight; - INT32 pw, ph; // scaled by dupz - patch_t *pat; - INT32 i, j; - - if (rendermode == render_none) - return; - - if (!patchname || !patchname[0]) - { - V_DrawFill(0, 0, vid.width, vid.height, 31); - return; - } - - if (!scrollxspeed && !scrollyspeed) - { - V_DrawPatchFill(W_CachePatchName(patchname, PU_CACHE)); - return; - } - - pat = W_CachePatchName(patchname, PU_CACHE); - - patwidth = SHORT(pat->width); - patheight = SHORT(pat->height); - pw = patwidth * dupz; - ph = patheight * dupz; - - tilex = max(FixedCeil(FixedDiv(vid.width, pw)) >> FRACBITS, 1)+2; // one tile on both sides of center - tiley = max(FixedCeil(FixedDiv(vid.height, ph)) >> FRACBITS, 1)+2; - - xscrolltimer = ((menuanimtimer*scrollxspeed)/16 + patwidth*xneg) % (patwidth); - yscrolltimer = ((menuanimtimer*scrollyspeed)/16 + patheight*yneg) % (patheight); - - // coordinate offsets - xscrolled = xscrolltimer * dupz; - yscrolled = yscrolltimer * dupz; - - for (x = (xispos) ? -pw*(tilex-1)+pw : 0, i = 0; - i < tilex; - x += pw, i++) - { - for (y = (yispos) ? -ph*(tiley-1)+ph : 0, j = 0; - j < tiley; - y += ph, j++) - { - V_DrawScaledPatch( - (xispos) ? xscrolled - x : x + xscrolled, - (yispos) ? yscrolled - y : y + yscrolled, - V_NOSCALESTART, pat); - } - } - - W_UnlockCachedPatch(pat); -} - // ========================================================================== // SPECIAL MENU OPTION DRAW ROUTINES GO HERE // ========================================================================== @@ -5180,7 +5074,7 @@ static void M_DrawLevelPlatterMenu(void) if (curbgcolor >= 0) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor); else if (!curbghide || !titlemapinaction) - M_SkyScroll(curbgxspeed, curbgyspeed, curbgname); + F_SkyScroll(curbgxspeed, curbgyspeed, curbgname); if (curfadevalue) V_DrawFadeScreen(0xFF00, curfadevalue); } @@ -5389,7 +5283,7 @@ static void M_DrawMessageMenu(void) if (curbgcolor >= 0) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor); else if (!curbghide || !titlemapinaction) - M_SkyScroll(curbgxspeed, curbgyspeed, curbgname); + F_SkyScroll(curbgxspeed, curbgyspeed, curbgname); if (curfadevalue) V_DrawFadeScreen(0xFF00, curfadevalue); } @@ -7687,7 +7581,7 @@ static void M_SetupChoosePlayer(INT32 choice) } if (Playing() == false) - M_ChangeMusic("_chsel", true); + M_ChangeMenuMusic("_chsel", true); SP_PlayerDef.prevMenu = currentMenu; M_SetupNextMenu(&SP_PlayerDef); @@ -7784,7 +7678,7 @@ static void M_DrawSetupChoosePlayerMenu(void) if (curbgcolor >= 0) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor); else if (!curbghide || !titlemapinaction) - M_SkyScroll(curbgxspeed, curbgyspeed, curbgname); + F_SkyScroll(curbgxspeed, curbgyspeed, curbgname); if (curfadevalue) V_DrawFadeScreen(0xFF00, curfadevalue); @@ -8174,12 +8068,12 @@ void M_DrawTimeAttackMenu(void) UINT16 dispstatus; patch_t *PictureOfUrFace; - M_ChangeMusic("_inter", true); // Eww, but needed for when user hits escape during demo playback + M_ChangeMenuMusic("_inter", true); // Eww, but needed for when user hits escape during demo playback if (curbgcolor >= 0) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor); else if (!curbghide || !titlemapinaction) - M_SkyScroll(curbgxspeed, curbgyspeed, curbgname); + F_SkyScroll(curbgxspeed, curbgyspeed, curbgname); if (curfadevalue) V_DrawFadeScreen(0xFF00, curfadevalue); @@ -8366,12 +8260,12 @@ void M_DrawNightsAttackMenu(void) INT32 i, x, y, cursory = 0; UINT16 dispstatus; - M_ChangeMusic("_inter", true); // Eww, but needed for when user hits escape during demo playback + M_ChangeMenuMusic("_inter", true); // Eww, but needed for when user hits escape during demo playback if (curbgcolor >= 0) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor); else if (!curbghide || !titlemapinaction) - M_SkyScroll(curbgxspeed, curbgyspeed, curbgname); + F_SkyScroll(curbgxspeed, curbgyspeed, curbgname); if (curfadevalue) V_DrawFadeScreen(0xFF00, curfadevalue); @@ -8761,17 +8655,17 @@ static void M_ModeAttackEndGame(INT32 choice) default: case ATTACKING_RECORD: currentMenu = &SP_TimeAttackDef; - wipetypepost = menumeta[MN_SP_TIMEATTACK].enterwipe; + wipetypepost = menupres[MN_SP_TIMEATTACK].enterwipe; break; case ATTACKING_NIGHTS: currentMenu = &SP_NightsAttackDef; - wipetypepost = menumeta[MN_SP_NIGHTSATTACK].enterwipe; + wipetypepost = menupres[MN_SP_NIGHTSATTACK].enterwipe; break; } itemOn = currentMenu->lastOn; G_SetGamestate(GS_TIMEATTACK); modeattacking = ATTACKING_NONE; - M_ChangeMusic("_title", true); + M_ChangeMenuMusic("_title", true); Nextmap_OnChange(); } diff --git a/src/m_menu.h b/src/m_menu.h index 8d7db6675..138834c7e 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -121,7 +121,6 @@ typedef enum NUMMENUTYPES, } menutype_t; // up to 63; MN_SPECIAL = 53 -// Menu parameters typedef struct { char bgname[8]; // name for background gfx lump; lays over titlemap if this is set @@ -144,25 +143,19 @@ typedef struct INT32 exittag; // line exec to run on menu exit, if titlemap INT16 enterwipe; // wipe type to run on menu enter, -1 means default INT16 exitwipe; // wipe type to run on menu exit, -1 means default -} menumeta_t; +} menupres_t; -extern menumeta_t menumeta[NUMMENUTYPES]; -extern char curbgname[8]; -extern SINT8 curfadevalue; -extern boolean curhidepics; -extern INT32 curbgcolor; -extern INT32 curbgxspeed; -extern INT32 curbgyspeed; -extern boolean curbghide; +extern menupres_t menupres[NUMMENUTYPES]; +extern UINT32 prevMenuId; +extern UINT32 activeMenuId; -#define TITLEBACKGROUNDACTIVE (curfadevalue >= 0 || curbgname[0]) - -void M_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, const char *patchname); -void MN_Ticker(boolean run); -void MN_Start(void); -void MN_InitInfoTables(void); -void M_ApplyMenuMetaState(void); +void M_InitMenuPresTables(void); +void M_ApplyMenuPresState(void); UINT8 M_GetYoungestChildMenu(void); +void M_ChangeMenuMusic(const char *defaultmusname, boolean defaultmuslooping); +void M_SetMenuCurBackground(const char *defaultname); +void M_SetMenuCurFadeValue(UINT8 defaultvalue); +void M_SetMenuCurHideTitlePics(void); // Called by main loop, // saves config file and calls I_Quit when user exits. From 0439479b3e62d8ff40d42312b6c211fafb747d7f Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 25 Nov 2018 15:08:36 -0500 Subject: [PATCH 27/50] Remove M_ApplyMenuPresState --- src/d_main.c | 4 ---- src/m_menu.h | 1 - 2 files changed, 5 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index d5cc0f018..0f35ee07a 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -370,10 +370,6 @@ static void D_Display(void) break; } - // Run menu state updates and linedef execs in titlemap - if (wipe && (gamestate == GS_TITLESCREEN || gamestate == GS_TIMEATTACK)) - M_ApplyMenuPresState(); - // clean up border stuff // see if the border needs to be initially drawn if (gamestate == GS_LEVEL || (gamestate == GS_TITLESCREEN && titlemapinaction && curbghide)) diff --git a/src/m_menu.h b/src/m_menu.h index 138834c7e..913386ef1 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -150,7 +150,6 @@ extern UINT32 prevMenuId; extern UINT32 activeMenuId; void M_InitMenuPresTables(void); -void M_ApplyMenuPresState(void); UINT8 M_GetYoungestChildMenu(void); void M_ChangeMenuMusic(const char *defaultmusname, boolean defaultmuslooping); void M_SetMenuCurBackground(const char *defaultname); From e2ca92a3db0eee6778c4366c0106da176b1da616 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 25 Nov 2018 15:09:25 -0500 Subject: [PATCH 28/50] Remove unused menu hierarchy methods --- src/m_menu.c | 96 ---------------------------------------------------- 1 file changed, 96 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index d5f489068..fffddc71d 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2266,24 +2266,6 @@ static INT32 M_IterateMenuTree(menutree_iterator itfunc, void *input) return retval; } -#if 0 -static INT32 M_IterateMenuTreeFromTop(menutree_iterator itfunc, void *input) -{ - INT32 i, retval = 0; - UINT32 bitmask, menutype; - - for (i = 0; i <= NUMMENULEVELS; i++) - { - bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); - menutype = (activeMenuId & bitmask) >> (MENUBITS*i); - if (itfunc(menutype, i, &retval, &input, true)) - break; - } - - return retval; -} -#endif - // ==================================== // ITERATORS // ==================================== @@ -2311,30 +2293,6 @@ static boolean MIT_GetMenuAtLevel(UINT32 menutype, INT32 level, INT32 *retval, v return false; } -#if 0 -static boolean MIT_GetEdgeLevel(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) -{ - if (menutype) - { - *retval = level; - return true; - } - return false; -} - - -static boolean MIT_HasMenuType(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) -{ - menutype_t inputtype = *(menutype_t*)*input; - if (menutype == inputtype) - { - *retval = true; - return true; - } - return false; -} -#endif - static boolean MIT_SetCurBackground(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { char *defaultname = (char*)*input; @@ -2436,45 +2394,12 @@ static boolean MIT_SetCurHideTitlePics(UINT32 menutype, INT32 level, INT32 *retv // TREE RETRIEVAL // ==================================== -#if 0 -// level is nth level relative to top or bottom from tree -static menutype_t M_GetMenuAtLevel(INT32 level, boolean fromoldest) -{ - if (fromoldest) - return M_IterateMenuTreeFromTop(MIT_GetMenuAtLevel, &level); - else - { - if (level >= 0) - level = NUMMENULEVELS - level; // iterating backwards, so count from highest value - return M_IterateMenuTree(MIT_GetMenuAtLevel, &level); - } -} -#endif - UINT8 M_GetYoungestChildMenu(void) // aka the active menu { INT32 targetlevel = -1; return M_IterateMenuTree(MIT_GetMenuAtLevel, &targetlevel); } -#if 0 -static UINT8 M_GetOldestParentMenu() -{ - INT32 targetlevel = -1; - return M_IterateMenuTreeFromTop(MIT_GetMenuAtLevel, &targetlevel); -} - -static UINT8 M_GetYoungestChildLevel() // aka the active menu -{ - return M_IterateMenuTree(MIT_GetEdgeLevel, NULL); -} - -static boolean M_HasMenuType(menutype_t needletype) -{ - return M_IterateMenuTreeFromTop(MIT_HasMenuType, &needletype); -} -#endif - // ==================================== // EFFECTS // ==================================== @@ -2716,27 +2641,6 @@ static void M_HandleMenuPresState(menu_t *newMenu) // D_Display runs the next step of processing } - else - M_ApplyMenuPresState(); // run the next step now -} - -void M_ApplyMenuPresState(void) -{ -#if 0 - INT32 i; - UINT32 bitmask, menutype; - - if (gamestate != GS_TITLESCREEN && gamestate != GS_TIMEATTACK) - return; - - // 3. Run each exit exec on the prevMenuId up to the common ancestor (UNLESS NoBubbleExecs) - // 4. Run each entrance exec on the activeMenuId down from the common ancestor (UNLESS NoBubbleExecs) - - // \todo placeholder -- do we want any logic to happen between wipes? - // do we want to split linedef execs between pre-wipe and tween-wipe? - - // D_Display runs the enter wipe, if applicable -#endif } // ========================================================================= From 73be0c33ae56b3a992d9913adeec8e0174593a5e Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 25 Nov 2018 15:16:53 -0500 Subject: [PATCH 29/50] Use get_number in dehacked readmenu --- src/dehacked.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index daa81c202..ed8a5a7b3 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1966,7 +1966,7 @@ static void readmenu(MYFILE *f, INT32 num) } else if (fastcmp(word, "BACKGROUNDCOLOR")) { - menupres[num].bgcolor = value; + menupres[num].bgcolor = get_number(word2); titlechanged = true; } else if (fastcmp(word, "HIDETITLEPICS") || fastcmp(word, "HIDEPICS")) @@ -2030,7 +2030,7 @@ static void readmenu(MYFILE *f, INT32 num) else if (fastcmp(word, "FADESTRENGTH")) { // one-based, <= 0 means use default value. 1-32 - menupres[num].fadestrength = value-1; + menupres[num].fadestrength = get_number(word2)-1; titlechanged = true; } else if (fastcmp(word, "NOENTERBUBBLE")) @@ -2045,22 +2045,22 @@ static void readmenu(MYFILE *f, INT32 num) } else if (fastcmp(word, "ENTERTAG")) { - menupres[num].entertag = value; + menupres[num].entertag = get_number(word2); titlechanged = true; } else if (fastcmp(word, "EXITTAG")) { - menupres[num].exittag = value; + menupres[num].exittag = get_number(word2); titlechanged = true; } else if (fastcmp(word, "ENTERWIPE")) { - menupres[num].enterwipe = value; + menupres[num].enterwipe = get_number(word2); titlechanged = true; } else if (fastcmp(word, "EXITWIPE")) { - menupres[num].exitwipe = value; + menupres[num].exitwipe = get_number(word2); titlechanged = true; } } From 900f7e3dc9e23e9e0df64aebe2b228b9c3e5721c Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 25 Nov 2018 19:31:22 -0500 Subject: [PATCH 30/50] FORCEWIPEOFF define in place of wipegamestate = -2 --- src/d_main.c | 4 ++-- src/f_finale.h | 1 + src/p_setup.c | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 989204e1f..6ee78cabb 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -288,7 +288,7 @@ static void D_Display(void) { // Fade to black first if ((wipegamestate == (gamestate_t)FORCEWIPE || - (wipegamestate != (gamestate_t)-2 + (wipegamestate != (gamestate_t)FORCEWIPEOFF && !(gamestate == GS_LEVEL || (gamestate == GS_TITLESCREEN && titlemapinaction))) ) // fades to black on its own timing, always && wipetypepre != UINT8_MAX) @@ -374,7 +374,7 @@ static void D_Display(void) // STUPID race condition... if (wipegamestate == GS_INTRO && gamestate == GS_TITLESCREEN) - wipegamestate = -2; + wipegamestate = FORCEWIPEOFF; else { wipegamestate = gamestate; diff --git a/src/f_finale.h b/src/f_finale.h index 27ece47c9..18c032ba6 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -102,6 +102,7 @@ void F_MenuPresTicker(boolean run); // // HACK for menu fading while titlemapinaction; skips the level check #define FORCEWIPE -3 +#define FORCEWIPEOFF -2 extern boolean WipeInAction; extern INT32 lastwipetic; diff --git a/src/p_setup.c b/src/p_setup.c index f7d51ad0f..9686585bb 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2729,7 +2729,7 @@ boolean P_SetupLevel(boolean skipprecip) players[consoleplayer].viewz = 1; // Cancel all d_main.c fadeouts (keep fade in though). - wipegamestate = -2; + wipegamestate = FORCEWIPEOFF; // Special stage fade to white // This is handled BEFORE sounds are stopped. From 356249dade14c25a0404e75fd5eacd61acbed443 Mon Sep 17 00:00:00 2001 From: james Date: Thu, 17 Jan 2019 16:47:01 -0800 Subject: [PATCH 31/50] Set modifiers in a non-reactive manner --- src/console.c | 10 ---------- src/d_main.c | 31 +------------------------------ src/hu_stuff.c | 10 ---------- src/sdl/i_video.c | 16 ++++++++++++++-- 4 files changed, 15 insertions(+), 52 deletions(-) diff --git a/src/console.c b/src/console.c index 5c173e459..50e185770 100644 --- a/src/console.c +++ b/src/console.c @@ -1051,16 +1051,6 @@ boolean CON_Responder(event_t *ev) else if (key == KEY_KPADSLASH) key = '/'; - // capslock - if (key == KEY_CAPSLOCK) // it's a toggle. - { - if (capslock) - capslock = false; - else - capslock = true; - return true; - } - if (key >= 'a' && key <= 'z') { if (capslock ^ shiftdown) diff --git a/src/d_main.c b/src/d_main.c index dd2cfe0e5..bc180f9bc 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -176,37 +176,11 @@ void D_PostEvent_end(void) {}; #endif // modifier keys +// Now handled in I_OsPolling UINT8 shiftdown = 0; // 0x1 left, 0x2 right UINT8 ctrldown = 0; // 0x1 left, 0x2 right UINT8 altdown = 0; // 0x1 left, 0x2 right boolean capslock = 0; // gee i wonder what this does. -// -// D_ModifierKeyResponder -// Sets global shift/ctrl/alt variables, never actually eats events -// -static inline void D_ModifierKeyResponder(event_t *ev) -{ - if (ev->type == ev_keydown || ev->type == ev_console) switch (ev->data1) - { - case KEY_LSHIFT: shiftdown |= 0x1; return; - case KEY_RSHIFT: shiftdown |= 0x2; return; - case KEY_LCTRL: ctrldown |= 0x1; return; - case KEY_RCTRL: ctrldown |= 0x2; return; - case KEY_LALT: altdown |= 0x1; return; - case KEY_RALT: altdown |= 0x2; return; - default: return; - } - else if (ev->type == ev_keyup) switch (ev->data1) - { - case KEY_LSHIFT: shiftdown &= ~0x1; return; - case KEY_RSHIFT: shiftdown &= ~0x2; return; - case KEY_LCTRL: ctrldown &= ~0x1; return; - case KEY_RCTRL: ctrldown &= ~0x2; return; - case KEY_LALT: altdown &= ~0x1; return; - case KEY_RALT: altdown &= ~0x2; return; - default: return; - } -} // // D_ProcessEvents @@ -220,9 +194,6 @@ void D_ProcessEvents(void) { ev = &events[eventtail]; - // Set global shift/ctrl/alt down variables - D_ModifierKeyResponder(ev); // never eats events - // Screenshots over everything so that they can be taken anywhere. if (M_ScreenshotResponder(ev)) continue; // ate the event diff --git a/src/hu_stuff.c b/src/hu_stuff.c index e34e5c35c..a416f0d26 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -1101,16 +1101,6 @@ boolean HU_Responder(event_t *ev) c = (INT32)ev->data1; - // capslock (now handled outside of chat on so that it works everytime......) - if (c && c == KEY_CAPSLOCK) // it's a toggle. - { - if (capslock) - capslock = false; - else - capslock = true; - return true; - } - #ifndef NONET if (!chat_on) { diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index dbaa7037a..71d806050 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -580,8 +580,6 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt) if (cv_usemouse.value) I_StartupMouse(); } //else firsttimeonmouse = SDL_FALSE; - - capslock = !!( SDL_GetModState() & KMOD_CAPS );// in case CL changes } else if (!mousefocus && !kbfocus) { @@ -939,6 +937,8 @@ void I_StartupMouse(void) // void I_OsPolling(void) { + SDL_Keymod mod; + if (consolevent) I_GetConsoleEvents(); if (SDL_WasInit(SDL_INIT_JOYSTICK) == SDL_INIT_JOYSTICK) @@ -951,6 +951,18 @@ void I_OsPolling(void) I_GetMouseEvents(); I_GetEvent(); + + mod = SDL_GetModState(); + /* Handle here so that our state is always synched with the system. */ + shiftdown = ctrldown = altdown = 0; + capslock = false; + if (mod & KMOD_LSHIFT) shiftdown |= 1; + if (mod & KMOD_RSHIFT) shiftdown |= 2; + if (mod & KMOD_LCTRL) ctrldown |= 1; + if (mod & KMOD_RCTRL) ctrldown |= 2; + if (mod & KMOD_LALT) altdown |= 1; + if (mod & KMOD_RALT) altdown |= 2; + if (mod & KMOD_CAPS) capslock = true; } // From c9d90f7688aa7804316e99649bd85765cf7942df Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Thu, 21 Feb 2019 19:44:18 -0500 Subject: [PATCH 32/50] Add command to ban an IP address. --- src/d_clisrv.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 2529b05d0..8ba356b68 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2627,6 +2627,42 @@ static void Command_Ban(void) } +static void Command_BanIP(void) +{ + if (COM_Argc() < 2) + { + CONS_Printf(M_GetText("banip : ban an ip address\n")); + return; + } + + if (server) // Only the server can use this, otherwise does nothing. + { + const char *address = (COM_Argv(1)); + const char *reason; + + if (COM_Argc() == 2) + reason = NULL; + else + reason = COM_Argv(2); + + + if (I_SetBanAddress && I_SetBanAddress(address, NULL)) + { + if (reason) + CONS_Printf("Banned IP address %s for: %s\n", address, reason); + else + CONS_Printf("Banned IP address %s\n", address); + + Ban_Add(reason); + D_SaveBan(); + } + else + { + return; + } + } +} + static void Command_Kick(void) { if (COM_Argc() < 2) @@ -2906,6 +2942,7 @@ void D_ClientServerInit(void) COM_AddCommand("getplayernum", Command_GetPlayerNum); COM_AddCommand("kick", Command_Kick); COM_AddCommand("ban", Command_Ban); + COM_AddCommand("banip", Command_BanIP); COM_AddCommand("clearbans", Command_ClearBans); COM_AddCommand("showbanlist", Command_ShowBan); COM_AddCommand("reloadbans", Command_ReloadBan); From bf2f6ebc098e4089b30b4e3fd65110890cbac64c Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Mon, 18 Feb 2019 01:03:39 -0500 Subject: [PATCH 33/50] Save ban list right after banning. --- src/d_clisrv.c | 3 +++ src/djgppdos/i_system.c | 3 --- src/sdl12/i_system.c | 3 --- src/win32/win_sys.c | 3 --- 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 8ba356b68..f3b1451a4 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2596,7 +2596,10 @@ static void Command_Ban(void) else { if (server) // only the server is allowed to do this right now + { Ban_Add(COM_Argv(2)); + D_SaveBan(); // save the ban list + } if (COM_Argc() == 2) { diff --git a/src/djgppdos/i_system.c b/src/djgppdos/i_system.c index dae9ed16e..5413bfdb4 100644 --- a/src/djgppdos/i_system.c +++ b/src/djgppdos/i_system.c @@ -615,9 +615,6 @@ void I_Quit (void) //added:16-02-98: when recording a demo, should exit using 'q' key, // but sometimes we forget and use 'F10'.. so save here too. M_SaveConfig (NULL); //save game config, cvars.. -#ifndef NONET - D_SaveBan(); // save the ban list -#endif G_SaveGameData(); // Tails 12-08-2002 if (demorecording) G_CheckDemoStatus(); diff --git a/src/sdl12/i_system.c b/src/sdl12/i_system.c index 10fbc50ee..e9b292449 100644 --- a/src/sdl12/i_system.c +++ b/src/sdl12/i_system.c @@ -2282,9 +2282,6 @@ void I_Quit(void) quiting = SDL_FALSE; I_ShutdownConsole(); M_SaveConfig(NULL); //save game config, cvars.. -#ifndef NONET - D_SaveBan(); // save the ban list -#endif G_SaveGameData(); // Tails 12-08-2002 //added:16-02-98: when recording a demo, should exit using 'q' key, // but sometimes we forget and use 'F10'.. so save here too. diff --git a/src/win32/win_sys.c b/src/win32/win_sys.c index 77a21f7f3..8b7adf7c6 100644 --- a/src/win32/win_sys.c +++ b/src/win32/win_sys.c @@ -639,9 +639,6 @@ void I_Error(const char *error, ...) if (!errorcount) { M_SaveConfig(NULL); // save game config, cvars.. -#ifndef NONET - D_SaveBan(); // save the ban list -#endif G_SaveGameData(); } From bfbb83df23323ff0a57e952e48721db8e417e26a Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Mon, 18 Feb 2019 02:04:58 -0500 Subject: [PATCH 34/50] Save when quitting the game. Also use default reason if not custom reason is given. --- src/djgppdos/i_system.c | 3 +++ src/sdl12/i_system.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/djgppdos/i_system.c b/src/djgppdos/i_system.c index 5413bfdb4..dae9ed16e 100644 --- a/src/djgppdos/i_system.c +++ b/src/djgppdos/i_system.c @@ -615,6 +615,9 @@ void I_Quit (void) //added:16-02-98: when recording a demo, should exit using 'q' key, // but sometimes we forget and use 'F10'.. so save here too. M_SaveConfig (NULL); //save game config, cvars.. +#ifndef NONET + D_SaveBan(); // save the ban list +#endif G_SaveGameData(); // Tails 12-08-2002 if (demorecording) G_CheckDemoStatus(); diff --git a/src/sdl12/i_system.c b/src/sdl12/i_system.c index e9b292449..10fbc50ee 100644 --- a/src/sdl12/i_system.c +++ b/src/sdl12/i_system.c @@ -2282,6 +2282,9 @@ void I_Quit(void) quiting = SDL_FALSE; I_ShutdownConsole(); M_SaveConfig(NULL); //save game config, cvars.. +#ifndef NONET + D_SaveBan(); // save the ban list +#endif G_SaveGameData(); // Tails 12-08-2002 //added:16-02-98: when recording a demo, should exit using 'q' key, // but sometimes we forget and use 'F10'.. so save here too. From 230faf15de9f3ab6f043b5711f32930adad4225d Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Tue, 19 Feb 2019 21:22:35 -0500 Subject: [PATCH 35/50] Some small changes. From 797ca99f42a05e6f2b491983cd7f0222b9bfc519 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sun, 14 Apr 2019 16:39:14 +0100 Subject: [PATCH 36/50] Detect infinite alias self-recursion mixed with other commands, such as in the case of `alias a "echo test; a"; a`. (Unfortunately, this does not work if "wait" is used instead of "echo", but oh well) --- src/command.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/command.c b/src/command.c index ba0095e07..fda17847b 100644 --- a/src/command.c +++ b/src/command.c @@ -514,7 +514,6 @@ static void COM_ExecuteString(char *ptext) { if (!stricmp(com_argv[0], cmd->name)) //case insensitive now that we have lower and uppercase! { - recursion = 0; cmd->function(); return; } @@ -526,19 +525,17 @@ static void COM_ExecuteString(char *ptext) if (!stricmp(com_argv[0], a->name)) { if (recursion > MAX_ALIAS_RECURSION) - { CONS_Alert(CONS_WARNING, M_GetText("Alias recursion cycle detected!\n")); - recursion = 0; - return; + else + { // Monster Iestyn: keep track of how many levels of recursion we're in + recursion++; + COM_BufInsertText(a->value); + recursion--; } - recursion++; - COM_BufInsertText(a->value); return; } } - recursion = 0; - // check cvars // Hurdler: added at Ebola's request ;) // (don't flood the console in software mode with bad gr_xxx command) From 36e678b292a947393cdaa259aaac4d6eef3cefc1 Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 14 Apr 2019 15:17:47 -0700 Subject: [PATCH 37/50] Don't count down wait timer when executing a command --- src/command.c | 20 ++++++++++++++------ src/command.h | 3 +++ src/d_clisrv.c | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/command.c b/src/command.c index ba0095e07..edc04bed1 100644 --- a/src/command.c +++ b/src/command.c @@ -148,6 +148,20 @@ void COM_BufInsertText(const char *ptext) } } +/** Progress the wait timer and flush waiting console commands when ready. + */ +void +COM_BufTicker(void) +{ + if (com_wait) + { + com_wait--; + return; + } + + COM_BufExecute(); +} + /** Flushes (executes) console commands in the buffer. */ void COM_BufExecute(void) @@ -157,12 +171,6 @@ void COM_BufExecute(void) char line[1024] = ""; INT32 quotes; - if (com_wait) - { - com_wait--; - return; - } - while (com_text.cursize) { // find a '\n' or; line break diff --git a/src/command.h b/src/command.h index e6767825c..4682ba4a4 100644 --- a/src/command.h +++ b/src/command.h @@ -45,6 +45,9 @@ void COM_ImmedExecute(const char *ptext); // Execute commands in buffer, flush them void COM_BufExecute(void); +// As above; and progress the wait timer. +void COM_BufTicker(void); + // setup command buffer, at game tartup void COM_Init(void); diff --git a/src/d_clisrv.c b/src/d_clisrv.c index a0f9f40ab..1b0cb523f 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -4563,7 +4563,7 @@ void TryRunTics(tic_t realtics) if (realtics >= 1) { - COM_BufExecute(); + COM_BufTicker(); if (mapchangepending) D_MapChange(-1, 0, ultimatemode, false, 2, false, fromlevelselect); // finish the map change } From 26fdee82173b8a13d3cc62f967dea7d4c1ff8acc Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Tue, 16 Apr 2019 15:05:09 -0400 Subject: [PATCH 38/50] Don't enable UPnP support if NONET is defined. --- src/win32/Makefile.cfg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/win32/Makefile.cfg b/src/win32/Makefile.cfg index def2fe682..1880abf18 100644 --- a/src/win32/Makefile.cfg +++ b/src/win32/Makefile.cfg @@ -24,8 +24,10 @@ ifndef NOASM USEASM=1 endif +ifndef NONET ifndef MINGW64 #miniupnc is broken with MINGW64 HAVE_MINIUPNPC=1 +endif endif OPTS=-DSTDC_HEADERS From 4d77ed925e469ecf12b5c69f5144efc0f7d47f29 Mon Sep 17 00:00:00 2001 From: Sryder Date: Tue, 30 Apr 2019 23:08:01 +0100 Subject: [PATCH 39/50] OpenGL sprite billboarding Should work on both normal and precipitation sprites. Sprites that are split by lighting should work correctly. --- src/hardware/hw_main.c | 148 +++++++++++++++++++++++++++++++++-------- 1 file changed, 121 insertions(+), 27 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index efecac524..272da06d8 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4246,10 +4246,43 @@ static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float t } } +// This is expecting a pointer to an array containing 4 wallVerts for a sprite +static void HWR_RotateSpritePolyToAim(gr_vissprite_t *spr, FOutVector *wallVerts) +{ + if (spr && spr->mobj && wallVerts) + { + float basey = FIXED_TO_FLOAT(spr->mobj->z); + float lowy = wallVerts[0].y; + if (P_MobjFlip(spr->mobj) == -1) + { + basey = FIXED_TO_FLOAT(spr->mobj->z + spr->mobj->height); + } + // Rotate sprites to fully billboard with the camera + // X, Y, AND Z need to be manipulated for the polys to rotate around the + // origin, because of how the origin setting works I believe that should + // be mobj->z or mobj->z + mobj->height + wallVerts[2].y = wallVerts[3].y = (spr->ty - basey) * gr_viewludsin + basey; + wallVerts[0].y = wallVerts[1].y = (lowy - basey) * gr_viewludsin + basey; + // translate back to be around 0 before translating back + wallVerts[3].x += ((spr->ty - basey) * gr_viewludcos) * gr_viewcos; + wallVerts[2].x += ((spr->ty - basey) * gr_viewludcos) * gr_viewcos; + + wallVerts[0].x += ((lowy - basey) * gr_viewludcos) * gr_viewcos; + wallVerts[1].x += ((lowy - basey) * gr_viewludcos) * gr_viewcos; + + wallVerts[3].z += ((spr->ty - basey) * gr_viewludcos) * gr_viewsin; + wallVerts[2].z += ((spr->ty - basey) * gr_viewludcos) * gr_viewsin; + + wallVerts[0].z += ((lowy - basey) * gr_viewludcos) * gr_viewsin; + wallVerts[1].z += ((lowy - basey) * gr_viewludcos) * gr_viewsin; + } +} + static void HWR_SplitSprite(gr_vissprite_t *spr) { float this_scale = 1.0f; FOutVector wallVerts[4]; + FOutVector baseWallVerts[4]; // This is what the verts should end up as GLPatch_t *gpatch; FSurfaceInfo Surf; const boolean hires = (spr->mobj && spr->mobj->skin && ((skin_t *)spr->mobj->skin)->flags & SF_HIRES); @@ -4262,11 +4295,13 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) float realtop, realbot, top, bot; float towtop, towbot, towmult; float bheight; + float realheight, heightmult; const sector_t *sector = spr->mobj->subsector->sector; const lightlist_t *list = sector->lightlist; #ifdef ESLOPE float endrealtop, endrealbot, endtop, endbot; float endbheight; + float endrealheight; fixed_t temp; fixed_t v1x, v1y, v2x, v2y; #endif @@ -4299,16 +4334,16 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) HWR_DrawSpriteShadow(spr, gpatch, this_scale); } - wallVerts[0].x = wallVerts[3].x = spr->x1; - wallVerts[2].x = wallVerts[1].x = spr->x2; - wallVerts[0].z = wallVerts[3].z = spr->z1; - wallVerts[1].z = wallVerts[2].z = spr->z2; + baseWallVerts[0].x = baseWallVerts[3].x = spr->x1; + baseWallVerts[2].x = baseWallVerts[1].x = spr->x2; + baseWallVerts[0].z = baseWallVerts[3].z = spr->z1; + baseWallVerts[1].z = baseWallVerts[2].z = spr->z2; - wallVerts[2].y = wallVerts[3].y = spr->ty; + baseWallVerts[2].y = baseWallVerts[3].y = spr->ty; if (spr->mobj && fabsf(this_scale - 1.0f) > 1.0E-36f) - wallVerts[0].y = wallVerts[1].y = spr->ty - gpatch->height * this_scale; + baseWallVerts[0].y = baseWallVerts[1].y = spr->ty - gpatch->height * this_scale; else - wallVerts[0].y = wallVerts[1].y = spr->ty - gpatch->height; + baseWallVerts[0].y = baseWallVerts[1].y = spr->ty - gpatch->height; v1x = FLOAT_TO_FIXED(spr->x1); v1y = FLOAT_TO_FIXED(spr->z1); @@ -4317,44 +4352,56 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) if (spr->flip) { - wallVerts[0].sow = wallVerts[3].sow = gpatch->max_s; - wallVerts[2].sow = wallVerts[1].sow = 0; - }else{ - wallVerts[0].sow = wallVerts[3].sow = 0; - wallVerts[2].sow = wallVerts[1].sow = gpatch->max_s; + baseWallVerts[0].sow = baseWallVerts[3].sow = gpatch->max_s; + baseWallVerts[2].sow = baseWallVerts[1].sow = 0; + } + else + { + baseWallVerts[0].sow = baseWallVerts[3].sow = 0; + baseWallVerts[2].sow = baseWallVerts[1].sow = gpatch->max_s; } // flip the texture coords (look familiar?) if (spr->vflip) { - wallVerts[3].tow = wallVerts[2].tow = gpatch->max_t; - wallVerts[0].tow = wallVerts[1].tow = 0; - }else{ - wallVerts[3].tow = wallVerts[2].tow = 0; - wallVerts[0].tow = wallVerts[1].tow = gpatch->max_t; + baseWallVerts[3].tow = baseWallVerts[2].tow = gpatch->max_t; + baseWallVerts[0].tow = baseWallVerts[1].tow = 0; + } + else + { + baseWallVerts[3].tow = baseWallVerts[2].tow = 0; + baseWallVerts[0].tow = baseWallVerts[1].tow = gpatch->max_t; } // if it has a dispoffset, push it a little towards the camera if (spr->dispoffset) { float co = -gr_viewcos*(0.05f*spr->dispoffset); float si = -gr_viewsin*(0.05f*spr->dispoffset); - wallVerts[0].z = wallVerts[3].z = wallVerts[0].z+si; - wallVerts[1].z = wallVerts[2].z = wallVerts[1].z+si; - wallVerts[0].x = wallVerts[3].x = wallVerts[0].x+co; - wallVerts[1].x = wallVerts[2].x = wallVerts[1].x+co; + baseWallVerts[0].z = baseWallVerts[3].z = baseWallVerts[0].z+si; + baseWallVerts[1].z = baseWallVerts[2].z = baseWallVerts[1].z+si; + baseWallVerts[0].x = baseWallVerts[3].x = baseWallVerts[0].x+co; + baseWallVerts[1].x = baseWallVerts[2].x = baseWallVerts[1].x+co; } - realtop = top = wallVerts[3].y; - realbot = bot = wallVerts[0].y; - towtop = wallVerts[3].tow; - towbot = wallVerts[0].tow; + // Let dispoffset work first since this adjust each vertex + HWR_RotateSpritePolyToAim(spr, baseWallVerts); + + realtop = top = baseWallVerts[3].y; + realbot = bot = baseWallVerts[0].y; + towtop = baseWallVerts[3].tow; + towbot = baseWallVerts[0].tow; towmult = (towbot - towtop) / (top - bot); #ifdef ESLOPE - endrealtop = endtop = wallVerts[2].y; - endrealbot = endbot = wallVerts[1].y; + endrealtop = endtop = baseWallVerts[2].y; + endrealbot = endbot = baseWallVerts[1].y; #endif + // copy the contents of baseWallVerts into the drawn wallVerts array + // baseWallVerts is used to know the final shape to easily get the vertex + // co-ordinates + memcpy(wallVerts, baseWallVerts, sizeof(baseWallVerts)); + if (!cv_translucency.value) // translucency disabled { Surf.FlatColor.s.alpha = 0xFF; @@ -4481,12 +4528,53 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) wallVerts[2].y = endtop; wallVerts[0].y = bot; wallVerts[1].y = endbot; + + // The x and y only need to be adjusted in the case that it's not a papersprite + if (spr->mobj) + { + // Get the x and z of the vertices so billboarding draws correctly + realheight = realbot - realtop; + endrealheight = endrealbot - endrealtop; + heightmult = (realtop - top) / realheight; + wallVerts[3].x = baseWallVerts[3].x + (baseWallVerts[3].x - baseWallVerts[0].x) * heightmult; + wallVerts[3].z = baseWallVerts[3].z + (baseWallVerts[3].z - baseWallVerts[0].z) * heightmult; + + heightmult = (endrealtop - endtop) / endrealheight; + wallVerts[2].x = baseWallVerts[2].x + (baseWallVerts[2].x - baseWallVerts[1].x) * heightmult; + wallVerts[2].z = baseWallVerts[2].z + (baseWallVerts[2].z - baseWallVerts[1].z) * heightmult; + + heightmult = (realtop - bot) / realheight; + wallVerts[0].x = baseWallVerts[3].x + (baseWallVerts[3].x - baseWallVerts[0].x) * heightmult; + wallVerts[0].z = baseWallVerts[3].z + (baseWallVerts[3].z - baseWallVerts[0].z) * heightmult; + + heightmult = (endrealtop - endbot) / endrealheight; + wallVerts[1].x = baseWallVerts[2].x + (baseWallVerts[2].x - baseWallVerts[1].x) * heightmult; + wallVerts[1].z = baseWallVerts[2].z + (baseWallVerts[2].z - baseWallVerts[1].z) * heightmult; + } #else wallVerts[3].tow = wallVerts[2].tow = towtop + ((realtop - top) * towmult); wallVerts[0].tow = wallVerts[1].tow = towtop + ((realtop - bot) * towmult); wallVerts[2].y = wallVerts[3].y = top; wallVerts[0].y = wallVerts[1].y = bot; + + // The x and y only need to be adjusted in the case that it's not a papersprite + if (spr->mobj) + { + // Get the x and z of the vertices so billboarding draws correctly + realheight = realbot - realtop; + heightmult = (realtop - top) / realheight; + wallVerts[3].x = baseWallVerts[3].x + (baseWallVerts[3].x - baseWallVerts[0].x) * heightmult; + wallVerts[3].z = baseWallVerts[3].z + (baseWallVerts[3].z - baseWallVerts[0].z) * heightmult; + wallVerts[2].x = baseWallVerts[2].x + (baseWallVerts[2].x - baseWallVerts[1].x) * heightmult; + wallVerts[2].z = baseWallVerts[2].z + (baseWallVerts[2].z - baseWallVerts[1].z) * heightmult; + + heightmult = (realtop - bot) / realheight; + wallVerts[0].x = baseWallVerts[3].x + (baseWallVerts[3].x - baseWallVerts[0].x) * heightmult; + wallVerts[0].z = baseWallVerts[3].z + (baseWallVerts[3].z - baseWallVerts[0].z) * heightmult; + wallVerts[1].x = baseWallVerts[2].x + (baseWallVerts[2].x - baseWallVerts[1].x) * heightmult; + wallVerts[1].z = baseWallVerts[2].z + (baseWallVerts[2].z - baseWallVerts[1].z) * heightmult; + } #endif if (colormap) @@ -4655,6 +4743,9 @@ static void HWR_DrawSprite(gr_vissprite_t *spr) wallVerts[1].x = wallVerts[2].x = wallVerts[1].x+co; } + // Let dispoffset work first since this adjust each vertex + HWR_RotateSpritePolyToAim(spr, wallVerts); + // This needs to be AFTER the shadows so that the regular sprites aren't drawn completely black. // sprite lighting by modulating the RGB components /// \todo coloured @@ -4736,6 +4827,9 @@ static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr) wallVerts[0].z = wallVerts[3].z = spr->z1; wallVerts[1].z = wallVerts[2].z = spr->z2; + // Let dispoffset work first since this adjust each vertex + HWR_RotateSpritePolyToAim(spr, wallVerts); + wallVerts[0].sow = wallVerts[3].sow = 0; wallVerts[2].sow = wallVerts[1].sow = gpatch->max_s; From 3e5b0c45318d77f594d4ae71596c5d0fcc5752e8 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Thu, 2 May 2019 18:31:51 -0400 Subject: [PATCH 40/50] Remove MP3 widechar tag searching 1. It's slow, 2. It's incorrect --- src/sdl/mixer_sound.c | 56 ------------------------------------------- 1 file changed, 56 deletions(-) diff --git a/src/sdl/mixer_sound.c b/src/sdl/mixer_sound.c index dde62fc7a..7b5a95a45 100644 --- a/src/sdl/mixer_sound.c +++ b/src/sdl/mixer_sound.c @@ -908,15 +908,6 @@ boolean I_LoadSong(char *data, size_t len) const size_t key3len = strlen(key3); const size_t key4len = strlen(key4); - // for mp3 wide chars - const char *key1w = "L\0O\0O\0P\0"; - const char *key2w = "P\0O\0I\0N\0T\0\0\0\xFF\xFE"; - const char *key3w = "M\0S\0\0\0\xFF\xFE"; - const char *key4w = "L\0E\0N\0G\0T\0H\0M\0S\0\0\0\xFF\xFE"; - const char *wterm = "\0\0"; - char wval[10]; - - size_t wstart, wp; char *p = data; SDL_RWops *rw; @@ -1067,53 +1058,6 @@ boolean I_LoadSong(char *data, size_t len) p += key4len; // skip LENGTHMS song_length = (float)(atoi(p) / 1000.0L); } - // below: search MP3 or other tags that use wide char encoding - else if (fpclassify(loop_point) == FP_ZERO && !memcmp(p, key1w, key1len*2)) // LOOP wide char - { - p += key1len*2; - if (!memcmp(p, key2w, (key2len+1)*2)) // POINT= wide char - { - p += (key2len+1)*2; - wstart = (size_t)p; - wp = 0; - while (wp < 9 && memcmp(p, wterm, 2)) - { - wval[wp] = *p; - p += 2; - wp = ((size_t)(p-wstart))/2; - } - wval[min(wp, 9)] = 0; - loop_point = (float)((44.1L+atoi(wval) / 44100.0L)); - } - else if (!memcmp(p, key3w, (key3len+1)*2)) // MS= wide char - { - p += (key3len+1)*2; - wstart = (size_t)p; - wp = 0; - while (wp < 9 && memcmp(p, wterm, 2)) - { - wval[wp] = *p; - p += 2; - wp = ((size_t)(p-wstart))/2; - } - wval[min(wp, 9)] = 0; - loop_point = (float)(atoi(wval) / 1000.0L); - } - } - else if (fpclassify(song_length) == FP_ZERO && !memcmp(p, key4w, (key4len+1)*2)) // LENGTHMS= wide char - { - p += (key4len+1)*2; - wstart = (size_t)p; - wp = 0; - while (wp < 9 && memcmp(p, wterm, 2)) - { - wval[wp] = *p; - p += 2; - wp = ((size_t)(p-wstart))/2; - } - wval[min(wp, 9)] = 0; - song_length = (float)(atoi(wval) / 1000.0L); - } if (fpclassify(loop_point) != FP_ZERO && fpclassify(song_length) != FP_ZERO && song_length > loop_point) // Got what we needed // the last case is a sanity check, in case the wide char searches were false matches. From 904b00e9211c310a5e191b8dc3f89b006abb0504 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Thu, 2 May 2019 19:14:23 -0400 Subject: [PATCH 41/50] Remove song_length tag search Because songs without this tag will skiplag when loading. --- src/sdl/mixer_sound.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/sdl/mixer_sound.c b/src/sdl/mixer_sound.c index 7b5a95a45..045e82b15 100644 --- a/src/sdl/mixer_sound.c +++ b/src/sdl/mixer_sound.c @@ -902,11 +902,9 @@ boolean I_LoadSong(char *data, size_t len) const char *key1 = "LOOP"; const char *key2 = "POINT="; const char *key3 = "MS="; - const char *key4 = "LENGTHMS="; const size_t key1len = strlen(key1); const size_t key2len = strlen(key2); const size_t key3len = strlen(key3); - const size_t key4len = strlen(key4); char *p = data; SDL_RWops *rw; @@ -1053,14 +1051,8 @@ boolean I_LoadSong(char *data, size_t len) // Everything that uses LOOPMS will work perfectly with SDL_Mixer. } } - else if (fpclassify(song_length) == FP_ZERO && !strncmp(p, key4, key4len)) // is it LENGTHMS=? - { - p += key4len; // skip LENGTHMS - song_length = (float)(atoi(p) / 1000.0L); - } - if (fpclassify(loop_point) != FP_ZERO && fpclassify(song_length) != FP_ZERO && song_length > loop_point) // Got what we needed - // the last case is a sanity check, in case the wide char searches were false matches. + if (fpclassify(loop_point) != FP_ZERO) // Got what we needed break; else // continue searching p++; From a5dfbe7eff806cf4efa03b9cb159907f38233214 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Fri, 3 May 2019 16:38:59 +0100 Subject: [PATCH 42/50] add parentheses around these conditions to fix sloped lights cutting out lights on FOF walls for apparently no reason not making a merge request because this is so laughably stupidly simple --- src/r_segs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/r_segs.c b/src/r_segs.c index 7495d7889..c82554ac8 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -854,8 +854,8 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) if (leftheight > pfloorleft && rightheight > pfloorright && i+1 < dc_numlights) { lightlist_t *nextlight = &frontsector->lightlist[i+1]; - if (nextlight->slope ? P_GetZAt(nextlight->slope, ds->leftpos.x, ds->leftpos.y) : nextlight->height > pfloorleft - && nextlight->slope ? P_GetZAt(nextlight->slope, ds->rightpos.x, ds->rightpos.y) : nextlight->height > pfloorright) + if ((nextlight->slope ? P_GetZAt(nextlight->slope, ds->leftpos.x, ds->leftpos.y) : nextlight->height) > pfloorleft + && (nextlight->slope ? P_GetZAt(nextlight->slope, ds->rightpos.x, ds->rightpos.y) : nextlight->height) > pfloorright) continue; } From 8273534967272444d3fb79b1260ca14c05933ce1 Mon Sep 17 00:00:00 2001 From: Sryder Date: Mon, 6 May 2019 16:57:32 +0100 Subject: [PATCH 43/50] Add a cvar for sprite billboarding, off by default. --- src/hardware/hw_main.c | 6 +++--- src/hardware/hw_main.h | 1 + src/r_main.c | 1 + src/v_video.c | 1 + 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 272da06d8..7e0b369eb 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4249,7 +4249,7 @@ static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float t // This is expecting a pointer to an array containing 4 wallVerts for a sprite static void HWR_RotateSpritePolyToAim(gr_vissprite_t *spr, FOutVector *wallVerts) { - if (spr && spr->mobj && wallVerts) + if (cv_grspritebillboarding.value && spr && spr->mobj && wallVerts) { float basey = FIXED_TO_FLOAT(spr->mobj->z); float lowy = wallVerts[0].y; @@ -4530,7 +4530,7 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) wallVerts[1].y = endbot; // The x and y only need to be adjusted in the case that it's not a papersprite - if (spr->mobj) + if (cv_grspritebillboarding.value && spr->mobj) { // Get the x and z of the vertices so billboarding draws correctly realheight = realbot - realtop; @@ -4559,7 +4559,7 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) wallVerts[0].y = wallVerts[1].y = bot; // The x and y only need to be adjusted in the case that it's not a papersprite - if (spr->mobj) + if (cv_grspritebillboarding.value && spr->mobj) { // Get the x and z of the vertices so billboarding draws correctly realheight = realbot - realtop; diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h index 59042cf3b..f86b198a1 100644 --- a/src/hardware/hw_main.h +++ b/src/hardware/hw_main.h @@ -95,6 +95,7 @@ extern consvar_t cv_grcorrecttricks; extern consvar_t cv_voodoocompatibility; extern consvar_t cv_grfovchange; extern consvar_t cv_grsolvetjoin; +extern consvar_t cv_grspritebillboarding; extern float gr_viewwidth, gr_viewheight, gr_baseviewwindowy; diff --git a/src/r_main.c b/src/r_main.c index 94945af5b..08b1ab2f0 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1407,6 +1407,7 @@ void R_RegisterEngineStuff(void) CV_RegisterVar(&cv_grcoronasize); #endif CV_RegisterVar(&cv_grmd2); + CV_RegisterVar(&cv_grspritebillboarding); #endif #ifdef HWRENDER diff --git a/src/v_video.c b/src/v_video.c index cfe7d0360..c3b29e157 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -81,6 +81,7 @@ consvar_t cv_grcoronasize = {"gr_coronasize", "1", CV_SAVE| CV_FLOAT, 0, NULL, 0 static CV_PossibleValue_t CV_MD2[] = {{0, "Off"}, {1, "On"}, {2, "Old"}, {0, NULL}}; // console variables in development consvar_t cv_grmd2 = {"gr_md2", "Off", CV_SAVE, CV_MD2, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_grspritebillboarding = {"gr_spritebillboarding", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; #endif const UINT8 gammatable[5][256] = From b304b268c8c4ffe933b78d66eb221216907fa893 Mon Sep 17 00:00:00 2001 From: Sryder Date: Mon, 6 May 2019 20:24:26 +0100 Subject: [PATCH 44/50] No sprite billboarding on papersprites --- src/hardware/hw_main.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 79a46f6b0..0e041ae19 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4249,7 +4249,9 @@ static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float t // This is expecting a pointer to an array containing 4 wallVerts for a sprite static void HWR_RotateSpritePolyToAim(gr_vissprite_t *spr, FOutVector *wallVerts) { - if (cv_grspritebillboarding.value && spr && spr->mobj && wallVerts) + if (cv_grspritebillboarding.value + && spr && spr->mobj && !(spr->mobj->frame & FF_PAPERSPRITE) + && wallVerts) { float basey = FIXED_TO_FLOAT(spr->mobj->z); float lowy = wallVerts[0].y; @@ -4530,7 +4532,8 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) wallVerts[1].y = endbot; // The x and y only need to be adjusted in the case that it's not a papersprite - if (cv_grspritebillboarding.value && spr->mobj) + if (cv_grspritebillboarding.value + && spr->mobj && !(spr->mobj->frame & FF_PAPERSPRITE)) { // Get the x and z of the vertices so billboarding draws correctly realheight = realbot - realtop; @@ -4559,7 +4562,8 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) wallVerts[0].y = wallVerts[1].y = bot; // The x and y only need to be adjusted in the case that it's not a papersprite - if (cv_grspritebillboarding.value && spr->mobj) + if (cv_grspritebillboarding.value + && spr->mobj && !(spr->mobj->frame & FF_PAPERSPRITE)) { // Get the x and z of the vertices so billboarding draws correctly realheight = realbot - realtop; From 8f05d759263dfe3a57990f101f10cec6d1283936 Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Wed, 8 May 2019 09:36:37 -0500 Subject: [PATCH 45/50] Don't skip frames when connecting or paused --- src/sdl/i_video.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index dbaa7037a..f7afcf7de 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -984,6 +984,7 @@ void I_UpdateNoBlit(void) // from PrBoom's src/SDL/i_video.c static inline boolean I_SkipFrame(void) { +#if 0 static boolean skip = false; if (rendermode != render_soft) @@ -1003,6 +1004,8 @@ static inline boolean I_SkipFrame(void) default: return false; } +#endif + return false; } // From 7ac0a8b4d2cfd65a72dae30fd8824ea7d39b35ce Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 4 Mar 2019 22:13:22 -0800 Subject: [PATCH 46/50] Check that lumps are okay --- src/p_saveg.c | 149 +++++++++++++++++++++++++------------------------- 1 file changed, 76 insertions(+), 73 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 12ee1345b..13117f07c 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -649,84 +649,87 @@ static void P_NetArchiveWorld(void) mld = W_CacheLumpNum(lastloadedmaplumpnum+ML_LINEDEFS, PU_CACHE); msd = W_CacheLumpNum(lastloadedmaplumpnum+ML_SIDEDEFS, PU_CACHE); - // do lines - for (i = 0; i < numlines; i++, mld++, li++) + if (mld && msd) { - diff = diff2 = 0; - - if (li->special != SHORT(mld->special)) - diff |= LD_SPECIAL; - - if (SHORT(mld->special) == 321 || SHORT(mld->special) == 322) // only reason li->callcount would be non-zero is if either of these are involved - diff |= LD_CLLCOUNT; - - if (li->sidenum[0] != 0xffff) + // do lines + for (i = 0; i < numlines; i++, mld++, li++) { - si = &sides[li->sidenum[0]]; - if (si->textureoffset != SHORT(msd[li->sidenum[0]].textureoffset)<sidenum[0]].toptexture) != -1 - && si->toptexture != R_TextureNumForName(msd[li->sidenum[0]].toptexture)) - diff |= LD_S1TOPTEX; - if (R_CheckTextureNumForName(msd[li->sidenum[0]].bottomtexture) != -1 - && si->bottomtexture != R_TextureNumForName(msd[li->sidenum[0]].bottomtexture)) - diff |= LD_S1BOTTEX; - if (R_CheckTextureNumForName(msd[li->sidenum[0]].midtexture) != -1 - && si->midtexture != R_TextureNumForName(msd[li->sidenum[0]].midtexture)) - diff |= LD_S1MIDTEX; - } - if (li->sidenum[1] != 0xffff) - { - si = &sides[li->sidenum[1]]; - if (si->textureoffset != SHORT(msd[li->sidenum[1]].textureoffset)<sidenum[1]].toptexture) != -1 - && si->toptexture != R_TextureNumForName(msd[li->sidenum[1]].toptexture)) - diff2 |= LD_S2TOPTEX; - if (R_CheckTextureNumForName(msd[li->sidenum[1]].bottomtexture) != -1 - && si->bottomtexture != R_TextureNumForName(msd[li->sidenum[1]].bottomtexture)) - diff2 |= LD_S2BOTTEX; - if (R_CheckTextureNumForName(msd[li->sidenum[1]].midtexture) != -1 - && si->midtexture != R_TextureNumForName(msd[li->sidenum[1]].midtexture)) - diff2 |= LD_S2MIDTEX; - if (diff2) - diff |= LD_DIFF2; - } + diff = diff2 = 0; - if (diff) - { - statline++; - WRITEINT16(put, i); - WRITEUINT8(put, diff); - if (diff & LD_DIFF2) - WRITEUINT8(put, diff2); - if (diff & LD_FLAG) - WRITEINT16(put, li->flags); - if (diff & LD_SPECIAL) - WRITEINT16(put, li->special); - if (diff & LD_CLLCOUNT) - WRITEINT16(put, li->callcount); + if (li->special != SHORT(mld->special)) + diff |= LD_SPECIAL; - si = &sides[li->sidenum[0]]; - if (diff & LD_S1TEXOFF) - WRITEFIXED(put, si->textureoffset); - if (diff & LD_S1TOPTEX) - WRITEINT32(put, si->toptexture); - if (diff & LD_S1BOTTEX) - WRITEINT32(put, si->bottomtexture); - if (diff & LD_S1MIDTEX) - WRITEINT32(put, si->midtexture); + if (SHORT(mld->special) == 321 || SHORT(mld->special) == 322) // only reason li->callcount would be non-zero is if either of these are involved + diff |= LD_CLLCOUNT; - si = &sides[li->sidenum[1]]; - if (diff2 & LD_S2TEXOFF) - WRITEFIXED(put, si->textureoffset); - if (diff2 & LD_S2TOPTEX) - WRITEINT32(put, si->toptexture); - if (diff2 & LD_S2BOTTEX) - WRITEINT32(put, si->bottomtexture); - if (diff2 & LD_S2MIDTEX) - WRITEINT32(put, si->midtexture); + if (li->sidenum[0] != 0xffff) + { + si = &sides[li->sidenum[0]]; + if (si->textureoffset != SHORT(msd[li->sidenum[0]].textureoffset)<sidenum[0]].toptexture) != -1 + && si->toptexture != R_TextureNumForName(msd[li->sidenum[0]].toptexture)) + diff |= LD_S1TOPTEX; + if (R_CheckTextureNumForName(msd[li->sidenum[0]].bottomtexture) != -1 + && si->bottomtexture != R_TextureNumForName(msd[li->sidenum[0]].bottomtexture)) + diff |= LD_S1BOTTEX; + if (R_CheckTextureNumForName(msd[li->sidenum[0]].midtexture) != -1 + && si->midtexture != R_TextureNumForName(msd[li->sidenum[0]].midtexture)) + diff |= LD_S1MIDTEX; + } + if (li->sidenum[1] != 0xffff) + { + si = &sides[li->sidenum[1]]; + if (si->textureoffset != SHORT(msd[li->sidenum[1]].textureoffset)<sidenum[1]].toptexture) != -1 + && si->toptexture != R_TextureNumForName(msd[li->sidenum[1]].toptexture)) + diff2 |= LD_S2TOPTEX; + if (R_CheckTextureNumForName(msd[li->sidenum[1]].bottomtexture) != -1 + && si->bottomtexture != R_TextureNumForName(msd[li->sidenum[1]].bottomtexture)) + diff2 |= LD_S2BOTTEX; + if (R_CheckTextureNumForName(msd[li->sidenum[1]].midtexture) != -1 + && si->midtexture != R_TextureNumForName(msd[li->sidenum[1]].midtexture)) + diff2 |= LD_S2MIDTEX; + if (diff2) + diff |= LD_DIFF2; + } + + if (diff) + { + statline++; + WRITEINT16(put, i); + WRITEUINT8(put, diff); + if (diff & LD_DIFF2) + WRITEUINT8(put, diff2); + if (diff & LD_FLAG) + WRITEINT16(put, li->flags); + if (diff & LD_SPECIAL) + WRITEINT16(put, li->special); + if (diff & LD_CLLCOUNT) + WRITEINT16(put, li->callcount); + + si = &sides[li->sidenum[0]]; + if (diff & LD_S1TEXOFF) + WRITEFIXED(put, si->textureoffset); + if (diff & LD_S1TOPTEX) + WRITEINT32(put, si->toptexture); + if (diff & LD_S1BOTTEX) + WRITEINT32(put, si->bottomtexture); + if (diff & LD_S1MIDTEX) + WRITEINT32(put, si->midtexture); + + si = &sides[li->sidenum[1]]; + if (diff2 & LD_S2TEXOFF) + WRITEFIXED(put, si->textureoffset); + if (diff2 & LD_S2TOPTEX) + WRITEINT32(put, si->toptexture); + if (diff2 & LD_S2BOTTEX) + WRITEINT32(put, si->bottomtexture); + if (diff2 & LD_S2MIDTEX) + WRITEINT32(put, si->midtexture); + } } } WRITEUINT16(put, 0xffff); From b34aa86403039ee9f6f3ce016f7fc6113a2a7201 Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Sat, 11 May 2019 22:56:23 -0400 Subject: [PATCH 47/50] Hardcode some ACZ things --- src/dehacked.c | 18 ++++ src/hardware/hw_light.c | 3 + src/info.c | 229 ++++++++++++++++++++++++++++++++++++++++ src/info.h | 21 ++++ 4 files changed, 271 insertions(+) diff --git a/src/dehacked.c b/src/dehacked.c index 4f68c5062..e98fbcdf2 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -5568,6 +5568,16 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_CACTI2", "S_CACTI3", "S_CACTI4", + "S_CACTI5", + "S_CACTI6", + "S_CACTI7", + "S_CACTI8", + "S_CACTI9", + + // Warning signs sprites + "S_ARIDSIGN_CAUTION", + "S_ARIDSIGN_CACTI", + "S_ARIDSIGN_SHARPTURN", // Flame jet "S_FLAMEJETSTND", @@ -7241,6 +7251,14 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_CACTI2", "MT_CACTI3", "MT_CACTI4", + "MT_CACTI5", + "MT_CACTI6", + "MT_CACTI7", + "MT_CACTI8", + "MT_CACTI9", + "MT_ARIDSIGN_CAUTION", + "MT_ARIDSIGN_CACTI", + "MT_ARIDSIGN_SHARPTURN", // Red Volcano Scenery "MT_FLAMEJET", diff --git a/src/hardware/hw_light.c b/src/hardware/hw_light.c index dfb2c4351..2515c6a86 100644 --- a/src/hardware/hw_light.c +++ b/src/hardware/hw_light.c @@ -343,6 +343,9 @@ light_t *t_lspr[NUMSPRITES] = &lspr[NOLIGHT], // SPR_BTBL &lspr[NOLIGHT], // SPR_STBL &lspr[NOLIGHT], // SPR_CACT + &lspr[NOLIGHT], // SPR_WWSG + &lspr[NOLIGHT], // SPR_WWS2 + &lspr[NOLIGHT], // SPR_WWS3 // Red Volcano Scenery &lspr[REDBALL_L], // SPR_FLME diff --git a/src/info.c b/src/info.c index 86e40c388..89ce48559 100644 --- a/src/info.c +++ b/src/info.c @@ -238,6 +238,9 @@ char sprnames[NUMSPRITES + 1][5] = "BTBL", // Big tumbleweed "STBL", // Small tumbleweed "CACT", // Cacti sprites + "WWSG", // Caution Sign + "WWS2", // Cacti Sign + "WWS3", // Sharp Turn Sign // Red Volcano Scenery "FLME", // Flame jet @@ -2188,6 +2191,16 @@ state_t states[NUMSTATES] = {SPR_CACT, 1, -1, {NULL}, 0, 0, S_NULL}, // S_CACTI2 {SPR_CACT, 2, -1, {NULL}, 0, 0, S_NULL}, // S_CACTI3 {SPR_CACT, 3, -1, {NULL}, 0, 0, S_NULL}, // S_CACTI4 + {SPR_CACT, 4, -1, {NULL}, 0, 0, S_NULL}, // S_CACTI5 + {SPR_CACT, 5, -1, {NULL}, 0, 0, S_NULL}, // S_CACTI6 + {SPR_CACT, 6, -1, {NULL}, 0, 0, S_NULL}, // S_CACTI7 + {SPR_CACT, 7, -1, {NULL}, 0, 0, S_NULL}, // S_CACTI8 + {SPR_CACT, 8, -1, {NULL}, 0, 0, S_NULL}, // S_CACTI9 + + // Warning Signs + {SPR_WWSG, FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_ARIDSIGN_CAUTION + {SPR_WWS2, FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_ARIDSIGN_CACTI + {SPR_WWS3, FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_ARIDSIGN_SHARPTURN // Flame jet {SPR_NULL, 0, 2*TICRATE, {NULL}, 0, 0, S_FLAMEJETSTART}, // S_FLAMEJETSTND @@ -10913,6 +10926,222 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_CACTI5 + 1207, // doomednum + S_CACTI5, // 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 + 0, // speed + 40*FRACUNIT, // radius + 128*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SCENERY|MF_PAIN, // flags + S_NULL // raisestate + }, + + { // MT_CACTI6 + 1208, // doomednum + S_CACTI6, // 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 + 0, // speed + 24*FRACUNIT, // radius + 132*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SCENERY|MF_PAIN, // flags + S_NULL // raisestate + }, + + { // MT_CACTI7 + 1209, // doomednum + S_CACTI7, // 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 + 0, // speed + 24*FRACUNIT, // radius + 224*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SCENERY|MF_PAIN, // flags + S_NULL // raisestate + }, + + { // MT_CACTI8 + 1210, // doomednum + S_CACTI8, // 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 + 0, // speed + 24*FRACUNIT, // radius + 208*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SCENERY|MF_PAIN, // flags + S_NULL // raisestate + }, + + { // MT_CACTI9 + 1211, // doomednum + S_CACTI9, // 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 + 0, // speed + 48*FRACUNIT, // radius + 208*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SCENERY|MF_PAIN, // flags + S_NULL // raisestate + }, + + { // MT_ARIDSIGN_CAUTION + 1212, // doomednum + S_ARIDSIGN_CAUTION, // 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 + 0, // speed + 22*FRACUNIT, // radius + 64*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SCENERY|MF_SOLID|MF_PAPERCOLLISION, // flags + S_NULL // raisestate + }, + + { // MT_ARIDSIGN_CACTI + 1213, // doomednum + S_ARIDSIGN_CACTI, // 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 + 0, // speed + 22*FRACUNIT, // radius + 64*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SCENERY|MF_SOLID|MF_PAPERCOLLISION, // flags + S_NULL // raisestate + }, + + { // MT_ARIDSIGN_SHARPTURN + 1214, // doomednum + S_ARIDSIGN_SHARPTURN, // 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 + 0, // speed + 16*FRACUNIT, // radius + 192*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SCENERY|MF_SOLID|MF_PAPERCOLLISION, // flags + S_NULL // raisestate + }, + { // MT_FLAMEJET 1300, // doomednum S_FLAMEJETSTND, // spawnstate diff --git a/src/info.h b/src/info.h index 962a6be29..b63dae67c 100644 --- a/src/info.h +++ b/src/info.h @@ -457,6 +457,9 @@ typedef enum sprite SPR_BTBL, // Big tumbleweed SPR_STBL, // Small tumbleweed SPR_CACT, // Cacti sprites + SPR_WWSG, // Caution Sign + SPR_WWS2, // Cacti Sign + SPR_WWS3, // Sharp Turn Sign // Red Volcano Scenery SPR_FLME, // Flame jet @@ -2306,6 +2309,16 @@ typedef enum state S_CACTI2, S_CACTI3, S_CACTI4, + S_CACTI5, + S_CACTI6, + S_CACTI7, + S_CACTI8, + S_CACTI9, + + // Warning signs sprites + S_ARIDSIGN_CAUTION, + S_ARIDSIGN_CACTI, + S_ARIDSIGN_SHARPTURN, // Flame jet S_FLAMEJETSTND, @@ -3999,6 +4012,14 @@ typedef enum mobj_type MT_CACTI2, MT_CACTI3, MT_CACTI4, + MT_CACTI5, // Harmful Cactus 1 + MT_CACTI6, // Harmful Cactus 2 + MT_CACTI7, // Harmful Cactus 3 + MT_CACTI8, // Harmful Cactus 4 + MT_CACTI9, // Harmful Cactus 5 + MT_ARIDSIGN_CAUTION, // Caution Sign + MT_ARIDSIGN_CACTI, // Cacti Sign + MT_ARIDSIGN_SHARPTURN, // Sharp Turn Sign // Red Volcano Scenery MT_FLAMEJET, From 4e0cc2505a2d0a6fdab01545c55932cb70366f92 Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Mon, 13 May 2019 00:20:39 -0400 Subject: [PATCH 48/50] Revert "Check that lumps are okay" This reverts commit 7ac0a8b4d2cfd65a72dae30fd8824ea7d39b35ce. --- src/p_saveg.c | 149 +++++++++++++++++++++++++------------------------- 1 file changed, 73 insertions(+), 76 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 13117f07c..12ee1345b 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -649,87 +649,84 @@ static void P_NetArchiveWorld(void) mld = W_CacheLumpNum(lastloadedmaplumpnum+ML_LINEDEFS, PU_CACHE); msd = W_CacheLumpNum(lastloadedmaplumpnum+ML_SIDEDEFS, PU_CACHE); - if (mld && msd) + // do lines + for (i = 0; i < numlines; i++, mld++, li++) { - // do lines - for (i = 0; i < numlines; i++, mld++, li++) + diff = diff2 = 0; + + if (li->special != SHORT(mld->special)) + diff |= LD_SPECIAL; + + if (SHORT(mld->special) == 321 || SHORT(mld->special) == 322) // only reason li->callcount would be non-zero is if either of these are involved + diff |= LD_CLLCOUNT; + + if (li->sidenum[0] != 0xffff) { - diff = diff2 = 0; + si = &sides[li->sidenum[0]]; + if (si->textureoffset != SHORT(msd[li->sidenum[0]].textureoffset)<sidenum[0]].toptexture) != -1 + && si->toptexture != R_TextureNumForName(msd[li->sidenum[0]].toptexture)) + diff |= LD_S1TOPTEX; + if (R_CheckTextureNumForName(msd[li->sidenum[0]].bottomtexture) != -1 + && si->bottomtexture != R_TextureNumForName(msd[li->sidenum[0]].bottomtexture)) + diff |= LD_S1BOTTEX; + if (R_CheckTextureNumForName(msd[li->sidenum[0]].midtexture) != -1 + && si->midtexture != R_TextureNumForName(msd[li->sidenum[0]].midtexture)) + diff |= LD_S1MIDTEX; + } + if (li->sidenum[1] != 0xffff) + { + si = &sides[li->sidenum[1]]; + if (si->textureoffset != SHORT(msd[li->sidenum[1]].textureoffset)<sidenum[1]].toptexture) != -1 + && si->toptexture != R_TextureNumForName(msd[li->sidenum[1]].toptexture)) + diff2 |= LD_S2TOPTEX; + if (R_CheckTextureNumForName(msd[li->sidenum[1]].bottomtexture) != -1 + && si->bottomtexture != R_TextureNumForName(msd[li->sidenum[1]].bottomtexture)) + diff2 |= LD_S2BOTTEX; + if (R_CheckTextureNumForName(msd[li->sidenum[1]].midtexture) != -1 + && si->midtexture != R_TextureNumForName(msd[li->sidenum[1]].midtexture)) + diff2 |= LD_S2MIDTEX; + if (diff2) + diff |= LD_DIFF2; + } - if (li->special != SHORT(mld->special)) - diff |= LD_SPECIAL; + if (diff) + { + statline++; + WRITEINT16(put, i); + WRITEUINT8(put, diff); + if (diff & LD_DIFF2) + WRITEUINT8(put, diff2); + if (diff & LD_FLAG) + WRITEINT16(put, li->flags); + if (diff & LD_SPECIAL) + WRITEINT16(put, li->special); + if (diff & LD_CLLCOUNT) + WRITEINT16(put, li->callcount); - if (SHORT(mld->special) == 321 || SHORT(mld->special) == 322) // only reason li->callcount would be non-zero is if either of these are involved - diff |= LD_CLLCOUNT; + si = &sides[li->sidenum[0]]; + if (diff & LD_S1TEXOFF) + WRITEFIXED(put, si->textureoffset); + if (diff & LD_S1TOPTEX) + WRITEINT32(put, si->toptexture); + if (diff & LD_S1BOTTEX) + WRITEINT32(put, si->bottomtexture); + if (diff & LD_S1MIDTEX) + WRITEINT32(put, si->midtexture); - if (li->sidenum[0] != 0xffff) - { - si = &sides[li->sidenum[0]]; - if (si->textureoffset != SHORT(msd[li->sidenum[0]].textureoffset)<sidenum[0]].toptexture) != -1 - && si->toptexture != R_TextureNumForName(msd[li->sidenum[0]].toptexture)) - diff |= LD_S1TOPTEX; - if (R_CheckTextureNumForName(msd[li->sidenum[0]].bottomtexture) != -1 - && si->bottomtexture != R_TextureNumForName(msd[li->sidenum[0]].bottomtexture)) - diff |= LD_S1BOTTEX; - if (R_CheckTextureNumForName(msd[li->sidenum[0]].midtexture) != -1 - && si->midtexture != R_TextureNumForName(msd[li->sidenum[0]].midtexture)) - diff |= LD_S1MIDTEX; - } - if (li->sidenum[1] != 0xffff) - { - si = &sides[li->sidenum[1]]; - if (si->textureoffset != SHORT(msd[li->sidenum[1]].textureoffset)<sidenum[1]].toptexture) != -1 - && si->toptexture != R_TextureNumForName(msd[li->sidenum[1]].toptexture)) - diff2 |= LD_S2TOPTEX; - if (R_CheckTextureNumForName(msd[li->sidenum[1]].bottomtexture) != -1 - && si->bottomtexture != R_TextureNumForName(msd[li->sidenum[1]].bottomtexture)) - diff2 |= LD_S2BOTTEX; - if (R_CheckTextureNumForName(msd[li->sidenum[1]].midtexture) != -1 - && si->midtexture != R_TextureNumForName(msd[li->sidenum[1]].midtexture)) - diff2 |= LD_S2MIDTEX; - if (diff2) - diff |= LD_DIFF2; - } - - if (diff) - { - statline++; - WRITEINT16(put, i); - WRITEUINT8(put, diff); - if (diff & LD_DIFF2) - WRITEUINT8(put, diff2); - if (diff & LD_FLAG) - WRITEINT16(put, li->flags); - if (diff & LD_SPECIAL) - WRITEINT16(put, li->special); - if (diff & LD_CLLCOUNT) - WRITEINT16(put, li->callcount); - - si = &sides[li->sidenum[0]]; - if (diff & LD_S1TEXOFF) - WRITEFIXED(put, si->textureoffset); - if (diff & LD_S1TOPTEX) - WRITEINT32(put, si->toptexture); - if (diff & LD_S1BOTTEX) - WRITEINT32(put, si->bottomtexture); - if (diff & LD_S1MIDTEX) - WRITEINT32(put, si->midtexture); - - si = &sides[li->sidenum[1]]; - if (diff2 & LD_S2TEXOFF) - WRITEFIXED(put, si->textureoffset); - if (diff2 & LD_S2TOPTEX) - WRITEINT32(put, si->toptexture); - if (diff2 & LD_S2BOTTEX) - WRITEINT32(put, si->bottomtexture); - if (diff2 & LD_S2MIDTEX) - WRITEINT32(put, si->midtexture); - } + si = &sides[li->sidenum[1]]; + if (diff2 & LD_S2TEXOFF) + WRITEFIXED(put, si->textureoffset); + if (diff2 & LD_S2TOPTEX) + WRITEINT32(put, si->toptexture); + if (diff2 & LD_S2BOTTEX) + WRITEINT32(put, si->bottomtexture); + if (diff2 & LD_S2MIDTEX) + WRITEINT32(put, si->midtexture); } } WRITEUINT16(put, 0xffff); From cad65ad5e9d32fd74847929c1e1f4568461ac35b Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Mon, 13 May 2019 00:23:43 -0400 Subject: [PATCH 49/50] Properly fix crash due to duplicated lines. --- src/p_saveg.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 12ee1345b..fce72b927 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -647,8 +647,6 @@ static void P_NetArchiveWorld(void) WRITEUINT16(put, 0xffff); - mld = W_CacheLumpNum(lastloadedmaplumpnum+ML_LINEDEFS, PU_CACHE); - msd = W_CacheLumpNum(lastloadedmaplumpnum+ML_SIDEDEFS, PU_CACHE); // do lines for (i = 0; i < numlines; i++, mld++, li++) { From addf2bb3c47551985641b380fbb8f8d9ddb822d7 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Mon, 13 May 2019 01:51:36 -0400 Subject: [PATCH 50/50] Fix NONET build --- src/hu_stuff.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index a416f0d26..fdaf36cb2 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -1072,7 +1072,9 @@ static INT16 typelines = 1; // number of drawfill lines we need when drawing the // boolean HU_Responder(event_t *ev) { +#ifndef NONET INT32 c=0; +#endif if (ev->type != ev_keydown) return false; @@ -1099,9 +1101,9 @@ boolean HU_Responder(event_t *ev) return false; }*/ //We don't actually care about that unless we get splitscreen netgames. :V +#ifndef NONET c = (INT32)ev->data1; -#ifndef NONET if (!chat_on) { // enter chat mode