startrek - z88dk/z88dk GitHub Wiki

/* StartTrek.c   */
#include `<string.h>`
#include `<stdio.h>`
#include `<stdlib.h>`
#include `<time.h>`   /* Needed just for srand seed */

struct quadrant {
	int KlingonCount;
	int BaseHere;
	int StarCount;
};

struct klingon {
	int Energy;
	int X;
	int Y;
};

/* Enums for damage array, 0 not used */
#define  short_range_sensors 1
#define  computer_display 2
#define  long_range_sensors 3
#define  phasers 4
#define  warp_engine 5
#define  photon_torpedo_tubes 6;
#define  shield 7

int Sectors[9*9];
struct quadrant Quadrants[9*9];
struct klingon Klingons[ 5 ];
int Damage[8];  /*  Systems ok =0, >0= not working */

/*Game Status Variables */
int NumKlingons = 0;
int KlingonsHere =0;
int NumBases=0;
int Numdays=0;
int NumTorps=0;
int NumCasualties =0;
int NumDeadKlingons=0;

/* Enterprise Location, Energy etc*/
int EQuadrantX=0;
int EQuadrantY=0;
int ESectorX=0;
int ESectorY=0;
int IsDocked=0;
int Energy=0;

/* General Global Variables */
int Dir=0;
int Speed;
int X;
int Y;
int OffX;
int OffY;
int Range;
int CanExit=0;

/*function prototypes  */
 void InitVars();
 void DoReport();
 void ShowStatus( int Device);
 void HitKlingons();
 void ShowEnterpriseLoc();
 void HitKlingon(int Klindex,int BlastPower);
 void GetCommand();
 void EnterQuadrant(int QuadrantX,int QuadrantY);

 /* Commands */
 //void DoReport();			/* R */
 void DoLRScan();			/* L */
 void DoSRS();			/* S */
 void FirePhasers();		/* F */
 void FirePhotonTorpedo();	/* T */
 void ShowGalaxyMap();		/* G */
 void DoWarp();				/* W */
 void DoQuit();				/* Q */

  int InputDirection( );
 int  IsSectorValid(int x,int y);
 void TakeDamage( int Total); 
 void FindEmptySector( int * X,int * Y );
 //int  InputDirection();
 void PlaceBases( int NumBases );
 void PlaceStars( int NumStars );
 void PlaceKlingons(int NumKlingons );
 void PopulateQuadrant(int X,int Y );
 void LeaveGalaxy(int Speed);
 void PhotonHitKlingon(int X,int Y);
 void PhotonHitBase(int X,int Y);
 void PhotonHitStar(int X,int Y);

 int Random(int Max) {
	  return ( rand() % Max)+ 1; 
   }

 int GetKlingons(int diff) {
	   /* was M=(M<209) || (M<99)||(M<49)||(M<24)||(M<9)||(M<2); */
	   int dice;
	   dice= Random( diff);
	   if  (dice < 2)
		   return 5;
	   
	   if  (dice < 9)
		   return 5;
	   if  (dice < 24)
		   return 4;
	   if  (dice < 49)
		   return 3;
	   if  (dice < 99)
		   return 2;
	   if  (dice < 209)
		   return 1;
	  return 0;
   }

  void SetupGalaxy(int Difficulty) {


  int x,y,J,temp,BaseHere;
  do { 
	  /* Clear all data */
	  for (x=1;x <=8; x++) 	  { 
		  for (y=1;y<=8;y++)    {
			  Sectors[x*9+y]=0;
			  Quadrants[x*9+y].BaseHere=0;
			  Quadrants[x*9+y].KlingonCount=0;
			  Quadrants[x*9+y].StarCount=0;
		  }
	  }


	  KlingonsHere=0; /* 15 */
	  NumBases=0;

	  for (x=1; x<=8;x++) {
		  for (y=1;y<=8;y++)  {
		 J= Random(99);
		 BaseHere=0;
		 if (J<5) 
		 {
			 NumBases++;
			 BaseHere=1;
		 }
		 temp=GetKlingons(Difficulty);
		 
		 KlingonsHere += temp;
		 Quadrants[x*9+y].BaseHere=BaseHere;
		 Quadrants[x*9+y].KlingonCount = temp;
		 Quadrants[x*9+y].StarCount =Random(3);
	  }
	  }
  }
  while (NumBases<2 || KlingonsHere<4);
  NumKlingons = KlingonsHere;	 
 }
