// ipxsetup.c #include #include #include #include #include #include #include #include #include "ipxnet.h" int gameid; int numnetnodes; setupdata_t nodesetup[MAXNETNODES]; /* ================= = = Error = = For abnormal program terminations = ================= */ void Error (char *error, ...) { va_list argptr; if (vectorishooked) setvect (doomcom.intnum,olddoomvect); va_start (argptr,error); vprintf (error,argptr); va_end (argptr); printf ("\n"); exit (1); } /* ============= = = NetISR = ============= */ void interrupt NetISR (void) { if (doomcom.command == CMD_SEND) { //I_ColorBlack (63,0,0); localtime++; SendPacket (doomcom.remotenode); //I_ColorBlack (0,0,0); } else if (doomcom.command == CMD_GET) { //I_ColorBlack (0,63,0); GetPacket (); //I_ColorBlack (0,0,0); } } /* =================== = = LookForNodes = = Finds all the nodes for the game and works out player numbers among them = = Exits with nodesetup[0..numnodes] and nodeadr[0..numnodes] filled in =================== */ void LookForNodes (void) { int i,j,k; int netids[MAXNETNODES]; int netplayer[MAXNETNODES]; struct time time; int oldsec; setupdata_t *setup, *dest; char str[80]; int total, console; // // wait until we get [numnetnodes] packets, then start playing // the playernumbers are assigned by netid // printf("Attempting to find all players for %i player net play. " "Press ESC to exit.\n", numnetnodes); printf ("Looking for a node"); oldsec = -1; setup = (setupdata_t *)&doomcom.data; localtime = -1; // in setup time, not game time // // build local setup info // nodesetup[0].nodesfound = 1; nodesetup[0].nodeswanted = numnetnodes; doomcom.numnodes = 1; do { // // check for aborting // while ( bioskey(1) ) { if ( (bioskey (0) & 0xff) == 27) Error ("\n\nNetwork game synchronization aborted."); } // // listen to the network // while (GetPacket ()) { if (doomcom.remotenode == -1) dest = &nodesetup[doomcom.numnodes]; else dest = &nodesetup[doomcom.remotenode]; if (remotetime != -1) { // an early game packet, not a setup packet if (doomcom.remotenode == -1) Error ("Got an unknown game packet during setup"); // if it allready started, it must have found all nodes dest->nodesfound = dest->nodeswanted; continue; } // update setup ingo memcpy (dest, setup, sizeof(*dest) ); if (doomcom.remotenode != -1) continue; // allready know that node address // // this is a new node // memcpy (&nodeadr[doomcom.numnodes], &remoteadr , sizeof(nodeadr[doomcom.numnodes]) ); // // if this node has a lower address, take all startup info // if ( memcmp (&remoteadr, &nodeadr[0], sizeof(&remoteadr) ) < 0 ) { } doomcom.numnodes++; printf ("\nFound a node!\n"); if (doomcom.numnodes < numnetnodes) printf ("Looking for node"); } // // we are done if all nodes have found all other nodes // for (i=0 ; i MAXPLAYERS) Error ("More than %i players specified!",MAXPLAYERS); if (memcmp (&nodeadr[i], &nodeadr[0], sizeof(nodeadr[0])) < 0) console++; } if (!total) Error ("No players specified for game!"); doomcom.consoleplayer = console; doomcom.numplayers = total; printf ("Console is player %i of %i\n", console+1, total); } /* ============= = = main = ============= */ void main (void) { int i; // // determine game parameters // gameid = 0; numnetnodes = 2; doomcom.ticdup = 1; doomcom.extratics = 1; doomcom.episode = 1; doomcom.map = 1; doomcom.skill = 2; doomcom.deathmatch = 0; printf("\n" "--------------------------\n" "DOOM NETWORK DEVICE DRIVER\n" "--------------------------\n"); i = CheckParm ("-nodes"); if (i && i < _argc-1) { numnetnodes = atoi(_argv[i+1]); } // make sure the network exists and create a bunch of buffers InitNetwork (); // get addresses of all nodes LookForNodes (); localtime = 0; // no longer in setup // // launch DOOM // LaunchDOOM (); // cleanup ShutdownNetwork (); Error (NULL); }