コード例 #1
0
ファイル: d_net.c プロジェクト: M-Code/chocolate-doom
static boolean StartupProgress(int now_ready, int total)
{
    static int ready = 0;

    while (ready < now_ready)
    {
        ST_NetProgress();
        ++ready;
    }

    ready = now_ready;

    // Allow the user to hit escape during netgame startup to abort.
    return !I_CheckAbortHR();
}
コード例 #2
0
ファイル: D_NET.C プロジェクト: OpenSourcedGames/Hexen
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
		{