Exemple #1
0
void D_InitNetGame (void)
{
  int i;
  int numplayers = 1;

  i = M_CheckParm("-net");
  if (i && i < myargc-1) i++;

  if (!(netgame = server =  !!i)) {
    playeringame[consoleplayer = 0] = TRUE;
    // e6y
    // for play, recording or playback using "single-player coop" mode.
    // Equivalent to using prboom_server with -N 1
    netgame = M_CheckParm("-solo-net") || M_CheckParm("-net1");
  } else {
    // Get game info from server
    packet_header_t *packet = Z_Malloc(1000, PU_STATIC, NULL);
    struct setup_packet_s *sinfo = (void*)(packet+1);
  struct { packet_header_t head; short pn; } PACKEDATTR initpacket;

    I_InitNetwork();
  udp_socket = I_Socket(0);
  I_ConnectToServer(myargv[i]);

    do
    {
      do { 
	// Send init packet
	initpacket.pn = doom_htons(wanted_player_number);
	packet_set(&initpacket.head, PKT_INIT, 0);
	I_SendPacket(&initpacket.head, sizeof(initpacket));
	I_WaitForPacket(5000);
      } while (!I_GetPacket(packet, 1000));
      if (packet->type == PKT_DOWN) I_Error("Server aborted the game");
    } while (packet->type != PKT_SETUP);

    // Get info from the setup packet
    consoleplayer = sinfo->yourplayer;
    compatibility_level = sinfo->complevel;
    G_Compatibility();
    startskill = sinfo->skill;
    deathmatch = sinfo->deathmatch;
    startmap = sinfo->level;
    startepisode = sinfo->episode;
    ticdup = sinfo->ticdup;
    xtratics = sinfo->extratic;
    G_ReadOptions(sinfo->game_options);

    lprintf(LO_INFO, "\tjoined game as player %d/%d; %d WADs specified\n",
      consoleplayer+1, numplayers = sinfo->players, sinfo->numwads);
    {
      char *p = sinfo->wadnames;
      int i = sinfo->numwads;

      while (i--) {
  D_AddFile(p, source_net);
  p += strlen(p) + 1;
      }
    }
    Z_Free(packet);
  }
  localcmds = netcmds[displayplayer = consoleplayer];
  for (i=0; i<numplayers; i++)
    playeringame[i] = TRUE;
  for (; i<MAXPLAYERS; i++)
    playeringame[i] = FALSE;
  if (!playeringame[consoleplayer]) I_Error("D_InitNetGame: consoleplayer not in game");
}
Exemple #2
0
void D_InitNetGame (void)
{
	int i;
	int numplayers = 1;

	i = M_CheckParm("-net");
	if (i && i < myargc-1) i++;

	server = netgame;

	if (!netgame)
	{
		playeringame[consoleplayer = 0] = true;
	} else {
		StartWifi();
  
		// Get game info from server
		packet_header_t *packet = Z_Malloc(1000, PU_STATIC, NULL);
		
		struct setup_packet_s *sinfo = (void*)(packet+1);
		
		struct { packet_header_t head; short pn; } PACKEDATTR initpacket;

		iprintf("I_InitNetwork()\n");
		I_InitNetwork();
		udp_socket = I_Socket(0);
		
		//I_ConnectToServer(myargv[i]);
		
		iprintf("I_ConnectToServer()\n");
		
		if (I_ConnectToServer(server_address[0]) != 0) iprintf("FAILURE!\n");
		
		iprintf("Connected?\n");

		do
		{
			iprintf("Send Init Packet\n");
			
			do
			{ 
				// Send init packet
				initpacket.pn = doom_htons(wanted_player_number);
				packet_set(&initpacket.head, PKT_INIT, 0);
				I_SendPacket(&initpacket.head, sizeof(initpacket));
				iprintf("Wait for packet\n");
				I_WaitForPacket(5000);
				iprintf("Done\n");
			} while (!I_GetPacket(packet, 1000));
			
			iprintf("Got it!\n");
			
			if (packet->type == PKT_DOWN) I_Error("Server aborted the game");
			
		} while (packet->type != PKT_SETUP);
		
		iprintf("Out of loop!\n");

		// Once we have been accepted by the server, we should tell it when we leave
		atexit(D_QuitNetGame);

		// Get info from the setup packet
		consoleplayer = sinfo->yourplayer;
		compatibility_level = sinfo->complevel;
		G_Compatibility();
		startskill = sinfo->skill;
		deathmatch = sinfo->deathmatch;
		startmap = sinfo->level;
		startepisode = sinfo->episode;
		ticdup = sinfo->ticdup;
		xtratics = sinfo->extratic;
		
		G_ReadOptions(sinfo->game_options);

		lprintf(LO_INFO, "\tjoined game as player %d/%d; %d WADs specified\n",
		consoleplayer+1, numplayers = sinfo->players, sinfo->numwads);
		
		{
			char *p = sinfo->wadnames;
			int i = sinfo->numwads;

			while (i--)
			{
				D_AddFile(p, source_net);
				p += strlen(p) + 1;
			}
		}
		
		Z_Free(packet);
	}
  
	localcmds = netcmds[displayplayer = consoleplayer];
	
	for (i=0; i<numplayers; i++)
		playeringame[i] = true;
		
	for (; i<MAXPLAYERS; i++)
		playeringame[i] = false;
		
	if (!playeringame[consoleplayer]) I_Error("D_InitNetGame: consoleplayer not in game");
}