home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume6 / gb / part03 / load.c < prev    next >
C/C++ Source or Header  |  1989-07-06  |  7KB  |  307 lines

  1.  
  2. /*
  3.  * Galactic Bloodshed (Robert Chansky, smq@b)
  4.  *  load.c -- load/unload stuff
  5.  */
  6.  
  7. #include "vars.h"
  8. #include "ships.h"
  9. #include "races.h"
  10. #include <curses.h>
  11. #include <signal.h>
  12. #include <setjmp.h>
  13. extern jmp_buf main_jenv;
  14. extern int Ignore_filelocks;
  15. extern char telegram_buf[AUTO_TELEG_SIZE];
  16. int load_shdata,load_pdata,load_sectdata;
  17.  
  18.  
  19. load(APcount, argn,args)
  20. int APcount;
  21. int argn;
  22. char args[MAXARGS][COMMANDSIZE];
  23. {
  24. int first=1,proc,Mod=0,jett=0,lolim,uplim,shipno,amt;
  25. char commod, buf[100],bufr[70],bufd[70],buff[70],bufc[70];
  26. shiptype *s,*s2;
  27. planettype *p;
  28. sectortype *sect;
  29. int load_handler();
  30.  
  31.     load_shdata = load_pdata = load_sectdata = NEUTRAL_FD;
  32.     signal(SIGINT, load_handler);
  33.  
  34.     if (argn==1) {
  35.       printf("ship #");
  36.       scanf("%d",&shipno);
  37.       getchr();
  38.     } else 
  39.     shipno = atoi(args[1] + ((args[1][0])=='#') ? 1 : 0);
  40.  
  41.     openshdata(&load_shdata);
  42.     if (!getship(load_shdata,&s,shipno)) {
  43.     load_handler();
  44.     }
  45.     if (s->owner!=Playernum || s->is_dead) {
  46.     DontOwnErr(shipno);
  47.     printf("(%d)\n",s->owner);
  48.     free(s);
  49.     load_handler();
  50.     }
  51.     if (s->rad) {
  52.     printf("%s #%d is irradiated and inactive.\n", Shipnames[s->type],shipno);
  53.     free(s);
  54.     load_handler();
  55.     }
  56.  
  57.  
  58.    do {
  59.  
  60.     proc = 0;
  61.  
  62.     if (s->type == OTYPE_TRANSDEV) {
  63.     Ignore_filelocks = 1;
  64.     if (!getship(load_shdata,&s2, s->orders.object.number)) {
  65.         printf("The hopper seems to be blocked.\n");
  66.         load_handler();
  67.     }
  68.     Ignore_filelocks = 0;
  69.     if (s2->is_dead) {
  70.         printf("The target device does not exist.\n");
  71.         load_handler();
  72.     }
  73.     if (s2->type!=OTYPE_TRANSDEV || !s2->orders.object.on) {
  74.         printf("The target device is not receiving.\n");
  75.         load_handler();
  76.     }
  77.     }
  78.  
  79.  
  80.     if ( !(s->is_docked && s->whatdest==LEVEL_PLAN && s->whatorbits==LEVEL_PLAN) ) {
  81.     if (s->type==OTYPE_TRANSDEV) {
  82.         printf("It does not seem to work in zero-g environments.\n");
  83.         load_handler();
  84.     }
  85.     printf("%s #%d is not landed.\n",is_object(s)?"object":"ship",shipno);
  86.           tty_on();
  87.     printf("  jettison into open space (y/n)?");
  88.     jett = 1;
  89.           commod=getchr();
  90.           tty_off();
  91.           if (commod!='y')
  92.         load_handler();
  93.     }
  94.  
  95.  
  96.     if (!jett) {
  97.         openpdata(&load_pdata);
  98.         getplanet(load_pdata,&p,Stars[Dir.snum]->planetpos[Dir.pnum]);
  99.     }
  100.  
  101.     if (first) {
  102.       if (s->whatorbits==LEVEL_UNIV)
  103.         if (!enufAP(Sdata.AP, APcount))
  104.         load_handler();
  105.       else 
  106.     if (!enufAP(Stars[s->storbits]->AP, APcount))
  107.         load_handler();
  108.     }
  109.  
  110.  
  111.    do {
  112.  
  113.     tty_on();
  114.     printf("%s #%d:(rfdc? q) >", is_object(s) ? "object" : "ship",shipno);
  115.     commod = getchr();
  116.     putchr('\n');
  117.     tty_off();
  118.  
  119.     if (!jett && commod=='c') {
  120.         opensectdata(&load_sectdata);
  121.         getsector(load_sectdata,§,p->sectormappos + ( (int)s->ypos*p->Maxx+(int)s->xpos) * sizeof(sectortype) );
  122.     }
  123.  
  124.     switch (commod) {
  125.     case 'c': lolim = - s->popn;
  126.           uplim = jett ? 0 : 
  127.             MIN(sect->popn, 
  128.                   Shipdata[s->type][ABIL_MAXCREW] - s->popn);
  129.           proc = 1;
  130.           break;
  131.     case 'd': lolim = - s->destruct;
  132.           uplim = jett ? 0 : 
  133.             MIN(p->info[Playernum-1].destruct,
  134.                      Shipdata[s->type][ABIL_DESTCAP] - s->destruct);
  135.           proc = 1;
  136.           break;
  137.     case 'f': lolim = - s->fuel;
  138.           uplim = jett ? 0 : MIN(p->info[Playernum-1].fuel,
  139.                      Shipdata[s->type][ABIL_FUELCAP] - s->fuel);
  140.           proc = 1;
  141.           break;
  142.     case 'r': lolim = - s->resource;
  143.           uplim = jett ? 0 : MIN(p->info[Playernum-1].resource,
  144.                      Shipdata[s->type][ABIL_CARGO] - s->resource);
  145.           proc = 1;
  146.           break;
  147.     case '?': printf("\nship #%d at %.0f,%.0f:\n   res:%u\n   fuel:%.1f\n   crew:%u\n   dest:%u\n", shipno,s->xpos,s->ypos, s->resource, s->fuel, s->popn, s->destruct);
  148.           proc = 0;
  149.           break;
  150.     case 'q':
  151.     case ' ':
  152.           load_handler();
  153.           break;
  154.     default:  printf("%c not valid.\n",commod);
  155.           proc = 0;
  156.           load_handler();
  157.       }
  158.      } while (!proc);
  159.  
  160.       tty_off();
  161.       amt = uplim + 1;
  162.       while (amt<lolim || amt>uplim) {
  163.       printf("      amount (%d to %d) ",lolim,uplim);
  164.       if (scanf("%d",&amt)!=1) 
  165.         amt=uplim+1;    /* force error */
  166.       getchr();
  167.       }
  168.     if (amt == 0)
  169.      load_handler();
  170.  
  171.     switch (commod) {
  172.     case 'c': if (!jett) {
  173.               if (sect->popn==0 && amt<0) {
  174.                 p->info[Playernum-1].numsectsowned++;
  175.                 sect->owner = Playernum;
  176.                 printf("sector %.0f,%.0f COLONIZED.\n",s->xpos,s->ypos);
  177.               }
  178.               sect->popn -= (us)amt;
  179.               p->popn -= amt;
  180.               if (sect->popn==0) {
  181.                 p->info[Playernum-1].numsectsowned--;
  182.                 sect->owner = 0;
  183.                 printf("sector %.0f,%.0f evacuated.\n",s->xpos,s->ypos);
  184.               }
  185.           }
  186.           printf("crew complement of ship #%d is now %u.\n", 
  187.             shipno, s->popn+amt);
  188.           s->popn += amt;
  189.           s->mass += amt*Race->mass;
  190.           Mod = 1;
  191.           break;
  192.     case 'd': s->destruct += amt;
  193.           s->mass += amt*MASS_DESTRUCT;
  194.           if (!jett)
  195.               p->info[Playernum-1].destruct -= amt;
  196.           Mod = 1;
  197.           break;
  198.     case 'f': s->fuel += amt;
  199.           s->mass += amt*MASS_FUEL;
  200.           if (!jett)
  201.               p->info[Playernum-1].fuel -= amt;
  202.           Mod = 1;
  203.           break;
  204.     case 'r': s->resource += amt;
  205.           s->mass += amt*MASS_RESOURCE;
  206.           if (!jett)
  207.               p->info[Playernum-1].resource -= amt;
  208.           Mod = 1;
  209.           break;
  210.     case 'q':
  211.     case ' ':
  212.     case '?':
  213.     default:
  214.         break;
  215.     }
  216.  
  217.     putship(load_shdata,s,shipno);
  218.  
  219.     if (s->type==OTYPE_TRANSDEV) {
  220.     /* send stuff to other transport device */
  221.     if (s->resource) {
  222.         printf("Zap! %d resources sent.\n", s->resource);
  223.         sprintf(bufr, "%d Resources\n",s->resource);
  224.         s2->mass += s->resource * MASS_RESOURCE;
  225.         s2->resource += s->resource;
  226.         s->resource = 0;
  227.     } else
  228.         bufr[0] = '\0';
  229.     if (s->fuel) {
  230.         printf("Zap! %g fuel sent.\n", s->fuel);
  231.         sprintf(buff, "%g Fuel\n",s->fuel);
  232.         s2->mass += s->fuel * MASS_FUEL;
  233.         s2->fuel += s->fuel;
  234.         s->fuel = 0.0;
  235.     } else
  236.         buff[0] = '\0';
  237.     if (s->destruct) {
  238.         printf("Zap! %d destruct sent.\n", s->destruct);
  239.         sprintf(bufd, "%d Destruct\n",s->destruct);
  240.         s2->mass += s->destruct * MASS_DESTRUCT;
  241.         s2->destruct += s->destruct;
  242.         s->destruct = 0;
  243.     } else
  244.         bufd[0] = '\0';
  245.     if (s->popn) {
  246.         printf("Zap! %d popn sent.\n", s->popn);
  247.         sprintf(bufc, "%d %s\n",s->destruct,Race->Thing?"tons of biomass" : "population");
  248.         s2->mass += s->popn * Race->mass;
  249.         s2->popn += s->popn;
  250.         s->popn = 0;
  251.     } else
  252.         bufc[0] = '\0';
  253.     putship(load_shdata,s2,s->orders.object.number);
  254.  
  255.       if (s2->owner!=s->owner) {
  256.     teleg_add("", telegram_buf);
  257.     teleg_add("BULLETIN!\n\n Audio-vibatory-physio-molecular transport device #",telegram_buf);
  258.     sprintf(buf,"%d just gave your ship #%d the following:\n", shipno, s->orders.object.number);
  259.     teleg_add(buf,telegram_buf);
  260.     teleg_add(bufr,telegram_buf);
  261.     teleg_add(bufd,telegram_buf);
  262.     teleg_add(buff,telegram_buf);
  263.     teleg_add(bufc,telegram_buf);
  264.     teleg_send(TELEG_PLAYER_AUTO, s2->owner, telegram_buf);
  265.       }
  266.     }
  267.  
  268.  
  269.     if (!jett) {
  270.  
  271.       if (commod=='c') {
  272.     putsector(load_sectdata,sect,p->sectormappos + ( (int)s->ypos*p->Maxx+(int)s->xpos) * sizeof(sectortype) );
  273.         close(load_sectdata);
  274.     free(sect);
  275.        }
  276.  
  277.        putplanet(load_pdata,p,Stars[Dir.snum]->planetpos[Dir.pnum]);
  278.        close(load_pdata);
  279.        free(p);
  280.      }
  281.  
  282.     if (Mod && first) {
  283.          first = 0;
  284.          if (s->whatorbits==LEVEL_UNIV)
  285.         deductAPs(APcount, 0, 1);    /* ded from sdata */
  286.          else 
  287.         deductAPs(APcount, s->storbits, 0);
  288.  
  289.     }
  290.  
  291.    } while (1);
  292.  
  293.  
  294.  
  295. }
  296.  
  297.  
  298.  
  299. load_handler()
  300. {
  301.  Ignore_filelocks = 0;
  302.  close(load_shdata);
  303.  close(load_pdata);
  304.  close(load_sectdata);
  305.  longjmp(main_jenv,1);
  306. }
  307.