/* ----------------------- */

  int IsSectorValid(int x,int y) {
	  return (x >=1 && x < 9 && y>=1 && y < 9);
  }

	 /* check for presence of Starbase */
	void CheckStarbase() {  /* 145 */
		int I,J,X,Y;
	IsDocked =0;
    for (I=-1;I<=1;I++)
	{
       X= I+EQuadrantX;
	   for (J=-1; J< 1; J++) 
	   {
		   Y = J + EQuadrantY;
		   if (IsSectorValid(X,Y) && Quadrants[X*9+Y].BaseHere)
		   IsDocked=1;
	   }
	}
	 return;
	}

	/* CheckIfDocked Function */
	void CheckIfDocked() { /* 155 */
	
    if (IsDocked) 
		printf("SULU: CAPTAIN, WE ARE DOCKED AT STARBASE.");
    InitVars();
    return;
	}	

	/* InitVars */
	 void InitVars() { /* 160 */
 	int I;
     Energy=4000;
	 Numdays=30;
     NumTorps=10,
	 IsDocked=0;
	 for (I = 1; I<= 7;I++)  /* All systems ok */
		 Damage[I]=0;
	 NumDeadKlingons=0;
	 NumCasualties=0;
     return;
	}

	/* Get player input and process it */
	void GetCommand() {/*  120   */
	char  Command[5];
	do {
  		printf("Command:");
		gets(Command);
		strcpy(Command,strupr(Command));
		 
		switch ( Command[0] ) {
		case 'Q' : DoQuit(); return;
			case 'R' : DoReport();continue;
			case 'S' : DoSRS();continue;
			case 'L' : DoLRScan();continue;
			case 'P' : FirePhasers();return;
			case 'G' : ShowGalaxyMap();continue;
			case 'T' : FirePhotonTorpedo();return;
			case 'W' : DoWarp();return;
		
		 default : {
					printf("R=REPORT       S=SR SENSOR   L=LR SENSOR \n\r");
					printf("G=GALAXY MAP   P=PHASER       T=TORPEDO \n\r");
					printf("W=WARP ENGINE  **PLEASE USE ONE OF THESE COMMANDS***\n\r");
					}
			} 
		}
	   while (1);

	   return;
	 }
 /*165 S=Random(8),T=Random(8),A=8*S+T+62;if (data[A) goto 165 */
 void FindEmptySector(int * X,int * Y ) {
	 do {

	   *X = Random(8)+1;
	   *Y = Random(8)+1;
	 }
	 while (Sectors[*X*9+*Y]);
 	return;
	 }


 void ShowEnterpriseLoc() {  /* 175 */
   printf("ENTERPRISE IN QUADRANT - (%u %u) SECTOR (%u %u)\n\r",EQuadrantX,EQuadrantY,ESectorX,ESectorY);
   return ;
 }


void ShowGalaxyMap() { /* 180 */
	int x,y,Device,aquadrant;
	ShowEnterpriseLoc();
	Device=computer_display;
	ShowStatus( Device); /* 375;  */
	if (Damage[ Device ])
		return;
	printf("GALAXY MAP\n\r    ");
	for (x=1;x<=8;x++)
		printf("%3u ",x);
	printf("\n\r   ---------------------------------\n\r");
	for (y=1; y <= 8;y++) {
		printf("%u | ",y);       
		for (x=1; x<=8 ;x++) {
		aquadrant = Quadrants[x*9+y].KlingonCount*100 +
			        Quadrants[x*9+y].BaseHere*10 +
					Quadrants[x*9+y].StarCount;
			printf("%3u ",aquadrant);
		}
		printf(" | %u\n\r",y);
	}
	printf("   ---------------------------------\n\r    ");
	for (x=1;x<=8;x++)
		printf("%3u ",x);

		printf("\n\r"); 
		return;

}

 /*  short_range_sensor=1;
  =3;
  phaser=4;
  warp_engine=5;
  photo_torpedo_tubes=6;
  shield=7;

  */

