mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-11-25 18:33:11 +00:00
1816 lines
52 KiB
INI
1816 lines
52 KiB
INI
!*************************************************************************
|
|
!**
|
|
!** Super Z Trek: Star Trek for the Z Machine
|
|
!**
|
|
!** Ported to Inform by John Menichelli
|
|
!**
|
|
!*************************************************************************
|
|
|
|
!** The Star Trek game has been around since the dawn of personal computers.
|
|
!** This version, written in Inform by John Menichelli, is just the latest
|
|
!** incarnation of this classic game. If you have any questions, comments
|
|
!** or bug reports, please email them to me at menichel@@0064pixi.com. This
|
|
!** program and its source code are in the public domain.
|
|
!**
|
|
!** This version is based on the C port of an old BASIC program. The C version
|
|
!** was written by Chris Nystrom and is available from:
|
|
!**
|
|
!** http://www.cfi.org/pub/ccn/startrek
|
|
!**
|
|
!** You can contact the author of C port at:
|
|
!**
|
|
!** Chris Nystrom
|
|
!** 1013 Prairie Dove Circle
|
|
!** Austin, Texas 78758
|
|
!**
|
|
!** E-Mail: chris@gnu.ai.mit.edu, nystrom@cactus.org, or ccn@cfi.org
|
|
|
|
!** The original Super Star Trek game comes from the book "BASIC Computer
|
|
!** Games" edited by David Ahl of Creative Computing fame. It was published
|
|
!** in 1978 by Workman Publishing, 1 West 39 Street, New York, New York,
|
|
!** and the ISBN is: 0-89489-052-3.
|
|
!**
|
|
!** Here is the original BASIC header:
|
|
!**
|
|
!** SUPER STARTREK - MAY 16, 1978 - REQUIRES 24K MEMORY
|
|
!**
|
|
!** **** STAR TREK **** ****
|
|
!** SIMULATION OF A MISSION OF THE STARSHIP ENTERPRISE,
|
|
!** AS SEEN ON THE STAR TREK TV SHOW.
|
|
!** ORIGINAL PROGRAM BY MIKE MAYFIELD, MODIFIED VERSION
|
|
!** PUBLISHED IN DEC'S "101 BASIC GAMES", BY DAVE AHL.
|
|
!** MODIFICATIONS TO THE LATTER (PLUS DEBUGGING) BY BOB
|
|
!** LEEDOM - APRIL & DECEMBER 1974,
|
|
!** WITH A LITTLE HELP FROM HIS FRIENDS . . .
|
|
!** COMMENTS, EPITHETS, AND SUGGESTIONS SOLICITED --
|
|
!** SEND TO: R. C. LEEDOM
|
|
!** WESTINGHOUSE DEFENSE & ELECTRONICS SYSTEMS CNTR.
|
|
!** BOX 746, M.S. 338
|
|
!** BALTIMORE, MD 21203
|
|
!**
|
|
!** CONVERTED TO MICROSOFT 8 K BASIC 3/16/78 BY JOHN BORDERS
|
|
!** LINE NUMBERS FROM VERSION STREK7 OF 1/12/75 PRESERVED AS
|
|
!** MUCH AS POSSIBLE WHILE USING MULTIPLE STATMENTS PER LINE
|
|
!**
|
|
!** Notes on the Inform version:
|
|
!**
|
|
!** Since Inform only works with integers, this version eliminates the
|
|
!** guesswork involved in moving and firing torpedoes. To make up for
|
|
!** this, the torpedo algorithm gives the torped a random chance to miss,
|
|
!** which increases as the range increases.
|
|
|
|
!** Constants
|
|
|
|
Constant MAX_TORPS 10;
|
|
Constant KLINGON_POWER 200;
|
|
Constant MAX_POWER 3000;
|
|
Constant SCREEN_SIZE 6;
|
|
Constant ENTERPRISE 1;
|
|
Constant KLINGON 2;
|
|
Constant BASE 3;
|
|
Constant STAR 4;
|
|
Constant WARP_ENGINES 0;
|
|
Constant SHORT_RANGE 1;
|
|
Constant LONG_RANGE 2;
|
|
Constant PHASER_CONTROL 3;
|
|
Constant PHOTON_TUBES 4;
|
|
Constant DAMAGE_CONTROL 5;
|
|
Constant SHIELD_CONTROL 6;
|
|
Constant LIBRARY_COMPUTER 7;
|
|
|
|
!** Global Variables
|
|
|
|
Global trek_docked_flag; ! 1 or 2 if Enterprise is docked
|
|
Global trek_current_energy; ! Current energy
|
|
Global trek_shield_value; ! Current shield value
|
|
Global trek_torp_capacity = MAX_TORPS; ! Photon torpedo capacity
|
|
Global trek_torps_remaining; ! Photon torpedoes left
|
|
Global trek_max_speed; ! Maximum allowed speed
|
|
Global trek_end_of_time; ! End of time/game
|
|
Global trek_current_date; ! Current stardate
|
|
Global trek_total_bases; ! Total starbases
|
|
Global trek_total_klingons; ! Klingons at start
|
|
Global trek_klingons_left; ! Total Klingons left
|
|
Global trek_quadrant_position; ! These two variables are used
|
|
Global trek_sector_position; ! to calculate the quadrant and
|
|
! sector location of the Enterprise
|
|
!** Arrays
|
|
|
|
Array trek_long_range_galaxy --> 64; ! Holds long range scan data
|
|
Array trek_galaxy_history --> 64; ! Hold history of all long and short
|
|
! range scans
|
|
Array trek_temp_array --> 64; ! Used for printing long range scans
|
|
Array trek_sector -> 64; ! Sector data array
|
|
Array trek_damage_array -> 8; ! Damage Array
|
|
Array trek_klingon_array -> 3; ! Array used to track Klingon damage;
|
|
Array text_array -> 60; ! Input array for keyboard entry
|
|
|
|
! Main Program
|
|
|
|
[ Main ;
|
|
PlayTrek();
|
|
];
|
|
|
|
[ PlayTrek ;
|
|
TrekIntro();
|
|
Initialize();
|
|
EndScreen();
|
|
];
|
|
|
|
[ TrekIntro ;
|
|
font off;
|
|
box "************************************"
|
|
"* *"
|
|
"* *"
|
|
"* * * Super Z Trek * * *"
|
|
"* *"
|
|
"* *"
|
|
"************************************";
|
|
|
|
print "^^^";
|
|
print "Press any key to begin...";
|
|
|
|
Pause();
|
|
];
|
|
|
|
[ Initialize i j bases stars klingons;
|
|
|
|
! Initialize time
|
|
|
|
trek_current_date = (20 + random(10)) * 1000;
|
|
trek_end_of_time = (25 + random(10)) * 10;
|
|
|
|
! Setup What Exists in Galaxy
|
|
|
|
for (i = 0: i < 64: i++)
|
|
trek_galaxy_history-->i = 999;
|
|
|
|
for (i = 0: i < 64: i++)
|
|
{
|
|
j = random(100);
|
|
switch(j)
|
|
{
|
|
98 to 99: klingons = 3;
|
|
95 to 97: klingons = 2;
|
|
81 to 94: klingons = 1;
|
|
default: klingons = 0;
|
|
}
|
|
|
|
trek_klingons_left = trek_klingons_left + klingons;
|
|
|
|
if (random(100) > 96)
|
|
bases = 1;
|
|
else
|
|
bases = 0;
|
|
|
|
trek_total_bases = trek_total_bases + bases;
|
|
|
|
stars = random(8);
|
|
|
|
trek_long_range_galaxy-->i = (klingons * 100) +
|
|
(bases * 10) +
|
|
stars;
|
|
}
|
|
|
|
if (trek_total_bases == 0)
|
|
{
|
|
i = random(64) - 1;
|
|
j = trek_long_range_galaxy-->i;
|
|
j = j + 10;
|
|
trek_long_range_galaxy-->i = j;
|
|
trek_total_bases++;
|
|
}
|
|
|
|
if (trek_klingons_left > trek_end_of_time / 10)
|
|
trek_end_of_time = (trek_klingons_left + 1) * 10;
|
|
|
|
trek_total_klingons = trek_klingons_left;
|
|
|
|
! Initialize Enterprise
|
|
|
|
trek_docked_flag = 0;
|
|
trek_current_energy = MAX_POWER;
|
|
trek_torps_remaining = trek_torp_capacity;
|
|
trek_shield_value = 0;
|
|
trek_max_speed = 8;
|
|
trek_quadrant_position = random(64) - 1;
|
|
trek_sector_position = random(64) - 1;
|
|
|
|
for (i = 0: i < 8: i++)
|
|
trek_damage_array->i = 5;
|
|
|
|
MissionBrief();
|
|
SetScreen();
|
|
NewQuadrant();
|
|
UpdateStatus();
|
|
ShortRangeScan();
|
|
MainMenu();
|
|
];
|
|
|
|
[ NewQuadrant i j k b s ;
|
|
trek_galaxy_history-->trek_quadrant_position =
|
|
trek_long_range_galaxy-->trek_quadrant_position;
|
|
|
|
for (i = 0: i < 3: i++)
|
|
trek_klingon_array->i = KLINGON_POWER;
|
|
|
|
i = trek_long_range_galaxy-->trek_quadrant_position;
|
|
|
|
k = i / 100; ! Klingons
|
|
b = i / 10 - (10 * k); ! Bases
|
|
s = i - (100 * k) - (10 * b); ! Stars
|
|
|
|
for (i = 0: i < 64: i++)
|
|
trek_sector->i = 0;
|
|
|
|
trek_sector->trek_sector_position = ENTERPRISE;
|
|
|
|
for (i = 1: i <= k: i++) ! Position Klingons
|
|
{
|
|
.Retry1;
|
|
j = random(64) - 1;
|
|
if (trek_sector->j ~= 0)
|
|
jump Retry1;
|
|
else
|
|
trek_sector->j = KLINGON;
|
|
}
|
|
|
|
for (i = 1: i <= b: i++) ! Position base
|
|
{
|
|
.Retry2;
|
|
j = random(64) - 1;
|
|
if (trek_sector->j ~= 0)
|
|
jump Retry2;
|
|
else
|
|
trek_sector->j = BASE;
|
|
}
|
|
|
|
for (i = 1: i <= s: i++) ! Position stars
|
|
{
|
|
.Retry3;
|
|
j = random(64) - 1;
|
|
if (trek_sector->j ~= 0)
|
|
jump Retry3;
|
|
else
|
|
trek_sector->j = STAR;
|
|
}
|
|
];
|
|
|
|
|
|
[ SetScreen i j;
|
|
@erase_window $ffff;
|
|
@split_window SCREEN_SIZE;
|
|
@set_window 1;
|
|
style reverse;
|
|
j = SCREEN_SIZE;
|
|
for (i = 1 : i <= j: i++)
|
|
{
|
|
@set_cursor i 1;
|
|
spaces (0->33)-1;
|
|
}
|
|
style roman;
|
|
];
|
|
|
|
[ MissionBrief ;
|
|
@erase_window $ffff;
|
|
new_line;
|
|
new_line;
|
|
print "To: Captain, USS Enterprise, NCC-1701^^";
|
|
|
|
print "From: Starfleet Command^^";
|
|
|
|
print "Subject: War Warning^^";
|
|
|
|
print "1. Approximately three (3) hours ago, warships of the Imperial
|
|
Klingon Empire Navy crossed the border into Federation space. These
|
|
vessels have destroyed all outposts and ships in their path and
|
|
have not answered any hails.^^";
|
|
|
|
print "2. Therefore, effective immediately, a state of war exists between
|
|
the United Federation of Planets and the Imperial Klingon
|
|
Empire.^^";
|
|
|
|
print "3. As the Enterprise is the only vessel available in this portion
|
|
of the galaxy, your orders are as follows:^^";
|
|
|
|
print "4. Engage and destroy any and all Klingon vessels you encounter
|
|
within your designated patrol zone. Long range sensor scans indicate
|
|
a total of ", trek_klingons_left, " Klingon battlecruisers
|
|
in your area.^^";
|
|
|
|
print "5. Starfleet Operations calculates that it will take
|
|
approximately ", trek_end_of_time / 10, " days to mobilize our
|
|
forces and begin sending reinforcements to the front. We need you
|
|
to hold off the invading Klingon fleet until those reinforcements
|
|
arrive.^^";
|
|
|
|
print "6. Good luck and good hunting.^^";
|
|
|
|
print "[Press any key to accept command]";
|
|
|
|
Pause();
|
|
];
|
|
|
|
[ UpdateStatus i;
|
|
@set_window 1;
|
|
|
|
@set_cursor 1 1;
|
|
style reverse;
|
|
for (i = 1: i <= 2: i++) {
|
|
@set_cursor i 1;
|
|
spaces (0->33)-1; }
|
|
|
|
@set_cursor 1 1;
|
|
print "Current Date: Days Remaining:";
|
|
@set_cursor 2 1;
|
|
print "Klingons Remaining: Bases Remaining:";
|
|
@set_cursor 3 1;
|
|
print "Shield Value: Total Energy Remaining:";
|
|
|
|
@set_cursor 5 1;
|
|
print "1: Nav 2: SRS 3: LRS 4: Phaser 5: Torp";
|
|
@set_cursor 6 1;
|
|
print "6: Shield 7: Damage 8: Library 9: Help 0: Quit";
|
|
|
|
@set_cursor 1 15;
|
|
print (trek_current_date / 10), ".", (trek_current_date % 10);
|
|
|
|
if (trek_end_of_time < 100)
|
|
@set_cursor 1 50;
|
|
else
|
|
@set_cursor 1 49;
|
|
|
|
print trek_end_of_time / 10, ".", trek_end_of_time % 10;
|
|
|
|
@set_cursor 2 21;
|
|
print trek_klingons_left;
|
|
@set_cursor 2 52;
|
|
print trek_total_bases;
|
|
|
|
@set_cursor 3 15;
|
|
print trek_shield_value;
|
|
i = trek_current_energy + trek_shield_value;
|
|
@set_cursor 3 49;
|
|
|
|
switch(i)
|
|
{
|
|
0 to 9 : print " ", i;
|
|
10 to 99 : print " ", i;
|
|
100 to 999 : print " ", i;
|
|
default : print i;
|
|
}
|
|
|
|
style roman;
|
|
|
|
@set_window 0;
|
|
];
|
|
|
|
[ MainMenu i ;
|
|
for (::)
|
|
{
|
|
@read_char 1 -> i;
|
|
|
|
switch(i)
|
|
{
|
|
'0' : break;
|
|
'1' : CourseControl();
|
|
'2' : ShortRangeScan();
|
|
'3' : LongRangeScan();
|
|
'4' : PhaserControl();
|
|
'5' : PhotonTorps();
|
|
'6' : ShieldControl();
|
|
'7' : DamageControl();
|
|
'8' : Library();
|
|
'9' : Help();
|
|
}
|
|
if (i == '0') break;
|
|
}
|
|
];
|
|
|
|
[ CourseControl i course speed;
|
|
PrintCompass();
|
|
|
|
print "^Enter course (1-8): ";
|
|
@read_char 1 -> i;
|
|
|
|
if (i < '1' || i > '8')
|
|
"^Lt. Sulu reports: ~Incorrect course data, sir!~^";
|
|
|
|
course = i - 48;
|
|
print course;
|
|
|
|
trek_max_speed = trek_damage_array->WARP_ENGINES;
|
|
trek_max_speed = trek_max_speed + 3;
|
|
print "^^Enter warp speed (1-", trek_max_speed, "): ";
|
|
@read_char 1 -> i;
|
|
speed = i - 48;
|
|
|
|
if (speed < 1)
|
|
"^Lt. Sulu reports: ~Incorrect speed, sir!~^^";
|
|
|
|
if (speed > trek_max_speed)
|
|
"^Chief Engineer Scott reports: ~The engines won't take more than warp ",
|
|
trek_max_speed, "!~^^";
|
|
|
|
if (speed * 10 > trek_current_energy + trek_shield_value)
|
|
"^Chief Engineer Scott reports: ~We don't have enough energy power to go
|
|
that fast!~^^";
|
|
|
|
trek_current_energy = trek_current_energy - (speed * 10);
|
|
|
|
print speed, "^^";
|
|
|
|
if (trek_current_energy < 0)
|
|
{
|
|
print "^Shield Control supplies energy to complete the maneuver.^";
|
|
|
|
trek_shield_value = trek_shield_value + trek_current_energy;
|
|
trek_current_energy = 0;
|
|
|
|
if (trek_shield_value < 0)
|
|
trek_shield_value = 0;
|
|
|
|
}
|
|
CompleteManeuver(course, speed);
|
|
if (trek_current_energy + trek_shield_value <= 0)
|
|
OutOfEnergy();
|
|
];
|
|
|
|
[ CompleteManeuver course speed i j xs ys xq yq;
|
|
xs = (trek_sector_position % 8) + 1;
|
|
ys = 8 - (trek_sector_position / 8);
|
|
|
|
xq = (trek_quadrant_position % 8) + 1;
|
|
yq = 8 - (trek_quadrant_position / 8);
|
|
|
|
j = trek_sector_position;
|
|
|
|
for (i = 1: i <= speed: i++)
|
|
{
|
|
|
|
if (OutOfBounds(course) == 1)
|
|
{
|
|
print "^Movement aborted - you may not leave your designated
|
|
patrol area.^";
|
|
break;
|
|
}
|
|
|
|
switch(course)
|
|
{
|
|
1: ys++;
|
|
2: xs++; ys++;
|
|
3: xs++;
|
|
4: xs++; ys--;
|
|
5: ys--;
|
|
6: ys--; xs--;
|
|
7: xs--;
|
|
8: xs--; ys++;
|
|
}
|
|
|
|
if (xs < 1 || xs > 8 || ys < 1 || ys > 8)
|
|
{
|
|
if (xs < 1) { xs = 8; xq--; }
|
|
if (xs > 8) { xs = 1; xq++; }
|
|
if (ys < 1) { ys = 8; yq--; }
|
|
if (ys > 8) { ys = 1; yq++; }
|
|
|
|
j = (8 * (8 - ys)) + xs - 1;
|
|
trek_sector_position = j;
|
|
trek_quadrant_position = (8 * (8 - yq)) + xq - 1;
|
|
if (trek_docked_flag > 0)
|
|
trek_docked_flag = 0;
|
|
NewQuadrant();
|
|
}
|
|
else
|
|
{
|
|
j = (8 * (8 - ys)) + xs - 1;
|
|
|
|
if (trek_sector->j == KLINGON or STAR) ! You can pass through a base
|
|
{
|
|
print "^Movement aborted due to improper navigation.^";
|
|
break;
|
|
}
|
|
if (trek_sector->j == BASE)
|
|
{
|
|
if (i == speed)
|
|
{
|
|
print "^The Enterprise is now docked.^";
|
|
trek_docked_flag = 1;
|
|
trek_sector->trek_sector_position = 0;
|
|
trek_sector_position = j;
|
|
! jump DoneMoving;
|
|
}
|
|
else
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
trek_sector->j = ENTERPRISE;
|
|
if (trek_docked_flag > 0)
|
|
{
|
|
trek_docked_flag = 0;
|
|
trek_sector->trek_sector_position = BASE;
|
|
}
|
|
else
|
|
trek_sector->trek_sector_position = 0;
|
|
|
|
trek_sector_position = j;
|
|
}
|
|
}
|
|
}
|
|
!.DoneMoving;
|
|
trek_current_date = trek_current_date + speed;
|
|
trek_end_of_time = trek_end_of_time - speed;
|
|
if (trek_end_of_time <= 0)
|
|
EndOfTime();
|
|
UpdateStatus();
|
|
DamageRepair();
|
|
UpdateStatus();
|
|
ShortRangeScan();
|
|
];
|
|
|
|
[ OutOfBounds course xs ys xq yq;
|
|
xs = (trek_sector_position % 8) + 1;
|
|
ys = 8 - (trek_sector_position / 8);
|
|
|
|
xq = (trek_quadrant_position % 8) + 1;
|
|
yq = 8 - (trek_quadrant_position / 8);
|
|
|
|
if (xq == 1 && yq == 1 && xs == 1 && ys == 1) ! Lower left corner
|
|
{
|
|
if (course == 4 or 5 or 6 or 7 or 8)
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
if (xq == 8 && yq == 8 && xs == 8 && ys == 8) ! Upper right corner
|
|
{
|
|
if (course == 1 or 2 or 3 or 4 or 8)
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
if (xq == 8 && yq == 1 && xs == 8 && ys == 1) ! Lower right corner
|
|
{
|
|
if (course == 2 or 3 or 4 or 5 or 6)
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
if (xq == 1 && yq == 8 && xs == 1 && ys == 8) ! Upper left corner
|
|
{
|
|
if (course == 1 or 2 or 6 or 7 or 8)
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
if (xq == 1 && xs == 1) ! Left edge
|
|
{
|
|
if (course == 6 or 7 or 8)
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
if (xq == 8 && xs == 8) ! Right Edge
|
|
{
|
|
if (course == 2 or 3 or 4)
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
if (yq == 8 && ys == 8) ! Top edge
|
|
{
|
|
if (course == 1 or 2 or 8)
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
if (yq == 1 && ys == 1) ! Bottom edge
|
|
{
|
|
if (course == 4 or 5 or 6)
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
return 0;
|
|
];
|
|
|
|
[ PrintCompass ;
|
|
new_line;
|
|
print " 8 1 2^";
|
|
print " @@0092 | /^";
|
|
print "7 -+- 3^";
|
|
print " / | @@0092^";
|
|
print " 6 5 4^";
|
|
];
|
|
|
|
[ ShortRangeScan x y ;
|
|
if (trek_damage_array->SHORT_RANGE < 5)
|
|
"^Short Range Sensors are inoperative.^";
|
|
|
|
! Determine Quadrant
|
|
|
|
x = (trek_quadrant_position % 8) + 1;
|
|
y = 8 - (trek_quadrant_position / 8);
|
|
|
|
print "^Short range scan of quadrant ";
|
|
print x, ", ", y, " (";
|
|
PrintQuadrantName(x, y);
|
|
print ")^^";
|
|
|
|
print " 1 2 3 4 5 6 7 8^";
|
|
print " --- --- --- --- --- --- --- ---^";
|
|
for (x = 0: x < 64: x++)
|
|
{
|
|
if (x % 8 == 0)
|
|
{
|
|
print " ";
|
|
print 8 - (x/8);
|
|
print ":";
|
|
}
|
|
|
|
switch (trek_sector->x)
|
|
{
|
|
0 : print " . ";
|
|
1 : print " +E+";
|
|
2 : print " +K+";
|
|
3 : if (trek_docked_flag == 0)
|
|
print " >B<";
|
|
else
|
|
print " >D<";
|
|
4 : print " # ";
|
|
}
|
|
|
|
if ((x + 1) % 8 == 0)
|
|
print "^";
|
|
}
|
|
|
|
y = 0;
|
|
for (x = 1: x < 64: x++)
|
|
if (trek_sector->x == 2) y++;
|
|
|
|
print "^Alert Condition: ";
|
|
|
|
if (y > 0)
|
|
print "Red^";
|
|
else if (trek_current_energy * 10 < MAX_POWER)
|
|
print "Yellow^";
|
|
else
|
|
print "Green^";
|
|
|
|
];
|
|
|
|
[ LongRangeScan i j temp_pos;
|
|
if (trek_damage_array->LONG_RANGE < 5)
|
|
"^Long Range Sensors are inoperative.^";
|
|
|
|
for (i = 0: i < 64: i++)
|
|
trek_temp_array-->i = 999;
|
|
|
|
temp_pos = trek_quadrant_position;
|
|
|
|
if (temp_pos == 0) ! Upper left
|
|
{
|
|
trek_temp_array-->0 = trek_long_range_galaxy-->0;
|
|
trek_temp_array-->1 = trek_long_range_galaxy-->1;
|
|
trek_temp_array-->8 = trek_long_range_galaxy-->8;
|
|
trek_temp_array-->9 = trek_long_range_galaxy-->9;
|
|
|
|
trek_galaxy_history-->0 = trek_long_range_galaxy-->0;
|
|
trek_galaxy_history-->1 = trek_long_range_galaxy-->1;
|
|
trek_galaxy_history-->8 = trek_long_range_galaxy-->8;
|
|
trek_galaxy_history-->9 = trek_long_range_galaxy-->9;
|
|
|
|
jump Printit;
|
|
}
|
|
|
|
if (temp_pos == 7) ! Upper right
|
|
{
|
|
trek_temp_array-->6 = trek_long_range_galaxy-->6;
|
|
trek_temp_array-->7 = trek_long_range_galaxy-->7;
|
|
trek_temp_array-->14 = trek_long_range_galaxy-->14;
|
|
trek_temp_array-->15 = trek_long_range_galaxy-->15;
|
|
|
|
trek_galaxy_history-->6 = trek_long_range_galaxy-->6;
|
|
trek_galaxy_history-->7 = trek_long_range_galaxy-->7;
|
|
trek_galaxy_history-->14 = trek_long_range_galaxy-->14;
|
|
trek_galaxy_history-->15 = trek_long_range_galaxy-->15;
|
|
|
|
jump Printit;
|
|
}
|
|
|
|
if (temp_pos == 56) ! Lower left
|
|
{
|
|
trek_temp_array-->48 = trek_long_range_galaxy-->48;
|
|
trek_temp_array-->49 = trek_long_range_galaxy-->49;
|
|
trek_temp_array-->56 = trek_long_range_galaxy-->56;
|
|
trek_temp_array-->57 = trek_long_range_galaxy-->57;
|
|
|
|
trek_galaxy_history-->48 = trek_long_range_galaxy-->48;
|
|
trek_galaxy_history-->49 = trek_long_range_galaxy-->49;
|
|
trek_galaxy_history-->56 = trek_long_range_galaxy-->56;
|
|
trek_galaxy_history-->57 = trek_long_range_galaxy-->57;
|
|
|
|
jump Printit;
|
|
}
|
|
|
|
if (temp_pos == 63) ! Lower right
|
|
{
|
|
trek_temp_array-->54 = trek_long_range_galaxy-->54;
|
|
trek_temp_array-->55 = trek_long_range_galaxy-->55;
|
|
trek_temp_array-->62 = trek_long_range_galaxy-->62;
|
|
trek_temp_array-->63 = trek_long_range_galaxy-->63;
|
|
|
|
trek_galaxy_history-->54 = trek_long_range_galaxy-->54;
|
|
trek_galaxy_history-->55 = trek_long_range_galaxy-->55;
|
|
trek_galaxy_history-->62 = trek_long_range_galaxy-->62;
|
|
trek_galaxy_history-->63 = trek_long_range_galaxy-->63;
|
|
|
|
jump Printit;
|
|
}
|
|
|
|
if (temp_pos < 8) ! Top edge
|
|
{
|
|
trek_temp_array-->temp_pos = trek_long_range_galaxy-->temp_pos;
|
|
trek_temp_array-->(temp_pos-1) = trek_long_range_galaxy-->(temp_pos-1);
|
|
trek_temp_array-->(temp_pos+1) = trek_long_range_galaxy-->(temp_pos+1);
|
|
trek_temp_array-->(temp_pos+7) = trek_long_range_galaxy-->(temp_pos+7);
|
|
trek_temp_array-->(temp_pos+8) = trek_long_range_galaxy-->(temp_pos+8);
|
|
trek_temp_array-->(temp_pos+9) = trek_long_range_galaxy-->(temp_pos+9);
|
|
|
|
trek_galaxy_history-->temp_pos = trek_long_range_galaxy-->temp_pos;
|
|
trek_galaxy_history-->(temp_pos-1) = trek_long_range_galaxy-->(temp_pos-1);
|
|
trek_galaxy_history-->(temp_pos+1) = trek_long_range_galaxy-->(temp_pos+1);
|
|
trek_galaxy_history-->(temp_pos+7) = trek_long_range_galaxy-->(temp_pos+7);
|
|
trek_galaxy_history-->(temp_pos+8) = trek_long_range_galaxy-->(temp_pos+8);
|
|
trek_galaxy_history-->(temp_pos+9) = trek_long_range_galaxy-->(temp_pos+9);
|
|
|
|
jump Printit;
|
|
}
|
|
|
|
if (temp_pos > 55) ! Bottom edge
|
|
{
|
|
trek_temp_array-->temp_pos = trek_long_range_galaxy-->temp_pos;
|
|
trek_temp_array-->(temp_pos-1) = trek_long_range_galaxy-->(temp_pos-1);
|
|
trek_temp_array-->(temp_pos+1) = trek_long_range_galaxy-->(temp_pos+1);
|
|
trek_temp_array-->(temp_pos-7) = trek_long_range_galaxy-->(temp_pos-7);
|
|
trek_temp_array-->(temp_pos-8) = trek_long_range_galaxy-->(temp_pos-8);
|
|
trek_temp_array-->(temp_pos-9) = trek_long_range_galaxy-->(temp_pos-9);
|
|
|
|
trek_galaxy_history-->temp_pos = trek_long_range_galaxy-->temp_pos;
|
|
trek_galaxy_history-->(temp_pos-1) = trek_long_range_galaxy-->(temp_pos-1);
|
|
trek_galaxy_history-->(temp_pos+1) = trek_long_range_galaxy-->(temp_pos+1);
|
|
trek_galaxy_history-->(temp_pos-7) = trek_long_range_galaxy-->(temp_pos-7);
|
|
trek_galaxy_history-->(temp_pos-8) = trek_long_range_galaxy-->(temp_pos-8);
|
|
trek_galaxy_history-->(temp_pos-9) = trek_long_range_galaxy-->(temp_pos-9);
|
|
|
|
jump Printit;
|
|
}
|
|
|
|
if (temp_pos % 8 == 0) ! Left edge
|
|
{
|
|
trek_temp_array-->temp_pos = trek_long_range_galaxy-->temp_pos;
|
|
trek_temp_array-->(temp_pos-8) = trek_long_range_galaxy-->(temp_pos-8);
|
|
trek_temp_array-->(temp_pos+8) = trek_long_range_galaxy-->(temp_pos+8);
|
|
trek_temp_array-->(temp_pos-7) = trek_long_range_galaxy-->(temp_pos-7);
|
|
trek_temp_array-->(temp_pos+1) = trek_long_range_galaxy-->(temp_pos+1);
|
|
trek_temp_array-->(temp_pos+9) = trek_long_range_galaxy-->(temp_pos+9);
|
|
|
|
trek_galaxy_history-->temp_pos = trek_long_range_galaxy-->temp_pos;
|
|
trek_galaxy_history-->(temp_pos-8) = trek_long_range_galaxy-->(temp_pos-8);
|
|
trek_galaxy_history-->(temp_pos+8) = trek_long_range_galaxy-->(temp_pos+8);
|
|
trek_galaxy_history-->(temp_pos-7) = trek_long_range_galaxy-->(temp_pos-7);
|
|
trek_galaxy_history-->(temp_pos+1) = trek_long_range_galaxy-->(temp_pos+1);
|
|
trek_galaxy_history-->(temp_pos+9) = trek_long_range_galaxy-->(temp_pos+9);
|
|
|
|
jump Printit;
|
|
}
|
|
if ((temp_pos+1) % 8 == 0) ! Right edge
|
|
{
|
|
trek_temp_array-->temp_pos = trek_long_range_galaxy-->temp_pos;
|
|
trek_temp_array-->(temp_pos-8) = trek_long_range_galaxy-->(temp_pos-8);
|
|
trek_temp_array-->(temp_pos+8) = trek_long_range_galaxy-->(temp_pos+8);
|
|
trek_temp_array-->(temp_pos+7) = trek_long_range_galaxy-->(temp_pos+7);
|
|
trek_temp_array-->(temp_pos-1) = trek_long_range_galaxy-->(temp_pos-1);
|
|
trek_temp_array-->(temp_pos-9) = trek_long_range_galaxy-->(temp_pos-9);
|
|
|
|
trek_galaxy_history-->temp_pos = trek_long_range_galaxy-->temp_pos;
|
|
trek_galaxy_history-->(temp_pos-8) = trek_long_range_galaxy-->(temp_pos-8);
|
|
trek_galaxy_history-->(temp_pos+8) = trek_long_range_galaxy-->(temp_pos+8);
|
|
trek_galaxy_history-->(temp_pos+7) = trek_long_range_galaxy-->(temp_pos+7);
|
|
trek_galaxy_history-->(temp_pos-1) = trek_long_range_galaxy-->(temp_pos-1);
|
|
trek_galaxy_history-->(temp_pos-9) = trek_long_range_galaxy-->(temp_pos-9);
|
|
|
|
jump Printit;
|
|
}
|
|
|
|
! Everything else
|
|
|
|
trek_temp_array-->temp_pos = trek_long_range_galaxy-->temp_pos;
|
|
trek_temp_array-->(temp_pos-9) = trek_long_range_galaxy-->(temp_pos-9);
|
|
trek_temp_array-->(temp_pos-8) = trek_long_range_galaxy-->(temp_pos-8);
|
|
trek_temp_array-->(temp_pos-7) = trek_long_range_galaxy-->(temp_pos-7);
|
|
trek_temp_array-->(temp_pos-1) = trek_long_range_galaxy-->(temp_pos-1);
|
|
trek_temp_array-->(temp_pos+1) = trek_long_range_galaxy-->(temp_pos+1);
|
|
trek_temp_array-->(temp_pos+7) = trek_long_range_galaxy-->(temp_pos+7);
|
|
trek_temp_array-->(temp_pos+8) = trek_long_range_galaxy-->(temp_pos+8);
|
|
trek_temp_array-->(temp_pos+9) = trek_long_range_galaxy-->(temp_pos+9);
|
|
|
|
trek_galaxy_history-->temp_pos = trek_long_range_galaxy-->temp_pos;
|
|
trek_galaxy_history-->(temp_pos-9) = trek_long_range_galaxy-->(temp_pos-9);
|
|
trek_galaxy_history-->(temp_pos-8) = trek_long_range_galaxy-->(temp_pos-8);
|
|
trek_galaxy_history-->(temp_pos-7) = trek_long_range_galaxy-->(temp_pos-7);
|
|
trek_galaxy_history-->(temp_pos-1) = trek_long_range_galaxy-->(temp_pos-1);
|
|
trek_galaxy_history-->(temp_pos+1) = trek_long_range_galaxy-->(temp_pos+1);
|
|
trek_galaxy_history-->(temp_pos+7) = trek_long_range_galaxy-->(temp_pos+7);
|
|
trek_galaxy_history-->(temp_pos+8) = trek_long_range_galaxy-->(temp_pos+8);
|
|
trek_galaxy_history-->(temp_pos+9) = trek_long_range_galaxy-->(temp_pos+9);
|
|
|
|
.Printit;
|
|
new_line;
|
|
new_line;
|
|
|
|
print " Long Range Scan Results^^";
|
|
print " 1 2 3 4 5 6 7 8^";
|
|
print " ----- ----- ----- ----- ----- ----- ----- -----^";
|
|
|
|
for (i = 0: i < 64: i++)
|
|
{
|
|
if (i%8 == 0)
|
|
{
|
|
print " ";
|
|
print 8 - i/8;
|
|
print ":";
|
|
}
|
|
|
|
j = trek_temp_array-->i;
|
|
|
|
print " ";
|
|
|
|
if (i == temp_pos)
|
|
style reverse;
|
|
else
|
|
style roman;
|
|
|
|
switch(j)
|
|
{
|
|
0 to 9 : print " 00"; print j;
|
|
10 to 98 : print " 0"; print j;
|
|
999 : print " ***";
|
|
default : print " "; print j;
|
|
}
|
|
|
|
print " ";
|
|
|
|
style roman;
|
|
|
|
if (i%8 == 7)
|
|
print "^";
|
|
}
|
|
];
|
|
|
|
[ TextToNumber n x len mul tot;
|
|
text_array -> 0 = 60;
|
|
read text_array 0;
|
|
|
|
if (text_array->1 > 4)
|
|
return -1;
|
|
|
|
x = 0;
|
|
len = text_array->1;
|
|
|
|
if (len == 4) mul=1000;
|
|
if (len == 3) mul=100;
|
|
if (len == 2) mul=10;
|
|
if (len == 1) mul=1;
|
|
|
|
tot = 0;
|
|
|
|
for (n = 0: n < len: n++)
|
|
{
|
|
if (text_array->(n+2) > 47 && text_array->(n+2) < 58)
|
|
{
|
|
x = text_array->(n+2);
|
|
x = x - 48;
|
|
tot = tot + mul * x;
|
|
mul = mul/10;
|
|
}
|
|
else
|
|
return -1;
|
|
}
|
|
return tot;
|
|
];
|
|
|
|
[ PhaserControl i j k x1 y1 x2 y2 z rng dmg;
|
|
if (trek_damage_array->PHASER_CONTROL < 5)
|
|
"^Science Officer Spock reports: ~Phasers are inoperative, Captain.~^";
|
|
|
|
k = trek_long_range_galaxy-->trek_quadrant_position;
|
|
|
|
k = k / 100; ! Klingons
|
|
|
|
if (k == 0)
|
|
"^Science Officer Spock reports: ~Sensors show no enemy ships in this
|
|
quadrant~^";
|
|
|
|
if (trek_damage_array->LIBRARY_COMPUTER < 5)
|
|
print "^Science Officer Spock reports: ~Computer failure will hamper
|
|
accuracy, Captain.~^";
|
|
|
|
print "^Phasers locked on target. Energy available = ",
|
|
trek_current_energy + trek_shield_value;
|
|
|
|
print "^Enter number of units to fire: ";
|
|
|
|
i = TextToNumber();
|
|
|
|
if (i <= 0)
|
|
"^Science Officer Spock reports: ~Phaser fire aborted.~^";
|
|
|
|
if (i > trek_current_energy)
|
|
"^Science Officer Spock reports: ~Insufficient energy for that
|
|
attack.~^";
|
|
|
|
trek_current_energy = trek_current_energy - i;
|
|
|
|
if (trek_damage_array->LIBRARY_COMPUTER < 5) ! Computer damage affects targeting
|
|
i = i * trek_damage_array->LIBRARY_COMPUTER / 5;
|
|
|
|
i = i / k; ! Divide the energy between each target
|
|
|
|
x1 = (trek_sector_position % 8) + 1;
|
|
y1 = 8 - (trek_sector_position / 8);
|
|
|
|
k = -1;
|
|
|
|
for (j = 0: j < 64: j++)
|
|
{
|
|
if (trek_sector->j == KLINGON)
|
|
{
|
|
k++;
|
|
x2 = (j % 8) + 1;
|
|
y2 = 8 - (j / 8);
|
|
|
|
rng = Range(x1, y1, x2, y2);
|
|
|
|
dmg = i;
|
|
|
|
dmg = dmg * 10 / (rng + random(5) - 1);
|
|
|
|
z = trek_klingon_array->k;
|
|
|
|
if (dmg <= 0)
|
|
"^Science Officer Spock reports: ~Sensors show no damage to
|
|
the Klingon battlecruiser at ", x2, ", ", y2, ".~^";
|
|
|
|
if (dmg >= z)
|
|
{
|
|
print "^Science Officer Spock reports: ~The Klingon battlecruiser
|
|
at ", x2, ", ", y2, " has been destroyed.~^";
|
|
trek_klingon_array->k = 0;
|
|
trek_sector->j = 0;
|
|
trek_klingons_left--;
|
|
if (trek_klingons_left == 0)
|
|
WonGame();
|
|
|
|
z = trek_long_range_galaxy-->trek_quadrant_position;
|
|
z = z - 100;
|
|
trek_long_range_galaxy-->trek_quadrant_position = z;
|
|
if (z / 100 == 0)
|
|
ShortRangeScan();
|
|
UpdateStatus();
|
|
}
|
|
|
|
else
|
|
{
|
|
z = z - dmg;
|
|
trek_klingon_array->k = z;
|
|
print "^Science Officer Spock reports: ~Sensors show that the
|
|
Klingon battlecruiser at ", x2, ", ", y2, " suffered a ",
|
|
dmg, " unit hit.~^";
|
|
}
|
|
}
|
|
}
|
|
KlingonsShoot();
|
|
];
|
|
|
|
[ PhotonTorps course i x1 y1 x2 y2 z index ;
|
|
if (trek_torps_remaining == 0)
|
|
"^Ensign Chekov reports: ~All photon torpedoes expended, sir!~^";
|
|
|
|
if (trek_damage_array->PHOTON_TUBES < 5)
|
|
"^Ensign Chekov reports: ~Photon torpedo tubes not operational, sir!~^";
|
|
|
|
i = trek_long_range_galaxy-->trek_quadrant_position;
|
|
|
|
i = i / 100; ! Klingons
|
|
|
|
if (i == 0)
|
|
"^Ensign Chekov reports: ~There are no Klingons in this quadrant, sir!~^";
|
|
|
|
trek_torps_remaining--;
|
|
x1 = (trek_sector_position % 8) + 1;
|
|
y1 = 8 - (trek_sector_position / 8);
|
|
|
|
PrintCompass();
|
|
|
|
print "^Enter torpedo course (1-8): ";
|
|
|
|
@read_char 1 -> i;
|
|
|
|
if (i < '1' || i > '8')
|
|
"^Ensign Chekov reports: ~Incorrect course data, sir!~^";
|
|
|
|
course = i - 48;
|
|
|
|
print course, "^";
|
|
|
|
for (i = 1: i < 8: i++)
|
|
{
|
|
switch(course)
|
|
{
|
|
1: y1++;
|
|
2: x1++; y1++;
|
|
3: x1++;
|
|
4: x1++; y1--;
|
|
5: y1--;
|
|
6: y1--; x1--;
|
|
7: x1--;
|
|
8: x1--; y1++;
|
|
}
|
|
|
|
if (x1 < 1 || x1 > 8 || y1 < 1 || y1 > 8)
|
|
{
|
|
print "^Ensign Chekov reports: ~The torpedo missed, sir!~^";
|
|
break;
|
|
}
|
|
|
|
index = (8 * (8 - y1)) + x1 - 1;
|
|
|
|
if (trek_sector->index == KLINGON)
|
|
{
|
|
x2 = (trek_sector_position % 8) + 1;
|
|
y2 = 8 - (trek_sector_position / 8);
|
|
|
|
z = Range(x1, y1, x2, y2);
|
|
|
|
z = z / 15;
|
|
|
|
if (random(10) - 1 < z)
|
|
{
|
|
print "^Ensign Chekov reports: ~The torpedo missed, sir!~^";
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
trek_sector->index = 0;
|
|
trek_klingons_left--;
|
|
if (trek_klingons_left == 0)
|
|
WonGame();
|
|
z = trek_long_range_galaxy-->trek_quadrant_position;
|
|
z = z - 100;
|
|
trek_long_range_galaxy-->trek_quadrant_position = z;
|
|
print "^Ensign Chekov reports: ~The Klingon battlecruiser in
|
|
sector ", x2, ", ", y2, " has been destroyed, sir!~^";
|
|
UpdateStatus();
|
|
ShortRangeScan();
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (trek_sector->index == BASE)
|
|
{
|
|
print "^Ensign Chekov reports: ~You destroyed a base, sir!~^";
|
|
trek_total_bases--;
|
|
z = trek_long_range_galaxy-->trek_quadrant_position;
|
|
z = z - 10;
|
|
trek_long_range_galaxy-->trek_quadrant_position = z;
|
|
|
|
if (trek_total_bases == 0 &&
|
|
trek_klingons_left <= (trek_current_date / 10) -
|
|
trek_end_of_time / 10)
|
|
{
|
|
print "That does it, Captain!! You are hereby relieved of command
|
|
and sentenced to 99 stardates of hard labor on Cygnus 12!! ";
|
|
LoseGame();
|
|
}
|
|
|
|
if (trek_docked_flag > 0) ! Undock
|
|
{
|
|
trek_docked_flag = 0;
|
|
trek_sector->trek_sector_position = ENTERPRISE;
|
|
ShortRangeScan();
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
if (trek_sector->index == STAR)
|
|
{
|
|
print "^Ensign Chekov reports: ~The star absorbed the torpedo's
|
|
energy, sir!~^";
|
|
break;
|
|
}
|
|
}
|
|
KlingonsShoot();
|
|
];
|
|
|
|
[ DamageControl ;
|
|
new_line;
|
|
new_line;
|
|
print "System Status^";
|
|
print "-------------------------------------^";
|
|
|
|
print "Warp Engines ";
|
|
if (trek_damage_array->WARP_ENGINES == 5)
|
|
print "Operational^";
|
|
else
|
|
print "Damaged^";
|
|
|
|
print "Short Range Sensors ";
|
|
if (trek_damage_array->SHORT_RANGE == 5)
|
|
print "Operational^";
|
|
else
|
|
print "Damaged^";
|
|
|
|
print "Long Range Sensors ";
|
|
if (trek_damage_array->LONG_RANGE == 5)
|
|
print "Operational^";
|
|
else
|
|
print "Damaged^";
|
|
|
|
print "Phaser Control ";
|
|
if (trek_damage_array->PHASER_CONTROL == 5)
|
|
print "Operational^";
|
|
else
|
|
print "Damaged^";
|
|
|
|
print "Photon Torpedo Tubes ";
|
|
if (trek_damage_array->PHOTON_TUBES == 5)
|
|
print "Operational^";
|
|
else
|
|
print "Damaged^";
|
|
|
|
print "Damage Control ";
|
|
if (trek_damage_array->DAMAGE_CONTROL == 5)
|
|
print "Operational^";
|
|
else
|
|
print "Damaged^";
|
|
|
|
print "Shield Control ";
|
|
if (trek_damage_array->SHIELD_CONTROL == 5)
|
|
print "Operational^";
|
|
else
|
|
print "Damaged^";
|
|
|
|
print "Library-Computer ";
|
|
if (trek_damage_array->LIBRARY_COMPUTER == 5)
|
|
print "Operational^";
|
|
else
|
|
print "Damaged^";
|
|
];
|
|
|
|
[ ShieldControl i;
|
|
if (trek_damage_array->SHIELD_CONTROL < 5)
|
|
"Shield Control is inoperative.";
|
|
|
|
print "^Total energy available = ", trek_current_energy + trek_shield_value;
|
|
|
|
print "^Input number of units to shields: ";
|
|
|
|
i = TextToNumber();
|
|
|
|
if (i == -1)
|
|
"^Shield Control reports: ~Invalid request - shields unchanged.~^";
|
|
|
|
if (i == trek_shield_value)
|
|
"^<Shields Unchanged>^";
|
|
|
|
if (i >= trek_current_energy + trek_shield_value)
|
|
"^Shield Control reports: ~There is insufficient energy available -
|
|
shields unchanged.~^";
|
|
|
|
trek_current_energy = trek_current_energy + trek_shield_value - i;
|
|
trek_shield_value = i;
|
|
|
|
print "^Shield Control reports: ~Shields now at ", trek_shield_value,
|
|
" units per your command.~^";
|
|
UpdateStatus();
|
|
];
|
|
|
|
[ Library i;
|
|
if (trek_damage_array->LIBRARY_COMPUTER < 5)
|
|
"^The Library Computer is inoperative.^";
|
|
|
|
print "^Choose which library-computer function you wish to use:^^";
|
|
print "1: Galactic Record^";
|
|
print "2: Status Report^";
|
|
print "3: Exit^^";
|
|
print "Enter choice: ";
|
|
|
|
@read_char 1 -> i;
|
|
print i - 48, "^";
|
|
switch(i)
|
|
{
|
|
'1' : GalacticRecord();
|
|
'2' : StatusReport();
|
|
'3' : "^Library-computer exited.^^";
|
|
default: "^Invalid choice.^";
|
|
}
|
|
];
|
|
|
|
[ GalacticRecord i j;
|
|
new_line;
|
|
new_line;
|
|
|
|
print " The Galaxy^^";
|
|
print " 1 2 3 4 5 6 7 8^";
|
|
print " ----- ----- ----- ----- ----- ----- ----- -----^";
|
|
|
|
for (i = 0: i < 64: i++)
|
|
{
|
|
if (i%8 == 0)
|
|
{
|
|
print " ";
|
|
print 8 - i/8;
|
|
print ":";
|
|
}
|
|
|
|
j = trek_galaxy_history-->i;
|
|
|
|
print " ";
|
|
|
|
if (i == trek_quadrant_position)
|
|
style reverse;
|
|
else
|
|
style roman;
|
|
|
|
switch(j)
|
|
{
|
|
0 to 9 : print " 00"; print j;
|
|
10 to 98 : print " 0"; print j;
|
|
999 : print " ***";
|
|
default : print " "; print j;
|
|
}
|
|
|
|
print " ";
|
|
|
|
style roman;
|
|
|
|
if (i%8 == 7)
|
|
print "^";
|
|
}
|
|
];
|
|
|
|
[ StatusReport i j x y;
|
|
for (i = 1: i < 64: i++)
|
|
if (trek_sector->i == KLINGON) j++;
|
|
|
|
print "^Status Report:^^";
|
|
|
|
print "Startdate: ", (trek_current_date / 10), ".",
|
|
(trek_current_date % 10), "^^";
|
|
|
|
print "Time remaining in mission: ", trek_end_of_time / 10, ".",
|
|
trek_end_of_time % 10, " days^^";
|
|
|
|
x = (trek_quadrant_position % 8) + 1;
|
|
y = 8 - (trek_quadrant_position / 8);
|
|
|
|
print "Position:^^";
|
|
print " Quadrant: ", x, ", ", y, " (";
|
|
PrintQuadrantName(x, y);
|
|
print ")^^";
|
|
|
|
x = (trek_sector_position % 8) + 1;
|
|
y = 8 - (trek_sector_position / 8);
|
|
|
|
print " Sector: ", x, ", ", y, "^^";
|
|
|
|
print "Alert Condition: ";
|
|
|
|
if (j > 0)
|
|
print "Red^^";
|
|
else if (trek_current_energy * 10 < MAX_POWER)
|
|
print "Yellow^^";
|
|
else
|
|
print "Green^^";
|
|
|
|
print "Klingon warships remaining: ", trek_klingons_left, "^^";
|
|
|
|
print "Total bases remaining: ", trek_total_bases, "^^";
|
|
|
|
print "Total energy remaining: ", trek_current_energy +
|
|
trek_shield_value, "^^";
|
|
|
|
print "Current shield setting: ", trek_shield_value, "^^";
|
|
|
|
print "Total torpedoes remaining: ", trek_torps_remaining, "^";
|
|
];
|
|
|
|
[ KlingonsShoot i j k x1 y1 x2 y2 rng dmg;
|
|
i = trek_long_range_galaxy-->trek_quadrant_position;
|
|
|
|
i = i / 100; ! Klingons
|
|
|
|
if (i == 0) return;
|
|
|
|
if (trek_docked_flag > 0)
|
|
"^Starbase shields protect the Enterprise^^";
|
|
|
|
j = -1;
|
|
for (k = 0: k < 64: k++)
|
|
{
|
|
if (trek_sector->k == KLINGON)
|
|
{
|
|
j++;
|
|
x1 = (k % 8) + 1;
|
|
y1 = 8 - (k / 8);
|
|
|
|
x2 = (trek_sector_position % 8) + 1;
|
|
y2 = 8 - (trek_sector_position / 8);
|
|
|
|
rng = Range(x1, y1, x2, y2);
|
|
|
|
dmg = trek_klingon_array->j;
|
|
|
|
x2 = trek_klingon_array->j;
|
|
|
|
x2 = x2 * 2 / 3; ! Reduce available Klingon energy by 1/3
|
|
|
|
trek_klingon_array->j = x2;
|
|
|
|
dmg = dmg * 10 / (rng + random(5) - 1);
|
|
|
|
print "^The Klingon battlecruiser at ", x1, ", ", y1,
|
|
" fires on you for ", dmg, " units of damage.^";
|
|
|
|
if (dmg > trek_shield_value)
|
|
{
|
|
ShipDestroyed();
|
|
}
|
|
else
|
|
{
|
|
trek_shield_value = trek_shield_value - dmg;
|
|
print "^Shield energy is down to ", trek_shield_value,
|
|
" units.^";
|
|
if (dmg >= 20)
|
|
{
|
|
if (random(10) < 7 || (dmg * 10 / trek_shield_value > 2))
|
|
{
|
|
dmg = random(8) - 1;
|
|
if (trek_damage_array->dmg > 0)
|
|
{
|
|
x2 = trek_damage_array->dmg;
|
|
x2--;
|
|
trek_damage_array->dmg = x2;
|
|
}
|
|
print "^Damage control reports: ~";
|
|
switch(dmg)
|
|
{
|
|
0 : print "The warp engines were";
|
|
1 : print "The short range sensors were";
|
|
2 : print "The long range sensors were";
|
|
3 : print "Phaser controls were";
|
|
4 : print "The photon torpedo tubes were";
|
|
5 : print "Damage control was";
|
|
6 : print "Shield control was";
|
|
7 : print "The library-computer was";
|
|
}
|
|
print " damaged in the attack.~^";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
KlingonsMove();
|
|
UpdateStatus();
|
|
ShortRangeScan();
|
|
];
|
|
|
|
[ KlingonsMove i j k;
|
|
j = 0;
|
|
for (i = 0: i < 64: i++)
|
|
{
|
|
if (trek_sector->i == KLINGON)
|
|
{
|
|
j++; ! Count the number of Klingons in the sector
|
|
trek_sector->i = 0; ! and zero their location
|
|
}
|
|
}
|
|
|
|
for (i = 1: i <= j: i++) ! Position Klingons
|
|
{
|
|
.Retry4;
|
|
k = random(64) - 1;
|
|
if (trek_sector->k ~= 0)
|
|
jump Retry4;
|
|
else
|
|
trek_sector->k = KLINGON;
|
|
}
|
|
|
|
if (trek_klingon_array->0 == 0) ! "Garbage collect" the damage array
|
|
trek_klingon_array->0 = trek_klingon_array->1;
|
|
|
|
if (trek_klingon_array->1 == 0)
|
|
trek_klingon_array->1 = trek_klingon_array->2;
|
|
];
|
|
|
|
[ DamageRepair i j k;
|
|
if (trek_docked_flag == 1) ! Docked
|
|
{
|
|
trek_docked_flag = 2;
|
|
trek_current_energy = MAX_POWER;
|
|
trek_torps_remaining = trek_torp_capacity;
|
|
if (trek_shield_value > 0)
|
|
print "^Shields dropped for docking purposes.^";
|
|
|
|
trek_shield_value = 0;
|
|
|
|
j = 0;
|
|
for (i = 0: i < 8: i++)
|
|
{
|
|
if (trek_damage_array->i < 5)
|
|
j = j + (5 - trek_damage_array->i);
|
|
}
|
|
|
|
if (j > 0)
|
|
{
|
|
print "^Technicians are standing by to effect repairs to your ship.
|
|
These repairs will take ", j / 10, ".", j % 10, " days to
|
|
complete. Will you authorize the repair order? (Y/N) ";
|
|
|
|
@read_char->k;
|
|
if (k == 'Y' or 'y')
|
|
{
|
|
trek_current_date = trek_current_date + j;
|
|
trek_end_of_time = trek_end_of_time - j;
|
|
if (trek_end_of_time <= 0)
|
|
EndOfTime();
|
|
for (i = 0: i < 8: i++)
|
|
trek_damage_array->i = 5;
|
|
print "^";
|
|
}
|
|
else
|
|
"^";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
k = trek_damage_array->DAMAGE_CONTROL;
|
|
for (i = 0: i < 8: i++)
|
|
{
|
|
if (trek_damage_array->i < 5 && random(20) < k)
|
|
{
|
|
j = trek_damage_array->i;
|
|
j++;
|
|
trek_damage_array->i = j;
|
|
print "^Damage control reports: ~The ";
|
|
switch(i)
|
|
{
|
|
0 : print "warp engines have";
|
|
1 : print "short range sensors have";
|
|
2 : print "long range sensors have";
|
|
3 : print "phaser control system has";
|
|
4 : print "photon torpedo tubes have";
|
|
5 : print "damage control system has";
|
|
6 : print "shield control system has";
|
|
7 : print "library-computer has";
|
|
}
|
|
if (j < 5)
|
|
print " been partially repaired.~^";
|
|
else
|
|
print " been completely repaired.~^";
|
|
}
|
|
}
|
|
}
|
|
];
|
|
|
|
[ PrintQuadrantName x y;
|
|
if (x == 1 or 2)
|
|
{
|
|
if (y == 1 or 2)
|
|
print "Antares";
|
|
if (y == 3 or 4)
|
|
print "Rigel";
|
|
if (y == 5 or 6)
|
|
print "Procyon";
|
|
if (y == 7 or 8)
|
|
print "Vega";
|
|
}
|
|
if (x == 3 or 4)
|
|
{
|
|
if (y == 1 or 2)
|
|
print "Canopus";
|
|
if (y == 3 or 4)
|
|
print "Altair";
|
|
if (y == 5 or 6)
|
|
print "Sagittarius";
|
|
if (y == 7 or 8)
|
|
print "Pollux";
|
|
}
|
|
if (x == 5 or 6)
|
|
{
|
|
if (y == 1 or 2)
|
|
print "Sirius";
|
|
if (y == 3 or 4)
|
|
print "Deneb";
|
|
if (y == 5 or 6)
|
|
print "Capella";
|
|
if (y == 7 or 8)
|
|
print "Betelgeuse";
|
|
}
|
|
if (x == 7 or 8)
|
|
{
|
|
if (y == 1 or 2)
|
|
print "Aldebaran";
|
|
if (y == 3 or 4)
|
|
print "Regulus";
|
|
if (y == 5 or 6)
|
|
print "Arcturus";
|
|
if (y == 7 or 8)
|
|
print "Spica";
|
|
}
|
|
|
|
if (x == 1 or 3 or 5 or 7)
|
|
{
|
|
if (y == 1 or 3 or 5 or 7)
|
|
print " I";
|
|
else
|
|
print " III";
|
|
}
|
|
|
|
if (x == 2 or 4 or 6 or 8)
|
|
{
|
|
if (y == 1 or 3 or 5 or 7)
|
|
print " II";
|
|
else
|
|
print " IV";
|
|
}
|
|
];
|
|
|
|
[ Range x1 y1 x2 y2 delta_x delta_y result;
|
|
delta_x = (x1 - x2) * 10;
|
|
delta_x = delta_x * delta_x;
|
|
|
|
delta_y = (y1 - y2) * 10;
|
|
delta_y = delta_y * delta_y;
|
|
|
|
result = SquareRoot(delta_x + delta_y);
|
|
|
|
return result;
|
|
];
|
|
|
|
! Brute force approach to finding the square root of a number
|
|
|
|
[ SquareRoot a b;
|
|
for (b = 1: b <= 110: b++)
|
|
{
|
|
if (b * b > a)
|
|
return (b - 1);
|
|
}
|
|
];
|
|
|
|
[ ShipDestroyed ;
|
|
print "The Enterprise has been destroyed. You have failed. ";
|
|
LoseGame();
|
|
];
|
|
|
|
[ OutOfEnergy ;
|
|
print "^You've stranded yourself in space without enough energy to get to
|
|
a base! ";
|
|
LoseGame();
|
|
];
|
|
|
|
[ EndOfTime ;
|
|
print "You've run out of time, Captain! ";
|
|
LoseGame();
|
|
];
|
|
|
|
[ LoseGame ;
|
|
print "It is stardate ", (trek_current_date / 10), ".",
|
|
(trek_current_date % 10), ". ";
|
|
|
|
print "There ";
|
|
|
|
if (trek_klingons_left == 1)
|
|
print "was ";
|
|
else
|
|
print "were ";
|
|
print trek_klingons_left, " Klingon battlecruiser";
|
|
|
|
if (trek_klingons_left ~= 1)
|
|
print "s";
|
|
|
|
print " left at the end of your mission.^^";
|
|
|
|
print "[Press any key to continue.]^";
|
|
Pause();
|
|
EndScreen();
|
|
];
|
|
|
|
[ WonGame ;
|
|
print "Congratulations, Captain! You have destroyed the last Klingon
|
|
battlecruiser in your patrol area.^^";
|
|
|
|
print "[Press any key to continue.]^";
|
|
Pause();
|
|
EndScreen();
|
|
];
|
|
|
|
[ EndScreen ;
|
|
@set_cursor 1 1;
|
|
@split_window 0;
|
|
@erase_window $ffff;
|
|
|
|
print "^Thanks for playing Super Z Trek.^^";
|
|
@quit;
|
|
];
|
|
|
|
[ Pause dummy;
|
|
@read_char 1 dummy;
|
|
return dummy;
|
|
];
|
|
|
|
[ Help i;
|
|
print "^Choose which file to read:^^";
|
|
print "1: How To Play Super Z Trek^";
|
|
print "2: About This Game^";
|
|
print "3: Exit^^";
|
|
print "Enter choice: ";
|
|
|
|
@read_char 1 -> i;
|
|
print i - 48, "^";
|
|
switch(i)
|
|
{
|
|
'1' : HowToPlay();
|
|
'2' : About();
|
|
'3' : "^Library-computer exited.^^";
|
|
default: "^Invalid choice.^";
|
|
}
|
|
];
|
|
|
|
[ HowToPlay ;
|
|
print "^Welcome to Super Z Trek, the classic computer game ported to the
|
|
Z machine.^^";
|
|
|
|
print "The Z Trek galaxy is divided into an 8 x 8 quadrant grid, and each
|
|
quadrant is further divided into an 8 x 8 sector grid.^^";
|
|
|
|
print "You will be assigned a starting point somewhere in the galaxy to
|
|
begin a tour of duty as captain of the starship Enterprise. Your
|
|
mission: to seek out and destroy a fleet of Klingon warships which
|
|
have invaded the United Federation of Planets.^^";
|
|
|
|
print "COMMANDS^^";
|
|
|
|
print "The menu bar at the top of the screen displays information about the
|
|
current game and a list of allowable commands. Each command (numbered
|
|
'1' through '0') is activated by pressing the appropriate key. Each
|
|
key only has to be pressed once; you do not have to press 'Enter'
|
|
to complete the command. Each command is described below.^^";
|
|
|
|
print "1. Nav: This command is used to move the Enterprise around the
|
|
galaxy. Two additional pieces of information are required to
|
|
complete this command: course and speed. Course is an integer
|
|
from 1 to 8, as follows:^^";
|
|
|
|
PrintCompass();
|
|
|
|
print "^As with the command keys, only one keypress is required to enter
|
|
the course.^^";
|
|
|
|
print "The second entry is the speed, which is also an integer. The
|
|
Enterprise's speed ranges from 1 up to a maximum of 8, but this
|
|
maximum may be reduced due to damage to the warp engines. Speed is
|
|
entered in the same way as course, with only one keypress
|
|
required.^^";
|
|
|
|
print "If you wish to abort the movement command, enter an invalid value
|
|
for either the course or speed.^^";
|
|
|
|
print "2. SRS: This command prints out the results of a Short Range Sensor
|
|
scan. The print out shows what occupies the Enterprise's current
|
|
quadrant. The symbols used are:^^";
|
|
|
|
print " +E+ = Your starship's position^";
|
|
print " +K+ = Klingon battlecruiser^";
|
|
print " >B< = Federation starbase (Refuel/Repair/Re-Arm here)^";
|
|
print " >D< = Federation starbase with the Enterprise docked^";
|
|
print " # = Star^";
|
|
print " . = Empty space^^";
|
|
|
|
print "3. LRS: This shows shows conditions in space for one quadrant on
|
|
each side of the Enterprise (which is in the middle of the scan
|
|
in reverse video). The scan is coded in the form ~###~ where the
|
|
units digit is the number of stars, the tens digit is the number
|
|
of starbases, and the hundreds digit is the number of Klingons.^^";
|
|
|
|
print "Example: 207 = 2 Klingons, No Starbases, and 7 stars.^^";
|
|
|
|
print "4. Phaser: Allows you to destroy the Klingon battlecruisers by
|
|
zapping them with suitably large units of energy to deplete their
|
|
shield power. With this command, you must enter the number of units
|
|
of energy you want to fire, then press the 'Enter' key. The amount
|
|
of energy you use will be divided evenly between all of the Klingons
|
|
in the quadrant.^^";
|
|
|
|
print "5. Torp: This commands fires one photon torpedo at one Klingon
|
|
ship. You will have to enter the torpedo's course, which is the
|
|
same used in movement. If you hit the Klingon vessel, it is
|
|
destroyed and cannot fire back at you. If you miss, you are subject
|
|
to the disrupter fire of all other Klingons in the quadrant.^^";
|
|
|
|
print "Note: Since Inform only works with integers, this version
|
|
eliminates the guesswork involved in moving and firing torpedoes.
|
|
To make up for this, the torpedo algorithm gives the torpedo a
|
|
random chance to miss, which increases as the range increases.^^";
|
|
|
|
print "6. Shield: This command defines the number of energy units to be
|
|
assigned to the shields. Energy for the shields is taken from the
|
|
ship's total energy.
|
|
If the Enterprise is hit and the shield value is reduced to zero or
|
|
less, the Enterprise is destroyed. Don't forget to put energy into
|
|
the shields before entering combat! Note that the ~Total Energy
|
|
Remaining~ heading on the menu bar includes shield energy.^^";
|
|
|
|
print "7. Damage: This command shows the state of repair of all devices,
|
|
either ~Operational~ or ~Damaged.~ If a device is damaged, the
|
|
ship's crew will attempt to repair it each time the ship moves.
|
|
All damaged may be repaired while docked at a starbase. To dock,
|
|
simply move into the same sector as the starbase.^^";
|
|
|
|
print "8. Library: The library-computer has two functions: ^^";
|
|
|
|
print "Function 1: Cumulative Galactic Record. This shows computer
|
|
memory of the results of all previous short and long range sensor
|
|
scans.^^";
|
|
|
|
print "Function 2: Status Report. This function shows the number of
|
|
Klingons, stardates, and starbases remaining in the game.^^";
|
|
|
|
print "9. Help: Brings up the help menu.^^";
|
|
|
|
print "0. Quit: Quits the game.^^";
|
|
|
|
];
|
|
|
|
[ About ;
|
|
print "^The Star Trek game has been around since the dawn of personal
|
|
computers. This version, written in Inform by John Menichelli,
|
|
is just the latest incarnation of this classic game. If you
|
|
have any questions, comments or bug reports, please email them to
|
|
me at menichel@@0064pixi.com. This program and its source code are
|
|
in the public domain.^^";
|
|
|
|
print "The Inform version is based on the C port of an old BASIC program.
|
|
The C version was written by Chris Nystrom and is available
|
|
from:^^";
|
|
|
|
print "http://www.cfi.org/pub/ccn/startrek^^";
|
|
|
|
print "You can contact the author of the C port at:^^";
|
|
|
|
print "Chris Nystrom^
|
|
1013 Prairie Dove Circle^
|
|
Austin, Texas 78758^^
|
|
E-Mail: chris@@0064gnu.ai.mit.edu, nystrom@@0064cactus.org,
|
|
or ccn@@0064cfi.org^^";
|
|
|
|
print "The original Super Star Trek game comes from the book ~BASIC
|
|
Computer Games~ edited by David Ahl of Creative Computing fame. It
|
|
was published in 1978 by Workman Publishing, 1 West 39 Street,
|
|
New York, New York, and the ISBN is: 0-89489-052-3.^^";
|
|
|
|
print "Here is the original BASIC header:^^";
|
|
|
|
print "SUPER STARTREK - MAY 16, 1978 - REQUIRES 24K MEMORY^^";
|
|
|
|
print " **** STAR TREK ****^";
|
|
|
|
print "SIMULATION OF A MISSION OF THE STARSHIP ENTERPRISE,^";
|
|
print "AS SEEN ON THE STAR TREK TV SHOW.^";
|
|
print "ORIGINAL PROGRAM BY MIKE MAYFIELD, MODIFIED VERSION^";
|
|
print "PUBLISHED IN DEC'S ~101 BASIC GAMES~, BY DAVE AHL.^";
|
|
print "MODIFICATIONS TO THE LATTER (PLUS DEBUGGING) BY BOB^";
|
|
print "LEEDOM - APRIL & DECEMBER 1974,^";
|
|
print "WITH A LITTLE HELP FROM HIS FRIENDS . . .^";
|
|
print "COMMENTS, EPITHETS, AND SUGGESTIONS SOLICITED --^";
|
|
print "SEND TO: R. C. LEEDOM^";
|
|
print " WESTINGHOUSE DEFENSE & ELECTRONICS SYSTEMS CNTR.^";
|
|
print " BOX 746, M.S. 338^";
|
|
print " BALTIMORE, MD 21203^^";
|
|
|
|
print "CONVERTED TO MICROSOFT 8 K BASIC 3/16/78 BY JOHN BORDERS^";
|
|
print "LINE NUMBERS FROM VERSION STREK7 OF 1/12/75 PRESERVED AS^";
|
|
print "MUCH AS POSSIBLE WHILE USING MULTIPLE STATMENTS PER LINE^^";
|
|
];
|