home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / vmstrek / part41 < prev    next >
Encoding:
Internet Message Format  |  1992-11-20  |  14.4 KB

  1. Path: 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 41/47
  4. Message-ID: <1992Nov20.205601.1@acad2.alaska.edu>
  5. From: asdmf@acad2.alaska.edu
  6. Date: Sat, 21 Nov 1992 00:56:01 GMT
  7. Sender: news@raven.alaska.edu (USENET News System)
  8. Organization: University of Alaska
  9. Nntp-Posting-Host: acad2.alaska.edu
  10. Lines: 522
  11. Xref: uunet vmsnet.sources.games:541
  12.  
  13. -+-+-+-+-+-+-+-+ START OF PART 41 -+-+-+-+-+-+-+-+
  14. X    struct tractor_cpacket tractorReq;
  15. X
  16. X    tractorReq.type=CP_TRACTOR;
  17. X    tractorReq.state=state;
  18. X    tractorReq.pnum=pnum;
  19. X    sendServerPacket(&tractorReq);
  20. X
  21. X    if (state)
  22. X`009fTractor = pnum `124 0x40;
  23. X    else
  24. X`009fTractor = 0;
  25. X`125
  26. X
  27. XsendRepressReq(state, pnum)
  28. Xchar state;
  29. Xchar pnum;
  30. X`123
  31. X    struct repress_cpacket repressReq;
  32. X
  33. X    repressReq.type=CP_REPRESS;
  34. X    repressReq.state=state;
  35. X    repressReq.pnum=pnum;
  36. X    sendServerPacket(&repressReq);
  37. X
  38. X    if (state)
  39. X`009fRepress = pnum `124 0x40;
  40. X    else
  41. X`009fRepress = 0;
  42. X`125
  43. X
  44. XsendDetMineReq(torp)
  45. Xshort torp;
  46. X`123
  47. X    struct det_mytorp_cpacket detReq;
  48. X
  49. X    detReq.type=CP_DET_MYTORP;
  50. X    detReq.tnum=htons(torp);
  51. X    sendServerPacket(&detReq);
  52. X`125
  53. X
  54. XhandlePlasmaInfo(packet)
  55. Xstruct plasma_info_spacket *packet;
  56. X`123
  57. X    struct plasmatorp *thetorp;
  58. X
  59. X    thetorp= &plasmatorps`091ntohs(packet->pnum)`093;
  60. X    if (packet->status == PTEXPLODE && thetorp->pt_status == PTFREE) `123
  61. X`009/* FAT: redundant explosion; don't update p_nplasmatorp */
  62. X`009return;
  63. X    `125
  64. X    if (!thetorp->pt_status && packet->status) `123
  65. X`009players`091thetorp->pt_owner`093.p_nplasmatorp++;
  66. X    `125
  67. X    if (thetorp->pt_status && !packet->status) `123
  68. X`009players`091thetorp->pt_owner`093.p_nplasmatorp--;
  69. X    `125
  70. X    thetorp->pt_war=packet->war;
  71. X    if (thetorp->pt_status != packet->status) `123
  72. X`009/* FAT: prevent explosion timer from being reset */
  73. X`009thetorp->pt_status=packet->status;
  74. X`009if (thetorp->pt_status == PTEXPLODE) `123
  75. X`009    thetorp->pt_fuse=NUMDETFRAMES;
  76. X`009`125
  77. X    `125
  78. X`125
  79. X
  80. XhandlePlasma(packet)
  81. Xstruct plasma_spacket *packet;
  82. X`123
  83. X    struct plasmatorp *thetorp;
  84. X
  85. X    thetorp= &plasmatorps`091ntohs(packet->pnum)`093;
  86. X    thetorp->pt_x=ntohl(packet->x);
  87. X    thetorp->pt_y=ntohl(packet->y);
  88. X`125
  89. X
  90. XhandleFlags(packet)
  91. Xstruct flags_spacket *packet;
  92. X`123
  93. X    if (players`091packet->pnum`093.p_flags != ntohl(packet->flags) `124`124
  94. X`009players`091packet->pnum`093.p_tractor != ((short)packet->tractor & (`126
  95. V0x40)))`123
  96. X`009/* FAT: prevent redundant player update */
  97. X
  98. X`009redrawPlayer`091packet->pnum`093=1;
  99. X    `125
  100. X
  101. X    players`091packet->pnum`093.p_flags=ntohl(packet->flags);
  102. X#ifdef INCLUDE_VISTRACT
  103. X    if (packet->tractor & 0x40)
  104. X`009players`091packet->pnum`093.p_tractor=(short) packet->tractor & (`1260x4
  105. V0); /* ATM - visible tractors */
  106. X    else
  107. X#endif
  108. X`009players`091packet->pnum`093.p_tractor = -1;
  109. X    /*redrawPlayer`091packet->pnum`093=1;*/
  110. X`125
  111. X
  112. XhandleKills(packet)
  113. Xstruct kills_spacket *packet;
  114. X`123
  115. X    if (players`091packet->pnum`093.p_kills != ntohl(packet->kills)/100.0) `
  116. V123
  117. X`009/* FAT: prevent redundant player update */
  118. X`009players`091packet->pnum`093.p_kills=ntohl(packet->kills)/100.0;
  119. X`009updatePlayer`091packet->pnum`093=1;
  120. X    `125
  121. X`125
  122. X
  123. XhandlePStatus(packet)
  124. Xstruct pstatus_spacket *packet;
  125. X`123
  126. X    if (packet->status==PEXPLODE) `123
  127. X`009players`091packet->pnum`093.p_explode=0;
  128. X    `125
  129. X    /* Ignore DEAD status.
  130. X     * Instead, we treat it as PEXPLODE.
  131. X     * This gives us time to animate all the frames necessary for`032
  132. X     *  the explosions at our own pace.
  133. X     */
  134. X    if (packet->status==PDEAD) `123
  135. X`009packet->status=PEXPLODE;
  136. X    `125
  137. X    players`091packet->pnum`093.p_status=packet->status;
  138. X    redrawPlayer`091packet->pnum`093=1;
  139. X    updatePlayer`091packet->pnum`093=1;
  140. X`125
  141. X
  142. XhandleMotd(packet)
  143. Xstruct motd_spacket *packet;
  144. X`123
  145. X    newMotdLine(packet->line);
  146. X`125
  147. X
  148. XsendMessage(mes, group, indiv)
  149. Xchar *mes;
  150. Xint group, indiv;
  151. X`123
  152. X    struct mesg_cpacket mesPacket;
  153. X
  154. X    mesPacket.type=CP_MESSAGE;
  155. X    mesPacket.group=group;
  156. X    mesPacket.indiv=indiv;
  157. X    strcpy(mesPacket.mesg, mes);
  158. X    sendServerPacket(&mesPacket);
  159. X`125
  160. X
  161. XhandleMask(packet)
  162. Xstruct mask_spacket *packet;
  163. X`123
  164. X    tournMask=packet->mask;
  165. X`125
  166. X
  167. XsendOptionsPacket()
  168. X`123
  169. X    struct options_cpacket optPacket;
  170. X
  171. X    optPacket.type=CP_OPTIONS;
  172. X    optPacket.flags =`032
  173. X`009htonl(ST_MAPMODE * (mapmode!=0) +
  174. X`009ST_NAMEMODE * namemode +
  175. X`009ST_SHOWSHIELDS * showShields +
  176. X`009ST_KEEPPEACE * keeppeace +`032
  177. X`009ST_SHOWLOCAL * showlocal +
  178. X`009ST_SHOWGLOBAL * showgalactic);
  179. X    bcopy(mystats->st_keymap, optPacket.keymap, 96);
  180. X    sendServerPacket(&optPacket);
  181. X`125
  182. X
  183. XpickSocket(old)
  184. Xint old;
  185. X`123
  186. X    int newsocket;
  187. X    struct socket_cpacket sockPack;
  188. X
  189. X    newsocket=(getpid() & 32767);
  190. X    while (newsocket < 2048 `124`124 newsocket==old) `123
  191. X`009newsocket=(newsocket + 10687) & 32767;
  192. X    `125
  193. X    sockPack.type=CP_SOCKET;
  194. X    sockPack.socket=htonl(newsocket);
  195. X    sockPack.version=(char) SOCKVERSION;
  196. X    sockPack.udp_version=(char) UDPVERSION;
  197. X    sendServerPacket(&sockPack);
  198. X    /* Did we get new socket # sent? */
  199. X    if (serverDead) return;
  200. X    nextSocket=newsocket;
  201. X`125
  202. X
  203. XhandleBadVersion(packet)
  204. Xstruct badversion_spacket *packet;
  205. X`123
  206. X    switch(packet->why) `123
  207. X    case 0:
  208. X`009printf("Sorry, this is an invalid client version.\n");
  209. X`009printf("You need a new version of the client code.\n");
  210. X`009break;
  211. X    default:
  212. X`009printf("Sorry, but you cannot play xtrek now.\n");
  213. X`009printf("Try again later.\n");
  214. X`009break;
  215. X    `125
  216. X    exit(1);
  217. X`125
  218. X
  219. Xgwrite(fd, buf, bytes)
  220. Xint fd;
  221. Xchar *buf;
  222. Xregister int bytes;
  223. X`123
  224. X    long orig = bytes;
  225. X    register long n;
  226. X    while (bytes) `123
  227. X        n = send(fd, buf, bytes,0);
  228. X        if (n < 0) `123
  229. X            if (fd == udpSock) `123
  230. X                fprintf(stderr, "Tried to write %d, 0x%x, %d (error %d)\n",
  231. X                    fd, buf, bytes, errno);
  232. X                printUdpInfo();
  233. X            `125
  234. X`009    printf("fd=%d\n", fd);
  235. X            perror("reason gwrite failed");
  236. X            return(-1);
  237. X        `125
  238. X        bytes -= n;
  239. X        buf += n;
  240. X    `125
  241. X    return(orig);
  242. X`125
  243. X
  244. XhandleHostile(packet)
  245. Xstruct hostile_spacket *packet;
  246. X`123
  247. X    register struct player *pl;
  248. X
  249. X    pl= &players`091packet->pnum`093;
  250. X    if (pl->p_swar != packet->war `124`124
  251. X`009pl->p_hostile != packet->hostile) `123
  252. X`009/* FAT: prevent redundant player update & redraw */
  253. X`009updatePlayer`091packet->pnum`093=1;
  254. X`009pl->p_swar=packet->war;
  255. X`009pl->p_hostile=packet->hostile;
  256. X`009redrawPlayer`091packet->pnum`093=1;
  257. X    `125
  258. X`125
  259. X
  260. XhandlePlyrLogin(packet)
  261. Xstruct plyr_login_spacket *packet;
  262. X`123
  263. X    register struct player *pl;
  264. X
  265. X    updatePlayer`091packet->pnum`093=1;
  266. X    pl= &players`091packet->pnum`093;
  267. X
  268. X    strcpy(pl->p_name, packet->name);
  269. X    strcpy(pl->p_monitor, packet->monitor);
  270. X    strcpy(pl->p_login, packet->login);
  271. X    pl->p_stats.st_rank=packet->rank;
  272. X    if (packet->pnum == me->p_no) `123
  273. X`009/* This is me.  Set some stats */
  274. X`009if (lastRank== -1) `123
  275. X`009    if (loggedIn) `123
  276. X`009`009lastRank=packet->rank;
  277. X`009    `125
  278. X`009`125 else `123
  279. X`009    if (lastRank != packet->rank) `123
  280. X`009`009lastRank=packet->rank;
  281. X`009`009promoted=1;
  282. X`009    `125
  283. X`009`125
  284. X    `125
  285. X`125
  286. X
  287. XhandleStats(packet)
  288. Xstruct stats_spacket *packet;
  289. X`123
  290. X    register struct player *pl;
  291. X
  292. X    updatePlayer`091packet->pnum`093=1;
  293. X    pl= &players`091packet->pnum`093;
  294. X    pl->p_stats.st_tkills=ntohl(packet->tkills);
  295. X    pl->p_stats.st_tlosses=ntohl(packet->tlosses);
  296. X    pl->p_stats.st_kills=ntohl(packet->kills);
  297. X    pl->p_stats.st_losses=ntohl(packet->losses);
  298. X    pl->p_stats.st_tticks=ntohl(packet->tticks);
  299. X    pl->p_stats.st_tplanets=ntohl(packet->tplanets);
  300. X    pl->p_stats.st_tarmsbomb=ntohl(packet->tarmies);
  301. X    pl->p_stats.st_sbkills=ntohl(packet->sbkills);
  302. X    pl->p_stats.st_sblosses=ntohl(packet->sblosses);
  303. X    pl->p_stats.st_armsbomb=ntohl(packet->armies);
  304. X    pl->p_stats.st_planets=ntohl(packet->planets);
  305. X    pl->p_stats.st_maxkills=ntohl(packet->maxkills) / 100.0;
  306. X    pl->p_stats.st_sbmaxkills=ntohl(packet->sbmaxkills) / 100.0;
  307. X`125
  308. X
  309. XhandlePlyrInfo(packet)
  310. Xstruct plyr_info_spacket *packet;
  311. X`123
  312. X    register struct player *pl;
  313. X    static int lastship= -1;
  314. X
  315. X    updatePlayer`091packet->pnum`093=1;
  316. X    pl= &players`091packet->pnum`093;
  317. X    getship(&pl->p_ship, packet->shiptype);
  318. X    pl->p_team=packet->team;
  319. X    pl->p_mapchars`0910`093=teamlet`091pl->p_team`093;
  320. X    pl->p_mapchars`0911`093=shipnos`091pl->p_no`093;
  321. X    if (me==pl && lastship!=me->p_ship.s_type) `123
  322. X`009calibrate_stats();
  323. X`009redrawTstats();
  324. X    `125
  325. X    redrawPlayer`091packet->pnum`093=1;
  326. X`125
  327. X
  328. XsendUpdatePacket(speed)
  329. Xlong speed;
  330. X`123
  331. X    struct updates_cpacket packet;
  332. X
  333. X    packet.type=CP_UPDATES;
  334. X    timerDelay=speed;
  335. X    packet.usecs=htonl(speed);
  336. X    sendServerPacket(&packet);
  337. X`125
  338. X
  339. XhandlePlanetLoc(packet)
  340. Xstruct planet_loc_spacket *packet;
  341. X`123
  342. X    struct planet *pl;
  343. X
  344. X    pl= &planets`091packet->pnum`093;
  345. X    pl->pl_x=ntohl(packet->x);
  346. X    pl->pl_y=ntohl(packet->y);
  347. X    strcpy(pl->pl_name, packet->name);
  348. X    pl->pl_namelen=strlen(packet->name);
  349. X    pl->pl_flags`124=PLREDRAW;
  350. X    reinitPlanets=1;
  351. X`125
  352. X
  353. XhandleReserved(packet)
  354. Xstruct reserved_spacket *packet;
  355. X`123
  356. X    struct reserved_cpacket response;
  357. X
  358. X    encryptReservedPacket(packet, &response, serverName, me->p_no);
  359. X    sendServerPacket(&response);
  360. X`125
  361. X
  362. X#ifdef INCLUDE_SCAN
  363. XhandleScan(packet)
  364. Xstruct scan_spacket *packet;
  365. X`123
  366. X    struct player *pp;
  367. X
  368. X    if (packet->success) `123
  369. X`009pp = &players`091packet->pnum`093;
  370. X`009pp->p_fuel = ntohl(packet->p_fuel);
  371. X`009pp->p_armies = ntohl(packet->p_armies);
  372. X`009pp->p_shield = ntohl(packet->p_shield);
  373. X`009pp->p_damage = ntohl(packet->p_damage);
  374. X`009pp->p_etemp = ntohl(packet->p_etemp);
  375. X`009pp->p_wtemp = ntohl(packet->p_wtemp);
  376. X`009informScan(packet->pnum);
  377. X    `125
  378. X`125
  379. X#endif
  380. X
  381. X/*
  382. X * -------------------------------------------------------------------------
  383. V--
  384. X *`009UDP stuff from here on
  385. X * -------------------------------------------------------------------------
  386. V--
  387. X */
  388. X
  389. XsendUdpReq(req)
  390. Xint req;
  391. X`123
  392. X    struct udp_req_cpacket packet;
  393. X
  394. X    packet.type = CP_UDP_REQ;
  395. X    packet.request = req;
  396. X
  397. X    if (req >= COMM_MODE) `123
  398. X`009packet.request = COMM_MODE;
  399. X`009packet.connmode = req - COMM_MODE;
  400. X`009sendServerPacket(&packet);
  401. X`009return;
  402. X    `125
  403. X
  404. X    if (req == COMM_UPDATE) `123
  405. X`009sendServerPacket(&packet);
  406. X`009warning("Sent request for full update");
  407. X`009return;
  408. X    `125
  409. X
  410. X    /*
  411. X     * Past this point, req had better be COMM_TCP or COMM_UDP.
  412. X     */
  413. X
  414. X    if (req == commModeReq) `123
  415. X`009warning("Request is in progress, do not disturb");
  416. X`009return;
  417. X    `125
  418. X
  419. X    if (req == COMM_UDP) `123
  420. X`009/* open UDP port */
  421. X`009if (openUdpConn() >= 0) `123
  422. X`009    UDPDIAG(("Bound to local port %d on fd %d\n",udpLocalPort,udpSock));
  423. X`009`125 else `123
  424. X`009    UDPDIAG(("Bind to local port %d failed\n", udpLocalPort));
  425. X`009    commModeReq = COMM_TCP;
  426. X`009    commStatus = STAT_CONNECTED;
  427. X`009    commSwitchTimeout = 0;
  428. X`009    if (udpWin)
  429. X`009`009udprefresh(UDP_STATUS);
  430. X`009    warning("Unable to establish UDP connection");
  431. X
  432. X`009    return;
  433. X`009`125
  434. X    `125
  435. X
  436. X    /* send the request */
  437. X    packet.port = htonl(udpLocalPort);
  438. X#ifdef GATEWAY
  439. X    if (!strcmp(serverName, gw_mach)) `123
  440. X`009packet.port = htons(gw_serv_port); /* gw port that server should call */
  441. X`009UDPDIAG(("+ Telling server to contact us on %d\n", gw_serv_port));
  442. X    `125
  443. X#endif
  444. X#ifdef USE_PORTSWAP
  445. X    packet.connmode = CONNMODE_PORT;`009`009/* have him send his port */
  446. X#else
  447. X    packet.connmode = CONNMODE_PACKET;`009`009/* we get addr from packet */
  448. X#endif
  449. X    sendServerPacket(&packet);
  450. X
  451. X    /* update internal state stuff */
  452. X    commModeReq = req;
  453. X    if (req == COMM_TCP)
  454. X`009commStatus = STAT_SWITCH_TCP;
  455. X    else
  456. X`009commStatus = STAT_SWITCH_UDP;
  457. X    commSwitchTimeout = 25;`009/* wait 25 updates (about five seconds) */
  458. X    UDPDIAG(("Sent request for %s mode\n", (req == COMM_TCP) ?
  459. X`009"TCP" : "UDP"));
  460. X
  461. X#ifndef USE_PORTSWAP
  462. X    if ((req == COMM_UDP) && recvUdpConn() < 0) `123
  463. X`009UDPDIAG(("Sending TCP reset message\n"));
  464. X`009packet.request = COMM_TCP;
  465. X`009packet.port = 0;
  466. X`009commModeReq = COMM_TCP;
  467. X`009sendServerPacket(&packet);
  468. X`009/* we will likely get a SWITCH_UDP_OK later; better ignore it */
  469. X`009commModeReq = COMM_TCP;
  470. X`009commStatus = STAT_CONNECTED;
  471. X`009commSwitchTimeout = 0;
  472. X    `125
  473. X#endif
  474. X
  475. X    if (udpWin)
  476. X`009udprefresh(UDP_STATUS);
  477. X`125
  478. X
  479. XhandleUdpReply(packet)
  480. Xstruct udp_reply_spacket *packet;
  481. X`123
  482. X    struct udp_req_cpacket response;
  483. X
  484. X    UDPDIAG(("Received UDP reply %d\n", packet->reply));
  485. X    commSwitchTimeout = 0;
  486. X
  487. X    response.type = CP_UDP_REQ;
  488. X
  489. X    switch (packet->reply) `123
  490. X    case SWITCH_TCP_OK:
  491. X`009if (commMode == COMM_TCP) `123
  492. X`009    UDPDIAG(("Got SWITCH_TCP_OK while in TCP mode; ignoring\n"));
  493. X`009`125 else `123
  494. X`009    commMode = COMM_TCP;
  495. X`009    commStatus = STAT_CONNECTED;
  496. X`009    warning("Switched to TCP-only connection");
  497. X`009    closeUdpConn();
  498. X`009    UDPDIAG(("UDP port closed\n"));
  499. X`009    if (udpWin) `123
  500. X`009`009udprefresh(UDP_STATUS);
  501. X`009`009udprefresh(UDP_CURRENT);
  502. X`009    `125
  503. X`009`125
  504. X`009break;
  505. X    case SWITCH_UDP_OK:
  506. X`009if (commMode == COMM_UDP) `123
  507. X`009    UDPDIAG(("Got SWITCH_UDP_OK while in UDP mode; ignoring\n"));
  508. X`009`125 else `123
  509. X`009    /* the server is forcing UDP down our throat? */
  510. X`009    if (commModeReq != COMM_UDP) `123
  511. X`009`009UDPDIAG(("Got unsolicited SWITCH_UDP_OK; ignoring\n"));
  512. X`009    `125 else `123
  513. X#ifdef USE_PORTSWAP
  514. X`009`009udpServerPort = ntohl(packet->port);
  515. X`009`009if (connUdpConn() < 0) `123
  516. X`009`009    UDPDIAG(("Unable to connect, resetting\n"));
  517. X`009`009    warning("Connection attempt failed");
  518. X`009`009    commModeReq = COMM_TCP;
  519. X`009`009    commStatus = STAT_CONNECTED;
  520. X`009`009    if (udpSock >= 0)
  521. X`009`009`009closeUdpConn(udpSock);
  522. X`009`009    if (udpWin) `123
  523. X`009`009`009udprefresh(UDP_STATUS);
  524. X`009`009`009udprefresh(UDP_CURRENT);
  525. X`009`009    `125
  526. X`009`009    response.request = COMM_TCP;
  527. X`009`009    response.port = 0;
  528. X`009`009    goto send;
  529. X`009`009`125
  530. X#else
  531. X`009`009/* this came down UDP, so we MUST be connected */
  532. X`009`009/* (do the verify thing anyway just for kicks) */
  533. X#endif
  534. +-+-+-+-+-+-+-+-  END  OF PART 41 +-+-+-+-+-+-+-+-
  535.