home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
games
/
volume6
/
gb
/
part03
/
load.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-07-06
|
7KB
|
307 lines
/*
* Galactic Bloodshed (Robert Chansky, smq@b)
* load.c -- load/unload stuff
*/
#include "vars.h"
#include "ships.h"
#include "races.h"
#include <curses.h>
#include <signal.h>
#include <setjmp.h>
extern jmp_buf main_jenv;
extern int Ignore_filelocks;
extern char telegram_buf[AUTO_TELEG_SIZE];
int load_shdata,load_pdata,load_sectdata;
load(APcount, argn,args)
int APcount;
int argn;
char args[MAXARGS][COMMANDSIZE];
{
int first=1,proc,Mod=0,jett=0,lolim,uplim,shipno,amt;
char commod, buf[100],bufr[70],bufd[70],buff[70],bufc[70];
shiptype *s,*s2;
planettype *p;
sectortype *sect;
int load_handler();
load_shdata = load_pdata = load_sectdata = NEUTRAL_FD;
signal(SIGINT, load_handler);
if (argn==1) {
printf("ship #");
scanf("%d",&shipno);
getchr();
} else
shipno = atoi(args[1] + ((args[1][0])=='#') ? 1 : 0);
openshdata(&load_shdata);
if (!getship(load_shdata,&s,shipno)) {
load_handler();
}
if (s->owner!=Playernum || s->is_dead) {
DontOwnErr(shipno);
printf("(%d)\n",s->owner);
free(s);
load_handler();
}
if (s->rad) {
printf("%s #%d is irradiated and inactive.\n", Shipnames[s->type],shipno);
free(s);
load_handler();
}
do {
proc = 0;
if (s->type == OTYPE_TRANSDEV) {
Ignore_filelocks = 1;
if (!getship(load_shdata,&s2, s->orders.object.number)) {
printf("The hopper seems to be blocked.\n");
load_handler();
}
Ignore_filelocks = 0;
if (s2->is_dead) {
printf("The target device does not exist.\n");
load_handler();
}
if (s2->type!=OTYPE_TRANSDEV || !s2->orders.object.on) {
printf("The target device is not receiving.\n");
load_handler();
}
}
if ( !(s->is_docked && s->whatdest==LEVEL_PLAN && s->whatorbits==LEVEL_PLAN) ) {
if (s->type==OTYPE_TRANSDEV) {
printf("It does not seem to work in zero-g environments.\n");
load_handler();
}
printf("%s #%d is not landed.\n",is_object(s)?"object":"ship",shipno);
tty_on();
printf(" jettison into open space (y/n)?");
jett = 1;
commod=getchr();
tty_off();
if (commod!='y')
load_handler();
}
if (!jett) {
openpdata(&load_pdata);
getplanet(load_pdata,&p,Stars[Dir.snum]->planetpos[Dir.pnum]);
}
if (first) {
if (s->whatorbits==LEVEL_UNIV)
if (!enufAP(Sdata.AP, APcount))
load_handler();
else
if (!enufAP(Stars[s->storbits]->AP, APcount))
load_handler();
}
do {
tty_on();
printf("%s #%d:(rfdc? q) >", is_object(s) ? "object" : "ship",shipno);
commod = getchr();
putchr('\n');
tty_off();
if (!jett && commod=='c') {
opensectdata(&load_sectdata);
getsector(load_sectdata,§,p->sectormappos + ( (int)s->ypos*p->Maxx+(int)s->xpos) * sizeof(sectortype) );
}
switch (commod) {
case 'c': lolim = - s->popn;
uplim = jett ? 0 :
MIN(sect->popn,
Shipdata[s->type][ABIL_MAXCREW] - s->popn);
proc = 1;
break;
case 'd': lolim = - s->destruct;
uplim = jett ? 0 :
MIN(p->info[Playernum-1].destruct,
Shipdata[s->type][ABIL_DESTCAP] - s->destruct);
proc = 1;
break;
case 'f': lolim = - s->fuel;
uplim = jett ? 0 : MIN(p->info[Playernum-1].fuel,
Shipdata[s->type][ABIL_FUELCAP] - s->fuel);
proc = 1;
break;
case 'r': lolim = - s->resource;
uplim = jett ? 0 : MIN(p->info[Playernum-1].resource,
Shipdata[s->type][ABIL_CARGO] - s->resource);
proc = 1;
break;
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);
proc = 0;
break;
case 'q':
case ' ':
load_handler();
break;
default: printf("%c not valid.\n",commod);
proc = 0;
load_handler();
}
} while (!proc);
tty_off();
amt = uplim + 1;
while (amt<lolim || amt>uplim) {
printf(" amount (%d to %d) ",lolim,uplim);
if (scanf("%d",&amt)!=1)
amt=uplim+1; /* force error */
getchr();
}
if (amt == 0)
load_handler();
switch (commod) {
case 'c': if (!jett) {
if (sect->popn==0 && amt<0) {
p->info[Playernum-1].numsectsowned++;
sect->owner = Playernum;
printf("sector %.0f,%.0f COLONIZED.\n",s->xpos,s->ypos);
}
sect->popn -= (us)amt;
p->popn -= amt;
if (sect->popn==0) {
p->info[Playernum-1].numsectsowned--;
sect->owner = 0;
printf("sector %.0f,%.0f evacuated.\n",s->xpos,s->ypos);
}
}
printf("crew complement of ship #%d is now %u.\n",
shipno, s->popn+amt);
s->popn += amt;
s->mass += amt*Race->mass;
Mod = 1;
break;
case 'd': s->destruct += amt;
s->mass += amt*MASS_DESTRUCT;
if (!jett)
p->info[Playernum-1].destruct -= amt;
Mod = 1;
break;
case 'f': s->fuel += amt;
s->mass += amt*MASS_FUEL;
if (!jett)
p->info[Playernum-1].fuel -= amt;
Mod = 1;
break;
case 'r': s->resource += amt;
s->mass += amt*MASS_RESOURCE;
if (!jett)
p->info[Playernum-1].resource -= amt;
Mod = 1;
break;
case 'q':
case ' ':
case '?':
default:
break;
}
putship(load_shdata,s,shipno);
if (s->type==OTYPE_TRANSDEV) {
/* send stuff to other transport device */
if (s->resource) {
printf("Zap! %d resources sent.\n", s->resource);
sprintf(bufr, "%d Resources\n",s->resource);
s2->mass += s->resource * MASS_RESOURCE;
s2->resource += s->resource;
s->resource = 0;
} else
bufr[0] = '\0';
if (s->fuel) {
printf("Zap! %g fuel sent.\n", s->fuel);
sprintf(buff, "%g Fuel\n",s->fuel);
s2->mass += s->fuel * MASS_FUEL;
s2->fuel += s->fuel;
s->fuel = 0.0;
} else
buff[0] = '\0';
if (s->destruct) {
printf("Zap! %d destruct sent.\n", s->destruct);
sprintf(bufd, "%d Destruct\n",s->destruct);
s2->mass += s->destruct * MASS_DESTRUCT;
s2->destruct += s->destruct;
s->destruct = 0;
} else
bufd[0] = '\0';
if (s->popn) {
printf("Zap! %d popn sent.\n", s->popn);
sprintf(bufc, "%d %s\n",s->destruct,Race->Thing?"tons of biomass" : "population");
s2->mass += s->popn * Race->mass;
s2->popn += s->popn;
s->popn = 0;
} else
bufc[0] = '\0';
putship(load_shdata,s2,s->orders.object.number);
if (s2->owner!=s->owner) {
teleg_add("", telegram_buf);
teleg_add("BULLETIN!\n\n Audio-vibatory-physio-molecular transport device #",telegram_buf);
sprintf(buf,"%d just gave your ship #%d the following:\n", shipno, s->orders.object.number);
teleg_add(buf,telegram_buf);
teleg_add(bufr,telegram_buf);
teleg_add(bufd,telegram_buf);
teleg_add(buff,telegram_buf);
teleg_add(bufc,telegram_buf);
teleg_send(TELEG_PLAYER_AUTO, s2->owner, telegram_buf);
}
}
if (!jett) {
if (commod=='c') {
putsector(load_sectdata,sect,p->sectormappos + ( (int)s->ypos*p->Maxx+(int)s->xpos) * sizeof(sectortype) );
close(load_sectdata);
free(sect);
}
putplanet(load_pdata,p,Stars[Dir.snum]->planetpos[Dir.pnum]);
close(load_pdata);
free(p);
}
if (Mod && first) {
first = 0;
if (s->whatorbits==LEVEL_UNIV)
deductAPs(APcount, 0, 1); /* ded from sdata */
else
deductAPs(APcount, s->storbits, 0);
}
} while (1);
}
load_handler()
{
Ignore_filelocks = 0;
close(load_shdata);
close(load_pdata);
close(load_sectdata);
longjmp(main_jenv,1);
}