void D_CheckNetGame(void) { net_gamesettings_t settings; D_RegisterLoopCallbacks(&hexen_loop_interface); if (netgame) { autostart = true; } SaveGameSettings(&settings); D_StartNetGame(&settings, StartupProgress); LoadGameSettings(&settings); // Finish netgame progress on startup screen. if (netgame) { StartupProgress(settings.num_players, settings.num_players); ST_NetDone(); } }
void D_ArbitrateNetStart (void) { int i; boolean gotinfo[MAXNETNODES]; boolean gotClass[MAXNETNODES]; #ifdef __WATCOMC__ int nextTic; extern volatile int ticcount; nextTic = ticcount+8; #endif autostart = true; memset (gotClass,0,sizeof(gotClass)); memset (gotinfo,0,sizeof(gotinfo)); gotClass[doomcom->consoleplayer] = true; do { i = 0; CheckAbort(); while(HGetPacket()) { // Check for any incoming packets if(netbuffer->checksum&NCMD_SETUP && netbuffer->starttic >= 64) { PlayerClass[netbuffer->player] = netbuffer->starttic&0x3f; if(!gotClass[netbuffer->player]) { gotClass[netbuffer->player] = true; ST_NetProgress(); ST_Message("\n"); } if(netbuffer->retransmitfrom) { // that node has received info from all other nodes gotinfo[netbuffer->player] = true; } } } #ifdef __WATCOMC__ if(ticcount <= nextTic) { // only send packets every half second continue; } nextTic = ticcount+8; #endif // Keep sending out packets containing the console class for(i = 0; i < doomcom->numnodes; i++) { netbuffer->player = doomcom->consoleplayer; netbuffer->starttic = PlayerClass[doomcom->consoleplayer]+64; netbuffer->retransmitfrom = gotinfo[doomcom->consoleplayer]; netbuffer->numtics = 0; HSendPacket(i, NCMD_SETUP); } for(i = 0; i < doomcom->numnodes; i++) { // Make sure that all nodes have sent class info if (!gotClass[i]) { ST_Message("."); break; } } if(i < doomcom->numnodes) { continue; } else { // consoleplayer has received all player classes if(gotinfo[doomcom->consoleplayer]) { CheckAbort(); } else { gotinfo[doomcom->consoleplayer] = true; ST_Message("All player classes received, ready to proceed\n"); ST_NetDone(); } } for (i = 0; i < doomcom->numnodes; i++) { // Make sure that all nodes are ready to proceed if (!gotinfo[i]) { break; } } } while(i < doomcom->numnodes); memset (gotinfo,0,sizeof(gotinfo)); if (doomcom->consoleplayer) { // listen for setup info from key player // ST_Message ("listening for network start info...\n"); while (1) { CheckAbort (); if (!HGetPacket ()) continue; if(netbuffer->checksum & NCMD_SETUP && netbuffer->starttic < 64) { if (netbuffer->player != VERSION) I_Error ("Different HEXEN versions cannot play a net game!"); startskill = netbuffer->retransmitfrom & 15; deathmatch = (netbuffer->retransmitfrom & 0xc0) >> 6; nomonsters = (netbuffer->retransmitfrom & 0x20) > 0; respawnparm = (netbuffer->retransmitfrom & 0x10) > 0; startmap = netbuffer->starttic & 0x3f; startepisode = 1; return; } } } else { // key player, send the setup info // ST_Message ("sending network start info...\n"); do {