/* ------------------ */
 void DoLRScan() {/* 200  */
	int x,y,xl,yl,lrvalue,Device;
	ShowEnterpriseLoc();
	Device=long_range_sensors;
	ShowStatus(Device); /* 375  */
	if (Damage[ Device])
		return;
	printf("\n\r");
	for (y=-1;y<=1;y++) {
		yl = y + EQuadrantY;
		for (x=-1;x <=1;x++) {
			xl = x + EQuadrantX;
	
            lrvalue =0;
            if ( IsSectorValid(xl,yl) )			{
				lrvalue =	Quadrants[xl*9+yl].KlingonCount*100 + 
							Quadrants[xl*9+yl].BaseHere*10 +
							Quadrants[xl*9+yl].StarCount;
			}

		printf("%3u ",lrvalue);
		}
	 printf("\n\r");
	}
	printf("\n\r");
	return;
	}
/* -------------------  */

	void DoSRS() {/* 220  */
		
	int x,y,Device,S;

	ShowEnterpriseLoc();
	Device=short_range_sensors;

	ShowStatus( Device); /* 375;if (I/* Goto 120  */
	if (Damage[ Device])
		return;
	printf("\n\r    ");
	for (x=1; x<=8;x++)
	   printf("%u ",x);
	printf("\n\r   ----------------\n\r");
	for (y=1;y<=8;y++) {
		printf("%u |",y);
		for (x=1;x<=8;x++) {
			S= Sectors[x*9+y];
			switch (S) {
			case 0 :printf(" .");break;
			case 1 : printf(" K");break;	
			case 2 : printf(" B");break; 
			case 3 : printf(" *");break; 	
			case 4 : printf(" E");break; 
			default : printf("%x",S);break;
			}    
		}
		printf("| %u\n\r",y);
		}
	printf("   ----------------\n\r");
	printf("    ");
	for (x=1; x<=8;x++)
	   printf("%u ",x);
	printf("\n\r"); 
    return;
	}

/*------------------- */
	void FirePhasers() { /* 260   */
		char Blast[10];
		int BlastEnergy;
		int Klindex;
		int x,y,Device;
		int power=0;
     Device=phasers;
	 ShowStatus( Device); /* 375; */
	 if (Damage[ Device ])
		 return;

    printf(" ENERGIZED. UNITS TO FIRE? :");
	gets( Blast);
	BlastEnergy = atoi(Blast);
	if (BlastEnergy <1)
	   return;
	if (BlastEnergy > Energy) 
	{
		 printf("SPOCK: WE HAVE ONLY %u ENERGY UNITS. \n\r",Energy);
		return;
	}
    Energy-=BlastEnergy;
	if (KlingonsHere <1 ) {
		printf("PHASER FIRED AT EMPTY SPACE. \n\r"); 
		return;
	}
	BlastEnergy /= KlingonsHere;
    for ( Klindex=0;Klindex <5;Klindex++) 
		if (Klingons[Klindex].Energy> 0) {     
			if ( BlastEnergy>1090)   {
				printf("...OVERLOADED..");
				Damage[ phasers] =1;
				BlastEnergy=9;
				ShowStatus( phasers ); 
			}	
		  		
		  x=(Klingons[Klindex].X-ESectorX);
	      y=(Klingons[Klindex].Y-ESectorY);
	  	  power=BlastEnergy*30/(30+(x*x)+(y*y)+1);
		  printf("%u UNITS HIT \n\r",power);
		  HitKlingon(Klindex,power);
		}
	  
  return;
	}	 

