1 #ifndef lint 2 static char sccsid[] = "@(#)abandon.c 4.3 (Berkeley) 05/27/83"; 3 #endif not lint 4 5 # include "trek.h" 6 7 /* 8 ** Abandon Ship 9 ** 10 ** The ship is abandoned. If your current ship is the Faire 11 ** Queene, or if your shuttlecraft is dead, you're out of 12 ** luck. You need the shuttlecraft in order for the captain 13 ** (that's you!!) to escape. 14 ** 15 ** Your crew can beam to an inhabited starsystem in the 16 ** quadrant, if there is one and if the transporter is working. 17 ** If there is no inhabited starsystem, or if the transporter 18 ** is out, they are left to die in outer space. 19 ** 20 ** These currently just count as regular deaths, but they 21 ** should count very heavily against you. 22 ** 23 ** If there are no starbases left, you are captured by the 24 ** Klingons, who torture you mercilessly. However, if there 25 ** is at least one starbase, you are returned to the 26 ** Federation in a prisoner of war exchange. Of course, this 27 ** can't happen unless you have taken some prisoners. 28 ** 29 ** Uses trace flag 40 30 */ 31 32 abandon() 33 { 34 register struct quad *q; 35 register int i; 36 int j; 37 register struct event *e; 38 39 if (Ship.ship == QUEENE) 40 return (printf("You may not abandon ye Faire Queene\n")); 41 if (Ship.cond != DOCKED) 42 { 43 if (damaged(SHUTTLE)) 44 return (out(SHUTTLE)); 45 printf("Officers escape in shuttlecraft\n"); 46 /* decide on fate of crew */ 47 q = &Quad[Ship.quadx][Ship.quady]; 48 if (q->qsystemname == 0 || damaged(XPORTER)) 49 { 50 printf("Entire crew of %d left to die in outer space\n", 51 Ship.crew); 52 Game.deaths += Ship.crew; 53 } 54 else 55 { 56 printf("Crew beams down to planet %s\n", systemname(q)); 57 } 58 } 59 /* see if you can be exchanged */ 60 if (Now.bases == 0 || Game.captives < 20 * Game.skill) 61 lose(L_CAPTURED); 62 /* re-outfit new ship */ 63 printf("You are hereby put in charge of an antiquated but still\n"); 64 printf(" functional ship, the Fairie Queene.\n"); 65 Ship.ship = QUEENE; 66 Ship.shipname = "Fairie Queene"; 67 Param.energy = Ship.energy = 3000; 68 Param.torped = Ship.torped = 6; 69 Param.shield = Ship.shield = 1250; 70 Ship.shldup = 0; 71 Ship.cloaked = 0; 72 Ship.warp = 5.0; 73 Ship.warp2 = 25.0; 74 Ship.warp3 = 125.0; 75 Ship.cond = GREEN; 76 /* clear out damages on old ship */ 77 for (i = 0; i < MAXEVENTS; i++) 78 { 79 e = &Event[i]; 80 if (e->evcode != E_FIXDV) 81 continue; 82 unschedule(e); 83 } 84 /* get rid of some devices and redistribute probabilities */ 85 i = Param.damprob[SHUTTLE] + Param.damprob[CLOAK]; 86 Param.damprob[SHUTTLE] = Param.damprob[CLOAK] = 0; 87 while (i > 0) 88 for (j = 0; j < NDEV; j++) 89 { 90 if (Param.damprob[j] != 0) 91 { 92 Param.damprob[j] += 1; 93 i--; 94 if (i <= 0) 95 break; 96 } 97 } 98 /* pick a starbase to restart at */ 99 i = ranf(Now.bases); 100 Ship.quadx = Now.base[i].x; 101 Ship.quady = Now.base[i].y; 102 /* setup that quadrant */ 103 while (1) 104 { 105 initquad(1); 106 Sect[Ship.sectx][Ship.secty] = EMPTY; 107 for (i = 0; i < 5; i++) 108 { 109 Ship.sectx = Etc.starbase.x + ranf(3) - 1; 110 if (Ship.sectx < 0 || Ship.sectx >= NSECTS) 111 continue; 112 Ship.secty = Etc.starbase.y + ranf(3) - 1; 113 if (Ship.secty < 0 || Ship.secty >= NSECTS) 114 continue; 115 if (Sect[Ship.sectx][Ship.secty] == EMPTY) 116 { 117 Sect[Ship.sectx][Ship.secty] = QUEENE; 118 dock(); 119 compkldist(0); 120 return; 121 } 122 } 123 } 124 } 125