DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T l

⟦6d5c48068⟧ TextFile

    Length: 3757 (0xead)
    Types: TextFile
    Names: »launch.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Gb/launch.c« 

TextFile

/*
 * Galactic Bloodshed (Robert Chansky, smq@b)
 *  launch.c -- launch or undock a ship
 */

#include "vars.h"
#include "ships.h"
#include <setjmp.h>
extern jmp_buf main_jenv;
#include <signal.h>

int launch_shdata,launch_pdata;
extern int Ignore_filelocks;


launch(APcount, argn,args)
int APcount;
int argn;
char args[MAXARGS][COMMANDSIZE];
{
int launch_handler();
shiptype *s,*s2;
planettype *p;
bool planet=0;
int shipno,o;
float fuel;

launch_shdata = launch_pdata = NEUTRAL_FD;
signal(SIGINT, launch_handler);

  if (argn!=2) {
	printf("Launch what ship #");
	scanf("%d",&shipno);
	getchr();
  } else {
	o = (args[1][0]=='#');
	sscanf(args[1]+o,"%d",&shipno);
  }
  openshdata(&launch_shdata);
  if (!getship(launch_shdata, &s, shipno)) {
	launch_handler();
  }
  if (s->owner!=Playernum) {
	DontOwnErr(shipno);
	launch_handler();
  }
  if (!can_move(s)) {
	printf("That cannot be launched.\n");
	launch_handler();
  }
  if (s->rad) {
	printf("%s irradiated and inactive.\n", Shipnames[s->type]);
	launch_handler();
  }
  if (!s->is_docked) {
	printf("Ship #%d is not landed or docked.\n",shipno);
	launch_handler();
  }

  if (s->whatdest==LEVEL_SHIP) {

  	if (s->whatorbits==LEVEL_UNIV)
	  if (!enufAP(Sdata.AP, APcount)) 
		launch_handler();
	  else
  		deductAPs(APcount, 0, 1);
  	else
	  if (!enufAP(Stars[s->storbits]->AP, APcount)) 
		launch_handler();
	  else
  		deductAPs(APcount, s->storbits, 0);
	Ignore_filelocks = 1;
	(void)getship(launch_shdata, &s2, s->destshipno);
	Ignore_filelocks = 0;
	s->is_docked = 0;
	s->whatdest = LEVEL_UNIV;	/* no destination */
	putship(launch_shdata, s, shipno);
	s2->is_docked = 0;
	s2->whatdest = LEVEL_UNIV;
	putship(launch_shdata, s2, s->destshipno);
	close(launch_shdata);
	free(s);
	free(s2);
	printf("%s #%d undocked from ship #%d", Shipnames[s->type], shipno, s->destshipno);

  } else {
	  if (!enufAP(Stars[s->storbits]->AP, APcount)) 
		launch_handler();
	  else
  		deductAPs(APcount, s->storbits, 0);

  s->is_docked = 0;
  s->whatdest = LEVEL_UNIV;	/* no destination */


	/* adjust x,ypos to absolute coords */
  openpdata(&launch_pdata);
  getplanet(launch_pdata, &p, Stars[s->storbits]->planetpos[s->pnumorbits]);
  if (p->is_explored)		/* no alteration of the planet unless this.. */
  	close(launch_pdata);

  printf("Planet /%s/%s has gravity field of %.2f\n", Stars[s->storbits]->name,
	Stars[s->storbits]->pnames[s->pnumorbits], gravity(p));
   /* alter sector location of ship x,y to stellar coords x,y */
  s->xpos = Stars[s->storbits]->xpos + p->xpos + 
		(float)int_rand((int)(-DIST_TO_LAND),(int)(DIST_TO_LAND));
  s->ypos = Stars[s->storbits]->ypos + p->ypos + 
		(float)int_rand((int)(-DIST_TO_LAND),(int)(DIST_TO_LAND));

   /* subtract fuel from ship */
  fuel = gravity(p) * s->mass * LAUNCH_GRAV_MASS_FACTOR;
  if (s->fuel < fuel) {
	printf("Ship #%d does not have enough fuel! (%.1f)\n",shipno, fuel);
	launch_handler();
  }
  s->fuel -= fuel;
  s->mass -= fuel * MASS_FUEL;

  deductAPs(APcount, s->storbits, 0);


  if (s->type == OTYPE_CANIST)
	s->orders.object.number = 20;	/* canister dissapates after 20 turns */

  putship(launch_shdata, s, shipno);
  close(launch_shdata);

  if (!p->is_explored) {
		/* not yet explored by owner; space exploration causes the
		   player to see a whole map */
	p->is_explored = 1;
  	putplanet(launch_pdata,p,Stars[s->storbits]->planetpos[s->pnumorbits]);
  	close(launch_pdata);
  }
  free(p);

  printf("%s #%d launched from planet,", Shipnames[s->type], shipno);
  printf(" using %.1f fuel.\n",fuel);
  if (s->type == OTYPE_CANIST)
	printf("A thick cloud of dust envelops your planet.\n");

  free(s);

  }

}


launch_handler()
{
 Ignore_filelocks = 0;
 close(launch_pdata);
 close(launch_shdata);
 longjmp(main_jenv,1);
}