home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume10 / xtrek / part02 / enter.c < prev    next >
C/C++ Source or Header  |  1990-10-23  |  5KB  |  205 lines

  1. static char sccsid[] = "@(#)enter.c    3.1";
  2.  
  3. /*
  4.  
  5.     Copyright (c) 1986     Chris Guthrie
  6.  
  7. Permission to use, copy, modify, and distribute this
  8. software and its documentation for any purpose and without
  9. fee is hereby granted, provided that the above copyright
  10. notice appear in all copies and that both that copyright
  11. notice and this permission notice appear in supporting
  12. documentation.  No representations are made about the
  13. suitability of this software for any purpose.  It is
  14. provided "as is" without express or implied warranty.
  15.  
  16. */
  17.  
  18. #include <X11/Xlib.h>
  19. #include <stdio.h>
  20. #if !defined(cray)
  21. #include <sys/types.h>
  22. #endif
  23. #include <errno.h>
  24. #include <pwd.h>
  25. #include <string.h>
  26. #include <ctype.h>
  27. #include "defs.h"
  28. #include "data.h"
  29.  
  30. extern int    debug;
  31.  
  32. /* Enter the game */
  33.  
  34. long random();
  35.  
  36. enter(tno, disp, pno)
  37. int tno;
  38. char    *disp;
  39. int pno;
  40. {
  41.     register struct player    *p;
  42.     char        *pseudo, buf[80];
  43.     register struct planet    *l;
  44.     register int        i;
  45.  
  46.     pseudo = (char *) NULL;
  47.     p = &players[pno];
  48.     if (strcmp(disp, "Nowhere")) {
  49.     pseudo = XGetDefault(p->display, PROGRAM_NAME, "name");
  50.     }
  51.     if (pseudo == NULL) {
  52.     if (strcmp(disp, "Nowhere"))
  53.         (void) strncpy(p->p_name, p->p_login, sizeof (p->p_name));
  54.     } else
  55.     (void) strncpy(p->p_name, pseudo, sizeof (p->p_name));
  56.     p->p_name[12] = '\0';
  57.     p->p_login[12] = '\0';
  58.  
  59.     p->p_no = pno;
  60.     getstats(p);
  61.     time(&p->p_start_time);
  62.     p->p_umsg.m_pending = 0;
  63.     p->p_lastm = mctl->mc_current;
  64.     p->p_status = PALIVE;
  65.     p->p_mapmode = 1;
  66.     p->p_namemode = 1;
  67.     p->p_statmode = 1;
  68.     p->p_warntimer = -1;
  69.     p->p_infomapped = 0;
  70.     p->mustexit = 0;
  71.     p->p_redrawall = 1;
  72.     if (debug)
  73.     fprintf(stderr, "%d p_copilot %d\n", pno, p->p_copilot);
  74.     if (p->p_flags & PFRSHOWSTATS) {
  75.     p->statwin = openStats(p);
  76.     }
  77.     if (!p->p_copilot)
  78.     enter_ship(p, disp, tno);
  79.  
  80.     sprintf(buf, "%c%x", teamlet[p->p_ship->s_team], p->p_ship->s_no);
  81.     strncpy(p->p_mapchars, buf, 2);
  82. }
  83.  
  84. void
  85. checksystems(p)
  86. register struct player    *p;
  87. {
  88.     register struct planet    *l;
  89.     register int        i;
  90.     int            plcount[MAXTEAM];
  91.  
  92.     /* Reset */
  93.     p->p_pick = 0;
  94.  
  95.     /* We can always enter at our own system. */
  96.     p->p_pick |= (1 << p->p_ship->s_team);
  97.  
  98.     if (isGod(p) || p->p_ship->s_team == 0) {
  99.         p->p_pick |= ((1 << FED) | (1 << ROM) | (1 << KLI) | (1 << ORI));
  100.         return;
  101.     }
  102.  
  103.     bzero(plcount, sizeof (plcount));
  104.  
  105.     for (i = 0, l = &planets[i]; i < MAXPLANETS; i++, l++) {
  106.         if (l->pl_type == CLASSM || l->pl_type == DEAD) {
  107.             if (l->pl_owner == pdata[i].pl_owner)
  108.                 plcount[l->pl_owner]++;
  109.         }
  110.     }
  111.  
  112.     if (!plcount[FED] && planets[0].pl_owner == p->p_ship->s_team)
  113.         p->p_pick |= (1 << FED);
  114.     if (!plcount[ROM] && planets[1].pl_owner == p->p_ship->s_team)
  115.         p->p_pick |= (1 << ROM);
  116.     if (!plcount[KLI] && planets[2].pl_owner == p->p_ship->s_team)
  117.         p->p_pick |= (1 << KLI);
  118.     if (!plcount[ORI] && planets[3].pl_owner == p->p_ship->s_team)
  119.         p->p_pick |= (1 << ORI);
  120. }
  121.  
  122. enter_ship(p, disp, tno)
  123. register struct player    *p;
  124. char            *disp;
  125. int            tno;
  126. {
  127.     char        *pseudo, buf[80];
  128.     register struct planet    *l;
  129.     register int        i;
  130.     char            *customship;
  131.  
  132.     customship = (char *) NULL;
  133.     if (strcmp(disp, "Nowhere")) {
  134. #ifdef CUSTOMSHIP
  135.     customship = XGetDefault(p->display, PROGRAM_NAME, p->p_shipname);
  136. #endif
  137.     }
  138.  
  139.     p->p_ship->s_stats.st_entries++;
  140.     p->p_ship->s_updates = udcounter;
  141.     p->p_ship->s_status = 0;
  142.     p->p_ship->s_explode = 0;
  143.     p->p_ship->s_whydead = 0;
  144.     p->p_ship->s_whodead = 0;
  145.     p->p_ship->s_flags = SFSHIELD;
  146.     p->p_ship->s_dir = 0;
  147.     p->p_ship->s_desdir = 0;
  148.     p->p_ship->s_speed = 0;
  149.     p->p_ship->s_desspeed = 0;
  150.     p->p_ship->s_subspeed = 0;
  151.     if (!p->p_ship->s_team)
  152.         p->p_ship->s_team = tno;
  153.     /* Find the teams home planet...using initial setup. */
  154.     for (i = 0, l = &pdata[0]; i < MAXPLANETS; i++, l++) {
  155.     if ((l->pl_flags & PLHOME) && (l->pl_owner == tno))
  156.         break;
  157.     }
  158.     if (i >= MAXPLANETS)    /* ...then we didn't find it. */
  159.     l = &planets[0];    /* so just use planet[0] */
  160.     else
  161.     l = &planets[i];    /* now switch to current data */
  162.     p->p_ship->s_x = l->pl_x + (random() % 10000) - 5000;
  163.     p->p_ship->s_y = l->pl_y + (random() % 10000) - 5000;
  164.     p->p_ship->s_ntorp = 0;
  165.     p->p_ship->s_damage = 0;
  166.     p->p_ship->s_subdamage = 0;
  167.     p->p_ship->s_etemp = 0;
  168.     p->p_ship->s_etime = 0;
  169.     p->p_ship->s_wtemp = 0;
  170.     p->p_ship->s_wtime = 0;
  171.     p->p_ship->s_subshield = 0;
  172.     p->p_ship->s_armies = 0;
  173. #ifndef CUSTOMSHIP
  174.     customship = (char *) NULL;
  175. #endif
  176.     getship(p, customship);
  177.     p->p_ship->s_swar = 0;
  178.     p->p_ship->s_hostile = ((1 << FED)|(1 << ROM)|(1 << KLI)|(1 << ORI));
  179.     p->p_ship->s_hostile &= ~(1 << p->p_ship->s_team);
  180.     if (p->p_ship->s_team == GOD)
  181.     p->p_ship->s_hostile = 0;    /* Peaceful God */
  182.     p->p_ship->s_shield = p->p_ship->s_maxshields;
  183.     p->p_ship->s_fuel = p->p_ship->s_maxfuel;
  184.     p->p_ship->s_delay = 0;
  185.     p->p_ship->s_oldalert = SFGREEN;
  186.     p->p_ship->s_Ten = 0;
  187. }
  188.  
  189. findslot()
  190. {
  191.     register int i;
  192.  
  193.     for (i = 0; i < MAXPLAYER; i++) {
  194.     if (players[i].p_status == PFREE) {    /* We have a free slot */
  195.         break;
  196.     }
  197.     }
  198.     if (i < MAXPLAYER) {
  199.         bzero(&players[i], sizeof(struct player));  /* Slight problem for copilot */
  200.         players[i].p_status = PSETUP;    /* possible race code */
  201.         players[i].p_no = i;
  202.     }
  203.     return(i);
  204. }
  205.