From cb142afe2e4bfa756249cd0e7e17ddd3ec820a87 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Thu, 13 Oct 2011 19:46:45 +0000 Subject: Update Strife main loop code to use d_loop.c common main loop code. Working multiplayer! Subversion-branch: /branches/v2-branch Subversion-revision: 2416 --- src/Makefile.am | 8 +- src/strife/Makefile.am | 2 +- src/strife/d_main.c | 29 +-- src/strife/d_net.c | 677 ++++++++++++------------------------------------- src/strife/d_net.h | 52 ---- src/strife/doomstat.h | 7 +- src/strife/g_game.c | 7 +- src/strife/g_game.h | 3 +- src/strife/r_main.c | 2 - 9 files changed, 181 insertions(+), 606 deletions(-) delete mode 100644 src/strife/d_net.h (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index 6818dbaa..f4bb1cf1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -171,9 +171,13 @@ endif @PROGRAM_PREFIX@hexen_LDADD = hexen/libhexen.a $(EXTRA_LIBS) if HAVE_WINDRES -@PROGRAM_PREFIX@strife_SOURCES=$(SOURCE_FILES_WITH_DEH) resource.rc +@PROGRAM_PREFIX@strife_SOURCES=$(SOURCE_FILES_WITH_DEH) resource.rc \ + d_loop.c d_loop.h \ + $(FEATURE_MULTIPLAYER_SOURCE_FILES) else -@PROGRAM_PREFIX@strife_SOURCES=$(SOURCE_FILES_WITH_DEH) +@PROGRAM_PREFIX@strife_SOURCES=$(SOURCE_FILES_WITH_DEH) \ + d_loop.c d_loop.h \ + $(FEATURE_MULTIPLAYER_SOURCE_FILES) endif @PROGRAM_PREFIX@strife_LDADD = strife/libstrife.a $(EXTRA_LIBS) diff --git a/src/strife/Makefile.am b/src/strife/Makefile.am index 4dc0cabd..df1f7bb0 100644 --- a/src/strife/Makefile.am +++ b/src/strife/Makefile.am @@ -7,7 +7,7 @@ am_map.c am_map.h \ d_englsh.h \ d_items.c d_items.h \ d_main.c d_main.h \ -d_net.c d_net.h \ +d_net.c \ doomdata.h \ doomdef.c doomdef.h \ doomstat.c doomstat.h \ diff --git a/src/strife/d_main.c b/src/strife/d_main.c index e8f76dd9..85a0bcde 100644 --- a/src/strife/d_main.c +++ b/src/strife/d_main.c @@ -40,7 +40,6 @@ #include "dstrings.h" #include "doomfeatures.h" -#undef FEATURE_MULTIPLAYER // TODO: Temporary disable for Strife #include "sounds.h" #include "d_iwad.h" @@ -114,7 +113,6 @@ boolean fastparm; // checkparm of -fast boolean flipparm; // [STRIFE] haleyjd 20110629: checkparm of -flip boolean showintro = true; // [STRIFE] checkparm of -nograph, disables intro -boolean singletics = false; // debug flag to cancel adaptiveness //extern int soundVolume; @@ -163,7 +161,6 @@ static char *nickname = NULL; void D_CheckNetGame (void); void D_ProcessEvents (void); -void G_BuildTiccmd (ticcmd_t* cmd); void D_DoAdvanceDemo (void); @@ -521,22 +518,7 @@ void D_DoomLoop (void) I_StartFrame (); // process one or more tics - if (singletics) - { - I_StartTic (); - D_ProcessEvents (); - G_BuildTiccmd (&netcmds[consoleplayer][maketic%BACKUPTICS]); - if (advancedemo) - D_DoAdvanceDemo (); - M_Ticker (); - G_Ticker (); - gametic++; - maketic++; - } - else - { - TryRunTics (); // will run at least one tic - } + TryRunTics (); // will run at least one tic S_UpdateSounds (players[consoleplayer].mo);// move positional sounds @@ -1383,9 +1365,7 @@ void D_DoomMain (void) if (M_CheckParm("-search")) { - printf("\nSearching for servers on Internet ...\n"); - p = NET_MasterQuery(NET_QueryPrintCallback, NULL); - printf("\n%i server(s) found.\n", p); + NET_MasterQuery(); exit(0); } @@ -1413,9 +1393,7 @@ void D_DoomMain (void) if (M_CheckParm("-localsearch")) { - printf("\nSearching for servers on local LAN ...\n"); - p = NET_LANQuery(NET_QueryPrintCallback, NULL); - printf("\n%i server(s) found.\n", p); + NET_LANQuery(); exit(0); } @@ -1975,4 +1953,3 @@ void D_DoomMain (void) D_DoomLoop (); // never returns } - diff --git a/src/strife/d_net.c b/src/strife/d_net.c index f999cb0f..8062ee72 100644 --- a/src/strife/d_net.c +++ b/src/strife/d_net.c @@ -25,10 +25,9 @@ // //----------------------------------------------------------------------------- - +#include #include "doomfeatures.h" -#undef FEATURE_MULTIPLAYER // TODO: Temporary disable for Strife #include "d_main.h" #include "m_argv.h" @@ -42,192 +41,204 @@ #include "deh_main.h" -#include "net_client.h" -#include "net_gui.h" -#include "net_io.h" -#include "net_query.h" -#include "net_server.h" -#include "net_sdl.h" -#include "net_loop.h" - -// -// NETWORKING -// -// gametic is the tic about to (or currently being) run -// maketic is the tick that hasn't had control made for it yet -// nettics[] has the maketics for all players -// -// a gametic cannot be run until nettics[] > gametic for all players -// - -ticcmd_t netcmds[MAXPLAYERS][BACKUPTICS]; -int nettics[MAXPLAYERS]; - -int maketic; - -// Used for original sync code. - -int lastnettic; -int skiptics = 0; +#include "d_loop.h" -// Reduce the bandwidth needed by sampling game input less and transmitting -// less. If ticdup is 2, sample half normal, 3 = one third normal, etc. +ticcmd_t *netcmds; -int ticdup; +// Called when a player leaves the game -// Send this many extra (backup) tics in each packet. - -int extratics; +static void PlayerQuitGame(player_t *player) +{ + static char exitmsg[80]; + unsigned int player_num; -// Amount to offset the timer for game sync. + player_num = player - players; -fixed_t offsetms; + // Do this the same way as Vanilla Doom does, to allow dehacked + // replacements of this message -// Use new client syncronisation code + strncpy(exitmsg, DEH_String("Player 1 left the game"), sizeof(exitmsg)); + exitmsg[sizeof(exitmsg) - 1] = '\0'; -boolean net_cl_new_sync = true; + exitmsg[7] += player_num; -// Connected but not participating in the game (observer) + playeringame[player_num] = false; + players[consoleplayer].message = exitmsg; -boolean drone = false; + // TODO: check if it is sensible to do this: -// 35 fps clock adjusted by offsetms milliseconds + if (demorecording) + { + G_CheckDemoStatus (); + } +} -static int GetAdjustedTime(void) +static void RunTic(ticcmd_t *cmds, boolean *ingame) { - int time_ms; + extern boolean advancedemo; + unsigned int i; - time_ms = I_GetTimeMS(); + // Check for player quits. - if (net_cl_new_sync) + for (i = 0; i < MAXPLAYERS; ++i) { - // Use the adjustments from net_client.c only if we are - // using the new sync mode. - - time_ms += (offsetms / FRACUNIT); + if (playeringame[i] && !ingame[i]) + { + PlayerQuitGame(&players[i]); + } } - return (time_ms * TICRATE) / 1000; -} + netcmds = cmds; -// -// NetUpdate -// Builds ticcmds for console player, -// sends out a packet -// -int lasttime; + // check that there are players in the game. if not, we cannot + // run a tic. -void NetUpdate (void) -{ - int nowtime; - int newtics; - int i; - int gameticdiv; + if (advancedemo) + D_DoAdvanceDemo (); - // If we are running with singletics (timing a demo), this - // is all done separately. - - if (singletics) - return; - -#ifdef FEATURE_MULTIPLAYER + M_Ticker(); + G_Ticker(); +} - // Run network subsystems +static void NullMenuTicker() +{ + // no-op. +} - NET_CL_Run(); - NET_SV_Run(); +static loop_interface_t strife_loop_interface = { + D_ProcessEvents, + G_BuildTiccmd, + RunTic, + NullMenuTicker +}; -#endif - // check time - nowtime = GetAdjustedTime() / ticdup; - newtics = nowtime - lasttime; +// Load game settings from the specified structure and +// set global variables. - lasttime = nowtime; +static void LoadGameSettings(net_gamesettings_t *settings, + net_connect_data_t *connect_data) +{ + unsigned int i; + + deathmatch = settings->deathmatch; + ticdup = settings->ticdup; + startepisode = settings->episode; + startmap = settings->map; + startskill = settings->skill; + startloadgame = settings->loadgame; + lowres_turn = settings->lowres_turn; + nomonsters = settings->nomonsters; + fastparm = settings->fast_monsters; + respawnparm = settings->respawn_monsters; + timelimit = settings->timelimit; + + if (lowres_turn) + { + printf("NOTE: Turning resolution is reduced; this is probably " + "because there is a client recording a Vanilla demo.\n"); + } - if (skiptics <= newtics) + if (!connect_data->drone) { - newtics -= skiptics; - skiptics = 0; + consoleplayer = settings->consoleplayer; } else { - skiptics -= newtics; - newtics = 0; + consoleplayer = 0; + } + + for (i=0; inum_players; } +} - // build new ticcmds for console player - gameticdiv = gametic/ticdup; +// Save the game settings from global variables to the specified +// game settings structure. - for (i=0 ; ideathmatch = deathmatch; + settings->episode = startepisode; + settings->map = startmap; + settings->skill = startskill; + settings->loadgame = startloadgame; + settings->gameversion = gameversion; + settings->nomonsters = nomonsters; + settings->fast_monsters = fastparm; + settings->respawn_monsters = respawnparm; + settings->timelimit = timelimit; + + settings->lowres_turn = M_CheckParm("-record") > 0 + && M_CheckParm("-longtics") == 0; + + connect_data->drone = false; + + //! + // @category net + // + // Run as the left screen in three screen mode. + // + + if (M_CheckParm("-left") > 0) { - ticcmd_t cmd; + viewangleoffset = ANG90; + connect_data->drone = true; + } - I_StartTic (); - D_ProcessEvents (); + //! + // @category net + // + // Run as the right screen in three screen mode. + // -#if 0 - // Always run the menu - // - jhaley 20110629 [CHOCOFIX] - sure, if you want to cause serious - // problems. See TryRunTics for where the call to M_Ticker belongs. + if (M_CheckParm("-right") > 0) + { + viewangleoffset = ANG270; + connect_data->drone = true; + } - M_Ticker (); -#endif - if (drone) - { - // In drone mode, do not generate any ticcmds. + // + // Connect data + // - continue; - } - - if (net_cl_new_sync) - { - // If playing single player, do not allow tics to buffer - // up very far + // Game type fields: - if ((!netgame || demoplayback) && maketic - gameticdiv > 2) - break; + connect_data->gamemode = gamemode; + connect_data->gamemission = gamemission; - // Never go more than ~200ms ahead + // Are we recording a demo? Possibly set lowres turn mode - if (maketic - gameticdiv > 8) - break; - } - else - { - if (maketic - gameticdiv >= 5) - break; - } - - //printf ("mk:%i ",maketic); - G_BuildTiccmd(&cmd); - -#ifdef FEATURE_MULTIPLAYER - - if (netgame && !demoplayback) - { - NET_CL_SendTiccmd(&cmd, maketic); - } + connect_data->lowres_turn = settings->lowres_turn; +} -#endif - netcmds[consoleplayer][maketic % BACKUPTICS] = cmd; +void D_InitSinglePlayerGame(net_gamesettings_t *settings) +{ + // default values for single player - ++maketic; - nettics[consoleplayer] = maketic; - } -} + settings->consoleplayer = 0; + settings->num_players = 1; -// -// Start game loop -// -// Called after the screen is set but before the game starts running. -// + netgame = false; -void D_StartGameLoop(void) -{ - lasttime = GetAdjustedTime() / ticdup; -} + //! + // @category net + // + // Start the game playing as though in a netgame with a single + // player. This can also be used to play back single player netgame + // demos. + // + if (M_CheckParm("-solo-net") > 0) + { + netgame = true; + } +} // // D_CheckNetGame @@ -237,152 +248,34 @@ extern int viewangleoffset; void D_CheckNetGame (void) { - int i; - int num_players; + net_connect_data_t connect_data; + net_gamesettings_t settings; + + D_RegisterLoopCallbacks(&strife_loop_interface); // Call D_QuitNetGame on exit I_AtExit(D_QuitNetGame, true); - // default values for single player + SaveGameSettings(&settings, &connect_data); - consoleplayer = 0; - netgame = false; - ticdup = 1; - extratics = 1; - lowres_turn = false; - offsetms = 0; - - for (i=0; i 0) - { - NET_SV_Init(); - NET_SV_AddModule(&net_loop_server_module); - NET_SV_AddModule(&net_sdl_module); - - net_loop_client_module.InitClient(); - addr = net_loop_client_module.ResolveAddress(NULL); - } - else - { - //! - // @category net - // - // Automatically search the local LAN for a multiplayer - // server and join it. - // - - i = M_CheckParm("-autojoin"); - - if (i > 0) - { - addr = NET_FindLANServer(); - NET_SV_RegisterWithMaster(); - - if (addr == NULL) - { - I_Error("No server found on local LAN"); - } - } - - //! - // @arg
- // @category net - // - // Connect to a multiplayer server running on the given - // address. - // - - i = M_CheckParmWithArgs("-connect", 1); - - if (i > 0) - { - net_sdl_module.InitClient(); - addr = net_sdl_module.ResolveAddress(myargv[i+1]); - - if (addr == NULL) - { - I_Error("Unable to resolve '%s'\n", myargv[i+1]); - } - } - } - - if (addr != NULL) - { - if (M_CheckParm("-drone") > 0) - { - drone = true; - } - - //! - // @category net - // - // Run as the left screen in three screen mode. - // - - if (M_CheckParm("-left") > 0) - { - viewangleoffset = ANG90; - drone = true; - } - - //! - // @category net - // - // Run as the right screen in three screen mode. - // - - if (M_CheckParm("-right") > 0) - { - viewangleoffset = ANG270; - drone = true; - } - - if (!NET_CL_Connect(addr)) - { - I_Error("D_CheckNetGame: Failed to connect to %s\n", - NET_AddrToString(addr)); - } - - printf("D_CheckNetGame: Connected to %s\n", NET_AddrToString(addr)); - - NET_WaitForStart(); - } + D_InitSinglePlayerGame(&settings); } -#endif - - num_players = 0; - - for (i=0; i nettics[keyplayer]); - oldnettics = maketic; - - if (frameskip[0] && frameskip[1] && frameskip[2] && frameskip[3]) - { - skiptics = 1; - // printf ("+"); - } - } - } - } - - if (counts < 1) - counts = 1; - - // wait for new tics if needed - - while (!PlayersInGame() || lowtic < gametic/ticdup + counts) - { - NetUpdate (); - - lowtic = GetLowTic(); - - if (lowtic < gametic/ticdup) - I_Error ("TryRunTics: lowtic < gametic"); - - // Don't stay in this loop forever. The menu is still running, - // so return to update the screen - - if (I_GetTime() / ticdup - entertic > 0) - { - return; - } - - I_Sleep(1); - } - - // run the count * ticdup dics - while (counts--) - { - for (i=0 ; i lowtic) - I_Error ("gametic>lowtic"); - if (advancedemo) - D_DoAdvanceDemo (); - - // [STRIFE]/[CHOCOFIX] jhaley 20110629 Chocolate compatibility problem! - // *Somebody* moved M_Ticker to NetUpdate where it specifically does not - // belong. It *must* be here. All it ever does is animate the cursor - // anyway so there is absolutely no reason to run it from NetUpdate. - M_Ticker (); - G_Ticker (); - gametic++; - - - // modify command for duplicated tics - if (i != ticdup-1) - { - ticcmd_t *cmd; - int buf; - int j; - - buf = (gametic/ticdup)%BACKUPTICS; - for (j=0 ; jchatchar = 0; - if (cmd->buttons & BT_SPECIAL) - cmd->buttons = 0; - } - } - } - NetUpdate (); // check for new console commands - } -} - diff --git a/src/strife/d_net.h b/src/strife/d_net.h deleted file mode 100644 index f801d216..00000000 --- a/src/strife/d_net.h +++ /dev/null @@ -1,52 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright(C) 1993-1996 Id Software, Inc. -// Copyright(C) 2005 Simon Howard -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -// 02111-1307, USA. -// -// DESCRIPTION: -// Networking stuff. -// -//----------------------------------------------------------------------------- - - -#ifndef __D_NET__ -#define __D_NET__ - -#include "d_player.h" - -extern int extratics; - -// Create any new ticcmds and broadcast to other players. -void NetUpdate (void); - -// Broadcasts special packets to other players -// to notify of game exit -void D_QuitNetGame (void); - -//? how many ticks to run? -void TryRunTics (void); - -// Called at start of game loop to initialize timers -void D_StartGameLoop(void); - -extern boolean drone; -extern boolean net_cl_new_sync; - -#endif - diff --git a/src/strife/doomstat.h b/src/strife/doomstat.h index 109311af..9903785f 100644 --- a/src/strife/doomstat.h +++ b/src/strife/doomstat.h @@ -36,7 +36,7 @@ // We need globally shared data structures, // for defining the global state variables. #include "doomdata.h" -#include "d_net.h" +#include "d_loop.h" // We need the playr data structure as well. #include "d_player.h" @@ -296,10 +296,7 @@ extern int skyflatnum; extern int rndindex; -extern int maketic; -extern int nettics[MAXPLAYERS]; - -extern ticcmd_t netcmds[MAXPLAYERS][BACKUPTICS]; +extern ticcmd_t *netcmds; extern int ticdup; diff --git a/src/strife/g_game.c b/src/strife/g_game.c index 16e9c263..18f037c2 100644 --- a/src/strife/g_game.c +++ b/src/strife/g_game.c @@ -334,7 +334,7 @@ static int G_NextWeapon(int direction) // or reads it from the demo buffer. // If recording a demo, write it out // -void G_BuildTiccmd (ticcmd_t* cmd) +void G_BuildTiccmd (ticcmd_t* cmd, int maketic) { int i; boolean strafe; @@ -963,7 +963,7 @@ void G_Ticker (void) { cmd = &players[i].cmd; - memcpy (cmd, &netcmds[i][buf], sizeof(ticcmd_t)); + memcpy (cmd, &netcmds[i], sizeof(ticcmd_t)); if (demoplayback) G_ReadDemoTiccmd (cmd); @@ -2472,6 +2472,3 @@ boolean G_CheckDemoStatus (void) return false; } - - - diff --git a/src/strife/g_game.h b/src/strife/g_game.h index 62bb000e..61b2d5de 100644 --- a/src/strife/g_game.h +++ b/src/strife/g_game.h @@ -79,7 +79,7 @@ boolean G_RiftCheat(int riftSpotNum); // [STRIFE] // Read current data from inputs and build a player movement command. -void G_BuildTiccmd (ticcmd_t *cmd); +void G_BuildTiccmd (ticcmd_t *cmd, int maketic); void G_Ticker (void); boolean G_Responder (event_t* ev); @@ -95,4 +95,3 @@ void G_ReadCurrent(const char *path); extern int vanilla_savegame_limit; extern int vanilla_demo_limit; #endif - diff --git a/src/strife/r_main.c b/src/strife/r_main.c index 0a8a639b..0d60b332 100644 --- a/src/strife/r_main.c +++ b/src/strife/r_main.c @@ -37,7 +37,6 @@ #include "doomdef.h" #include "doomstat.h" // villsa [STRIFE] #include "d_main.h" -#include "d_net.h" #include "m_bbox.h" #include "m_menu.h" @@ -951,4 +950,3 @@ void R_RenderPlayerView (player_t* player) // Check for new console commands. NetUpdate (); } - -- cgit v1.2.3