home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume10 / gb3 / patch2g < prev    next >
Text File  |  1990-08-28  |  60KB  |  2,245 lines

  1. Path: uunet!zephyr.ens.tek.com!tekred!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v11i045:  gb3 - Galactic Bloodshed, an empire-like war game [Ver. 2.0], Patch2g
  5. Message-ID: <6232@tekred.CNA.TEK.COM>
  6. Date: 28 Aug 90 19:36:15 GMT
  7. Sender: news@tekred.CNA.TEK.COM
  8. Lines: 2234
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: VANCLEEF@mps.ohio-state.edu
  12. Posting-number: Volume 11, Issue 45
  13. Archive-name: gb3/Patch2g
  14. Patch-To: gb3: Volume 10, Issue 1-14
  15.  
  16.  
  17.  
  18. #! /bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 7 (of 9)."
  25. # Contents:  client/GB_client.c server/doturn.c server/move.c
  26. #   server/moveship.c server/rst.c server/teleg_send.c
  27. # Wrapped by billr@saab on Tue Aug 28 08:54:58 1990
  28. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  29. if test -f 'client/GB_client.c' -a "${1}" != "-c" ; then 
  30.   echo shar: Renaming existing file \"'client/GB_client.c'\" to \"'client/GB_client.c.orig'\"
  31.   mv -f 'client/GB_client.c' 'client/GB_client.c.orig'
  32. fi
  33. echo shar: Extracting \"'client/GB_client.c'\" \(8287 characters\)
  34. sed "s/^X//" >'client/GB_client.c' <<'END_OF_FILE'
  35. X/************************************************************************/
  36. X/* TinyTalk: the real good stuff (network connections, main loop).     */
  37. X/* */
  38. X/* Version 1.0 [ 1/24/90] : Initial implementation by ABR.         */
  39. X/* 1.1 [ 1/25/90] : Changed for systems without FD_SET.     */
  40. X/* 1.2 [ 1/26/90] : Added "quiet" and "nologin" control.     */
  41. X/* 1.3 [ 1/27/90] : Increased max number of 'quiet' lines.     */
  42. X/* 1.3.1    25-Jul-90    Hubert Bartels
  43. X                hgb@catalina.opt-sci.arizona.edu
  44. X                Added code to complete the map, if the
  45. X                map is sent in two packets.
  46. X*/
  47. X/************************************************************************/
  48. X
  49. X/* particular routines chosen for GB interface by Garrett van Cleef */
  50. X/* modifications for the GB interfacing copyright 1990 Garrett W. van Cleef */
  51. X/* mods on or about 7/90 by Robert Chansky:
  52. X *  added segv, interrupt blocking.
  53. X *  added 'source' command.
  54. X *  allowed host, port settings & defaults.
  55. X *  removed segmentation-fault bug (crashed client on many machines on
  56. X    'orbit' command)
  57. X */
  58. X
  59. X#include "TinyMUD_copyright.h"
  60. X
  61. X#include <sys/types.h>
  62. X#include <sys/time.h>
  63. X#include <sys/socket.h>
  64. X#include <netdb.h>
  65. X#include <netinet/in.h>
  66. X#include <fcntl.h>
  67. X#include <sys/errno.h>
  68. X#include <stdio.h>
  69. X#include <curses.h>
  70. X#include <signal.h>
  71. X#include <setjmp.h>
  72. X#include "client.h"
  73. X
  74. Xint             errno;
  75. X
  76. X/* For BSD 4.2 systems. */
  77. X#ifndef FD_ZERO
  78. X#define OLD_BSD_FDSETS
  79. X#include "ultrix_cpt.h"
  80. X#endif
  81. X/* End of BSD 4.2 systems. */
  82. X
  83. X/*
  84. X    Store the flag if we are in map mode or not, along with the
  85. X    last X and Y plotted. Also store if we have seen the shiftin/out 
  86. X    flag. This helps with the synchronization.
  87. X*/
  88. Xint MAP;
  89. Xint s_in_out;
  90. Xint curX;
  91. Xint curY;
  92. Xint Maxx;
  93. Xint Maxy;
  94. X
  95. X#define REFRESH_TIME 500000    /* Microseconds */
  96. X
  97. X#ifndef GB_HOST
  98. X#define GB_HOST "pooh.caltech.edu"      /* change these for the host system */
  99. X#endif
  100. X#ifndef GB_PORT
  101. X#define GB_PORT "2010"
  102. X#endif
  103. X
  104. Xextern char        *index(), *malloc();
  105. Xextern struct hostent    *gethostbyname();
  106. Xextern unsigned long      inet_addr();
  107. X
  108. Xstatic jmp_buf        int_jmp;
  109. X
  110. Xstatic int      current_socket;
  111. Xstatic int      connected;    /* Are we connected? */
  112. Xhugestr         current_output;    /* Queued as messages arrive. */
  113. Xstatic int      need_refresh;    /* Does input line need refresh? */
  114. Xstatic int      done;        /* Are we all done? */
  115. X
  116. Xmain(argc,argv)
  117. Xint argc;
  118. Xchar *argv[];
  119. X{
  120. X    char *host,*port;
  121. X    extern int MAP;
  122. X    extern int s_in_out;
  123. X    extern int curX;
  124. X    extern int curY;
  125. X
  126. X    initscr();        /* set up screen for graphics */
  127. X    init_keyboard();
  128. X
  129. X    host = GB_HOST;
  130. X    port = GB_PORT;
  131. X
  132. X    MAP = FALSE;        /* Initialize map completion */
  133. X    s_in_out = TRUE;
  134. X    curY = curX = 0;
  135. X
  136. X    if (argc==2) {        /* Load user-specified PORT and HOST */
  137. X      port = argv[1];
  138. X    } else if (argc==3) {
  139. X      host = argv[1], port = argv[2];
  140. X    } else if (argc!=1) {
  141. X      printf("usage: GB host port\n");
  142. X      exit(1);
  143. X    }
  144. X    client(host,port);
  145. X}
  146. X
  147. Xclient(host,port)
  148. Xsmallstr host,port;
  149. X{
  150. X    int        int_handler();
  151. X    int        segflt_handler();
  152. X    int             count;
  153. X    DESCR_MASK      readers, exceptions;
  154. X    struct timeval  refresh_timeout;
  155. X    struct timeval *tv;
  156. X
  157. X    signal(SIGINT, int_handler);    /* go to int_handler on intrpt */
  158. X    /*signal(SIGSEGV, segflt_handler);*/
  159. X
  160. X    printf("           Galactic Bloodshed Client ver %s\n",VERS);
  161. X
  162. X
  163. X    /*sprintf(host, "%s", GB_HOST);
  164. X    sprintf(port, "%s", GB_PORT);*/
  165. X
  166. X    connected = FALSE;
  167. X
  168. X    connect_to(host, port);
  169. X
  170. X    setjmp(int_jmp);    /* set interrupts to go here. */
  171. X
  172. X    *current_output = '\0';    /* No output yet. */
  173. X
  174. X    done = FALSE;
  175. X
  176. X    need_refresh = 0;    /* No keyboard typing yet. */
  177. X
  178. X    do {            /* main loop */
  179. X        FD_ZERO(&readers);
  180. X        FD_ZERO(&exceptions);
  181. X        FD_SET(0, &readers);    /* Check standard input. */
  182. X        FD_SET(current_socket, &readers);    /* Check socket. */
  183. X
  184. X        if (need_refresh) {
  185. X            refresh_timeout.tv_sec = 0;
  186. X            refresh_timeout.tv_usec = REFRESH_TIME;
  187. X            tv = &refresh_timeout;
  188. X        } else
  189. X            tv = NULL;
  190. X
  191. X        count = select(current_socket + 1, &readers, NULL, &exceptions,
  192. X            tv);
  193. X        if (count == -1) {
  194. X            if (errno != EINTR)    /* Control-Z will do this. */
  195. X                perror("select");
  196. X        } else if (count == 0) {
  197. X            do_refresh();
  198. X        } else {
  199. X            /* always check this, even after a command is issued */
  200. X            if (FD_ISSET(current_socket, &readers)) {
  201. X                handle_socket_input();
  202. X            } else if (FD_ISSET(0, &readers)) {
  203. X                /* look for conferencing */
  204. X                if (need_refresh)
  205. X                    do_refresh();
  206. X                handle_keyboard_input();
  207. X            }
  208. X        }
  209. X
  210. X    } while (!done);
  211. X
  212. X    disconnect();
  213. X    cleanup_keyboard();
  214. X}
  215. X
  216. Xconnect_to(host, port)        /* Try to make a connection. */
  217. X    smallstr        host, port;
  218. X{
  219. X    struct in_addr  host_address;
  220. X    struct sockaddr_in socket_address;
  221. X    int             err;
  222. X
  223. X    /* register int current_socket; */
  224. X
  225. X    get_host_address(host, &host_address);
  226. X
  227. X    socket_address.sin_family = AF_INET;
  228. X    socket_address.sin_port = htons(atoi(port));
  229. X    bcopy(&host_address, &socket_address.sin_addr, sizeof(struct in_addr));
  230. X
  231. X    current_socket = socket(AF_INET, SOCK_STREAM, 0);
  232. X    if (current_socket < 0) {
  233. X        perror("Couldn't open socket");
  234. X        die("Exiting.\n");
  235. X    }
  236. X    err = connect(current_socket, &socket_address, 
  237. X        sizeof(struct sockaddr_in));
  238. X    if (err < 0) {
  239. X        perror("Couldn't connect to socket");
  240. X        die("Exiting.\n");
  241. X    }
  242. X    fcntl(current_socket, F_SETFL, FNDELAY);    /* Do we need this? */
  243. X
  244. X    connected = TRUE;
  245. X    return;
  246. X}
  247. X
  248. Xget_host_address(name, addr)    /* Get a host address. */
  249. X    char           *name;
  250. X    struct in_addr *addr;
  251. X{
  252. X    struct hostent *temp;
  253. X    if (*name == '\0')
  254. X        die("No host address specified.\n");
  255. X
  256. X    temp = gethostbyname(name);
  257. X
  258. X    if (temp == NULL)
  259. X        die("Couldn't find host %s.\n", name);
  260. X
  261. X    bcopy(temp->h_addr, addr, sizeof(struct in_addr));
  262. X}
  263. X
  264. X
  265. Xdisconnect()
  266. X{                /* Disconnect from current world. */
  267. X    if (connected)
  268. X        close(current_socket);
  269. X
  270. X    connected = FALSE;
  271. X}
  272. X
  273. Xint 
  274. Xtransmit(s, l)            /* Send a message over the socket. */
  275. X    char           *s;
  276. X    int             l;
  277. X{
  278. X    int             err;
  279. X
  280. X    err = send(current_socket, s, l, 0);
  281. X    if (err == -1)
  282. X        perror("send failed");
  283. X
  284. X    return err;
  285. X}
  286. X
  287. Xint 
  288. Xreceive(s)
  289. X    char           *s;
  290. X{
  291. X    int             count;
  292. X
  293. X    count = recv(current_socket, s, MAXSTRLEN-1, 0);
  294. X    if (count <= 0) {
  295. X        if (errno == EWOULDBLOCK)
  296. X            *s = '\0';
  297. X        else {
  298. X            perror("recv failed");
  299. X        }
  300. X    } else
  301. X        s[count] = '\0';
  302. X
  303. X    if (count <= 0)        /* Don't ask me. */
  304. X        done = TRUE;
  305. X
  306. X    return count;
  307. X}
  308. X
  309. X
  310. Xclear_refresh_pending()
  311. X{
  312. X    need_refresh = 0;
  313. X}
  314. X
  315. Xset_refresh_pending()
  316. X{
  317. X    need_refresh = 1;
  318. X}
  319. X
  320. X
  321. Xstatic string          blob;
  322. Xstatic hugestr         bigblob;
  323. X
  324. Xhandle_socket_input()
  325. X{
  326. X    char           *place;
  327. X
  328. X    receive(blob);
  329. X    strcat(current_output, blob);
  330. X/*
  331. X    Concatenate the packet to the current output buffer. Test for the
  332. X    current type of output. Check if we are going to complete a map
  333. X*/
  334. X    if (current_output[0] != '#'
  335. X         && current_output[0] != '$' && MAP == FALSE) {
  336. X        /* text data coming in */
  337. X
  338. X        place = index(current_output, '\n');    /* Output any whole
  339. X                             * lines.  */
  340. X        if (place != NULL) {
  341. X            erase_keyboard_input();    /* Clear current line. */
  342. X            while (place != NULL) {
  343. X                *place = NULL;
  344. X                print_with_wrap(current_output);
  345. X                strcpy(bigblob, place + 1);
  346. X                    /* Rest of buffer. */
  347. X                strcpy(current_output, bigblob);
  348. X                    /* Copy it back to buffer. */
  349. X                place = index(current_output, '\n');
  350. X            }
  351. X        }
  352. X        if (strlen(current_output) > 0) {
  353. X            printf("%s", current_output);
  354. X        }
  355. X        if (strlen(current_output) > MAXSTRLEN) {
  356. X            /* Too long, flush it. */
  357. X            erase_keyboard_input();    /* Clear current line. */
  358. X            print_with_wrap(current_output);
  359. X        }
  360. X    } else if( MAP == FALSE) {        /* map data coming in */
  361. X        if (current_output[0] == '#') {    /* orbit map */
  362. X            plot_orbit(current_output);
  363. X        } else if (current_output[0] == '$') {    /* planet map */
  364. X            plot_surface(current_output);
  365. X        }
  366. X    } else {                /* complete map */
  367. X            plot_balance(current_output);
  368. X    }
  369. X    *current_output = '\0';    /* Flush the buffer. */
  370. X}
  371. X
  372. X
  373. X/* goes here when ^C is pressed. */
  374. Xint int_handler()
  375. X{
  376. X    int junk;
  377. X    longjmp(int_jmp, junk);
  378. X    /*disconnect();
  379. X    cleanup_keyboard();*/
  380. X}
  381. X
  382. X/* and here when those pesky segmentation faults happen. */
  383. Xint segflt_handler()
  384. X{
  385. Xstatic n=0;
  386. Xint junk;
  387. X
  388. X    /*switch (n) {
  389. X      case 0:
  390. X        printf("Caught one of those pesky segmentation faults.\n");
  391. X        break;
  392. X      case 1:
  393. X        printf("Caught another segmentation fault.\n");
  394. X        break;
  395. X      case 2:
  396. X      default:
  397. X        printf("Yet another segmentation fault.  What a dumb program.\n");
  398. X        break;
  399. X    }
  400. X    n++;*/
  401. X
  402. X    longjmp(int_jmp, junk);
  403. X    /*disconnect();
  404. X    cleanup_keyboard();*/
  405. X}
  406. END_OF_FILE
  407. if test 8287 -ne `wc -c <'client/GB_client.c'`; then
  408.     echo shar: \"'client/GB_client.c'\" unpacked with wrong size!
  409. fi
  410. # end of 'client/GB_client.c'
  411. if test -f 'server/doturn.c' -a "${1}" != "-c" ; then 
  412.   echo shar: Renaming existing file \"'server/doturn.c'\" to \"'server/doturn.c.orig'\"
  413.   mv -f 'server/doturn.c' 'server/doturn.c.orig'
  414. fi
  415. echo shar: Extracting \"'server/doturn.c'\" \(10588 characters\)
  416. sed "s/^X//" >'server/doturn.c' <<'END_OF_FILE'
  417. X/*
  418. X * Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, 
  419. X * smq@ucscb.ucsc.edu, mods by people in GB_copyright.h.
  420. X * Restrictions in GB_copyright.h.
  421. X * doturn -- does one turn.  
  422. X */
  423. X
  424. X#include "GB_copyright.h"
  425. X#define EXTERN extern
  426. X#include "vars.h"
  427. X#include "ships.h"
  428. X#include "races.h"
  429. X#include "doturn.h"
  430. X#include "power.h"
  431. X#include "buffers.h"
  432. X#include <math.h>
  433. Xint doturn_racedata;
  434. X
  435. Xdo_turn()
  436. X{
  437. X int star,i,j,fd, x, y;
  438. X int shdata,stardata,pdata,sectdata;
  439. X boolean err=0;
  440. X shiptype *ship;
  441. X sectortype *p;
  442. X char t_buf[200];
  443. Xint dummy;
  444. X
  445. X         /* make all 0 for first iteration of doplanet */
  446. X bzero((char *)starpopns, sizeof(starpopns));
  447. X bzero((char *)starnumships, sizeof(starnumships));
  448. X bzero((char *)Sdatanumships, sizeof(Sdatanumships));
  449. X bzero((char *)Stinfo, sizeof(Stinfo));
  450. X bzero((char *)StarsInhab, sizeof(StarsInhab));
  451. X bzero((char *)Power, sizeof(Power));
  452. X bzero((char *) inhabited, sizeof(inhabited));
  453. X
  454. Xopenshdata(&shdata);
  455. XNum_ships = Numships(shdata);
  456. Xclose_file(shdata);
  457. X printf("Num ships = %d\n", Num_ships);
  458. X
  459. X    /* do mines */
  460. X        for (i=1; i<=Num_ships; i++)
  461. X        domine(i, 0);
  462. X
  463. Xopenshdata(&shdata);
  464. Xships = (shiptype **)malloc(sizeof(shiptype *) * (Num_ships + 1));
  465. Xfor(i=1; i<=Num_ships;i++) {
  466. X    getship(shdata,&ships[i], i);    
  467. X    }
  468. Xclose_file(shdata);  
  469. X
  470. X/* get all stars and planets */
  471. X openstardata(&stardata);
  472. X getsdata(stardata,&Sdata);
  473. X openpdata(&pdata);
  474. X for (star=0; star<Sdata.numstars; star++) {
  475. X    free(Stars[star]);
  476. X     getstar(stardata, &Stars[star], star);
  477. X/*    fix_stability(Stars[star]);         /* nova */
  478. X     for (i=0; i<Stars[star]->numplanets; i++) {
  479. X        free(planets[star][i]);
  480. X        getplanet(pdata,&planets[star][i],Stars[star]->planetpos[i]);
  481. X        /* move planets in orbit; also sets StarsInhab[] */
  482. X       moveplanet(star, planets[star][i], i);
  483. X    if(Stars[star]->pnames[i]=='\0')
  484. X        sprintf(Stars[star]->pnames[i], "NULL-%d", i);
  485. X    }
  486. X    if(Stars[star]->name[0]=='\0')
  487. X        sprintf(Stars[star]->name, "NULL-%d", star);
  488. X
  489. X    putstar(stardata, Stars[star], star);
  490. X} 
  491. Xclose_file(stardata);
  492. Xclose_file(pdata);
  493. X
  494. X/*printf("doing VN_brain\n");*/
  495. XVN_brain.Most_mad = 0;    /* not mad at anyone for starts */
  496. X
  497. XNum_races = Numraces();
  498. Xprintf("Num_races = %d\n",Num_races);
  499. X
  500. Xopenracedata(&doturn_racedata);
  501. Xfor (i=1; i<=Num_races; i++) {
  502. X    free(races[i-1]);
  503. X    getrace(doturn_racedata, &(races[i-1]),(int)i);
  504. X        /* increase tech; change to something else */
  505. X      races[i-1]->tech += (float)races[i-1]->IQ / 100.0;
  506. X
  507. X        /* add VN program */
  508. X    VN_brain.Total_mad += Sdata.VN_hitlist[i-1];
  509. X        /* find out who they're most mad at */
  510. X    if (VN_brain.Most_mad > 0 && Sdata.VN_hitlist[VN_brain.Most_mad-1] <= Sdata.VN_hitlist[i-1])
  511. X        VN_brain.Most_mad = i;
  512. X
  513. X}
  514. X    close_file(doturn_racedata);
  515. X
  516. X    /* do all ships one turn */
  517. X        for (i=1; i<=Num_ships; i++) {
  518. X/*        printf("ship %d\n",i);*/
  519. X        doship(i,ships[i]);
  520. X      }
  521. X/* erase next ship pointers - reset in insert_sh_... */
  522. X    for (i=1; i<Num_ships;i++) 
  523. X      ships[i]->nextship=0;
  524. X
  525. X    /* clear ship list for insertion */
  526. X Sdata.ships = 0;
  527. X for (star=0; star<Sdata.numstars; star++) {
  528. X    Stars[star]->ships = 0;
  529. X     for (i=0; i<Stars[star]->numplanets; i++) {
  530. X       planets[star][i]->ships = 0;
  531. X    }
  532. X }
  533. X
  534. X     /* insert ship into the list of wherever it might be */
  535. X openshdata(&shdata);
  536. X for (i=Num_ships; i>=1; i--) {
  537. X    if(ships[i]->is_alive && !(ships[i]->type == STYPE_FIGHTER &&
  538. X        ships[i]->object.number4) ) {
  539. X    switch(ships[i]->whatorbits) {
  540. X      case LEVEL_UNIV:
  541. X        insert_sh_univ(&Sdata, ships[i], i);
  542. X        break;
  543. X      case LEVEL_STAR:
  544. X        insert_sh_star(Stars[ships[i]->storbits], ships[i],i);
  545. X        break;
  546. X      case LEVEL_PLAN:
  547. X        insert_sh_plan(planets[ships[i]->storbits][ships[i]->pnumorbits], ships[i],i);
  548. X        break;
  549. X      default:
  550. X        break;
  551. X    }
  552. X    }
  553. X    putship(shdata,ships[i],i);
  554. X }
  555. X close_file(shdata);
  556. X
  557. X
  558. X
  559. X  /* add APs to sdata for ea. player */
  560. X  for (i=1; i<=Num_races; i++) { 
  561. X    int a;
  562. X
  563. X    Blocks[i-1].systems_owned = 0; /* recount systems owned */
  564. X
  565. X if (races[i-1]->Gov_ship && races[i-1]->Gov_ship <= Num_ships &&
  566. X    ships[(int)races[i-1]->Gov_ship] != NULL &&
  567. X    ships[(int)races[i-1]->Gov_ship]->is_alive &&
  568. X    ships[(int)races[i-1]->Gov_ship]->is_docked &&
  569. X    ships[(int)races[i-1]->Gov_ship]->whatdest==LEVEL_PLAN)
  570. X    Sdata.AP[i-1] = MIN(LIMIT_APs, Sdata.AP[i-1] + APadd((int)Sdatanumships[i-1], (int)Sdatapopns[i],races[i-1]) + 1);
  571. X }
  572. X
  573. X for (star=0; star<Sdata.numstars; star++) {
  574. X
  575. X  for (i=0; i<Stars[star]->numplanets; i++) { 
  576. X/*    printf("%s %d\n",Stars[star]->name,i); */
  577. X    if (doplanet(star, planets[star][i], i)) {
  578. X     /* save smap gotten & altered by doplanet only if the planet is expl*/
  579. X        opensectdata(§data);
  580. X        putsmap(sectdata,Smap,planets[star][i]);
  581. X        close_file(sectdata);
  582. X    }
  583. X
  584. X/* store occupation for VPs */
  585. X        for (j=1; j<Num_races; j++)
  586. X            if(planets[star][i]->info[j-1].numsectsowned) setbit(inhabited[star], j);
  587. X
  588. Xopenpdata(&pdata);
  589. X    putplanet(pdata,planets[star][i],Stars[star]->planetpos[i]);
  590. Xclose_file(pdata);
  591. X  }
  592. X
  593. X       /* do AP's for ea. player  */
  594. X  for (i=1; i<=Num_races; i++) {
  595. X
  596. X       if (starpopns[star][i-1])
  597. X       setbit(Stars[star]->inhabited,i);
  598. X       else
  599. X       clrbit(Stars[star]->inhabited,i);
  600. X
  601. X     if (isset(Stars[star]->inhabited, i) ) {
  602. X             Stars[star]->AP[i-1] = MIN(LIMIT_APs, Stars[star]->AP[i-1] + APadd((int)starnumships[star][i-1], (int)starpopns[star][i-1], races[i-1]) + 1);
  603. X       } 
  604. X
  605. X/* compute victory points for the block */
  606. X    if(inhabited[star]) {
  607. X        dummy = (Blocks[i-1].invite & Blocks[i-1].pledge);
  608. X        Blocks[i-1].systems_owned += ((inhabited[star] | dummy) == dummy);
  609. X    }
  610. X   }
  611. X
  612. X
  613. X  openstardata(&stardata);
  614. X  putstar(stardata, Stars[star], star);
  615. X  close_file(stardata);
  616. X}
  617. X
  618. Xopenstardata(&stardata);
  619. X putsdata(stardata,&Sdata);
  620. X close_file(stardata);
  621. X
  622. X
  623. X openshdata(&shdata);
  624. X for (i=1; i<=Num_ships; i++)
  625. X    putship(shdata,ships[i],i);
  626. X
  627. X close_file(shdata);
  628. X
  629. X
  630. Xopenracedata(&doturn_racedata); 
  631. Xfor (i=1; i<=Num_races; i++) {
  632. X    races[i-1]->Thing = 0;
  633. X    putrace(doturn_racedata, races[i-1]);
  634. X    Blocks[i-1].VPs = 10 * Blocks[i-1].systems_owned;
  635. X    }
  636. Xclose_file(doturn_racedata);
  637. X
  638. Xfree(ships);
  639. X
  640. Xcompute_power_blocks();
  641. X
  642. XPutpower(Power);
  643. X
  644. X Putblock(Blocks);
  645. X
  646. Xfor (i=1; i<=Num_races; i++)
  647. X    notify(i, "Finished with update.\n");
  648. X    printf("Finished.\n");
  649. X}
  650. X
  651. X
  652. X
  653. X /* routine for number of AP's to add to each player in ea. system,scaled
  654. X    by amount of crew in their palace */
  655. X
  656. Xint APadd(sh, popn, race)
  657. Xint sh, popn;
  658. Xracetype *race;
  659. X{
  660. X if (race->Gov_ship && race->Gov_ship <= Num_ships &&
  661. X    ships[race->Gov_ship] != NULL &&
  662. X    ships[(int)(race->Gov_ship)]->is_alive &&
  663. X    ships[(int)(race->Gov_ship)]->is_docked &&
  664. X    ships[(int)(race->Gov_ship)]->whatdest==LEVEL_PLAN)
  665. X    return 
  666. X      round_rand( ((float)sh / 10.0 + 5.*(float)log10(1.0+popn)) );
  667. X else    /* dont have an active gov center */
  668. X    return round_rand( 0.25 * ((float)sh / 10.0 + 5.*(float)log10(1.0+popn)) );
  669. X
  670. X}
  671. X
  672. X
  673. X
  674. X    /* fix stability for stars */
  675. Xfix_stability(s)
  676. Xstartype *s;
  677. X{
  678. Xchar buf[100];
  679. Xint a,i;
  680. X
  681. X
  682. X  if (s->nova_stage > 0) {
  683. X
  684. X      if (s->nova_stage > 14) {
  685. X        s->stability = 20;
  686. X        s->nova_stage = 0;
  687. X        sprintf(telegram_buf, "Notice\n");
  688. X        sprintf(buf,"\n  Scientists report that star %s\n", s->name);
  689. X            str_cat(telegram_buf, buf);
  690. X        sprintf(buf, "is no longer undergoing nova.\n");
  691. X            str_cat(telegram_buf, buf);
  692. X        for (i=1; i<=Num_races; i++)
  693. X            push_message(TELEG_PLAYER_AUTO, i, telegram_buf, TELEGRAM);
  694. X
  695. X            /* telegram everyone when nova over? */
  696. X    } else
  697. X        s->nova_stage++;
  698. X
  699. X  } else if (s->stability > 50) {
  700. X    a = int_rand(-1,3);
  701. X        /* nova just starting; notify everyone */
  702. X      if ( (s->stability + a) > 100) {
  703. X        s->stability = 100;
  704. X        s->nova_stage = 1;
  705. X        sprintf(telegram_buf, "***** BULLETIN! ******\n");
  706. X        sprintf(buf,"\n  Scientists report that star %s\n", s->name);
  707. X            str_cat(telegram_buf, buf);
  708. X        sprintf(buf, "is undergoing nova.\n");
  709. X            str_cat(telegram_buf, buf);
  710. X        for (i=1; i<=Num_races; i++)
  711. X    push_message(TELEG_PLAYER_AUTO, i, telegram_buf, TELEGRAM);
  712. X    } else
  713. X        s->stability += a;
  714. X
  715. X  } else { /* this bracket wasn't here */
  716. X
  717. X      a = int_rand(-2,int_rand(0,int_rand(0,1) ) );
  718. X     if ( ((int)s->stability + a) < 0)
  719. X        s->stability = 0;
  720. X    else
  721. X        s->stability += a;
  722. X  } /* nor was this one */
  723. X
  724. X}
  725. X
  726. X
  727. Xdo_reset()
  728. X{
  729. X int star,i,j,fd, x, y;
  730. X int shdata,stardata,pdata,sectdata, racedata;
  731. X boolean err=0;
  732. X shiptype *ship;
  733. X sectortype *p;
  734. X char t_buf[200];
  735. X racetype *r;
  736. Xint dummy;
  737. X
  738. Xopenshdata(&shdata);
  739. XNum_ships = Numships(shdata);
  740. Xclose_file(shdata);
  741. X printf("Num ships = %d\n", Num_ships);
  742. X
  743. Xopenshdata(&shdata);
  744. Xships = (shiptype **)malloc(sizeof(shiptype *) * (Num_ships + 1));
  745. Xfor(i=1; i<=Num_ships;i++) {
  746. X    getship(shdata,&ships[i], i);    
  747. X    }
  748. Xclose_file(shdata);  
  749. X
  750. X/* get all stars and planets */
  751. X openstardata(&stardata);
  752. X getsdata(stardata,&Sdata);
  753. X openpdata(&pdata);
  754. X for (star=0; star<Sdata.numstars; star++) {
  755. X    free(Stars[star]);
  756. X     getstar(stardata, &Stars[star], star);
  757. X     for (i=0; i<Stars[star]->numplanets; i++) {
  758. X        free(planets[star][i]);
  759. X        getplanet(pdata,&planets[star][i],Stars[star]->planetpos[i]);
  760. X    }
  761. X} 
  762. Xclose_file(stardata);
  763. Xclose_file(pdata);
  764. X
  765. X/* erase next ship pointers - reset in insert_sh_... */
  766. X    for (i=1; i<Num_ships;i++) 
  767. X      ships[i]->nextship=0;
  768. X
  769. X    /* clear ship list for insertion */
  770. X Sdata.ships = 0;
  771. X for (star=0; star<Sdata.numstars; star++) {
  772. X    Stars[star]->ships = 0;
  773. X     for (i=0; i<Stars[star]->numplanets; i++) {
  774. X       planets[star][i]->ships = 0;
  775. X    }
  776. X }
  777. X
  778. X     /* insert ship into the list of wherever it might be */
  779. X openshdata(&shdata);
  780. X for (i=Num_ships; i>=1; i--) {
  781. X    if(ships[i]->is_alive && !(ships[i]->type == STYPE_FIGHTER &&
  782. X        ships[i]->object.number4) ) {
  783. X    switch(ships[i]->whatorbits) {
  784. X      case LEVEL_UNIV:
  785. X        insert_sh_univ(&Sdata, ships[i], i);
  786. X        break;
  787. X      case LEVEL_STAR:
  788. X        insert_sh_star(Stars[ships[i]->storbits], ships[i],i);
  789. X        break;
  790. X      case LEVEL_PLAN:
  791. X        insert_sh_plan(planets[ships[i]->storbits][ships[i]->pnumorbits], ships[i],i);
  792. X        break;
  793. X      default:
  794. X        break;
  795. X    }
  796. X    }
  797. X    putship(shdata,ships[i],i);
  798. X }
  799. X close_file(shdata);
  800. X
  801. X
  802. X for (star=0; star<Sdata.numstars; star++) {
  803. Xfor (i=0; i<Stars[star]->numplanets; i++) { 
  804. Xopenpdata(&pdata);
  805. X    putplanet(pdata,planets[star][i],Stars[star]->planetpos[i]);
  806. Xclose_file(pdata);
  807. X  }
  808. X  openstardata(&stardata);
  809. X  putstar(stardata, Stars[star], star);
  810. X  close_file(stardata);
  811. X}
  812. X
  813. Xopenstardata(&stardata);
  814. X putsdata(stardata,&Sdata);
  815. X close_file(stardata);
  816. X
  817. X
  818. X openshdata(&shdata);
  819. X for (i=1; i<=Num_ships; i++)
  820. X    putship(shdata,ships[i],i);
  821. X
  822. X close_file(shdata);
  823. X
  824. Xfree(ships);
  825. X
  826. Xopenracedata(&racedata);
  827. Xfor (i=1; i<=Num_races; i++) {
  828. X    getrace(racedata, &r, i);
  829. X    r->weekly = WEEKLY*60;
  830. X    r->daily = DAILY*60;
  831. X    putrace(racedata, r);
  832. X    notify(i, "Finished with reset.\n");
  833. X    printf("Finished.\n");
  834. X    }
  835. Xclose_file(racedata);
  836. X}
  837. X
  838. END_OF_FILE
  839. if test 10588 -ne `wc -c <'server/doturn.c'`; then
  840.     echo shar: \"'server/doturn.c'\" unpacked with wrong size!
  841. fi
  842. # end of 'server/doturn.c'
  843. if test -f 'server/move.c' -a "${1}" != "-c" ; then 
  844.   echo shar: Renaming existing file \"'server/move.c'\" to \"'server/move.c.orig'\"
  845.   mv -f 'server/move.c' 'server/move.c.orig'
  846. fi
  847. echo shar: Extracting \"'server/move.c'\" \(8766 characters\)
  848. sed "s/^X//" >'server/move.c' <<'END_OF_FILE'
  849. X/*
  850. X** Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, 
  851. X** smq@ucscb.ucsc.edu, mods by people in GB_copyright.h.
  852. X** Restrictions in GB_copyright.h.
  853. X**
  854. X**  move.c -- move population and assault aliens on target sector
  855. X*/
  856. X
  857. X#include "GB_copyright.h"
  858. X#define EXTERN extern
  859. X#include "vars.h"
  860. X#include "ships.h"
  861. X#include "races.h"
  862. X#include "buffers.h"
  863. X#include <signal.h>
  864. X#include <math.h>
  865. X#include <signal.h>
  866. X
  867. Xint move_sectdata,move_pdata, move_racedata;
  868. Xint Defensedata[] = { 1, 1, 3, 2, 2, 4};
  869. Xextern char *Desnames[];
  870. X
  871. Xmove_popn(Playernum,APcount,argn,args)
  872. Xint Playernum;
  873. Xint APcount;
  874. Xint argn;
  875. Xchar args[MAXARGS][COMMANDSIZE];
  876. X{
  877. Xint Assault;    /* unfriendly movement */
  878. Xint casualties,casualties2;
  879. X
  880. Xchar c;
  881. Xplanettype *planet;
  882. Xsectortype *sect,*sect2;
  883. Xboolean legal,planetmod=0,sectmod=0;
  884. Xint people,oldpopn,old2popn,x= -1,y= -1,x2= -1,y2= -1,i,mask;
  885. Xint old2owner, absorbed, casualty_scale;
  886. Xfloat fuel,astrength,dstrength,pris;
  887. Xracetype *Race, *alien;
  888. X
  889. Xmove_sectdata = move_pdata = NEUTRAL_FD;
  890. X
  891. Xif(!(Dir[Playernum-1].level==LEVEL_PLAN))
  892. X    {
  893. X        sprintf(buf,"Wrong scope\n");
  894. X        return;
  895. X    }
  896. X
  897. Xopenpdata(&move_pdata);
  898. Xgetplanet(move_pdata,&planet,Stars[Dir[Playernum-1].snum]->planetpos[Dir[Playernum-1].pnum]);
  899. Xclose_file(move_pdata);
  900. X
  901. Xif (planet->slaved_to>0 && planet->slaved_to != Playernum) {
  902. X    sprintf(buf,"That planet has been enslaved!\n");
  903. X            notify(Playernum, buf);        
  904. X    free(planet);
  905. X    return;
  906. X}
  907. X
  908. X    sscanf(args[1],"%d,%d",&x,&y);
  909. X    if(x < 0 || y < 0 || x > planet->Maxx-1 || y > planet->Maxy-1){
  910. X        sprintf(buf,"Illegal coordinates.\n");
  911. X            notify(Playernum, buf);
  912. X        free(planet);
  913. X        return;
  914. X        }
  915. X
  916. X    opensectdata(&move_sectdata);
  917. X    getsector(move_sectdata,§,planet->sectormappos+(y*planet->Maxx+x)*
  918. X        sizeof(sectortype));
  919. X
  920. X    if(sect->owner != Playernum) {
  921. X    sprintf(buf,"You don't own sector %d,%d!\n",x,y);
  922. X            notify(Playernum, buf);
  923. X    close_file(move_sectdata);
  924. X    free(planet);
  925. X    free(sect);
  926. X    return;
  927. X    }
  928. X    close_file(move_sectdata);    
  929. X
  930. X    sscanf(args[2],"%d,%d",&x2,&y2);
  931. X
  932. X    if(x2 < 0 || y2 < 0 || x2 > planet->Maxx-1 || y2 > planet->Maxy-1){
  933. X        sprintf(buf,"Illegal coordinates.\n");
  934. X            notify(Playernum, buf);
  935. X        free(sect);
  936. X        free(planet);
  937. X        return;
  938. X        }
  939. X
  940. X
  941. X/* check to see if the move is legal */
  942. X     legal = 1;
  943. Xif(abs(y-y2) > 1) legal = 0;
  944. Xelse if(x==x2 && y==y2) legal = 0;
  945. Xelse {
  946. Xif(!((x == 0 && x2 == planet->Maxx-1) ||
  947. X     (x == planet->Maxx-1 && x2 == 0) ||
  948. X     (abs(x-x2) <= 1)) )  legal = 0;
  949. X}
  950. X
  951. Xif(!legal) {
  952. X  sprintf(buf,"Illegal move - to adjacent sectors only!\n");
  953. X        notify(Playernum, buf);
  954. X  free(planet);
  955. X  free(sect);
  956. X  return;
  957. X}
  958. X
  959. X/* ok, the move is legal */
  960. X    opensectdata(&move_sectdata);
  961. X    getsector(move_sectdata,§2,planet->sectormappos+(y2*planet->Maxx+x2)*
  962. X        sizeof(sectortype));
  963. X
  964. X    close_file(move_sectdata);    
  965. X
  966. Xif(argn >= 4) {
  967. X    sscanf(args[3],"%d",&people);
  968. X    if(people < 0)
  969. X    people = sect->popn + people;
  970. X} else
  971. X    people = sect->popn;
  972. X
  973. X
  974. Xif(abs(people) > sect->popn || people <= 0) {
  975. X    sprintf(buf,"Illegal value - sector population is %d\n", sect->popn);
  976. X        notify(Playernum, buf);
  977. X    free(sect);
  978. X    free(sect2);
  979. X    free(planet);
  980. X    return;
  981. X}
  982. X
  983. X    sprintf(buf, "%d population moved.\n", people);
  984. X    notify(Playernum, buf);
  985. X
  986. X
  987. Xif(sect2->owner && sect2->owner != Playernum)
  988. X    Assault = 1;
  989. Xelse
  990. X    Assault = 0;
  991. X
  992. Xif (!enufAP(Playernum,Stars[Dir[Playernum-1].snum]->AP[Playernum-1], APcount)) {
  993. X    free(sect);
  994. X    free(sect2);
  995. X    free(planet);
  996. X    return;
  997. X    }
  998. X    
  999. X    if (Assault) {
  1000. X        sprintf(buf,"Assault!\n");
  1001. X        notify(Playernum, buf);
  1002. X
  1003. X        openracedata(&move_racedata);
  1004. X        getrace(move_racedata, &Race, Playernum);
  1005. X        close_file(move_racedata);
  1006. X
  1007. X        openracedata(&move_racedata);
  1008. X        getrace(move_racedata, &alien, sect2->owner);
  1009. X        close_file(move_racedata);
  1010. X
  1011. X/* races find out about each other */
  1012. X    alien->translate[Playernum-1] = MIN(alien->translate[Playernum-1]+5, 100);
  1013. X    Race->translate[sect2->owner-1] = MIN(Race->translate[sect2->owner-1]+5, 100);
  1014. X
  1015. X        old2owner = sect2->owner;
  1016. X        sect->popn = MAX(0, sect->popn - people);
  1017. X        sprintf(buf,"%d attackers (fighting = %d) vs. %d defenders (fighting = %d)\n",
  1018. X            people,Race->fighters,sect2->popn,alien->fighters);
  1019. X            notify(Playernum, buf);
  1020. X        sprintf(buf,"Attack strength: %.2f   Defense strength: %.2f.\n", 
  1021. X
  1022. X           astrength = (float)people * (float)Race->fighters
  1023. X            * .01 * Race->tech
  1024. X            * .01 * (Race->likes[sect->des]+1.0) *
  1025. X             ((sect->is_wasted ? 0.0 : (float)Defensedata[sect->des]) +1.0),
  1026. X
  1027. X
  1028. X           dstrength =  (float)sect2->popn * (float)alien->fighters
  1029. X            * .01 * alien->tech
  1030. X            * .01 * (alien->likes[sect2->des]+1.0) *
  1031. X             ((sect2->is_wasted ? 0.0 : (float)Defensedata[sect2->des]) + 1.0)
  1032. X            );
  1033. X        notify(Playernum, buf);
  1034. X
  1035. X
  1036. X         /* nuke both populations */
  1037. X    casualty_scale = MIN(people, sect2->popn);
  1038. X
  1039. X        oldpopn = people;
  1040. X        casualties = int_rand(0, round_rand((float)casualty_scale 
  1041. X                * (dstrength+1.0) / (astrength+1.0)));
  1042. X        casualties = MIN(oldpopn, casualties);
  1043. X        people = MAX(0, oldpopn - casualties);
  1044. X
  1045. X
  1046. X           old2popn = sect2->popn;
  1047. X           casualties2 = int_rand(0, round_rand((float)casualty_scale 
  1048. X                * (astrength+1.0) / (dstrength+1.0)));
  1049. X           casualties2 = MIN(old2popn, casualties2);
  1050. X           sect2->popn = MAX(0, old2popn - casualties2);
  1051. X
  1052. X           if (sect2->popn == 0) {     /* we got 'em */
  1053. X            sect2->owner = Playernum;
  1054. X/* mesomorphs absorb the bodies of their victims */
  1055. X            absorbed = 0;
  1056. X            if(Race->Thing) {
  1057. X                absorbed = int_rand(0, old2popn);
  1058. X        sprintf(buf, "%d alien bodies absorbed.\n", absorbed);
  1059. X        notify(Playernum, buf);
  1060. X        sprintf(buf, "Mesomorphs have absorbed %d bodies!!!\n", absorbed);
  1061. X        notify(old2owner, buf);
  1062. X                }
  1063. X                sect2->popn = people+absorbed;
  1064. X           } else {        /* retreat */
  1065. X            absorbed = 0;
  1066. X            if(alien->Thing) {
  1067. X                absorbed = int_rand(0, oldpopn-people);                
  1068. X                sprintf(buf, "%d alien bodies absorbed.\n", absorbed);
  1069. X                notify(old2owner, buf);
  1070. X                sprintf(buf, "Mesomorphs have absorbed %d bodies!!!\n", absorbed);
  1071. X                notify(Playernum, buf);
  1072. X                sect2->popn += absorbed;
  1073. X                }
  1074. X            sect->popn += people;
  1075. X           }
  1076. X
  1077. X
  1078. X        sprintf(telegram_buf,"Assaulted by%s %s [%d] at %s/%s!!!\n",
  1079. X            (isset(alien->allied,Playernum) ? " your ally" :
  1080. X                (isset(alien->atwar,Playernum) ? " your enemy" : "")),
  1081. X                Race->name, Playernum,
  1082. X            Stars[Dir[Playernum-1].snum]->name,
  1083. X            Stars[Dir[Playernum-1].snum]->pnames[Dir[Playernum-1].pnum]);
  1084. X
  1085. X        sprintf(buf,"Sector %d,%d (%s) attacked from sector %d,%d (%s)\n",
  1086. X            x2,y2,Desnames[sect2->des],x,y,Desnames[sect->des]);
  1087. X            str_cat(telegram_buf, buf);
  1088. X
  1089. X        if (sect2->owner==Playernum) {
  1090. X            sprintf(buf,"VICTORY! The sector is yours!\n");
  1091. X                notify(Playernum, buf);
  1092. X            sprintf(buf,"Sector CAPTURED!\n");
  1093. X                str_cat(telegram_buf, buf);
  1094. X            if ((astrength+1.0)/(dstrength+1.0) > 5.0) {
  1095. X                 /* not really exclusive but so what*/
  1096. X                 pris = round_rand((astrength+1.0)/(dstrength+1.0));
  1097. X                 pris = MIN(pris, old2popn);
  1098. X                 if (Race->captured_prisoners[old2owner-1]<100)
  1099. X                   Race->captured_prisoners[old2owner-1]++;
  1100. X                sprintf(buf,"1 prisoner captured!\n");
  1101. X                    notify(Playernum, buf);
  1102. X                sprintf(buf,"1 prisoner captured!\n");
  1103. X                    str_cat(telegram_buf, buf);
  1104. X            }
  1105. X            if (people) {
  1106. X              sprintf(buf,"%d critters move in.\n", people);
  1107. X                notify(Playernum, buf);
  1108. X                    }
  1109. X        } else {
  1110. X            sprintf(buf,"The invasion was repulsed; try again.\n");
  1111. X                notify(Playernum, buf);
  1112. X            sprintf(buf,"You fought them off!\n");
  1113. X                str_cat(telegram_buf, buf);
  1114. X        }
  1115. X
  1116. X        if (sect->popn + people == 0) {
  1117. X            sprintf(buf,"You killed all of them!\n");
  1118. X            str_cat(telegram_buf, buf);
  1119. X/* increase modifier */
  1120. X    Race->translate[old2owner-1] = MIN(Race->translate[old2owner-1]+5, 100);
  1121. X            }
  1122. X
  1123. X        if (people==0) {
  1124. X            sprintf(buf,"Oh no! They killed your party to the last man!\n");
  1125. X                notify(Playernum, buf);
  1126. X/* increase modifier */
  1127. X    alien->translate[Playernum-1] = MIN(alien->translate[Playernum-1]+5, 100);
  1128. X            }
  1129. X
  1130. X        openracedata(&move_racedata);
  1131. X        putrace(move_racedata, alien);
  1132. X        putrace(move_racedata, Race);
  1133. X        close_file(move_racedata);
  1134. X        free(alien);
  1135. X        free(Race);
  1136. X        
  1137. X        sprintf(buf,"Casualties: Yours: %d, Theirs: %d\n", casualties2,casualties);
  1138. X            str_cat(telegram_buf, buf);
  1139. X        if(!notify(old2owner, telegram_buf))
  1140. X              push_message(TELEG_PLAYER_AUTO, old2owner, telegram_buf, COMBAT);
  1141. X
  1142. X        sprintf(buf,"Casualties: Yours: %d, Theirs: %d\n",
  1143. X            casualties, casualties2);
  1144. X                notify(Playernum, buf);
  1145. X
  1146. X    } else {
  1147. X      sect->popn -= people;
  1148. X      sect2->popn += people;
  1149. X      if(sect2->owner == 0)
  1150. X        sect2->owner = Playernum;
  1151. X    }
  1152. X
  1153. Xif(sect->popn == 0)
  1154. X  sect->owner = 0;
  1155. X
  1156. Xif(sect2->popn == 0)
  1157. X  sect2->owner = 0;
  1158. X    
  1159. X    opensectdata(&move_sectdata);
  1160. X    putsector(move_sectdata,sect,planet->sectormappos+(y*planet->Maxx+x)*
  1161. X        sizeof(sectortype));
  1162. X    putsector(move_sectdata,sect2,planet->sectormappos+(y2*planet->Maxx+x2)*
  1163. X        sizeof(sectortype));
  1164. X    close_file(move_sectdata);    
  1165. X        free(sect);
  1166. X        free(sect2);
  1167. X        free(planet);
  1168. X
  1169. XdeductAPs(Playernum,APcount+Assault, Dir[Playernum-1].snum, 0);
  1170. X
  1171. X
  1172. X}
  1173. X
  1174. X
  1175. X
  1176. END_OF_FILE
  1177. if test 8766 -ne `wc -c <'server/move.c'`; then
  1178.     echo shar: \"'server/move.c'\" unpacked with wrong size!
  1179. fi
  1180. # end of 'server/move.c'
  1181. if test -f 'server/moveship.c' -a "${1}" != "-c" ; then 
  1182.   echo shar: Renaming existing file \"'server/moveship.c'\" to \"'server/moveship.c.orig'\"
  1183.   mv -f 'server/moveship.c' 'server/moveship.c.orig'
  1184. fi
  1185. echo shar: Extracting \"'server/moveship.c'\" \(11633 characters\)
  1186. sed "s/^X//" >'server/moveship.c' <<'END_OF_FILE'
  1187. X/*
  1188. X * Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, 
  1189. X * smq@ucscb.ucsc.edu, mods by people in GB_copyright.h.
  1190. X * Restrictions in GB_copyright.h.
  1191. X *
  1192. X *  moveship -- moves specified ship according to its orders.
  1193. X *    also deducts fuel from the ship's stores.
  1194. X */
  1195. X
  1196. X#include "GB_copyright.h"
  1197. X#define EXTERN extern
  1198. X#include "vars.h"
  1199. X#include "ships.h"
  1200. X#include "races.h"
  1201. X#include "doturn.h"
  1202. X#include "buffers.h"
  1203. X#include <math.h>
  1204. X
  1205. X
  1206. X/* amount to move for each dir level. I arrived on these #'s only after
  1207. X    hours of dilligent tweaking */
  1208. X  /* amount to move for each directory level  */
  1209. Xfloat MoveConsts[] = { 600.0, 300.0, 40.0 };
  1210. X  /* amnt to move for each ship speed level (ordered) */
  1211. Xfloat SpeedConsts[] = { 0.0, 0.61, 1.26, 1.50, 1.73, 1.81, 1.90, 1.93, 1.96, 1.97};
  1212. X  /* amount of fuel it costs to move at speed level */
  1213. X
  1214. X
  1215. XMoveship(shipno,s)
  1216. Xint shipno;
  1217. Xshiptype *s;
  1218. X{
  1219. X double stardist,movedist,truedist,dist,xdest,ydest,sn,cs;
  1220. X float fuse,mfactor,heading, distfac;
  1221. X int destlevel,deststar=0,destpnum=0;
  1222. X boolean move_err = 0;
  1223. X shiptype *dsh;
  1224. X startype *ost,*dst;
  1225. X planettype *opl,*dpl;
  1226. X
  1227. Xif(fabs(s->xpos) > 999999999. || fabs(s->ypos) > 999999999.)
  1228. X    {
  1229. X    printf("we got a problem here!\n");
  1230. X    return;
  1231. X    }
  1232. X
  1233. Xif(s->hyper_drive.on) {     /* do a hyperspace jump */
  1234. X    if(s->hyper_drive.ready) {
  1235. X/* uses up fuel to jump. This is dependent on the mass of the ship
  1236. X   - if you don't have enough fuel for the jump - jump is cancelled
  1237. X   and a message sent to the owner */
  1238. X     dist = sqrt( Distsq(s->xpos, s->ypos,
  1239. X             Stars[s->deststar]->xpos, Stars[s->deststar]->ypos));
  1240. X/* decreased fuel usage for ships with crystals */
  1241. X     distfac = HYPER_DIST_FACTOR * (s->tech + 100.0);
  1242. X     if(s->hyper_drive.mounted && dist > distfac) {
  1243. X        fuse = HYPER_DRIVE_FUEL_USE * sqrt(s->mass)
  1244. X            * (dist/distfac);
  1245. X    } else {
  1246. X        fuse = HYPER_DRIVE_FUEL_USE * sqrt(s->mass)
  1247. X            * (dist/distfac) * (dist/distfac);
  1248. X            }
  1249. X
  1250. X    if(s->fuel < fuse) {
  1251. X          sprintf(telegram_buf,
  1252. X               "%s #%d %s at system %s does not have %.1ff to do hyperspace jump.\n",
  1253. X               Shipnames[s->type], shipno, s->name, prin_ship_orbits(s), fuse);
  1254. X               push_message(TELEG_PLAYER_AUTO, s->owner, telegram_buf, TELEGRAM);
  1255. X        s->hyper_drive.on = 0;
  1256. X        return;
  1257. X        }
  1258. X
  1259. X/* check to see if ship explodes */
  1260. X        
  1261. X
  1262. X           s->fuel -= fuse;
  1263. X           s->mass -= fuse * MASS_FUEL;
  1264. X
  1265. X           heading = atan2( Stars[s->deststar]->xpos - s->xpos,
  1266. X                Stars[s->deststar]->ypos - s->ypos);
  1267. X        sn = sin(heading);
  1268. X        cs = cos(heading);
  1269. X         s->xpos = Stars[s->deststar]->xpos - sn * 0.9 * SYSTEMSIZE;
  1270. X         s->ypos = Stars[s->deststar]->ypos - cs * 0.9 * SYSTEMSIZE;
  1271. X
  1272. X        s->whatorbits = LEVEL_STAR;
  1273. X        s->storbits = s->deststar;
  1274. X
  1275. X        s->hyper_drive.on = 0;
  1276. X        s->hyper_drive.ready = 0;
  1277. X        s->hyper_drive.charge = 0;
  1278. X          sprintf(telegram_buf,"%s #%d %s arrived at system %s.\n",
  1279. X               Shipnames[s->type], shipno, s->name,
  1280. X                prin_ship_orbits(s));
  1281. X        push_message(TELEG_PLAYER_AUTO, s->owner, telegram_buf, TELEGRAM);
  1282. X        } else if(s->hyper_drive.mounted) {
  1283. X                s->hyper_drive.ready = 1;
  1284. X                s->hyper_drive.charge = HYPER_DRIVE_READY_CHARGE;
  1285. X        } else {
  1286. X            if(s->hyper_drive.charge==HYPER_DRIVE_READY_CHARGE)
  1287. X                s->hyper_drive.ready = 1;
  1288. X            else        
  1289. X                s->hyper_drive.charge += 1;
  1290. X
  1291. X              }
  1292. X    return;
  1293. X    }
  1294. X
  1295. X if (s->speed && !s->is_docked && s->is_alive && (s->whatdest!=LEVEL_UNIV
  1296. X        || s->navigate.on) ) {
  1297. X
  1298. X    /* subtract fuel from the ship */
  1299. X   fuse = 0.5 * s->speed * (1 + s->protect.evade) * s->mass * FUEL_USE;
  1300. X
  1301. X   if (s->fuel < fuse) {
  1302. X      /* ship is out of fuel; do whatever it is to do */
  1303. X    if (!s->notified) {
  1304. X      s->notified = 1;
  1305. X      s->fuel = 0.0;        /* in case it's negative */
  1306. X      msg_OOF(s, shipno, telegram_buf);    /* send OOF notify */
  1307. X
  1308. X        /* kill the ship if we lost it and it's expendable */
  1309. X      if (s->whatorbits == LEVEL_UNIV && Shipdata[s->type][ABIL_COST]<=50) {
  1310. X    sprintf(telegram_buf,"Ship #%d has been lost in deep space.\n",shipno);
  1311. X    push_message(TELEG_PLAYER_AUTO, s->owner, telegram_buf, TELEGRAM);
  1312. X        kill_ship(s->owner, s);
  1313. X      }
  1314. X    }
  1315. X    return;
  1316. X   }
  1317. X
  1318. X/*******   move the ship towards dest ******/
  1319. X    if(s->navigate.on){   /* follow navigational orders */
  1320. X    heading = .0174329252*s->navigate.bearing;
  1321. X   mfactor = SHIP_MOVE_SCALE * (1.0 - .01 * s->rad) * (1.0 - .01 * s->damage) 
  1322. X        * SpeedConsts[s->speed] * MoveConsts[s->whatorbits];
  1323. X
  1324. X       s->fuel -= fuse;
  1325. X       s->mass -= fuse * MASS_FUEL;
  1326. X
  1327. X    sn = sin(heading);
  1328. X    cs = cos(heading);
  1329. X       xdest = sn * mfactor;
  1330. X       ydest = cs * mfactor;
  1331. X
  1332. X       s->xpos += xdest;
  1333. X       s->ypos -= ydest;
  1334. X
  1335. X    s->navigate.turns --;
  1336. X    if(s->navigate.turns == 0) s->navigate.on = 0; 
  1337. X
  1338. X} else {  /*        navigate is off            */
  1339. X
  1340. X   switch (s->whatdest) {
  1341. X      case LEVEL_STAR:
  1342. X     destlevel = LEVEL_STAR;
  1343. X     deststar = s->deststar;
  1344. X     xdest = Stars[deststar]->xpos;
  1345. X     ydest = Stars[deststar]->ypos;
  1346. X     break;
  1347. X      case LEVEL_PLAN:
  1348. X     destlevel = LEVEL_PLAN;
  1349. X     deststar = s->deststar;
  1350. X     destpnum = s->destpnum;
  1351. X     xdest = Stars[deststar]->xpos + planets[deststar][destpnum]->xpos;
  1352. X     ydest = Stars[deststar]->ypos + planets[deststar][destpnum]->ypos;
  1353. X     if(sqrt( Distsq(s->xpos, s->ypos, xdest, ydest)) <= DIST_TO_LAND)
  1354. X       destlevel = LEVEL_UNIV;
  1355. X     break;
  1356. X      case LEVEL_SHIP:
  1357. X     dsh = ships[s->destshipno];
  1358. X     destlevel = LEVEL_SHIP;
  1359. X     deststar = dsh->storbits;
  1360. X     destpnum = dsh->pnumorbits;
  1361. X     xdest = dsh->xpos;
  1362. X     ydest = dsh->ypos;
  1363. X     if(sqrt( Distsq(s->xpos, s->ypos, xdest, ydest))==0.0)destlevel = LEVEL_UNIV;
  1364. X     break;
  1365. X      default:
  1366. X     printf("wow, seriously bad error.\n");
  1367. X     return;
  1368. X     break;
  1369. X   }
  1370. X   dst = Stars[deststar];
  1371. X   ost = Stars[s->storbits];
  1372. X   dpl = planets[deststar][destpnum];
  1373. X   opl = planets[s->storbits][s->pnumorbits];
  1374. X
  1375. X
  1376. X/*  update new xpos,ypos */
  1377. X   heading = atan2( xdest-s->xpos, 
  1378. X    ((ydest - s->ypos)==0.0) ? 0.000001 : (ydest-s->ypos) );
  1379. X   mfactor = SHIP_MOVE_SCALE * (1. - .01 * s->rad) * (1. - .01 * s->damage)
  1380. X       * SpeedConsts[s->speed] * MoveConsts[s->whatorbits];
  1381. X
  1382. X
  1383. X   truedist = movedist = sqrt( Distsq(s->xpos, s->ypos, xdest, ydest));
  1384. X
  1385. X
  1386. X    /* keep from ending up in the middle of the system. */
  1387. X    /* Change the distance so that we
  1388. X       don't go all the way into the system. */
  1389. X   if (s->whatorbits==LEVEL_UNIV ||
  1390. X      (destlevel==LEVEL_STAR && s->storbits!=deststar) ||
  1391. X      (destlevel==LEVEL_PLAN && s->storbits!=deststar) &&
  1392. X       truedist >= SYSTEMSIZE)
  1393. X       movedist -= SYSTEMSIZE * 0.90;
  1394. X   else if (destlevel==LEVEL_PLAN && s->whatorbits==LEVEL_STAR &&
  1395. X        s->storbits==deststar && truedist >= PLORBITSIZE)
  1396. X     /* we're in a system, don't go all the way into a planetary
  1397. X        orbit */
  1398. X    movedist -= PLORBITSIZE * 0.90;
  1399. X
  1400. X
  1401. X   if (s->whatdest==LEVEL_SHIP && s->owner!=ships[s->destshipno]->owner
  1402. X    && !isset(races[s->owner-1]->allied, ships[s->destshipno]->owner)
  1403. X          && truedist > SYSTEMSIZE*4.0) {
  1404. X      /* (an allied ship lets you follow it..) */
  1405. X      /* we lost sight of the destination ship. */
  1406. X      /* should change SYSTEMSIZE*1.0 to calculated gun range.. */
  1407. X    s->whatdest = LEVEL_UNIV;
  1408. X    s->protect.evade = 0;
  1409. X       sprintf(telegram_buf,"Telecomm from ship #%d at %s\n\n", 
  1410. X                shipno, prin_ship_orbits(s));
  1411. X        sprintf(buf,"%s #%d %s lost sight of destination ship #%d.\n", 
  1412. X            Shipnames[s->type],shipno,s->name,s->destshipno);
  1413. X        str_cat(telegram_buf, buf); 
  1414. X    push_message(TELEG_PLAYER_AUTO, s->owner, telegram_buf, TELEGRAM);
  1415. X    return;
  1416. X   }
  1417. X
  1418. X
  1419. X   if (truedist > DIST_TO_LAND) {
  1420. X       s->fuel -= fuse;
  1421. X       s->mass -= fuse * MASS_FUEL;
  1422. X
  1423. X        /* dont overshoot */
  1424. X    sn = sin(heading);
  1425. X    cs = cos(heading);
  1426. X       xdest = sn * mfactor;
  1427. X       ydest = cs * mfactor;
  1428. X        if (hypot(xdest, ydest) > movedist) {
  1429. X        xdest = sn * movedist;
  1430. X        ydest = cs * movedist;
  1431. X    }
  1432. X       s->xpos += xdest;
  1433. X       s->ypos += ydest;
  1434. X   }
  1435. X
  1436. X/*****  check if far enough away from object it's orbiting to break orbit *****/
  1437. X
  1438. X  if (s->whatorbits==LEVEL_PLAN) {
  1439. X        dist = sqrt( Distsq(s->xpos, s->ypos, 
  1440. X            ost->xpos+opl->xpos, ost->ypos+opl->ypos ) );
  1441. X     if (dist > PLORBITSIZE) {
  1442. X        s->whatorbits = LEVEL_STAR;
  1443. X     }
  1444. X
  1445. X   } else if (s->whatorbits==LEVEL_STAR) {
  1446. X    dist = sqrt( Distsq(s->xpos, s->ypos, ost->xpos, ost->ypos ) );
  1447. X     if (dist > SYSTEMSIZE) {
  1448. X        s->whatorbits = LEVEL_UNIV;
  1449. X        s->protect.evade = 0;
  1450. X     }
  1451. X   }
  1452. X
  1453. X    /*******   check for arriving at destination *******/
  1454. X
  1455. X   if (destlevel==LEVEL_STAR || (destlevel==LEVEL_PLAN
  1456. X    && !(s->whatorbits!=LEVEL_UNIV && s->storbits==deststar) ) ) {
  1457. X               /* not in same star system as deststar */
  1458. X
  1459. X     stardist = sqrt(Distsq(s->xpos,s->ypos,dst->xpos,dst->ypos));
  1460. X
  1461. X     if (stardist <= SYSTEMSIZE * 1.5) {
  1462. X       if (s->type == STYPE_POD)
  1463. X        s->notified = 1;    /* signal to explode */
  1464. X        /* mark as explored & inhabited by that player */
  1465. X       setbit(dst->explored, s->owner);
  1466. X       setbit(dst->inhabited, s->owner);
  1467. X       s->whatorbits = LEVEL_STAR;
  1468. X       s->storbits = deststar;
  1469. X          sprintf(telegram_buf,"%s #%d %s arrived at system %s.\n",
  1470. X               Shipnames[s->type], shipno, s->name,
  1471. X            prin_ship_orbits(s));
  1472. X    push_message(TELEG_PLAYER_AUTO, s->owner, telegram_buf, TELEGRAM);
  1473. X
  1474. X       if (destlevel == LEVEL_STAR)
  1475. X             s->whatdest = LEVEL_UNIV;
  1476. X        /* clear orders if the ship is not headed to a planet in
  1477. X           this system */
  1478. X
  1479. X
  1480. X       }
  1481. X
  1482. X   } else if ( destlevel==LEVEL_PLAN && 
  1483. X         (s->whatorbits!=LEVEL_UNIV && deststar==s->storbits  &&
  1484. X        !(s->whatorbits==LEVEL_PLAN && s->pnumorbits==destpnum)) ) {
  1485. X    /* headed for a planet in the same system, & not already there.. */
  1486. X        dist = sqrt( Distsq(s->xpos, s->ypos, 
  1487. X            dst->xpos+dpl->xpos, dst->ypos+dpl->ypos ) ) ;
  1488. X
  1489. X     if (dist<=PLORBITSIZE) {
  1490. X         /* mark planet as explored by that player */
  1491. X       dpl->info[s->owner-1].explored = 1;
  1492. X            /* mark sun as explored too, if the ship might have bypassed it
  1493. X            (we are trying to be thorough here) */
  1494. X       setbit(dst->explored, s->owner);
  1495. X       setbit(dst->inhabited, s->owner);
  1496. X       s->whatorbits = LEVEL_PLAN;
  1497. X       s->pnumorbits = destpnum;    
  1498. X
  1499. X       sprintf(telegram_buf,"Telecomm from ship #%d\n\n",shipno);
  1500. X
  1501. X    if(dist<=DIST_TO_LAND) {
  1502. X       sprintf(telegram_buf,"%s #%d %s arrived at planet %s.\n This ship is close enough to land.\n",Shipnames[s->type],shipno, s->name, prin_ship_orbits(s));
  1503. X    } else {
  1504. X       sprintf(telegram_buf,"%s #%d %s arriving at planet %s.\n",
  1505. X                Shipnames[s->type],shipno, s->name, prin_ship_orbits(s));
  1506. X        }
  1507. X
  1508. X       if (s->type==STYPE_ASS) {
  1509. X           sprintf(buf,"\nEnslavement of the planet is now possible.\n");
  1510. X        str_cat(telegram_buf, buf);
  1511. X            }
  1512. X    push_message(TELEG_PLAYER_AUTO, s->owner, telegram_buf, TELEGRAM);
  1513. X     }
  1514. X
  1515. X  } 
  1516. X
  1517. X }
  1518. X
  1519. X} /* if 'destination' orders */
  1520. X
  1521. X}
  1522. X
  1523. X
  1524. X
  1525. X/* 
  1526. X * insert the ship into wherever it's supposed to be.
  1527. X *  this is done every turn, for every ship; as a bonus it puts them in
  1528. X *  alphabetical order.
  1529. X */
  1530. Xinsert_sh(sdata, star, pl, s, shipno)
  1531. Xstruct stardata *sdata;
  1532. Xstartype *star;
  1533. Xplanettype *pl;
  1534. Xshiptype *s;
  1535. Xint shipno;
  1536. X{
  1537. X
  1538. X if (s->is_alive)
  1539. X    switch (s->whatorbits) {
  1540. X    case LEVEL_UNIV:
  1541. X        s->nextship = sdata->ships;
  1542. X        sdata->ships = shipno;
  1543. X        break;
  1544. X    case LEVEL_STAR:
  1545. X        s->nextship = star->ships;
  1546. X        star->ships = shipno;
  1547. X        break;
  1548. X    case LEVEL_PLAN:
  1549. X        s->nextship = pl->ships;
  1550. X        pl->ships = shipno;
  1551. X        break;
  1552. X    default:
  1553. X        break;
  1554. X    }
  1555. X
  1556. X}
  1557. X
  1558. X
  1559. X/* deliver an "out of fuel" message.  Used by a number of ship-updating
  1560. X *  code segments; so that code isn't duplicated.
  1561. X */
  1562. Xmsg_OOF(s, shipno, tbuf)
  1563. Xshiptype *s;
  1564. Xint shipno;
  1565. Xchar *tbuf;
  1566. X{
  1567. X char buf[200];
  1568. X
  1569. X    sprintf(buf,"%s #%d is out of fuel at %s\n", Shipnames[s->type],
  1570. X                shipno, prin_ship_orbits(s));
  1571. X    push_message(TELEG_PLAYER_AUTO, s->owner, buf, TELEGRAM);
  1572. X}
  1573. X
  1574. X
  1575. Xinsert_sh_univ(sdata, s, shipno)
  1576. Xshiptype *s;
  1577. Xstruct stardata *sdata;
  1578. X{
  1579. X    s->nextship = sdata->ships;
  1580. X    sdata->ships = shipno;
  1581. X}
  1582. X
  1583. X
  1584. Xinsert_sh_star(star, s, shipno)
  1585. Xstartype *star;
  1586. Xshiptype *s;
  1587. Xint shipno;
  1588. X{
  1589. X    s->nextship = star->ships;
  1590. X    star->ships = shipno;
  1591. X}
  1592. X
  1593. X
  1594. Xinsert_sh_plan(pl, s, shipno)
  1595. Xplanettype *pl;
  1596. Xshiptype *s;
  1597. Xint shipno;
  1598. X{
  1599. X    s->nextship = pl->ships;
  1600. X    pl->ships = shipno;
  1601. X}
  1602. END_OF_FILE
  1603. if test 11633 -ne `wc -c <'server/moveship.c'`; then
  1604.     echo shar: \"'server/moveship.c'\" unpacked with wrong size!
  1605. fi
  1606. # end of 'server/moveship.c'
  1607. if test -f 'server/rst.c' -a "${1}" != "-c" ; then 
  1608.   echo shar: Renaming existing file \"'server/rst.c'\" to \"'server/rst.c.orig'\"
  1609.   mv -f 'server/rst.c' 'server/rst.c.orig'
  1610. fi
  1611. echo shar: Extracting \"'server/rst.c'\" \(12592 characters\)
  1612. sed "s/^X//" >'server/rst.c' <<'END_OF_FILE'
  1613. X/*
  1614. X * Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, 
  1615. X * smq@ucscb.ucsc.edu, mods by people in GB_copyright.h.
  1616. X * Restrictions in GB_copyright.h.
  1617. X *
  1618. X *  ship -- report -- stock -- tactical -- stuff on ship
  1619. X */
  1620. X
  1621. X#define REPORT    0
  1622. X#define STOCK    1
  1623. X#define TACTICAL 2
  1624. X#define SHIP    3
  1625. X#define STATUS    4
  1626. X
  1627. X#define PLANET 1
  1628. X
  1629. X#include "GB_copyright.h"
  1630. X#define EXTERN extern
  1631. X#include "vars.h"
  1632. X#include "ships.h"
  1633. X#include "races.h"
  1634. X#include "buffers.h"
  1635. X#include <math.h>
  1636. X#include <ctype.h>
  1637. Xextern char Shipltrs[];
  1638. X
  1639. Xchar *prin_aimed_at(), *prin_ship_dest();
  1640. X
  1641. Xstatic boolean Status,Ship,Stock,Report,Tactical,first;
  1642. Xint rst_racedata;
  1643. X
  1644. Xextern float Kill_factor();
  1645. X
  1646. Xstruct reportdata {
  1647. X    unsigned type : 1;    /* ship or planet */
  1648. X    shiptype *s;
  1649. X    planettype *p;
  1650. X    short n;
  1651. X    unsigned char star,pnum;
  1652. X    float x,y;
  1653. X};
  1654. X
  1655. Xracetype *Race;
  1656. X
  1657. Xrst(Playernum,APcount, argn,args,Rst)
  1658. Xint Playernum;
  1659. Xint APcount;
  1660. Xint argn;
  1661. Xchar args[MAXARGS][COMMANDSIZE];
  1662. Xint Rst;
  1663. X{
  1664. X int shdata,shipno;
  1665. X reg int shn,i;
  1666. X struct reportdata *rd;
  1667. X int n_ships, num;
  1668. X boolean Report_types[NUMSTYPES];
  1669. X for (i=0; i<NUMSTYPES; i++) Report_types[i]=1;
  1670. X Num_ships = 0;
  1671. X first = 1;
  1672. X switch (Rst) {
  1673. X    case REPORT:    Report = 1;
  1674. X            Status = Stock = Ship = Tactical = 0;
  1675. X            break;
  1676. X    case STOCK:    Stock = 1;
  1677. X            Status = Report = Ship = Tactical = 0;
  1678. X            break;
  1679. X    case TACTICAL:    Tactical = 1;
  1680. X            Status = Report = Ship = Stock = 0;
  1681. X            break;
  1682. X    case SHIP:    Ship = Report = Stock = 1;
  1683. X            Tactical = 0;
  1684. X            Status = 1;
  1685. X            break;
  1686. X    case STATUS:    Status = 1;
  1687. X             Report = Stock = Tactical = Ship = 0;
  1688. X            break;
  1689. X }
  1690. X
  1691. X openshdata(&shdata);
  1692. X  n_ships = Numships(shdata);
  1693. X close_file(shdata);
  1694. X
  1695. X rd = (struct reportdata *)malloc(sizeof(struct reportdata) * 
  1696. X    (n_ships + Sdata.numstars * MAXPLANETS));
  1697. X    /* (one list entry for each ship, planet in universe) */
  1698. X
  1699. Xopenracedata(&rst_racedata);
  1700. Xgetrace(rst_racedata, &Race, Playernum);
  1701. Xclose_file(rst_racedata);
  1702. X
  1703. X
  1704. X if (argn>=2) {
  1705. X
  1706. X   if (*args[1] == '#' || isdigit(*args[1])) {
  1707. X    /* report on a couple ships */
  1708. X     int l=1;
  1709. X      while (l<MAXARGS && *args[l]!='\0') {
  1710. X
  1711. X          sscanf(args[l] + (*args[l]=='#'),"%d",&shipno);
  1712. X
  1713. X          if ( shipno > n_ships || shipno<1) {
  1714. X       sprintf (buf,"rst: no such ship #%d \n",shipno);
  1715. X        notify(Playernum, buf);
  1716. X       Free_shiplist(rd);
  1717. X       free(Race);
  1718. X       return ;
  1719. X           }
  1720. X
  1721. X          openshdata(&shdata);
  1722. X          Getrship(Playernum,shdata,rd, shipno);
  1723. X          close_file(shdata);
  1724. X    num = Num_ships;
  1725. X    if(rd[Num_ships-1].s->whatorbits != LEVEL_UNIV)
  1726. X        {
  1727. X                  star_getrships(Playernum,rd,rd[num-1].s->storbits);
  1728. X                  ship_report(Playernum,rd,num-1,Report_types);
  1729. X        }
  1730. X    else 
  1731. X               ship_report(Playernum,rd,num-1,Report_types);
  1732. X
  1733. X    l++;
  1734. X      }
  1735. X
  1736. X      Free_shiplist(rd);
  1737. X     free(Race);
  1738. X     return;
  1739. X
  1740. X   } else {
  1741. X    int l;
  1742. X    l = strlen(args[1]);
  1743. X    for (i=0; i<NUMSTYPES; i++) Report_types[i]=0;
  1744. X
  1745. X    while (l--) {
  1746. X       i = NUMSTYPES;
  1747. X       while (--i && Shipltrs[i]!=args[1][l]) 
  1748. X        ;
  1749. X       if (Shipltrs[i]!=args[1][l]) {
  1750. X        sprintf(buf,"'%c' -- no such ship letter\n",args[1][l]);
  1751. X            notify(Playernum, buf);
  1752. X       } else
  1753. X        Report_types[i] = 1;
  1754. X    }
  1755. X   }
  1756. X
  1757. X  }
  1758. X
  1759. X  switch (Dir[Playernum-1].level) {
  1760. X   case LEVEL_UNIV:
  1761. X      openshdata(&shdata);
  1762. X      shn = Sdata.ships;
  1763. X      while (shn && Getrship(Playernum, shdata, rd, shn))
  1764. X          shn = rd[Num_ships-1].s->nextship;
  1765. X
  1766. X      close_file(shdata);
  1767. X      for (i=0; i<Sdata.numstars; i++)
  1768. X        star_getrships(Playernum,rd,i);
  1769. X      for (i=0; i<Num_ships; i++)
  1770. X        ship_report(Playernum,rd,i,Report_types);
  1771. X      break;
  1772. X   case LEVEL_PLAN:
  1773. X      plan_getrships(Playernum,rd, Dir[Playernum-1].snum, Dir[Playernum-1].pnum);
  1774. X      for (i=0; i<Num_ships; i++)
  1775. X        ship_report(Playernum,rd,i,Report_types);
  1776. X      break; 
  1777. X   case LEVEL_STAR:
  1778. X      star_getrships(Playernum,rd,Dir[Playernum-1].snum);
  1779. X      for (i=0; i<Num_ships; i++)
  1780. X        ship_report(Playernum,rd,i,Report_types);
  1781. X      break; 
  1782. X   case LEVEL_SHIP:
  1783. X      openshdata(&shdata);
  1784. X      Getrship(Playernum,shdata,rd, Dir[Playernum-1].shipno);
  1785. X      ship_report(Playernum,rd,0,Report_types);        /* first ship report */
  1786. X
  1787. X    if(rd[0].s->type == STYPE_CARRIER) /* list attached fighter groups */
  1788. X    {
  1789. X      shn = rd[0].s->object.number;
  1790. X      Num_ships = 0;    
  1791. X
  1792. X      while (shn && Getrship(Playernum, shdata, rd, shn))
  1793. X          shn = rd[Num_ships-1].s->object.number;
  1794. X
  1795. X
  1796. X    for (i=0; i<Num_ships; i++)
  1797. X        ship_report(Playernum,rd,i,Report_types);
  1798. X    }
  1799. X
  1800. X      close_file(shdata);
  1801. X      break;
  1802. X  }
  1803. X
  1804. X  Free_shiplist(rd);
  1805. X free(Race);
  1806. X}
  1807. X
  1808. X
  1809. Xship_report(Playernum,rd,indx,rep_on)
  1810. Xint Playernum;
  1811. Xstruct reportdata rd[];
  1812. Xint indx;
  1813. Xboolean rep_on[];
  1814. X{
  1815. X shiptype *s;
  1816. X planettype *p;
  1817. X int shipno,test;
  1818. X reg int i,sight;
  1819. X placetype where;
  1820. X char orb[PLACENAMESIZE];
  1821. X char strng[COMMANDSIZE],locstrn[COMMANDSIZE];
  1822. X float Dist;
  1823. X    /* last ship gotten from disk */
  1824. X  s = rd[indx].s;
  1825. X  p = rd[indx].p;
  1826. X  shipno = rd[indx].n;
  1827. X
  1828. X    /* launched canister, non-owned ships don't show up */
  1829. X    if ( (rd[indx].type==PLANET && p->info[Playernum-1].numsectsowned)
  1830. X      || (rd[indx].type!=PLANET && s->owner==Playernum &&
  1831. X     rep_on[s->type] &&
  1832. X    !(s->type==OTYPE_CANIST && !s->is_docked) && s->is_alive) ) {
  1833. X
  1834. X   if (rd[indx].type!=PLANET && Stock) {
  1835. X    if (first) {
  1836. X      sprintf(buf,"   #       name        mass crys   resources  destructive  fuel      crew     class\n");
  1837. X        notify(Playernum, buf);
  1838. X      if (!Ship)
  1839. X          first=0;
  1840. X    }
  1841. X
  1842. X
  1843. X      sprintf(buf,"%4d %c %13.13s%7.1f%5u%5u(%4d)%5u(%4d)%5.1f(%4d)%5u(%4d) %c %s %s",
  1844. X    shipno, Shipltrs[s->type], s->name, s->mass, s->crystals, 
  1845. X    s->resource, Max_resource(s),
  1846. X    s->destruct, Max_destruct(s),
  1847. X    s->fuel, Max_fuel(s),
  1848. X    s->popn, Max_crew(s), Shipltrs[s->build_type],  s->class, (s->active ? "" : "INACTIVE"));
  1849. X        notify(Playernum, buf);
  1850. X      sprintf(buf,"\n");
  1851. X        notify(Playernum, buf);
  1852. X
  1853. X   }
  1854. X
  1855. X  if (rd[indx].type!=PLANET && Status) {
  1856. X    if (first) {
  1857. X      sprintf(buf,"   #       name      guns  arm rcap dcap fcap crew  spd cost   mass size dam class\n");
  1858. X        notify(Playernum, buf);
  1859. X      if (!Ship)
  1860. X          first=0;
  1861. X    }
  1862. X
  1863. X
  1864. X      sprintf(buf,"%4d %c %13.13s %c%3u%5u%5u%5u%5u%5u   %c%1u%5u%7.1f%5u%3u%% %c %s%s\n",
  1865. X    shipno, Shipltrs[s->type], s->name, Laser(s) ? '+' : ' ',
  1866. X    Guns(s), Armor(s), Max_resource(s), Max_destruct(s), Max_fuel(s), Max_crew(s),
  1867. X        s->hyper_drive.has ? (s->hyper_drive.mounted ? '+' : '*') : ' ',
  1868. X        Max_speed(s), Cost(s), Mass(s), Size(s), s->damage, 
  1869. X        Shipltrs[s->build_type],  s->class, (s->active ? "" : " INACTIVE"));
  1870. X        notify(Playernum, buf);
  1871. X   }
  1872. X
  1873. X
  1874. X
  1875. X   if (rd[indx].type!=PLANET && Report) {
  1876. X         if (first) {
  1877. X        sprintf(buf,"  #                crew dam dest fuel spd            orbits       destination\n");
  1878. X        notify(Playernum, buf);
  1879. X         if (!Ship)
  1880. X              first=0;
  1881. X     }
  1882. X
  1883. X    if(s->navigate.on)
  1884. X        sprintf(strng,"nav: %d (%d)",s->navigate.bearing,
  1885. X                s->navigate.turns);
  1886. X
  1887. X      sprintf(locstrn,"%2.0f,%-2.0f",s->xpos,s->ypos);
  1888. X
  1889. X       sprintf(buf,"%4d %c %12.12s%4u%4u%5u%5.0f %c%1u%c%5s%15.15s %15.15s",
  1890. X        shipno, 
  1891. X        Shipltrs[s->type], 
  1892. X        s->name,
  1893. X        s->popn,
  1894. X        s->damage, 
  1895. X        s->destruct, 
  1896. X        s->fuel,
  1897. X        s->hyper_drive.has ? (s->hyper_drive.mounted ? '+' : '*') : ' ',
  1898. X        s->speed, 
  1899. X        s->is_docked ? ( (s->whatdest==LEVEL_SHIP) ? 'D' : 'L') : ' ',
  1900. X        (s->is_docked&&s->whatdest==LEVEL_PLAN) ? locstrn : "",
  1901. X        prin_ship_orbits(s), 
  1902. X        (s->navigate.on) ? strng : prin_ship_dest(Playernum, s) );
  1903. X        notify(Playernum, buf);
  1904. X      if (!s->active) {
  1905. X    sprintf(buf," INACTIVE(%d)",s->rad);
  1906. X        notify(Playernum, buf);
  1907. X        }
  1908. X         sprintf(buf,"\n");
  1909. X        notify(Playernum, buf);
  1910. X
  1911. X   }
  1912. X
  1913. X   if (Tactical) {
  1914. X
  1915. Xint fev=0,fspeed=0;
  1916. Xfloat tech;
  1917. X    sprintf(buf,"\n  #         name        tech guns armor size dest   fuel dam spd evad               orbits\n");
  1918. X        notify(Playernum, buf);
  1919. X
  1920. X    if (rd[indx].type==PLANET) {
  1921. X            tech = Race->tech;
  1922. X        /* tac report from planet */
  1923. X        sprintf(buf,"(planet)%15.15s%4.0f %4d           %5u %6u\n",
  1924. X            Stars[rd[indx].star]->pnames[rd[indx].pnum],
  1925. X             tech,PLAN_FIRE_LIM,p->info[Playernum-1].destruct,
  1926. X            p->info[Playernum-1].fuel);
  1927. X        notify(Playernum, buf);
  1928. X    } else {
  1929. X
  1930. X       where.level = s->whatorbits;
  1931. X       where.snum = s->storbits;
  1932. X       where.pnum = s->pnumorbits;
  1933. X      tech = s->tech;
  1934. X
  1935. X      if((s->whatdest != LEVEL_UNIV || s->navigate.on) && !s->is_docked && s->active) {
  1936. X        fspeed = s->speed;
  1937. X        fev = s->protect.evade;
  1938. X      }
  1939. X      sprintf(orb, "%30.30s", Dispplace(Playernum, &where));
  1940. X      sprintf(buf,"%3d %c%19.19s%4.0f%5d%6d%5d%5u%7.1f%3d%%  %d  %3s%21.22s%s", 
  1941. X        shipno, Shipltrs[s->type], s->name, s->tech,
  1942. X        Guns(s), s->armor, s->size,
  1943. X        s->destruct, s->fuel, s->damage, fspeed,(fev ? "yes" : "   "),
  1944. X        orb, (s->active ? "" : " INACTIVE"));
  1945. X        notify(Playernum, buf);
  1946. X
  1947. X      if (s->is_docked && s->whatorbits==LEVEL_PLAN) {
  1948. X        sprintf(buf," (%.0f,%.0f)",s->xpos,s->ypos);
  1949. X        notify(Playernum, buf);
  1950. X        }
  1951. X          if (!s->active) {
  1952. X        sprintf(buf," INACTIVE(%d)",s->rad);
  1953. X        notify(Playernum, buf);
  1954. X            }
  1955. X      sprintf(buf,"\n");
  1956. X        notify(Playernum, buf);
  1957. X
  1958. X    }
  1959. X
  1960. X    sight = 0;
  1961. X    if(rd[indx].type==PLANET) {
  1962. X        sight = 1;
  1963. X    } else if(Sight(s)) sight = 1;
  1964. X
  1965. X        /* tactical display */
  1966. X    sprintf(buf,"\n  Tactical: #  own typ        name   rng   (50%%) size spd evade hit  dam  loc\n");
  1967. X        notify(Playernum, buf);
  1968. X
  1969. X    if(sight)
  1970. X    for (i=0; i<Num_ships; i++) {
  1971. X       if (i!=indx && (Dist = sqrt(Distsq(rd[indx].x, rd[indx].y, 
  1972. X                rd[i].x, rd[i].y))) < gun_range(Race, NULL))
  1973. X          if (rd[i].type==PLANET) {
  1974. X        /* tac report at planet */
  1975. X        sprintf(buf," %13s(planet)          %8.0f\n", 
  1976. X            Stars[rd[i].star]->pnames[rd[i].pnum], Dist);
  1977. X        notify(Playernum, buf);
  1978. X
  1979. X          } else {
  1980. X            /* tac report at ship */
  1981. X        if (rd[i].s->owner!=Playernum && rd[i].s->is_alive
  1982. X            && rd[i].s->type != OTYPE_CANIST)
  1983. X             {
  1984. X        int tev=0, tspeed=0, body=0,prob=0;
  1985. X        int factor=0;        
  1986. X        if((rd[i].s->whatdest != LEVEL_UNIV || rd[i].s->navigate.on) && !rd[i].s->is_docked && rd[i].s->active)
  1987. X                    {
  1988. X                    tspeed = rd[i].s->speed;
  1989. X                    tev = rd[i].s->protect.evade;
  1990. X                    }
  1991. X                    
  1992. X        body = Size(rd[i].s);
  1993. X
  1994. X             prob = hit_odds(Dist,&factor,tech,fev,tev,fspeed,tspeed,body);
  1995. X           sprintf(buf,"%13d %4d %c%15.15s %4.0f  %4d   %4d %d  %3s  %3d%% %3u%%%s",
  1996. X            rd[i].n, rd[i].s->owner, Shipltrs[rd[i].s->type], 
  1997. X            rd[i].s->name, Dist,factor,body,tspeed,(tev ? "yes" : "   "), prob,rd[i].s->damage,
  1998. X            (rd[i].s->active ? "" : " INACTIVE"));
  1999. X        notify(Playernum, buf);
  2000. X      if (rd[i].s->is_docked && rd[i].s->whatorbits==LEVEL_PLAN) {
  2001. X        sprintf(buf," (%.0f,%.0f)",rd[i].s->xpos,rd[i].s->ypos);
  2002. X        notify(Playernum, buf);
  2003. X      } else {
  2004. X        sprintf(buf,"     ");
  2005. X        notify(Playernum, buf);
  2006. X        }
  2007. X
  2008. X    sprintf(buf, "\n");
  2009. X        notify(Playernum, buf);
  2010. X        }
  2011. X          }
  2012. X
  2013. X    }
  2014. X   }
  2015. X
  2016. X
  2017. X  }
  2018. X
  2019. X}
  2020. X
  2021. X
  2022. X
  2023. Xplan_getrships(Playernum,rd,snum,pnum)
  2024. Xint Playernum;
  2025. Xstruct reportdata rd[];
  2026. Xint snum, pnum;
  2027. X{
  2028. X reg int i,shn;
  2029. X planettype *p;
  2030. X int shdata,pdata;
  2031. X
  2032. X openpdata(&pdata);
  2033. X   getplanet(pdata, &rd[Num_ships].p, Stars[snum]->planetpos[pnum]);
  2034. X close_file(pdata);
  2035. X p = rd[Num_ships].p;
  2036. X    /* add this planet into the ship list */
  2037. X rd[Num_ships].star = snum;
  2038. X rd[Num_ships].pnum = pnum;
  2039. X rd[Num_ships].type = PLANET;
  2040. X rd[Num_ships].n = 0;
  2041. X rd[Num_ships].x = Stars[snum]->xpos + p->xpos;
  2042. X rd[Num_ships].y = Stars[snum]->ypos + p->ypos;
  2043. X    Num_ships++;
  2044. X
  2045. X if (p->info[Playernum-1].explored) {
  2046. X
  2047. X   openshdata(&shdata);
  2048. X   shn = p->ships;
  2049. X   while (shn && Getrship(Playernum, shdata, rd, shn)) {
  2050. X        /* add offsets for docked ships */
  2051. X    if (rd[Num_ships-1].s->is_docked && 
  2052. X            rd[Num_ships-1].s->whatdest==LEVEL_PLAN) {
  2053. X        rd[Num_ships-1].x += Stars[snum]->xpos + p->xpos;
  2054. X        rd[Num_ships-1].y += Stars[snum]->ypos + p->ypos;
  2055. X    }
  2056. X    shn = rd[Num_ships-1].s->nextship;
  2057. X   }
  2058. X   close_file(shdata);
  2059. X }
  2060. X}
  2061. X
  2062. X
  2063. X
  2064. Xstar_getrships(Playernum,rd,snum)
  2065. Xint Playernum;
  2066. Xstruct reportdata rd[];
  2067. Xint snum;
  2068. X{
  2069. X reg int shn;
  2070. X int i,shdata;
  2071. X
  2072. X
  2073. X if (isset(Stars[snum]->explored, Playernum)) {
  2074. X   openshdata(&shdata);
  2075. X   shn = Stars[snum]->ships;
  2076. X   while (shn && Getrship(Playernum, shdata, rd, shn))
  2077. X    shn = rd[Num_ships-1].s->nextship;
  2078. X
  2079. X   close_file(shdata);
  2080. X   for (i=0; i<Stars[snum]->numplanets; i++)
  2081. X     plan_getrships(Playernum,rd, snum, i);
  2082. X }
  2083. X}
  2084. X
  2085. X
  2086. X/* get a ship from the disk and add it to the ship list we're maintaining. */
  2087. XGetrship(Playernum,shdata,rd, shipno)
  2088. Xint Playernum;
  2089. Xint shdata,shipno;
  2090. Xstruct reportdata rd[];
  2091. X{
  2092. Xint noerr;
  2093. X
  2094. X   if (getship(shdata,&rd[Num_ships].s,shipno)) {
  2095. X       rd[Num_ships].type = 0;
  2096. X       rd[Num_ships].n = shipno;
  2097. X       rd[Num_ships].x = rd[Num_ships].s->xpos;
  2098. X       rd[Num_ships].y = rd[Num_ships].s->ypos;
  2099. X        Num_ships++;
  2100. X       return 1;
  2101. X       } else {
  2102. X    sprintf(buf,"Getrship: error on ship get (%d).\n",shipno);
  2103. X        notify(Playernum, buf);
  2104. X       return 0;
  2105. X    }
  2106. X}
  2107. X
  2108. X
  2109. X
  2110. XFree_shiplist(rd)
  2111. Xstruct reportdata rd[];
  2112. X{
  2113. X reg int i;
  2114. X
  2115. X for (i=0; i<Num_ships; i++)
  2116. X    if (rd[i].type==PLANET)
  2117. X        free(rd[i].p);
  2118. X    else
  2119. X        free(rd[i].s);
  2120. X
  2121. X free(rd);
  2122. X}
  2123. X
  2124. X/* 
  2125. X * return what the ship is aimed at, if it's a mirror 
  2126. X */
  2127. X
  2128. X
  2129. END_OF_FILE
  2130. if test 12592 -ne `wc -c <'server/rst.c'`; then
  2131.     echo shar: \"'server/rst.c'\" unpacked with wrong size!
  2132. fi
  2133. # end of 'server/rst.c'
  2134. if test -f 'server/teleg_send.c' -a "${1}" != "-c" ; then 
  2135.   echo shar: Renaming existing file \"'server/teleg_send.c'\" to \"'server/teleg_send.c.orig'\"
  2136.   mv -f 'server/teleg_send.c' 'server/teleg_send.c.orig'
  2137. fi
  2138. echo shar: Extracting \"'server/teleg_send.c'\" \(1574 characters\)
  2139. sed "s/^X//" >'server/teleg_send.c' <<'END_OF_FILE'
  2140. X/*
  2141. X * Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, 
  2142. X * smq@ucscb.ucsc.edu, mods by people in GB_copyright.h.
  2143. X * Restrictions in GB_copyright.h.
  2144. X *
  2145. X *    teleg_send.c -- does the work of sending a telegram
  2146. X */
  2147. X
  2148. X#define EXTERN extern
  2149. X#include "GB_copyright.h"
  2150. X#include "tweakables.h"
  2151. X#include "files.h"
  2152. X#include "buffers.h"
  2153. X#include <stdio.h>
  2154. X#include <ctype.h>
  2155. X#include <strings.h>
  2156. X#include <errno.h>
  2157. X#include <signal.h>
  2158. X#include <sys/file.h>
  2159. X#include <sys/time.h>
  2160. Xlong tm;
  2161. Xchar *ctime();
  2162. X
  2163. Xstruct tm *current_tm;/* for watching for next update */
  2164. X
  2165. Xpush_message(sender, recpient, msg, type)
  2166. Xint sender;
  2167. Xint recpient;
  2168. Xchar *msg;
  2169. Xint type;
  2170. X{
  2171. X char telefl[100],tmbuf[50], numcodes, *tmp;
  2172. X int mask;
  2173. X FILE *telegram_fd;
  2174. X register int i,t;
  2175. X
  2176. X switch(type) {
  2177. X   case TELEGRAM:
  2178. X     sprintf(telefl, "%s.%d",TELEGRAMFL, recpient );
  2179. X     break;
  2180. X   case DECLARATION:
  2181. X     sprintf(telefl, "%s.%d",DECLARATIONFL, recpient );
  2182. X     break;
  2183. X   case TRANSFER:
  2184. X     sprintf(telefl, "%s.%d",TRANSFERFL, recpient );
  2185. X     break;
  2186. X   case COMBAT:
  2187. X     sprintf(telefl, "%s.%d",COMBATFL, recpient );
  2188. X     break;
  2189. X   case ANNOUNCE:
  2190. X     sprintf(telefl, "%s.%d",ANNOUNCEFL, recpient );
  2191. X     break;
  2192. X   default:
  2193. X     return;
  2194. X }
  2195. X if ((telegram_fd = fopen( telefl, "a" ))==NULL) {
  2196. X    perror("teleg_send");
  2197. X    return;
  2198. X    } else {
  2199. X
  2200. Xtm = time(0);
  2201. X  current_tm=localtime(&tm);
  2202. Xfprintf(telegram_fd,"%2d/%2d %02d:%02d:%02d %s%s",
  2203. X    current_tm->tm_mon+1, current_tm->tm_mday, current_tm->tm_hour,
  2204. X    current_tm->tm_min, current_tm->tm_sec, msg,
  2205. X    (type==TELEGRAM ? "\n": ""));
  2206. X
  2207. X    fclose(telegram_fd);
  2208. X
  2209. X }
  2210. X
  2211. X}
  2212. X
  2213. END_OF_FILE
  2214. if test 1574 -ne `wc -c <'server/teleg_send.c'`; then
  2215.     echo shar: \"'server/teleg_send.c'\" unpacked with wrong size!
  2216. fi
  2217. # end of 'server/teleg_send.c'
  2218. echo shar: End of archive 7 \(of 9\).
  2219. cp /dev/null ark7isdone
  2220. MISSING=""
  2221. for I in 1 2 3 4 5 6 7 8 9 ; do
  2222.     if test ! -f ark${I}isdone ; then
  2223.     MISSING="${MISSING} ${I}"
  2224.     fi
  2225. done
  2226. if test "${MISSING}" = "" ; then
  2227.     echo You have unpacked all 9 archives.
  2228.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2229. else
  2230.     echo You still need to unpack the following archives:
  2231.     echo "        " ${MISSING}
  2232. fi
  2233. ##  End of shell archive.
  2234. exit 0
  2235.