/* ------------------------------------  */

	 void HitKlingon(int Klindex,int BlastPower) {
		int Kx = Klingons[Klindex].X;
		int Ky = Klingons[Klindex].Y;

	 if (BlastPower==0)
		 return;
	 printf("KLINGON AT S-(%u %u) ",Kx,Ky);
	 Klingons[Klindex].Energy -= BlastPower; 
     if ( Klingons[Klindex].Energy >0 )
		{
			 printf("  **DAMAGED**\n\r");
			 return;
		}
	 /* Destroyed if here */
     Klingons[Klindex].Energy=0;
	 KlingonsHere = --(Quadrants[EQuadrantX*9+EQuadrantY].KlingonCount);
	 
	 Sectors[Kx*9+Ky]=0;
    
	 NumKlingons=NumKlingons-1;
     
     printf("  ***DESTROYED***\n\r");
     return ;
	 }
	 
	 /* ---------------------------------- */
	 void DoKlingonAttack( int Attack) {/* 325 */
		 int Total=0;
		 int Klindex,Kx,Ky;

     if (Quadrants[EQuadrantX*9+EQuadrantY].KlingonCount==0)
       return;
	 printf("KLINGON ATTACK\n\r");
	 if (IsDocked) {
	     printf("STARBASE PROTECTS ENTERPRISE\n\r");
	     return;
	 }
	 
	 for (Klindex =0; Klindex < 5;Klindex++) {   /* 335 */
	   if (Klingons[Klindex].Energy>0) 
		{	
			Attack = Klingons[Klindex].Energy;
			Attack = Random( Attack);
			Total += Attack;
			Kx = Klingons[Klindex].X;
			Ky = Klingons[Klindex].Y;
            printf("%u UNITS HIT FROM KLINGON AT S-(%u %u) \n\r",Attack,Kx,Ky);
		}
	 }
	 Energy-=Total;
	 if (Energy<=0)
	 {
		 printf("*** BANG ***\n\r");
		 return;
	 }
	 printf("%u UNITS OF ENERGY LEFT.\n\r",Energy);
	 if (Random(Energy/4)>Total)  /* was it a piffling little attack? */
		 return;  /* yes   */

	 /* Oh oh Shields Damaged     */
	 if ( Damage[ shield] ==0)
		{
		 Damage[shield]=Random(Total/50+1),
		 ShowStatus( shield);
		 return;
		}
	 /* And random damage ...*/
     TakeDamage( Total);
	 return;
	}

 void TakeDamage( int Total) {
 int Casualties;
 int Device=Random(6);
 Damage[ Device] += Random(Total/99+1);

 /* there go the red shirts...*/
 Casualties=Random(8)+1,
 NumCasualties += Casualties;
 printf("MC COY: SICKBAY TO BRIDGE, WE SUFFERED %u CASUALTIES.\n\r",Casualties);
 ShowStatus( Device);
 return;
 }

 void ShowStatus(int Device) { /* 375   */
   
   int I=Damage[Device];
   switch ( Device)  {
        case 1 : printf("SHORT RANGE SENSOR "); break;
		case 2 : printf("COMPUTER DISPLAY ");break;
		case 3 :printf("LONG RANGE SENSOR ");break;
		case 4 :printf("PHASER "); break;
		case 5 :printf("WARP ENGINE ");break;
		case 6 :printf("PHOTON TORPEDO TUBES ");break;
		case 7 :printf("SHIELD ");break;
   }
   if (I==0) 
      return;
   printf("DAMAGED, %u STARDATES ESTIMATED FOR REPAIR\n\r",I);
   return; 
 }
 
 void DoReport() {
	int Device;
   printf("STATUS REPORT:\n\r");
   printf("==============\n\r");
   printf("STARDATE %u",3230-Numdays);
   printf("  TIME LEFT %u\n\r",Numdays );
   printf("CONDITION : ");
   if (IsDocked) 
	   printf("DOCKED");
   else
   {
	if (NumKlingons) 
	   printf("RED");/* Goto 445   */
	else
	  if (Energy>=999) 
         printf("YELLOW");
	   else
         printf("GREEN"); 
   }
  printf("\n\rPOSITION      Q-(%u %u) S-(%u %u)\n\r",EQuadrantX,EQuadrantY,ESectorX,ESectorY);
  printf("ENERGY :%u\n\r",Energy);
  printf("TORPEDOES :%u\n\r",NumTorps);
  printf("KLINGONS LEFT :%u\n\r",NumKlingons);
  printf("STARBASES : %u\n\r",NumBases);
  for (Device=1;Device<=7;Device++)
     if (Damage[Device])
		ShowStatus( Device );
  
     return;
 }
	
 void EnterQuadrant(int QuadrantX,int QuadrantY)
 {
	 EQuadrantY=QuadrantY;
	 EQuadrantX=QuadrantX;
	 PopulateQuadrant(QuadrantX,QuadrantY);
	 FindEmptySector( &ESectorX,&ESectorY );
	 Sectors[ESectorX*9+ESectorY]=4;
	 DoSRS();
 }

