Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20. // net_vcr.c
  21.  
  22. #include "quakedef.h"
  23. #include "net_vcr.h"
  24.  
  25. extern int vcrFile;
  26.  
  27. // This is the playback portion of the VCR.  It reads the file produced
  28. // by the recorder and plays it back to the host.  The recording contains
  29. // everything necessary (events, timestamps, and data) to duplicate the game
  30. // from the viewpoint of everything above the network layer.
  31.  
  32. static struct
  33. {
  34.         double  time;
  35.         int             op;
  36.         long    session;
  37. }       next;
  38.  
  39. int VCR_Init (void)
  40. {
  41.         net_drivers[0].Init = VCR_Init;
  42.  
  43.         net_drivers[0].SearchForHosts = VCR_SearchForHosts;
  44.         net_drivers[0].Connect = VCR_Connect;
  45.         net_drivers[0].CheckNewConnections = VCR_CheckNewConnections;
  46.         net_drivers[0].QGetMessage = VCR_GetMessage;
  47.         net_drivers[0].QSendMessage = VCR_SendMessage;
  48.         net_drivers[0].CanSendMessage = VCR_CanSendMessage;
  49.         net_drivers[0].Close = VCR_Close;
  50.         net_drivers[0].Shutdown = VCR_Shutdown;
  51.  
  52.         Sys_FileRead(vcrFile, &next, sizeof(next));
  53.         return 0;
  54. }
  55.  
  56. void VCR_ReadNext (void)
  57. {
  58.         if (Sys_FileRead(vcrFile, &next, sizeof(next)) == 0)
  59.         {
  60.                 next.op = 255;
  61.                 Sys_Error ("=== END OF PLAYBACK===\n");
  62.         }
  63.         if (next.op < 1 || next.op > VCR_MAX_MESSAGE)
  64.                 Sys_Error ("VCR_ReadNext: bad op");
  65. }
  66.  
  67.  
  68. void VCR_Listen (qboolean state)
  69. {
  70. }
  71.  
  72.  
  73. void VCR_Shutdown (void)
  74. {
  75. }
  76.  
  77.  
  78. int VCR_GetMessage (qsocket_t *sock)
  79. {
  80.         int     ret;
  81.        
  82.         if (host_time != next.time || next.op != VCR_OP_GETMESSAGE || next.session != *(long *)(&sock->driverdata))
  83.                 Sys_Error ("VCR missmatch");
  84.  
  85.         Sys_FileRead(vcrFile, &ret, sizeof(int));
  86.         if (ret != 1)
  87.         {
  88.                 VCR_ReadNext ();
  89.                 return ret;
  90.         }
  91.  
  92.         Sys_FileRead(vcrFile, &net_message.cursize, sizeof(int));
  93.         Sys_FileRead(vcrFile, net_message.data, net_message.cursize);
  94.  
  95.         VCR_ReadNext ();
  96.  
  97.         return 1;
  98. }
  99.  
  100.  
  101. int VCR_SendMessage (qsocket_t *sock, sizebuf_t *data)
  102. {
  103.         int     ret;
  104.  
  105.         if (host_time != next.time || next.op != VCR_OP_SENDMESSAGE || next.session != *(long *)(&sock->driverdata))
  106.                 Sys_Error ("VCR missmatch");
  107.  
  108.         Sys_FileRead(vcrFile, &ret, sizeof(int));
  109.  
  110.         VCR_ReadNext ();
  111.  
  112.         return ret;
  113. }
  114.  
  115.  
  116. qboolean VCR_CanSendMessage (qsocket_t *sock)
  117. {
  118.         qboolean        ret;
  119.  
  120.         if (host_time != next.time || next.op != VCR_OP_CANSENDMESSAGE || next.session != *(long *)(&sock->driverdata))
  121.                 Sys_Error ("VCR missmatch");
  122.  
  123.         Sys_FileRead(vcrFile, &ret, sizeof(int));
  124.  
  125.         VCR_ReadNext ();
  126.  
  127.         return ret;
  128. }
  129.  
  130.  
  131. void VCR_Close (qsocket_t *sock)
  132. {
  133. }
  134.  
  135.  
  136. void VCR_SearchForHosts (qboolean xmit)
  137. {
  138. }
  139.  
  140.  
  141. qsocket_t *VCR_Connect (char *host)
  142. {
  143.         return NULL;
  144. }
  145.  
  146.  
  147. qsocket_t *VCR_CheckNewConnections (void)
  148. {
  149.         qsocket_t       *sock;
  150.  
  151.         if (host_time != next.time || next.op != VCR_OP_CONNECT)
  152.                 Sys_Error ("VCR missmatch");
  153.  
  154.         if (!next.session)
  155.         {
  156.                 VCR_ReadNext ();
  157.                 return NULL;
  158.         }
  159.  
  160.         sock = NET_NewQSocket ();
  161.         *(long *)(&sock->driverdata) = next.session;
  162.  
  163.         Sys_FileRead (vcrFile, sock->address, NET_NAMELEN);
  164.         VCR_ReadNext ();
  165.  
  166.         return sock;
  167. }
  168.