

//===================================================
//
// Enter modem savegame info
//
//===================================================
int RestoreModem(void)
{
   char * wstr = "MODSAVE";
   short *window;
   short field;
   int   rval = 0;
   char  *args[MAXARGS];
   int   argcount;
   char  string[MAXARGS*2][16];
   union REGS r;
   int   i;
   int   numplayers[6];
   int   saveslot;
   int   handle;
   char  name[32];
	char  p1,p2,p3,p4;


   minfo = modeminfo;       // save copy of netinfo

   field = MS_SAVEGAME0;        // FIRST FIELD TO LIGHT BAR
  
   if ( ( window = IWD_OpenWindow( NULL, wstr ) ) == NULL )
   {
      IWD_CloseWRF ( NULL );
      printf( "\nError opening %s window.\n", wstr );
      exit(1);
   }
  
   saveslot = -1;
   memset(savenames,0,6*24);

   //
   // Read in savegame strings
   //
   for (i = 0;i < 6;i++)
   {
      sprintf(name,SAVENAME,i);
      handle = open (name, O_BINARY | O_RDONLY);
		if (handle == -1)
		   continue;

		read(handle,savenames[i],24);
      lseek(handle,27+16,SEEK_SET);
      read(handle,&p1,1);
      read(handle,&p2,1);
      read(handle,&p3,1);
      read(handle,&p4,1);
      numplayers[i] = p1+p2+p3+p4;
      close(handle);

      IWD_PutFieldData(window,MS_SAVEGAME0+i,savenames[i]);
   }
  	                 	
   //
   // Set defaults
   //
   IWD_SetFieldMark(window,MS_CONTYPE0M,0);
   IWD_SetFieldMark(window,MS_CONTYPE1M,1);
   IWD_SetFieldMark(window,MS_CONTYPE2M,0);
   minfo.comtype = 1;

   IWD_SetFieldMark(window,MS_COM1M,1);
   IWD_SetFieldMark(window,MS_COM2M,0);
   IWD_SetFieldMark(window,MS_COM3M,0);
   IWD_SetFieldMark(window,MS_COM4M,0);
   minfo.comport = 1;
   
   IWD_SetFieldMark(window,MS_DEATHNOM2,1);
   IWD_SetFieldMark(window,MS_DEATHYESM2,0);
   minfo.deathMatch = 0;

   strcpy(minfo.phonenum,"");
   IWD_PutFieldDataType(window,MS_PHONENUM, FTYPE_STRING,&minfo.phonenum);

   IWD_ShowWindow ( window );

   for (;;)
   {
      switch ( IWD_Dialog ( window, &field, DialogControl, hot_keys ) )
      {
         case KEY_ESC:
            rval = -1;
            goto func_exit;
  
exitandsave:
         case KEY_F10:

            if (saveslot < 0)
            {
               short *window;

               if ( ( window = IWD_OpenWindow( NULL, "NETSERR" ) ) == NULL )
                  exit(1);
               IWD_ShowWindow ( window );
               while(kbhit());
                  getch();
               IWD_CloseWindow( window );
               break;
            }

            IWD_GetFieldDataType(window,MS_PHONENUM,FTYPE_STRING,&minfo.phonenum);
            modeminfo = minfo;
            
            M_SaveDefaults();
            IWD_CloseWRF( NULL );
            IWD_Shutdown();

            argcount = 1;

            args[0] = "sersetup.exe ";

               if (cdrom)
                  args[argcount++] = "-cdrom";

            args[argcount++] = "-nodes";
            sprintf(string[argcount],"%d",numplayers[saveslot]);
            args[argcount] = string[argcount];
            argcount++;

            if (modeminfo.deathMatch)
               args[argcount++] = "-deathmatch";

            sprintf(string[argcount],"-com%d",modeminfo.comport);
            args[argcount] = string[argcount];
            argcount++;
            
            switch(modeminfo.comtype)
            {
               case 0:     // no parameter if already connected!
                  break;
               case 1:
                  args[argcount++] = "-answer";
                  break;
               case 2:
                  args[argcount++] = "-dial";
                  sprintf(string[argcount],"%s",minfo.phonenum);
                  args[argcount] = string[argcount];
                  argcount++;
                  break;
            }

            args[argcount++] = "-loadgame";
            sprintf(string[argcount],"%d",saveslot);
            args[argcount] = string[argcount];
            argcount++;
            
            for (i = 1;i < myargc; i++)
               args[argcount++] = myargv[i];

            args[argcount] = NULL;

            r.x.ax = 3;
            int86(0x10,&r,&r);

            execv("sersetup.exe",args);

            //
            // ERROR EXECing!
            //
            printf("Problem EXECing SERSETUP for netplay. Need to be in same directory!");
            exit(0);

         case KEY_CR:
         case 32:
         switch ( field )
         {
            case MS_COM1:
               IWD_SetFieldMark(window,MS_COM1M,1);
               IWD_SetFieldMark(window,MS_COM2M,0);
               IWD_SetFieldMark(window,MS_COM3M,0);
               IWD_SetFieldMark(window,MS_COM4M,0);
               minfo.comport = 1;
               break;

            case MS_COM2:
               IWD_SetFieldMark(window,MS_COM1M,0);
               IWD_SetFieldMark(window,MS_COM2M,1);
               IWD_SetFieldMark(window,MS_COM3M,0);
               IWD_SetFieldMark(window,MS_COM4M,0);
               minfo.comport = 2;
               break;

            case MS_COM3:
               IWD_SetFieldMark(window,MS_COM1M,0);
               IWD_SetFieldMark(window,MS_COM2M,0);
               IWD_SetFieldMark(window,MS_COM3M,1);
               IWD_SetFieldMark(window,MS_COM4M,0);
               minfo.comport = 3;
               break;

            case MS_COM4:
               IWD_SetFieldMark(window,MS_COM1M,0);
               IWD_SetFieldMark(window,MS_COM2M,0);
               IWD_SetFieldMark(window,MS_COM3M,0);
               IWD_SetFieldMark(window,MS_COM4M,1);
               minfo.comport = 4;
               break;
               

            case MS_CONTYPE0:
               IWD_SetFieldMark(window,MS_CONTYPE0M,1);
               IWD_SetFieldMark(window,MS_CONTYPE1M,0);
               IWD_SetFieldMark(window,MS_CONTYPE2M,0);
               minfo.comtype = 0;
               break;

            case MS_CONTYPE1:
               IWD_SetFieldMark(window,MS_CONTYPE0M,0);
               IWD_SetFieldMark(window,MS_CONTYPE1M,1);
               IWD_SetFieldMark(window,MS_CONTYPE2M,0);
               minfo.comtype = 1;
               break;

            case MS_CONTYPE2:
               IWD_SetFieldMark(window,MS_CONTYPE0M,0);
               IWD_SetFieldMark(window,MS_CONTYPE1M,0);
               IWD_SetFieldMark(window,MS_CONTYPE2M,1);
               minfo.comtype = 2;
               field = MS_PHONENUM;
               break;


            case MS_SAVEGAME0:
               if (!savenames[0][0])
               {
                  IWD_Sound(1000,6);
                  break;
               }
               saveslot = 0;
               IWD_SetFieldMark(window,MS_SAVEGAME0M,1);
               IWD_SetFieldMark(window,MS_SAVEGAME1M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME2M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME3M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME4M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME5M,0);
               break;

            case MS_SAVEGAME1:
               if (!savenames[1][0])
               {
                  IWD_Sound(1000,6);
                  break;
               }
               saveslot = 1;
               IWD_SetFieldMark(window,MS_SAVEGAME0M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME1M,1);
               IWD_SetFieldMark(window,MS_SAVEGAME2M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME3M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME4M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME5M,0);
               break;


            case MS_SAVEGAME2:
               if (!savenames[2][0])
               {
                  IWD_Sound(1000,6);
                  break;
               }
               saveslot = 2;
               IWD_SetFieldMark(window,MS_SAVEGAME0M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME1M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME2M,1);
               IWD_SetFieldMark(window,MS_SAVEGAME3M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME4M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME5M,0);
               break;

            case MS_SAVEGAME3:
               if (!savenames[3][0])
               {
                  IWD_Sound(1000,6);
                  break;
               }
               saveslot = 3;
               IWD_SetFieldMark(window,MS_SAVEGAME0M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME1M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME2M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME3M,1);
               IWD_SetFieldMark(window,MS_SAVEGAME4M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME5M,0);
               break;

            case MS_SAVEGAME4:
               if (!savenames[4][0])
               {
                  IWD_Sound(1000,6);
                  break;
               }
               saveslot = 4;
               IWD_SetFieldMark(window,MS_SAVEGAME0M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME1M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME2M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME3M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME4M,1);
               IWD_SetFieldMark(window,MS_SAVEGAME5M,0);
               break;

            case MS_SAVEGAME5:
               if (!savenames[5][0])
               {
                  IWD_Sound(1000,6);
                  break;
               }
               saveslot = 5;
               IWD_SetFieldMark(window,MS_SAVEGAME0M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME1M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME2M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME3M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME4M,0);
               IWD_SetFieldMark(window,MS_SAVEGAME5M,1);
               break;

            //
            // Deathmatch
            //
            case MS_DEATHNO2:
               minfo.deathMatch = 0;
               IWD_SetFieldMark(window,MS_DEATHNOM2,1);
               IWD_SetFieldMark(window,MS_DEATHYESM2,0);
               break;

            case MS_DEATHYES2:
               minfo.deathMatch = 1;
               IWD_SetFieldMark(window,MS_DEATHNOM2,0);
               IWD_SetFieldMark(window,MS_DEATHYESM2,1);
               break;

            default:
               break;
         }
            break;
      }
   }
  
   func_exit:
  
   IWD_CloseWindow(window);
  
   return ( rval );
}