/*------------------------------------  */
	void DoWarp() {/* 465  */
	int DamageIndex;
	int index,I,J,Xs,Ys, Device; 
	char StrSpeed[10];
	Device=warp_engine;
	ShowStatus( Device); /* 375;     */
	if (Damage[Device]>3)
		return;
	do {
		printf("SECTOR DISTANCE TO TRAVEL:");
		gets(StrSpeed);
		Speed = atoi( StrSpeed);
        if (Speed<1)
          return;

        if (Damage[Device] > 0 && (Speed>2))
			{
				printf("CHEKOV: WE CAN TRY 2 AT MOST, SIR ");
				continue;
			}
		break;
		}
		while (1);
		   
	 if (Speed>91) 
		{
		   Speed=91;
		   printf("SPOCK: ARE YOU SURE, CAPTAIN?\n\r" );
		}

	 if (Energy<Speed*Speed/2) {
		   printf("SCOTTY: SIR, WE DO NOT HAVE THE ENERGY.\n\r");
		   return; 
		}

     Dir= InputDirection();
	 if (Dir==0)
		return; 
     Numdays--;
	 Energy-=(Speed*Speed)/2;
	 
	 Sectors[ESectorX*9+ESectorY]=0; 
	 /* Do Repairs   */
     for (DamageIndex=1;DamageIndex<=7;DamageIndex++) {
		  if ( Damage[ DamageIndex] > 0 )
		    Damage[DamageIndex]--;
     }
     Xs=45*ESectorX+22;
	 Ys=45*ESectorY+22,
	 Speed=45*Speed;
	 for (index=1;index<=8;index++) {
	    Speed=Speed-Range;
	if (Speed>=-22)
		{
		Xs+= OffX;
		Ys+= OffY;
		I=Xs/45;
		J=Ys/45;
		if  ( IsSectorValid( I,J) )
			{
			   if (EQuadrantX != I || EQuadrantY != J)
				   EnterQuadrant(I,J);
			}
		else
			LeaveGalaxy( Speed );
		}
	else
		{
			printf("**EMERGENCY STOP**");
			printf("SPOCK: TO ERR IS HUMAN\n\r " );
		}

 Sectors[ESectorX*9+ESectorY]=4;
 return;
	 }
}

	void LeaveGalaxy(int Speed)  {
	EQuadrantX= (EQuadrantX*72)+(ESectorX/5+Speed)/(5*Speed/Range)-9; /* 530  */
	ESectorX=EQuadrantX/72;
	EQuadrantY=(EQuadrantY*72)+(ESectorY/5+Speed)/(5*Speed/Range)-9;
	/*V=G/72;   */
	if (Random(9)<2) { /* 535  */
		printf("***SPACE STORM***");
        DoKlingonAttack( 100 );
		  
		if (  IsSectorValid( ESectorX,ESectorY)) {
			EQuadrantX=(EQuadrantX+9-72*ESectorX)/9,
			EQuadrantY=(EQuadrantY+9-72*ESectorY)/9;/* Goto 45 */
			return;
		}	
	}
	
 printf("**YOU WANDERED OUTSIDE THE GALAXY**\n\r"); 
 printf("ON BOARD COMPUTER TAKES OVER, AND SAVED YOUR LIFE\n\r");
     return;
  }

 void FirePhotonTorpedo() {/* 555  */
	 int Torpdir,Index,Xt,Yt,InSector,Xs,Ys,Device;
	 Device=photon_torpedo_tubes;
	 ShowStatus( Device); /* 375  */
	 if ( Damage[ Device ])
		 return;
	 if ( NumTorps==0)
	 {
		  printf(" NO TORPEDOES!\n\r");
		  return;
	 }
     printf("LOADED\n\r");
     Torpdir=InputDirection();
	 if (Torpdir==0)
		 return; 
     printf("TORPEDO TRACK\r\n ");
     NumTorps--;
/*	  570  print "TORPEDO TRACK ",;F=F-1,P=45*X+22,G=45*Y+22;F.M=1TO8 
      575 P=P+S,G=G+T,I=P/45,J=G/45;IF(I`<1)+(I>`8)+(J`<1)+(J>`8)G.585   */
	 Xt=45*ESectorX+22;
	 Yt=45*ESectorY+22;
	 for (Index=1;Index<=8;Index++) 
		{
			Xt+=OffX,
			Yt+=OffY,
			Xs=Xt/45,
			Ys=Yt/45;
			if (IsSectorValid(Xs,Ys)) { 
				InSector=Sectors[Xs*9+Ys]; 
				printf("%u %u",Xs,Ys);
				switch (InSector) {
					case 1 : PhotonHitKlingon(Xs,Ys); break;
					case 2 : PhotonHitBase(Xs,Ys); break;
					case 3 : PhotonHitStar(Xs,Ys); break;
					case 0 : continue;
				}
			}
	   }
	 
	printf("...MISSED");
	return;
 }

 /* torp hit Klingon. Which one?  */
 void PhotonHitKlingon(int X,int Y) { /* 590  */
	int Klindex;
	int  Blastpower =Random(99)+280;
	for (Klindex=1;Klindex<=5;Klindex++)
	 	if (Klingons[Klindex].X==X && Klingons[Klindex].Y==Y)
		  HitKlingon( Klindex, Blastpower );
	return;
 /*592 next M;/* Goto 65  */
 }

 void PhotonHitBase(int X,int Y) { /* 590  */
    NumBases--;  /* Doh!  */
    Quadrants[ EQuadrantX*9+EQuadrantY].BaseHere=0;
	Sectors[ESectorX*9+ESectorY]=0; 
	printf("STARBASE DESTROYED. ");
    printf("SPOCK: I OFTEN FIND HUMAN BEHAVIOUR FASCINATING.\n\r");
	return; 
 }

 void PhotonHitStar(int X,int Y) {
    printf("HIT A STAR");
	if (Random(9)<3 ) {
		printf("TORPEDO ABSORBED");
		return;
	}

 	
	if (Random(9)<6) {
		printf("STAR DESTROYED");
		Quadrants[X*9+Y].StarCount--;  /* 605    */
		printf("IT NOVAS    ***RADIATION ALARM***\n\r");
		TakeDamage( 300) ;
	}
    return; 
 }

 int InputDirection( ) {  /* 615  */
	int Dir;
	char angle[5];
	int Range;
	do {
		printf("COURSE (0-360):",&Dir);
		gets( angle );
	}
	while (strlen(angle)==0);
	Dir = atoi( angle );
	if (Dir>360 || Dir<0)
	return 0;

	OffX=(Dir+45)/90,
	Dir=Dir-OffX*90,
	Range=(45+Dir*Dir)/110+45;
	switch (Range ) {
		case 0 :	OffX=-45;   OffY= Dir;  return 1;break;
		case 1 :	OffX=Dir;   OffY=45;    return 1;break;
		case 2 :	OffX=45;    OffY=-Dir; return 1;break;
		case 3 :	OffX=-Dir;	OffY=-45;	return 1;break;
		default : return 1;
	}
 }

 void PlaceKlingons( int SomeKlingons ) {
    int Index;
	if (SomeKlingons==0)
		return;
	for (Index =1; Index <= SomeKlingons;Index++) {
        FindEmptySector( &X,&Y );

		Klingons[Index].Energy=300,
		Klingons[Index].X=X;
		Klingons[Index].Y=Y;
		Sectors[X*9+Y]=1; 
		}
	}

 void PlaceBases( int NumBases ) {
		int Index;
		int X,Y;
		if (NumBases==0)
			return;
		for (Index =1; Index <= NumBases; Index++) {
			FindEmptySector( &X,&Y );
			Sectors[X*9+Y]=2; 
		}
 }

 void PlaceStars( int NumStars ) {
		int Index;
		int X,Y;
		if (NumStars==0)
			return;
		for (Index =1; Index <= NumBases; Index++) {
			FindEmptySector( &X,&Y );
		Sectors[X*9+Y]=3; 
		}
 }

 void PopulateQuadrant(int X,int Y ) {
	 int Bases= Quadrants[X*9+Y].BaseHere;
	 int KlingonCount   = Quadrants[X*9+Y].KlingonCount;
	 int NumStars		= Quadrants[X*9+Y].StarCount;
     int Xs,Ys; 
    
    for (Xs=1;Xs<=8;Xs++)
		for (Ys=1;Ys<=8;Ys++)
			Sectors[Xs*9+Ys]=0;
    PlaceBases( Bases );
    PlaceKlingons( KlingonCount );
	PlaceStars( NumStars );
 }


 void Randomize() {
//	srand( (unsigned)clock() );
 }


 // Set Flag so can exit
 void DoQuit()
 {
	 CanExit=1;
 }


