home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #27 / NN_1992_27.iso / spool / vmsnet / sources / games / 451 < prev    next >
Encoding:
Internet Message Format  |  1992-11-20  |  14.6 KB

  1. Path: sparky!uunet!cs.utexas.edu!usc!sol.ctr.columbia.edu!destroyer!cs.ubc.ca!bcsystems!spruce.pfc.forestry.ca!news.u.washington.edu!raven.alaska.edu!acad2.alaska.edu!asdmf
  2. Newsgroups: vmsnet.sources.games
  3. Subject: Vmsnetrek 39/47
  4. Message-ID: <1992Nov20.204316.1@acad2.alaska.edu>
  5. From: asdmf@acad2.alaska.edu
  6. Date: Sat, 21 Nov 1992 00:43:16 GMT
  7. Sender: news@raven.alaska.edu (USENET News System)
  8. Organization: University of Alaska
  9. Nntp-Posting-Host: acad2.alaska.edu
  10. Lines: 414
  11.  
  12. -+-+-+-+-+-+-+-+ START OF PART 39 -+-+-+-+-+-+-+-+
  13. Xint handleUdpReply(), handleSequence();
  14. Xint exit();
  15. X
  16. Xstruct packet_handler handlers`091`093 = `123
  17. X    `123 0, NULL `125,`009/* record 0 */
  18. X    `123 sizeof(struct mesg_spacket), handleMessage `125, `009    /* SP_MESS
  19. VAGE */
  20. X    `123 sizeof(struct plyr_info_spacket), handlePlyrInfo `125,   /* SP_PLAY
  21. VER_INFO */
  22. X    `123 sizeof(struct kills_spacket), handleKills `125,`009    /* SP_KILLS
  23. V */
  24. X    `123 sizeof(struct player_spacket), handlePlayer `125,`009    /* SP_PLAY
  25. VER */
  26. X    `123 sizeof(struct torp_info_spacket), handleTorpInfo `125,   /* SP_TORP
  27. V_INFO */
  28. X    `123 sizeof(struct torp_spacket), handleTorp `125, `009    /* SP_TORP */
  29. X    `123 sizeof(struct phaser_spacket), handlePhaser `125,`009    /* SP_PHAS
  30. VER */
  31. X    `123 sizeof(struct plasma_info_spacket), handlePlasmaInfo`125,/* SP_PLAS
  32. VMA_INFO */
  33. X    `123 sizeof(struct plasma_spacket), handlePlasma`125,`009    /* SP_PLASM
  34. VA */
  35. X    `123 sizeof(struct warning_spacket), handleWarning `125,`009    /* SP_WA
  36. VRNING */
  37. X    `123 sizeof(struct motd_spacket), handleMotd `125,`009    /* SP_MOTD */
  38. X    `123 sizeof(struct you_spacket), handleSelf `125,`009`009    /* SP_YOU *
  39. V/
  40. X    `123 sizeof(struct queue_spacket), handleQueue `125,`009    /* SP_QUEUE
  41. V */
  42. X    `123 sizeof(struct status_spacket), handleStatus `125,`009    /* SP_STAT
  43. VUS */
  44. X    `123 sizeof(struct planet_spacket), handlePlanet `125, `009    /* SP_PLA
  45. VNET */
  46. X    `123 sizeof(struct pickok_spacket), handlePickok `125,`009    /* SP_PICK
  47. VOK */
  48. X    `123 sizeof(struct login_spacket), handleLogin `125, `009    /* SP_LOGIN
  49. V */
  50. X    `123 sizeof(struct flags_spacket), handleFlags `125,`009    /* SP_FLAGS
  51. V */
  52. X    `123 sizeof(struct mask_spacket), handleMask `125,`009    /* SP_MASK */
  53. X    `123 sizeof(struct pstatus_spacket), handlePStatus `125,`009    /* SP_PS
  54. VTATUS */
  55. X    `123 sizeof(struct badversion_spacket), handleBadVersion `125,/* SP_BADV
  56. VERSION */
  57. X    `123 sizeof(struct hostile_spacket), handleHostile `125,      /* SP_HOST
  58. VILE */
  59. X    `123 sizeof(struct stats_spacket), handleStats `125,`009    /* SP_STATS
  60. V */
  61. X    `123 sizeof(struct plyr_login_spacket), handlePlyrLogin `125, /* SP_PL_L
  62. VOGIN */
  63. X    `123 sizeof(struct reserved_spacket), handleReserved `125,    /* SP_RESE
  64. VRVED */
  65. X    `123 sizeof(struct planet_loc_spacket), handlePlanetLoc `125, /* SP_PLAN
  66. VET_LOC */
  67. X#ifdef INCLUDE_SCAN
  68. X    `123 sizeof(struct scan_spacket), handleScan `125,`009    /* SP_SCAN (AT
  69. VM) */
  70. X#else
  71. X    `123 0, exit `125,`009`009/* note exit won't be called */
  72. X#endif
  73. X    `123 sizeof(struct udp_reply_spacket), handleUdpReply `125,   /* SP_UDP_
  74. VSTAT */
  75. X    `123 sizeof(struct sequence_spacket), handleSequence `125,    /* SP_SEQU
  76. VENCE */
  77. X    `123 sizeof(struct sc_sequence_spacket), handleSequence `125  /* SP_SC_S
  78. VEQUENCE */
  79. X`125;
  80. X
  81. Xint sizes`091`093 = `123
  82. X    0,`009/* record 0 */
  83. X    sizeof(struct mesg_cpacket), `009`009/* CP_MESSAGE */
  84. X    sizeof(struct speed_cpacket),`009`009/* CP_SPEED */
  85. X    sizeof(struct dir_cpacket),`009`009`009/* CP_DIRECTION */
  86. X    sizeof(struct phaser_cpacket),`009`009/* CP_PHASER */
  87. X    sizeof(struct plasma_cpacket),`009`009/* CP_PLASMA */
  88. X    sizeof(struct torp_cpacket),`009`009/* CP_TORP */
  89. X    sizeof(struct quit_cpacket), `009`009/* CP_QUIT */
  90. X    sizeof(struct login_cpacket),`009`009/* CP_LOGIN */
  91. X    sizeof(struct outfit_cpacket),`009`009/* CP_OUTFIT */
  92. X    sizeof(struct war_cpacket),`009`009`009/* CP_WAR */
  93. X    sizeof(struct practr_cpacket),`009`009/* CP_PRACTR */
  94. X    sizeof(struct shield_cpacket),`009`009/* CP_SHIELD */
  95. X    sizeof(struct repair_cpacket),`009`009/* CP_REPAIR */
  96. X    sizeof(struct orbit_cpacket),`009`009/* CP_ORBIT */
  97. X    sizeof(struct planlock_cpacket),`009`009/* CP_PLANLOCK */
  98. X    sizeof(struct playlock_cpacket),`009`009/* CP_PLAYLOCK */
  99. X    sizeof(struct bomb_cpacket),`009`009/* CP_BOMB */
  100. X    sizeof(struct beam_cpacket),`009`009/* CP_BEAM */
  101. X    sizeof(struct cloak_cpacket),`009`009/* CP_CLOAK */
  102. X    sizeof(struct det_torps_cpacket),`009`009/* CP_DET_TORPS */
  103. X    sizeof(struct det_mytorp_cpacket),`009`009/* CP_DET_MYTORP */
  104. X    sizeof(struct copilot_cpacket),`009`009/* CP_COPILOT */
  105. X    sizeof(struct refit_cpacket),`009`009/* CP_REFIT */
  106. X    sizeof(struct tractor_cpacket),`009`009/* CP_TRACTOR */
  107. X    sizeof(struct repress_cpacket),`009`009/* CP_REPRESS */
  108. X    sizeof(struct coup_cpacket),`009`009/* CP_COUP */
  109. X    sizeof(struct socket_cpacket),`009`009/* CP_SOCKET */
  110. X    sizeof(struct options_cpacket),`009`009/* CP_OPTIONS */
  111. X    sizeof(struct bye_cpacket),`009`009`009/* CP_BYE */
  112. X    sizeof(struct dockperm_cpacket),`009`009/* CP_DOCKPERM */
  113. X    sizeof(struct updates_cpacket),`009`009/* CP_UPDATES */
  114. X    sizeof(struct resetstats_cpacket),`009`009/* CP_RESETSTATS */
  115. X    sizeof(struct reserved_cpacket),`009`009/* CP_RESERVED */
  116. X#ifdef INCLUDE_SCAN
  117. X    sizeof(struct scan_cpacket),`009`009/* CP_SCAN (ATM) */
  118. X#else
  119. X    0,
  120. X#endif
  121. X    sizeof(struct udp_req_cpacket),`009`009/* CP_UDP_REQ */
  122. X    sizeof(struct sequence_cpacket)`009`009/* CP_SEQUENCE */
  123. X`125;
  124. X
  125. X#define NUM_PACKETS (sizeof(handlers) / sizeof(handlers`0910`093) - 1)
  126. X#define NUM_SIZES (sizeof(sizes) / sizeof(sizes`0910`093) - 1)
  127. X
  128. Xint serverDead=0;
  129. X
  130. Xstatic int udpLocalPort = 0;
  131. Xstatic int udpServerPort = 0;
  132. Xstatic long serveraddr = 0;
  133. Xstatic long sequence;
  134. Xstatic int drop_flag = 0;
  135. Xstatic int chan = -1;`009`009/* tells sequence checker where packet is from*
  136. V/
  137. Xstatic short fSpeed, fDirection, fShield, fOrbit, fRepair, fBeamup, fBeamdow
  138. Vn,
  139. X`009fCloak, fBomb, fDockperm, fPhaser, fPlasma, fPlayLock, fPlanLock,
  140. X`009fTractor, fRepress;
  141. X
  142. X/* reset all the "force command" variables */
  143. XresetForce()
  144. X`123
  145. X    fSpeed = fDirection = fShield = fOrbit = fRepair = fBeamup = fBeamdown =
  146. X    fCloak = fBomb = fDockperm = fPhaser = fPlasma = fPlayLock = fPlanLock =
  147. X    fTractor = fRepress = -1;
  148. X`125
  149. X
  150. X/*
  151. X * If something we want to happen hasn't yet, send it again.
  152. X *
  153. X * The low byte is the request, the high byte is a max count.  When the max
  154. X * count reaches zero, the client stops trying.  Checking is done with a
  155. X * macro for speed & clarity.
  156. X */
  157. X#define FCHECK_FLAGS(flag, force, const) `123`009`009`009\
  158. X`009if (force > 0) `123`009`009`009`009`009\
  159. X`009    if (((me->p_flags & flag) && 1) `094 ((force & 0xff) && 1)) `123`009
  160. V\
  161. X`009`009speedReq.type = const;`009`009`009`009\
  162. X`009`009speedReq.speed = (force & 0xff);`009`009\
  163. X`009`009sendServerPacket(&speedReq);`009`009`009\
  164. X`009`009V_UDPDIAG(("Forced %d:%d\n", const, force & 0xff));`009\
  165. X`009`009force -= 0x100;`009`009`009`009`009\
  166. X`009`009if (force < 0x100) force = -1;`009/* give up */`009\
  167. X`009    `125 else`009`009`009`009`009`009\
  168. X`009`009force = -1;`009`009`009`009`009\
  169. X`009`125`009`009`009`009`009`009`009\
  170. X`125
  171. X#define FCHECK_VAL(value, force, const) `123`009`009`009\
  172. X`009if (force > 0) `123`009`009`009`009`009\
  173. X`009    if ((value) != (force & 0xff)) `123`009`009`009\
  174. X`009`009speedReq.type = const;`009`009`009`009\
  175. X`009`009speedReq.speed = (force & 0xff);`009`009\
  176. X`009`009sendServerPacket(&speedReq);`009`009`009\
  177. X`009`009V_UDPDIAG(("Forced %d:%d\n", const, force & 0xff));`009\
  178. X`009`009force -= 0x100;`009`009`009`009`009\
  179. X`009`009if (force < 0x100) force = -1;`009/* give up */`009\
  180. X`009    `125 else`009`009`009`009`009`009\
  181. X`009`009force = -1;`009`009`009`009`009\
  182. X`009`125`009`009`009`009`009`009`009\
  183. X`125
  184. X#define FCHECK_TRACT(flag, force, const) `123`009`009`009\
  185. X`009if (force > 0) `123`009`009`009`009`009\
  186. X`009    if (((me->p_flags & flag) && 1) `094 ((force & 0xff) && 1)) `123`009
  187. V\
  188. X`009`009tractorReq.type = const;`009`009`009\
  189. X`009`009tractorReq.state = ((force & 0xff) >= 0x40);`009\
  190. X`009`009tractorReq.pnum = (force & 0xff) & (`1260x40);`009\
  191. X`009`009sendServerPacket(&tractorReq);`009`009`009\
  192. X`009`009V_UDPDIAG(("Forced %d:%d/%d\n", const,`009`009\
  193. X`009`009`009tractorReq.state, tractorReq.pnum));`009\
  194. X`009`009force -= 0x100;`009`009`009`009`009\
  195. X`009`009if (force < 0x100) force = -1;`009/* give up */`009\
  196. X`009    `125 else`009`009`009`009`009`009\
  197. X`009`009force = -1;`009`009`009`009`009\
  198. X`009`125`009`009`009`009`009`009`009\
  199. X`125
  200. X
  201. XcheckForce()
  202. X`123
  203. X    struct speed_cpacket speedReq;
  204. X    struct tractor_cpacket tractorReq;
  205. X
  206. X    FCHECK_VAL(me->p_speed, fSpeed, CP_SPEED);`009/* almost always repeats *
  207. V/
  208. X    FCHECK_VAL(me->p_dir, fDirection, CP_DIRECTION);`009/* (ditto) */
  209. X    FCHECK_FLAGS(PFSHIELD, fShield, CP_SHIELD);
  210. X    FCHECK_FLAGS(PFORBIT, fOrbit, CP_ORBIT);
  211. X    FCHECK_FLAGS(PFREPAIR, fRepair, CP_REPAIR);
  212. X    FCHECK_FLAGS(PFBEAMUP, fBeamup, CP_BEAM);
  213. X    FCHECK_FLAGS(PFBEAMDOWN, fBeamdown, CP_BEAM);
  214. X    FCHECK_FLAGS(PFCLOAK, fCloak, CP_CLOAK);
  215. X    FCHECK_FLAGS(PFBOMB, fBomb, CP_BOMB);
  216. X    FCHECK_FLAGS(PFDOCKOK, fDockperm, CP_DOCKPERM);
  217. X    FCHECK_VAL(phasers`091me->p_no`093.ph_status, fPhaser, CP_PHASER);/* bug
  218. V: dir 0 */
  219. X    FCHECK_VAL(plasmatorps`091me->p_no`093.pt_status, fPlasma, CP_PLASMA); /
  220. V*(ditto)*/
  221. X    FCHECK_FLAGS(PFPLOCK, fPlayLock, CP_PLAYLOCK);
  222. X    FCHECK_FLAGS(PFPLLOCK, fPlanLock, CP_PLANLOCK);
  223. X
  224. X    FCHECK_TRACT(PFTRACT, fTractor, CP_TRACTOR);
  225. X    FCHECK_TRACT(PFPRESS, fRepress, CP_REPRESS);
  226. X`125
  227. X connectToServer(port)
  228. Xint port;
  229. X`123
  230. X    int s;
  231. X    struct sockaddr_in addr;
  232. X    struct sockaddr_in naddr;
  233. X    int len;
  234. X/*    int readfds;*/
  235. X    fd_set readfds;
  236. X    struct timeval timeout;
  237. X    struct hostent *hp;
  238. X
  239. X    serverDead=0;
  240. X    if (sock!=-1) `123
  241. X`009shutdown(sock, 2);
  242. X`009sock= -1;
  243. X    `125
  244. X    sleep(3);`009`009/* I think this is necessary for some unknown reason */
  245. X
  246. X    printf("Waiting for connection (port %d).\n", port);
  247. X
  248. X    if ((s=socket(AF_INET, SOCK_STREAM, 0)) < 0) `123
  249. X`009printf("I can't create a socket\n");
  250. X`009exit(2);
  251. X    `125
  252. X
  253. X    addr.sin_family = AF_INET;
  254. X    addr.sin_addr.s_addr = INADDR_ANY;
  255. X    addr.sin_port = htons(port);
  256. X
  257. X    if (bind(s, &addr, sizeof(addr)) < 0) `123
  258. X`009sleep(10);
  259. X`009if (bind(s, &addr, sizeof(addr)) < 0) `123
  260. X`009    sleep(10);
  261. X`009    if (bind(s, &addr, sizeof(addr)) < 0) `123
  262. X`009`009printf("I can't bind to port!\n");
  263. X`009`009exit(3);
  264. X`009    `125
  265. X`009`125
  266. X    `125
  267. X
  268. X    listen(s,1);
  269. X
  270. X    len=sizeof(naddr);
  271. X
  272. Xtryagain:
  273. X    timeout.tv_sec=240;`009/* four minutes */
  274. X    timeout.tv_usec=0;
  275. X/*    readfds=(1<<s);*/
  276. X    FD_ZERO(&readfds);
  277. X    FD_SET(s, &readfds);
  278. X    if (select(32, &readfds, NULL, NULL, &timeout) == 0) `123
  279. X`009printf("Well, I think the server died!\n");
  280. X`009exit(0);
  281. X    `125
  282. X
  283. X    sock=accept(s,&naddr,&len);
  284. X
  285. X    if (sock==-1) `123
  286. X`009extern int errno;
  287. X`009printf("Augh!  Bad accept: %d\n", errno);
  288. X`009goto tryagain;
  289. X    `125
  290. X
  291. X/*    printf("Got connection.\n");*/
  292. X
  293. X    close(s);
  294. X    pickSocket(port);`009/* new socket != port */
  295. X
  296. X    /*
  297. X     * This isn't strictly necessary; it tries to determine who the
  298. X     * caller is, and set "serverName" and "serveraddr" appropriately.
  299. X     */
  300. X    len = sizeof(struct sockaddr_in);
  301. X    if (getpeername(sock, (struct sockaddr *) &addr, &len) < 0) `123
  302. X`009perror("unable to get peername");
  303. X`009serverName = "nowhere";
  304. X    `125 else `123
  305. X`009serveraddr = addr.sin_addr.s_addr;
  306. X`009hp = gethostbyaddr((char *)&addr.sin_addr.s_addr, sizeof(long),AF_INET);
  307. X`009if (hp != NULL) `123
  308. X`009    serverName = (char *) malloc(strlen(hp->h_name)+1);
  309. X`009    strcpy(serverName, hp->h_name);
  310. X`009`125 else `123
  311. X`009    serverName = (char *) malloc(strlen(inet_ntoa(addr.sin_addr))+1);
  312. X`009    strcpy(serverName, inet_ntoa(addr.sin_addr));
  313. X`009`125
  314. X    `125
  315. X    printf("Got connection from server %s (0x%x)\n", serverName, serveraddr)
  316. V;
  317. X`125
  318. X
  319. XcallServer(port, server)
  320. Xint port;
  321. Xchar *server;
  322. X`123
  323. X    int s;
  324. X    struct sockaddr_in addr;
  325. X    struct hostent *hp;
  326. X
  327. X    serverDead=0;
  328. X
  329. X    printf("Calling %s on port %d.\n", server, port);
  330. X
  331. X    if ((s=socket(AF_INET, SOCK_STREAM, 0)) < 0) `123
  332. X`009printf("I can't create a socket\n");
  333. X`009exit(0);
  334. X    `125
  335. X
  336. X    addr.sin_family = AF_INET;
  337. X    addr.sin_port = htons(port);
  338. X   `032
  339. X    if ((addr.sin_addr.s_addr = inet_addr(server)) == -1) `123
  340. X`009if ((hp = gethostbyname(server)) == NULL) `123
  341. X`009    printf("Who is %s?\n", server);
  342. X`009    exit(0);
  343. X`009`125 else `123
  344. X`009    addr.sin_addr.s_addr = *(long *) hp->h_addr;
  345. X`009`125
  346. X    `125
  347. X    serveraddr = addr.sin_addr.s_addr;
  348. X
  349. X    if (connect(s, &addr, sizeof(addr)) < 0) `123
  350. X`009printf("Server not listening!\n");
  351. X`009printf("(you may need to run 'xstartd')\n");
  352. X`009exit(0);
  353. X    `125
  354. X
  355. X    printf("Got connection. \n");
  356. X
  357. X    sock=s;
  358. X    pickSocket(port);`009/* new socket != port */
  359. X`125
  360. X
  361. XisServerDead()
  362. X`123
  363. X    return(serverDead);
  364. X`125
  365. X
  366. XsocketPause()
  367. X`123
  368. X    struct timeval timeout;
  369. X/*    int readfds;*/
  370. X    fd_set readfds;
  371. X
  372. X    timeout.tv_sec=1;
  373. X    timeout.tv_usec=0;
  374. X/*    readfds = 1<<sock;*/
  375. X    FD_ZERO(&readfds);
  376. X    FD_SET(sock, &readfds);
  377. X    select(32,&readfds,0,0,&timeout);
  378. X`125
  379. X
  380. XreadFromServer()
  381. X`123
  382. X    struct timeval timeout;
  383. X    fd_set readfds;
  384. X    int retval = 0;
  385. X
  386. X    if (serverDead) return(0);
  387. X    if (commMode == COMM_TCP) drop_flag=0;`009/* just in case */
  388. X    timeout.tv_sec=1;
  389. X    timeout.tv_usec=0;
  390. X/*    readfds = 1<<sock;*/
  391. X    FD_ZERO(&readfds);
  392. X    FD_SET(sock, &readfds);
  393. X    if (udpSock >= 0)
  394. X`009FD_SET(udpSock, &readfds);
  395. X/* readfds = 1<<sock; */
  396. X/* printf("1) readfds ar/*%x\n", readfds */
  397. X    `009FD_ISSET(sock,`009`009&readfds);
  398. X   if (select(32,&readfds,0,0,&timeout) != 0) `123
  399. X`009/* Read info from the xtrek server */
  400. X`009if (FD_ISSET(sock, &readfds)) `123
  401. X`009    chan = sock;
  402. X`009    retval += doRead(sock);
  403. X        `125
  404. X`009if (udpSock >= 0 && FD_ISSET(udpSock, &readfds)) `123
  405. X`009    V_UDPDIAG(("Activity on UDP socket\n"));
  406. X`009    chan = udpSock;
  407. X`009    if (commStatus == STAT_VERIFY_UDP) `123
  408. X`009`009warning("UDP connection established");
  409. X`009`009sequence = 0;`009`009/* reset sequence #s */
  410. X`009`009resetForce();
  411. X`009`009commMode = COMM_UDP;
  412. X`009`009commStatus = STAT_CONNECTED;
  413. X`009`009commSwitchTimeout = 0;
  414. X`009`009if (udpClientRecv != MODE_SIMPLE)
  415. X`009`009    sendUdpReq(COMM_MODE + udpClientRecv);
  416. X`009`009if (udpWin) `123
  417. X`009`009    udprefresh(UDP_CURRENT);
  418. X`009`009    udprefresh(UDP_STATUS);
  419. X`009`009`125
  420. X`009    `125
  421. X`009    retval += doRead(udpSock);
  422. X`009`125
  423. X    `125
  424. X
  425. +-+-+-+-+-+-+-+-  END  OF PART 39 +-+-+-+-+-+-+-+-
  426.