//===================================================
//
// Enter serial-link savegame info
//
//===================================================
int RestoreSerial(void)
{
   char * wstr = "SERSAVE";
   short *window;
   short field;
   int   rval = 0;
   char  *args[MAXARGS];
   int   argcount;
   char  string[MAXARGS*2][16];
   union REGS r;
   int   i;
   int   numplayers[6];
   int   saveslot;
   int   handle;
   char  name[32];
   char  p1,p2,p3,p4;


   sinfo = serialinfo;       // save copy of netinfo

   field = SS_SAVEGAME0;        // FIRST FIELD TO LIGHT BAR
  
   if ( ( window = IWD_OpenWindow( NULL, wstr ) ) == NULL )
   {
      IWD_CloseWRF ( NULL );
      printf( "\nError opening %s window.\n", wstr );
      exit(1);
   }
  
   saveslot = -1;
   memset(savenames,0,6*24);

   //
   // Read in savegame strings
   //
   for (i = 0;i < 6;i++)
   {
      sprintf(name,"DOOMSAV%d.DSG",i);
      handle = open (name, O_BINARY | O_RDONLY);
		if (handle == -1)
		   continue;

      read(handle,savenames[i],24);
      lseek(handle,27+16,SEEK_SET);
      read(handle,&p1,1);
      read(handle,&p2,1);
      read(handle,&p3,1);
      read(handle,&p4,1);
      numplayers[i] = p1+p2+p3+p4;
      close(handle);

      IWD_PutFieldData(window,SS_SAVEGAME0+i,savenames[i]);
   }
  	                 	
   //
   // Set defaults
   //
   IWD_SetFieldMark(window,SS_COM1M,1);
   IWD_SetFieldMark(window,SS_COM2M,0);
   IWD_SetFieldMark(window,SS_COM3M,0);
   IWD_SetFieldMark(window,SS_COM4M,0);
   sinfo.comport = 1;
   
   IWD_SetFieldMark(window,SS_DEATHNOM2,1);
   IWD_SetFieldMark(window,SS_DEATHYESM2,0);
   sinfo.deathMatch = 0;

   IWD_ShowWindow ( window );

   for (;;)
   {
      switch ( IWD_Dialog ( window, &field, DialogControl, hot_keys ) )
      {
         case KEY_ESC:
            rval = -1;
            goto func_exit;
  
exitandsave:
         case KEY_F10:

            if (saveslot < 0)
            {
               short *window;

               if ( ( window = IWD_OpenWindow( NULL, "NETSERR" ) ) == NULL )
                  exit(1);
               IWD_ShowWindow ( window );
               while(kbhit());
                  getch();
               IWD_CloseWindow( window );
               break;
            }

            serialinfo = sinfo;
            
            M_SaveDefaults();
            IWD_CloseWRF( NULL );
            IWD_Shutdown();

            argcount = 1;

            args[0] = "sersetup.exe ";

               if (cdrom)
                  args[argcount++] = "-cdrom";

            args[argcount++] = "-nodes";
            sprintf(string[argcount],"%d",numplayers[saveslot]);
            args[argcount] = string[argcount];
            argcount++;

            if (modeminfo.deathMatch)
               args[argcount++] = "-deathmatch";

            sprintf(string[argcount],"-com%d",serialinfo.comport);
            args[argcount] = string[argcount];
            argcount++;

            args[argcount++] = "-loadgame";
            sprintf(string[argcount],"%d",saveslot);
            args[argcount] = string[argcount];
            argcount++;
            
            for (i = 1;i < myargc; i++)
               args[argcount++] = myargv[i];

            args[argcount] = NULL;

            r.x.ax = 3;
            int86(0x10,&r,&r);

            execv("sersetup.exe",args);

            //
            // ERROR EXECing!
            //
            printf("Problem EXECing SERSETUP for netplay. Need to be in same directory!");
            exit(0);

         case KEY_CR:
         case 32:
         switch ( field )
         {
            case SS_COM1:
               IWD_SetFieldMark(window,SS_COM1M,1);
               IWD_SetFieldMark(window,SS_COM2M,0);
               IWD_SetFieldMark(window,SS_COM3M,0);
               IWD_SetFieldMark(window,SS_COM4M,0);
               sinfo.comport = 1;
               break;

            case SS_COM2:
               IWD_SetFieldMark(window,SS_COM1M,0);
               IWD_SetFieldMark(window,SS_COM2M,1);
               IWD_SetFieldMark(window,SS_COM3M,0);
               IWD_SetFieldMark(window,SS_COM4M,0);
               sinfo.comport = 2;
               break;

            case SS_COM3:
               IWD_SetFieldMark(window,SS_COM1M,0);
               IWD_SetFieldMark(window,SS_COM2M,0);
               IWD_SetFieldMark(window,SS_COM3M,1);
               IWD_SetFieldMark(window,SS_COM4M,0);
               sinfo.comport = 3;
               break;

            case SS_COM4:
               IWD_SetFieldMark(window,SS_COM1M,0);
               IWD_SetFieldMark(window,SS_COM2M,0);
               IWD_SetFieldMark(window,SS_COM3M,0);
               IWD_SetFieldMark(window,SS_COM4M,1);
               sinfo.comport = 4;
               break;
               

            case SS_SAVEGAME0:
               if (!savenames[0][0])
               {
                  IWD_Sound(1000,6);
                  break;
               }
               saveslot = 0;
               IWD_SetFieldMark(window,SS_SAVEGAME0M,1);
               IWD_SetFieldMark(window,SS_SAVEGAME1M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME2M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME3M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME4M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME5M,0);
               break;

            case SS_SAVEGAME1:
               if (!savenames[1][0])
               {
                  IWD_Sound(1000,6);
                  break;
               }
               saveslot = 1;
               IWD_SetFieldMark(window,SS_SAVEGAME0M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME1M,1);
               IWD_SetFieldMark(window,SS_SAVEGAME2M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME3M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME4M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME5M,0);
               break;


            case SS_SAVEGAME2:
               if (!savenames[2][0])
               {
                  IWD_Sound(1000,6);
                  break;
               }
               saveslot = 2;
               IWD_SetFieldMark(window,SS_SAVEGAME0M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME1M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME2M,1);
               IWD_SetFieldMark(window,SS_SAVEGAME3M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME4M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME5M,0);
               break;

            case SS_SAVEGAME3:
               if (!savenames[3][0])
               {
                  IWD_Sound(1000,6);
                  break;
               }
               saveslot = 3;
               IWD_SetFieldMark(window,SS_SAVEGAME0M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME1M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME2M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME3M,1);
               IWD_SetFieldMark(window,SS_SAVEGAME4M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME5M,0);
               break;

            case SS_SAVEGAME4:
               if (!savenames[4][0])
               {
                  IWD_Sound(1000,6);
                  break;
               }
               saveslot = 4;
               IWD_SetFieldMark(window,SS_SAVEGAME0M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME1M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME2M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME3M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME4M,1);
               IWD_SetFieldMark(window,SS_SAVEGAME5M,0);
               break;

            case SS_SAVEGAME5:
               if (!savenames[5][0])
               {
                  IWD_Sound(1000,6);
                  break;
               }
               saveslot = 5;
               IWD_SetFieldMark(window,SS_SAVEGAME0M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME1M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME2M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME3M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME4M,0);
               IWD_SetFieldMark(window,SS_SAVEGAME5M,1);
               break;

            //
            // Deathmatch
            //
            case SS_DEATHNO2:
               sinfo.deathMatch = 0;
               IWD_SetFieldMark(window,SS_DEATHNOM2,1);
               IWD_SetFieldMark(window,SS_DEATHYESM2,0);
               break;

            case SS_DEATHYES2:
               sinfo.deathMatch = 1;
               IWD_SetFieldMark(window,SS_DEATHNOM2,0);
               IWD_SetFieldMark(window,SS_DEATHYESM2,1);
               break;

            default:
               break;
         }
            break;
      }
   }
  
   func_exit:
  
   IWD_CloseWindow(window);
  
   return ( rval );
}