/* ------------------Main Program ------------------------------ */
int main(int argc, char* argv[])  {
	int Difficulty;
	int Score;
	int GameOver=0;
	char YesNo[5] ;

	Randomize();
	Difficulty=2999;
	printf("DO YOU WANT A DIFFICULT GAME? (Y OR N)");
	gets(YesNo); /* 5    */
	strcpy(YesNo,strupr( YesNo));

	printf("STARDATE 3200:");
	if (strcmp(YesNo,"Y") ==0)
	  Difficulty=999;  	 		

	do { /* Loop to control one complete game */
		/* Setup Everything  First Empty map */
		GameOver=0;
		SetupGalaxy( Difficulty );
		InitVars();

		/* Place Enterprise  */
		  ESectorX   = Random(8);
		  ESectorY   = Random(8);
		  EQuadrantX = Random(8);
		  EQuadrantY = Random(8);
		  PopulateQuadrant( EQuadrantX,EQuadrantY );
		  Sectors[ESectorX*9+ESectorY]=4;

		  printf("\n\rYOUR MISSION: TO DESTROY %u KLINGONS IN 30 STARDATES.",NumKlingons,"\n\r"); 
		  printf(" THERE ARE %u STARBASES.\n\r",NumBases);
		  
		  /* Main Game loop */
		  do {

			ShowEnterpriseLoc();
		//	ShowSRS();
			GetCommand();
			if (CanExit)
				break;
			CheckStarbase();
			DoKlingonAttack(0);

			if (NumKlingons==0) { /* we did it...killed em */
				printf("MISSION ACCOMPLISHED. ");
				if (Numdays<3)
					printf("BOY, YOU BARELY MADE IT");
				if (Numdays>5)
					printf("GOOD WORK...");
				if (Numdays>9) 
					printf("FANTASTIC!");
				if (Numdays>13)
					printf("UNBELIEVABLE!"); 
				Numdays=30-Numdays;
				Score=NumDeadKlingons*100/Numdays*10;
				printf("\n\r%u KLINGONS IN %u STARDATES. \n\r",NumDeadKlingons,Numdays);
				
				Score=-5*NumCasualties;
				if (NumCasualties==0)
					Score +=100;

				printf("%u CASUALTIES INCURRED. (",NumCasualties);
				printf(" )YOUR SCORE: %u\n\r",Score);
			}
			else {/* oh dear   */
				if (Numdays<0) 
					printf("IT'S TOO LATE, THE FEDERATION HAS BEEN CONQUERED.\n\r"); 
	  			if (Energy<=0) { /* 100   */
					printf("ENTERPRISE DESTROYED");
					if (NumDeadKlingons-NumKlingons>9) 
						printf(", BUT YOU WERE A GOOD MAN ");		  
					GameOver=1;
				}
				}
		  }
		  while (!GameOver);
		  /* At this point Game has finished. Start another? */
		Difficulty=987;
		printf("\n\r");
		printf("ANOTHER GAME? (Y OR N)");
		gets(YesNo);
		strcpy(YesNo,strupr(YesNo));
	}
	while ( strcmp(YesNo,"Y") ==0); 
	printf("GOOD BYE.\n\r\n\r");
    return 0;
  }
⚠️ **GitHub.com Fallback** ⚠️