From e94c8b614c61f34fbb28bde07e96796cf8729294 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Thu, 17 Aug 2023 13:50:28 -0400 Subject: [PATCH 01/16] Uncollide a name. --- sst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sst b/sst index 6d59b2c..192d067 100755 --- a/sst +++ b/sst @@ -1282,7 +1282,7 @@ def torpedo(origin, bearing, dispersion, number, nburst): # Loop to move a single torpedo setwnd(message_window) for step in range(1, QUADSIZE*2): - if not track.nexttok(): + if not track.nextstep(): break w = track.sector() if not w.valid_sector(): @@ -1306,7 +1306,7 @@ def torpedo(origin, bearing, dispersion, number, nburst): # In the C/FORTRAN version, dispersion was 2.5 radians, which # is 143 degrees, which is almost exactly 4.8 clockface units displacement = course(track.bearing+rnd.real(-2.4, 2.4), distance=2**0.5) - displacement.nexttok() + displacement.nextstep() bumpto = displacement.sector() if not bumpto.valid_sector(): return hit @@ -1348,7 +1348,7 @@ def torpedo(origin, bearing, dispersion, number, nburst): return None proutn(crmena(True, iquad, "sector", w)) displacement = course(track.bearing+rnd.real(-2.4, 2.4), distance=2**0.5, origin=w) - displacement.nexttok() + displacement.nextstep() bumpto = displacement.sector() if game.quad[bumpto.i][bumpto.j] == ' ': prout(_(" buffeted into black hole.")) @@ -2550,7 +2550,7 @@ def events(): supercommander() elif evcode == FDSPROB: # Move deep space probe schedule(FDSPROB, 0.01) - if not game.probe.nexttok(): + if not game.probe.nextstep(): if not game.probe.quadrant().valid_quadrant() or \ game.state.galaxy[game.probe.quadrant().i][game.probe.quadrant().j].supernova: # Left galaxy or ran into supernova @@ -3887,7 +3887,7 @@ def imove(icourse=None, noattack=False): # Move out game.quad[game.sector.i][game.sector.j] = '.' for _m in range(icourse.moves): - icourse.nexttok() + icourse.nextstep() w = icourse.sector() if icourse.origin.quadrant() != icourse.location.quadrant(): newquadrant(noattack) @@ -4118,7 +4118,7 @@ class course: self.step = 0 def arrived(self): return self.location.roundtogrid() == self.final - def nexttok(self): + def nextstep(self): "Next step on course." self.step += 1 self.nextlocation = self.location + self.increment @@ -4267,7 +4267,7 @@ def warp(wcourse, involuntary): look = wcourse.moves while look > 0: look -= 1 - wcourse.nexttok() + wcourse.nextstep() w = wcourse.sector() if not w.valid_sector(): break -- 2.31.1 From 4645bc15ad6aa7a636f7a31babcdd7d7b9635553 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Thu, 17 Aug 2023 14:39:17 -0400 Subject: [PATCH 02/16] Game log opening stanzas have an end delimiter. --- sst | 1 + test/test01.chk | 1 + test/test01.log | 1 + test/test02.chk | 1 + test/test02.log | 1 + test/test03.chk | 1 + test/test03.log | 1 + test/test04.chk | 1 + test/test04.log | 1 + test/test05.chk | 1 + test/test05.log | 1 + test/test06.chk | 1 + test/test06.log | 1 + test/test07.chk | 1 + test/test07.log | 1 + test/test08.chk | 1 + test/test08.log | 1 + test/test09.chk | 1 + test/test09.log | 1 + test/test10.chk | 1 + test/test10.log | 1 + test/test11.chk | 12 ++---------- test/test11.log | 11 +---------- test/test12.chk | 1 + test/test12.log | 1 + test/test13.chk | 8 +------- test/test13.log | 8 +------- test/test14.chk | 1 + test/test14.log | 1 + test/test15.chk | 1 + test/test15.log | 1 + test/test16.chk | 1 + test/test16.log | 1 + test/test17.chk | 1 + test/test17.log | 1 + test/test18.chk | 1 + test/test18.log | 1 + test/test19.chk | 1 + test/test19.log | 1 + test/test20.chk | 1 + test/test20.log | 1 + test/test21.chk | 1 + test/test21.log | 1 + test/test22.chk | 1 + test/test22.log | 1 + test/test23.chk | 1 + test/test23.log | 1 + test/test24.chk | 1 + test/test24.log | 1 + test/test25.chk | 1 + test/test25.log | 1 + test/test26.chk | 1 + test/test26.log | 1 + test/test27.chk | 1 + test/test27.log | 1 + test/test28.chk | 1 + test/test28.log | 1 + test/test29.chk | 1 + test/test29.log | 1 + test/test30.chk | 1 + test/test30.log | 1 + test/test31.chk | 1 + test/test31.log | 1 + 63 files changed, 64 insertions(+), 34 deletions(-) diff --git a/sst b/sst index 192d067..21935f4 100755 --- a/sst +++ b/sst @@ -6847,6 +6847,7 @@ if __name__ == '__main__': logfp.write("# SST2K version %s\n" % version) logfp.write("# recorded by %s@%s on %s\n" % \ (getpass.getuser(),socket.getfqdn(),time.ctime())) + logfp.write("#\n") rnd.seed(seed) scanner = sstscanner() for arg in arguments: diff --git a/test/test01.chk b/test/test01.chk index 410c4ef..be548f9 100644 --- a/test/test01.chk +++ b/test/test01.chk @@ -5,6 +5,7 @@ Would you like a regular, tournament, or saved game? # SST2K version 2.4 # Test bringing game up, viewing galaxy, quitting # recorded by esr@snark.thyrsus.com on Wed Apr 24 01:46:01 2019 +# r Would you like a Short, Medium, or Long game? s Are you a Novice, Fair, Good, Expert, or Emeritus player? g diff --git a/test/test01.log b/test/test01.log index e3bde23..f72bcd9 100644 --- a/test/test01.log +++ b/test/test01.log @@ -3,6 +3,7 @@ # SST2K version 2.4 # Test bringing game up, viewing galaxy, quitting # recorded by esr@snark.thyrsus.com on Wed Apr 24 01:46:01 2019 +# r s g diff --git a/test/test02.chk b/test/test02.chk index 7e795ed..5010ae2 100644 --- a/test/test02.chk +++ b/test/test02.chk @@ -19,6 +19,7 @@ Good Luck! COMMAND> # SST2K version 2.4 # Test critical hit on sensors # recorded by esr@snark.thyrsus.com on Wed Apr 24 06:29:47 2019 +# chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 diff --git a/test/test02.log b/test/test02.log index afed55f..786d121 100644 --- a/test/test02.log +++ b/test/test02.log @@ -3,6 +3,7 @@ # SST2K version 2.4 # Test critical hit on sensors # recorded by esr@snark.thyrsus.com on Wed Apr 24 06:29:47 2019 +# chart m a 3 6 m a 7 8 10 20 diff --git a/test/test03.chk b/test/test03.chk index 2db6b7e..1bd5c7a 100644 --- a/test/test03.chk +++ b/test/test03.chk @@ -19,6 +19,7 @@ Good Luck! COMMAND> # SST2K version 2.4 # Test Tholian boxing us in followed by death by tractor beam # recorded by esr@snark.thyrsus.com on Wed Apr 24 09:48:31 2019 +# chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 diff --git a/test/test03.log b/test/test03.log index ad6dfb3..6ce4f55 100644 --- a/test/test03.log +++ b/test/test03.log @@ -3,6 +3,7 @@ # SST2K version 2.4 # Test Tholian boxing us in followed by death by tractor beam # recorded by esr@snark.thyrsus.com on Wed Apr 24 09:48:31 2019 +# chart sh down m a 3 1 1 10 diff --git a/test/test04.chk b/test/test04.chk index dc3429b..a9f5435 100644 --- a/test/test04.chk +++ b/test/test04.chk @@ -19,6 +19,7 @@ Good Luck! COMMAND> # SST2K version 2.4 # Test starbase destruction, planet destruction, docking after destruction. # recorded by esr@snark.thyrsus.com on Fri Aug 11 08:59:1 3 2023 +# chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 diff --git a/test/test04.log b/test/test04.log index d2c59b4..5d8111f 100644 --- a/test/test04.log +++ b/test/test04.log @@ -3,6 +3,7 @@ # SST2K version 2.4 # Test starbase destruction, planet destruction, docking after destruction. # recorded by esr@snark.thyrsus.com on Fri Aug 11 08:59:1 3 2023 +# chart m a 3 7 1 2 sh up diff --git a/test/test05.chk b/test/test05.chk index 011c233..8f024da 100644 --- a/test/test05.chk +++ b/test/test05.chk @@ -18,6 +18,7 @@ Good Luck! YOU'LL NEED IT. COMMAND> # Test deep-space probes # recorded by esr@snark.thyrsus.com on Wed Apr 24 11:34:04 2019 +# chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 diff --git a/test/test05.log b/test/test05.log index 0c96758..e7ce90d 100644 --- a/test/test05.log +++ b/test/test05.log @@ -2,6 +2,7 @@ # arguments regular short good fancy # Test deep-space probes # recorded by esr@snark.thyrsus.com on Wed Apr 24 11:34:04 2019 +# chart m a 1 10 s hup diff --git a/test/test06.chk b/test/test06.chk index 9a94823..19f0d6c 100644 --- a/test/test06.chk +++ b/test/test06.chk @@ -19,6 +19,7 @@ Good Luck! COMMAND> # SST2K version 2.4 # Test shuttle landing with no crystals # recorded by esr@snark.thyrsus.com on Wed Apr 24 12:02:47 2019 +# chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 diff --git a/test/test06.log b/test/test06.log index 141abbf..31d290d 100644 --- a/test/test06.log +++ b/test/test06.log @@ -3,6 +3,7 @@ # SST2K version 2.4 # Test shuttle landing with no crystals # recorded by esr@snark.thyrsus.com on Wed Apr 24 12:02:47 2019 +# chart p a 148 diff --git a/test/test07.chk b/test/test07.chk index c0b6c1c..3c5b0a1 100644 --- a/test/test07.chk +++ b/test/test07.chk @@ -19,6 +19,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test supercommander destruction. # recorded by esr@snark.thyrsus.com on Fri Aug 11 17:23:51 2023 +# sh up Shields already up. COMMAND> phasers diff --git a/test/test07.log b/test/test07.log index 847c1ce..a455067 100644 --- a/test/test07.log +++ b/test/test07.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test supercommander destruction. # recorded by esr@snark.thyrsus.com on Fri Aug 11 17:23:51 2023 +# sh up phasers a diff --git a/test/test08.chk b/test/test08.chk index 6f20aeb..008ab59 100644 --- a/test/test08.chk +++ b/test/test08.chk @@ -20,6 +20,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test game-win condition # recorded by esr@snark.thyrsus.com on Sat Aug 12 05:18:43 2023 +# chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 diff --git a/test/test08.log b/test/test08.log index db4a397..0f0e6e1 100644 --- a/test/test08.log +++ b/test/test08.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test game-win condition # recorded by esr@snark.thyrsus.com on Sat Aug 12 05:18:43 2023 +# chart probe y diff --git a/test/test09.chk b/test/test09.chk index 307ec65..4f9a83a 100644 --- a/test/test09.chk +++ b/test/test09.chk @@ -19,6 +19,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test behavior of Tholian # recorded by esr@snark.thyrsus.com on Fri Aug 11 14:51:27 2023 +# srscan Short-range scan 1 2 3 4 5 6 7 8 9 10 diff --git a/test/test09.log b/test/test09.log index f3d6c29..d162284 100644 --- a/test/test09.log +++ b/test/test09.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test behavior of Tholian # recorded by esr@snark.thyrsus.com on Fri Aug 11 14:51:27 2023 +# srscan m a 1 10 # Observe that the Tolian doesn't spin a web.. diff --git a/test/test10.chk b/test/test10.chk index 7cd307f..f4a070a 100644 --- a/test/test10.chk +++ b/test/test10.chk @@ -20,6 +20,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test game timeout condition # recorded by esr@snark.thyrsus.com on Sat Aug 12 05:58:57 2023 +# rest How long? 16 Are you sure? y diff --git a/test/test10.log b/test/test10.log index d8acab6..416cc35 100644 --- a/test/test10.log +++ b/test/test10.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test game timeout condition # recorded by esr@snark.thyrsus.com on Sat Aug 12 05:58:57 2023 +# rest 16 y diff --git a/test/test11.chk b/test/test11.chk index 8acbae4..3473dd7 100644 --- a/test/test11.chk +++ b/test/test11.chk @@ -19,10 +19,9 @@ Good Luck! COMMAND> # SST2K version 2.5 # Test loss by energy exhaustion. # recorded by esr@snark.thyrsus.com on Thu Apr 25 13:21:59 2019 +# +m a 1 4 -COMMAND> m a 1 4 - -COMMAND> COMMAND> sh up Shields raised. COMMAND> m a 5 6 10 5 @@ -65,8 +64,6 @@ Klingon captain at c4 surrenders. 47 Klingons commit suicide rather than be taken captive. 152 captives taken ***Klingon at Sector j5 destroyed. -COMMAND> -COMMAND> COMMAND> sh down Shields lowered. COMMAND> m a 10 8 @@ -80,7 +77,6 @@ Message from Starfleet Command Stardate 2737.23 Supernova in Quadrant e4; caution advised. COMMAND> sh up Shields raised. -COMMAND> COMMAND> m a 4 6 10 8 Ensign Chekov- "Course laid in, Captain." @@ -216,7 +212,6 @@ Shields lowered. ***Klingon at Sector b2 destroyed. Shields raised. -COMMAND> COMMAND> m a 8 1 @@ -224,7 +219,6 @@ COMMAND> m a 8 1 Message from Starfleet Command Stardate 2737.64 Supernova in Quadrant c6; caution advised. -COMMAND> COMMAND> m a 3 5 10 10 Ensign Chekov- "Course laid in, Captain." @@ -233,8 +227,6 @@ Ensign Chekov- "Course laid in, Captain." ***Enterprise caught in long range tractor beam-- Enterprise is pulled to Quadrant e6, Sector e1 -COMMAND> -COMMAND> COMMAND> m a 3 5 10 10 Ensign Chekov- "Course laid in, Captain." diff --git a/test/test11.log b/test/test11.log index 1220f8b..b158c1a 100644 --- a/test/test11.log +++ b/test/test11.log @@ -3,21 +3,17 @@ # SST2K version 2.5 # Test loss by energy exhaustion. # recorded by esr@snark.thyrsus.com on Thu Apr 25 13:21:59 2019 - +# m a 1 4 - sh up m a 5 6 10 5 p a 1310 capture - - sh down m a 10 8 m a 1 8 sh up - m a 4 6 10 8 torp 3 9 10 1 8 1 7 p a @@ -26,14 +22,9 @@ p a 296 p a 73 - m a 8 1 - m a 3 5 10 10 - - m a 3 5 10 10 sh down m a 3 5 10 10 - n diff --git a/test/test12.chk b/test/test12.chk index af4cb52..d468094 100644 --- a/test/test12.chk +++ b/test/test12.chk @@ -19,6 +19,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test dilithium mining # recorded by esr@snark.thyrsus.com on Fri Aug 11 14:30:15 2023 +# status Stardate 3135.8, Time Left 14.00 Condition GREEN, 0 DAMAGES diff --git a/test/test12.log b/test/test12.log index a4c0a20..3ed5c87 100644 --- a/test/test12.log +++ b/test/test12.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test dilithium mining # recorded by esr@snark.thyrsus.com on Fri Aug 11 14:30:15 2023 +# status sensors m a 3 10 diff --git a/test/test13.chk b/test/test13.chk index bba0c4b..77141f0 100644 --- a/test/test13.chk +++ b/test/test13.chk @@ -19,6 +19,7 @@ Good Luck! COMMAND> # SST2K version 2.5 # Test multiple critical hits ending in defeat by Supercommander # recorded by esr@snark.thyrsus.com on Fri Apr 26 11:21:47 2019 +# torp 3 7 4 8 4 9 2 Track for torpedo number 1- g4 @@ -34,7 +35,6 @@ Track for torpedo number 3- h3 i2 Energy left 4961 shields up 76%, torpedoes left 7 -COMMAND> COMMAND> torp 3 6 6 8 10 10 8 Track for torpedo number 1- g4 f5 f6 @@ -52,7 +52,6 @@ i7 j8 Energy left 4890 shields up 69%, torpedoes left 4 -COMMAND> COMMAND> p a Weapons Officer Sulu- "High-speed shield control enabled, sir." @@ -65,7 +64,6 @@ Shields lowered. ***Commander at Sector d9 destroyed. Shields raised. -COMMAND> COMMAND> sh down Shields lowered. COMMAND> m a 7 7 @@ -93,7 +91,6 @@ COMMAND> torp 1 7 4 Torpedo track- i6 h5 g4 ***Commander at Sector g4 destroyed. -COMMAND> COMMAND> rep You were playing a short good game. Your secret password is "fgy" @@ -103,7 +100,6 @@ There are 3 bases. No Starbase is currently under attack. You have 4 deep space probes. -COMMAND> COMMAND> m a 5 2 1 1 Ensign Chekov- "Course laid in, Captain." @@ -111,7 +107,6 @@ Ensign Chekov- "Course laid in, Captain." Entering Quadrant e2. Uhura- Captain, Medusa in Quadrant f2 reports it is under attack by a Klingon invasion fleet. -COMMAND> COMMAND> sh down Shields lowered. COMMAND> m a 10 5 @@ -128,7 +123,6 @@ Lt. Uhura- "Captain, Starfleet Intelligence reports by the Super-commander." COMMAND> sh up Shields raised. -COMMAND> COMMAND> m a 6 2 1 5 Ensign Chekov- "Course laid in, Captain." diff --git a/test/test13.log b/test/test13.log index 10e1abe..5fecaf7 100644 --- a/test/test13.log +++ b/test/test13.log @@ -3,28 +3,22 @@ # SST2K version 2.5 # Test multiple critical hits ending in defeat by Supercommander # recorded by esr@snark.thyrsus.com on Fri Apr 26 11:21:47 2019 +# torp 3 7 4 8 4 9 2 - torp 3 6 6 8 10 10 8 - p a 754 - sh down m a 7 7 m a 1 7 sh up m a 1 2 10 7 torp 1 7 4 - rep - m a 5 2 1 1 - sh down m a 10 5 sh up - m a 6 2 1 5 torp 1 3 7 p a diff --git a/test/test14.chk b/test/test14.chk index 59ac246..43c2e13 100644 --- a/test/test14.chk +++ b/test/test14.chk @@ -5,6 +5,7 @@ Would you like a regular, tournament, or saved game? # SST2K version 2.7 # Test death by black hole # recorded by esr@snark.thyrsus.com on Fri Aug 11 10:49:27 2023 +# r Would you like a Short, Medium, or Long game? s Are you a Novice, Fair, Good, Expert, or Emeritus player? n diff --git a/test/test14.log b/test/test14.log index b8bce3c..46a417e 100644 --- a/test/test14.log +++ b/test/test14.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test death by black hole # recorded by esr@snark.thyrsus.com on Fri Aug 11 10:49:27 2023 +# r s n diff --git a/test/test15.chk b/test/test15.chk index 5a827dd..1d39303 100644 --- a/test/test15.chk +++ b/test/test15.chk @@ -25,6 +25,7 @@ LEAVE AT ONCE, OR YOU WILL BE DESTROYED! COMMAND> # SST2K version 2.7 # Test encounter with Romulan and multiline torpedo firing # recorded by esr@snark.thyrsus.com on Fri Aug 11 11:05:56 2023 +# m a 5 9 diff --git a/test/test15.log b/test/test15.log index 23957f4..8f4c60c 100644 --- a/test/test15.log +++ b/test/test15.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test encounter with Romulan and multiline torpedo firing # recorded by esr@snark.thyrsus.com on Fri Aug 11 11:05:56 2023 +# m a 5 9 m a 4 3 torp diff --git a/test/test16.chk b/test/test16.chk index 5e6aca9..deab62a 100644 --- a/test/test16.chk +++ b/test/test16.chk @@ -19,6 +19,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test malformed torpedo command # recorded by esr@snark.thyrsus.com on Fri Aug 11 11:54:11 2023 +# torp 1 3 Beg your pardon, Captain? diff --git a/test/test16.log b/test/test16.log index 4b6e868..c2d7f4d 100644 --- a/test/test16.log +++ b/test/test16.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test malformed torpedo command # recorded by esr@snark.thyrsus.com on Fri Aug 11 11:54:11 2023 +# torp 1 3 quit n diff --git a/test/test17.chk b/test/test17.chk index f7a995c..da368c3 100644 --- a/test/test17.chk +++ b/test/test17.chk @@ -19,6 +19,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test commander destruction and supernova alert # recorded by esr@snark.thyrsus.com on Fri Aug 11 13:31:26 2023 +# m 6 4 (Manual movement assumed.) diff --git a/test/test17.log b/test/test17.log index d753f50..6768ecd 100644 --- a/test/test17.log +++ b/test/test17.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test commander destruction and supernova alert # recorded by esr@snark.thyrsus.com on Fri Aug 11 13:31:26 2023 +# m 6 4 m a 1 9 srscan diff --git a/test/test18.chk b/test/test18.chk index ef14456..671d05c 100644 --- a/test/test18.chk +++ b/test/test18.chk @@ -19,6 +19,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test behavior when emy is buffered into black hole # recorded by esr@snark.thyrsus.com on Fri Aug 11 16:43:02 2023 +# chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 diff --git a/test/test18.log b/test/test18.log index c9c3478..9d11e50 100644 --- a/test/test18.log +++ b/test/test18.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test behavior when emy is buffered into black hole # recorded by esr@snark.thyrsus.com on Fri Aug 11 16:43:02 2023 +# chart probe y diff --git a/test/test19.chk b/test/test19.chk index 5d9cf7d..f9e72fc 100644 --- a/test/test19.chk +++ b/test/test19.chk @@ -5,6 +5,7 @@ Please type in a secret password- # SST2K version 2.7 # Test plain interface and old-fashioned coordinates # recorded by esr@snark.thyrsus.com on Tue Aug 15 04:36:52 2023 +# foo diff --git a/test/test19.log b/test/test19.log index f73ba95..ff73e57 100644 --- a/test/test19.log +++ b/test/test19.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test plain interface and old-fashioned coordinates # recorded by esr@snark.thyrsus.com on Tue Aug 15 04:36:52 2023 +# foo chart m 3 7 1 5 diff --git a/test/test20.chk b/test/test20.chk index f6cb42e..2452266 100644 --- a/test/test20.chk +++ b/test/test20.chk @@ -20,6 +20,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test self-destruct # recorded by esr@snark.thyrsus.com on Tue Aug 15 05:53:14 2023 +# destruct ---WORKING--- SELF-DESTRUCT-SEQUENCE-ACTIVATED diff --git a/test/test20.log b/test/test20.log index b73b7af..222d592 100644 --- a/test/test20.log +++ b/test/test20.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test self-destruct # recorded by esr@snark.thyrsus.com on Tue Aug 15 05:53:14 2023 +# destruct rep diff --git a/test/test21.chk b/test/test21.chk index 592e4d1..2b2176f 100644 --- a/test/test21.chk +++ b/test/test21.chk @@ -20,6 +20,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test edge and failure cases in coordinate parsing # recorded by esr@snark.thyrsus.com on Tue Aug 15 06:05:57 2023 +# sr Short-range scan 1 2 3 4 5 6 7 8 9 10 diff --git a/test/test21.log b/test/test21.log index cea1818..8b5f1cc 100644 --- a/test/test21.log +++ b/test/test21.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test edge and failure cases in coordinate parsing # recorded by esr@snark.thyrsus.com on Tue Aug 15 06:05:57 2023 +# sr m a a 3 m a a3 diff --git a/test/test22.chk b/test/test22.chk index f9077fd..662fcf0 100644 --- a/test/test22.chk +++ b/test/test22.chk @@ -20,6 +20,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test torpedoing uninhabited planet # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:18:31 2023 +# m a i9 COMMAND> torpedo 1 i5 diff --git a/test/test22.log b/test/test22.log index bfaaea4..a74a8e6 100644 --- a/test/test22.log +++ b/test/test22.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test torpedoing uninhabited planet # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:18:31 2023 +# m a i9 torpedo 1 i5 quit diff --git a/test/test23.chk b/test/test23.chk index 5cc15c0..25999d6 100644 --- a/test/test23.chk +++ b/test/test23.chk @@ -20,6 +20,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test torpedoing inhabited planet and starbase # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:21:16 2023 +# m a c0 Beg your pardon, Captain? diff --git a/test/test23.log b/test/test23.log index 1e31129..e0aa841 100644 --- a/test/test23.log +++ b/test/test23.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test torpedoing inhabited planet and starbase # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:21:16 2023 +# m a c0 m a c9 torpedo 1 c 2 diff --git a/test/test24.chk b/test/test24.chk index f9d23a1..8df78bd 100644 --- a/test/test24.chk +++ b/test/test24.chk @@ -20,6 +20,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test cloaking device with no enemies present # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:24:35 2023 +# cloak Switch cloaking device on? y Spock- "Captain, using the cloaking device is a violation diff --git a/test/test24.log b/test/test24.log index a6f7cb8..52967e4 100644 --- a/test/test24.log +++ b/test/test24.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test cloaking device with no enemies present # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:24:35 2023 +# cloak y y diff --git a/test/test25.chk b/test/test25.chk index 4198f8a..b3dffd0 100644 --- a/test/test25.chk +++ b/test/test25.chk @@ -19,6 +19,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test death ray (successful) # recorded by esr@snark.thyrsus.com on Thu Aug 17 05:19:31 2023 +# deathray Spock- "Captain, the 'Experimental Death Ray' diff --git a/test/test25.log b/test/test25.log index 2b7e7a9..f3761b7 100644 --- a/test/test25.log +++ b/test/test25.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test death ray (successful) # recorded by esr@snark.thyrsus.com on Thu Aug 17 05:19:31 2023 +# deathray y quit diff --git a/test/test26.chk b/test/test26.chk index 4cfe3b2..5cb2793 100644 --- a/test/test26.chk +++ b/test/test26.chk @@ -20,6 +20,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test damage-report command (no damage) # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:29:51 2023 +# damage All devices functional. COMMAND> quit diff --git a/test/test26.log b/test/test26.log index dff532b..953cac9 100644 --- a/test/test26.log +++ b/test/test26.log @@ -3,5 +3,6 @@ # SST2K version 2.7 # Test damage-report command (no damage) # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:29:51 2023 +# damage quit diff --git a/test/test27.chk b/test/test27.chk index a4b78af..3c170e9 100644 --- a/test/test27.chk +++ b/test/test27.chk @@ -26,6 +26,7 @@ LEAVE AT ONCE, OR YOU WILL BE DESTROYED! COMMAND> # SST2K version 2.7 # Test simple collision and damage treport. # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:35:40 2023 +# m a j7 ***RED ALERT! RED ALERT! diff --git a/test/test27.log b/test/test27.log index 2ca1bd1..31c8676 100644 --- a/test/test27.log +++ b/test/test27.log @@ -3,5 +3,6 @@ # SST2K version 2.7 # Test simple collision and damage treport. # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:35:40 2023 +# m a j7 quit diff --git a/test/test28.chk b/test/test28.chk index 3de0261..a2fb54b 100644 --- a/test/test28.chk +++ b/test/test28.chk @@ -20,6 +20,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test encounter with Space Thingy and torperdoing it # recorded by esr@snark.thyrsus.com on Wed Aug 16 08:28:50 2023 +# m a e8 COMMAND> m a a1 diff --git a/test/test28.log b/test/test28.log index 38b776e..f30887c 100644 --- a/test/test28.log +++ b/test/test28.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test encounter with Space Thingy and torperdoing it # recorded by esr@snark.thyrsus.com on Wed Aug 16 08:28:50 2023 +# m a e8 m a a1 m a c2 j10 diff --git a/test/test29.chk b/test/test29.chk index c93fb3e..0cc33c0 100644 --- a/test/test29.chk +++ b/test/test29.chk @@ -19,6 +19,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test capture - trdsuccessful # recorded by esr@snark.thyrsus.com on Wed Aug 16 14:33:01 2023 +# phasers Weapons Officer Sulu- "High-speed shield control enabled, sir." diff --git a/test/test29.log b/test/test29.log index da964f0..36b024d 100644 --- a/test/test29.log +++ b/test/test29.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test capture - trdsuccessful # recorded by esr@snark.thyrsus.com on Wed Aug 16 14:33:01 2023 +# phasers a 1657 diff --git a/test/test30.chk b/test/test30.chk index 913729a..0e9fbc3 100644 --- a/test/test30.chk +++ b/test/test30.chk @@ -19,6 +19,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test death ray - failure (kaboom) # recorded by esr@snark.thyrsus.com on Wed Aug 16 15:02:57 2023 +# chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 diff --git a/test/test30.log b/test/test30.log index 0b23d2e..4b99d23 100644 --- a/test/test30.log +++ b/test/test30.log @@ -3,6 +3,7 @@ # SST2K version 2.7 # Test death ray - failure (kaboom) # recorded by esr@snark.thyrsus.com on Wed Aug 16 15:02:57 2023 +# chart m a d10 sh up diff --git a/test/test31.chk b/test/test31.chk index b69eae7..2219c49 100644 --- a/test/test31.chk +++ b/test/test31.chk @@ -19,6 +19,7 @@ Good Luck! COMMAND> # SST2K version 2.7 # Test death ray - fail (mutation) # recorded by esr@snark.thyrsus.com on Thu Aug 17 05:15:09 2023 +# deathray Spock- "Captain, the 'Experimental Death Ray' diff --git a/test/test31.log b/test/test31.log index e1887d1..3294946 100644 --- a/test/test31.log +++ b/test/test31.log @@ -3,5 +3,6 @@ # SST2K version 2.7 # Test death ray - fail (mutation) # recorded by esr@snark.thyrsus.com on Thu Aug 17 05:15:09 2023 +# deathray y -- 2.31.1 From 85ab264355ced9460243fb3345a02a4759474509 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Thu, 17 Aug 2023 15:04:19 -0400 Subject: [PATCH 03/16] Ckean up interpretation of logfile header comments --- sst | 17 +++++++++++------ test/test01.chk | 12 +++++++----- test/test02.chk | 12 +++++++----- test/test03.chk | 12 +++++++----- test/test04.chk | 12 +++++++----- test/test05.chk | 10 ++++++---- test/test06.chk | 12 +++++++----- test/test07.chk | 12 +++++++----- test/test08.chk | 12 +++++++----- test/test09.chk | 12 +++++++----- test/test10.chk | 12 +++++++----- test/test11.chk | 12 +++++++----- test/test12.chk | 12 +++++++----- test/test13.chk | 12 +++++++----- test/test14.chk | 12 +++++++----- test/test15.chk | 12 +++++++----- test/test16.chk | 12 +++++++----- test/test17.chk | 12 +++++++----- test/test18.chk | 12 +++++++----- test/test19.chk | 12 +++++++----- test/test20.chk | 12 +++++++----- test/test21.chk | 12 +++++++----- test/test22.chk | 12 +++++++----- test/test23.chk | 12 +++++++----- test/test24.chk | 12 +++++++----- test/test25.chk | 12 +++++++----- test/test26.chk | 12 +++++++----- test/test27.chk | 12 +++++++----- test/test28.chk | 12 +++++++----- test/test29.chk | 12 +++++++----- test/test30.chk | 12 +++++++----- test/test31.chk | 12 +++++++----- 32 files changed, 227 insertions(+), 160 deletions(-) diff --git a/sst b/sst index 21935f4..db52bfe 100755 --- a/sst +++ b/sst @@ -6802,12 +6802,17 @@ if __name__ == '__main__': raise SystemExit(1) # pylint: disable=raise-missing-from try: - line = replayfp.readline().strip() - (leader, __, seed) = line.split() - # pylint: disable=eval-used - seed = eval(seed) - line = replayfp.readline().strip() - arguments += line.split()[2:] + while True: + line = replayfp.readline().strip() + print(line) + if line == "#": + break + if line.startswith("# seed"): + (__, __, seed) = line.split() + # pylint: disable=eval-used + seed = eval(seed) + elif line.startswith("# arguments"): + arguments += line.split()[2:] except ValueError: # pragma: no cover sys.stderr.write("sst: replay file %s is ill-formed\n"% val) raise SystemExit(1) diff --git a/test/test01.chk b/test/test01.chk index be548f9..4407a21 100644 --- a/test/test01.chk +++ b/test/test01.chk @@ -1,12 +1,14 @@ +# seed 1556084761 +# arguments +# SST2K version 2.4 +# Test bringing game up, viewing galaxy, quitting +# recorded by esr@snark.thyrsus.com on Wed Apr 24 01:46:01 2019 +# -SUPER- STAR TREK -Would you like a regular, tournament, or saved game? # SST2K version 2.4 -# Test bringing game up, viewing galaxy, quitting -# recorded by esr@snark.thyrsus.com on Wed Apr 24 01:46:01 2019 -# -r +Would you like a regular, tournament, or saved game? r Would you like a Short, Medium, or Long game? s Are you a Novice, Fair, Good, Expert, or Emeritus player? g Choose your game style (plain, almy, fancy or just press enter): f diff --git a/test/test02.chk b/test/test02.chk index 5010ae2..a16b9f8 100644 --- a/test/test02.chk +++ b/test/test02.chk @@ -1,3 +1,9 @@ +# seed 1556101787 +# arguments regular short good fancy +# SST2K version 2.4 +# Test critical hit on sensors +# recorded by esr@snark.thyrsus.com on Wed Apr 24 06:29:47 2019 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant h8 Sector j3 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.4 -# Test critical hit on sensors -# recorded by esr@snark.thyrsus.com on Wed Apr 24 06:29:47 2019 -# -chart +COMMAND> chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 a | ... ... ... ... ... ... ... ... | diff --git a/test/test03.chk b/test/test03.chk index 1bd5c7a..9c683e4 100644 --- a/test/test03.chk +++ b/test/test03.chk @@ -1,3 +1,9 @@ +# seed 1556102474 +# arguments regular short good fancy +# SST2K version 2.4 +# Test Tholian boxing us in followed by death by tractor beam +# recorded by esr@snark.thyrsus.com on Wed Apr 24 09:48:31 2019 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant b1 Sector i10 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.4 -# Test Tholian boxing us in followed by death by tractor beam -# recorded by esr@snark.thyrsus.com on Wed Apr 24 09:48:31 2019 -# -chart +COMMAND> chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 a | ..8 ..4 ... ... ... ... ... ... | diff --git a/test/test04.chk b/test/test04.chk index a9f5435..8440814 100644 --- a/test/test04.chk +++ b/test/test04.chk @@ -1,3 +1,9 @@ +# seed 1556116333 +# arguments regular short good fancy +# SST2K version 2.4 +# Test starbase destruction, planet destruction, docking after destruction. +# recorded by esr@snark.thyrsus.com on Fri Aug 11 08:59:1 3 2023 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant b6 Sector e9 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.4 -# Test starbase destruction, planet destruction, docking after destruction. -# recorded by esr@snark.thyrsus.com on Fri Aug 11 08:59:1 3 2023 -# -chart +COMMAND> chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 a | .1. .1. ... .1. 107 ..3 ..2 ... | diff --git a/test/test05.chk b/test/test05.chk index 8f024da..f9cad8f 100644 --- a/test/test05.chk +++ b/test/test05.chk @@ -1,3 +1,8 @@ +# seed 1556120044 +# arguments regular short good fancy +# Test deep-space probes +# recorded by esr@snark.thyrsus.com on Wed Apr 24 11:34:04 2019 +# -SUPER- STAR TREK @@ -16,10 +21,7 @@ The Enterprise is currently in Quadrant b6 Sector g7 Good Luck! YOU'LL NEED IT. -COMMAND> # Test deep-space probes -# recorded by esr@snark.thyrsus.com on Wed Apr 24 11:34:04 2019 -# -chart +COMMAND> chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 a | ... ... ... ... ..8 ..5 106 ... | diff --git a/test/test06.chk b/test/test06.chk index 19f0d6c..fa4d40e 100644 --- a/test/test06.chk +++ b/test/test06.chk @@ -1,3 +1,9 @@ +# seed 1556121767 +# arguments regular short good fancy +# SST2K version 2.4 +# Test shuttle landing with no crystals +# recorded by esr@snark.thyrsus.com on Wed Apr 24 12:02:47 2019 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant f6 Sector c3 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.4 -# Test shuttle landing with no crystals -# recorded by esr@snark.thyrsus.com on Wed Apr 24 12:02:47 2019 -# -chart +COMMAND> chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 a | ... ... ... ... ... ... ... ... | diff --git a/test/test07.chk b/test/test07.chk index 3c5b0a1..5c84369 100644 --- a/test/test07.chk +++ b/test/test07.chk @@ -1,3 +1,9 @@ +# seed 1691789031 +# arguments regular medium good fancy +# SST2K version 2.7 +# Test supercommander destruction. +# recorded by esr@snark.thyrsus.com on Fri Aug 11 17:23:51 2023 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant e1 Sector j3 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.7 -# Test supercommander destruction. -# recorded by esr@snark.thyrsus.com on Fri Aug 11 17:23:51 2023 -# -sh up +COMMAND> sh up Shields already up. COMMAND> phasers diff --git a/test/test08.chk b/test/test08.chk index 008ab59..0c3e673 100644 --- a/test/test08.chk +++ b/test/test08.chk @@ -1,3 +1,9 @@ +# seed 1691831923 +# arguments regular medium novice fancy +# SST2K version 2.7 +# Test game-win condition +# recorded by esr@snark.thyrsus.com on Sat Aug 12 05:18:43 2023 +# -SUPER- STAR TREK @@ -17,11 +23,7 @@ Starbase locations- b5 g3 h3 b4 The Enterprise is currently in Quadrant a8 Sector f4 Good Luck! -COMMAND> # SST2K version 2.7 -# Test game-win condition -# recorded by esr@snark.thyrsus.com on Sat Aug 12 05:18:43 2023 -# -chart +COMMAND> chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 a | ... ... ... ... ... ... ..3 <..3> | diff --git a/test/test09.chk b/test/test09.chk index 4f9a83a..712a732 100644 --- a/test/test09.chk +++ b/test/test09.chk @@ -1,3 +1,9 @@ +# seed 1691779887 +# arguments regular medium good fancy +# SST2K version 2.7 +# Test behavior of Tholian +# recorded by esr@snark.thyrsus.com on Fri Aug 11 14:51:27 2023 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant d4 Sector a7 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.7 -# Test behavior of Tholian -# recorded by esr@snark.thyrsus.com on Fri Aug 11 14:51:27 2023 -# -srscan +COMMAND> srscan Short-range scan 1 2 3 4 5 6 7 8 9 10 a T . . . . . E . . . diff --git a/test/test10.chk b/test/test10.chk index f4a070a..1c90286 100644 --- a/test/test10.chk +++ b/test/test10.chk @@ -1,3 +1,9 @@ +# seed 1691834337 +# arguments regular medium novice fancy +# SST2K version 2.7 +# Test game timeout condition +# recorded by esr@snark.thyrsus.com on Sat Aug 12 05:58:57 2023 +# -SUPER- STAR TREK @@ -17,11 +23,7 @@ Starbase locations- b5 c4 h2 d7 g1 The Enterprise is currently in Quadrant a8 Sector c1 Good Luck! -COMMAND> # SST2K version 2.7 -# Test game timeout condition -# recorded by esr@snark.thyrsus.com on Sat Aug 12 05:58:57 2023 -# -rest +COMMAND> rest How long? 16 Are you sure? y diff --git a/test/test11.chk b/test/test11.chk index 3473dd7..716041a 100644 --- a/test/test11.chk +++ b/test/test11.chk @@ -1,3 +1,9 @@ +# seed 1556212919 +# arguments regular short good fancy +# SST2K version 2.5 +# Test loss by energy exhaustion. +# recorded by esr@snark.thyrsus.com on Thu Apr 25 13:21:59 2019 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant f6 Sector f9 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.5 -# Test loss by energy exhaustion. -# recorded by esr@snark.thyrsus.com on Thu Apr 25 13:21:59 2019 -# -m a 1 4 +COMMAND> m a 1 4 COMMAND> sh up Shields raised. diff --git a/test/test12.chk b/test/test12.chk index d468094..85b11f7 100644 --- a/test/test12.chk +++ b/test/test12.chk @@ -1,3 +1,9 @@ +# seed 1691778615 +# arguments regular medium good fancy +# SST2K version 2.7 +# Test dilithium mining +# recorded by esr@snark.thyrsus.com on Fri Aug 11 14:30:15 2023 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant c7 Sector c9 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.7 -# Test dilithium mining -# recorded by esr@snark.thyrsus.com on Fri Aug 11 14:30:15 2023 -# -status +COMMAND> status Stardate 3135.8, Time Left 14.00 Condition GREEN, 0 DAMAGES Position c7 , c9 diff --git a/test/test13.chk b/test/test13.chk index 77141f0..e5374b4 100644 --- a/test/test13.chk +++ b/test/test13.chk @@ -1,3 +1,9 @@ +# seed 1556292107 +# arguments regular short good fancy +# SST2K version 2.5 +# Test multiple critical hits ending in defeat by Supercommander +# recorded by esr@snark.thyrsus.com on Fri Apr 26 11:21:47 2019 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant b2 Sector g3 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.5 -# Test multiple critical hits ending in defeat by Supercommander -# recorded by esr@snark.thyrsus.com on Fri Apr 26 11:21:47 2019 -# -torp 3 7 4 8 4 9 2 +COMMAND> torp 3 7 4 8 4 9 2 Track for torpedo number 1- g4 ***Klingon at Sector g4 destroyed. diff --git a/test/test14.chk b/test/test14.chk index 43c2e13..0ee7bdc 100644 --- a/test/test14.chk +++ b/test/test14.chk @@ -1,12 +1,14 @@ +# seed 1691765367 +# arguments +# SST2K version 2.7 +# Test death by black hole +# recorded by esr@snark.thyrsus.com on Fri Aug 11 10:49:27 2023 +# -SUPER- STAR TREK -Would you like a regular, tournament, or saved game? # SST2K version 2.7 -# Test death by black hole -# recorded by esr@snark.thyrsus.com on Fri Aug 11 10:49:27 2023 -# -r +Would you like a regular, tournament, or saved game? r Would you like a Short, Medium, or Long game? s Are you a Novice, Fair, Good, Expert, or Emeritus player? n Choose your game style (plain, almy, fancy or just press enter): fancy diff --git a/test/test15.chk b/test/test15.chk index 1d39303..220c0b6 100644 --- a/test/test15.chk +++ b/test/test15.chk @@ -1,3 +1,9 @@ +# seed 1691766356 +# arguments regular medium good fancy +# SST2K version 2.7 +# Test encounter with Romulan and multiline torpedo firing +# recorded by esr@snark.thyrsus.com on Fri Aug 11 11:05:56 2023 +# -SUPER- STAR TREK @@ -22,11 +28,7 @@ LT. Uhura- "Captain, an urgent message. INTRUDER! YOU HAVE VIOLATED THE ROMULAN NEUTRAL ZONE. LEAVE AT ONCE, OR YOU WILL BE DESTROYED! -COMMAND> # SST2K version 2.7 -# Test encounter with Romulan and multiline torpedo firing -# recorded by esr@snark.thyrsus.com on Fri Aug 11 11:05:56 2023 -# -m a 5 9 +COMMAND> m a 5 9 Enemy attack reduces shield strength to 94%, torpedoes left 10 diff --git a/test/test16.chk b/test/test16.chk index deab62a..68a4f6b 100644 --- a/test/test16.chk +++ b/test/test16.chk @@ -1,3 +1,9 @@ +# seed 1691769251 +# arguments regular medium good fancy +# SST2K version 2.7 +# Test malformed torpedo command +# recorded by esr@snark.thyrsus.com on Fri Aug 11 11:54:11 2023 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant h3 Sector d5 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.7 -# Test malformed torpedo command -# recorded by esr@snark.thyrsus.com on Fri Aug 11 11:54:11 2023 -# -torp 1 3 +COMMAND> torp 1 3 Beg your pardon, Captain? COMMAND> quit diff --git a/test/test17.chk b/test/test17.chk index da368c3..10a5406 100644 --- a/test/test17.chk +++ b/test/test17.chk @@ -1,3 +1,9 @@ +# seed 1691774489 +# arguments regular medium good fancy +# SST2K version 2.7 +# Test commander destruction and supernova alert +# recorded by esr@snark.thyrsus.com on Fri Aug 11 13:31:26 2023 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant f3 Sector h10 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.7 -# Test commander destruction and supernova alert -# recorded by esr@snark.thyrsus.com on Fri Aug 11 13:31:26 2023 -# -m 6 4 +COMMAND> m 6 4 (Manual movement assumed.) Helmsman Sulu- "Aye, Sir." diff --git a/test/test18.chk b/test/test18.chk index 671d05c..ae83379 100644 --- a/test/test18.chk +++ b/test/test18.chk @@ -1,3 +1,9 @@ +# seed 1691786582 +# arguments regular medium good fancy +# SST2K version 2.7 +# Test behavior when emy is buffered into black hole +# recorded by esr@snark.thyrsus.com on Fri Aug 11 16:43:02 2023 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant a6 Sector i5 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.7 -# Test behavior when emy is buffered into black hole -# recorded by esr@snark.thyrsus.com on Fri Aug 11 16:43:02 2023 -# -chart +COMMAND> chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 a | ... ... ... ... ..4 <..7> ..5 ... | diff --git a/test/test19.chk b/test/test19.chk index f9e72fc..bb6edfa 100644 --- a/test/test19.chk +++ b/test/test19.chk @@ -1,12 +1,14 @@ +# seed 1692088612 +# arguments regular medium novice plain +# SST2K version 2.7 +# Test plain interface and old-fashioned coordinates +# recorded by esr@snark.thyrsus.com on Tue Aug 15 04:36:52 2023 +# -SUPER- STAR TREK -Please type in a secret password- # SST2K version 2.7 -# Test plain interface and old-fashioned coordinates -# recorded by esr@snark.thyrsus.com on Tue Aug 15 04:36:52 2023 -# -foo +Please type in a secret password- foo It is stardate 4349. The Federation is being attacked by diff --git a/test/test20.chk b/test/test20.chk index 2452266..8f599d3 100644 --- a/test/test20.chk +++ b/test/test20.chk @@ -1,3 +1,9 @@ +# seed 1692093194 +# arguments regular medium novice fancy +# SST2K version 2.7 +# Test self-destruct +# recorded by esr@snark.thyrsus.com on Tue Aug 15 05:53:14 2023 +# -SUPER- STAR TREK @@ -17,11 +23,7 @@ Starbase locations- e2 b5 g3 b3 The Enterprise is currently in Quadrant h8 Sector c8 Good Luck! -COMMAND> # SST2K version 2.7 -# Test self-destruct -# recorded by esr@snark.thyrsus.com on Tue Aug 15 05:53:14 2023 -# -destruct +COMMAND> destruct ---WORKING--- SELF-DESTRUCT-SEQUENCE-ACTIVATED 10 diff --git a/test/test21.chk b/test/test21.chk index 2b2176f..6dd69e3 100644 --- a/test/test21.chk +++ b/test/test21.chk @@ -1,3 +1,9 @@ +# seed 1692093957 +# arguments regular medium novice fancy +# SST2K version 2.7 +# Test edge and failure cases in coordinate parsing +# recorded by esr@snark.thyrsus.com on Tue Aug 15 06:05:57 2023 +# -SUPER- STAR TREK @@ -17,11 +23,7 @@ Starbase locations- b1 b5 The Enterprise is currently in Quadrant b6 Sector c3 Good Luck! -COMMAND> # SST2K version 2.7 -# Test edge and failure cases in coordinate parsing -# recorded by esr@snark.thyrsus.com on Tue Aug 15 06:05:57 2023 -# -sr +COMMAND> sr Short-range scan 1 2 3 4 5 6 7 8 9 10 a . . . . . . . . . . diff --git a/test/test22.chk b/test/test22.chk index 662fcf0..f7bf37f 100644 --- a/test/test22.chk +++ b/test/test22.chk @@ -1,3 +1,9 @@ +# seed 1692177511 +# arguments regular medium novice fancy +# SST2K version 2.7 +# Test torpedoing uninhabited planet +# recorded by esr@snark.thyrsus.com on Wed Aug 16 05:18:31 2023 +# -SUPER- STAR TREK @@ -17,11 +23,7 @@ Starbase locations- d2 h1 The Enterprise is currently in Quadrant e4 Sector c9 Good Luck! -COMMAND> # SST2K version 2.7 -# Test torpedoing uninhabited planet -# recorded by esr@snark.thyrsus.com on Wed Aug 16 05:18:31 2023 -# -m a i9 +COMMAND> m a i9 COMMAND> torpedo 1 i5 diff --git a/test/test23.chk b/test/test23.chk index 25999d6..97c36de 100644 --- a/test/test23.chk +++ b/test/test23.chk @@ -1,3 +1,9 @@ +# seed 1692177676 +# arguments regular medium novice fancy +# SST2K version 2.7 +# Test torpedoing inhabited planet and starbase +# recorded by esr@snark.thyrsus.com on Wed Aug 16 05:21:16 2023 +# -SUPER- STAR TREK @@ -17,11 +23,7 @@ Starbase locations- g2 b2 b3 The Enterprise is currently in Quadrant b2 Sector e9 Good Luck! -COMMAND> # SST2K version 2.7 -# Test torpedoing inhabited planet and starbase -# recorded by esr@snark.thyrsus.com on Wed Aug 16 05:21:16 2023 -# -m a c0 +COMMAND> m a c0 Beg your pardon, Captain? COMMAND> m a c9 diff --git a/test/test24.chk b/test/test24.chk index 8df78bd..9a88b8b 100644 --- a/test/test24.chk +++ b/test/test24.chk @@ -1,3 +1,9 @@ +# seed 1692177875 +# arguments regular medium novice fancy +# SST2K version 2.7 +# Test cloaking device with no enemies present +# recorded by esr@snark.thyrsus.com on Wed Aug 16 05:24:35 2023 +# -SUPER- STAR TREK @@ -17,11 +23,7 @@ Starbase locations- g4 f3 d7 The Enterprise is currently in Quadrant h6 Sector a6 Good Luck! -COMMAND> # SST2K version 2.7 -# Test cloaking device with no enemies present -# recorded by esr@snark.thyrsus.com on Wed Aug 16 05:24:35 2023 -# -cloak +COMMAND> cloak Switch cloaking device on? y Spock- "Captain, using the cloaking device is a violation of the Treaty of Algeron. Considering the alternatives, diff --git a/test/test25.chk b/test/test25.chk index b3dffd0..6b5857e 100644 --- a/test/test25.chk +++ b/test/test25.chk @@ -1,3 +1,9 @@ +# seed 1692263971 +# arguments regular medium expert fancy +# SST2K version 2.7 +# Test death ray (successful) +# recorded by esr@snark.thyrsus.com on Thu Aug 17 05:19:31 2023 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant g7 Sector e6 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.7 -# Test death ray (successful) -# recorded by esr@snark.thyrsus.com on Thu Aug 17 05:19:31 2023 -# -deathray +COMMAND> deathray Spock- "Captain, the 'Experimental Death Ray' is highly unpredictible. Considering the alternatives, diff --git a/test/test26.chk b/test/test26.chk index 5cb2793..ce637f8 100644 --- a/test/test26.chk +++ b/test/test26.chk @@ -1,3 +1,9 @@ +# seed 1692178191 +# arguments regular medium novice fancy +# SST2K version 2.7 +# Test damage-report command (no damage) +# recorded by esr@snark.thyrsus.com on Wed Aug 16 05:29:51 2023 +# -SUPER- STAR TREK @@ -17,11 +23,7 @@ Starbase locations- g4 g7 The Enterprise is currently in Quadrant c1 Sector g6 Good Luck! -COMMAND> # SST2K version 2.7 -# Test damage-report command (no damage) -# recorded by esr@snark.thyrsus.com on Wed Aug 16 05:29:51 2023 -# -damage +COMMAND> damage All devices functional. COMMAND> quit diff --git a/test/test27.chk b/test/test27.chk index 3c170e9..bf76118 100644 --- a/test/test27.chk +++ b/test/test27.chk @@ -1,3 +1,9 @@ +# seed 1692178540 +# arguments regular medium novice fancy +# SST2K version 2.7 +# Test simple collision and damage treport. +# recorded by esr@snark.thyrsus.com on Wed Aug 16 05:35:40 2023 +# -SUPER- STAR TREK @@ -23,11 +29,7 @@ LT. Uhura- "Captain, an urgent message. INTRUDER! YOU HAVE VIOLATED THE ROMULAN NEUTRAL ZONE. LEAVE AT ONCE, OR YOU WILL BE DESTROYED! -COMMAND> # SST2K version 2.7 -# Test simple collision and damage treport. -# recorded by esr@snark.thyrsus.com on Wed Aug 16 05:35:40 2023 -# -m a j7 +COMMAND> m a j7 ***RED ALERT! RED ALERT! ***COLLISION IMMINENT. diff --git a/test/test28.chk b/test/test28.chk index a2fb54b..0d28e05 100644 --- a/test/test28.chk +++ b/test/test28.chk @@ -1,3 +1,9 @@ +# seed 1692187822 +# arguments regular medium novice fancy +# SST2K version 2.7 +# Test encounter with Space Thingy and torperdoing it +# recorded by esr@snark.thyrsus.com on Wed Aug 16 08:28:50 2023 +# -SUPER- STAR TREK @@ -17,11 +23,7 @@ Starbase locations- f1 g6 e2 a1 a8 The Enterprise is currently in Quadrant d6 Sector h8 Good Luck! -COMMAND> # SST2K version 2.7 -# Test encounter with Space Thingy and torperdoing it -# recorded by esr@snark.thyrsus.com on Wed Aug 16 08:28:50 2023 -# -m a e8 +COMMAND> m a e8 COMMAND> m a a1 diff --git a/test/test29.chk b/test/test29.chk index 0cc33c0..13bb8af 100644 --- a/test/test29.chk +++ b/test/test29.chk @@ -1,3 +1,9 @@ +# seed 1692210781 +# arguments regular medium expert fancy +# SST2K version 2.7 +# Test capture - trdsuccessful +# recorded by esr@snark.thyrsus.com on Wed Aug 16 14:33:01 2023 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant a2 Sector c10 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.7 -# Test capture - trdsuccessful -# recorded by esr@snark.thyrsus.com on Wed Aug 16 14:33:01 2023 -# -phasers +COMMAND> phasers Weapons Officer Sulu- "High-speed shield control enabled, sir." Manual or automatic? a diff --git a/test/test30.chk b/test/test30.chk index 0e9fbc3..cefd344 100644 --- a/test/test30.chk +++ b/test/test30.chk @@ -1,3 +1,9 @@ +# seed 1692212577 +# arguments regular medium expert fancy +# SST2K version 2.7 +# Test death ray - failure (kaboom) +# recorded by esr@snark.thyrsus.com on Wed Aug 16 15:02:57 2023 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant d2 Sector h6 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.7 -# Test death ray - failure (kaboom) -# recorded by esr@snark.thyrsus.com on Wed Aug 16 15:02:57 2023 -# -chart +COMMAND> chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 a | .1. ... ... ... ... ... ... ... | diff --git a/test/test31.chk b/test/test31.chk index 2219c49..08b1224 100644 --- a/test/test31.chk +++ b/test/test31.chk @@ -1,3 +1,9 @@ +# seed 1692263709 +# arguments regular medium expert fancy +# SST2K version 2.7 +# Test death ray - fail (mutation) +# recorded by esr@snark.thyrsus.com on Thu Aug 17 05:15:09 2023 +# -SUPER- STAR TREK @@ -16,11 +22,7 @@ The Enterprise is currently in Quadrant f1 Sector f6 Good Luck! YOU'LL NEED IT. -COMMAND> # SST2K version 2.7 -# Test death ray - fail (mutation) -# recorded by esr@snark.thyrsus.com on Thu Aug 17 05:15:09 2023 -# -deathray +COMMAND> deathray Spock- "Captain, the 'Experimental Death Ray' is highly unpredictible. Considering the alternatives, -- 2.31.1 From 92cd25a65b409716b20b5ba0c6697520c3c7b1fe Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Fri, 18 Aug 2023 15:11:15 -0400 Subject: [PATCH 04/16] Refactor choose parsing so modifying it won't be horrible. --- sst | 131 ++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 69 insertions(+), 62 deletions(-) diff --git a/sst b/sst index db52bfe..b02bc03 100755 --- a/sst +++ b/sst @@ -4184,7 +4184,7 @@ def impulse(): return def warp(wcourse, involuntary): - "ove under warp drive." + "Move under warp drive." blooey = False; twarp = False if not involuntary: # Not WARPX entry game.ididit = False @@ -5981,28 +5981,45 @@ def setup(): def choose(): "Choose your game type." - while True: - game.tourn = None - game.length = 0 - game.thawed = False - game.skill = SKILL_NONE - # Do not chew here, we want to use command-line tokens - if not scanner.inqueue: # Can start with command line options - proutn(_("Would you like a regular, tournament, or saved game? ")) + game.tourn = None + game.length = 0 + game.thawed = False + game.skill = SKILL_NONE + gametype = None + mode = None + while gametype is None or game.length == 0 or game.skill == SKILL_NONE or mode is None: + eol_is_fancy = False + if not scanner.inqueue or scanner.token == "IHEOL": # Can start with command line options + if gametype is None: + proutn(_("Would you like a regular, tournament, or saved game? ")) + elif game.length==0: + proutn(_("Would you like a Short, Medium, or Long game? ")) + elif game.skill == SKILL_NONE: + proutn(_("Are you a Novice, Fair, Good, Expert, or Emeritus player? ")) + elif mode is None: + proutn(_("Choose your game style (plain, almy, fancy or just press enter): ")) + eol_is_fancy = True scanner.nexttok() - if scanner.sees("tournament"): + if game.idebug: + prout("-- Token: %s=%s" % (scanner.type, repr(scanner.token))) + if scanner.token == "": + raise SystemExit(0) # Early end of replay + if scanner.token.startswith("r"): # regular + gametype = "regular" + elif scanner.token.startswith("t"): + gametype = "tournament" + proutn(_("Type in tournament number-")) game.tourn = 0 while scanner.nexttok() == "IHEOL": - proutn(_("Type in tournament number-")) - if scanner.real == 0: - scanner.chew() - continue # We don't want a blank entry + if scanner.real == 0: + scanner.chew() + continue # We don't want a blank entry game.tourn = int(round(scanner.real)) rnd.seed(scanner.real) if logfp: logfp.write("# rnd.seed(%d)\n" % scanner.real) - break - if scanner.sees("saved") or scanner.sees("frozen"): + elif scanner.token.startswith("sa") or scanner.token.startswith("fr"): # saved or frozen + gametype = "saved" if thaw(): continue scanner.chew() @@ -6013,57 +6030,47 @@ def choose(): report() waitfor() return True - if scanner.sees("regular"): - break - proutn(_("What game type is \"%s\"? ") % scanner.token) - scanner.chew() - while game.length==0 or game.skill==SKILL_NONE: - if scanner.nexttok() == "IHALPHA": - if scanner.sees("short"): - game.length = 1 - elif scanner.sees("medium"): - game.length = 2 - elif scanner.sees("long"): - game.length = 4 - elif scanner.sees("novice"): - game.skill = SKILL_NOVICE - elif scanner.sees("fair"): - game.skill = SKILL_FAIR - elif scanner.sees("good"): - game.skill = SKILL_GOOD - elif scanner.sees("expert"): - game.skill = SKILL_EXPERT - elif scanner.sees("emeritus"): - game.skill = SKILL_EMERITUS - else: - proutn(_("What skill level is is \"")) - proutn(scanner.token) - prout("\"?") + elif scanner.token.startswith("s"): # short + game.length = 1 + elif scanner.token.startswith("m"): # medium + game.length = 2 + elif scanner.token.startswith("l"): # long + game.length = 4 + elif scanner.token.startswith("n"): # novice + game.skill = SKILL_NOVICE + elif (game.skill is None) and scanner.token.startswith("f"): # fair + game.skill = SKILL_FAIR + elif scanner.token.startswith("g"): # good + game.skill = SKILL_GOOD + elif scanner.token.startswith("e"): # expert + game.skill = SKILL_EXPERT + elif scanner.token.startswith("em"): # emeritus + game.skill = SKILL_EMERITUS + elif scanner.token.startswith("p"): # plain + # Approximates the UT FORTRAN version. + game.options &=~ (OPTION_THOLIAN | OPTION_PLANETS | OPTION_PROBE | OPTION_RAMMING | OPTION_MVBADDY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_CAPTURE | OPTION_CLOAK | OPTION_ALMY | OPTION_AUTOPASS | OPTION_DOTFILL | OPTION_ALPHAMERIC) + mode = "plain" + elif scanner.token.startswith("almy"): # almy + # Approximates Tom Almy's version. + mode = "almy" + game.options &=~ (OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_DOTFILL | OPTION_ALPHAMERIC) + elif scanner.token.startswith("f"): # fancy + mode = "fancy" + elif (eol_is_fancy and scanner.token.startswith("\n")): + mode = "fancy" + elif scanner.token.startswith("\n"): + continue + elif scanner.token.startswith("idebug"): + game.idebug = True else: - scanner.chew() - if game.length==0: - proutn(_("Would you like a Short, Medium, or Long game? ")) - elif game.skill == SKILL_NONE: - proutn(_("Are you a Novice, Fair, Good, Expert, or Emeritus player? ")) - # Choose game options -- added by ESR for SST2K - if scanner.nexttok() != "IHALPHA": - scanner.chew() - proutn(_("Choose your game style (plain, almy, fancy or just press enter): ")) - scanner.nexttok() - if scanner.sees("plain"): - # Approximates the UT FORTRAN version. - game.options &=~ (OPTION_THOLIAN | OPTION_PLANETS | OPTION_PROBE | OPTION_RAMMING | OPTION_MVBADDY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_CAPTURE | OPTION_CLOAK | OPTION_ALMY | OPTION_AUTOPASS | OPTION_DOTFILL | OPTION_ALPHAMERIC) - elif scanner.sees("almy"): - # Approximates Tom Almy's version. - game.options &=~ (OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_DOTFILL | OPTION_ALPHAMERIC) - elif scanner.sees("fancy") or scanner.sees("\n"): - pass - elif len(scanner.token): - proutn(_("What game style is \"%s\"?") % scanner.token) + # Unrecognized token + prout(_("Can't interpret %s") % repr(scanner.token)) setpassword() if game.passwd == "debug": # pragma: no cover game.idebug = True prout("=== Debug mode enabled.") + if game.idebug: + prout("--- Setup: type=%s length=%s skill=%s mode=%s" % (gametype, game.length, game.skill, mode)) # Use parameters to generate initial values of things game.damfac = 0.5 * game.skill game.inbase = rnd.integer(BASEMIN, BASEMAX+1) -- 2.31.1 From 3ee3175eb21f0f72fcf9044eed47a6786a32b1e4 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Fri, 18 Aug 2023 16:14:51 -0400 Subject: [PATCH 05/16] Implement wayback machine (not yet complete or documented), --- sst | 30 ++++++++++++++---------------- test/test01.chk | 2 +- test/test01.log | 3 +-- test/test02.chk | 2 +- test/test02.log | 2 +- test/test03.chk | 2 +- test/test03.log | 2 +- test/test04.chk | 2 +- test/test04.log | 2 +- test/test05.chk | 2 +- test/test05.log | 2 +- test/test06.chk | 2 +- test/test06.log | 2 +- test/test07.chk | 2 +- test/test07.log | 2 +- test/test08.chk | 2 +- test/test08.log | 2 +- test/test09.chk | 2 +- test/test09.log | 2 +- test/test10.chk | 2 +- test/test10.log | 2 +- test/test11.chk | 2 +- test/test11.log | 2 +- test/test12.chk | 2 +- test/test12.log | 2 +- test/test13.chk | 2 +- test/test13.log | 2 +- test/test14.chk | 2 +- test/test14.log | 2 +- test/test15.chk | 2 +- test/test15.log | 2 +- test/test16.chk | 2 +- test/test16.log | 2 +- test/test17.chk | 2 +- test/test17.log | 2 +- test/test18.chk | 2 +- test/test18.log | 2 +- test/test19.chk | 4 ++-- test/test19.log | 4 ++-- test/test20.chk | 2 +- test/test20.log | 2 +- test/test21.chk | 2 +- test/test21.log | 2 +- test/test22.chk | 2 +- test/test22.log | 2 +- test/test23.chk | 2 +- test/test23.log | 2 +- test/test24.chk | 2 +- test/test24.log | 2 +- test/test25.chk | 2 +- test/test25.log | 2 +- test/test26.chk | 2 +- test/test26.log | 2 +- test/test27.chk | 2 +- test/test27.log | 2 +- test/test28.chk | 2 +- test/test28.log | 2 +- test/test29.chk | 2 +- test/test29.log | 2 +- test/test30.chk | 2 +- test/test30.log | 2 +- test/test31.chk | 2 +- test/test31.log | 2 +- 63 files changed, 78 insertions(+), 81 deletions(-) diff --git a/sst b/sst index b02bc03..3460503 100755 --- a/sst +++ b/sst @@ -5986,8 +5986,8 @@ def choose(): game.thawed = False game.skill = SKILL_NONE gametype = None - mode = None - while gametype is None or game.length == 0 or game.skill == SKILL_NONE or mode is None: + wayback = 0 + while gametype is None or game.length == 0 or game.skill == SKILL_NONE or wayback == 0: eol_is_fancy = False if not scanner.inqueue or scanner.token == "IHEOL": # Can start with command line options if gametype is None: @@ -5996,8 +5996,8 @@ def choose(): proutn(_("Would you like a Short, Medium, or Long game? ")) elif game.skill == SKILL_NONE: proutn(_("Are you a Novice, Fair, Good, Expert, or Emeritus player? ")) - elif mode is None: - proutn(_("Choose your game style (plain, almy, fancy or just press enter): ")) + elif wayback == 0: + proutn(_("Wayback setting (press enter for current year): ")) eol_is_fancy = True scanner.nexttok() if game.idebug: @@ -6046,18 +6046,16 @@ def choose(): game.skill = SKILL_EXPERT elif scanner.token.startswith("em"): # emeritus game.skill = SKILL_EMERITUS - elif scanner.token.startswith("p"): # plain - # Approximates the UT FORTRAN version. - game.options &=~ (OPTION_THOLIAN | OPTION_PLANETS | OPTION_PROBE | OPTION_RAMMING | OPTION_MVBADDY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_CAPTURE | OPTION_CLOAK | OPTION_ALMY | OPTION_AUTOPASS | OPTION_DOTFILL | OPTION_ALPHAMERIC) - mode = "plain" - elif scanner.token.startswith("almy"): # almy - # Approximates Tom Almy's version. - mode = "almy" - game.options &=~ (OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_DOTFILL | OPTION_ALPHAMERIC) - elif scanner.token.startswith("f"): # fancy - mode = "fancy" + elif scanner.type == "IHREAL": + wayback = scanner.int() + if wayback <= 1973: + # Approximates the UT FORTRAN version. + game.options &=~ (OPTION_THOLIAN | OPTION_PLANETS | OPTION_PROBE | OPTION_RAMMING | OPTION_MVBADDY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_CAPTURE | OPTION_CLOAK | OPTION_ALMY | OPTION_AUTOPASS | OPTION_DOTFILL | OPTION_ALPHAMERIC) + elif scanner.int() < 1980: + # Approximates Tom Almy's 1979 version. + game.options &=~ (OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_DOTFILL | OPTION_ALPHAMERIC) elif (eol_is_fancy and scanner.token.startswith("\n")): - mode = "fancy" + wayback = time.localtime().tm_year elif scanner.token.startswith("\n"): continue elif scanner.token.startswith("idebug"): @@ -6070,7 +6068,7 @@ def choose(): game.idebug = True prout("=== Debug mode enabled.") if game.idebug: - prout("--- Setup: type=%s length=%s skill=%s mode=%s" % (gametype, game.length, game.skill, mode)) + prout("--- Setup: type=%s length=%s skill=%s wayback=%s" % (gametype, game.length, game.skill, wayback)) # Use parameters to generate initial values of things game.damfac = 0.5 * game.skill game.inbase = rnd.integer(BASEMIN, BASEMAX+1) diff --git a/test/test01.chk b/test/test01.chk index 4407a21..a2c4e5c 100644 --- a/test/test01.chk +++ b/test/test01.chk @@ -11,7 +11,7 @@ Would you like a regular, tournament, or saved game? r Would you like a Short, Medium, or Long game? s Are you a Novice, Fair, Good, Expert, or Emeritus player? g -Choose your game style (plain, almy, fancy or just press enter): f +Wayback setting (press enter for current year): 2023 Stardate 3188. diff --git a/test/test01.log b/test/test01.log index f72bcd9..76f47f4 100644 --- a/test/test01.log +++ b/test/test01.log @@ -7,7 +7,6 @@ r s g -f +2023 chart quit -n diff --git a/test/test02.chk b/test/test02.chk index a16b9f8..dd2ac3f 100644 --- a/test/test02.chk +++ b/test/test02.chk @@ -1,5 +1,5 @@ # seed 1556101787 -# arguments regular short good fancy +# arguments regular short good 2023 # SST2K version 2.4 # Test critical hit on sensors # recorded by esr@snark.thyrsus.com on Wed Apr 24 06:29:47 2019 diff --git a/test/test02.log b/test/test02.log index 786d121..6d0bb84 100644 --- a/test/test02.log +++ b/test/test02.log @@ -1,5 +1,5 @@ # seed 1556101787 -# arguments regular short good fancy +# arguments regular short good 2023 # SST2K version 2.4 # Test critical hit on sensors # recorded by esr@snark.thyrsus.com on Wed Apr 24 06:29:47 2019 diff --git a/test/test03.chk b/test/test03.chk index 9c683e4..86eed5e 100644 --- a/test/test03.chk +++ b/test/test03.chk @@ -1,5 +1,5 @@ # seed 1556102474 -# arguments regular short good fancy +# arguments regular short good 2023 # SST2K version 2.4 # Test Tholian boxing us in followed by death by tractor beam # recorded by esr@snark.thyrsus.com on Wed Apr 24 09:48:31 2019 diff --git a/test/test03.log b/test/test03.log index 6ce4f55..47db407 100644 --- a/test/test03.log +++ b/test/test03.log @@ -1,5 +1,5 @@ # seed 1556102474 -# arguments regular short good fancy +# arguments regular short good 2023 # SST2K version 2.4 # Test Tholian boxing us in followed by death by tractor beam # recorded by esr@snark.thyrsus.com on Wed Apr 24 09:48:31 2019 diff --git a/test/test04.chk b/test/test04.chk index 8440814..7296079 100644 --- a/test/test04.chk +++ b/test/test04.chk @@ -1,5 +1,5 @@ # seed 1556116333 -# arguments regular short good fancy +# arguments regular short good 2023 # SST2K version 2.4 # Test starbase destruction, planet destruction, docking after destruction. # recorded by esr@snark.thyrsus.com on Fri Aug 11 08:59:1 3 2023 diff --git a/test/test04.log b/test/test04.log index 5d8111f..cdededd 100644 --- a/test/test04.log +++ b/test/test04.log @@ -1,5 +1,5 @@ # seed 1556116333 -# arguments regular short good fancy +# arguments regular short good 2023 # SST2K version 2.4 # Test starbase destruction, planet destruction, docking after destruction. # recorded by esr@snark.thyrsus.com on Fri Aug 11 08:59:1 3 2023 diff --git a/test/test05.chk b/test/test05.chk index f9cad8f..779f4b4 100644 --- a/test/test05.chk +++ b/test/test05.chk @@ -1,5 +1,5 @@ # seed 1556120044 -# arguments regular short good fancy +# arguments regular short good 2023 # Test deep-space probes # recorded by esr@snark.thyrsus.com on Wed Apr 24 11:34:04 2019 # diff --git a/test/test05.log b/test/test05.log index e7ce90d..3497245 100644 --- a/test/test05.log +++ b/test/test05.log @@ -1,5 +1,5 @@ # seed 1556120044 -# arguments regular short good fancy +# arguments regular short good 2023 # Test deep-space probes # recorded by esr@snark.thyrsus.com on Wed Apr 24 11:34:04 2019 # diff --git a/test/test06.chk b/test/test06.chk index fa4d40e..1dd3d30 100644 --- a/test/test06.chk +++ b/test/test06.chk @@ -1,5 +1,5 @@ # seed 1556121767 -# arguments regular short good fancy +# arguments regular short good 2023 # SST2K version 2.4 # Test shuttle landing with no crystals # recorded by esr@snark.thyrsus.com on Wed Apr 24 12:02:47 2019 diff --git a/test/test06.log b/test/test06.log index 31d290d..0576598 100644 --- a/test/test06.log +++ b/test/test06.log @@ -1,5 +1,5 @@ # seed 1556121767 -# arguments regular short good fancy +# arguments regular short good 2023 # SST2K version 2.4 # Test shuttle landing with no crystals # recorded by esr@snark.thyrsus.com on Wed Apr 24 12:02:47 2019 diff --git a/test/test07.chk b/test/test07.chk index 5c84369..e0ab438 100644 --- a/test/test07.chk +++ b/test/test07.chk @@ -1,5 +1,5 @@ # seed 1691789031 -# arguments regular medium good fancy +# arguments regular medium good 2023 # SST2K version 2.7 # Test supercommander destruction. # recorded by esr@snark.thyrsus.com on Fri Aug 11 17:23:51 2023 diff --git a/test/test07.log b/test/test07.log index a455067..eee5561 100644 --- a/test/test07.log +++ b/test/test07.log @@ -1,5 +1,5 @@ # seed 1691789031 -# arguments regular medium good fancy +# arguments regular medium good 2023 # SST2K version 2.7 # Test supercommander destruction. # recorded by esr@snark.thyrsus.com on Fri Aug 11 17:23:51 2023 diff --git a/test/test08.chk b/test/test08.chk index 0c3e673..e9f3f4d 100644 --- a/test/test08.chk +++ b/test/test08.chk @@ -1,5 +1,5 @@ # seed 1691831923 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test game-win condition # recorded by esr@snark.thyrsus.com on Sat Aug 12 05:18:43 2023 diff --git a/test/test08.log b/test/test08.log index 0f0e6e1..6ff36f9 100644 --- a/test/test08.log +++ b/test/test08.log @@ -1,5 +1,5 @@ # seed 1691831923 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test game-win condition # recorded by esr@snark.thyrsus.com on Sat Aug 12 05:18:43 2023 diff --git a/test/test09.chk b/test/test09.chk index 712a732..66349ea 100644 --- a/test/test09.chk +++ b/test/test09.chk @@ -1,5 +1,5 @@ # seed 1691779887 -# arguments regular medium good fancy +# arguments regular medium good 2023 # SST2K version 2.7 # Test behavior of Tholian # recorded by esr@snark.thyrsus.com on Fri Aug 11 14:51:27 2023 diff --git a/test/test09.log b/test/test09.log index d162284..8438ace 100644 --- a/test/test09.log +++ b/test/test09.log @@ -1,5 +1,5 @@ # seed 1691779887 -# arguments regular medium good fancy +# arguments regular medium good 2023 # SST2K version 2.7 # Test behavior of Tholian # recorded by esr@snark.thyrsus.com on Fri Aug 11 14:51:27 2023 diff --git a/test/test10.chk b/test/test10.chk index 1c90286..70d0027 100644 --- a/test/test10.chk +++ b/test/test10.chk @@ -1,5 +1,5 @@ # seed 1691834337 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test game timeout condition # recorded by esr@snark.thyrsus.com on Sat Aug 12 05:58:57 2023 diff --git a/test/test10.log b/test/test10.log index 416cc35..7eef455 100644 --- a/test/test10.log +++ b/test/test10.log @@ -1,5 +1,5 @@ # seed 1691834337 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test game timeout condition # recorded by esr@snark.thyrsus.com on Sat Aug 12 05:58:57 2023 diff --git a/test/test11.chk b/test/test11.chk index 716041a..85b1949 100644 --- a/test/test11.chk +++ b/test/test11.chk @@ -1,5 +1,5 @@ # seed 1556212919 -# arguments regular short good fancy +# arguments regular short good 2023 # SST2K version 2.5 # Test loss by energy exhaustion. # recorded by esr@snark.thyrsus.com on Thu Apr 25 13:21:59 2019 diff --git a/test/test11.log b/test/test11.log index b158c1a..fef6d62 100644 --- a/test/test11.log +++ b/test/test11.log @@ -1,5 +1,5 @@ # seed 1556212919 -# arguments regular short good fancy +# arguments regular short good 2023 # SST2K version 2.5 # Test loss by energy exhaustion. # recorded by esr@snark.thyrsus.com on Thu Apr 25 13:21:59 2019 diff --git a/test/test12.chk b/test/test12.chk index 85b11f7..48d6620 100644 --- a/test/test12.chk +++ b/test/test12.chk @@ -1,5 +1,5 @@ # seed 1691778615 -# arguments regular medium good fancy +# arguments regular medium good 2023 # SST2K version 2.7 # Test dilithium mining # recorded by esr@snark.thyrsus.com on Fri Aug 11 14:30:15 2023 diff --git a/test/test12.log b/test/test12.log index 3ed5c87..e811ce5 100644 --- a/test/test12.log +++ b/test/test12.log @@ -1,5 +1,5 @@ # seed 1691778615 -# arguments regular medium good fancy +# arguments regular medium good 2023 # SST2K version 2.7 # Test dilithium mining # recorded by esr@snark.thyrsus.com on Fri Aug 11 14:30:15 2023 diff --git a/test/test13.chk b/test/test13.chk index e5374b4..98d5ca6 100644 --- a/test/test13.chk +++ b/test/test13.chk @@ -1,5 +1,5 @@ # seed 1556292107 -# arguments regular short good fancy +# arguments regular short good 2023 # SST2K version 2.5 # Test multiple critical hits ending in defeat by Supercommander # recorded by esr@snark.thyrsus.com on Fri Apr 26 11:21:47 2019 diff --git a/test/test13.log b/test/test13.log index 5fecaf7..256d511 100644 --- a/test/test13.log +++ b/test/test13.log @@ -1,5 +1,5 @@ # seed 1556292107 -# arguments regular short good fancy +# arguments regular short good 2023 # SST2K version 2.5 # Test multiple critical hits ending in defeat by Supercommander # recorded by esr@snark.thyrsus.com on Fri Apr 26 11:21:47 2019 diff --git a/test/test14.chk b/test/test14.chk index 0ee7bdc..50544e3 100644 --- a/test/test14.chk +++ b/test/test14.chk @@ -11,7 +11,7 @@ Would you like a regular, tournament, or saved game? r Would you like a Short, Medium, or Long game? s Are you a Novice, Fair, Good, Expert, or Emeritus player? n -Choose your game style (plain, almy, fancy or just press enter): fancy +Wayback setting (press enter for current year): 2023 It is stardate 3221. The Federation is being attacked by diff --git a/test/test14.log b/test/test14.log index 46a417e..e2cdd71 100644 --- a/test/test14.log +++ b/test/test14.log @@ -7,7 +7,7 @@ r s n -fancy +2023 lrscan srscan move diff --git a/test/test15.chk b/test/test15.chk index 220c0b6..d12b3b6 100644 --- a/test/test15.chk +++ b/test/test15.chk @@ -1,5 +1,5 @@ # seed 1691766356 -# arguments regular medium good fancy +# arguments regular medium good 2023 # SST2K version 2.7 # Test encounter with Romulan and multiline torpedo firing # recorded by esr@snark.thyrsus.com on Fri Aug 11 11:05:56 2023 diff --git a/test/test15.log b/test/test15.log index 8f4c60c..d533253 100644 --- a/test/test15.log +++ b/test/test15.log @@ -1,5 +1,5 @@ # seed 1691766356 -# arguments regular medium good fancy +# arguments regular medium good 2023 # SST2K version 2.7 # Test encounter with Romulan and multiline torpedo firing # recorded by esr@snark.thyrsus.com on Fri Aug 11 11:05:56 2023 diff --git a/test/test16.chk b/test/test16.chk index 68a4f6b..1880db7 100644 --- a/test/test16.chk +++ b/test/test16.chk @@ -1,5 +1,5 @@ # seed 1691769251 -# arguments regular medium good fancy +# arguments regular medium good 2023 # SST2K version 2.7 # Test malformed torpedo command # recorded by esr@snark.thyrsus.com on Fri Aug 11 11:54:11 2023 diff --git a/test/test16.log b/test/test16.log index c2d7f4d..4333957 100644 --- a/test/test16.log +++ b/test/test16.log @@ -1,5 +1,5 @@ # seed 1691769251 -# arguments regular medium good fancy +# arguments regular medium good 2023 # SST2K version 2.7 # Test malformed torpedo command # recorded by esr@snark.thyrsus.com on Fri Aug 11 11:54:11 2023 diff --git a/test/test17.chk b/test/test17.chk index 10a5406..63d0d54 100644 --- a/test/test17.chk +++ b/test/test17.chk @@ -1,5 +1,5 @@ # seed 1691774489 -# arguments regular medium good fancy +# arguments regular medium good 2023 # SST2K version 2.7 # Test commander destruction and supernova alert # recorded by esr@snark.thyrsus.com on Fri Aug 11 13:31:26 2023 diff --git a/test/test17.log b/test/test17.log index 6768ecd..cab0e91 100644 --- a/test/test17.log +++ b/test/test17.log @@ -1,5 +1,5 @@ # seed 1691774489 -# arguments regular medium good fancy +# arguments regular medium good 2023 # SST2K version 2.7 # Test commander destruction and supernova alert # recorded by esr@snark.thyrsus.com on Fri Aug 11 13:31:26 2023 diff --git a/test/test18.chk b/test/test18.chk index ae83379..cec7498 100644 --- a/test/test18.chk +++ b/test/test18.chk @@ -1,5 +1,5 @@ # seed 1691786582 -# arguments regular medium good fancy +# arguments regular medium good 2023 # SST2K version 2.7 # Test behavior when emy is buffered into black hole # recorded by esr@snark.thyrsus.com on Fri Aug 11 16:43:02 2023 diff --git a/test/test18.log b/test/test18.log index 9d11e50..67c2925 100644 --- a/test/test18.log +++ b/test/test18.log @@ -1,5 +1,5 @@ # seed 1691786582 -# arguments regular medium good fancy +# arguments regular medium good 2023 # SST2K version 2.7 # Test behavior when emy is buffered into black hole # recorded by esr@snark.thyrsus.com on Fri Aug 11 16:43:02 2023 diff --git a/test/test19.chk b/test/test19.chk index bb6edfa..75b4186 100644 --- a/test/test19.chk +++ b/test/test19.chk @@ -1,7 +1,7 @@ # seed 1692088612 -# arguments regular medium novice plain +# arguments regular medium novice 1973 # SST2K version 2.7 -# Test plain interface and old-fashioned coordinates +# Test 1973 interface and old-fashioned coordinates # recorded by esr@snark.thyrsus.com on Tue Aug 15 04:36:52 2023 # diff --git a/test/test19.log b/test/test19.log index ff73e57..272e39d 100644 --- a/test/test19.log +++ b/test/test19.log @@ -1,7 +1,7 @@ # seed 1692088612 -# arguments regular medium novice plain +# arguments regular medium novice 1973 # SST2K version 2.7 -# Test plain interface and old-fashioned coordinates +# Test 1973 interface and old-fashioned coordinates # recorded by esr@snark.thyrsus.com on Tue Aug 15 04:36:52 2023 # foo diff --git a/test/test20.chk b/test/test20.chk index 8f599d3..257f656 100644 --- a/test/test20.chk +++ b/test/test20.chk @@ -1,5 +1,5 @@ # seed 1692093194 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test self-destruct # recorded by esr@snark.thyrsus.com on Tue Aug 15 05:53:14 2023 diff --git a/test/test20.log b/test/test20.log index 222d592..2764a2b 100644 --- a/test/test20.log +++ b/test/test20.log @@ -1,5 +1,5 @@ # seed 1692093194 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test self-destruct # recorded by esr@snark.thyrsus.com on Tue Aug 15 05:53:14 2023 diff --git a/test/test21.chk b/test/test21.chk index 6dd69e3..7035a56 100644 --- a/test/test21.chk +++ b/test/test21.chk @@ -1,5 +1,5 @@ # seed 1692093957 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test edge and failure cases in coordinate parsing # recorded by esr@snark.thyrsus.com on Tue Aug 15 06:05:57 2023 diff --git a/test/test21.log b/test/test21.log index 8b5f1cc..d19621e 100644 --- a/test/test21.log +++ b/test/test21.log @@ -1,5 +1,5 @@ # seed 1692093957 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test edge and failure cases in coordinate parsing # recorded by esr@snark.thyrsus.com on Tue Aug 15 06:05:57 2023 diff --git a/test/test22.chk b/test/test22.chk index f7bf37f..7861ca3 100644 --- a/test/test22.chk +++ b/test/test22.chk @@ -1,5 +1,5 @@ # seed 1692177511 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test torpedoing uninhabited planet # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:18:31 2023 diff --git a/test/test22.log b/test/test22.log index a74a8e6..54d6534 100644 --- a/test/test22.log +++ b/test/test22.log @@ -1,5 +1,5 @@ # seed 1692177511 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test torpedoing uninhabited planet # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:18:31 2023 diff --git a/test/test23.chk b/test/test23.chk index 97c36de..1212f1e 100644 --- a/test/test23.chk +++ b/test/test23.chk @@ -1,5 +1,5 @@ # seed 1692177676 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test torpedoing inhabited planet and starbase # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:21:16 2023 diff --git a/test/test23.log b/test/test23.log index e0aa841..0a5a56a 100644 --- a/test/test23.log +++ b/test/test23.log @@ -1,5 +1,5 @@ # seed 1692177676 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test torpedoing inhabited planet and starbase # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:21:16 2023 diff --git a/test/test24.chk b/test/test24.chk index 9a88b8b..5a46a38 100644 --- a/test/test24.chk +++ b/test/test24.chk @@ -1,5 +1,5 @@ # seed 1692177875 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test cloaking device with no enemies present # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:24:35 2023 diff --git a/test/test24.log b/test/test24.log index 52967e4..d1a0fb7 100644 --- a/test/test24.log +++ b/test/test24.log @@ -1,5 +1,5 @@ # seed 1692177875 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test cloaking device with no enemies present # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:24:35 2023 diff --git a/test/test25.chk b/test/test25.chk index 6b5857e..b3f01c9 100644 --- a/test/test25.chk +++ b/test/test25.chk @@ -1,5 +1,5 @@ # seed 1692263971 -# arguments regular medium expert fancy +# arguments regular medium expert 2023 # SST2K version 2.7 # Test death ray (successful) # recorded by esr@snark.thyrsus.com on Thu Aug 17 05:19:31 2023 diff --git a/test/test25.log b/test/test25.log index f3761b7..a529d9d 100644 --- a/test/test25.log +++ b/test/test25.log @@ -1,5 +1,5 @@ # seed 1692263971 -# arguments regular medium expert fancy +# arguments regular medium expert 2023 # SST2K version 2.7 # Test death ray (successful) # recorded by esr@snark.thyrsus.com on Thu Aug 17 05:19:31 2023 diff --git a/test/test26.chk b/test/test26.chk index ce637f8..3049136 100644 --- a/test/test26.chk +++ b/test/test26.chk @@ -1,5 +1,5 @@ # seed 1692178191 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test damage-report command (no damage) # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:29:51 2023 diff --git a/test/test26.log b/test/test26.log index 953cac9..a6e4435 100644 --- a/test/test26.log +++ b/test/test26.log @@ -1,5 +1,5 @@ # seed 1692178191 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test damage-report command (no damage) # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:29:51 2023 diff --git a/test/test27.chk b/test/test27.chk index bf76118..3db0c83 100644 --- a/test/test27.chk +++ b/test/test27.chk @@ -1,5 +1,5 @@ # seed 1692178540 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test simple collision and damage treport. # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:35:40 2023 diff --git a/test/test27.log b/test/test27.log index 31c8676..59526dd 100644 --- a/test/test27.log +++ b/test/test27.log @@ -1,5 +1,5 @@ # seed 1692178540 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test simple collision and damage treport. # recorded by esr@snark.thyrsus.com on Wed Aug 16 05:35:40 2023 diff --git a/test/test28.chk b/test/test28.chk index 0d28e05..cff5792 100644 --- a/test/test28.chk +++ b/test/test28.chk @@ -1,5 +1,5 @@ # seed 1692187822 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test encounter with Space Thingy and torperdoing it # recorded by esr@snark.thyrsus.com on Wed Aug 16 08:28:50 2023 diff --git a/test/test28.log b/test/test28.log index f30887c..246ff28 100644 --- a/test/test28.log +++ b/test/test28.log @@ -1,5 +1,5 @@ # seed 1692187822 -# arguments regular medium novice fancy +# arguments regular medium novice 2023 # SST2K version 2.7 # Test encounter with Space Thingy and torperdoing it # recorded by esr@snark.thyrsus.com on Wed Aug 16 08:28:50 2023 diff --git a/test/test29.chk b/test/test29.chk index 13bb8af..a7b9a76 100644 --- a/test/test29.chk +++ b/test/test29.chk @@ -1,5 +1,5 @@ # seed 1692210781 -# arguments regular medium expert fancy +# arguments regular medium expert 2023 # SST2K version 2.7 # Test capture - trdsuccessful # recorded by esr@snark.thyrsus.com on Wed Aug 16 14:33:01 2023 diff --git a/test/test29.log b/test/test29.log index 36b024d..14aabd3 100644 --- a/test/test29.log +++ b/test/test29.log @@ -1,5 +1,5 @@ # seed 1692210781 -# arguments regular medium expert fancy +# arguments regular medium expert 2023 # SST2K version 2.7 # Test capture - trdsuccessful # recorded by esr@snark.thyrsus.com on Wed Aug 16 14:33:01 2023 diff --git a/test/test30.chk b/test/test30.chk index cefd344..cfebdb7 100644 --- a/test/test30.chk +++ b/test/test30.chk @@ -1,5 +1,5 @@ # seed 1692212577 -# arguments regular medium expert fancy +# arguments regular medium expert 2023 # SST2K version 2.7 # Test death ray - failure (kaboom) # recorded by esr@snark.thyrsus.com on Wed Aug 16 15:02:57 2023 diff --git a/test/test30.log b/test/test30.log index 4b99d23..7e0dbe0 100644 --- a/test/test30.log +++ b/test/test30.log @@ -1,5 +1,5 @@ # seed 1692212577 -# arguments regular medium expert fancy +# arguments regular medium expert 2023 # SST2K version 2.7 # Test death ray - failure (kaboom) # recorded by esr@snark.thyrsus.com on Wed Aug 16 15:02:57 2023 diff --git a/test/test31.chk b/test/test31.chk index 08b1224..7c14efe 100644 --- a/test/test31.chk +++ b/test/test31.chk @@ -1,5 +1,5 @@ # seed 1692263709 -# arguments regular medium expert fancy +# arguments regular medium expert 2023 # SST2K version 2.7 # Test death ray - fail (mutation) # recorded by esr@snark.thyrsus.com on Thu Aug 17 05:15:09 2023 diff --git a/test/test31.log b/test/test31.log index 3294946..f035a46 100644 --- a/test/test31.log +++ b/test/test31.log @@ -1,5 +1,5 @@ # seed 1692263709 -# arguments regular medium expert fancy +# arguments regular medium expert 2023 # SST2K version 2.7 # Test death ray - fail (mutation) # recorded by esr@snark.thyrsus.com on Thu Aug 17 05:15:09 2023 -- 2.31.1 From a60b2c66db2f4fe63992d1e64a0a66ab3bbb2ace Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sat, 19 Aug 2023 07:56:33 -0400 Subject: [PATCH 06/16] Decklare years for options. --- sst | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/sst b/sst index 3460503..b676ffb 100755 --- a/sst +++ b/sst @@ -334,7 +334,26 @@ option_names = { "COLOR": OPTION_COLOR, "DOTFILL": OPTION_DOTFILL, "ALPHAMERIC": OPTION_ALPHAMERIC, - } +} + +option_years = { + OPTION_PLANETS: 1979, + OPTION_PROBE: 1980, + OPTION_SHOWME: 2005, + OPTION_RAMMING: 1979, + OPTION_MVBADDY: 1979, + OPTION_AUTOPASS: 1997, + OPTION_BLKHOLE: 2005, + OPTION_BASE: 2005, + OPTION_WORLDS: 2996, + OPTION_AUTOSCAN: 2006, + OPTION_CAPTURE: 2013, + OPTION_CLOAK: 2013, + OPTION_ALMY: 1997, + OPTION_COLOR: 2010, + OPTION_DOTFILL: 2019, + OPTION_ALPHAMERIC: 2023, +} # Define devices DSRSENS = 0 -- 2.31.1 From fd980fc79a74f392c867f4f3d82bf470cb32a739 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sat, 19 Aug 2023 08:55:25 -0400 Subject: [PATCH 07/16] Full implementation of wayback option. --- sst | 71 +++++++++++++++++-------------------------------- test/test19.chk | 4 +-- 2 files changed, 27 insertions(+), 48 deletions(-) diff --git a/sst b/sst index b676ffb..cee6f46 100755 --- a/sst +++ b/sst @@ -315,44 +315,26 @@ OPTION_DOTFILL = 0x08000000 # fix dotfill glitch in chart (ESR, 2019) OPTION_ALPHAMERIC = 0x10000000 # Alpha Y coordinates (ESR, 2023) option_names = { - "ALL": OPTION_ALL, - "TTY": OPTION_TTY, - "IOMODES": OPTION_IOMODES, - "PLANETS": OPTION_PLANETS, - "PROBE": OPTION_PROBE, - "SHOWME": OPTION_SHOWME, - "RAMMING": OPTION_RAMMING, - "MVBADDY": OPTION_MVBADDY, - "AUTOPASS": OPTION_AUTOPASS, - "BLKHOLE": OPTION_BLKHOLE, - "BASE": OPTION_BASE, - "WORLDS": OPTION_WORLDS, - "AUTOSCAN": OPTION_AUTOSCAN, - "CAPTURE": OPTION_CAPTURE, - "CLOAK": OPTION_CLOAK, - "ALMY": OPTION_ALMY, - "COLOR": OPTION_COLOR, - "DOTFILL": OPTION_DOTFILL, - "ALPHAMERIC": OPTION_ALPHAMERIC, -} - -option_years = { - OPTION_PLANETS: 1979, - OPTION_PROBE: 1980, - OPTION_SHOWME: 2005, - OPTION_RAMMING: 1979, - OPTION_MVBADDY: 1979, - OPTION_AUTOPASS: 1997, - OPTION_BLKHOLE: 2005, - OPTION_BASE: 2005, - OPTION_WORLDS: 2996, - OPTION_AUTOSCAN: 2006, - OPTION_CAPTURE: 2013, - OPTION_CLOAK: 2013, - OPTION_ALMY: 1997, - OPTION_COLOR: 2010, - OPTION_DOTFILL: 2019, - OPTION_ALPHAMERIC: 2023, + "ALL": (OPTION_ALL, 0), + "TTY": (OPTION_TTY, 0), + "IOMODES": (OPTION_IOMODES, 0), + "PLANETS": (OPTION_PLANETS, 1974), + "THOLIAN": (OPTION_THOLIAN, 1979), + "PROBE": (OPTION_PROBE, 1980), + "SHOWME": (OPTION_SHOWME, 2006), + "RAMMING": (OPTION_RAMMING, 1979), + "MVBADDY": (OPTION_MVBADDY, 1979), + "AUTOPASS": (OPTION_AUTOPASS, 1997), + "BLKHOLE": (OPTION_BLKHOLE, 2006), + "BASE": (OPTION_BASE, 2005), + "WORLDS": (OPTION_WORLDS, 2006), + "AUTOSCAN": (OPTION_AUTOSCAN, 2000), + "CAPTURE": (OPTION_CAPTURE, 2013), + "CLOAK": (OPTION_CLOAK, 2013), + "ALMY": (OPTION_ALMY, 1997), + "COLOR": (OPTION_COLOR, 2010), + "DOTFILL": (OPTION_DOTFILL, 2019), + "ALPHAMERIC": (OPTION_ALPHAMERIC, 2023) } # Define devices @@ -5625,7 +5607,7 @@ def goptions(): if mode == "IHEOL": active = [] for k, v in option_names.items(): - if (v & game.options) and k != "ALL": + if (v[0] & game.options) and k != "ALL": active.append(k) active.sort() prout(str(" ".join(active))) @@ -5637,7 +5619,7 @@ def goptions(): if scanner.type == "IHEOL": break if scanner.token.upper() in option_names: - changemask |= option_names[scanner.token.upper()] + changemask |= option_names[scanner.token.upper()][0] else: prout(_("No such option as ") + scanner.token) if mode == "set": @@ -6067,12 +6049,6 @@ def choose(): game.skill = SKILL_EMERITUS elif scanner.type == "IHREAL": wayback = scanner.int() - if wayback <= 1973: - # Approximates the UT FORTRAN version. - game.options &=~ (OPTION_THOLIAN | OPTION_PLANETS | OPTION_PROBE | OPTION_RAMMING | OPTION_MVBADDY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_CAPTURE | OPTION_CLOAK | OPTION_ALMY | OPTION_AUTOPASS | OPTION_DOTFILL | OPTION_ALPHAMERIC) - elif scanner.int() < 1980: - # Approximates Tom Almy's 1979 version. - game.options &=~ (OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_DOTFILL | OPTION_ALPHAMERIC) elif (eol_is_fancy and scanner.token.startswith("\n")): wayback = time.localtime().tm_year elif scanner.token.startswith("\n"): @@ -6082,6 +6058,9 @@ def choose(): else: # Unrecognized token prout(_("Can't interpret %s") % repr(scanner.token)) + for (name, (option, year)) in option_names.items(): + if wayback < year: + game.options &=~ option setpassword() if game.passwd == "debug": # pragma: no cover game.idebug = True diff --git a/test/test19.chk b/test/test19.chk index 75b4186..ca64487 100644 --- a/test/test19.chk +++ b/test/test19.chk @@ -29,7 +29,7 @@ COMMAND> chart 1 2 3 4 5 6 7 8 1 | ... ... ... ... ... ... ... ... | 2 | ... .1. 8 6 8 ... ... ... | -3 | ... ... 8 < 7> 2 ... ... ... | +3 | ... ... 8 7 2 ... ... ... | 4 | ... ... 7 13 2 ... ... ... | 5 | .1. ... ... ... ... ... ... ... | 6 | ... ... ... ... ... ... ... ... | @@ -119,7 +119,7 @@ COMMAND> chart STAR CHART FOR THE KNOWN GALAXY 1 2 3 4 5 6 7 8 1 | ... ... ... ... ... 2 7 9 | -2 | ... .1. 8 6 8 2 < 1> 3 | +2 | ... .1. 8 6 8 2 1 3 | 3 | ... ... 8 7 2 4 109 8 | 4 | ... ... 7 13 2 8 3 8 | 5 | .1. ... ... ... ... 1 2 7 | -- 2.31.1 From a22d7a720d6fa0eb81f29f6574fa034afc3fc90b Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sat, 19 Aug 2023 10:16:41 -0400 Subject: [PATCH 08/16] Full documentation of wayback feature. --- NEWS | 1 + doc/sst-doc.xml | 87 ++++++++++++++++++++++++++++++++++++++++++++----- doc/sst.xml | 2 +- sst | 44 ++++++++++++------------- 4 files changed, 102 insertions(+), 32 deletions(-) diff --git a/NEWS b/NEWS index ce4e95b..eae4b10 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,7 @@ Repository head:: Fix for enemy dispersion on torpedo hits. Re-conform to the documentation by removing the .py estension from sst. Fancy-mode coordinates can have the Y as a letter, e,g. "c4" = "3 - 4". + Wayback option: you can revert the game to the behavior of past years. 2.7: 2021-09-20:: Ubuntu has abolished /usr/bin/python, change shebang to python3. diff --git a/doc/sst-doc.xml b/doc/sst-doc.xml index 6c4d793..b5ff6d3 100644 --- a/doc/sst-doc.xml +++ b/doc/sst-doc.xml @@ -251,15 +251,84 @@ game—but, of course, the level of game you play is up to you. If you want to start at the Expert level, go ahead. It's your funeral. The Emeritus game is strictly for masochists. -The fourth question, new in SST2K, sets your game options. A -blank answer or 'fancy' enables all SST2K features. The option -'plain' approximated the original CDC 6600 FORTRAN game from UT Austin -and disables a number of features: Tholians, planets & dilithium, -deep-space-probes, Klingon ramming and movement, time-warping through -black holes, death-ray upgrade, inhabited worlds. The option 'almy' -approximates Tom Almy's C translation from 1979, disabling base -shields, time-warping through black holes, and inhabited -worlds. +The fourth question, new in SST2K, sets the wayback machine. A +blank answer enables all SST2K features. Given a year, it will disable +features not implemented in that year or earlier. The year +'1973' approximated the original CDC 6600 FORTRAN game from UT Austin. +Here is a mapping of years to features: + + + +1974 +Planets and dilithium mining + + +1979 +Tholians and their webs. + + +1980 +Deep-space probes. + + +1981 +Bad guys do tactical movement. + + +1982 +Bad guys can ram you. + + +1997 +Death ray gets an upgrade. + + +1998 +Automatic generation of self-destruct password. + + +2004 +Upgraded shields for bases, and chance of time-waeping through a black hole. + +2005 +Our ship is bracketed in the chart/ + + + +2006 +Logic for inhabited worlds and Klingon captures. + + +2007 +Automatically update the long-range scan when displaying the chart. + + +2010 +Use color in interface. + +2013 +Defeated Klingons can be captured. + +2014 +The cloaking device. + + +2019 +Consistent dot-filling in the galaxy chart. + + +2023 +Alphameric coordinates. + + + + +Some caveats apply. The development history of this game is obscure; some +years of introduction have had to be guessed, and we have chosen guesses to +make support as many interesting wayback options as possible. Some options +are not affected by the wayback setting - notably, the TUI interface is always +available even though it wasn't written until 2005. Some early features, +notably "clockface" course setting, couldn't be reconstructed. How To Issue Commands diff --git a/doc/sst.xml b/doc/sst.xml index 1fbe4a6..47353fb 100644 --- a/doc/sst.xml +++ b/doc/sst.xml @@ -39,7 +39,7 @@ invasion fleet and make the galaxy safe for democracy. This is one of the great early classic computer games from the 1970s and still has a remarkable amount of play value. Run -sst.py in a terminal window to start it. Typing +sst in a terminal window to start it. Typing 'commands' at the prompt will list all commands; help is available for each one individually as well. Full documentation is browseable. On diff --git a/sst b/sst index cee6f46..78c56d9 100755 --- a/sst +++ b/sst @@ -298,21 +298,21 @@ OPTION_CURSES = 0x00000002 # new interface OPTION_IOMODES = 0x00000003 # cover both interfaces OPTION_PLANETS = 0x00000004 # planets and mining (> 1974) OPTION_THOLIAN = 0x00000008 # Tholians and their webs (UT 1979 version) -OPTION_PROBE = 0x00000020 # deep-space probes (DECUS version, 1980) -OPTION_SHOWME = 0x00000040 # bracket Enterprise in chart (ESR, 2005) -OPTION_RAMMING = 0x00000080 # enemies may ram Enterprise (Almy, 1979) -OPTION_MVBADDY = 0x00000100 # more enemies can move (Almy, 1979?) -OPTION_AUTOPASS = 0x00000200 # Autogenerate password (Almy, 1997?) +OPTION_PROBE = 0x00000010 # deep-space probes (DECUS version, 1980) +OPTION_MVBADDY = 0x00000020 # more enemies can move (Almy, 1979?) +OPTION_RAMMING = 0x00000040 # enemies may ram Enterprise (Almy, 1979?) +OPTION_ALMY = 0x00000080 # Almy's death ray upgrade (1997?) +OPTION_AUTOPASS = 0x00000100 # Autogenerate password (Almy, 1997?) +OPTION_BASE = 0x00000200 # bases have good shields (Stas, 2005) OPTION_BLKHOLE = 0x00000400 # black hole may timewarp you (Stas, 2005) -OPTION_BASE = 0x00000800 # bases have good shields (Stas, 2005) +OPTION_SHOWME = 0x00000800 # bracket Enterprise in chart (ESR, 2005) OPTION_WORLDS = 0x00001000 # logic for inhabited worlds (ESR, 2006) OPTION_AUTOSCAN = 0x00002000 # automatic LRSCAN before CHART (ESR, 2006) -OPTION_CAPTURE = 0x00004000 # Enable BSD-Trek capture (Almy, 2013). -OPTION_CLOAK = 0x80008000 # Enable BSD-Trek capture (Almy, 2013). -OPTION_ALMY = 0x01000000 # Almy's death ray upgrade (1997?) -OPTION_COLOR = 0x04000000 # enable color display (ESR, 2010) -OPTION_DOTFILL = 0x08000000 # fix dotfill glitch in chart (ESR, 2019) -OPTION_ALPHAMERIC = 0x10000000 # Alpha Y coordinates (ESR, 2023) +OPTION_COLOR = 0x00004000 # enable color display (ESR, 2010) +OPTION_CAPTURE = 0x00008000 # Enable BSD-Trek capture (Almy, 2013). +OPTION_CLOAK = 0x80010000 # Enable BSD-Trek capture (Almy, 2013). +OPTION_DOTFILL = 0x08200000 # fix dotfill glitch in chart (ESR, 2019) +OPTION_ALPHAMERIC = 0x00400000 # Alpha Y coordinates (ESR, 2023) option_names = { "ALL": (OPTION_ALL, 0), @@ -321,18 +321,18 @@ option_names = { "PLANETS": (OPTION_PLANETS, 1974), "THOLIAN": (OPTION_THOLIAN, 1979), "PROBE": (OPTION_PROBE, 1980), - "SHOWME": (OPTION_SHOWME, 2006), - "RAMMING": (OPTION_RAMMING, 1979), - "MVBADDY": (OPTION_MVBADDY, 1979), - "AUTOPASS": (OPTION_AUTOPASS, 1997), - "BLKHOLE": (OPTION_BLKHOLE, 2006), - "BASE": (OPTION_BASE, 2005), - "WORLDS": (OPTION_WORLDS, 2006), - "AUTOSCAN": (OPTION_AUTOSCAN, 2000), - "CAPTURE": (OPTION_CAPTURE, 2013), - "CLOAK": (OPTION_CLOAK, 2013), + "MVBADDY": (OPTION_MVBADDY, 1981), # year bumped to make it distinct + "RAMMING": (OPTION_RAMMING, 1982), # year bumped to make it distinct "ALMY": (OPTION_ALMY, 1997), + "AUTOPASS": (OPTION_AUTOPASS, 1998), # year bumped to make it distinct + "BASE": (OPTION_BASE, 2004), # year bumped to make it distinct + "BLKHOLE": (OPTION_BLKHOLE, 2004), # year bumped to make it distinct + "SHOWME": (OPTION_SHOWME, 2005), + "WORLDS": (OPTION_WORLDS, 2006), + "AUTOSCAN": (OPTION_AUTOSCAN, 2007), # year bumped to make it distinct "COLOR": (OPTION_COLOR, 2010), + "CAPTURE": (OPTION_CAPTURE, 2013), + "CLOAK": (OPTION_CLOAK, 2014), # year bumped to make it distinct "DOTFILL": (OPTION_DOTFILL, 2019), "ALPHAMERIC": (OPTION_ALPHAMERIC, 2023) } -- 2.31.1 From ce089367c04819e11eef4098e380ed4ef435cbc3 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sat, 19 Aug 2023 13:56:06 -0400 Subject: [PATCH 09/16] Suppress Supercommander creation befor 1979 versiom. --- doc/sst-doc.xml | 2 +- sst | 34 ++++++++++++++++++---------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/doc/sst-doc.xml b/doc/sst-doc.xml index b5ff6d3..33c0c72 100644 --- a/doc/sst-doc.xml +++ b/doc/sst-doc.xml @@ -264,7 +264,7 @@ Here is a mapping of years to features: 1979 -Tholians and their webs. +Tholians and their webs, supercommanders. 1980 diff --git a/sst b/sst index 78c56d9..3d30875 100755 --- a/sst +++ b/sst @@ -298,21 +298,22 @@ OPTION_CURSES = 0x00000002 # new interface OPTION_IOMODES = 0x00000003 # cover both interfaces OPTION_PLANETS = 0x00000004 # planets and mining (> 1974) OPTION_THOLIAN = 0x00000008 # Tholians and their webs (UT 1979 version) -OPTION_PROBE = 0x00000010 # deep-space probes (DECUS version, 1980) -OPTION_MVBADDY = 0x00000020 # more enemies can move (Almy, 1979?) -OPTION_RAMMING = 0x00000040 # enemies may ram Enterprise (Almy, 1979?) -OPTION_ALMY = 0x00000080 # Almy's death ray upgrade (1997?) -OPTION_AUTOPASS = 0x00000100 # Autogenerate password (Almy, 1997?) -OPTION_BASE = 0x00000200 # bases have good shields (Stas, 2005) -OPTION_BLKHOLE = 0x00000400 # black hole may timewarp you (Stas, 2005) -OPTION_SHOWME = 0x00000800 # bracket Enterprise in chart (ESR, 2005) -OPTION_WORLDS = 0x00001000 # logic for inhabited worlds (ESR, 2006) -OPTION_AUTOSCAN = 0x00002000 # automatic LRSCAN before CHART (ESR, 2006) -OPTION_COLOR = 0x00004000 # enable color display (ESR, 2010) -OPTION_CAPTURE = 0x00008000 # Enable BSD-Trek capture (Almy, 2013). -OPTION_CLOAK = 0x80010000 # Enable BSD-Trek capture (Almy, 2013). -OPTION_DOTFILL = 0x08200000 # fix dotfill glitch in chart (ESR, 2019) -OPTION_ALPHAMERIC = 0x00400000 # Alpha Y coordinates (ESR, 2023) +OPTION_SUPERCMDR = 0x00000010 # Supercommanders (UT 1979 version) +OPTION_PROBE = 0x00000020 # deep-space probes (DECUS version, 1980) +OPTION_MVBADDY = 0x00000040 # more enemies can move (Almy, 1979?) +OPTION_RAMMING = 0x00000080 # enemies may ram Enterprise (Almy, 1979?) +OPTION_ALMY = 0x00000100 # Almy's death ray upgrade (1997?) +OPTION_AUTOPASS = 0x00000200 # Autogenerate password (Almy, 1997?) +OPTION_BASE = 0x00000400 # bases have good shields (Stas, 2005) +OPTION_BLKHOLE = 0x00000800 # black hole may timewarp you (Stas, 2005) +OPTION_SHOWME = 0x00001000 # bracket Enterprise in chart (ESR, 2005) +OPTION_WORLDS = 0x00002000 # logic for inhabited worlds (ESR, 2006) +OPTION_AUTOSCAN = 0x00004000 # automatic LRSCAN before CHART (ESR, 2006) +OPTION_COLOR = 0x00008000 # enable color display (ESR, 2010) +OPTION_CAPTURE = 0x00010000 # Enable BSD-Trek capture (Almy, 2013). +OPTION_CLOAK = 0x10020000 # Enable BSD-Trek capture (Almy, 2013). +OPTION_DOTFILL = 0x01040000 # fix dotfill glitch in chart (ESR, 2019) +OPTION_ALPHAMERIC = 0x00080000 # Alpha Y coordinates (ESR, 2023) option_names = { "ALL": (OPTION_ALL, 0), @@ -320,6 +321,7 @@ option_names = { "IOMODES": (OPTION_IOMODES, 0), "PLANETS": (OPTION_PLANETS, 1974), "THOLIAN": (OPTION_THOLIAN, 1979), + "SUPERCMDR": (OPTION_SUPERCMDR, 1979), "PROBE": (OPTION_PROBE, 1980), "MVBADDY": (OPTION_MVBADDY, 1981), # year bumped to make it distinct "RAMMING": (OPTION_RAMMING, 1982), # year bumped to make it distinct @@ -6076,7 +6078,7 @@ def choose(): if game.options & OPTION_WORLDS: game.inplan += int(NINHAB) game.state.nromrem = game.inrom = rnd.integer(2 * game.skill) - game.state.nscrem = game.inscom = (game.skill > SKILL_FAIR) + game.state.nscrem = game.inscom = (game.skill > SKILL_FAIR) and ((game.options & OPTION_SUPERCMDR) != 0) game.state.remtime = 7.0 * game.length game.intime = game.state.remtime game.inkling = int(2.0*game.intime*((game.skill+1 - 2*rnd.real())*game.skill*0.1+.15)) -- 2.31.1 From 71214b69720106828559eb23970b0bf63f1a8529 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Mon, 18 Sep 2023 01:56:12 -0400 Subject: [PATCH 10/16] pylint & black cleanup. --- sst | 3869 +++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 2307 insertions(+), 1562 deletions(-) diff --git a/sst b/sst index 3d30875..e43613e 100755 --- a/sst +++ b/sst @@ -14,7 +14,7 @@ on how to modify (and how not to modify!) this code. # Copyright by Eric S. Raymond # SPDX-License-Identifier: BSD-2-clause -# pylint: disable=line-too-long,superfluous-parens,too-many-lines,invalid-name,missing-function-docstring,missing-class-docstring,multiple-statements,too-many-branches,too-many-statements,too-many-locals,too-many-nested-blocks,too-many-return-statements,too-many-instance-attributes,global-statement,no-else-break,no-else-return,no-else-continue,too-few-public-methods,too-many-boolean-expressions,consider-using-f-string,consider-using-enumerate,consider-using-with,unspecified-encoding +# pylint: disable=line-too-long,superfluous-parens,too-many-lines,invalid-name,missing-function-docstring,missing-class-docstring,multiple-statements,too-many-branches,too-many-statements,too-many-locals,too-many-nested-blocks,too-many-return-statements,too-many-instance-attributes,global-statement,no-else-break,no-else-return,no-else-continue,too-few-public-methods,too-many-boolean-expressions,consider-using-f-string,consider-using-enumerate,consider-using-with,unspecified-encoding,consider-using-generator # pylint: disable=multiple-imports import os, sys, math, curses, time, pickle, copy, gettext, getpass @@ -31,15 +31,18 @@ except ImportError: # pragma: no cover version = "2.7" -docpath = (".", "doc/", "/usr/share/doc/sst/") +docpath = (".", "doc/", "/usr/share/doc/sst/") + def _(st): return gettext.gettext(st) + # Rolling our own LCG because Python changed its incompatibly in 3.2. # Thus, we needed to have our own to be 2/3 polyglot; it will be # helpful when and if we ever forward-port to another language. + class randomizer: # LCG PRNG parameters tested against # Knuth vol. 2. by the authors of ADVENT @@ -50,13 +53,15 @@ class randomizer: @staticmethod def random(): old_x = game.lcg_x - game.lcg_x = (randomizer.LCG_A * game.lcg_x + randomizer.LCG_C) % randomizer.LCG_M + game.lcg_x = ( + randomizer.LCG_A * game.lcg_x + randomizer.LCG_C + ) % randomizer.LCG_M return old_x / randomizer.LCG_M @staticmethod def withprob(p): v = randomizer.random() - #if logfp: + # if logfp: # logfp.write("#withprob(%.2f) -> %s\n" % (p, v < p)) return v < p @@ -67,7 +72,7 @@ class randomizer: v = int(v * args[0]) else: v = args[0] + int(v * (args[1] - args[0])) - #if logfp: + # if logfp: # logfp.write("#integer%s -> %s\n" % (args, v)) return int(v) @@ -75,16 +80,16 @@ class randomizer: def real(*args): v = randomizer.random() if len(args) == 1: - v *= args[0] # from [0, args[0]) + v *= args[0] # from [0, args[0]) elif len(args) == 2: - v = args[0] + v*(args[1]-args[0]) # from [args[0], args[1]) - #if logfp: + v = args[0] + v * (args[1] - args[0]) # from [args[0], args[1]) + # if logfp: # logfp.write("#real%s -> %f\n" % (args, v)) return v @staticmethod def seed(n): - #if logfp: + # if logfp: # logfp.write("#seed(%d)\n" % n) game.lcg_x = n % randomizer.LCG_M @@ -96,93 +101,131 @@ class randomizer: def setrngstate(n): game.lcg_x = n -GALSIZE = 8 # Galaxy size in quadrants -NINHAB = (GALSIZE * GALSIZE // 2) # Number of inhabited worlds -MAXUNINHAB = 10 # Maximum uninhabited worlds -QUADSIZE = 10 # Quadrant size in sectors -BASEMIN = 2 # Minimum starbases -BASEMAX = (GALSIZE * GALSIZE // 12) # Maximum starbases -MAXKLGAME = 127 # Maximum Klingons per game -MAXKLQUAD = 9 # Maximum Klingons per quadrant -FULLCREW = 428 # Crew size. BSD Trek was 387, that's wrong -FOREVER = 1e30 # Time for the indefinite future -MAXBURST = 3 # Max # of torps you can launch in one turn -MINCMDR = 10 # Minimum number of Klingon commanders -DOCKFAC = 0.25 # Repair faster when docked -PHASEFAC = 2.0 # Phaser attenuation factor - -ALGERON = 2311 # Date of the Treaty of Algeron - - -DEFAULT = -1 -BLACK = 0 -BLUE = 1 -GREEN = 2 -CYAN = 3 -RED = 4 -MAGENTA = 5 -BROWN = 6 -LIGHTGRAY = 7 -DARKGRAY = 8 -LIGHTBLUE = 9 -LIGHTGREEN = 10 -LIGHTCYAN = 11 -LIGHTRED = 12 + +GALSIZE = 8 # Galaxy size in quadrants +NINHAB = GALSIZE * GALSIZE // 2 # Number of inhabited worlds +MAXUNINHAB = 10 # Maximum uninhabited worlds +QUADSIZE = 10 # Quadrant size in sectors +BASEMIN = 2 # Minimum starbases +BASEMAX = GALSIZE * GALSIZE // 12 # Maximum starbases +MAXKLGAME = 127 # Maximum Klingons per game +MAXKLQUAD = 9 # Maximum Klingons per quadrant +FULLCREW = 428 # Crew size. BSD Trek was 387, that's wrong +FOREVER = 1e30 # Time for the indefinite future +MAXBURST = 3 # Max # of torps you can launch in one turn +MINCMDR = 10 # Minimum number of Klingon commanders +DOCKFAC = 0.25 # Repair faster when docked +PHASEFAC = 2.0 # Phaser attenuation factor + +ALGERON = 2311 # Date of the Treaty of Algeron + + +DEFAULT = -1 +BLACK = 0 +BLUE = 1 +GREEN = 2 +CYAN = 3 +RED = 4 +MAGENTA = 5 +BROWN = 6 +LIGHTGRAY = 7 +DARKGRAY = 8 +LIGHTBLUE = 9 +LIGHTGREEN = 10 +LIGHTCYAN = 11 +LIGHTRED = 12 LIGHTMAGENTA = 13 -YELLOW = 14 -WHITE = 15 +YELLOW = 14 +WHITE = 15 + class TrekError(Exception): pass + class JumpOut(Exception): pass + def letterize(n): - return chr(ord('a') + n - 1) + return chr(ord("a") + n - 1) + class Coord: def __init__(self, x=None, y=None): - self.i = x # Row - self.j = y # Column + self.i = x # Row + self.j = y # Column + def valid_quadrant(self): - return (self.i is not None) and (self.j is not None) and (self.i >= 0) and (self.i < GALSIZE) and (self.j >= 0) and (self.j < GALSIZE) + return ( + (self.i is not None) + and (self.j is not None) + and (self.i >= 0) + and (self.i < GALSIZE) + and (self.j >= 0) + and (self.j < GALSIZE) + ) + def valid_sector(self): - return (self.i is not None) and (self.j is not None) and (self.i >= 0) and (self.i < QUADSIZE) and (self.j >= 0) and (self.j < QUADSIZE) + return ( + (self.i is not None) + and (self.j is not None) + and (self.i >= 0) + and (self.i < QUADSIZE) + and (self.j >= 0) + and (self.j < QUADSIZE) + ) + def invalidate(self): self.i = self.j = None + def __eq__(self, other): return other is not None and self.i == other.i and self.j == other.j + def __ne__(self, other): return other is None or self.i != other.i or self.j != other.j + def __add__(self, other): - return Coord(self.i+other.i, self.j+other.j) + return Coord(self.i + other.i, self.j + other.j) + def __sub__(self, other): - return Coord(self.i-other.i, self.j-other.j) + return Coord(self.i - other.i, self.j - other.j) + def __mul__(self, other): - return Coord(self.i*other, self.j*other) + return Coord(self.i * other, self.j * other) + def __rmul__(self, other): - return Coord(self.i*other, self.j*other) + return Coord(self.i * other, self.j * other) + def __div__(self, other): # pragma: no cover - return Coord(self.i/other, self.j/other) + return Coord(self.i / other, self.j / other) + def __truediv__(self, other): # pragma: no cover - return Coord(self.i/other, self.j/other) + return Coord(self.i / other, self.j / other) + def __floordiv__(self, other): # pragma: no cover - return Coord(self.i//other, self.j//other) + return Coord(self.i // other, self.j // other) + def __mod__(self, other): return Coord(self.i % other, self.j % other) + def __rtruediv__(self, other): # pragma: no cover - return Coord(self.i/other, self.j/other) + return Coord(self.i / other, self.j / other) + def __rfloordiv__(self, other): # pragma: no cover - return Coord(self.i//other, self.j//other) + return Coord(self.i // other, self.j // other) + def roundtogrid(self): return Coord(int(round(self.i)), int(round(self.j))) + def distance(self, other=None): if not other: other = Coord(0, 0) - return math.sqrt((self.i - other.i)**2 + (self.j - other.j)**2) + return math.sqrt((self.i - other.i) ** 2 + (self.j - other.j) ** 2) + def bearing(self): - return 1.90985*math.atan2(self.j, self.i) + return 1.90985 * math.atan2(self.j, self.i) + def sgn(self): s = Coord() if self.i == 0: @@ -198,37 +241,47 @@ class Coord: else: s.j = 1 return s + def quadrant(self): - #print "Location %s -> %s" % (self, (self / QUADSIZE).roundtogrid()) + # print "Location %s -> %s" % (self, (self / QUADSIZE).roundtogrid()) return self.roundtogrid() // QUADSIZE + def sector(self): return self.roundtogrid() % QUADSIZE + def __str__(self): if self.i is None or self.j is None: return "Nowhere" # pragma: no cover - if (game.options & OPTION_ALPHAMERIC): + if game.options & OPTION_ALPHAMERIC: return letterize(self.i + 1) + str(self.j + 1) - return "%s - %s" % (self.i+1, self.j+1) + return "%s - %s" % (self.i + 1, self.j + 1) + __repr__ = __str__ -class Thingy(): + +class Thingy: "Do not anger the Space Thingy!" + def __init__(self): self.location = Coord() + def at(self, q): return (q.i, q.j) == (self.location.i, self.location.j) + class Planet: def __init__(self): - self.name = None # string-valued if inhabited - self.quadrant = Coord() # quadrant located - self.pclass = None # could be ""M", "N", "O", or "destroyed" - self.crystals = "absent"# could be "mined", "present", "absent" - self.known = "unknown" # could be "unknown", "known", "shuttle_down" - self.inhabited = False # is it inhabited? + self.name = None # string-valued if inhabited + self.quadrant = Coord() # quadrant located + self.pclass = None # could be ""M", "N", "O", or "destroyed" + self.crystals = "absent" # could be "mined", "present", "absent" + self.known = "unknown" # could be "unknown", "known", "shuttle_down" + self.inhabited = False # is it inhabited? + def __str__(self): return self.name + class Quadrant: def __init__(self): self.stars = 0 @@ -238,18 +291,27 @@ class Quadrant: self.romulans = 0 self.supernova = False self.charted = False - self.status = "secure" # Could be "secure", "distressed", "enslaved" + self.status = "secure" # Could be "secure", "distressed", "enslaved" + def __str__(self): return "" % self.__dict__ # pragma: no cover + __repr__ = __str__ + class Page: def __init__(self): self.stars = None self.starbase = False self.klingons = None + def __repr__(self): - return "<%s,%s,%s>" % (self.klingons, self.starbase, self.stars) # pragma: no cover + return "<%s,%s,%s>" % ( + self.klingons, + self.starbase, + self.stars, + ) # pragma: no cover + def fill2d(size, fillfun): "Fill an empty list in 2D." @@ -260,60 +322,64 @@ def fill2d(size, fillfun): lst[i].append(fillfun(i, j)) return lst + class Snapshot: def __init__(self): - self.snap = False # snapshot taken - self.crew = 0 # crew complement - self.nscrem = 0 # remaining super commanders - self.starkl = 0 # destroyed stars - self.basekl = 0 # destroyed bases - self.nromrem = 0 # Romulans remaining - self.nplankl = 0 # destroyed uninhabited planets - self.nworldkl = 0 # destroyed inhabited planets - self.planets = [] # Planet information - self.date = 0.0 # stardate - self.remres = 0 # remaining resources - self.remtime = 0 # remaining time - self.baseq = [] # Base quadrant coordinates - self.kcmdr = [] # Commander quadrant coordinates - self.kscmdr = Coord() # Supercommander quadrant coordinates + self.snap = False # snapshot taken + self.crew = 0 # crew complement + self.nscrem = 0 # remaining super commanders + self.starkl = 0 # destroyed stars + self.basekl = 0 # destroyed bases + self.nromrem = 0 # Romulans remaining + self.nplankl = 0 # destroyed uninhabited planets + self.nworldkl = 0 # destroyed inhabited planets + self.planets = [] # Planet information + self.date = 0.0 # stardate + self.remres = 0 # remaining resources + self.remtime = 0 # remaining time + self.baseq = [] # Base quadrant coordinates + self.kcmdr = [] # Commander quadrant coordinates + self.kscmdr = Coord() # Supercommander quadrant coordinates # the galaxy self.galaxy = fill2d(GALSIZE, lambda i_unused, j_unused: Quadrant()) # the starchart self.chart = fill2d(GALSIZE, lambda i_unused, j_unused: Page()) + def traverse(self): for i in range(GALSIZE): for j in range(GALSIZE): yield (i, j, self.galaxy[i][j]) + class Event: def __init__(self): - self.date = None # A real number - self.quadrant = None # A coord structure + self.date = None # A real number + self.quadrant = None # A coord structure + # game options -OPTION_ALL = 0xffffffff -OPTION_TTY = 0x00000001 # old interface -OPTION_CURSES = 0x00000002 # new interface -OPTION_IOMODES = 0x00000003 # cover both interfaces -OPTION_PLANETS = 0x00000004 # planets and mining (> 1974) -OPTION_THOLIAN = 0x00000008 # Tholians and their webs (UT 1979 version) -OPTION_SUPERCMDR = 0x00000010 # Supercommanders (UT 1979 version) -OPTION_PROBE = 0x00000020 # deep-space probes (DECUS version, 1980) -OPTION_MVBADDY = 0x00000040 # more enemies can move (Almy, 1979?) -OPTION_RAMMING = 0x00000080 # enemies may ram Enterprise (Almy, 1979?) -OPTION_ALMY = 0x00000100 # Almy's death ray upgrade (1997?) -OPTION_AUTOPASS = 0x00000200 # Autogenerate password (Almy, 1997?) -OPTION_BASE = 0x00000400 # bases have good shields (Stas, 2005) -OPTION_BLKHOLE = 0x00000800 # black hole may timewarp you (Stas, 2005) -OPTION_SHOWME = 0x00001000 # bracket Enterprise in chart (ESR, 2005) -OPTION_WORLDS = 0x00002000 # logic for inhabited worlds (ESR, 2006) -OPTION_AUTOSCAN = 0x00004000 # automatic LRSCAN before CHART (ESR, 2006) -OPTION_COLOR = 0x00008000 # enable color display (ESR, 2010) -OPTION_CAPTURE = 0x00010000 # Enable BSD-Trek capture (Almy, 2013). -OPTION_CLOAK = 0x10020000 # Enable BSD-Trek capture (Almy, 2013). -OPTION_DOTFILL = 0x01040000 # fix dotfill glitch in chart (ESR, 2019) -OPTION_ALPHAMERIC = 0x00080000 # Alpha Y coordinates (ESR, 2023) +OPTION_ALL = 0xFFFFFFFF +OPTION_TTY = 0x00000001 # old interface +OPTION_CURSES = 0x00000002 # new interface +OPTION_IOMODES = 0x00000003 # cover both interfaces +OPTION_PLANETS = 0x00000004 # planets and mining (> 1974) +OPTION_THOLIAN = 0x00000008 # Tholians and their webs (UT 1979 version) +OPTION_SUPERCMDR = 0x00000010 # Supercommanders (UT 1979 version) +OPTION_PROBE = 0x00000020 # deep-space probes (DECUS version, 1980) +OPTION_MVBADDY = 0x00000040 # more enemies can move (Almy, 1979?) +OPTION_RAMMING = 0x00000080 # enemies may ram Enterprise (Almy, 1979?) +OPTION_ALMY = 0x00000100 # Almy's death ray upgrade (1997?) +OPTION_AUTOPASS = 0x00000200 # Autogenerate password (Almy, 1997?) +OPTION_BASE = 0x00000400 # bases have good shields (Stas, 2005) +OPTION_BLKHOLE = 0x00000800 # black hole may timewarp you (Stas, 2005) +OPTION_SHOWME = 0x00001000 # bracket Enterprise in chart (ESR, 2005) +OPTION_WORLDS = 0x00002000 # logic for inhabited worlds (ESR, 2006) +OPTION_AUTOSCAN = 0x00004000 # automatic LRSCAN before CHART (ESR, 2006) +OPTION_COLOR = 0x00008000 # enable color display (ESR, 2010) +OPTION_CAPTURE = 0x00010000 # Enable BSD-Trek capture (Almy, 2013). +OPTION_CLOAK = 0x10020000 # Enable BSD-Trek capture (Almy, 2013). +OPTION_DOTFILL = 0x01040000 # fix dotfill glitch in chart (ESR, 2019) +OPTION_ALPHAMERIC = 0x00080000 # Alpha Y coordinates (ESR, 2023) option_names = { "ALL": (OPTION_ALL, 0), @@ -323,68 +389,72 @@ option_names = { "THOLIAN": (OPTION_THOLIAN, 1979), "SUPERCMDR": (OPTION_SUPERCMDR, 1979), "PROBE": (OPTION_PROBE, 1980), - "MVBADDY": (OPTION_MVBADDY, 1981), # year bumped to make it distinct - "RAMMING": (OPTION_RAMMING, 1982), # year bumped to make it distinct + "MVBADDY": (OPTION_MVBADDY, 1981), # year bumped to make it distinct + "RAMMING": (OPTION_RAMMING, 1982), # year bumped to make it distinct "ALMY": (OPTION_ALMY, 1997), - "AUTOPASS": (OPTION_AUTOPASS, 1998), # year bumped to make it distinct - "BASE": (OPTION_BASE, 2004), # year bumped to make it distinct - "BLKHOLE": (OPTION_BLKHOLE, 2004), # year bumped to make it distinct + "AUTOPASS": (OPTION_AUTOPASS, 1998), # year bumped to make it distinct + "BASE": (OPTION_BASE, 2004), # year bumped to make it distinct + "BLKHOLE": (OPTION_BLKHOLE, 2004), # year bumped to make it distinct "SHOWME": (OPTION_SHOWME, 2005), "WORLDS": (OPTION_WORLDS, 2006), "AUTOSCAN": (OPTION_AUTOSCAN, 2007), # year bumped to make it distinct "COLOR": (OPTION_COLOR, 2010), "CAPTURE": (OPTION_CAPTURE, 2013), - "CLOAK": (OPTION_CLOAK, 2014), # year bumped to make it distinct + "CLOAK": (OPTION_CLOAK, 2014), # year bumped to make it distinct "DOTFILL": (OPTION_DOTFILL, 2019), - "ALPHAMERIC": (OPTION_ALPHAMERIC, 2023) + "ALPHAMERIC": (OPTION_ALPHAMERIC, 2023), } # Define devices -DSRSENS = 0 -DLRSENS = 1 -DPHASER = 2 -DPHOTON = 3 -DLIFSUP = 4 -DWARPEN = 5 -DIMPULS = 6 -DSHIELD = 7 -DRADIO = 8 -DSHUTTL = 9 -DCOMPTR = 10 -DNAVSYS = 11 -DTRANSP = 12 -DSHCTRL = 13 -DDRAY = 14 -DDSP = 15 -DCLOAK = 16 -NDEVICES = 17 # Number of devices - -SKILL_NONE = 0 -SKILL_NOVICE = 1 -SKILL_FAIR = 2 -SKILL_GOOD = 3 -SKILL_EXPERT = 4 -SKILL_EMERITUS = 5 +DSRSENS = 0 +DLRSENS = 1 +DPHASER = 2 +DPHOTON = 3 +DLIFSUP = 4 +DWARPEN = 5 +DIMPULS = 6 +DSHIELD = 7 +DRADIO = 8 +DSHUTTL = 9 +DCOMPTR = 10 +DNAVSYS = 11 +DTRANSP = 12 +DSHCTRL = 13 +DDRAY = 14 +DDSP = 15 +DCLOAK = 16 +NDEVICES = 17 # Number of devices + +SKILL_NONE = 0 +SKILL_NOVICE = 1 +SKILL_FAIR = 2 +SKILL_GOOD = 3 +SKILL_EXPERT = 4 +SKILL_EMERITUS = 5 + def damaged(dev): - return (game.damage[dev] != 0.0) + return game.damage[dev] != 0.0 + + def communicating(): - return not damaged(DRADIO) or game.condition=="docked" + return not damaged(DRADIO) or game.condition == "docked" + # Define future events -FSPY = 0 # Spy event happens always (no future[] entry) - # can cause SC to tractor beam Enterprise -FSNOVA = 1 # Supernova -FTBEAM = 2 # Commander tractor beams Enterprise -FSNAP = 3 # Snapshot for time warp -FBATTAK = 4 # Commander attacks base -FCDBAS = 5 # Commander destroys base -FSCMOVE = 6 # Supercommander moves (might attack base) -FSCDBAS = 7 # Supercommander destroys base -FDSPROB = 8 # Move deep space probe -FDISTR = 9 # Emit distress call from an inhabited world -FENSLV = 10 # Inhabited word is enslaved -FREPRO = 11 # Klingons build a ship in an enslaved system +FSPY = 0 # Spy event happens always (no future[] entry) +# can cause SC to tractor beam Enterprise +FSNOVA = 1 # Supernova +FTBEAM = 2 # Commander tractor beams Enterprise +FSNAP = 3 # Snapshot for time warp +FBATTAK = 4 # Commander attacks base +FCDBAS = 5 # Commander destroys base +FSCMOVE = 6 # Supercommander moves (might attack base) +FSCDBAS = 7 # Supercommander destroys base +FDSPROB = 8 # Move deep space probe +FDISTR = 9 # Emit distress call from an inhabited world +FENSLV = 10 # Inhabited word is enslaved +FREPRO = 11 # Klingons build a ship in an enslaved system NEVENTS = 12 # Abstract out the event handling -- underlying data structures will change @@ -392,6 +462,7 @@ NEVENTS = 12 def findevent(evtype): # pragma: no cover return game.future[evtype] + class Enemy: def __init__(self, etype=None, loc=None, power=None): self.type = etype @@ -400,16 +471,17 @@ class Enemy: self.kavgd = None if loc: self.move(loc) - self.power = power # enemy energy level + self.power = power # enemy energy level game.enemies.append(self) + def move(self, loc): - motion = (loc != self.location) + motion = loc != self.location if self.location.i is not None and self.location.j is not None: if motion: - if self.type == 'T': - game.quad[self.location.i][self.location.j] = '#' + if self.type == "T": + game.quad[self.location.i][self.location.j] = "#" else: - game.quad[self.location.i][self.location.j] = '.' + game.quad[self.location.i][self.location.j] = "." if loc: self.location = copy.copy(loc) game.quad[self.location.i][self.location.j] = self.type @@ -421,102 +493,106 @@ class Enemy: if self in game.enemies: game.enemies.remove(self) return motion + def __repr__(self): return "<%s,%s,%f>" % (self.type, self.location, self.power) # pragma: no cover + class Gamestate: def __init__(self): - self.options = None # Game options - self.state = Snapshot() # A snapshot structure - self.snapsht = Snapshot() # Last snapshot taken for time-travel purposes - self.quad = None # contents of our quadrant - self.damage = [0.0] * NDEVICES # damage encountered - self.future = [] # future events + self.options = None # Game options + self.state = Snapshot() # A snapshot structure + self.snapsht = Snapshot() # Last snapshot taken for time-travel purposes + self.quad = None # contents of our quadrant + self.damage = [0.0] * NDEVICES # damage encountered + self.future = [] # future events i = NEVENTS while i > 0: i -= 1 self.future.append(Event()) - self.passwd = None # Self Destruct password + self.passwd = None # Self Destruct password self.enemies = [] - self.quadrant = None # where we are in the large - self.sector = None # where we are in the small - self.tholian = None # Tholian enemy object - self.base = None # position of base in current quadrant - self.battle = None # base coordinates being attacked - self.plnet = None # location of planet in quadrant - self.gamewon = False # Finished! - self.ididit = False # action taken -- allows enemy to attack - self.alive = False # we are alive (not killed) - self.justin = False # just entered quadrant - self.shldup = False # shields are up - self.shldchg = False # shield is changing (affects efficiency) - self.iscate = False # super commander is here - self.ientesc = False # attempted escape from supercommander - self.resting = False # rest time - self.icraft = False # Kirk in Galileo - self.landed = False # party on planet (true), on ship (false) - self.alldone = False # game is now finished - self.neutz = False # Romulan Neutral Zone - self.isarmed = False # probe is armed - self.inorbit = False # orbiting a planet - self.imine = False # mining - self.icrystl = False # dilithium crystals aboard - self.iseenit = False # seen base attack report - self.thawed = False # thawed game - self.condition = None # "green", "yellow", "red", "docked", "dead" - self.iscraft = None # "onship", "offship", "removed" - self.skill = SKILL_NONE # Player skill level - self.inkling = 0 # initial number of klingons - self.inbase = 0 # initial number of bases - self.incom = 0 # initial number of commanders - self.inscom = 0 # initial number of commanders - self.inrom = 0 # initial number of commanders - self.instar = 0 # initial stars - self.intorps = 0 # initial/max torpedoes - self.torps = 0 # number of torpedoes - self.ship = 0 # ship type -- 'E' is Enterprise - self.abandoned = 0 # count of crew abandoned in space - self.length = 0 # length of game - self.klhere = 0 # klingons here - self.casual = 0 # causalties - self.nhelp = 0 # calls for help - self.nkinks = 0 # count of energy-barrier crossings - self.iplnet = None # planet # in quadrant - self.inplan = 0 # initial planets - self.irhere = 0 # Romulans in quadrant - self.isatb = 0 # =2 if super commander is attacking base - self.tourn = None # tournament number - self.nprobes = 0 # number of probes available - self.inresor = 0.0 # initial resources - self.intime = 0.0 # initial time - self.inenrg = 0.0 # initial/max energy - self.inshld = 0.0 # initial/max shield - self.inlsr = 0.0 # initial life support resources - self.indate = 0.0 # initial date - self.energy = 0.0 # energy level - self.shield = 0.0 # shield level - self.warpfac = 0.0 # warp speed - self.lsupres = 0.0 # life support reserves - self.optime = 0.0 # time taken by current operation - self.damfac = 0.0 # damage factor - self.lastchart = 0.0 # time star chart was last updated - self.cryprob = 0.0 # probability that crystal will work - self.probe = None # object holding probe course info - self.height = 0.0 # height of orbit around planet - self.score = 0.0 # overall score - self.perdate = 0.0 # rate of kills - self.idebug = False # Debugging instrumentation enabled? - self.cdebug = False # Debugging instrumentation for curses enabled? - self.statekscmdr = None # No SuperCommander coordinates yet. - self.brigcapacity = 400 # Enterprise brig capacity - self.brigfree = 400 # How many klingons can we put in the brig? - self.kcaptured = 0 # Total Klingons captured, for scoring. + self.quadrant = None # where we are in the large + self.sector = None # where we are in the small + self.tholian = None # Tholian enemy object + self.base = None # position of base in current quadrant + self.battle = None # base coordinates being attacked + self.plnet = None # location of planet in quadrant + self.gamewon = False # Finished! + self.ididit = False # action taken -- allows enemy to attack + self.alive = False # we are alive (not killed) + self.justin = False # just entered quadrant + self.shldup = False # shields are up + self.shldchg = False # shield is changing (affects efficiency) + self.iscate = False # super commander is here + self.ientesc = False # attempted escape from supercommander + self.resting = False # rest time + self.icraft = False # Kirk in Galileo + self.landed = False # party on planet (true), on ship (false) + self.alldone = False # game is now finished + self.neutz = False # Romulan Neutral Zone + self.isarmed = False # probe is armed + self.inorbit = False # orbiting a planet + self.imine = False # mining + self.icrystl = False # dilithium crystals aboard + self.iseenit = False # seen base attack report + self.thawed = False # thawed game + self.condition = None # "green", "yellow", "red", "docked", "dead" + self.iscraft = None # "onship", "offship", "removed" + self.skill = SKILL_NONE # Player skill level + self.inkling = 0 # initial number of klingons + self.inbase = 0 # initial number of bases + self.incom = 0 # initial number of commanders + self.inscom = 0 # initial number of commanders + self.inrom = 0 # initial number of commanders + self.instar = 0 # initial stars + self.intorps = 0 # initial/max torpedoes + self.torps = 0 # number of torpedoes + self.ship = 0 # ship type -- 'E' is Enterprise + self.abandoned = 0 # count of crew abandoned in space + self.length = 0 # length of game + self.klhere = 0 # klingons here + self.casual = 0 # causalties + self.nhelp = 0 # calls for help + self.nkinks = 0 # count of energy-barrier crossings + self.iplnet = None # planet # in quadrant + self.inplan = 0 # initial planets + self.irhere = 0 # Romulans in quadrant + self.isatb = 0 # =2 if super commander is attacking base + self.tourn = None # tournament number + self.nprobes = 0 # number of probes available + self.inresor = 0.0 # initial resources + self.intime = 0.0 # initial time + self.inenrg = 0.0 # initial/max energy + self.inshld = 0.0 # initial/max shield + self.inlsr = 0.0 # initial life support resources + self.indate = 0.0 # initial date + self.energy = 0.0 # energy level + self.shield = 0.0 # shield level + self.warpfac = 0.0 # warp speed + self.lsupres = 0.0 # life support reserves + self.optime = 0.0 # time taken by current operation + self.damfac = 0.0 # damage factor + self.lastchart = 0.0 # time star chart was last updated + self.cryprob = 0.0 # probability that crystal will work + self.probe = None # object holding probe course info + self.height = 0.0 # height of orbit around planet + self.score = 0.0 # overall score + self.perdate = 0.0 # rate of kills + self.idebug = False # Debugging instrumentation enabled? + self.cdebug = False # Debugging instrumentation for curses enabled? + self.statekscmdr = None # No SuperCommander coordinates yet. + self.brigcapacity = 400 # Enterprise brig capacity + self.brigfree = 400 # How many klingons can we put in the brig? + self.kcaptured = 0 # Total Klingons captured, for scoring. self.iscloaked = False # Cloaking device on? - self.ncviol = 0 # Algreon treaty violations - self.isviolreported = False # We have been warned - self.lcg_x = 0 # LCG generator value + self.ncviol = 0 # Algreon treaty violations + self.isviolreported = False # We have been warned + self.lcg_x = 0 # LCG generator value + def remkl(self): return sum([q.klingons for (_i, _j, q) in list(self.state.traverse())]) + def recompute(self): # Stas thinks this should be (C expression): # game.remkl() + len(game.state.kcmdr) > 0 ? @@ -524,11 +600,15 @@ class Gamestate: # He says the existing expression is prone to divide-by-zero errors # after killing the last klingon when score is shown -- perhaps also # if the only remaining klingon is SCOM. - self.state.remtime = self.state.remres/(self.remkl() + 4*len(self.state.kcmdr)) + self.state.remtime = self.state.remres / ( + self.remkl() + 4 * len(self.state.kcmdr) + ) + def unwon(self): "Are there Klingons remaining?" return self.remkl() + FWON = 0 FDEPLETE = 1 FLIFESUP = 2 @@ -555,24 +635,28 @@ FCLOAK = 22 # Code from ai.c begins here + def welcoming(iq): "Would this quadrant welcome another Klingon?" - return iq.valid_quadrant() and \ - not game.state.galaxy[iq.i][iq.j].supernova and \ - game.state.galaxy[iq.i][iq.j].klingons < MAXKLQUAD + return ( + iq.valid_quadrant() + and not game.state.galaxy[iq.i][iq.j].supernova + and game.state.galaxy[iq.i][iq.j].klingons < MAXKLQUAD + ) + def tryexit(enemy, look, irun): "A bad guy attempts to bug out." iq = Coord() - iq.i = game.quadrant.i+(look.i+(QUADSIZE-1))//QUADSIZE - 1 - iq.j = game.quadrant.j+(look.j+(QUADSIZE-1))//QUADSIZE - 1 + iq.i = game.quadrant.i + (look.i + (QUADSIZE - 1)) // QUADSIZE - 1 + iq.j = game.quadrant.j + (look.j + (QUADSIZE - 1)) // QUADSIZE - 1 if not welcoming(iq): return [] - if enemy.type == 'R': - return [] # Romulans cannot escape! + if enemy.type == "R": + return [] # Romulans cannot escape! if not irun: # avoid intruding on another commander's territory - if enemy.type == 'C': + if enemy.type == "C": if iq in game.state.kcmdr: return [] # refuse to leave if currently attacking starbase @@ -590,7 +674,7 @@ def tryexit(enemy, look, irun): # Handle global matters related to escape game.state.galaxy[game.quadrant.i][game.quadrant.j].klingons -= 1 game.state.galaxy[iq.i][iq.j].klingons += 1 - if enemy.type == 'S': + if enemy.type == "S": game.iscate = False game.ientesc = False game.isatb = 0 @@ -605,6 +689,7 @@ def tryexit(enemy, look, irun): # report move out of quadrant. return [(True, enemy, oldloc, iq)] + # The bad-guy movement algorithm: # # 1. Enterprise has "force" based on condition of phaser and photon torpedoes. @@ -643,6 +728,7 @@ def tryexit(enemy, look, irun): # # 5. Motion is limited to skill level, except for SC hi-tailing it out. + def movebaddy(enemy): "Tactical movement for the bad guys." goto = Coord() @@ -650,43 +736,58 @@ def movebaddy(enemy): irun = False # This should probably be just (game.quadrant in game.state.kcmdr) + (game.state.kscmdr==game.quadrant) if game.skill >= SKILL_EXPERT: - nbaddys = int(((game.quadrant in game.state.kcmdr)*2 + (game.state.kscmdr==game.quadrant)*2+game.klhere*1.23+game.irhere*1.5)/2.0) + nbaddys = int( + ( + (game.quadrant in game.state.kcmdr) * 2 + + (game.state.kscmdr == game.quadrant) * 2 + + game.klhere * 1.23 + + game.irhere * 1.5 + ) + / 2.0 + ) else: - nbaddys = (game.quadrant in game.state.kcmdr) + (game.state.kscmdr==game.quadrant) + nbaddys = (game.quadrant in game.state.kcmdr) + ( + game.state.kscmdr == game.quadrant + ) old_dist = enemy.kdist - mdist = int(old_dist + 0.5) # Nearest integer distance + mdist = int(old_dist + 0.5) # Nearest integer distance # If SC, check with spy to see if should hi-tail it - if enemy.type == 'S' and \ - (enemy.power <= 500.0 or (game.condition=="docked" and not damaged(DPHOTON))): + if enemy.type == "S" and ( + enemy.power <= 500.0 or (game.condition == "docked" and not damaged(DPHOTON)) + ): irun = True motion = -QUADSIZE else: # decide whether to advance, retreat, or hold position - forces = enemy.power+100.0*len(game.enemies)+400*(nbaddys-1) + forces = enemy.power + 100.0 * len(game.enemies) + 400 * (nbaddys - 1) if not game.shldup: - forces += 1000 # Good for enemy if shield is down! + forces += 1000 # Good for enemy if shield is down! if not damaged(DPHASER) or not damaged(DPHOTON): - if damaged(DPHASER): # phasers damaged + if damaged(DPHASER): # phasers damaged forces += 300.0 else: - forces -= 0.2*(game.energy - 2500.0) - if damaged(DPHOTON): # photon torpedoes damaged + forces -= 0.2 * (game.energy - 2500.0) + if damaged(DPHOTON): # photon torpedoes damaged forces += 300.0 else: - forces -= 50.0*game.torps + forces -= 50.0 * game.torps else: # phasers and photon tubes both out! forces += 1000.0 motion = 0 - if forces <= 1000.0 and game.condition != "docked": # Typical situation - motion = ((forces + rnd.real(200))/150.0) - 5.0 + if forces <= 1000.0 and game.condition != "docked": # Typical situation + motion = ((forces + rnd.real(200)) / 150.0) - 5.0 else: - if forces > 1000.0: # Very strong -- move in for kill - motion = (1.0 - rnd.real())**2 * old_dist + 1.0 - if game.condition == "docked" and (game.options & OPTION_BASE): # protected by base -- back off ! - motion -= game.skill*(2.0-rnd.real()**2) + if forces > 1000.0: # Very strong -- move in for kill + motion = (1.0 - rnd.real()) ** 2 * old_dist + 1.0 + if game.condition == "docked" and ( + game.options & OPTION_BASE + ): # protected by base -- back off ! + motion -= game.skill * (2.0 - rnd.real() ** 2) if game.idebug: - proutn("=== MOTION = %d, FORCES = %1.2f, " % (motion, forces)) # pragma: no cover + proutn( + "=== MOTION = %d, FORCES = %1.2f, " % (motion, forces) + ) # pragma: no cover # don't move if no motion if motion == 0: return [] @@ -699,23 +800,23 @@ def movebaddy(enemy): # calculate preferred number of steps nsteps = abs(int(motion)) if motion > 0 and nsteps > mdist: - nsteps = mdist # don't overshoot - nsteps = min(nsteps, QUADSIZE) # This shouldn't be necessary - nsteps = max(nsteps, 1) # This shouldn't be necessary + nsteps = mdist # don't overshoot + nsteps = min(nsteps, QUADSIZE) # This shouldn't be necessary + nsteps = max(nsteps, 1) # This shouldn't be necessary if game.idebug: - proutn("NSTEPS = %d:" % nsteps) # pragma: no cover + proutn("NSTEPS = %d:" % nsteps) # pragma: no cover # Compute preferred values of delta X and Y m = game.sector - enemy.location if 2.0 * abs(m.i) < abs(m.j): m.i = 0 - if 2.0 * abs(m.j) < abs(game.sector.i-enemy.location.i): + if 2.0 * abs(m.j) < abs(game.sector.i - enemy.location.i): m.j = 0 m = (motion * m).sgn() goto = enemy.location # main move loop for ll in range(nsteps): if game.idebug: - proutn(" %d" % (ll+1)) # pragma: no cover + proutn(" %d" % (ll + 1)) # pragma: no cover # Check if preferred position available look = goto + m if m.i < 0: @@ -727,7 +828,7 @@ def movebaddy(enemy): else: krawlj = -1 success = False - attempts = 0 # Settle mysterious hang problem + attempts = 0 # Settle mysterious hang problem while attempts < 20 and not success: attempts += 1 if look.i < 0 or look.i >= QUADSIZE: @@ -744,10 +845,9 @@ def movebaddy(enemy): break look.j = goto.j + krawlj krawlj = -krawlj - elif (game.options & OPTION_RAMMING) and game.quad[look.i][look.j] != '.': + elif (game.options & OPTION_RAMMING) and game.quad[look.i][look.j] != ".": # See if enemy should ram ship - if game.quad[look.i][look.j] == game.ship and \ - enemy.type in ('C', 'S'): + if game.quad[look.i][look.j] == game.ship and enemy.type in ("C", "S"): collision(rammed=True, enemy=enemy) return [] if krawli != m.i and m.j != 0: @@ -757,34 +857,35 @@ def movebaddy(enemy): look.j = goto.j + krawlj krawlj = -krawlj else: - break # we have failed + break # we have failed else: success = True if success: goto = look if game.idebug: - proutn(repr(goto)) # pragma: no cover + proutn(repr(goto)) # pragma: no cover else: - break # done early + break # done early if game.idebug: - skip(1) # pragma: no cover + skip(1) # pragma: no cover # Enemy moved, but is still in sector return [(False, enemy, old_dist, goto)] + def moveklings(): "Sequence Klingon tactical movement." if game.idebug: - prout("== MOVCOM") # pragma: no cover + prout("== MOVCOM") # pragma: no cover # Figure out which Klingon is the commander (or Supercommander) # and do move tacmoves = [] if game.quadrant in game.state.kcmdr: for enemy in game.enemies: - if enemy.type == 'C': + if enemy.type == "C": tacmoves += movebaddy(enemy) if game.state.kscmdr == game.quadrant: for enemy in game.enemies: - if enemy.type == 'S': + if enemy.type == "S": tacmoves += movebaddy(enemy) break # If skill level is high, move other Klingons and Romulans too! @@ -792,10 +893,11 @@ def moveklings(): # commander(s) do. if game.skill >= SKILL_EXPERT and (game.options & OPTION_MVBADDY): for enemy in game.enemies: - if enemy.type in ('K', 'R'): + if enemy.type in ("K", "R"): tacmoves += movebaddy(enemy) return tacmoves + def movescom(iq, avoid): "Supercommander movement helper." # Avoid quadrants with bases if we want to avoid Enterprise @@ -814,7 +916,7 @@ def movescom(iq, avoid): game.ientesc = False unschedule(FSCDBAS) for enemy in game.enemies: - if enemy.type == 'S': + if enemy.type == "S": enemy.move(None) game.klhere -= 1 if game.condition != "docked": @@ -822,18 +924,24 @@ def movescom(iq, avoid): sortenemies() # check for a helpful planet for i in range(game.inplan): - if game.state.planets[i].quadrant == game.state.kscmdr and \ - game.state.planets[i].crystals == "present": + if ( + game.state.planets[i].quadrant == game.state.kscmdr + and game.state.planets[i].crystals == "present" + ): # destroy the planet game.state.planets[i].pclass = "destroyed" game.state.galaxy[game.state.kscmdr.i][game.state.kscmdr.j].planet = None if communicating(): announce() - prout(_("Lt. Uhura- \"Captain, Starfleet Intelligence reports")) - prout(_(" a planet in Quadrant %s has been destroyed") % game.state.kscmdr) - prout(_(" by the Super-commander.\"")) + prout(_('Lt. Uhura- "Captain, Starfleet Intelligence reports')) + prout( + _(" a planet in Quadrant %s has been destroyed") + % game.state.kscmdr + ) + prout(_(' by the Super-commander."')) break - return True # looks good! + return True # looks good! + def supercommander(): "Move the Super Commander." @@ -843,17 +951,18 @@ def supercommander(): idelta = Coord() basetbl = [] if game.idebug: - prout("== SUPERCOMMANDER") # pragma: no cover + prout("== SUPERCOMMANDER") # pragma: no cover # Decide on being active or passive - avoid = ((game.incom - len(game.state.kcmdr) + game.inkling - game.remkl())/(game.state.date+0.01-game.indate) < 0.1*game.skill*(game.skill+1.0) or \ - (game.state.date-game.indate) < 3.0) + avoid = (game.incom - len(game.state.kcmdr) + game.inkling - game.remkl()) / ( + game.state.date + 0.01 - game.indate + ) < 0.1 * game.skill * (game.skill + 1.0) or (game.state.date - game.indate) < 3.0 if not game.iscate and avoid: # compute move away from Enterprise - idelta = game.state.kscmdr-game.quadrant + idelta = game.state.kscmdr - game.quadrant if idelta.distance() > 2.0: # circulate in space - idelta.i = game.state.kscmdr.j-game.quadrant.j - idelta.j = game.quadrant.i-game.state.kscmdr.i + idelta.i = game.state.kscmdr.j - game.quadrant.j + idelta.j = game.quadrant.i - game.state.kscmdr.i else: # compute distances to starbases if not game.state.baseq: @@ -869,7 +978,7 @@ def supercommander(): # without too many Klingons, and not already under attack. ifindit = iwhichb = 0 for (i2, base) in enumerate(game.state.baseq): - i = basetbl[i2][0] # bug in original had it not finding nearest + i = basetbl[i2][0] # bug in original had it not finding nearest if base == game.quadrant or base == game.battle or not welcoming(base): continue # if there is a commander, and no other base is appropriate, @@ -879,12 +988,12 @@ def supercommander(): ifindit = 2 iwhichb = i break - else: # no commander -- use this one + else: # no commander -- use this one ifindit = 1 iwhichb = i break if ifindit == 0: - return # Nothing suitable -- wait until next time + return # Nothing suitable -- wait until next time ibq = game.state.baseq[iwhichb] # decide how to move toward base idelta = ibq - game.state.kscmdr @@ -923,40 +1032,49 @@ def supercommander(): if ibq == game.state.kscmdr and game.state.kscmdr == game.battle: # attack the base if avoid: - return # no, don't attack base! + return # no, don't attack base! game.iseenit = False game.isatb = 1 schedule(FSCDBAS, rnd.real(1.0, 3.0)) if is_scheduled(FCDBAS): - postpone(FSCDBAS, scheduled(FCDBAS)-game.state.date) + postpone(FSCDBAS, scheduled(FCDBAS) - game.state.date) if not communicating(): - return # no warning + return # no warning game.iseenit = True announce() - prout(_("Lt. Uhura- \"Captain, the starbase in Quadrant %s") \ - % game.state.kscmdr) - prout(_(" reports that it is under attack from the Klingon Super-commander.")) - prout(_(" It can survive until stardate %d.\"") \ - % int(scheduled(FSCDBAS))) + prout( + _('Lt. Uhura- "Captain, the starbase in Quadrant %s') + % game.state.kscmdr + ) + prout( + _( + " reports that it is under attack from the Klingon Super-commander." + ) + ) + prout( + _(' It can survive until stardate %d."') % int(scheduled(FSCDBAS)) + ) if not game.resting: return - prout(_("Mr. Spock- \"Captain, shall we cancel the rest period?\"")) + prout(_('Mr. Spock- "Captain, shall we cancel the rest period?"')) if not ja(): return game.resting = False - game.optime = 0.0 # actually finished + game.optime = 0.0 # actually finished return # Check for intelligence report - if not game.idebug and \ - (rnd.withprob(0.8) or \ - (not communicating()) or \ - not game.state.galaxy[game.state.kscmdr.i][game.state.kscmdr.j].charted): + if not game.idebug and ( + rnd.withprob(0.8) + or (not communicating()) + or not game.state.galaxy[game.state.kscmdr.i][game.state.kscmdr.j].charted + ): return announce() - prout(_("Lt. Uhura- \"Captain, Starfleet Intelligence reports")) + prout(_('Lt. Uhura- "Captain, Starfleet Intelligence reports')) prout(_(" the Super-commander is in Quadrant %s.") % game.state.kscmdr) return + def movetholian(): "Move the Tholian." if not game.tholian or game.justin: @@ -964,14 +1082,17 @@ def movetholian(): tid = Coord() if game.tholian.location.i == 0 and game.tholian.location.j == 0: tid.i = 0 - tid.j = QUADSIZE-1 - elif game.tholian.location.i == 0 and game.tholian.location.j == QUADSIZE-1: - tid.i = QUADSIZE-1 - tid.j = QUADSIZE-1 - elif game.tholian.location.i == QUADSIZE-1 and game.tholian.location.j == QUADSIZE-1: - tid.i = QUADSIZE-1 + tid.j = QUADSIZE - 1 + elif game.tholian.location.i == 0 and game.tholian.location.j == QUADSIZE - 1: + tid.i = QUADSIZE - 1 + tid.j = QUADSIZE - 1 + elif ( + game.tholian.location.i == QUADSIZE - 1 + and game.tholian.location.j == QUADSIZE - 1 + ): + tid.i = QUADSIZE - 1 tid.j = 0 - elif game.tholian.location.i == QUADSIZE-1 and game.tholian.location.j == 0: + elif game.tholian.location.i == QUADSIZE - 1 and game.tholian.location.j == 0: tid.i = 0 tid.j = 0 else: # pragma: no cover @@ -980,42 +1101,44 @@ def movetholian(): prout("***Internal error: Tholian in a bad spot.") return # do nothing if we are blocked - if game.quad[tid.i][tid.j] not in ('.', '#'): + if game.quad[tid.i][tid.j] not in (".", "#"): return here = copy.copy(game.tholian.location) delta = (tid - game.tholian.location).sgn() # move in x axis while here.i != tid.i: here.i += delta.i - if game.quad[here.i][here.j] == '.': + if game.quad[here.i][here.j] == ".": game.tholian.move(here) # move in y axis while here.j != tid.j: here.j += delta.j - if game.quad[here.i][here.j] == '.': + if game.quad[here.i][here.j] == ".": game.tholian.move(here) # check to see if all holes plugged for i in range(QUADSIZE): - if game.quad[0][i] != '#' and game.quad[0][i] != 'T': + if game.quad[0][i] != "#" and game.quad[0][i] != "T": return - if game.quad[QUADSIZE-1][i] != '#' and game.quad[QUADSIZE-1][i] != 'T': + if game.quad[QUADSIZE - 1][i] != "#" and game.quad[QUADSIZE - 1][i] != "T": return - if game.quad[i][0] != '#' and game.quad[i][0] != 'T': + if game.quad[i][0] != "#" and game.quad[i][0] != "T": return - if game.quad[i][QUADSIZE-1] != '#' and game.quad[i][QUADSIZE-1] != 'T': + if game.quad[i][QUADSIZE - 1] != "#" and game.quad[i][QUADSIZE - 1] != "T": return # All plugged up -- Tholian splits - game.quad[game.tholian.location.i][game.tholian.location.j] = '#' - dropin(' ') - prout(crmena(True, 'T', "sector", game.tholian) + _(" completes web.")) + game.quad[game.tholian.location.i][game.tholian.location.j] = "#" + dropin(" ") + prout(crmena(True, "T", "sector", game.tholian) + _(" completes web.")) game.tholian.move(None) return + # Code from battle.c begins here + def cloak(): "Change cloaking-device status." - if game.ship == 'F': + if game.ship == "F": prout(_("Ye Faerie Queene hath no cloaking device.")) return @@ -1056,43 +1179,52 @@ def cloak(): if action == "CLOFF": if game.irhere and game.state.date >= ALGERON and not game.isviolreported: - prout(_("Spock- \"Captain, the Treaty of Algeron is in effect.\n Are you sure this is wise?\"")) + prout( + _( + 'Spock- "Captain, the Treaty of Algeron is in effect.\n Are you sure this is wise?"' + ) + ) if not ja(): return - prout("Engineer Scott- \"Aye, Sir.\"") + prout('Engineer Scott- "Aye, Sir."') game.iscloaked = False if game.irhere and game.state.date >= ALGERON and not game.isviolreported: - prout(_("The Romulan ship discovers you are breaking the Treaty of Algeron!")) + prout( + _("The Romulan ship discovers you are breaking the Treaty of Algeron!") + ) game.ncviol += 1 game.isviolreported = True - #if (neutz and game.state.date >= ALGERON) finish(FCLOAK); + # if (neutz and game.state.date >= ALGERON) finish(FCLOAK); return if action == "CLON": if damaged(DCLOAK): - prout(_("Engineer Scott- \"The cloaking device is damaged, Sir.\"")) + prout(_('Engineer Scott- "The cloaking device is damaged, Sir."')) return if game.condition == "docked": prout(_("You cannot cloak while docked.")) if game.state.date >= ALGERON and not game.isviolreported: - prout(_("Spock- \"Captain, using the cloaking device is a violation")) + prout(_('Spock- "Captain, using the cloaking device is a violation')) prout(_(" of the Treaty of Algeron. Considering the alternatives,")) proutn(_(" are you sure this is wise? ")) if not ja(): return - prout(_("Engineer Scott- \"Cloaking device has engaging, Sir...\"")) + prout(_('Engineer Scott- "Cloaking device has engaging, Sir..."')) attack(True) - prout(_("Engineer Scott- \"Cloaking device has engaged, Sir.\"")) + prout(_('Engineer Scott- "Cloaking device has engaged, Sir."')) game.iscloaked = True if game.irhere and game.state.date >= ALGERON and not game.isviolreported: - prout(_("The Romulan ship discovers you are breaking the Treaty of Algeron!")) + prout( + _("The Romulan ship discovers you are breaking the Treaty of Algeron!") + ) game.ncviol += 1 game.isviolreported = True + def doshield(shraise): "Change shield status." action = "NONE" @@ -1133,7 +1265,7 @@ def doshield(shraise): else: scanner.chew() return - if action == "SHUP": # raise shields + if action == "SHUP": # raise shields if game.shldup: prout(_("Shields already up.")) return @@ -1170,14 +1302,14 @@ def doshield(shraise): prout(_("Insufficient ship energy.")) return game.ididit = True - if game.shield+nrg >= game.inshld: + if game.shield + nrg >= game.inshld: prout(_("Shield energy maximized.")) - if game.shield+nrg > game.inshld: + if game.shield + nrg > game.inshld: prout(_("Excess energy requested returned to ship energy")) - game.energy -= game.inshld-game.shield + game.energy -= game.inshld - game.shield game.shield = game.inshld return - if nrg < 0.0 and game.energy-nrg > game.inenrg: + if nrg < 0.0 and game.energy - nrg > game.inenrg: # Prevent shield drain loophole skip(1) prout(_("Engineering to bridge--")) @@ -1185,49 +1317,51 @@ def doshield(shraise): prout(_(" I can't drain the shields.")) game.ididit = False return - if game.shield+nrg < 0: + if game.shield + nrg < 0: prout(_("All shield energy transferred to ship.")) game.energy += game.shield game.shield = 0.0 return - proutn(_("Scotty- \"")) + proutn(_('Scotty- "')) if nrg > 0: - prout(_("Transferring energy to shields.\"")) + prout(_('Transferring energy to shields."')) else: - prout(_("Draining energy from shields.\"")) + prout(_('Draining energy from shields."')) game.shield += nrg game.energy -= nrg return + def randdevice(): "Choose a device to damage, at random." weights = ( - 105, # DSRSENS: short range scanners 10.5% - 105, # DLRSENS: long range scanners 10.5% - 120, # DPHASER: phasers 12.0% - 120, # DPHOTON: photon torpedoes 12.0% - 25, # DLIFSUP: life support 2.5% - 65, # DWARPEN: warp drive 6.5% - 70, # DIMPULS: impulse engines 6.5% - 135, # DSHIELD: deflector shields 13.5% - 30, # DRADIO: subspace radio 3.0% - 45, # DSHUTTL: shuttle 4.5% - 15, # DCOMPTR: computer 1.5% - 20, # NAVCOMP: navigation system 2.0% - 75, # DTRANSP: transporter 7.5% - 20, # DSHCTRL: high-speed shield controller 2.0% - 10, # DDRAY: death ray 1.0% - 30, # DDSP: deep-space probes 3.0% - 10, # DCLOAK: the cloaking device 1.0 + 105, # DSRSENS: short range scanners 10.5% + 105, # DLRSENS: long range scanners 10.5% + 120, # DPHASER: phasers 12.0% + 120, # DPHOTON: photon torpedoes 12.0% + 25, # DLIFSUP: life support 2.5% + 65, # DWARPEN: warp drive 6.5% + 70, # DIMPULS: impulse engines 6.5% + 135, # DSHIELD: deflector shields 13.5% + 30, # DRADIO: subspace radio 3.0% + 45, # DSHUTTL: shuttle 4.5% + 15, # DCOMPTR: computer 1.5% + 20, # NAVCOMP: navigation system 2.0% + 75, # DTRANSP: transporter 7.5% + 20, # DSHCTRL: high-speed shield controller 2.0% + 10, # DDRAY: death ray 1.0% + 30, # DDSP: deep-space probes 3.0% + 10, # DCLOAK: the cloaking device 1.0 ) - assert(sum(weights) == 1000) + assert sum(weights) == 1000 idx = rnd.integer(1000) wsum = 0 for (i, w) in enumerate(weights): wsum += w if idx < wsum: return i - return None # pragma: no cover + return None # pragma: no cover + def collision(rammed, enemy): "Collision handling for ramming events." @@ -1237,7 +1371,7 @@ def collision(rammed, enemy): skip(2) proutn("***") proutn(crmshp()) - hardness = {'R':1.5, 'C':2.0, 'S':2.5, 'T':0.5, '?':4.0}.get(enemy.type, 1.0) + hardness = {"R": 1.5, "C": 2.0, "S": 2.5, "T": 0.5, "?": 4.0}.get(enemy.type, 1.0) if rammed: proutn(_(" rammed by ")) else: @@ -1255,13 +1389,13 @@ def collision(rammed, enemy): # In the pre-SST2K versions, all devices got equiprobably damaged, # which was silly. Instead, pick up to half the devices at # random according to our weighting table, - ncrits = rnd.integer(NDEVICES//2) + ncrits = rnd.integer(NDEVICES // 2) while ncrits > 0: ncrits -= 1 dev = randdevice() if game.damage[dev] < 0: continue - extradm = (10.0*hardness*rnd.real()+1.0)*game.damfac + extradm = (10.0 * hardness * rnd.real() + 1.0) * game.damfac # Damage for at least time of travel! game.damage[dev] += game.optime + extradm game.shldup = False @@ -1272,19 +1406,20 @@ def collision(rammed, enemy): else: finish(FWON) + def torpedo(origin, bearing, dispersion, number, nburst): "Let a photon torpedo fly" if not damaged(DSRSENS) or game.condition == "docked": setwnd(srscan_window) else: setwnd(message_window) - ac = bearing + 0.25*dispersion # dispersion is a random variable - bullseye = (15.0 - bearing)*0.5235988 + ac = bearing + 0.25 * dispersion # dispersion is a random variable + bullseye = (15.0 - bearing) * 0.5235988 track = course(bearing=ac, distance=QUADSIZE, origin=cartesian(origin)) bumpto = Coord(0, 0) # Loop to move a single torpedo setwnd(message_window) - for step in range(1, QUADSIZE*2): + for step in range(1, QUADSIZE * 2): if not track.nextstep(): break w = track.sector() @@ -1292,53 +1427,65 @@ def torpedo(origin, bearing, dispersion, number, nburst): break iquad = game.quad[w.i][w.j] tracktorpedo(w, step, number, nburst, iquad) - if iquad == '.': + if iquad == ".": continue # hit something setwnd(message_window) if not damaged(DSRSENS) or game.condition == "docked": - skip(1) # start new line after text track - if iquad in ('E', 'F'): # Hit our ship + skip(1) # start new line after text track + if iquad in ("E", "F"): # Hit our ship skip(1) prout(_("Torpedo hits %s.") % crmshp()) - hit = 700.0 + rnd.real(100) - \ - 1000.0 * (w-origin).distance() * math.fabs(math.sin(bullseye-track.angle)) - newcnd() # we're blown out of dock + hit = ( + 700.0 + + rnd.real(100) + - 1000.0 + * (w - origin).distance() + * math.fabs(math.sin(bullseye - track.angle)) + ) + newcnd() # we're blown out of dock if game.landed or game.condition == "docked": - return hit # Cheat if on a planet + return hit # Cheat if on a planet # In the C/FORTRAN version, dispersion was 2.5 radians, which # is 143 degrees, which is almost exactly 4.8 clockface units - displacement = course(track.bearing+rnd.real(-2.4, 2.4), distance=2**0.5) + displacement = course( + track.bearing + rnd.real(-2.4, 2.4), distance=2 ** 0.5 + ) displacement.nextstep() bumpto = displacement.sector() if not bumpto.valid_sector(): return hit - if game.quad[bumpto.i][bumpto.j] == ' ': + if game.quad[bumpto.i][bumpto.j] == " ": finish(FHOLE) return hit - if game.quad[bumpto.i][bumpto.j] != '.': + if game.quad[bumpto.i][bumpto.j] != ".": # can't move into object return hit game.sector = bumpto proutn(crmshp()) - game.quad[w.i][w.j] = '.' + game.quad[w.i][w.j] = "." game.quad[bumpto.i][bumpto.j] = iquad prout(_(" displaced by blast to Sector %s ") % bumpto) for enemy in game.enemies: - enemy.kdist = enemy.kavgd = (game.sector-enemy.location).distance() + enemy.kdist = enemy.kavgd = (game.sector - enemy.location).distance() sortenemies() return None - elif iquad in ('C', 'S', 'R', 'K'): # Hit a regular enemy + elif iquad in ("C", "S", "R", "K"): # Hit a regular enemy # find the enemy - if iquad in ('C', 'S') and rnd.withprob(0.05): + if iquad in ("C", "S") and rnd.withprob(0.05): prout(crmena(True, iquad, "sector", w) + _(" uses anti-photon device;")) prout(_(" torpedo neutralized.")) return None for enemy in game.enemies: if w == enemy.location: kp = math.fabs(enemy.power) - h1 = 700.0 + rnd.integer(100) - \ - 1000.0 * (w-origin).distance() * math.fabs(math.sin(bullseye-track.angle)) + h1 = ( + 700.0 + + rnd.integer(100) + - 1000.0 + * (w - origin).distance() + * math.fabs(math.sin(bullseye - track.angle)) + ) h1 = math.fabs(h1) if kp < h1: h1 = kp @@ -1350,112 +1497,123 @@ def torpedo(origin, bearing, dispersion, number, nburst): deadkl(w, iquad, w) return None proutn(crmena(True, iquad, "sector", w)) - displacement = course(track.bearing+rnd.real(-2.4, 2.4), distance=2**0.5, origin=w) + displacement = course( + track.bearing + rnd.real(-2.4, 2.4), distance=2 ** 0.5, origin=w + ) displacement.nextstep() bumpto = displacement.sector() - if game.quad[bumpto.i][bumpto.j] == ' ': + if game.quad[bumpto.i][bumpto.j] == " ": prout(_(" buffeted into black hole.")) deadkl(w, iquad, bumpto) return None if not bumpto.valid_sector(): prout(_(" damaged but not destroyed.")) return None - if game.quad[bumpto.i][bumpto.j] != '.': + if game.quad[bumpto.i][bumpto.j] != ".": prout(_(" damaged but not destroyed.")) else: - prout(_(" damaged-- displaced by blast to Sector %s ")%bumpto) + prout(_(" damaged-- displaced by blast to Sector %s ") % bumpto) enemy.location = bumpto - game.quad[w.i][w.j] = '.' + game.quad[w.i][w.j] = "." game.quad[bumpto.i][bumpto.j] = iquad for tenemy in game.enemies: - tenemy.kdist = tenemy.kavgd = (game.sector-tenemy.location).distance() + tenemy.kdist = tenemy.kavgd = ( + game.sector - tenemy.location + ).distance() sortenemies() break - else: # pragma: no cover + else: # pragma: no cover prout("Internal error, no enemy where expected!") raise SystemExit(1) return None - elif iquad == 'B': # Hit a base + elif iquad == "B": # Hit a base skip(1) prout(_("***STARBASE DESTROYED..")) game.state.baseq = [x for x in game.state.baseq if x != game.quadrant] - game.quad[w.i][w.j] = '.' + game.quad[w.i][w.j] = "." game.base.invalidate() game.state.galaxy[game.quadrant.i][game.quadrant.j].starbase = False game.state.chart[game.quadrant.i][game.quadrant.j].starbase = False game.state.basekl += 1 newcnd() return None - elif iquad == 'P': # Hit a planet + elif iquad == "P": # Hit a planet prout(crmena(True, iquad, "sector", w) + _(" destroyed.")) game.state.nplankl += 1 game.state.galaxy[game.quadrant.i][game.quadrant.j].planet = None game.iplnet.pclass = "destroyed" game.iplnet = None game.plnet.invalidate() - game.quad[w.i][w.j] = '.' + game.quad[w.i][w.j] = "." if game.landed: # captain perishes on planet finish(FDPLANET) return None - elif iquad == '@': # Hit an inhabited world -- very bad! + elif iquad == "@": # Hit an inhabited world -- very bad! prout(crmena(True, iquad, "sector", w) + _(" destroyed.")) game.state.nworldkl += 1 game.state.galaxy[game.quadrant.i][game.quadrant.j].planet = None game.iplnet.pclass = "destroyed" game.iplnet = None game.plnet.invalidate() - game.quad[w.i][w.j] = '.' + game.quad[w.i][w.j] = "." if game.landed: # captain perishes on planet finish(FDPLANET) prout(_("The torpedo destroyed an inhabited planet.")) return None - elif iquad == '*': # Hit a star + elif iquad == "*": # Hit a star if rnd.withprob(0.9): nova(w) else: - prout(crmena(True, '*', "sector", w) + _(" unaffected by photon blast.")) + prout( + crmena(True, "*", "sector", w) + _(" unaffected by photon blast.") + ) return None - elif iquad == '?': # Hit a thingy + elif iquad == "?": # Hit a thingy skip(1) prouts(_("AAAAIIIIEEEEEEEEAAAAAAAAUUUUUGGGGGHHHHHHHHHHHH!!!")) skip(1) prouts(_(" HACK! HACK! HACK! *CHOKE!* ")) skip(1) proutn(_("Mr. Spock-")) - prouts(_(" \"Fascinating!\"")) + prouts(_(' "Fascinating!"')) skip(1) deadkl(w, iquad, w) return None - elif iquad == ' ': # Black hole + elif iquad == " ": # Black hole skip(1) - prout(crmena(True, ' ', "sector", w) + _(" swallows torpedo.")) + prout(crmena(True, " ", "sector", w) + _(" swallows torpedo.")) return None - elif iquad == '#': # hit the web + elif iquad == "#": # hit the web skip(1) prout(_("***Torpedo absorbed by Tholian web.")) return None - elif iquad == 'T': # Hit a Tholian - h1 = 700.0 + rnd.integer(100) - \ - 1000.0 * (w-origin).distance() * math.fabs(math.sin(bullseye-track.angle)) + elif iquad == "T": # Hit a Tholian + h1 = ( + 700.0 + + rnd.integer(100) + - 1000.0 + * (w - origin).distance() + * math.fabs(math.sin(bullseye - track.angle)) + ) h1 = math.fabs(h1) if h1 >= 600: - game.quad[w.i][w.j] = '.' + game.quad[w.i][w.j] = "." deadkl(w, iquad, w) game.tholian = None return None skip(1) - proutn(crmena(True, 'T', "sector", w)) + proutn(crmena(True, "T", "sector", w)) if rnd.withprob(0.05): prout(_(" survives photon blast.")) return None prout(_(" disappears.")) game.tholian.move(None) - game.quad[w.i][w.j] = '#' - dropin(' ') + game.quad[w.i][w.j] = "#" + dropin(" ") return None - else: # Problem! + else: # Problem! skip(1) proutn("Don't know how to handle torpedo collision with ") proutn(crmena(True, iquad, "sector", w)) @@ -1467,11 +1625,12 @@ def torpedo(origin, bearing, dispersion, number, nburst): prout(_("Torpedo missed.")) return None + def fry(hit): "Critical-hit resolution." - if hit < (275.0-25.0*game.skill)*rnd.real(1.0, 1.5): + if hit < (275.0 - 25.0 * game.skill) * rnd.real(1.0, 1.5): return - ncrit = int(1.0 + hit/(500.0+rnd.real(100))) + ncrit = int(1.0 + hit / (500.0 + rnd.real(100))) proutn(_("***CRITICAL HIT--")) # Select devices and cause damage cdam = [] @@ -1479,19 +1638,23 @@ def fry(hit): while True: j = randdevice() # Cheat to prevent shuttle damage unless on ship - if not (game.damage[j]<0.0 or (j == DSHUTTL and game.iscraft != "onship") or (j == DCLOAK and game.ship != 'E' or j == DDRAY)): + if not ( + game.damage[j] < 0.0 + or (j == DSHUTTL and game.iscraft != "onship") + or (j == DCLOAK and game.ship != "E" or j == DDRAY) + ): break cdam.append(j) - extradm = (hit*game.damfac)/(ncrit*rnd.real(75, 100)) + extradm = (hit * game.damfac) / (ncrit * rnd.real(75, 100)) game.damage[j] += extradm ncrit -= 1 skipcount = 0 for (i, j) in enumerate(cdam): proutn(device[j]) - if skipcount % 3 == 2 and i < len(cdam)-1: + if skipcount % 3 == 2 and i < len(cdam) - 1: skip(1) skipcount += 1 - if i < len(cdam)-1: + if i < len(cdam) - 1: proutn(_(" and ")) prout(_(" damaged.")) if damaged(DSHIELD) and game.shldup: @@ -1501,6 +1664,7 @@ def fry(hit): prout(_("***Cloaking device rendered inoperative.")) game.iscloaked = False + def attack(torps_ok): # bad guy attacks us # torps_ok == False forces use of phasers in an attack @@ -1516,28 +1680,38 @@ def attack(torps_ok): chgfac = 1.0 where = "neither" if game.idebug: - prout("=== ATTACK!") # pragma: no cover + prout("=== ATTACK!") # pragma: no cover # Tholian gets to move before attacking if game.tholian: movetholian() # if you have just entered the RNZ, you'll get a warning - if game.neutz: # The one chance not to be attacked + if game.neutz: # The one chance not to be attacked game.neutz = False return # commanders get a chance to tac-move towards you - if (((game.quadrant in game.state.kcmdr or game.state.kscmdr == game.quadrant) and not game.justin) or game.skill == SKILL_EMERITUS) and torps_ok: - for (bugout, enemy, old, goto) in moveklings(): + if ( + ( + (game.quadrant in game.state.kcmdr or game.state.kscmdr == game.quadrant) + and not game.justin + ) + or game.skill == SKILL_EMERITUS + ) and torps_ok: + for (bugout, enemy, old, goto) in moveklings(): if bugout: # we know about this if either short or long range # sensors are working - if damaged(DSRSENS) and damaged(DLRSENS) \ - and game.condition != "docked": - prout(crmena(True, enemy.type, "sector", old) + \ - (_(" escapes to Quadrant %s (and regains strength).") % goto)) - else: # Enemy still in-sector + if damaged(DSRSENS) and damaged(DLRSENS) and game.condition != "docked": + prout( + crmena(True, enemy.type, "sector", old) + + (_(" escapes to Quadrant %s (and regains strength).") % goto) + ) + else: # Enemy still in-sector if enemy.move(goto): if not damaged(DSRSENS) or game.condition == "docked": - proutn(_("*** %s from Sector %s") % (cramen(enemy.type), enemy.location)) + proutn( + _("*** %s from Sector %s") + % (cramen(enemy.type), enemy.location) + ) if enemy.kdist < old: proutn(_(" advances to ")) else: @@ -1548,7 +1722,7 @@ def attack(torps_ok): if len(game.enemies) == 0 or (len(game.enemies) == 1 and thing.at(game.quadrant)): return # set up partial hits if attack happens during shield status change - pfac = 1.0/game.inshld + pfac = 1.0 / game.inshld if game.shldchg: chgfac = 0.25 + rnd.real(0.5) skip(1) @@ -1557,7 +1731,7 @@ def attack(torps_ok): where = "sector" for enemy in game.enemies: if enemy.power < 0: - continue # too weak to attack + continue # too weak to attack # compute hit strength and diminish shield power r = rnd.real() # Increase chance of photon torpedos if docked or enemy energy is low @@ -1565,38 +1739,45 @@ def attack(torps_ok): r *= 0.25 if enemy.power < 500: r *= 0.25 - if enemy.type in ('T', '?'): + if enemy.type in ("T", "?"): continue # different enemies have different probabilities of throwing a torp - usephasers = not torps_ok or \ - (enemy.type == 'K' and r > 0.0005) or \ - (enemy.type == 'C' and r > 0.015) or \ - (enemy.type == 'R' and r > 0.3) or \ - (enemy.type == 'S' and r > 0.07) or \ - (enemy.type == '?' and r > 0.05) - if usephasers: # Enemy uses phasers + usephasers = ( + not torps_ok + or (enemy.type == "K" and r > 0.0005) + or (enemy.type == "C" and r > 0.015) + or (enemy.type == "R" and r > 0.3) + or (enemy.type == "S" and r > 0.07) + or (enemy.type == "?" and r > 0.05) + ) + if usephasers: # Enemy uses phasers if game.condition == "docked": - continue # Don't waste the effort! - attempt = True # Attempt to attack + continue # Don't waste the effort! + attempt = True # Attempt to attack dustfac = rnd.real(0.8, 0.85) - hit = enemy.power*math.pow(dustfac, enemy.kavgd) + hit = enemy.power * math.pow(dustfac, enemy.kavgd) enemy.power *= 0.75 - else: # Enemy uses photon torpedo + else: # Enemy uses photon torpedo # We should be able to make the bearing() method work here - pcourse = 1.90985*math.atan2(game.sector.j-enemy.location.j, enemy.location.i-game.sector.i) + pcourse = 1.90985 * math.atan2( + game.sector.j - enemy.location.j, enemy.location.i - game.sector.i + ) hit = 0 proutn(_("***TORPEDO INCOMING")) if not damaged(DSRSENS): proutn(_(" From ") + crmena(False, enemy.type, where, enemy.location)) attempt = True prout(" ") - dispersion = (rnd.real()+rnd.real())*0.5 - 0.5 - dispersion += 0.002*enemy.power*dispersion + dispersion = (rnd.real() + rnd.real()) * 0.5 - 0.5 + dispersion += 0.002 * enemy.power * dispersion hit = torpedo(enemy.location, pcourse, dispersion, number=1, nburst=1) if game.unwon() == 0: - finish(FWON) # Klingons did themselves in! - if game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova or game.alldone: - return # Supernova or finished + finish(FWON) # Klingons did themselves in! + if ( + game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova + or game.alldone + ): + return # Supernova or finished if hit is None: continue # incoming phaser or torpedo, shields may dissipate it @@ -1606,8 +1787,8 @@ def attack(torps_ok): if game.condition == "docked": propor *= 2.1 propor = max(propor, 0.1) - hitsh = propor*chgfac*hit+1.0 - absorb = 0.8*hitsh + hitsh = propor * chgfac * hit + 1.0 + absorb = 0.8 * hitsh if absorb > game.shield: absorb = game.shield game.shield -= absorb @@ -1616,12 +1797,12 @@ def attack(torps_ok): if game.condition == "docked": dock(False) # but the shields may take care of it - if propor > 0.1 and hit < 0.005*game.energy: + if propor > 0.1 and hit < 0.005 * game.energy: continue # hit from this opponent got through shields, so take damage ihurt = True proutn(_("%d unit hit") % int(hit)) - if (damaged(DSRSENS) and usephasers) or game.skill<=SKILL_FAIR: + if (damaged(DSRSENS) and usephasers) or game.skill <= SKILL_FAIR: proutn(_(" on the ") + crmshp()) if not damaged(DSRSENS) and usephasers: prout(_(" from ") + crmena(False, enemy.type, where, enemy.location)) @@ -1638,7 +1819,7 @@ def attack(torps_ok): return if not attempt and game.condition == "docked": prout(_("***Enemies decide against attacking your ship.")) - percent = 100.0*pfac*game.shield+0.5 + percent = 100.0 * pfac * game.shield + 0.5 if not ihurt: # Shields fully protect ship proutn(_("Enemy attack reduces shield strength to ")) @@ -1658,8 +1839,8 @@ def attack(torps_ok): icas = rnd.integer(int(hittot * 0.015)) if icas >= 2: skip(1) - prout(_("Mc Coy- \"Sickbay to bridge. We suffered %d casualties") % icas) - prout(_(" in that last attack.\"")) + prout(_('Mc Coy- "Sickbay to bridge. We suffered %d casualties') % icas) + prout(_(' in that last attack."')) game.casual += icas game.state.crew -= icas # After attack, reset average distance to enemies @@ -1668,20 +1849,21 @@ def attack(torps_ok): sortenemies() return + def deadkl(w, etype, mv): "Kill a Klingon, Tholian, Romulan, or Thingy." # Added mv to allow enemy to "move" before dying proutn(crmena(True, etype, "sector", mv)) # Decide what kind of enemy it is and update appropriately - if etype == 'R': + if etype == "R": # Chalk up a Romulan game.state.galaxy[game.quadrant.i][game.quadrant.j].romulans -= 1 game.irhere -= 1 game.state.nromrem -= 1 - elif etype == 'T': + elif etype == "T": # Killed a Tholian game.tholian = None - elif etype == '?': + elif etype == "?": # Killed a Thingy global thing thing = None @@ -1689,16 +1871,16 @@ def deadkl(w, etype, mv): # Killed some type of Klingon game.state.galaxy[game.quadrant.i][game.quadrant.j].klingons -= 1 game.klhere -= 1 - if etype == 'C': + if etype == "C": game.state.kcmdr.remove(game.quadrant) unschedule(FTBEAM) if game.state.kcmdr: - schedule(FTBEAM, expran(1.0*game.incom/len(game.state.kcmdr))) + schedule(FTBEAM, expran(1.0 * game.incom / len(game.state.kcmdr))) if is_scheduled(FCDBAS) and game.battle == game.quadrant: unschedule(FCDBAS) - elif etype == 'K': + elif etype == "K": pass - elif etype == 'S': + elif etype == "S": game.state.nscrem -= 1 game.state.kscmdr.invalidate() game.isatb = 0 @@ -1717,6 +1899,7 @@ def deadkl(w, etype, mv): break return + def targetcheck(w): "Return None if target is invalid, otherwise return a course angle." if not w.valid_sector(): @@ -1724,17 +1907,18 @@ def targetcheck(w): return None delta = Coord() # C code this was translated from is wacky -- why the sign reversal? - delta.j = (w.j - game.sector.j) - delta.i = (game.sector.i - w.i) + delta.j = w.j - game.sector.j + delta.i = game.sector.i - w.i if delta == Coord(0, 0): skip(1) - prout(_("Spock- \"Bridge to sickbay. Dr. McCoy,")) + prout(_('Spock- "Bridge to sickbay. Dr. McCoy,')) prout(_(" I recommend an immediate review of")) prout(_(" the Captain's psychological profile.\"")) scanner.chew() return None return delta.bearing() + def torps(): "Launch photon torpedo salvo." tcourse = [] @@ -1757,14 +1941,14 @@ def torps(): prout(_("%d torpedoes left.") % game.torps) scanner.chew() proutn(_("Number of torpedoes to fire- ")) - continue # Go back around to get a number - else: # key == "IHREAL" + continue # Go back around to get a number + else: # key == "IHREAL" try: n = scanner.int() except TypeError: huh() return - if n <= 0: # abort command + if n <= 0: # abort command scanner.chew() return if n > MAXBURST: @@ -1772,15 +1956,15 @@ def torps(): prout(_("Maximum of %d torpedoes per burst.") % MAXBURST) return if n > game.torps: - scanner.chew() # User requested more torps than available - continue # Go back around - break # All is good, go to next stage + scanner.chew() # User requested more torps than available + continue # Go back around + break # All is good, go to next stage # Next, get targets target = [] for i in range(n): key = scanner.nexttok() if i == 0 and key == "IHEOL": - break # no coordinate waiting, we will try prompting + break # no coordinate waiting, we will try prompting if i == 1 and key == "IHEOL": # direct all torpedoes at one target while i < n: @@ -1799,7 +1983,7 @@ def torps(): if len(target) == 0: # prompt for each one for i in range(n): - proutn(_("Target sector for torpedo number %d- ") % (i+1)) + proutn(_("Target sector for torpedo number %d- ") % (i + 1)) scanner.chew() target.append(scanner.getcoord()) if target[-1] is None: @@ -1812,12 +1996,12 @@ def torps(): for i in range(n): if game.condition != "docked": game.torps -= 1 - dispersion = (rnd.real()+rnd.real())*0.5 -0.5 + dispersion = (rnd.real() + rnd.real()) * 0.5 - 0.5 if math.fabs(dispersion) >= 0.47: # misfire! dispersion *= rnd.real(1.2, 2.2) if n > 0: - prouts(_("***TORPEDO NUMBER %d MISFIRES") % (i+1)) + prouts(_("***TORPEDO NUMBER %d MISFIRES") % (i + 1)) else: prouts(_("***TORPEDO MISFIRES.")) skip(1) @@ -1830,20 +2014,25 @@ def torps(): if game.iscloaked: dispersion *= 1.2 elif game.shldup or game.condition == "docked": - dispersion *= 1.0 + 0.0001*game.shield + dispersion *= 1.0 + 0.0001 * game.shield torpedo(game.sector, tcourse[i], dispersion, number=i, nburst=n) - if game.alldone or game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova: + if ( + game.alldone + or game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova + ): return - if game.unwon()<=0: + if game.unwon() <= 0: finish(FWON) + def overheat(rpow): "Check for phasers overheating." if rpow > 1500: - checkburn = (rpow-1500.0)*0.00038 + checkburn = (rpow - 1500.0) * 0.00038 if rnd.withprob(checkburn): - prout(_("Weapons officer Sulu- \"Phasers overheated, sir.\"")) - game.damage[DPHASER] = game.damfac* rnd.real(1.0, 2.0) * (1.0+checkburn) + prout(_('Weapons officer Sulu- "Phasers overheated, sir."')) + game.damage[DPHASER] = game.damfac * rnd.real(1.0, 2.0) * (1.0 + checkburn) + def checkshctrl(rpow): "Check shield control." @@ -1854,25 +2043,25 @@ def checkshctrl(rpow): # Something bad has happened prouts(_("***RED ALERT! RED ALERT!")) skip(2) - hit = rpow*game.shield/game.inshld - game.energy -= rpow+hit*0.8 - game.shield -= hit*0.2 + hit = rpow * game.shield / game.inshld + game.energy -= rpow + hit * 0.8 + game.shield -= hit * 0.2 if game.energy <= 0.0: - prouts(_("Sulu- \"Captain! Shield malf***********************\"")) + prouts(_('Sulu- "Captain! Shield malf***********************"')) skip(1) stars() finish(FPHASER) return True - prouts(_("Sulu- \"Captain! Shield malfunction! Phaser fire contained!\"")) + prouts(_('Sulu- "Captain! Shield malfunction! Phaser fire contained!"')) skip(2) - prout(_("Lt. Uhura- \"Sir, all decks reporting damage.\"")) - icas = rnd.integer(int(hit*0.012)) + prout(_('Lt. Uhura- "Sir, all decks reporting damage."')) + icas = rnd.integer(int(hit * 0.012)) skip(1) - fry(0.8*hit) + fry(0.8 * hit) if icas: skip(1) - prout(_("McCoy to bridge- \"Severe radiation burns, Jim.")) - prout(_(" %d casualties so far.\"") % icas) + prout(_('McCoy to bridge- "Severe radiation burns, Jim.')) + prout(_(' %d casualties so far."') % icas) game.casual += icas game.state.crew -= icas skip(1) @@ -1881,6 +2070,7 @@ def checkshctrl(rpow): overheat(rpow) return True + def hittem(hits): "Register a phaser hit on Klingons and Romulans." w = Coord() @@ -1890,11 +2080,11 @@ def hittem(hits): if wham == 0: continue dustfac = rnd.real(0.9, 1.0) - hit = wham*math.pow(dustfac, game.enemies[kk].kdist) + hit = wham * math.pow(dustfac, game.enemies[kk].kdist) kpini = game.enemies[kk].power kp = math.fabs(kpini) - if PHASEFAC*hit < kp: - kp = PHASEFAC*hit + if PHASEFAC * hit < kp: + kp = PHASEFAC * hit if game.enemies[kk].power < 0: game.enemies[kk].power -= -kp else: @@ -1912,26 +2102,27 @@ def hittem(hits): skip(1) if kpow == 0: deadkl(w, ienm, w) - if game.unwon()==0: + if game.unwon() == 0: finish(FWON) if game.alldone: return continue - else: # decide whether or not to emasculate klingon + else: # decide whether or not to emasculate klingon # pylint: disable=chained-comparison - if kpow > 0 and rnd.withprob(0.9) and kpow <= rnd.real(0.4, 0.8)*kpini: - prout(_("***Mr. Spock- \"Captain, the vessel at Sector %s")%w) - prout(_(" has just lost its firepower.\"")) + if kpow > 0 and rnd.withprob(0.9) and kpow <= rnd.real(0.4, 0.8) * kpini: + prout(_('***Mr. Spock- "Captain, the vessel at Sector %s') % w) + prout(_(' has just lost its firepower."')) game.enemies[kk].power = -kpow kk += 1 return + def phasers(): "Fire phasers at bad guys." hits = [] kz = 0 k = 1 - irec = 0 # Cheating inhibitor + irec = 0 # Cheating inhibitor ifast = False no = False itarg = True @@ -1960,7 +2151,7 @@ def phasers(): prout(_("Insufficient energy to activate high-speed shield control.")) scanner.chew() return - prout(_("Weapons Officer Sulu- \"High-speed shield control enabled, sir.\"")) + prout(_('Weapons Officer Sulu- "High-speed shield control enabled, sir."')) ifast = True # Original code so convoluted, I re-did it all # (That was Tom Almy talking about the C code, I think -- ESR) @@ -1968,7 +2159,7 @@ def phasers(): key = scanner.nexttok() if key == "IHALPHA": if scanner.sees("manual"): - if len(game.enemies)==0: + if len(game.enemies) == 0: prout(_("There is no enemy present to select.")) scanner.chew() key = "IHEOL" @@ -1980,7 +2171,7 @@ def phasers(): if (not itarg) and len(game.enemies) != 0: automode = "FORCEMAN" else: - if len(game.enemies)==0: + if len(game.enemies) == 0: prout(_("Energy will be expended into space.")) automode = "AUTOMATIC" key = scanner.nexttok() @@ -1990,7 +2181,7 @@ def phasers(): huh() return elif key == "IHREAL": - if len(game.enemies)==0: + if len(game.enemies) == 0: prout(_("Energy will be expended into space.")) automode = "AUTOMATIC" elif not itarg: @@ -1999,7 +2190,7 @@ def phasers(): automode = "AUTOMATIC" else: # "IHEOL" - if len(game.enemies)==0: + if len(game.enemies) == 0: prout(_("Energy will be expended into space.")) automode = "AUTOMATIC" elif not itarg: @@ -2015,13 +2206,18 @@ def phasers(): no = True key = scanner.nexttok() if key != "IHREAL" and len(game.enemies) != 0: - prout(_("Phasers locked on target. Energy available: %.2f")%avail) + prout(_("Phasers locked on target. Energy available: %.2f") % avail) irec = 0 while True: scanner.chew() if not kz: for i in range(len(game.enemies)): - irec += math.fabs(game.enemies[i].power)/(PHASEFAC*math.pow(0.90, game.enemies[i].kdist))*rnd.real(1.01, 1.06) + 1.0 + irec += ( + math.fabs(game.enemies[i].power) + / (PHASEFAC * math.pow(0.90, game.enemies[i].kdist)) + * rnd.real(1.01, 1.06) + + 1.0 + ) kz = 1 proutn(_("%d units required. ") % irec) scanner.chew() @@ -2044,7 +2240,7 @@ def phasers(): if key == "IHALPHA" and scanner.sees("no"): no = True if ifast: - game.energy -= 200 # Go and do it! + game.energy -= 200 # Go and do it! if checkshctrl(rpow): return scanner.chew() @@ -2057,7 +2253,9 @@ def phasers(): hits.append(0.0) if powrem <= 0: continue - hits[i] = math.fabs(game.enemies[i].power)/(PHASEFAC*math.pow(0.90, game.enemies[i].kdist)) + hits[i] = math.fabs(game.enemies[i].power) / ( + PHASEFAC * math.pow(0.90, game.enemies[i].kdist) + ) over = rnd.real(1.01, 1.06) * hits[i] temp = powrem powrem -= hits[i] + over @@ -2073,7 +2271,7 @@ def phasers(): if extra > 0 and not game.alldone: if game.tholian: proutn(_("*** Tholian web absorbs ")) - if len(game.enemies)>0: + if len(game.enemies) > 0: proutn(_("excess ")) prout(_("phaser energy.")) else: @@ -2097,21 +2295,27 @@ def phasers(): aim = game.enemies[k].location ienm = game.quad[aim.i][aim.j] if msgflag: - proutn(_("Energy available= %.2f") % (avail-0.006)) + proutn(_("Energy available= %.2f") % (avail - 0.006)) skip(1) msgflag = False rpow = 0.0 - if damaged(DSRSENS) and \ - not game.sector.distance(aim)<2**0.5 and ienm in ('C', 'S'): + if ( + damaged(DSRSENS) + and not game.sector.distance(aim) < 2 ** 0.5 + and ienm in ("C", "S") + ): prout(cramen(ienm) + _(" can't be located without short range scan.")) scanner.chew() key = "IHEOL" - hits[k] = 0 # prevent overflow -- thanks to Alexei Voitenko + hits[k] = 0 # prevent overflow -- thanks to Alexei Voitenko continue if key == "IHEOL": scanner.chew() if itarg and k > kz: - irec = (abs(game.enemies[k].power)/(PHASEFAC*math.pow(0.9, game.enemies[k].kdist))) * rnd.real(1.01, 1.06) + 1.0 + irec = ( + abs(game.enemies[k].power) + / (PHASEFAC * math.pow(0.9, game.enemies[k].kdist)) + ) * rnd.real(1.01, 1.06) + 1.0 kz = k proutn("(") if not damaged(DCOMPTR): @@ -2129,7 +2333,7 @@ def phasers(): huh() return if key == "IHEOL": - if k == 1: # Let me say I'm baffled by this + if k == 1: # Let me say I'm baffled by this msgflag = True continue if scanner.real < 0: @@ -2143,7 +2347,7 @@ def phasers(): prout(_("Available energy exceeded -- try again.")) scanner.chew() return - key = scanner.nexttok() # scan for next value + key = scanner.nexttok() # scan for next value if rpow == 0.0: # zero energy -- abort scanner.chew() @@ -2158,14 +2362,18 @@ def phasers(): return hittem(hits) game.ididit = True - # Say shield raised or malfunction, if necessary + # Say shield raised or malfunction, if necessary if game.alldone: return if ifast: skip(1) if no == 0: if rnd.withprob(0.01): - prout(_("Sulu- \"Sir, the high-speed shield control has malfunctioned . . .")) + prout( + _( + 'Sulu- "Sir, the high-speed shield control has malfunctioned . . .' + ) + ) prouts(_(" CLICK CLICK POP . . .")) prout(_(" No response, sir!")) game.shldup = False @@ -2177,7 +2385,7 @@ def phasers(): def capture(): - game.ididit = False # Nothing if we fail + game.ididit = False # Nothing if we fail game.optime = 0.0 # Make sure there is room in the brig @@ -2186,57 +2394,64 @@ def capture(): return if damaged(DRADIO): - prout(_("Uhura- \"We have no subspace radio communication, sir.\"")) + prout(_('Uhura- "We have no subspace radio communication, sir."')) return if damaged(DTRANSP): - prout(_("Scotty- \"Transporter damaged, sir.\"")) + prout(_('Scotty- "Transporter damaged, sir."')) return # find out if there are any at all if game.klhere < 1: - prout(_("Uhura- \"Getting no response, sir.\"")) + prout(_('Uhura- "Getting no response, sir."')) return # if there is more than one Klingon, find out which one - # Cruddy, just takes one at random. Should ask the captain. - # Nah, just select the weakest one since it is most likely to - # surrender (Tom Almy mod) - klingons = [e for e in game.enemies if e.type == 'K'] + # Cruddy, just takes one at random. Should ask the captain. + # Nah, just select the weakest one since it is most likely to + # surrender (Tom Almy mod) + klingons = [e for e in game.enemies if e.type == "K"] weakest = sorted(klingons, key=lambda e: e.power)[0] - game.optime = 0.05 # This action will take some time - game.ididit = True # So any others can strike back + game.optime = 0.05 # This action will take some time + game.ididit = True # So any others can strike back # check out that Klingon # The algorithm isn't that great and could use some more # intelligent design # x = 300 + 25*skill; x = game.energy / (weakest.power * len(klingons)) - #prout(_("Stats: energy = %s, kpower = %s, klingons = %s") + # prout(_("Stats: energy = %s, kpower = %s, klingons = %s") # % (game.energy, weakest.power, len(klingons))) - x *= 2.5 # would originally have been equivalent of 1.4, - # but we want command to work more often, more humanely - #prout(_("Prob = %.4f" % x)) - # x = 100; // For testing, of course! + x *= 2.5 # would originally have been equivalent of 1.4, + # but we want command to work more often, more humanely + # prout(_("Prob = %.4f" % x)) + # x = 100; // For testing, of course! if x < rnd.real(100): # guess what, he surrendered!!! prout(_("Klingon captain at %s surrenders.") % weakest.location) i = rnd.real(200) if i > 0: - prout(_("%d Klingons commit suicide rather than be taken captive.") % (200 - i)) + prout( + _("%d Klingons commit suicide rather than be taken captive.") + % (200 - i) + ) if i > game.brigfree: - prout(_("%d Klingons die because there is no room for them in the brig.") % (i-game.brigfree)) + prout( + _("%d Klingons die because there is no room for them in the brig.") + % (i - game.brigfree) + ) i = game.brigfree game.brigfree -= i prout(_("%d captives taken") % i) deadkl(weakest.location, weakest.type, game.sector) - if game.unwon()<=0: + if game.unwon() <= 0: finish(FWON) return - # big surprise, he refuses to surrender + # big surprise, he refuses to surrender prout(_("Fat chance, captain!")) + # Code from events.c begins here. # This isn't a real event queue a la BSD Trek yet -- you can only have one @@ -2244,39 +2459,46 @@ def capture(): # only have one FDISTR/FENSLV/FREPRO sequence going at any given time # BSD Trek, from which we swiped the idea, can have up to 5. + def unschedule(evtype): "Remove an event from the schedule." game.future[evtype].date = FOREVER return game.future[evtype] + def is_scheduled(evtype): "Is an event of specified type scheduled." return game.future[evtype].date != FOREVER + def scheduled(evtype): "When will this event happen?" return game.future[evtype].date + def schedule(evtype, offset): "Schedule an event of specified type." game.future[evtype].date = game.state.date + offset return game.future[evtype] + def postpone(evtype, offset): "Postpone a scheduled event." game.future[evtype].date += offset + def cancelrest(): "Rest period is interrupted by event." if game.resting: skip(1) - proutn(_("Mr. Spock- \"Captain, shall we cancel the rest period?\"")) + proutn(_('Mr. Spock- "Captain, shall we cancel the rest period?"')) if ja(): game.resting = False game.optime = 0.0 return True return False + def events(): "Run through the event queue looking for things to do." i = 0 @@ -2292,14 +2514,14 @@ def events(): def tractorbeam(yank): "Tractor-beaming cases merge here." announce() - game.optime = (10.0/(7.5*7.5))*yank # 7.5 is yank rate (warp 7.5) + game.optime = (10.0 / (7.5 * 7.5)) * yank # 7.5 is yank rate (warp 7.5) skip(1) prout("***" + crmshp() + _(" caught in long range tractor beam--")) # If Kirk & Co. screwing around on planet, handle - atover(True) # atover(true) is Grab + atover(True) # atover(true) is Grab if game.alldone: return - if game.icraft: # Caught in Galileo? + if game.icraft: # Caught in Galileo? finish(FSTRACTOR) return # Check to see if shuttle is aboard @@ -2317,14 +2539,16 @@ def events(): else: game.quadrant = game.state.kcmdr[i] game.sector = randplace(QUADSIZE) - prout(crmshp() + _(" is pulled to Quadrant %s, Sector %s") \ - % (game.quadrant, game.sector)) + prout( + crmshp() + + _(" is pulled to Quadrant %s, Sector %s") % (game.quadrant, game.sector) + ) if game.resting: prout(_("(Remainder of rest/repair period cancelled.)")) game.resting = False if not game.shldup: if not damaged(DSHIELD) and game.shield > 0: - doshield(shraise=True) # raise shields + doshield(shraise=True) # raise shields game.shldchg = False else: prout(_("(Shields not currently useable.)")) @@ -2335,7 +2559,9 @@ def events(): if not game.state.kcmdr: unschedule(FTBEAM) else: - schedule(FTBEAM, game.optime+expran(1.5*game.intime/len(game.state.kcmdr))) + schedule( + FTBEAM, game.optime + expran(1.5 * game.intime / len(game.state.kcmdr)) + ) def destroybase(): "Code merges here for any commander destroying a starbase." @@ -2343,17 +2569,19 @@ def events(): # Handle case where base is in same quadrant as starship if game.battle == game.quadrant: game.state.chart[game.battle.i][game.battle.j].starbase = False - game.quad[game.base.i][game.base.j] = '.' + game.quad[game.base.i][game.base.j] = "." game.base.invalidate() newcnd() skip(1) - prout(_("Spock- \"Captain, I believe the starbase has been destroyed.\"")) + prout(_('Spock- "Captain, I believe the starbase has been destroyed."')) elif game.state.baseq and communicating(): # Get word via subspace radio announce() skip(1) - prout(_("Lt. Uhura- \"Captain, Starfleet Command reports that")) - proutn(_(" the starbase in Quadrant %s has been destroyed by") % game.battle) + prout(_('Lt. Uhura- "Captain, Starfleet Command reports that')) + proutn( + _(" the starbase in Quadrant %s has been destroyed by") % game.battle + ) if game.isatb == 2: prout(_("the Klingon Super-Commander")) else: @@ -2368,20 +2596,32 @@ def events(): game.isatb = 0 else: game.battle.invalidate() - if game.idebug: # pragma: no cover + + if game.idebug: # pragma: no cover prout("=== EVENTS from %.2f to %.2f:" % (game.state.date, fintim)) for i in range(1, NEVENTS): - if i == FSNOVA: proutn("=== Supernova ") - elif i == FTBEAM: proutn("=== T Beam ") - elif i == FSNAP: proutn("=== Snapshot ") - elif i == FBATTAK: proutn("=== Base Attack ") - elif i == FCDBAS: proutn("=== Base Destroy ") - elif i == FSCMOVE: proutn("=== SC Move ") - elif i == FSCDBAS: proutn("=== SC Base Destroy ") - elif i == FDSPROB: proutn("=== Probe Move ") - elif i == FDISTR: proutn("=== Distress Call ") - elif i == FENSLV: proutn("=== Enslavement ") - elif i == FREPRO: proutn("=== Klingon Build ") + if i == FSNOVA: + proutn("=== Supernova ") + elif i == FTBEAM: + proutn("=== T Beam ") + elif i == FSNAP: + proutn("=== Snapshot ") + elif i == FBATTAK: + proutn("=== Base Attack ") + elif i == FCDBAS: + proutn("=== Base Destroy ") + elif i == FSCMOVE: + proutn("=== SC Move ") + elif i == FSCDBAS: + proutn("=== SC Base Destroy ") + elif i == FDSPROB: + proutn("=== Probe Move ") + elif i == FDISTR: + proutn("=== Distress Call ") + elif i == FENSLV: + proutn("=== Enslavement ") + elif i == FREPRO: + proutn("=== Klingon Build ") if is_scheduled(i): prout("%.2f" % (scheduled(i))) else: @@ -2398,17 +2638,17 @@ def events(): if game.future[l].date < datemin: evcode = l if game.idebug: - prout("== Event %d fires" % evcode) # pragma: no cover + prout("== Event %d fires" % evcode) # pragma: no cover datemin = game.future[l].date - xtime = datemin-game.state.date + xtime = datemin - game.state.date if game.iscloaked: - game.energy -= xtime*500.0 + game.energy -= xtime * 500.0 if game.energy <= 0: finish(FNRG) return game.state.date = datemin # Decrement Federation resources and recompute remaining time - game.state.remres -= (game.remkl()+4*len(game.state.kcmdr))*xtime + game.state.remres -= (game.remkl() + 4 * len(game.state.kcmdr)) * xtime game.recompute() if game.state.remtime <= 0: finish(FDEPLETE) @@ -2432,76 +2672,92 @@ def events(): # Don't fix Deathray here for l in range(NDEVICES): if game.damage[l] > 0.0 and l != DDRAY: - if game.damage[l]-repair > 0.0: + if game.damage[l] - repair > 0.0: game.damage[l] -= repair else: game.damage[l] = 0.0 # If radio repaired, update star chart and attack reports if radio_was_broken and not damaged(DRADIO): - prout(_("Lt. Uhura- \"Captain, the sub-space radio is working and")) + prout(_('Lt. Uhura- "Captain, the sub-space radio is working and')) prout(_(" surveillance reports are coming in.")) skip(1) if not game.iseenit: attackreport(False) game.iseenit = True rechart() - prout(_(" The star chart is now up to date.\"")) + prout(_(' The star chart is now up to date."')) skip(1) # Cause extraneous event EVCODE to occur game.optime -= xtime - if evcode == FSNOVA: # Supernova + if evcode == FSNOVA: # Supernova announce() supernova(None) - schedule(FSNOVA, expran(0.5*game.intime)) + schedule(FSNOVA, expran(0.5 * game.intime)) if game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova: return - elif evcode == FSPY: # Check with spy to see if SC should tractor beam - if game.state.nscrem == 0 or game.iscloaked or \ - ictbeam or istract or \ - game.condition == "docked" or game.isatb == 1 or game.iscate: + elif evcode == FSPY: # Check with spy to see if SC should tractor beam + if ( + game.state.nscrem == 0 + or game.iscloaked + or ictbeam + or istract + or game.condition == "docked" + or game.isatb == 1 + or game.iscate + ): return - if game.ientesc or \ - (game.energy<2000 and game.torps<4 and game.shield < 1250) or \ - (damaged(DPHASER) and (damaged(DPHOTON) or game.torps<4)) or \ - (damaged(DSHIELD) and \ - (game.energy < 2500 or damaged(DPHASER)) and \ - (game.torps < 5 or damaged(DPHOTON))): + if ( + game.ientesc + or (game.energy < 2000 and game.torps < 4 and game.shield < 1250) + or (damaged(DPHASER) and (damaged(DPHOTON) or game.torps < 4)) + or ( + damaged(DSHIELD) + and (game.energy < 2500 or damaged(DPHASER)) + and (game.torps < 5 or damaged(DPHOTON)) + ) + ): # Tractor-beam her! istract = ictbeam = True - tractorbeam((game.state.kscmdr-game.quadrant).distance()) + tractorbeam((game.state.kscmdr - game.quadrant).distance()) else: return - elif evcode == FTBEAM: # Tractor beam + elif evcode == FTBEAM: # Tractor beam if not game.state.kcmdr: unschedule(FTBEAM) continue i = rnd.integer(len(game.state.kcmdr)) - yank = (game.state.kcmdr[i]-game.quadrant).distance() + yank = (game.state.kcmdr[i] - game.quadrant).distance() if istract or game.condition == "docked" or game.iscloaked or yank == 0: # Drats! Have to reschedule - schedule(FTBEAM, - game.optime + expran(1.5*game.intime/len(game.state.kcmdr))) + schedule( + FTBEAM, + game.optime + expran(1.5 * game.intime / len(game.state.kcmdr)), + ) continue ictbeam = True tractorbeam(yank) - elif evcode == FSNAP: # Snapshot of the universe (for time warp) + elif evcode == FSNAP: # Snapshot of the universe (for time warp) game.snapsht = copy.deepcopy(game.state) game.state.snap = True schedule(FSNAP, expran(0.5 * game.intime)) - elif evcode == FBATTAK: # Commander attacks starbase + elif evcode == FBATTAK: # Commander attacks starbase if not game.state.kcmdr or not game.state.baseq: # no can do unschedule(FBATTAK) unschedule(FCDBAS) continue - ibq = None # Force battle location to persist past loop + ibq = None # Force battle location to persist past loop try: for ibq in game.state.baseq: for cmdr in game.state.kcmdr: - if ibq == cmdr and ibq != game.quadrant and ibq != game.state.kscmdr: + if ( + ibq == cmdr + and ibq != game.quadrant + and ibq != game.state.kscmdr + ): raise JumpOut # no match found -- try later - schedule(FBATTAK, expran(0.3*game.intime)) + schedule(FBATTAK, expran(0.3 * game.intime)) unschedule(FCDBAS) continue except JumpOut: @@ -2509,33 +2765,37 @@ def events(): # commander + starbase combination found -- launch attack game.battle = ibq schedule(FCDBAS, rnd.real(1.0, 4.0)) - if game.isatb: # extra time if SC already attacking - postpone(FCDBAS, scheduled(FSCDBAS)-game.state.date) - game.future[FBATTAK].date = game.future[FCDBAS].date + expran(0.3*game.intime) + if game.isatb: # extra time if SC already attacking + postpone(FCDBAS, scheduled(FSCDBAS) - game.state.date) + game.future[FBATTAK].date = game.future[FCDBAS].date + expran( + 0.3 * game.intime + ) game.iseenit = False if not communicating(): - continue # No warning :-( + continue # No warning :-( game.iseenit = True announce() skip(1) - prout(_("Lt. Uhura- \"Captain, the starbase in Quadrant %s") % game.battle) + prout(_('Lt. Uhura- "Captain, the starbase in Quadrant %s') % game.battle) prout(_(" reports that it is under attack and that it can")) - prout(_(" hold out only until stardate %d.\"") % (int(scheduled(FCDBAS)))) + prout(_(' hold out only until stardate %d."') % (int(scheduled(FCDBAS)))) if cancelrest(): return - elif evcode == FSCDBAS: # Supercommander destroys base + elif evcode == FSCDBAS: # Supercommander destroys base unschedule(FSCDBAS) game.isatb = 2 if not game.state.galaxy[game.state.kscmdr.i][game.state.kscmdr.j].starbase: - continue # WAS RETURN! + continue # WAS RETURN! hold = game.battle game.battle = game.state.kscmdr destroybase() - elif evcode == FCDBAS: # Commander succeeds in destroying base + elif evcode == FCDBAS: # Commander succeeds in destroying base if evcode == FCDBAS: unschedule(FCDBAS) - if not game.state.baseq \ - or not game.state.galaxy[game.battle.i][game.battle.j].starbase: + if ( + not game.state.baseq + or not game.state.galaxy[game.battle.i][game.battle.j].starbase + ): game.battle.invalidate() continue # find the lucky pair @@ -2546,31 +2806,42 @@ def events(): # No action to take after all continue destroybase() - elif evcode == FSCMOVE: # Supercommander moves + elif evcode == FSCMOVE: # Supercommander moves schedule(FSCMOVE, 0.2777) - if not game.ientesc and not istract and game.isatb != 1 and \ - (not game.iscate or not game.justin): + if ( + not game.ientesc + and not istract + and game.isatb != 1 + and (not game.iscate or not game.justin) + ): supercommander() - elif evcode == FDSPROB: # Move deep space probe + elif evcode == FDSPROB: # Move deep space probe schedule(FDSPROB, 0.01) if not game.probe.nextstep(): - if not game.probe.quadrant().valid_quadrant() or \ - game.state.galaxy[game.probe.quadrant().i][game.probe.quadrant().j].supernova: + if ( + not game.probe.quadrant().valid_quadrant() + or game.state.galaxy[game.probe.quadrant().i][ + game.probe.quadrant().j + ].supernova + ): # Left galaxy or ran into supernova if communicating(): announce() skip(1) - proutn(_("Lt. Uhura- \"The deep space probe ")) + proutn(_('Lt. Uhura- "The deep space probe ')) if not game.probe.quadrant().valid_quadrant(): - prout(_("has left the galaxy.\"")) + prout(_('has left the galaxy."')) else: - prout(_("is no longer transmitting.\"")) + prout(_('is no longer transmitting."')) unschedule(FDSPROB) continue if communicating(): - #announce() + # announce() skip(1) - prout(_("Lt. Uhura- \"The deep space probe is now in Quadrant %s.\"") % game.probe.quadrant()) + prout( + _('Lt. Uhura- "The deep space probe is now in Quadrant %s."') + % game.probe.quadrant() + ) pquad = game.probe.quadrant() pdest = game.state.galaxy[pquad.i][pquad.j] if communicating(): @@ -2578,13 +2849,13 @@ def events(): game.state.chart[pquad.i][pquad.j].starbase = pdest.starbase game.state.chart[pquad.i][pquad.j].stars = pdest.stars pdest.charted = True - game.probe.moves -= 1 # One less to travel + game.probe.moves -= 1 # One less to travel if game.probe.arrived() and game.isarmed and pdest.stars: - supernova(game.probe.quadrant()) # fire in the hole! + supernova(game.probe.quadrant()) # fire in the hole! unschedule(FDSPROB) if game.state.galaxy[pquad.i][pquad.j].supernova: return - elif evcode == FDISTR: # inhabited system issues distress call + elif evcode == FDISTR: # inhabited system issues distress call unschedule(FDISTR) # try a whole bunch of times to find something suitable for i in range(100): @@ -2594,14 +2865,21 @@ def events(): # supernova'ed, and which has some Klingons in it w = randplace(GALSIZE) q = game.state.galaxy[w.i][w.j] - if not (game.quadrant == w or q.planet is None or \ - not q.planet.inhabited or \ - q.supernova or q.status!="secure" or q.klingons<=0): + if not ( + game.quadrant == w + or q.planet is None + or not q.planet.inhabited + or q.supernova + or q.status != "secure" + or q.klingons <= 0 + ): break else: # can't seem to find one; ignore this call if game.idebug: - prout("=== Couldn't find location for distress event.") # pragma: no cover + prout( + "=== Couldn't find location for distress event." + ) # pragma: no cover continue # got one!! Schedule its enslavement ev = schedule(FENSLV, expran(game.intime)) @@ -2609,12 +2887,14 @@ def events(): q.status = "distressed" # tell the captain about it if we can if communicating(): - prout(_("Uhura- Captain, %s in Quadrant %s reports it is under attack") \ - % (q.planet, repr(w))) + prout( + _("Uhura- Captain, %s in Quadrant %s reports it is under attack") + % (q.planet, repr(w)) + ) prout(_("by a Klingon invasion fleet.")) if cancelrest(): return - elif evcode == FENSLV: # starsystem is enslaved + elif evcode == FENSLV: # starsystem is enslaved ev = unschedule(FENSLV) # see if current distress call still active q = game.state.galaxy[ev.quadrant.i][ev.quadrant.j] @@ -2629,10 +2909,9 @@ def events(): # report the disaster if we can if communicating(): - prout(_("Uhura- We've lost contact with starsystem %s") % \ - q.planet) + prout(_("Uhura- We've lost contact with starsystem %s") % q.planet) prout(_("in Quadrant %s.\n") % ev.quadrant) - elif evcode == FREPRO: # Klingon reproduces + elif evcode == FREPRO: # Klingon reproduces # If we ever switch to a real event queue, we'll need to # explicitly retrieve and restore the x and y. ev = schedule(FREPRO, expran(1.0 * game.intime)) @@ -2642,7 +2921,7 @@ def events(): q.status = "secure" continue if game.remkl() >= MAXKLGAME: - continue # full right now + continue # full right now # reproduce one Klingon w = ev.quadrant m = Coord() @@ -2666,7 +2945,7 @@ def events(): q.klingons += 1 if game.quadrant == w: game.klhere += 1 - newkling() # also adds it to game.enemies + newkling() # also adds it to game.enemies # recompute time left game.recompute() if communicating(): @@ -2679,12 +2958,13 @@ def events(): proutn(_("near %s ") % q.planet) prout(_("in Quadrant %s.") % w) + def wait(): "Wait on events." game.ididit = False while True: key = scanner.nexttok() - if key != "IHEOL": + if key != "IHEOL": break proutn(_("How long? ")) scanner.chew() @@ -2722,7 +3002,7 @@ def wait(): return delay -= temp # Repair Deathray if long rest at starbase - if origTime-delay >= 9.99 and game.condition == "docked": + if origTime - delay >= 9.99 and game.condition == "docked": game.damage[DDRAY] = 0.0 # leave if quadrant supernovas if game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova: @@ -2730,17 +3010,20 @@ def wait(): game.resting = False game.optime = 0.0 + def nova(nov): "Star goes nova." ncourse = (0.0, 10.5, 12.0, 1.5, 9.0, 0.0, 3.0, 7.5, 6.0, 4.5) - newc = Coord(); neighbor = Coord(); bump = Coord(0, 0) + newc = Coord() + neighbor = Coord() + bump = Coord(0, 0) if rnd.withprob(0.05): # Wow! We've supernova'ed supernova(game.quadrant) return # handle initial nova - game.quad[nov.i][nov.j] = '.' - prout(crmena(False, '*', "sector", nov) + _(" novas.")) + game.quad[nov.i][nov.j] = "." + prout(crmena(False, "*", "sector", nov) + _(" novas.")) game.state.galaxy[game.quadrant.i][game.quadrant.j].stars -= 1 game.state.starkl += 1 # Set up queue to recursively trigger adjacent stars @@ -2749,8 +3032,8 @@ def nova(nov): while hits: offset = Coord() start = hits.pop() - for offset.i in range(-1, 1+1): - for offset.j in range(-1, 1+1): + for offset.i in range(-1, 1 + 1): + for offset.j in range(-1, 1 + 1): if offset.j == 0 and offset.i == 0: continue neighbor = start + offset @@ -2758,9 +3041,9 @@ def nova(nov): continue iquad = game.quad[neighbor.i][neighbor.j] # Empty space ends reaction - if iquad in ('.', '?', ' ', 'T', '#'): + if iquad in (".", "?", " ", "T", "#"): pass - elif iquad == '*': # Affect another star + elif iquad == "*": # Affect another star if rnd.withprob(0.05): # This star supernovas supernova(game.quadrant) @@ -2769,33 +3052,35 @@ def nova(nov): hits.append(neighbor) game.state.galaxy[game.quadrant.i][game.quadrant.j].stars -= 1 game.state.starkl += 1 - proutn(crmena(True, '*', "sector", neighbor)) + proutn(crmena(True, "*", "sector", neighbor)) prout(_(" novas.")) - game.quad[neighbor.i][neighbor.j] = '.' + game.quad[neighbor.i][neighbor.j] = "." kount += 1 - elif iquad in ('P', '@'): # Destroy planet + elif iquad in ("P", "@"): # Destroy planet game.state.galaxy[game.quadrant.i][game.quadrant.j].planet = None - if iquad == 'P': + if iquad == "P": game.state.nplankl += 1 else: game.state.nworldkl += 1 - prout(crmena(True, 'B', "sector", neighbor) + _(" destroyed.")) + prout(crmena(True, "B", "sector", neighbor) + _(" destroyed.")) game.iplnet.pclass = "destroyed" game.iplnet = None game.plnet.invalidate() if game.landed: finish(FPNOVA) return - game.quad[neighbor.i][neighbor.j] = '.' - elif iquad == 'B': # Destroy base + game.quad[neighbor.i][neighbor.j] = "." + elif iquad == "B": # Destroy base game.state.galaxy[game.quadrant.i][game.quadrant.j].starbase = False - game.state.baseq = [x for x in game.state.baseq if x!= game.quadrant] + game.state.baseq = [ + x for x in game.state.baseq if x != game.quadrant + ] game.base.invalidate() game.state.basekl += 1 newcnd() - prout(crmena(True, 'B', "sector", neighbor) + _(" destroyed.")) - game.quad[neighbor.i][neighbor.j] = '.' - elif iquad in ('E', 'F'): # Buffet ship + prout(crmena(True, "B", "sector", neighbor) + _(" destroyed.")) + game.quad[neighbor.i][neighbor.j] = "." + elif iquad in ("E", "F"): # Buffet ship prout(_("***Starship buffeted by nova.")) if game.shldup: if game.shield >= 2000.0: @@ -2806,7 +3091,9 @@ def nova(nov): game.shield = 0.0 game.shldup = False prout(_("***Shields knocked out.")) - game.damage[DSHIELD] += 0.005*game.damfac*rnd.real()*diff + game.damage[DSHIELD] += ( + 0.005 * game.damfac * rnd.real() * diff + ) else: game.energy -= 2000.0 if game.energy <= 0: @@ -2814,20 +3101,20 @@ def nova(nov): return # add in course nova contributes to kicking starship if hits: - bump += (game.sector-hits[-1]).sgn() - elif iquad == 'K': # kill klingon + bump += (game.sector - hits[-1]).sgn() + elif iquad == "K": # kill klingon deadkl(neighbor, iquad, neighbor) - elif iquad in ('C','S','R'): # Damage/destroy big enemies + elif iquad in ("C", "S", "R"): # Damage/destroy big enemies target = None for ll in range(len(game.enemies)): if game.enemies[ll].location == neighbor: target = game.enemies[ll] break if target is not None: - target.power -= 800.0 # If firepower is lost, die + target.power -= 800.0 # If firepower is lost, die if target.power <= 0.0: deadkl(neighbor, iquad, neighbor) - continue # neighbor loop + continue # neighbor loop # Else enemy gets flung by the blast wave newc = neighbor + neighbor - start proutn(crmena(True, iquad, "sector", neighbor) + _(" damaged")) @@ -2836,22 +3123,25 @@ def nova(nov): skip(1) continue iquad1 = game.quad[newc.i][newc.j] - if iquad1 == ' ': - proutn(_(", blasted into ") + crmena(False, ' ', "sector", newc)) + if iquad1 == " ": + proutn( + _(", blasted into ") + + crmena(False, " ", "sector", newc) + ) skip(1) deadkl(neighbor, iquad, newc) continue - if iquad1 != '.': + if iquad1 != ".": # can't move into something else skip(1) continue proutn(_(", buffeted to Sector %s") % newc) - game.quad[neighbor.i][neighbor.j] = '.' + game.quad[neighbor.i][neighbor.j] = "." game.quad[newc.i][newc.j] = iquad target.move(newc) # Starship affected by nova -- kick it away. - dist = kount*0.1 - direc = ncourse[3*(bump.i+1)+bump.j+2] + dist = kount * 0.1 + direc = ncourse[3 * (bump.i + 1) + bump.j + 2] if direc == 0.0: dist = 0.0 if dist == 0.0: @@ -2864,9 +3154,11 @@ def nova(nov): game.optime = scourse.time(w=4) return + def supernova(w): "Star goes supernova." - num = 0; npdead = 0 + num = 0 + npdead = 0 if w is not None: nq = copy.copy(w) else: @@ -2877,16 +3169,16 @@ def supernova(w): for nq.j in range(GALSIZE): nstars += game.state.galaxy[nq.i][nq.j].stars if nstars == 0: - return # nothing to supernova exists + return # nothing to supernova exists num = rnd.integer(nstars) + 1 for nq.i in range(GALSIZE): for nq.j in range(GALSIZE): num -= game.state.galaxy[nq.i][nq.j].stars if num <= 0: break - if num <=0: + if num <= 0: break - if game.idebug: # pragma: no cover + if game.idebug: # pragma: no cover proutn("=== Super nova here?") if ja(): nq = game.quadrant @@ -2894,7 +3186,10 @@ def supernova(w): # it isn't here, or we just entered (treat as enroute) if communicating(): skip(1) - prout(_("Message from Starfleet Command Stardate %.2f") % game.state.date) + prout( + _("Message from Starfleet Command Stardate %.2f") + % game.state.date + ) prout(_(" Supernova in Quadrant %s; caution advised.") % nq) else: ns = Coord() @@ -2902,17 +3197,17 @@ def supernova(w): num = rnd.integer(game.state.galaxy[nq.i][nq.j].stars) + 1 for ns.i in range(QUADSIZE): for ns.j in range(QUADSIZE): - if game.quad[ns.i][ns.j]=='*': + if game.quad[ns.i][ns.j] == "*": num -= 1 - if num==0: + if num == 0: break - if num==0: + if num == 0: break skip(1) prouts(_("***RED ALERT! RED ALERT!")) skip(1) prout(_("***Incipient supernova detected at Sector %s") % ns) - if (ns.i-game.sector.i)**2 + (ns.j-game.sector.j)**2 <= 2.1: + if (ns.i - game.sector.i) ** 2 + (ns.j - game.sector.j) ** 2 <= 2.1: proutn(_("Emergency override attempts t")) prouts("***************") skip(1) @@ -2922,14 +3217,14 @@ def supernova(w): game.state.galaxy[nq.i][nq.j].klingons = 0 if nq == game.state.kscmdr: # did in the Supercommander! - game.state.nscrem = game.state.kscmdr.i = game.state.kscmdr.j = game.isatb = 0 + game.state.nscrem = game.state.kscmdr.i = game.state.kscmdr.j = game.isatb = 0 game.iscate = False unschedule(FSCMOVE) unschedule(FSCDBAS) # Changing this to [w for w in game.state.kcmdr if w != nq] # causes regression-test failure survivors = list(filter(lambda w: w != nq, game.state.kcmdr)) - #comkills = len(game.state.kcmdr) - len(survivors) + # comkills = len(game.state.kcmdr) - len(survivors) game.state.kcmdr = survivors if not game.state.kcmdr: unschedule(FTBEAM) @@ -2953,7 +3248,7 @@ def supernova(w): if game.quadrant == nq or communicating(): game.state.galaxy[nq.i][nq.j].supernova = True # If supernova destroys last Klingons give special message - if game.unwon()==0 and nq != game.quadrant: + if game.unwon() == 0 and nq != game.quadrant: skip(2) if w is None: prout(_("Lucky you!")) @@ -2965,21 +3260,30 @@ def supernova(w): finish(FSNOVAED) return + # Code from finish.c ends here. + def selfdestruct(): "Self-destruct maneuver. Finish with a BANG!" scanner.chew() if damaged(DCOMPTR): prout(_("Computer damaged; cannot execute destruct sequence.")) return - prouts(_("---WORKING---")); skip(1) - prouts(_("SELF-DESTRUCT-SEQUENCE-ACTIVATED")); skip(1) - prouts(" 10"); skip(1) - prouts(" 9"); skip(1) - prouts(" 8"); skip(1) - prouts(" 7"); skip(1) - prouts(" 6"); skip(1) + prouts(_("---WORKING---")) + skip(1) + prouts(_("SELF-DESTRUCT-SEQUENCE-ACTIVATED")) + skip(1) + prouts(" 10") + skip(1) + prouts(" 9") + skip(1) + prouts(" 8") + skip(1) + prouts(" 7") + skip(1) + prouts(" 6") + skip(1) skip(1) prout(_("ENTER-CORRECT-PASSWORD-TO-CONTINUE-")) skip(1) @@ -2994,20 +3298,27 @@ def selfdestruct(): prouts(_("CONTINUITY-EFFECTED")) skip(2) return - prouts(_("PASSWORD-ACCEPTED")); skip(1) - prouts(" 5"); skip(1) - prouts(" 4"); skip(1) - prouts(" 3"); skip(1) - prouts(" 2"); skip(1) - prouts(" 1"); skip(1) + prouts(_("PASSWORD-ACCEPTED")) + skip(1) + prouts(" 5") + skip(1) + prouts(" 4") + skip(1) + prouts(" 3") + skip(1) + prouts(" 2") + skip(1) + prouts(" 1") + skip(1) if rnd.withprob(0.15): prouts(_("GOODBYE-CRUEL-WORLD")) skip(1) kaboom() + def kaboom(): stars() - if game.ship=='E': + if game.ship == "E": prouts("***") prouts(_("********* Entropy of %s maximized *********") % crmshp()) skip(1) @@ -3016,36 +3327,41 @@ def kaboom(): if len(game.enemies) != 0: whammo = 25.0 * game.energy for e in game.enemies[::-1]: - if e.power*e.kdist <= whammo: + if e.power * e.kdist <= whammo: deadkl(e.location, game.quad[e.location.i][e.location.j], e.location) finish(FDILITHIUM) + def killrate(): "Compute our rate of kils over time." elapsed = game.state.date - game.indate - if elapsed == 0: # Avoid divide-by-zero error if calculated on turn 0 + if elapsed == 0: # Avoid divide-by-zero error if calculated on turn 0 return 0 else: - starting = (game.inkling + game.incom + game.inscom) + starting = game.inkling + game.incom + game.inscom remaining = game.unwon() - return (starting - remaining)/elapsed + return (starting - remaining) / elapsed + def badpoints(): "Compute demerits." - badpt = 5.0*game.state.starkl + \ - game.casual + \ - 10.0*game.state.nplankl + \ - 300*game.state.nworldkl + \ - 45.0*game.nhelp +\ - 100.0*game.state.basekl +\ - 3.0*game.abandoned +\ - 100*game.ncviol - if game.ship == 'F': + badpt = ( + 5.0 * game.state.starkl + + game.casual + + 10.0 * game.state.nplankl + + 300 * game.state.nworldkl + + 45.0 * game.nhelp + + 100.0 * game.state.basekl + + 3.0 * game.abandoned + + 100 * game.ncviol + ) + if game.ship == "F": badpt += 100.0 elif game.ship is None: badpt += 200.0 return badpt + def finish(ifin): # end the game, with appropriate notifications igotit = False @@ -3053,37 +3369,45 @@ def finish(ifin): skip(3) prout(_("It is stardate %.1f.") % game.state.date) skip(1) - if ifin == FWON: # Game has been won + if ifin == FWON: # Game has been won if game.state.nromrem != 0: - prout(_("The remaining %d Romulans surrender to Starfleet Command.") % - game.state.nromrem) + prout( + _("The remaining %d Romulans surrender to Starfleet Command.") + % game.state.nromrem + ) prout(_("You have smashed the Klingon invasion fleet and saved")) prout(_("the Federation.")) - if game.alive and game.brigcapacity-game.brigfree > 0: - game.kcaptured += game.brigcapacity-game.brigfree - prout(_("The %d captured Klingons are transferred to Star Fleet Command.") % (game.brigcapacity-game.brigfree)) + if game.alive and game.brigcapacity - game.brigfree > 0: + game.kcaptured += game.brigcapacity - game.brigfree + prout( + _("The %d captured Klingons are transferred to Star Fleet Command.") + % (game.brigcapacity - game.brigfree) + ) game.gamewon = True if game.alive: badpt = badpoints() if badpt < 100.0: - badpt = 0.0 # Close enough! + badpt = 0.0 # Close enough! # killsPerDate >= RateMax - if game.state.date-game.indate < 5.0 or \ - killrate() >= 0.1*game.skill*(game.skill+1.0) + 0.1 + 0.008*badpt: + if ( + game.state.date - game.indate < 5.0 + or killrate() + >= 0.1 * game.skill * (game.skill + 1.0) + 0.1 + 0.008 * badpt + ): skip(1) prout(_("In fact, you have done so well that Starfleet Command")) if game.skill == SKILL_NOVICE: - prout(_("promotes you one step in rank from \"Novice\" to \"Fair\".")) + prout(_('promotes you one step in rank from "Novice" to "Fair".')) elif game.skill == SKILL_FAIR: - prout(_("promotes you one step in rank from \"Fair\" to \"Good\".")) + prout(_('promotes you one step in rank from "Fair" to "Good".')) elif game.skill == SKILL_GOOD: - prout(_("promotes you one step in rank from \"Good\" to \"Expert\".")) + prout(_('promotes you one step in rank from "Good" to "Expert".')) elif game.skill == SKILL_EXPERT: prout(_("promotes you to Commodore Emeritus.")) skip(1) prout(_("Now that you think you're really good, try playing")) - prout(_("the \"Emeritus\" game. It will splatter your ego.")) + prout(_('the "Emeritus" game. It will splatter your ego.')) elif game.skill == SKILL_EMERITUS: skip(1) proutn(_("Computer- ")) @@ -3105,7 +3429,9 @@ def finish(ifin): if game.thawed and not game.idebug: prout(_("You cannot get a citation, so...")) else: - proutn(_("Do you want your Commodore Emeritus Citation printed? ")) + proutn( + _("Do you want your Commodore Emeritus Citation printed? ") + ) scanner.chew() if ja(): igotit = True @@ -3116,12 +3442,12 @@ def finish(ifin): if igotit: plaque() return - elif ifin == FDEPLETE: # Federation Resources Depleted + elif ifin == FDEPLETE: # Federation Resources Depleted prout(_("Your time has run out and the Federation has been")) prout(_("conquered. Your starship is now Klingon property,")) prout(_("and you are put on trial as a war criminal. On the")) proutn(_("basis of your record, you are ")) - if game.unwon()*3.0 > (game.inkling + game.incom + game.inscom): + if game.unwon() * 3.0 > (game.inkling + game.incom + game.inscom): prout(_("acquitted.")) skip(1) prout(_("LIVE LONG AND PROSPER.")) @@ -3176,7 +3502,7 @@ def finish(ifin): prout(_("You are left with your landing party on")) prout(_("a wild jungle planet inhabited by primitive cannibals.")) skip(1) - prout(_("They are very fond of \"Captain Kirk\" soup.")) + prout(_('They are very fond of "Captain Kirk" soup.')) skip(1) prout(_("Without your leadership, the %s is destroyed.") % crmshp()) elif ifin == FDPLANET: @@ -3222,21 +3548,25 @@ def finish(ifin): elif ifin == FCREW: prout(_("Your last crew member has died.")) if ifin != FWON and ifin != FCLOAK and game.iscloaked: - prout(_("Your ship was cloaked so your subspace radio did not receive anything.")) + prout( + _("Your ship was cloaked so your subspace radio did not receive anything.") + ) prout(_("You may have missed some warning messages.")) skip(1) - if game.ship == 'F': + if game.ship == "F": game.ship = None - elif game.ship == 'E': - game.ship = 'F' + elif game.ship == "E": + game.ship = "F" game.alive = False if game.unwon() != 0: - goodies = game.state.remres/game.inresor - baddies = (game.remkl() + 2.0*len(game.state.kcmdr))/(game.inkling+2.0*game.incom) - if goodies/baddies >= rnd.real(1.0, 1.5): + goodies = game.state.remres / game.inresor + baddies = (game.remkl() + 2.0 * len(game.state.kcmdr)) / ( + game.inkling + 2.0 * game.incom + ) + if goodies / baddies >= rnd.real(1.0, 1.5): prout(_("As a result of your actions, a treaty with the Klingon")) prout(_("Empire has been signed. The terms of the treaty are")) - if goodies/baddies >= rnd.real(3.0): + if goodies / baddies >= rnd.real(3.0): prout(_("favorable to the Federation.")) skip(1) prout(_("Congratulations!")) @@ -3251,7 +3581,8 @@ def finish(ifin): prout(_("to think about pigeons.")) game.gamewon = True score() - scanner.chew() # Clean up leftovers + scanner.chew() # Clean up leftovers + def score(): "Compute player's score." @@ -3259,93 +3590,135 @@ def score(): if (timused == 0 or game.unwon() != 0) and timused < 5.0: timused = 5.0 game.perdate = killrate() - ithperd = 500*game.perdate + 0.5 + ithperd = 500 * game.perdate + 0.5 iwon = 0 if game.gamewon: - iwon = 100*game.skill - if game.ship == 'E': + iwon = 100 * game.skill + if game.ship == "E": klship = 0 - elif game.ship == 'F': + elif game.ship == "F": klship = 1 else: klship = 2 - dead_ordinaries= game.inkling - game.remkl() + len(game.state.kcmdr) + game.state.nscrem - game.score = 10*(dead_ordinaries)\ - + 50*(game.incom - len(game.state.kcmdr)) \ - + ithperd + iwon \ - + 20*(game.inrom - game.state.nromrem) \ - + 200*(game.inscom - game.state.nscrem) \ - - game.state.nromrem \ - + 3 * game.kcaptured \ - - badpoints() + dead_ordinaries = ( + game.inkling - game.remkl() + len(game.state.kcmdr) + game.state.nscrem + ) + game.score = ( + 10 * (dead_ordinaries) + + 50 * (game.incom - len(game.state.kcmdr)) + + ithperd + + iwon + + 20 * (game.inrom - game.state.nromrem) + + 200 * (game.inscom - game.state.nscrem) + - game.state.nromrem + + 3 * game.kcaptured + - badpoints() + ) if not game.alive: game.score -= 200 skip(2) prout(_("Your score --")) if game.inrom - game.state.nromrem: - prout(_("%6d Romulans destroyed %5d") % - (game.inrom - game.state.nromrem, 20*(game.inrom - game.state.nromrem))) + prout( + _("%6d Romulans destroyed %5d") + % (game.inrom - game.state.nromrem, 20 * (game.inrom - game.state.nromrem)) + ) if game.state.nromrem and game.gamewon: - prout(_("%6d Romulans captured %5d") % - (game.state.nromrem, game.state.nromrem)) + prout( + _("%6d Romulans captured %5d") + % (game.state.nromrem, game.state.nromrem) + ) if dead_ordinaries: - prout(_("%6d ordinary Klingons destroyed %5d") % - (dead_ordinaries, 10*dead_ordinaries)) + prout( + _("%6d ordinary Klingons destroyed %5d") + % (dead_ordinaries, 10 * dead_ordinaries) + ) if game.incom - len(game.state.kcmdr): - prout(_("%6d Klingon commanders destroyed %5d") % - (game.incom - len(game.state.kcmdr), 50*(game.incom - len(game.state.kcmdr)))) + prout( + _("%6d Klingon commanders destroyed %5d") + % ( + game.incom - len(game.state.kcmdr), + 50 * (game.incom - len(game.state.kcmdr)), + ) + ) if game.kcaptured: - prout(_("%d Klingons captured %5d") % - (game.kcaptured, 3 * game.kcaptured)) + prout( + _("%d Klingons captured %5d") + % (game.kcaptured, 3 * game.kcaptured) + ) if game.inscom - game.state.nscrem: - prout(_("%6d Super-Commander destroyed %5d") % - (game.inscom - game.state.nscrem, 200*(game.inscom - game.state.nscrem))) + prout( + _("%6d Super-Commander destroyed %5d") + % (game.inscom - game.state.nscrem, 200 * (game.inscom - game.state.nscrem)) + ) if ithperd: - prout(_("%6.2f Klingons per stardate %5d") % - (game.perdate, ithperd)) + prout( + _("%6.2f Klingons per stardate %5d") % (game.perdate, ithperd) + ) if game.state.starkl: - prout(_("%6d stars destroyed by your action %5d") % - (game.state.starkl, -5*game.state.starkl)) + prout( + _("%6d stars destroyed by your action %5d") + % (game.state.starkl, -5 * game.state.starkl) + ) if game.state.nplankl: - prout(_("%6d planets destroyed by your action %5d") % - (game.state.nplankl, -10*game.state.nplankl)) + prout( + _("%6d planets destroyed by your action %5d") + % (game.state.nplankl, -10 * game.state.nplankl) + ) if (game.options & OPTION_WORLDS) and game.state.nworldkl: - prout(_("%6d inhabited planets destroyed by your action %5d") % - (game.state.nworldkl, -300*game.state.nworldkl)) + prout( + _("%6d inhabited planets destroyed by your action %5d") + % (game.state.nworldkl, -300 * game.state.nworldkl) + ) if game.state.basekl: - prout(_("%6d bases destroyed by your action %5d") % - (game.state.basekl, -100*game.state.basekl)) + prout( + _("%6d bases destroyed by your action %5d") + % (game.state.basekl, -100 * game.state.basekl) + ) if game.nhelp: - prout(_("%6d calls for help from starbase %5d") % - (game.nhelp, -45*game.nhelp)) + prout( + _("%6d calls for help from starbase %5d") + % (game.nhelp, -45 * game.nhelp) + ) if game.casual: - prout(_("%6d casualties incurred %5d") % - (game.casual, -game.casual)) + prout( + _("%6d casualties incurred %5d") + % (game.casual, -game.casual) + ) if game.abandoned: - prout(_("%6d crew abandoned in space %5d") % - (game.abandoned, -3*game.abandoned)) + prout( + _("%6d crew abandoned in space %5d") + % (game.abandoned, -3 * game.abandoned) + ) if klship: - prout(_("%6d ship(s) lost or destroyed %5d") % - (klship, -100*klship)) + prout(_("%6d ship(s) lost or destroyed %5d") % (klship, -100 * klship)) if game.ncviol > 0: if game.ncviol == 1: prout(_("1 Treaty of Algeron violation -100")) else: - prout(_("%6d Treaty of Algeron violations %5d\n") % - (game.ncviol, -100*game.ncviol)) + prout( + _("%6d Treaty of Algeron violations %5d\n") + % (game.ncviol, -100 * game.ncviol) + ) if not game.alive: prout(_("Penalty for getting yourself killed -200")) if game.gamewon: proutn(_("Bonus for winning ")) - if game.skill == SKILL_NOVICE: proutn(_("Novice game ")) - elif game.skill == SKILL_FAIR: proutn(_("Fair game ")) - elif game.skill == SKILL_GOOD: proutn(_("Good game ")) - elif game.skill == SKILL_EXPERT: proutn(_("Expert game ")) - elif game.skill == SKILL_EMERITUS: proutn(_("Emeritus game")) + if game.skill == SKILL_NOVICE: + proutn(_("Novice game ")) + elif game.skill == SKILL_FAIR: + proutn(_("Fair game ")) + elif game.skill == SKILL_GOOD: + proutn(_("Good game ")) + elif game.skill == SKILL_EXPERT: + proutn(_("Expert game ")) + elif game.skill == SKILL_EMERITUS: + proutn(_("Emeritus game")) prout(" %5d" % iwon) skip(1) prout(_("TOTAL SCORE %5d") % game.score) + def plaque(): "Emit winner's commemmorative plaque." skip(2) @@ -3361,48 +3734,80 @@ def plaque(): proutn(_("Enter name to go on plaque (up to 30 characters): ")) winner = cgetline() # The 38 below must be 64 for 132-column paper - nskip = 38 - len(winner)/2 + nskip = 38 - len(winner) / 2 # This is where the ASCII art picture was emitted. # It got garbled somewhere in the chain of transmission to the Almy version. # We should restore it if we can find old enough FORTRAN sources. fp.write("\n\n\n") - fp.write(_(" U. S. S. ENTERPRISE\n")) + fp.write( + _( + " U. S. S. ENTERPRISE\n" + ) + ) fp.write("\n\n\n\n") - fp.write(_(" For demonstrating outstanding ability as a starship captain\n")) + fp.write( + _( + " For demonstrating outstanding ability as a starship captain\n" + ) + ) fp.write("\n") - fp.write(_(" Starfleet Command bestows to you\n")) + fp.write( + _( + " Starfleet Command bestows to you\n" + ) + ) fp.write("\n") fp.write("%*s%s\n\n" % (nskip, "", winner)) - fp.write(_(" the rank of\n\n")) - fp.write(_(" \"Commodore Emeritus\"\n\n")) + fp.write( + _(" the rank of\n\n") + ) + fp.write( + _( + ' "Commodore Emeritus"\n\n' + ) + ) fp.write(" ") - if game.skill == SKILL_EXPERT: + if game.skill == SKILL_EXPERT: fp.write(_(" Expert level\n\n")) elif game.skill == SKILL_EMERITUS: fp.write(_("Emeritus level\n\n")) else: fp.write(_(" Cheat level\n\n")) timestring = time.ctime() - fp.write(_(" This day of %.6s %.4s, %.8s\n\n") % - (timestring+4, timestring+20, timestring+11)) - fp.write(_(" Your score: %d\n\n") % game.score) - fp.write(_(" Klingons per stardate: %.2f\n") % game.perdate) + fp.write( + _( + " This day of %.6s %.4s, %.8s\n\n" + ) + % (timestring + 4, timestring + 20, timestring + 11) + ) + fp.write( + _(" Your score: %d\n\n") + % game.score + ) + fp.write( + _( + " Klingons per stardate: %.2f\n" + ) + % game.perdate + ) fp.close() + # Code from io.c begins here -rows = linecount = 0 # for paging +rows = linecount = 0 # for paging stdscr = None replayfp = None fullscreen_window = None -srscan_window = None # Short range scan -report_window = None # Report legends for status window -status_window = None # The status window itself -lrscan_window = None # Long range scan -message_window = None # Main window for scrolling text -prompt_window = None # Prompt window at bottom of display +srscan_window = None # Short range scan +report_window = None # Report legends for status window +status_window = None # The status window itself +lrscan_window = None # Long range scan +message_window = None # Main window for scrolling text +prompt_window = None # Prompt window at bottom of display curwnd = None + def iostart(): global stdscr, rows gettext.bindtextdomain("sst", "/usr/local/share/locale") @@ -3413,7 +3818,7 @@ def iostart(): rows = ln_env else: rows = 25 - else: # pragma: no cover + else: # pragma: no cover stdscr = curses.initscr() stdscr.keypad(True) curses.nonl() @@ -3421,52 +3826,56 @@ def iostart(): if game.options & OPTION_COLOR: curses.start_color() curses.use_default_colors() - curses.init_pair(curses.COLOR_BLACK, curses.COLOR_BLACK, -1) - curses.init_pair(curses.COLOR_GREEN, curses.COLOR_GREEN, -1) - curses.init_pair(curses.COLOR_RED, curses.COLOR_RED, -1) - curses.init_pair(curses.COLOR_CYAN, curses.COLOR_CYAN, -1) - curses.init_pair(curses.COLOR_WHITE, curses.COLOR_WHITE, -1) + curses.init_pair(curses.COLOR_BLACK, curses.COLOR_BLACK, -1) + curses.init_pair(curses.COLOR_GREEN, curses.COLOR_GREEN, -1) + curses.init_pair(curses.COLOR_RED, curses.COLOR_RED, -1) + curses.init_pair(curses.COLOR_CYAN, curses.COLOR_CYAN, -1) + curses.init_pair(curses.COLOR_WHITE, curses.COLOR_WHITE, -1) curses.init_pair(curses.COLOR_MAGENTA, curses.COLOR_MAGENTA, -1) - curses.init_pair(curses.COLOR_BLUE, curses.COLOR_BLUE, -1) - curses.init_pair(curses.COLOR_YELLOW, curses.COLOR_YELLOW, -1) + curses.init_pair(curses.COLOR_BLUE, curses.COLOR_BLUE, -1) + curses.init_pair(curses.COLOR_YELLOW, curses.COLOR_YELLOW, -1) global fullscreen_window, srscan_window, report_window, status_window global lrscan_window, message_window, prompt_window - (rows, _columns) = stdscr.getmaxyx() + (rows, _columns) = stdscr.getmaxyx() fullscreen_window = stdscr - srscan_window = curses.newwin(12, 25, 0, 0) - report_window = curses.newwin(11, 0, 1, 25) - status_window = curses.newwin(10, 0, 1, 39) - lrscan_window = curses.newwin(5, 0, 0, 64) - message_window = curses.newwin(0, 0, 12, 0) - prompt_window = curses.newwin(1, 0, rows-2, 0) + srscan_window = curses.newwin(12, 25, 0, 0) + report_window = curses.newwin(11, 0, 1, 25) + status_window = curses.newwin(10, 0, 1, 39) + lrscan_window = curses.newwin(5, 0, 0, 64) + message_window = curses.newwin(0, 0, 12, 0) + prompt_window = curses.newwin(1, 0, rows - 2, 0) message_window.scrollok(True) setwnd(fullscreen_window) + def ioend(): "Wrap up I/O." - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover stdscr.keypad(False) curses.echo() curses.nocbreak() curses.endwin() + def waitfor(): "Wait for user action -- OK to do nothing if on a TTY" - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover stdscr.getch() + def announce(): skip(1) prouts(_("[ANNOUNCEMENT ARRIVING...]")) skip(1) + def pause_game(): if game.skill > SKILL_FAIR: prompt = _("[CONTINUE?]") else: prompt = _("[PRESS ENTER TO CONTINUE]") - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover drawmaps(0) setwnd(prompt_window) prompt_window.clear() @@ -3477,20 +3886,21 @@ def pause_game(): setwnd(message_window) else: global linecount - sys.stdout.write('\n') + sys.stdout.write("\n") proutn(prompt) if not replayfp: input() - sys.stdout.write('\n' * rows) + sys.stdout.write("\n" * rows) linecount = 0 + def skip(i): "Skip i lines. Pause game if this would cause a scrolling event." for _dummy in range(i): - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover (y, _x) = curwnd.getyx() try: - curwnd.move(y+1, 0) + curwnd.move(y + 1, 0) except curses.error: pass else: @@ -3499,11 +3909,12 @@ def skip(i): if rows and linecount >= rows: pause_game() else: - sys.stdout.write('\n') + sys.stdout.write("\n") + def proutn(proutntline): "Utter a line with no following line feed." - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover (y, x) = curwnd.getyx() (my, _mx) = curwnd.getmaxyx() if curwnd == message_window and y >= my - 2: @@ -3517,26 +3928,29 @@ def proutn(proutntline): sys.stdout.write(proutntline) sys.stdout.flush() + def prout(proutline): proutn(proutline) skip(1) + def prouts(proutsline): "Emit slowly!" for c in proutsline: - if not replayfp or replayfp.closed: # Don't slow down replays + if not replayfp or replayfp.closed: # Don't slow down replays time.sleep(0.03) proutn(c) - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover curwnd.refresh() else: sys.stdout.flush() if not replayfp or replayfp.closed: time.sleep(0.03) + def cgetline(): "Get a line of input." - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover linein = codecs.decode(curwnd.getstr()) + "\n" curwnd.refresh() else: @@ -3544,7 +3958,7 @@ def cgetline(): while True: linein = replayfp.readline() proutn(linein) - if linein == '': # pragma: no cover + if linein == "": # pragma: no cover prout("*** Replay finished") replayfp.close() break @@ -3560,10 +3974,11 @@ def cgetline(): logfp.write(linein) return linein + def setwnd(wnd): "Change windows -- OK for this to be a no-op in tty mode." global curwnd - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover if game.cdebug and logfp: if wnd == fullscreen_window: legend = "fullscreen" @@ -3589,69 +4004,79 @@ def setwnd(wnd): except curses.error: pass + def clreol(): "Clear to end of line -- can be a no-op in tty mode" - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover curwnd.clrtoeol() curwnd.refresh() + def clrscr(): "Clear screen -- can be a no-op in tty mode." global linecount - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover curwnd.clear() curwnd.move(0, 0) curwnd.refresh() linecount = 0 + def textcolor(color=DEFAULT): - if (game.options & OPTION_COLOR) and (game.options & OPTION_CURSES): # pragma: no cover + if (game.options & OPTION_COLOR) and ( + game.options & OPTION_CURSES + ): # pragma: no cover if color == DEFAULT: curwnd.attrset(0) - elif color == BLACK: + elif color == BLACK: curwnd.attron(curses.color_pair(curses.COLOR_BLACK)) - elif color == BLUE: + elif color == BLUE: curwnd.attron(curses.color_pair(curses.COLOR_BLUE)) - elif color == GREEN: + elif color == GREEN: curwnd.attron(curses.color_pair(curses.COLOR_GREEN)) - elif color == CYAN: + elif color == CYAN: curwnd.attron(curses.color_pair(curses.COLOR_CYAN)) - elif color == RED: + elif color == RED: curwnd.attron(curses.color_pair(curses.COLOR_RED)) - elif color == MAGENTA: + elif color == MAGENTA: curwnd.attron(curses.color_pair(curses.COLOR_MAGENTA)) - elif color == BROWN: + elif color == BROWN: curwnd.attron(curses.color_pair(curses.COLOR_YELLOW)) - elif color == LIGHTGRAY: + elif color == LIGHTGRAY: curwnd.attron(curses.color_pair(curses.COLOR_WHITE)) - elif color == DARKGRAY: + elif color == DARKGRAY: curwnd.attron(curses.color_pair(curses.COLOR_BLACK) | curses.A_BOLD) - elif color == LIGHTBLUE: + elif color == LIGHTBLUE: curwnd.attron(curses.color_pair(curses.COLOR_BLUE) | curses.A_BOLD) - elif color == LIGHTGREEN: + elif color == LIGHTGREEN: curwnd.attron(curses.color_pair(curses.COLOR_GREEN) | curses.A_BOLD) - elif color == LIGHTCYAN: + elif color == LIGHTCYAN: curwnd.attron(curses.color_pair(curses.COLOR_CYAN) | curses.A_BOLD) - elif color == LIGHTRED: + elif color == LIGHTRED: curwnd.attron(curses.color_pair(curses.COLOR_RED) | curses.A_BOLD) - elif color == LIGHTMAGENTA: + elif color == LIGHTMAGENTA: curwnd.attron(curses.color_pair(curses.COLOR_MAGENTA) | curses.A_BOLD) - elif color == YELLOW: + elif color == YELLOW: curwnd.attron(curses.color_pair(curses.COLOR_YELLOW) | curses.A_BOLD) - elif color == WHITE: + elif color == WHITE: curwnd.attron(curses.color_pair(curses.COLOR_WHITE) | curses.A_BOLD) + def highvideo(): - if (game.options & OPTION_COLOR) and (game.options & OPTION_CURSES): # pragma: no cover + if (game.options & OPTION_COLOR) and ( + game.options & OPTION_CURSES + ): # pragma: no cover curwnd.attron(curses.A_REVERSE) + # # Things past this point have policy implications. # + def drawmaps(mode): "Hook to be called after moving to redraw maps." - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover if mode == 1: sensor() setwnd(srscan_window) @@ -3670,99 +4095,108 @@ def drawmaps(mode): lrscan_window.move(0, 0) lrscan(silent=False) -def put_srscan_sym(w, sym): # pragma: no cover + +def put_srscan_sym(w, sym): # pragma: no cover "Emit symbol for short-range scan." - srscan_window.move(w.i+1, w.j*2+2) + srscan_window.move(w.i + 1, w.j * 2 + 2) srscan_window.addch(sym) srscan_window.refresh() + def boom(w): "Enemy fall down, go boom." - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover drawmaps(0) setwnd(srscan_window) srscan_window.attron(curses.A_REVERSE) put_srscan_sym(w, game.quad[w.i][w.j]) - #sound(500) - #time.sleep(1.0) - #nosound() + # sound(500) + # time.sleep(1.0) + # nosound() srscan_window.attroff(curses.A_REVERSE) put_srscan_sym(w, game.quad[w.i][w.j]) curses.delay_output(500) setwnd(message_window) + def warble(): "Sound and visual effects for teleportation." - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover drawmaps(2) setwnd(message_window) - #sound(50) + # sound(50) prouts(" . . . . . ") - if game.options & OPTION_CURSES: # pragma: no cover - #curses.delay_output(1000) - #nosound() + if game.options & OPTION_CURSES: # pragma: no cover + # curses.delay_output(1000) + # nosound() pass + def tracktorpedo(w, step, i, n, iquad): "Torpedo-track animation." if not game.options & OPTION_CURSES: if step == 1: if n != 1: skip(1) - proutn(_("Track for torpedo number %d- ") % (i+1)) + proutn(_("Track for torpedo number %d- ") % (i + 1)) else: skip(1) proutn(_("Torpedo track- ")) elif step in {4, 9}: skip(1) proutn("%s " % w) - else: # pragma: no cover - if not damaged(DSRSENS) or game.condition=="docked": + else: # pragma: no cover + if not damaged(DSRSENS) or game.condition == "docked": if i != 0 and step == 1: drawmaps(2) time.sleep(0.4) - if iquad in {'.', ' '}: - put_srscan_sym(w, '+') - #sound(step*10) - #time.sleep(0.1) - #nosound() + if iquad in {".", " "}: + put_srscan_sym(w, "+") + # sound(step*10) + # time.sleep(0.1) + # nosound() put_srscan_sym(w, iquad) else: curwnd.attron(curses.A_REVERSE) put_srscan_sym(w, iquad) - #sound(500) - #time.sleep(1.0) - #nosound() + # sound(500) + # time.sleep(1.0) + # nosound() curwnd.attroff(curses.A_REVERSE) put_srscan_sym(w, iquad) else: proutn("%s " % w) + def makechart(): "Display the current galaxy chart." - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover setwnd(message_window) message_window.clear() chart() if game.options & OPTION_TTY: skip(1) -NSYM = 14 + +NSYM = 14 + def prstat(txt, data): proutn(txt) - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover skip(1) setwnd(status_window) else: proutn(" " * (NSYM - len(txt))) proutn(data) skip(1) - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover setwnd(report_window) + # Code from moving.c begins here + def imove(icourse=None, noattack=False): "Movement execution for warp, impulse, supernova, and tractor-beam events." w = Coord() @@ -3778,7 +4212,11 @@ def imove(icourse=None, noattack=False): # Stas Sergeev added the condition # that attacks only happen if Klingons # are present and your skill is good. - if game.skill > SKILL_GOOD and game.klhere > 0 and not game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova: + if ( + game.skill > SKILL_GOOD + and game.klhere > 0 + and not game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova + ): attack(torps_ok=False) if game.alldone: return @@ -3792,11 +4230,11 @@ def imove(icourse=None, noattack=False): if icourse.final.j < 0: icourse.final.j = -icourse.final.j kink = True - if icourse.final.i >= GALSIZE*QUADSIZE: - icourse.final.i = (GALSIZE*QUADSIZE*2) - icourse.final.i + if icourse.final.i >= GALSIZE * QUADSIZE: + icourse.final.i = (GALSIZE * QUADSIZE * 2) - icourse.final.i kink = True - if icourse.final.j >= GALSIZE*QUADSIZE: - icourse.final.j = (GALSIZE*QUADSIZE*2) - icourse.final.j + if icourse.final.j >= GALSIZE * QUADSIZE: + icourse.final.j = (GALSIZE * QUADSIZE * 2) - icourse.final.j kink = True if kink: kinks += 1 @@ -3813,7 +4251,7 @@ def imove(icourse=None, noattack=False): prout(_("AT THE EDGE OF THE GALAXY. THE THIRD TIME YOU TRY THIS,")) prout(_("YOU WILL BE DESTROYED.")) # Compute final position in new quadrant - if trbeam: # Don't bother if we are to be beamed + if trbeam: # Don't bother if we are to be beamed return game.quadrant = icourse.final.quadrant() game.sector = icourse.final.sector() @@ -3821,23 +4259,23 @@ def imove(icourse=None, noattack=False): prout(_("Entering Quadrant %s.") % game.quadrant) game.quad[game.sector.i][game.sector.j] = game.ship newqad() - if game.skill>SKILL_NOVICE: + if game.skill > SKILL_NOVICE: attack(torps_ok=False) def check_collision(h): iquad = game.quad[h.i][h.j] - if iquad != '.': + if iquad != ".": # object encountered in flight path - stopegy = 50.0*icourse.distance/game.optime - if iquad in ('T', 'K', 'C', 'S', 'R', '?'): + stopegy = 50.0 * icourse.distance / game.optime + if iquad in ("T", "K", "C", "S", "R", "?"): for enemy in game.enemies: if enemy.location == h: collision(rammed=False, enemy=enemy) return True # This should not happen - prout(_("Which way did he go?")) # pragma: no cover - return False # pragma: no cover - elif iquad == ' ': + prout(_("Which way did he go?")) # pragma: no cover + return False # pragma: no cover + elif iquad == " ": skip(1) prouts(_("***RED ALERT! RED ALERT!")) skip(1) @@ -3846,12 +4284,14 @@ def imove(icourse=None, noattack=False): # Getting pulled into a black hole was certain # death in Almy's original. Stas Sergeev added a # possibility that you'll get timewarped instead. - n=0 + n = 0 for m in range(NDEVICES): - if game.damage[m]>0: + if game.damage[m] > 0: n += 1 - probf=math.pow(1.4,(game.energy+game.shield)/5000.0-1.0)*math.pow(1.3,1.0/(n+1)-1.0) - if (game.options & OPTION_BLKHOLE) and rnd.withprob(1-probf): + probf = math.pow( + 1.4, (game.energy + game.shield) / 5000.0 - 1.0 + ) * math.pow(1.3, 1.0 / (n + 1) - 1.0) + if (game.options & OPTION_BLKHOLE) and rnd.withprob(1 - probf): timwrp() else: finish(FHOLE) @@ -3860,7 +4300,7 @@ def imove(icourse=None, noattack=False): # something else skip(1) proutn(crmshp()) - if iquad == '#': + if iquad == "#": prout(_(" encounters Tholian web at %s;") % h) else: prout(_(" blocked by object at %s;") % h) @@ -3874,21 +4314,26 @@ def imove(icourse=None, noattack=False): trbeam = False if game.inorbit: - prout(_("Helmsman Sulu- \"Leaving standard orbit.\"")) + prout(_('Helmsman Sulu- "Leaving standard orbit."')) game.inorbit = False # If tractor beam is to occur, don't move full distance - if game.state.date+game.optime >= scheduled(FTBEAM): + if game.state.date + game.optime >= scheduled(FTBEAM): if game.iscloaked: # We can't be tractor beamed if cloaked, # so move the event into the future - postpone(FTBEAM, game.optime + expran(1.5*game.intime/len(game.state.kcmdr))) + postpone( + FTBEAM, game.optime + expran(1.5 * game.intime / len(game.state.kcmdr)) + ) else: trbeam = True game.condition = "red" - icourse.distance = icourse.distance*(scheduled(FTBEAM)-game.state.date)/game.optime + 0.1 + icourse.distance = ( + icourse.distance * (scheduled(FTBEAM) - game.state.date) / game.optime + + 0.1 + ) game.optime = scheduled(FTBEAM) - game.state.date + 1e-5 # Move out - game.quad[game.sector.i][game.sector.j] = '.' + game.quad[game.sector.i][game.sector.j] = "." for _m in range(icourse.moves): icourse.nextstep() w = icourse.sector() @@ -3904,7 +4349,7 @@ def imove(icourse=None, noattack=False): game.quad[game.sector.i][game.sector.j] = game.ship if game.enemies: for enemy in game.enemies: - finald = (w-enemy.location).distance() + finald = (w - enemy.location).distance() enemy.kavgd = 0.5 * (finald + enemy.kdist) enemy.kdist = finald sortenemies() @@ -3916,6 +4361,7 @@ def imove(icourse=None, noattack=False): drawmaps(0) setwnd(message_window) + def dock(verbose): "Dock our ship at a starbase." scanner.chew() @@ -3928,7 +4374,7 @@ def dock(verbose): if game.base is None or not game.base.valid_sector(): prout(_("No starbase available for docking in this quadrant.")) return - if (abs(game.sector.i-game.base.i) > 1) or (abs(game.sector.j-game.base.j) > 1): + if (abs(game.sector.i - game.base.i) > 1) or (abs(game.sector.j - game.base.j) > 1): prout(crmshp() + _(" not adjacent to base.")) return if game.iscloaked: @@ -3944,17 +4390,22 @@ def dock(verbose): game.torps = game.intorps game.lsupres = game.inlsr game.state.crew = FULLCREW - if game.brigcapacity-game.brigfree > 0: - prout(_("%d captured Klingons transferred to base") % (game.brigcapacity-game.brigfree)) - game.kcaptured += game.brigcapacity-game.brigfree + if game.brigcapacity - game.brigfree > 0: + prout( + _("%d captured Klingons transferred to base") + % (game.brigcapacity - game.brigfree) + ) + game.kcaptured += game.brigcapacity - game.brigfree game.brigfree = game.brigcapacity - if communicating() and \ - ((is_scheduled(FCDBAS) or game.isatb == 1) and not game.iseenit): + if communicating() and ( + (is_scheduled(FCDBAS) or game.isatb == 1) and not game.iseenit + ): # get attack report from base - prout(_("Lt. Uhura- \"Captain, an important message from the starbase:\"")) + prout(_('Lt. Uhura- "Captain, an important message from the starbase:"')) attackreport(False) game.iseenit = True + def cartesian(loc1=None, loc2=None): if loc1 is None: return game.quadrant * QUADSIZE + game.sector @@ -3963,6 +4414,7 @@ def cartesian(loc1=None, loc2=None): else: return loc1 * QUADSIZE + loc2 + def getcourse(isprobe): "Get a course and distance from the user." key = "" @@ -4004,7 +4456,7 @@ def getcourse(isprobe): huh() scanner.chew() raise TrekError - else: # numeric + else: # numeric if isprobe: prout(_("(Manual navigation assumed.)")) else: @@ -4021,7 +4473,7 @@ def getcourse(isprobe): scanner.chew() iprompt = True key = scanner.nexttok() - scanner.push(scanner.token) # Something IHREAL or IHALPHA awaits us + scanner.push(scanner.token) # Something IHREAL or IHALPHA awaits us first = scanner.getcoord() if first is None: raise TrekError @@ -4045,7 +4497,7 @@ def getcourse(isprobe): # only quadrant specified -- go to center of dest quad dquad.i = first.i dquad.j = first.j - dsect.j = dsect.i = (QUADSIZE/2)-1 # preserves 1-origin behavior + dsect.j = dsect.i = (QUADSIZE / 2) - 1 # preserves 1-origin behavior else: # only sector specified dsect.i = first.i @@ -4058,13 +4510,17 @@ def getcourse(isprobe): if not isprobe: if itemp > "curt": if iprompt: - prout(_("Helmsman Sulu- \"Course locked in for Sector %s.\"") % dsect) + prout(_('Helmsman Sulu- "Course locked in for Sector %s."') % dsect) else: - prout(_("Ensign Chekov- \"Course laid in, Captain.\"")) + prout(_('Ensign Chekov- "Course laid in, Captain."')) # the actual deltas get computed here - delta.j = dquad.j-game.quadrant.j + (dsect.j-game.sector.j)/(QUADSIZE*1.0) - delta.i = game.quadrant.i-dquad.i + (game.sector.i-dsect.i)/(QUADSIZE*1.0) - else: # manual + delta.j = ( + dquad.j - game.quadrant.j + (dsect.j - game.sector.j) / (QUADSIZE * 1.0) + ) + delta.i = ( + game.quadrant.i - dquad.i + (game.sector.i - dsect.i) / (QUADSIZE * 1.0) + ) + else: # manual while key == "IHEOL": proutn(_("X and Y displacements- ")) scanner.chew() @@ -4091,10 +4547,11 @@ def getcourse(isprobe): raise TrekError if itemp == "verbose" and not isprobe: skip(1) - prout(_("Helmsman Sulu- \"Aye, Sir.\"")) + prout(_('Helmsman Sulu- "Aye, Sir."')) scanner.chew() return course(bearing=delta.bearing(), distance=delta.distance()) + class course: def __init__(self, bearing, distance, origin=None): self.distance = distance @@ -4107,35 +4564,43 @@ class course: # clockface directions! if self.bearing < 0.0: self.bearing += 12.0 - self.angle = ((15.0 - self.bearing) * 0.5235988) + self.angle = (15.0 - self.bearing) * 0.5235988 self.increment = Coord(-math.sin(self.angle), math.cos(self.angle)) bigger = max(abs(self.increment.i), abs(self.increment.j)) self.increment /= bigger - self.moves = int(round(10*self.distance*bigger)) + self.moves = int(round(10 * self.distance * bigger)) self.reset() - self.final = (self.location + self.moves*self.increment).roundtogrid() + self.final = (self.location + self.moves * self.increment).roundtogrid() self.location = self.origin self.nextlocation = None + def reset(self): self.location = self.origin self.step = 0 + def arrived(self): return self.location.roundtogrid() == self.final + def nextstep(self): "Next step on course." self.step += 1 self.nextlocation = self.location + self.increment - samequad = (self.location.quadrant() == self.nextlocation.quadrant()) + samequad = self.location.quadrant() == self.nextlocation.quadrant() self.location = self.nextlocation return samequad + def quadrant(self): return self.location.quadrant() + def sector(self): return self.location.sector() + def power(self, w): - return self.distance*(w**3)*(game.shldup+1) + return self.distance * (w ** 3) * (game.shldup + 1) + def time(self, w): - return 10.0*self.distance/w**2 + return 10.0 * self.distance / w ** 2 + def impulse(): "Move under impulse power." @@ -4143,35 +4608,37 @@ def impulse(): if damaged(DIMPULS): scanner.chew() skip(1) - prout(_("Engineer Scott- \"The impulse engines are damaged, Sir.\"")) + prout(_('Engineer Scott- "The impulse engines are damaged, Sir."')) return if game.energy > 30.0: try: icourse = getcourse(isprobe=False) except TrekError: return - power = 20.0 + 100.0*icourse.distance + power = 20.0 + 100.0 * icourse.distance else: power = 30.0 if power >= game.energy: # Insufficient power for trip skip(1) - prout(_("First Officer Spock- \"Captain, the impulse engines")) + prout(_('First Officer Spock- "Captain, the impulse engines')) prout(_("require 20.0 units to engage, plus 100.0 units per")) if game.energy > 30: - proutn(_("quadrant. We can go, therefore, a maximum of %d") % - int(0.01 * (game.energy-20.0)-0.05)) - prout(_(" quadrants.\"")) + proutn( + _("quadrant. We can go, therefore, a maximum of %d") + % int(0.01 * (game.energy - 20.0) - 0.05) + ) + prout(_(' quadrants."')) else: - prout(_("quadrant. They are, therefore, useless.\"")) + prout(_('quadrant. They are, therefore, useless."')) scanner.chew() return # Make sure enough time is left for the trip - game.optime = icourse.distance/0.095 + game.optime = icourse.distance / 0.095 if game.optime >= game.state.remtime: - prout(_("First Officer Spock- \"Captain, our speed under impulse")) + prout(_('First Officer Spock- "Captain, our speed under impulse')) prout(_("power is only 0.95 sectors per stardate. Are you sure")) - proutn(_("we dare spend the time?\" ")) + proutn(_('we dare spend the time?" ')) if not ja(): return # Activate impulse engines and pay the cost @@ -4179,35 +4646,41 @@ def impulse(): game.ididit = True if game.alldone: return - power = 20.0 + 100.0*icourse.distance + power = 20.0 + 100.0 * icourse.distance game.energy -= power - game.optime = icourse.distance/0.095 + game.optime = icourse.distance / 0.095 if game.energy <= 0: finish(FNRG) return + def warp(wcourse, involuntary): "Move under warp drive." - blooey = False; twarp = False - if not involuntary: # Not WARPX entry + blooey = False + twarp = False + if not involuntary: # Not WARPX entry game.ididit = False if game.iscloaked: scanner.chew() skip(1) - prout(_("Engineer Scott- \"The warp engines can not be used while cloaked, Sir.\"")) + prout( + _( + 'Engineer Scott- "The warp engines can not be used while cloaked, Sir."' + ) + ) return if game.damage[DWARPEN] > 10.0: scanner.chew() skip(1) - prout(_("Engineer Scott- \"The warp engines are damaged, Sir.\"")) + prout(_('Engineer Scott- "The warp engines are damaged, Sir."')) return if damaged(DWARPEN) and game.warpfac > 4.0: scanner.chew() skip(1) - prout(_("Engineer Scott- \"Sorry, Captain. Until this damage")) - prout(_(" is repaired, I can only give you warp 4.\"")) + prout(_('Engineer Scott- "Sorry, Captain. Until this damage')) + prout(_(' is repaired, I can only give you warp 4."')) return - # Read in course and distance + # Read in course and distance if wcourse is None: try: wcourse = getcourse(isprobe=False) @@ -4221,12 +4694,15 @@ def warp(wcourse, involuntary): game.ididit = False skip(1) prout(_("Engineering to bridge--")) - if not game.shldup or 0.5*wcourse.power(game.warpfac) > game.energy: - iwarp = (game.energy/(wcourse.distance+0.05)) ** 0.333333333 + if not game.shldup or 0.5 * wcourse.power(game.warpfac) > game.energy: + iwarp = (game.energy / (wcourse.distance + 0.05)) ** 0.333333333 if iwarp <= 0: prout(_("We can't do it, Captain. We don't have enough energy.")) else: - proutn(_("We don't have enough energy, but we could do it at warp %d") % iwarp) + proutn( + _("We don't have enough energy, but we could do it at warp %d") + % iwarp + ) if game.shldup: prout(",") prout(_("if you'll lower the shields.")) @@ -4237,29 +4713,31 @@ def warp(wcourse, involuntary): return # Make sure enough time is left for the trip game.optime = wcourse.time(game.warpfac) - if game.optime >= 0.8*game.state.remtime: + if game.optime >= 0.8 * game.state.remtime: skip(1) - prout(_("First Officer Spock- \"Captain, I compute that such")) - proutn(_(" a trip would require approximately %2.0f") % - (100.0*game.optime/game.state.remtime)) + prout(_('First Officer Spock- "Captain, I compute that such')) + proutn( + _(" a trip would require approximately %2.0f") + % (100.0 * game.optime / game.state.remtime) + ) prout(_(" percent of our")) - proutn(_(" remaining time. Are you sure this is wise?\" ")) + proutn(_(' remaining time. Are you sure this is wise?" ')) if not ja(): game.ididit = False - game.optime=0 + game.optime = 0 return # Entry WARPX if game.warpfac > 6.0: # Decide if engine damage will occur # ESR: Seems wrong. Probability of damage goes *down* with distance? - prob = wcourse.distance*(6.0-game.warpfac)**2/66.666666666 + prob = wcourse.distance * (6.0 - game.warpfac) ** 2 / 66.666666666 if prob > rnd.real(): blooey = True wcourse.distance = rnd.real(wcourse.distance) # Decide if time warp will occur - if 0.5*wcourse.distance*math.pow(7.0,game.warpfac-10.0) > rnd.real(): + if 0.5 * wcourse.distance * math.pow(7.0, game.warpfac - 10.0) > rnd.real(): twarp = True - if game.idebug and game.warpfac==10 and not twarp: # pragma: no cover + if game.idebug and game.warpfac == 10 and not twarp: # pragma: no cover blooey = False proutn("=== Force time warp? ") if ja(): @@ -4274,7 +4752,7 @@ def warp(wcourse, involuntary): w = wcourse.sector() if not w.valid_sector(): break - if game.quad[w.i][w.j] != '.': + if game.quad[w.i][w.j] != ".": blooey = False twarp = False wcourse.reset() @@ -4297,10 +4775,11 @@ def warp(wcourse, involuntary): game.ididit = True return + def setwarp(): "Change the warp factor." while True: - key=scanner.nexttok() + key = scanner.nexttok() if key != "IHEOL": break scanner.chew() @@ -4313,29 +4792,29 @@ def setwarp(): return if damaged(DWARPEN) and scanner.real > 4.0: prout(_("Engineer Scott- \"I'm doing my best, Captain,")) - prout(_(" but right now we can only go warp 4.\"")) + prout(_(' but right now we can only go warp 4."')) return if scanner.real > 10.0: - prout(_("Helmsman Sulu- \"Our top speed is warp 10, Captain.\"")) + prout(_('Helmsman Sulu- "Our top speed is warp 10, Captain."')) return if scanner.real < 1.0: - prout(_("Helmsman Sulu- \"We can't go below warp 1, Captain.\"")) + prout(_('Helmsman Sulu- "We can\'t go below warp 1, Captain."')) return oldfac = game.warpfac game.warpfac = scanner.real if game.warpfac <= oldfac or game.warpfac <= 6.0: - prout(_("Helmsman Sulu- \"Warp factor %d, Captain.\"") % - int(game.warpfac)) + prout(_('Helmsman Sulu- "Warp factor %d, Captain."') % int(game.warpfac)) return if game.warpfac < 8.00: - prout(_("Engineer Scott- \"Aye, but our maximum safe speed is warp 6.\"")) + prout(_('Engineer Scott- "Aye, but our maximum safe speed is warp 6."')) return if game.warpfac == 10.0: - prout(_("Engineer Scott- \"Aye, Captain, we'll try it.\"")) + prout(_('Engineer Scott- "Aye, Captain, we\'ll try it."')) return - prout(_("Engineer Scott- \"Aye, Captain, but our engines may not take it.\"")) + prout(_('Engineer Scott- "Aye, Captain, but our engines may not take it."')) return + def atover(igrab): "Cope with being tossed out of quadrant by supernova or yanked by beam." scanner.chew() @@ -4378,7 +4857,7 @@ def atover(igrab): proutn(_("The %s has stopped in a quadrant containing") % crmshp()) prouts(_(" a supernova.")) skip(2) - prout(_("***Emergency automatic override attempts to hurl ")+crmshp()) + prout(_("***Emergency automatic override attempts to hurl ") + crmshp()) prout(_("safely out of quadrant.")) if not damaged(DRADIO): game.state.galaxy[game.quadrant.i][game.quadrant.j].charted = True @@ -4390,10 +4869,10 @@ def atover(igrab): return game.warpfac = rnd.real(6.0, 8.0) prout(_("Warp factor set to %d") % int(game.warpfac)) - power = 0.75*game.energy - dist = power/(game.warpfac*game.warpfac*game.warpfac*(game.shldup+1)) + power = 0.75 * game.energy + dist = power / (game.warpfac * game.warpfac * game.warpfac * (game.shldup + 1)) dist = max(dist, rnd.real(math.sqrt(2))) - bugout = course(bearing=rnd.real(12), distance=dist) # How dumb! + bugout = course(bearing=rnd.real(12), distance=dist) # How dumb! game.optime = bugout.time(game.warpfac) game.justin = False game.inorbit = False @@ -4409,24 +4888,27 @@ def atover(igrab): # Repeat if another snova if not game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova: break - if game.unwon()==0: - finish(FWON) # Snova killed remaining enemy. + if game.unwon() == 0: + finish(FWON) # Snova killed remaining enemy. + def timwrp(): "Let's do the time warp again." prout(_("***TIME WARP ENTERED.")) if game.state.snap and rnd.withprob(0.5): # Go back in time - prout(_("You are traveling backwards in time %d stardates.") % - int(game.state.date-game.snapsht.date)) + prout( + _("You are traveling backwards in time %d stardates.") + % int(game.state.date - game.snapsht.date) + ) game.state = game.snapsht game.state.snap = False if len(game.state.kcmdr): - schedule(FTBEAM, expran(game.intime/len(game.state.kcmdr))) - schedule(FBATTAK, expran(0.3*game.intime)) - schedule(FSNOVA, expran(0.5*game.intime)) + schedule(FTBEAM, expran(game.intime / len(game.state.kcmdr))) + schedule(FBATTAK, expran(0.3 * game.intime)) + schedule(FSNOVA, expran(0.5 * game.intime)) # next snapshot will be sooner - schedule(FSNAP, expran(0.25*game.state.remtime)) + schedule(FSNAP, expran(0.25 * game.state.remtime)) if game.state.nscrem: schedule(FSCMOVE, 0.2777) @@ -4440,26 +4922,33 @@ def timwrp(): for l in range(game.inplan): if game.state.planets[l].known == "shuttle_down": gotit = True - if game.iscraft == "onship" and game.ship=='E': - prout(_("Chekov- \"Security reports the Galileo has disappeared, Sir!")) + if game.iscraft == "onship" and game.ship == "E": + prout( + _( + 'Chekov- "Security reports the Galileo has disappeared, Sir!' + ) + ) game.iscraft = "offship" # Likewise, if in the original time the Galileo was abandoned, but # was on ship earlier, it would have vanished -- let's restore it. if game.iscraft == "offship" and not gotit and game.damage[DSHUTTL] >= 0.0: - prout(_("Chekov- \"Security reports the Galileo has reappeared in the dock!\"")) + prout( + _('Chekov- "Security reports the Galileo has reappeared in the dock!"') + ) game.iscraft = "onship" # There used to be code to do the actual reconstrction here, # but the starchart is now part of the snapshotted galaxy state. prout(_("Spock has reconstructed a correct star chart from memory")) else: # Go forward in time - game.optime = expran(0.5*game.intime) + game.optime = expran(0.5 * game.intime) prout(_("You are traveling forward in time %d stardates.") % int(game.optime)) # cheat to make sure no tractor beams occur during time warp postpone(FTBEAM, game.optime) game.damage[DRADIO] += game.optime newqad() - events() # Stas Sergeev added this -- do pending events + events() # Stas Sergeev added this -- do pending events + def probe(): "Launch deep-space probe." @@ -4467,24 +4956,24 @@ def probe(): if game.nprobes == 0: scanner.chew() skip(1) - if game.ship == 'E': - prout(_("Engineer Scott- \"We have no more deep space probes, Sir.\"")) + if game.ship == "E": + prout(_('Engineer Scott- "We have no more deep space probes, Sir."')) else: prout(_("Ye Faerie Queene has no deep space probes.")) return if damaged(DDSP): scanner.chew() skip(1) - prout(_("Engineer Scott- \"The probe launcher is damaged, Sir.\"")) + prout(_('Engineer Scott- "The probe launcher is damaged, Sir."')) return if is_scheduled(FDSPROB): scanner.chew() skip(1) if damaged(DRADIO) and game.condition != "docked": - prout(_("Spock- \"Records show the previous probe has not yet")) - prout(_(" reached its destination.\"")) + prout(_('Spock- "Records show the previous probe has not yet')) + prout(_(' reached its destination."')) else: - prout(_("Uhura- \"The previous probe is still reporting data, Sir.\"")) + prout(_('Uhura- "The previous probe is still reporting data, Sir."')) return key = scanner.nexttok() if key == "IHEOL": @@ -4502,42 +4991,43 @@ def probe(): elif key == "IHEOL": proutn(_("Arm NOVAMAX warhead? ")) game.isarmed = ja() - elif key == "IHREAL": # first element of course + elif key == "IHREAL": # first element of course scanner.push(scanner.token) try: game.probe = getcourse(isprobe=True) except TrekError: return game.nprobes -= 1 - schedule(FDSPROB, 0.01) # Time to move one sector - prout(_("Ensign Chekov- \"The deep space probe is launched, Captain.\"")) + schedule(FDSPROB, 0.01) # Time to move one sector + prout(_('Ensign Chekov- "The deep space probe is launched, Captain."')) game.ididit = True return + def mayday(): "Yell for help from nearest starbase." # There's more than one way to move in this game! scanner.chew() # Test for conditions which prevent calling for help if game.condition == "docked": - prout(_("Lt. Uhura- \"But Captain, we're already docked.\"")) + prout(_('Lt. Uhura- "But Captain, we\'re already docked."')) return if damaged(DRADIO): prout(_("Subspace radio damaged.")) return if not game.state.baseq: - prout(_("Lt. Uhura- \"Captain, I'm not getting any response from Starbase.\"")) + prout(_('Lt. Uhura- "Captain, I\'m not getting any response from Starbase."')) return if game.landed: prout(_("You must be aboard the %s.") % crmshp()) return # OK -- call for help from nearest starbase game.nhelp += 1 - if game.base.i!=0: + if game.base.i != 0: # There's one in this quadrant ddist = (game.base - game.sector).distance() else: - ibq = None # Force base-quadrant game to persist past loop + ibq = None # Force base-quadrant game to persist past loop ddist = FOREVER for ibq in game.state.baseq: xdist = QUADSIZE * (ibq - game.quadrant).distance() @@ -4550,13 +5040,15 @@ def mayday(): game.quadrant = ibq newqad() # dematerialize starship - game.quad[game.sector.i][game.sector.j]='.' - proutn(_("Starbase in Quadrant %s responds--%s dematerializes") \ - % (game.quadrant, crmshp())) + game.quad[game.sector.i][game.sector.j] = "." + proutn( + _("Starbase in Quadrant %s responds--%s dematerializes") + % (game.quadrant, crmshp()) + ) game.sector.invalidate() - for m in range(1, 5+1): + for m in range(1, 5 + 1): w = game.base.scatter() - if w.valid_sector() and game.quad[w.i][w.j]=='.': + if w.valid_sector() and game.quad[w.i][w.j] == ".": # found one -- finish up game.sector = w break @@ -4565,52 +5057,56 @@ def mayday(): finish(FMATERIALIZE) return # Give starbase three chances to rematerialize starship - probf = math.pow((1.0 - math.pow(0.98,ddist)), 0.33333333) - for m in range(1, 3+1): - if m == 1: proutn(_("1st")) - elif m == 2: proutn(_("2nd")) - elif m == 3: proutn(_("3rd")) + probf = math.pow((1.0 - math.pow(0.98, ddist)), 0.33333333) + for m in range(1, 3 + 1): + if m == 1: + proutn(_("1st")) + elif m == 2: + proutn(_("2nd")) + elif m == 3: + proutn(_("3rd")) proutn(_(" attempt to re-materialize ") + crmshp()) - game.quad[game.sector.i][game.sector.j]=('-','o','O')[m-1] + game.quad[game.sector.i][game.sector.j] = ("-", "o", "O")[m - 1] textcolor(RED) warble() if rnd.real() > probf: break prout(_("fails.")) textcolor(DEFAULT) - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover curses.delay_output(500) if m > 3: - game.quad[game.sector.i][game.sector.j]='?' + game.quad[game.sector.i][game.sector.j] = "?" game.alive = False drawmaps(1) setwnd(message_window) finish(FMATERIALIZE) return - game.quad[game.sector.i][game.sector.j]=game.ship + game.quad[game.sector.i][game.sector.j] = game.ship textcolor(GREEN) prout(_("succeeds.")) textcolor(DEFAULT) dock(False) skip(1) - prout(_("Lt. Uhura- \"Captain, we made it!\"")) + prout(_('Lt. Uhura- "Captain, we made it!"')) + def abandon(): "Abandon ship." scanner.chew() - if game.condition=="docked": - if game.ship!='E': + if game.condition == "docked": + if game.ship != "E": prout(_("You cannot abandon Ye Faerie Queene.")) return else: # Must take shuttle craft to exit - if game.damage[DSHUTTL]==-1: + if game.damage[DSHUTTL] == -1: prout(_("Ye Faerie Queene has no shuttle craft.")) return - if game.damage[DSHUTTL]<0: + if game.damage[DSHUTTL] < 0: prout(_("Shuttle craft now serving Big Macs.")) return - if game.damage[DSHUTTL]>0: + if game.damage[DSHUTTL] > 0: prout(_("Shuttle craft damaged.")) return if game.landed: @@ -4636,17 +5132,15 @@ def abandon(): prout(_("Remainder of ship's complement beam down")) prout(_("to nearest habitable planet.")) elif q.planet is not None and not damaged(DTRANSP): - prout(_("Remainder of ship's complement beam down to %s.") % - q.planet) + prout(_("Remainder of ship's complement beam down to %s.") % q.planet) else: - prout(_("Entire crew of %d left to die in outer space.") % - game.state.crew) + prout(_("Entire crew of %d left to die in outer space.") % game.state.crew) game.casual += game.state.crew game.abandoned += game.state.crew # If at least one base left, give 'em the Faerie Queene skip(1) - game.icrystl = False # crystals are lost - game.nprobes = 0 # No probes + game.icrystl = False # crystals are lost + game.nprobes = 0 # No probes prout(_("You are captured by Klingons and released to")) prout(_("the Federation in a prisoner-of-war exchange.")) nb = rnd.integer(len(game.state.baseq)) @@ -4657,20 +5151,22 @@ def abandon(): newqad() while True: # position next to base by trial and error - game.quad[game.sector.i][game.sector.j] = '.' + game.quad[game.sector.i][game.sector.j] = "." l = QUADSIZE for l in range(QUADSIZE): game.sector = game.base.scatter() - if game.sector.valid_sector() and \ - game.quad[game.sector.i][game.sector.j] == '.': + if ( + game.sector.valid_sector() + and game.quad[game.sector.i][game.sector.j] == "." + ): break if l < QUADSIZE: - break # found a spot - game.sector.i=QUADSIZE/2 - game.sector.j=QUADSIZE/2 + break # found a spot + game.sector.i = QUADSIZE / 2 + game.sector.j = QUADSIZE / 2 newqad() # Get new commission - game.quad[game.sector.i][game.sector.j] = game.ship = 'F' + game.quad[game.sector.i][game.sector.j] = game.ship = "F" game.state.crew = FULLCREW prout(_("Starfleet puts you in command of another ship,")) prout(_("the Faerie Queene, which is antiquated but,")) @@ -4678,46 +5174,54 @@ def abandon(): if game.icrystl: prout(_("The dilithium crystals have been moved.")) game.imine = False - game.iscraft = "offship" # Galileo disappears + game.iscraft = "offship" # Galileo disappears # Resupply ship - game.condition="docked" + game.condition = "docked" for l in range(NDEVICES): game.damage[l] = 0.0 game.damage[DSHUTTL] = -1 game.energy = game.inenrg = 3000.0 game.shield = game.inshld = 1250.0 game.torps = game.intorps = 6 - game.lsupres=game.inlsr=3.0 - game.shldup=False - game.warpfac=5.0 + game.lsupres = game.inlsr = 3.0 + game.shldup = False + game.warpfac = 5.0 game.brigfree = game.brigcapacity = 300 return + # Code from planets.c begins here. + def consumeTime(): "Abort a lengthy operation if an event interrupts it." game.ididit = True events() - if game.alldone or game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova or game.justin: + if ( + game.alldone + or game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova + or game.justin + ): return True return False + def survey(): "Report on (uninhabited) planets in the galaxy." iknow = False skip(1) scanner.chew() - prout(_("Spock- \"Planet report follows, Captain.\"")) + prout(_('Spock- "Planet report follows, Captain."')) skip(1) for i in range(game.inplan): if game.state.planets[i].pclass == "destroyed": continue - if (game.state.planets[i].known != "unknown" \ - and not game.state.planets[i].inhabited) \ - or game.idebug: + if ( + game.state.planets[i].known != "unknown" + and not game.state.planets[i].inhabited + ) or game.idebug: iknow = True - if game.idebug and game.state.planets[i].known=="unknown": + if game.idebug and game.state.planets[i].known == "unknown": proutn("(Unknown) ") proutn(_("Quadrant %s") % game.state.planets[i].quadrant) proutn(_(" class ")) @@ -4726,11 +5230,12 @@ def survey(): if game.state.planets[i].crystals != "present": proutn(_("no ")) prout(_("dilithium crystals present.")) - if game.state.planets[i].known=="shuttle_down": + if game.state.planets[i].known == "shuttle_down": prout(_(" Shuttle Craft Galileo on surface.")) if not iknow: prout(_("No information available.")) + def orbit(): "Enter standard orbit." skip(1) @@ -4744,20 +5249,21 @@ def orbit(): if game.plnet is None: prout("There is no planet in this sector.") return - if abs(game.sector.i-game.plnet.i)>1 or abs(game.sector.j-game.plnet.j)>1: + if abs(game.sector.i - game.plnet.i) > 1 or abs(game.sector.j - game.plnet.j) > 1: prout(crmshp() + _(" not adjacent to planet.")) skip(1) return game.optime = rnd.real(0.02, 0.05) - prout(_("Helmsman Sulu- \"Entering standard orbit, Sir.\"")) + prout(_('Helmsman Sulu- "Entering standard orbit, Sir."')) newcnd() if consumeTime(): return game.height = rnd.real(1400, 8600) - prout(_("Sulu- \"Entered orbit at altitude %.2f kilometers.\"") % game.height) + prout(_('Sulu- "Entered orbit at altitude %.2f kilometers."') % game.height) game.inorbit = True game.ididit = True + def sensor(): "Examine planets in this quadrant." if damaged(DSRSENS): @@ -4766,24 +5272,27 @@ def sensor(): return if game.iplnet is None: if game.options & OPTION_TTY: - prout(_("Spock- \"No planet in this quadrant, Captain.\"")) + prout(_('Spock- "No planet in this quadrant, Captain."')) return if game.iplnet.known == "unknown": - prout(_("Spock- \"Sensor scan for Quadrant %s-") % game.quadrant) + prout(_('Spock- "Sensor scan for Quadrant %s-') % game.quadrant) skip(1) - prout(_(" Planet at Sector %s is of class %s.") % - (game.plnet, game.iplnet.pclass)) - if game.iplnet.known=="shuttle_down": + prout( + _(" Planet at Sector %s is of class %s.") + % (game.plnet, game.iplnet.pclass) + ) + if game.iplnet.known == "shuttle_down": prout(_(" Sensors show Galileo still on surface.")) proutn(_(" Readings indicate")) if game.iplnet.crystals != "present": proutn(_(" no")) - prout(_(" dilithium crystals present.\"")) + prout(_(' dilithium crystals present."')) if game.iplnet.known == "unknown": game.iplnet.known = "known" elif game.iplnet.inhabited: - prout(_("Spock- \"The inhabited planet %s ") % game.iplnet.name) - prout(_(" is located at Sector %s, Captain.\"") % game.plnet) + prout(_('Spock- "The inhabited planet %s ') % game.iplnet.name) + prout(_(' is located at Sector %s, Captain."') % game.plnet) + def beam(): "Use the transporter." @@ -4792,9 +5301,11 @@ def beam(): skip(1) if damaged(DTRANSP): prout(_("Transporter damaged.")) - if not damaged(DSHUTTL) and (game.iplnet.known=="shuttle_down" or game.iscraft == "onship"): + if not damaged(DSHUTTL) and ( + game.iplnet.known == "shuttle_down" or game.iscraft == "onship" + ): skip(1) - proutn(_("Spock- \"May I suggest the shuttle craft, Sir?\" ")) + proutn(_('Spock- "May I suggest the shuttle craft, Sir?" ')) if ja(): shuttle() return @@ -4804,19 +5315,19 @@ def beam(): if game.shldup: prout(_("Impossible to transport through shields.")) return - if game.iplnet.known=="unknown": - prout(_("Spock- \"Captain, we have no information on this planet")) + if game.iplnet.known == "unknown": + prout(_('Spock- "Captain, we have no information on this planet')) prout(_(" and Starfleet Regulations clearly state that in this situation")) - prout(_(" you may not go down.\"")) + prout(_(' you may not go down."')) return - if not game.landed and game.iplnet.crystals=="absent": - prout(_("Spock- \"Captain, I fail to see the logic in")) + if not game.landed and game.iplnet.crystals == "absent": + prout(_('Spock- "Captain, I fail to see the logic in')) prout(_(" exploring a planet with no dilithium crystals.")) - proutn(_(" Are you sure this is wise?\" ")) + proutn(_(' Are you sure this is wise?" ')) if not ja(): scanner.chew() return - if (game.options & OPTION_ALMY): + if game.options & OPTION_ALMY: nrgneed = 50 * game.skill + game.height / 100.0 if nrgneed > game.energy: prout(_("Engineering to bridge--")) @@ -4827,15 +5338,17 @@ def beam(): prout(_(" Captain, we have enough energy only to transport you down to")) prout(_(" the planet, but there wouldn't be an energy for the trip back.")) if game.iplnet.known == "shuttle_down": - prout(_(" Although the Galileo shuttle craft may still be on a surface.")) - proutn(_(" Are you sure this is wise?\" ")) + prout( + _(" Although the Galileo shuttle craft may still be on a surface.") + ) + proutn(_(' Are you sure this is wise?" ')) if not ja(): scanner.chew() return if game.landed: # Coming from planet - if game.iplnet.known=="shuttle_down": - proutn(_("Spock- \"Wouldn't you rather take the Galileo?\" ")) + if game.iplnet.known == "shuttle_down": + proutn(_('Spock- "Wouldn\'t you rather take the Galileo?" ')) if ja(): scanner.chew() return @@ -4845,14 +5358,14 @@ def beam(): prout(_("Kirk whips out communicator...")) prouts(_("BEEP BEEP BEEP")) skip(2) - prout(_("\"Kirk to enterprise- Lock on coordinates...energize.\"")) + prout(_('"Kirk to enterprise- Lock on coordinates...energize."')) else: # Going to planet - prout(_("Scotty- \"Transporter room ready, Sir.\"")) + prout(_('Scotty- "Transporter room ready, Sir."')) skip(1) prout(_("Kirk and landing party prepare to beam down to planet surface.")) skip(1) - prout(_("Kirk- \"Energize.\"")) + prout(_('Kirk- "Energize."')) game.ididit = True skip(1) prouts("WWHOOOIIIIIRRRRREEEE.E.E. . . . . . .") @@ -4860,7 +5373,7 @@ def beam(): if not rnd.withprob(0.98): prouts("BOOOIIIOOOIIOOOOIIIOIING . . .") skip(2) - prout(_("Scotty- \"Oh my God! I've lost them.\"")) + prout(_('Scotty- "Oh my God! I\'ve lost them."')) finish(FLOST) return prouts(". . . . . . .E.E.EEEERRRRRIIIIIOOOHWW") @@ -4868,7 +5381,7 @@ def beam(): game.energy -= nrgneed skip(2) prout(_("Transport complete.")) - if game.landed and game.iplnet.known=="shuttle_down": + if game.landed and game.iplnet.known == "shuttle_down": prout(_("The shuttle craft Galileo is here!")) if not game.landed and game.imine: game.icrystl = True @@ -4876,6 +5389,7 @@ def beam(): game.imine = False return + def mine(): "Strip-mine a world for dilithium." skip(1) @@ -4896,13 +5410,14 @@ def mine(): prout(_("With all those fresh crystals aboard the ") + crmshp()) prout(_("there's no reason to mine more at this time.")) return - game.optime = rnd.real(0.1, 0.3)*(ord(game.iplnet.pclass)-ord("L")) + game.optime = rnd.real(0.1, 0.3) * (ord(game.iplnet.pclass) - ord("L")) if consumeTime(): return prout(_("Mining operation complete.")) game.iplnet.crystals = "mined" game.imine = game.ididit = True + def usecrystals(): "Use dilithium crystals." game.ididit = False @@ -4912,24 +5427,24 @@ def usecrystals(): prout(_("No dilithium crystals available.")) return if game.energy >= 1000: - prout(_("Spock- \"Captain, Starfleet Regulations prohibit such an operation")) + prout(_('Spock- "Captain, Starfleet Regulations prohibit such an operation')) prout(_(" except when Condition Yellow exists.")) return - prout(_("Spock- \"Captain, I must warn you that loading")) + prout(_('Spock- "Captain, I must warn you that loading')) prout(_(" raw dilithium crystals into the ship's power")) prout(_(" system may risk a severe explosion.")) - proutn(_(" Are you sure this is wise?\" ")) + proutn(_(' Are you sure this is wise?" ')) if not ja(): scanner.chew() return skip(1) - prout(_("Engineering Officer Scott- \"(GULP) Aye Sir.")) - prout(_(" Mr. Spock and I will try it.\"")) + prout(_('Engineering Officer Scott- "(GULP) Aye Sir.')) + prout(_(' Mr. Spock and I will try it."')) skip(1) - prout(_("Spock- \"Crystals in place, Sir.")) - prout(_(" Ready to activate circuit.\"")) + prout(_('Spock- "Crystals in place, Sir.')) + prout(_(' Ready to activate circuit."')) skip(1) - prouts(_("Scotty- \"Keep your fingers crossed, Sir!\"")) + prouts(_('Scotty- "Keep your fingers crossed, Sir!"')) skip(1) if rnd.withprob(game.cryprob): prouts(_(" \"Activating now! - - No good! It's***")) @@ -4942,13 +5457,14 @@ def usecrystals(): kaboom() return game.energy += rnd.real(5000.0, 5500.0) - prouts(_(" \"Activating now! - - ")) + prouts(_(' "Activating now! - - ')) prout(_("The instruments")) prout(_(" are going crazy, but I think it's")) - prout(_(" going to work!! Congratulations, Sir!\"")) + prout(_(' going to work!! Congratulations, Sir!"')) game.cryprob *= 2.0 game.ididit = True + def shuttle(): "Use shuttlecraft for planetary jaunt." scanner.chew() @@ -4961,7 +5477,7 @@ def shuttle(): prout(_("Ye Faerie Queene had no shuttle craft.")) elif game.damage[DSHUTTL] > 0: prout(_("The Galileo is damaged.")) - else: # game.damage[DSHUTTL] < 0 + else: # game.damage[DSHUTTL] < 0 prout(_("Shuttle craft is now serving Big Macs.")) return if not game.inorbit: @@ -4970,24 +5486,26 @@ def shuttle(): if (game.iplnet.known != "shuttle_down") and game.iscraft != "onship": prout(_("Shuttle craft not currently available.")) return - if not game.landed and game.iplnet.known=="shuttle_down": + if not game.landed and game.iplnet.known == "shuttle_down": prout(_("You will have to beam down to retrieve the shuttle craft.")) return if game.shldup or game.condition == "docked": prout(_("Shuttle craft cannot pass through shields.")) return - if game.iplnet.known=="unknown": - prout(_("Spock- \"Captain, we have no information on this planet")) + if game.iplnet.known == "unknown": + prout(_('Spock- "Captain, we have no information on this planet')) prout(_(" and Starfleet Regulations clearly state that in this situation")) - prout(_(" you may not fly down.\"")) + prout(_(' you may not fly down."')) return - game.optime = 3.0e-5*game.height - if game.optime >= 0.8*game.state.remtime: - prout(_("First Officer Spock- \"Captain, I compute that such")) - proutn(_(" a maneuver would require approximately %2d%% of our") % \ - int(100*game.optime/game.state.remtime)) + game.optime = 3.0e-5 * game.height + if game.optime >= 0.8 * game.state.remtime: + prout(_('First Officer Spock- "Captain, I compute that such')) + proutn( + _(" a maneuver would require approximately %2d%% of our") + % int(100 * game.optime / game.state.remtime) + ) prout(_("remaining time.")) - proutn(_("Are you sure this is wise?\" ")) + proutn(_('Are you sure this is wise?" ')) if not ja(): game.optime = 0.0 return @@ -4996,7 +5514,7 @@ def shuttle(): if game.iscraft == "onship": # Galileo on ship! if not damaged(DTRANSP): - proutn(_("Spock- \"Would you rather use the transporter?\" ")) + proutn(_('Spock- "Would you rather use the transporter?" ')) if ja(): beam() return @@ -5008,7 +5526,7 @@ def shuttle(): skip(1) if consumeTime(): return - game.iplnet.known="shuttle_down" + game.iplnet.known = "shuttle_down" prout(_("Trip complete.")) return else: @@ -5018,7 +5536,7 @@ def shuttle(): skip(1) prouts(_("The short hop begins . . .")) skip(1) - game.iplnet.known="known" + game.iplnet.known = "known" game.icraft = True skip(1) game.landed = False @@ -5035,7 +5553,7 @@ def shuttle(): else: # Kirk on ship and so is Galileo prout(_("Mining party assembles in the hangar deck,")) - prout(_("ready to board the shuttle craft \"Galileo\".")) + prout(_('ready to board the shuttle craft "Galileo".')) skip(1) prouts(_("The hangar doors open; the trip begins.")) skip(1) @@ -5049,26 +5567,27 @@ def shuttle(): prout(_("Trip complete.")) return + def deathray(): "Use the big zapper." game.ididit = False skip(1) scanner.chew() - if game.ship != 'E': + if game.ship != "E": prout(_("Ye Faerie Queene has no death ray.")) return - if len(game.enemies)==0: - prout(_("Sulu- \"But Sir, there are no enemies in this quadrant.\"")) + if len(game.enemies) == 0: + prout(_('Sulu- "But Sir, there are no enemies in this quadrant."')) return if damaged(DDRAY): prout(_("Death Ray is damaged.")) return prout(_("Spock- \"Captain, the 'Experimental Death Ray'")) prout(_(" is highly unpredictible. Considering the alternatives,")) - proutn(_(" are you sure this is wise?\" ")) + proutn(_(' are you sure this is wise?" ')) if not ja(): return - prout(_("Spock- \"Acknowledged.\"")) + prout(_('Spock- "Acknowledged."')) skip(1) game.ididit = True prouts(_("WHOOEE ... WHOOEE ... WHOOEE ... WHOOEE")) @@ -5077,8 +5596,8 @@ def deathray(): prout(_("Spock and Scotty ready the death ray and")) prout(_("prepare to channel all ship's power to the device.")) skip(1) - prout(_("Spock- \"Preparations complete, sir.\"")) - prout(_("Kirk- \"Engage!\"")) + prout(_('Spock- "Preparations complete, sir."')) + prout(_('Kirk- "Engage!"')) skip(1) prouts(_("WHIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR")) skip(1) @@ -5090,24 +5609,28 @@ def deathray(): dprob = 0.5 r = rnd.real() if r > dprob: - prouts(_("Sulu- \"Captain! It's working!\"")) + prouts(_('Sulu- "Captain! It\'s working!"')) skip(2) while len(game.enemies) > 0: - deadkl(game.enemies[-1].location, game.quad[game.enemies[-1].location.i][game.enemies[-1].location.j],game.enemies[-1].location) - prout(_("Ensign Chekov- \"Congratulations, Captain!\"")) + deadkl( + game.enemies[-1].location, + game.quad[game.enemies[-1].location.i][game.enemies[-1].location.j], + game.enemies[-1].location, + ) + prout(_('Ensign Chekov- "Congratulations, Captain!"')) if game.unwon() == 0: finish(FWON) - if (game.options & OPTION_ALMY): + if game.options & OPTION_ALMY: prout(_("Spock- \"Captain, I believe the `Experimental Death Ray'")) if rnd.withprob(0.05): - prout(_(" is still operational.\"")) + prout(_(' is still operational."')) else: - prout(_(" has been rendered nonfunctional.\"")) + prout(_(' has been rendered nonfunctional."')) game.damage[DDRAY] = 39.95 return - r = rnd.real() # Pick failure method + r = rnd.real() # Pick failure method if r <= 0.30: - prouts(_("Sulu- \"Captain! It's working!\"")) + prouts(_('Sulu- "Captain! It\'s working!"')) skip(1) prouts(_("***RED ALERT! RED ALERT!")) skip(1) @@ -5121,89 +5644,122 @@ def deathray(): kaboom() return if r <= 0.55: - prouts(_("Sulu- \"Captain! Yagabandaghangrapl, brachriigringlanbla!\"")) + prouts(_('Sulu- "Captain! Yagabandaghangrapl, brachriigringlanbla!"')) skip(1) - prout(_("Lt. Uhura- \"Graaeek! Graaeek!\"")) + prout(_('Lt. Uhura- "Graaeek! Graaeek!"')) skip(1) - prout(_("Spock- \"Fascinating! . . . All humans aboard")) + prout(_('Spock- "Fascinating! . . . All humans aboard')) prout(_(" have apparently been transformed into strange mutations.")) prout(_(" Vulcans do not seem to be affected.")) skip(1) - prout(_("Kirk- \"Raauch! Raauch!\"")) + prout(_('Kirk- "Raauch! Raauch!"')) finish(FDRAY) return if r <= 0.75: - prouts(_("Sulu- \"Captain! It's --WHAT?!?!\"")) + prouts(_('Sulu- "Captain! It\'s --WHAT?!?!"')) skip(2) - proutn(_("Spock- \"I believe the word is")) + proutn(_('Spock- "I believe the word is')) prouts(_(" *ASTONISHING*")) prout(_(" Mr. Sulu.")) for i in range(QUADSIZE): for j in range(QUADSIZE): - if game.quad[i][j] == '.': - game.quad[i][j] = '?' + if game.quad[i][j] == ".": + game.quad[i][j] = "?" prout(_(" Captain, our quadrant is now infested with")) prouts(_(" - - - - - - *THINGS*.")) skip(1) - prout(_(" I have no logical explanation.\"")) + prout(_(' I have no logical explanation."')) return - prouts(_("Sulu- \"Captain! The Death Ray is creating tribbles!\"")) + prouts(_('Sulu- "Captain! The Death Ray is creating tribbles!"')) skip(1) - prout(_("Scotty- \"There are so many tribbles down here")) + prout(_('Scotty- "There are so many tribbles down here')) prout(_(" in Engineering, we can't move for 'em, Captain.\"")) finish(FTRIBBLE) return + # Code from reports.c begins here + def attackreport(curt): "eport status of bases under attack." if not curt: if is_scheduled(FCDBAS): - prout(_("Starbase in Quadrant %s is currently under Commander attack.") % game.battle) + prout( + _("Starbase in Quadrant %s is currently under Commander attack.") + % game.battle + ) prout(_("It can hold out until Stardate %d.") % int(scheduled(FCDBAS))) elif game.isatb == 1: - prout(_("Starbase in Quadrant %s is under Super-commander attack.") % game.state.kscmdr) + prout( + _("Starbase in Quadrant %s is under Super-commander attack.") + % game.state.kscmdr + ) prout(_("It can hold out until Stardate %d.") % int(scheduled(FSCDBAS))) else: prout(_("No Starbase is currently under attack.")) else: if is_scheduled(FCDBAS): - proutn(_("Base in %s attacked by C. Alive until %.1f") % (game.battle, scheduled(FCDBAS))) + proutn( + _("Base in %s attacked by C. Alive until %.1f") + % (game.battle, scheduled(FCDBAS)) + ) if game.isatb: - proutn(_("Base in %s attacked by S. Alive until %.1f") % (game.state.kscmdr, scheduled(FSCDBAS))) + proutn( + _("Base in %s attacked by S. Alive until %.1f") + % (game.state.kscmdr, scheduled(FSCDBAS)) + ) clreol() + def report(): # report on general game status scanner.chew() # pylint: disable=consider-using-ternary s1 = (game.thawed and _("thawed ")) or "" - s2 = {1:"short", 2:"medium", 4:"long"}[game.length] - s3 = (None, _("novice"), _("fair"), - _("good"), _("expert"), _("emeritus"))[game.skill] - prout(_("You %s a %s%s %s game.") % ((_("were playing"), _("are playing"))[game.alldone], s1, s2, s3)) - if game.skill>SKILL_GOOD and game.thawed and not game.alldone: + s2 = {1: "short", 2: "medium", 4: "long"}[game.length] + s3 = (None, _("novice"), _("fair"), _("good"), _("expert"), _("emeritus"))[ + game.skill + ] + prout( + _("You %s a %s%s %s game.") + % ((_("were playing"), _("are playing"))[game.alldone], s1, s2, s3) + ) + if game.skill > SKILL_GOOD and game.thawed and not game.alldone: prout(_("No plaque is allowed.")) if game.tourn: prout(_("This is tournament game %d.") % game.tourn) - prout(_("Your secret password is \"%s\"") % game.passwd) - proutn(_("%d of %d Klingons have been killed") % (((game.inkling + game.incom + game.inscom) - game.unwon()), - (game.inkling + game.incom + game.inscom))) + prout(_('Your secret password is "%s"') % game.passwd) + proutn( + _("%d of %d Klingons have been killed") + % ( + ((game.inkling + game.incom + game.inscom) - game.unwon()), + (game.inkling + game.incom + game.inscom), + ) + ) if game.incom - len(game.state.kcmdr): - prout(_(", including %d Commander%s.") % (game.incom - len(game.state.kcmdr), (_("s"), "")[(game.incom - len(game.state.kcmdr))==1])) + prout( + _(", including %d Commander%s.") + % ( + game.incom - len(game.state.kcmdr), + (_("s"), "")[(game.incom - len(game.state.kcmdr)) == 1], + ) + ) elif game.inkling - game.remkl() + (game.inscom - game.state.nscrem) > 0: prout(_(", but no Commanders.")) else: prout(".") if game.skill > SKILL_FAIR: - prout(_("The Super Commander has %sbeen destroyed.") % ("", _("not "))[game.state.nscrem]) + prout( + _("The Super Commander has %sbeen destroyed.") + % ("", _("not "))[game.state.nscrem] + ) if len(game.state.baseq) != game.inbase: proutn(_("There ")) - if game.inbase-len(game.state.baseq)==1: + if game.inbase - len(game.state.baseq) == 1: proutn(_("has been 1 base")) else: - proutn(_("have been %d bases") % (game.inbase-len(game.state.baseq))) + proutn(_("have been %d bases") % (game.inbase - len(game.state.baseq))) prout(_(" destroyed, %d remaining.") % len(game.state.baseq)) else: prout(_("There are %d bases.") % game.inbase) @@ -5213,13 +5769,16 @@ def report(): attackreport(False) game.iseenit = True if game.casual: - prout(_("%d casualt%s suffered so far.") % (game.casual, ("y", "ies")[game.casual!=1])) + prout( + _("%d casualt%s suffered so far.") + % (game.casual, ("y", "ies")[game.casual != 1]) + ) if game.brigcapacity != game.brigfree: - embriggened = game.brigcapacity-game.brigfree + embriggened = game.brigcapacity - game.brigfree if embriggened == 1: prout(_("1 Klingon in brig")) else: - prout(_("%d Klingons in brig.") % embriggened) + prout(_("%d Klingons in brig.") % embriggened) if game.kcaptured == 0: pass elif game.kcaptured == 1: @@ -5227,15 +5786,18 @@ def report(): else: prout(_("%d captured Klingons turned in to Star Fleet.") % game.kcaptured) if game.nhelp: - prout(_("There were %d call%s for help.") % (game.nhelp, ("" , _("s"))[game.nhelp!=1])) - if game.ship == 'E': + prout( + _("There were %d call%s for help.") + % (game.nhelp, ("", _("s"))[game.nhelp != 1]) + ) + if game.ship == "E": proutn(_("You have ")) if game.nprobes: proutn("%d" % (game.nprobes)) else: proutn(_("no")) proutn(_(" deep space probe")) - if game.nprobes!=1: + if game.nprobes != 1: proutn(_("s")) prout(".") if communicating() and is_scheduled(FDSPROB): @@ -5245,18 +5807,21 @@ def report(): proutn(_("A deep space probe is in ")) prout("Quadrant %s." % game.probe.quadrant()) if game.icrystl: - if game.cryprob <= .05: + if game.cryprob <= 0.05: prout(_("Dilithium crystals aboard ship... not yet used.")) else: - i=0 + i = 0 ai = 0.05 while game.cryprob > ai: ai *= 2.0 i += 1 - prout(_("Dilithium crystals have been used %d time%s.") % \ - (i, (_("s"), "")[i==1])) + prout( + _("Dilithium crystals have been used %d time%s.") + % (i, (_("s"), "")[i == 1]) + ) skip(1) + def lrscan(silent): "Long-range sensor scan." if damaged(DLRSENS): @@ -5269,10 +5834,10 @@ def lrscan(silent): prout(_("Starbase's long-range scan")) elif not silent: prout(_("Long-range scan")) - for x in range(game.quadrant.i-1, game.quadrant.i+2): + for x in range(game.quadrant.i - 1, game.quadrant.i + 2): if not silent: proutn(" ") - for y in range(game.quadrant.j-1, game.quadrant.j+2): + for y in range(game.quadrant.j - 1, game.quadrant.j + 2): if not Coord(x, y).valid_quadrant(): if not silent: proutn(" -1") @@ -5285,11 +5850,16 @@ def lrscan(silent): if not silent and game.state.galaxy[x][y].supernova: proutn(" ***") elif not silent: - cn = " %3d" % (game.state.chart[x][y].klingons*100 + game.state.chart[x][y].starbase * 10 + game.state.chart[x][y].stars) - proutn(((3 - len(cn)) * '.') + cn) + cn = " %3d" % ( + game.state.chart[x][y].klingons * 100 + + game.state.chart[x][y].starbase * 10 + + game.state.chart[x][y].stars + ) + proutn(((3 - len(cn)) * ".") + cn) if not silent: prout(" ") + def damagereport(): "Damage report." jdam = False @@ -5298,14 +5868,20 @@ def damagereport(): if damaged(i): if not jdam: prout(_("DEVICE REPAIR TIMES")) - prout(_(" IN FLIGHT DOCKED")) + prout( + _( + " IN FLIGHT DOCKED" + ) + ) jdam = True - prout(" %-26s\t%8.2f\t\t%8.2f" % (device[i], - game.damage[i]+0.05, - DOCKFAC*game.damage[i]+0.005)) + prout( + " %-26s\t%8.2f\t\t%8.2f" + % (device[i], game.damage[i] + 0.05, DOCKFAC * game.damage[i] + 0.005) + ) if not jdam: prout(_("All devices functional.")) + def rechart(): "Update the chart in the Enterprise's computer from galaxy data." game.lastchart = game.state.date @@ -5316,85 +5892,117 @@ def rechart(): game.state.chart[i][j].starbase = game.state.galaxy[i][j].starbase game.state.chart[i][j].stars = game.state.galaxy[i][j].stars + def chart(): "Display the star chart." scanner.chew() - if (game.options & OPTION_AUTOSCAN): + if game.options & OPTION_AUTOSCAN: lrscan(silent=True) if communicating(): rechart() if game.lastchart < game.state.date and game.condition == "docked": - prout(_("Spock- \"I revised the Star Chart from the starbase's records.\"")) + prout(_('Spock- "I revised the Star Chart from the starbase\'s records."')) rechart() prout(_(" STAR CHART FOR THE KNOWN GALAXY")) if game.state.date > game.lastchart: - prout(_("(Last surveillance update %d stardates ago).") % ((int)(game.state.date-game.lastchart))) + prout( + _("(Last surveillance update %d stardates ago).") + % ((int)(game.state.date - game.lastchart)) + ) prout(" 1 2 3 4 5 6 7 8") for i in range(GALSIZE): - if (game.options & OPTION_ALPHAMERIC): - proutn("%c |" % letterize(i+1)) + if game.options & OPTION_ALPHAMERIC: + proutn("%c |" % letterize(i + 1)) else: - proutn("%d |" % (i+1)) + proutn("%d |" % (i + 1)) for j in range(GALSIZE): - if (game.options & OPTION_SHOWME) and i == game.quadrant.i and j == game.quadrant.j: + if ( + (game.options & OPTION_SHOWME) + and i == game.quadrant.i + and j == game.quadrant.j + ): proutn("<") else: proutn(" ") if game.state.galaxy[i][j].supernova: show = "***" - elif not game.state.galaxy[i][j].charted and game.state.galaxy[i][j].starbase: + elif ( + not game.state.galaxy[i][j].charted and game.state.galaxy[i][j].starbase + ): show = ".1." elif game.state.galaxy[i][j].charted: - show = "%3d" % (game.state.chart[i][j].klingons*100 + game.state.chart[i][j].starbase * 10 + game.state.chart[i][j].stars) - if (game.options & OPTION_DOTFILL): + show = "%3d" % ( + game.state.chart[i][j].klingons * 100 + + game.state.chart[i][j].starbase * 10 + + game.state.chart[i][j].stars + ) + if game.options & OPTION_DOTFILL: show = show.replace(" ", ".") else: show = "..." proutn(show) - if (game.options & OPTION_SHOWME) and i == game.quadrant.i and j == game.quadrant.j: + if ( + (game.options & OPTION_SHOWME) + and i == game.quadrant.i + and j == game.quadrant.j + ): proutn(">") else: proutn(" ") proutn(" |") - if i 0 for x in game.damage]))) + prstat( + _("Condition"), + _("%s, %i DAMAGES") + % (game.condition.upper(), sum([x > 0 for x in game.damage])), + ) if game.iscloaked: prout(_(", CLOAKED")) if not req or req == 3: @@ -5424,9 +6032,11 @@ def status(req=0): s = _("UP,") else: s = _("DOWN,") - data = _(" %d%% %.1f units") \ - % (int((100.0*game.shield)/game.inshld + 0.5), game.shield) - prstat(_("Shields"), s+data) + data = _(" %d%% %.1f units") % ( + int((100.0 * game.shield) / game.inshld + 0.5), + game.shield, + ) + prstat(_("Shields"), s + data) if not req or req == 9: prstat(_("Klingons Left"), "%d" % game.unwon()) if not req or req == 10: @@ -5439,9 +6049,10 @@ def status(req=0): elif not req or req == 11: attackreport(not req) + def request(): "Request specified status data, a historical relic from slow TTYs." - requests = ("da","co","po","ls","wa","en","to","sh","kl","sy", "ti") + requests = ("da", "co", "po", "ls", "wa", "en", "to", "sh", "kl", "sy", "ti") while scanner.nexttok() == "IHEOL": proutn(_("Information desired? ")) scanner.chew() @@ -5452,38 +6063,47 @@ def request(): prout((" date, condition, position, lsupport, warpfactor,")) prout((" energy, torpedoes, shields, klingons, system, time.")) + def srscan(): "Short-range scan." - goodScan=True + goodScan = True if damaged(DSRSENS): # Allow base's sensors if docked if game.condition != "docked": prout(_(" S.R. SENSORS DAMAGED!")) - goodScan=False + goodScan = False else: prout(_(" [Using Base's sensors]")) else: prout(_(" Short-range scan")) if goodScan and communicating(): - game.state.chart[game.quadrant.i][game.quadrant.j].klingons = game.state.galaxy[game.quadrant.i][game.quadrant.j].klingons - game.state.chart[game.quadrant.i][game.quadrant.j].starbase = game.state.galaxy[game.quadrant.i][game.quadrant.j].starbase - game.state.chart[game.quadrant.i][game.quadrant.j].stars = game.state.galaxy[game.quadrant.i][game.quadrant.j].stars + game.state.chart[game.quadrant.i][game.quadrant.j].klingons = game.state.galaxy[ + game.quadrant.i + ][game.quadrant.j].klingons + game.state.chart[game.quadrant.i][game.quadrant.j].starbase = game.state.galaxy[ + game.quadrant.i + ][game.quadrant.j].starbase + game.state.chart[game.quadrant.i][game.quadrant.j].stars = game.state.galaxy[ + game.quadrant.i + ][game.quadrant.j].stars game.state.galaxy[game.quadrant.i][game.quadrant.j].charted = True prout(" 1 2 3 4 5 6 7 8 9 10") if game.condition != "docked": newcnd() for i in range(QUADSIZE): - if (game.options & OPTION_ALPHAMERIC): - proutn("%c " % letterize(i+1)) + if game.options & OPTION_ALPHAMERIC: + proutn("%c " % letterize(i + 1)) else: - proutn("%2d " % (i+1)) + proutn("%2d " % (i + 1)) for j in range(QUADSIZE): sectscan(goodScan, i, j) skip(1) + def eta(): "Use computer to get estimated time of arrival for a warp jump." - w1 = Coord(); w2 = Coord() + w1 = Coord() + w2 = Coord() prompt = False if damaged(DCOMPTR): prout(_("COMPUTER DAMAGED, USE A POCKET CALCULATOR.")) @@ -5493,45 +6113,47 @@ def eta(): prompt = True scanner.chew() proutn(_("Destination quadrant and/or sector? ")) - if scanner.nexttok()!="IHREAL": + if scanner.nexttok() != "IHREAL": huh() return - w1.j = int(scanner.real-0.5) + w1.j = int(scanner.real - 0.5) if scanner.nexttok() != "IHREAL": huh() return - w1.i = int(scanner.real-0.5) + w1.i = int(scanner.real - 0.5) if scanner.nexttok() == "IHREAL": - w2.j = int(scanner.real-0.5) + w2.j = int(scanner.real - 0.5) if scanner.nexttok() != "IHREAL": huh() return - w2.i = int(scanner.real-0.5) + w2.i = int(scanner.real - 0.5) else: - if game.quadrant.j>w1.i: + if game.quadrant.j > w1.i: w2.i = 0 else: - w2.i=QUADSIZE-1 - if game.quadrant.i>w1.j: + w2.i = QUADSIZE - 1 + if game.quadrant.i > w1.j: w2.j = 0 else: - w2.j=QUADSIZE-1 + w2.j = QUADSIZE - 1 if not w1.valid_quadrant() or not w2.valid_sector(): huh() return - dist = math.sqrt((w1.j-game.quadrant.j+(w2.j-game.sector.j)/(QUADSIZE*1.0))**2+ - (w1.i-game.quadrant.i+(w2.i-game.sector.i)/(QUADSIZE*1.0))**2) + dist = math.sqrt( + (w1.j - game.quadrant.j + (w2.j - game.sector.j) / (QUADSIZE * 1.0)) ** 2 + + (w1.i - game.quadrant.i + (w2.i - game.sector.i) / (QUADSIZE * 1.0)) ** 2 + ) wfl = False if prompt: - prout(_("Answer \"no\" if you don't know the value:")) + prout(_('Answer "no" if you don\'t know the value:')) while True: scanner.chew() proutn(_("Time or arrival date? ")) - if scanner.nexttok()=="IHREAL": + if scanner.nexttok() == "IHREAL": ttime = scanner.real if ttime > game.state.date: - ttime -= game.state.date # Actually a star date - twarp=(math.floor(math.sqrt((10.0*dist)/ttime)*10.0)+1.0)/10.0 + ttime -= game.state.date # Actually a star date + twarp = (math.floor(math.sqrt((10.0 * dist) / ttime) * 10.0) + 1.0) / 10.0 if ttime <= 1e-10 or twarp > 10: prout(_("We'll never make it, sir.")) scanner.chew() @@ -5540,28 +6162,28 @@ def eta(): break scanner.chew() proutn(_("Warp factor? ")) - if scanner.nexttok()== "IHREAL": + if scanner.nexttok() == "IHREAL": wfl = True twarp = scanner.real - if twarp<1.0 or twarp > 10.0: + if twarp < 1.0 or twarp > 10.0: huh() return break prout(_("Captain, certainly you can give me one of these.")) while True: scanner.chew() - ttime = (10.0*dist)/twarp**2 - tpower = dist*twarp*twarp*twarp*(game.shldup+1) + ttime = (10.0 * dist) / twarp ** 2 + tpower = dist * twarp * twarp * twarp * (game.shldup + 1) if tpower >= game.energy: prout(_("Insufficient energy, sir.")) - if not game.shldup or tpower > game.energy*2.0: + if not game.shldup or tpower > game.energy * 2.0: if not wfl: return proutn(_("New warp factor to try? ")) if scanner.nexttok() == "IHREAL": wfl = True twarp = scanner.real - if twarp<1.0 or twarp > 10.0: + if twarp < 1.0 or twarp > 10.0: huh() return continue @@ -5574,27 +6196,29 @@ def eta(): tpower /= 2 else: proutn(_("Remaining")) - prout(_(" energy will be %.2f.") % (game.energy-tpower)) + prout(_(" energy will be %.2f.") % (game.energy - tpower)) if wfl: - prout(_("And we will arrive at stardate %.2f.") % (game.state.date+ttime)) - elif twarp==1.0: + prout(_("And we will arrive at stardate %.2f.") % (game.state.date + ttime)) + elif twarp == 1.0: prout(_("Any warp speed is adequate.")) else: prout(_("Minimum warp needed is %.2f,") % (twarp)) - prout(_("and we will arrive at stardate %.2f.") % (game.state.date+ttime)) + prout(_("and we will arrive at stardate %.2f.") % (game.state.date + ttime)) if game.state.remtime < ttime: prout(_("Unfortunately, the Federation will be destroyed by then.")) if twarp > 6.0: prout(_("You'll be taking risks at that speed, Captain")) - if (game.isatb==1 and game.state.kscmdr == w1 and \ - scheduled(FSCDBAS)< ttime+game.state.date) or \ - (scheduled(FCDBAS) 10.0: + if twarp < 1.0 or twarp > 10.0: huh() return else: @@ -5602,8 +6226,10 @@ def eta(): skip(1) return + # This is new in SST2K. + def goptions(): mode = scanner.nexttok() if mode == "IHEOL": @@ -5625,30 +6251,39 @@ def goptions(): else: prout(_("No such option as ") + scanner.token) if mode == "set": - if (not (game.options & OPTION_CURSES)) and (changemask & OPTION_CURSES): # pragma: no cover + if (not (game.options & OPTION_CURSES)) and ( + changemask & OPTION_CURSES + ): # pragma: no cover iostart() game.options |= changemask elif mode == "clear": - if (game.options & OPTION_CURSES) and (not (changemask & OPTION_CURSES)): # pragma: no cover + if (game.options & OPTION_CURSES) and ( + not (changemask & OPTION_CURSES) + ): # pragma: no cover ioend() - game.options &=~ changemask + game.options &= ~changemask prout(_("Acknowledged, Captain.")) else: huh() scanner.chew() skip(1) + # Code from setup.c begins here + def prelim(): "Issue a historically correct banner." skip(2) prout(_("-SUPER- STAR TREK")) skip(1) + + # From the FORTRAN original # prout(_("Latest update-21 Sept 78")) # skip(1) + def freeze(boss): "Save game." if boss: @@ -5660,7 +6295,7 @@ def freeze(boss): if key != "IHALPHA": huh() return - if '.' not in scanner.token: + if "." not in scanner.token: scanner.token += ".trk" try: fp = open(scanner.token, "wb") @@ -5671,6 +6306,7 @@ def freeze(boss): fp.close() scanner.chew() + def thaw(): "Retrieve saved game." global game @@ -5682,7 +6318,7 @@ def thaw(): if key != "IHALPHA": huh() return True - if '.' not in scanner.token: + if "." not in scanner.token: scanner.token += ".trk" try: fp = open(scanner.token, "rb") @@ -5694,6 +6330,7 @@ def thaw(): scanner.chew() return False + # I used to find planets # with references in ST:TOS. Earth and the Alpha Centauri # Colony have been omitted. @@ -5702,39 +6339,39 @@ def thaw(): # because of the way planets are generated. This is a known bug. systnames = ( # Federation Worlds - _("Andoria (Fesoan)"), # several episodes - _("Tellar Prime (Miracht)"), # TOS: "Journey to Babel" - _("Vulcan (T'Khasi)"), # many episodes - _("Medusa"), # TOS: "Is There in Truth No Beauty?" - _("Argelius II (Nelphia)"), # TOS: "Wolf in the Fold" ("IV" in BSD) - _("Ardana"), # TOS: "The Cloud Minders" - _("Catulla (Cendo-Prae)"), # TOS: "The Way to Eden" - _("Gideon"), # TOS: "The Mark of Gideon" - _("Aldebaran III"), # TOS: "The Deadly Years" - _("Alpha Majoris I"), # TOS: "Wolf in the Fold" - _("Altair IV"), # TOS: "Amok Time - _("Ariannus"), # TOS: "Let That Be Your Last Battlefield" - _("Benecia"), # TOS: "The Conscience of the King" - _("Beta Niobe I (Sarpeidon)"), # TOS: "All Our Yesterdays" - _("Alpha Carinae II"), # TOS: "The Ultimate Computer" - _("Capella IV (Kohath)"), # TOS: "Friday's Child" (Class G) - _("Daran V"), # TOS: "For the World is Hollow and I Have Touched the Sky" - _("Deneb II"), # TOS: "Wolf in the Fold" ("IV" in BSD) - _("Eminiar VII"), # TOS: "A Taste of Armageddon" - _("Gamma Canaris IV"), # TOS: "Metamorphosis" - _("Gamma Tranguli VI (Vaalel)"), # TOS: "The Apple" - _("Ingraham B"), # TOS: "Operation: Annihilate" - _("Janus IV"), # TOS: "The Devil in the Dark" - _("Makus III"), # TOS: "The Galileo Seven" - _("Marcos XII"), # TOS: "And the Children Shall Lead", - _("Omega IV"), # TOS: "The Omega Glory" - _("Regulus V"), # TOS: "Amok Time - _("Deneva"), # TOS: "Operation -- Annihilate!" + _("Andoria (Fesoan)"), # several episodes + _("Tellar Prime (Miracht)"), # TOS: "Journey to Babel" + _("Vulcan (T'Khasi)"), # many episodes + _("Medusa"), # TOS: "Is There in Truth No Beauty?" + _("Argelius II (Nelphia)"), # TOS: "Wolf in the Fold" ("IV" in BSD) + _("Ardana"), # TOS: "The Cloud Minders" + _("Catulla (Cendo-Prae)"), # TOS: "The Way to Eden" + _("Gideon"), # TOS: "The Mark of Gideon" + _("Aldebaran III"), # TOS: "The Deadly Years" + _("Alpha Majoris I"), # TOS: "Wolf in the Fold" + _("Altair IV"), # TOS: "Amok Time + _("Ariannus"), # TOS: "Let That Be Your Last Battlefield" + _("Benecia"), # TOS: "The Conscience of the King" + _("Beta Niobe I (Sarpeidon)"), # TOS: "All Our Yesterdays" + _("Alpha Carinae II"), # TOS: "The Ultimate Computer" + _("Capella IV (Kohath)"), # TOS: "Friday's Child" (Class G) + _("Daran V"), # TOS: "For the World is Hollow and I Have Touched the Sky" + _("Deneb II"), # TOS: "Wolf in the Fold" ("IV" in BSD) + _("Eminiar VII"), # TOS: "A Taste of Armageddon" + _("Gamma Canaris IV"), # TOS: "Metamorphosis" + _("Gamma Tranguli VI (Vaalel)"), # TOS: "The Apple" + _("Ingraham B"), # TOS: "Operation: Annihilate" + _("Janus IV"), # TOS: "The Devil in the Dark" + _("Makus III"), # TOS: "The Galileo Seven" + _("Marcos XII"), # TOS: "And the Children Shall Lead", + _("Omega IV"), # TOS: "The Omega Glory" + _("Regulus V"), # TOS: "Amok Time + _("Deneva"), # TOS: "Operation -- Annihilate!" # Worlds from BSD Trek - _("Rigel II"), # TOS: "Shore Leave" ("III" in BSD) - _("Beta III"), # TOS: "The Return of the Archons" - _("Triacus"), # TOS: "And the Children Shall Lead", - _("Exo III"), # TOS: "What Are Little Girls Made Of?" (Class P) + _("Rigel II"), # TOS: "Shore Leave" ("III" in BSD) + _("Beta III"), # TOS: "The Return of the Archons" + _("Triacus"), # TOS: "And the Children Shall Lead", + _("Exo III"), # TOS: "What Are Little Girls Made Of?" (Class P) # # Others # _("Hansen's Planet"), # TOS: "The Galileo Seven" # _("Taurus IV"), # TOS: "The Galileo Seven" (class G) @@ -5747,34 +6384,35 @@ systnames = ( ) device = ( - _("S. R. Sensors"), \ - _("L. R. Sensors"), \ - _("Phasers"), \ - _("Photon Tubes"), \ - _("Life Support"), \ - _("Warp Engines"), \ - _("Impulse Engines"), \ - _("Shields"), \ - _("Subspace Radio"), \ - _("Shuttle Craft"), \ - _("Computer"), \ - _("Navigation System"), \ - _("Transporter"), \ - _("Shield Control"), \ - _("Death Ray"), \ - _("D. S. Probe"), \ - _("Cloaking Device"), \ + _("S. R. Sensors"), + _("L. R. Sensors"), + _("Phasers"), + _("Photon Tubes"), + _("Life Support"), + _("Warp Engines"), + _("Impulse Engines"), + _("Shields"), + _("Subspace Radio"), + _("Shuttle Craft"), + _("Computer"), + _("Navigation System"), + _("Transporter"), + _("Shield Control"), + _("Death Ray"), + _("D. S. Probe"), + _("Cloaking Device"), ) + def setup(): "Prepare to play, set up cosmos." w = Coord() # Decide how many of everything if choose(): - return # frozen game + return # frozen game # Prepare the Enterprise game.alldone = game.gamewon = game.shldchg = game.shldup = False - game.ship = 'E' + game.ship = "E" game.state.crew = FULLCREW game.energy = game.inenrg = 5000.0 game.shield = game.inshld = 2500.0 @@ -5803,10 +6441,10 @@ def setup(): # the starchart game.state.chart = fill2d(GALSIZE, lambda i_unused, j_unused: Page()) - game.state.planets = [] # Planet information - game.state.baseq = [] # Base quadrant coordinates - game.state.kcmdr = [] # Commander quadrant coordinates - game.statekscmdr = Coord() # Supercommander quadrant coordinates + game.state.planets = [] # Planet information + game.state.baseq = [] # Base quadrant coordinates + game.state.kcmdr = [] # Commander quadrant coordinates + game.statekscmdr = Coord() # Supercommander quadrant coordinates # Starchart is functional but we've never seen it game.lastchart = FOREVER @@ -5816,12 +6454,12 @@ def setup(): for j in range(GALSIZE): # Can't have more stars per quadrant than fit in one decimal digit, # if we do the chart representation will break. - k = rnd.integer(1, min(10, QUADSIZE**2/10)) + k = rnd.integer(1, min(10, QUADSIZE ** 2 / 10)) game.instar += k game.state.galaxy[i][j].stars = k # Locate star bases in galaxy if game.idebug: - prout("=== Allocating %d bases" % game.inbase) # pragma: no cover + prout("=== Allocating %d bases" % game.inbase) # pragma: no cover for i in range(game.inbase): while True: while True: @@ -5834,33 +6472,41 @@ def setup(): for j in range(1, i): # Improved placement algorithm to spread out bases distq = (w - game.state.baseq[j]).distance() - if distq < 6.0*(BASEMAX+1-game.inbase) and rnd.withprob(0.75): + if distq < 6.0 * (BASEMAX + 1 - game.inbase) and rnd.withprob(0.75): contflag = True if game.idebug: - prout("=== Abandoning base #%d at %s" % (i, w)) # pragma: no cover + prout( + "=== Abandoning base #%d at %s" % (i, w) + ) # pragma: no cover break - elif distq < 6.0 * (BASEMAX+1-game.inbase): + elif distq < 6.0 * (BASEMAX + 1 - game.inbase): if game.idebug: - prout("=== Saving base #%d, close to #%d" % (i, j)) # pragma: no cover + prout( + "=== Saving base #%d, close to #%d" % (i, j) + ) # pragma: no cover if not contflag: break if game.idebug: - prout("=== Placing base #%d in quadrant %s" % (i, w)) # pragma: no cover + prout("=== Placing base #%d in quadrant %s" % (i, w)) # pragma: no cover game.state.baseq.append(w) - game.state.galaxy[w.i][w.j].starbase = game.state.chart[w.i][w.j].starbase = True + game.state.galaxy[w.i][w.j].starbase = game.state.chart[w.i][ + w.j + ].starbase = True # Position ordinary Klingon Battle Cruisers krem = game.inkling - klumper = 0.25*game.skill*(9.0-game.length)+1.0 + klumper = 0.25 * game.skill * (9.0 - game.length) + 1.0 klumper = min(klumper, MAXKLQUAD) while True: r = rnd.real() - klump = int((1.0 - r*r)*klumper) + klump = int((1.0 - r * r) * klumper) klump = min(klump, krem) krem -= klump while True: w = randplace(GALSIZE) - if not game.state.galaxy[w.i][w.j].supernova and \ - game.state.galaxy[w.i][w.j].klingons + klump <= MAXKLQUAD: + if ( + not game.state.galaxy[w.i][w.j].supernova + and game.state.galaxy[w.i][w.j].klingons + klump <= MAXKLQUAD + ): break game.state.galaxy[w.i][w.j].klingons += klump if krem <= 0: @@ -5871,7 +6517,7 @@ def setup(): w = randplace(GALSIZE) if not welcoming(w) or w in game.state.kcmdr: continue - if (game.state.galaxy[w.i][w.j].klingons or rnd.withprob(0.25)): + if game.state.galaxy[w.i][w.j].klingons or rnd.withprob(0.25): break game.state.galaxy[w.i][w.j].klingons += 1 game.state.kcmdr.append(w) @@ -5885,7 +6531,7 @@ def setup(): new.quadrant = w new.crystals = "absent" if (game.options & OPTION_WORLDS) and i < NINHAB: - new.pclass = "M" # All inhabited planets are class M + new.pclass = "M" # All inhabited planets are class M new.crystals = "absent" new.known = "known" new.name = systnames[i] @@ -5913,8 +6559,8 @@ def setup(): # Initialize times for extraneous events schedule(FSNOVA, expran(0.5 * game.intime)) schedule(FTBEAM, expran(1.5 * (game.intime / len(game.state.kcmdr)))) - schedule(FSNAP, rnd.real(1.0, 2.0)) # Force an early snapshot - schedule(FBATTAK, expran(0.3*game.intime)) + schedule(FSNAP, rnd.real(1.0, 2.0)) # Force an early snapshot + schedule(FBATTAK, expran(0.3 * game.intime)) unschedule(FCDBAS) if game.state.nscrem: schedule(FSCMOVE, 0.2777) @@ -5945,11 +6591,20 @@ def setup(): skip(2) game.state.snap = False if game.skill == SKILL_NOVICE: - prout(_("It is stardate %d. The Federation is being attacked by") % int(game.state.date)) + prout( + _("It is stardate %d. The Federation is being attacked by") + % int(game.state.date) + ) prout(_("a deadly Klingon invasion force. As captain of the United")) prout(_("Starship U.S.S. Enterprise, it is your mission to seek out")) - prout(_("and destroy this invasion force of %d battle cruisers.") % ((game.inkling + game.incom + game.inscom))) - prout(_("You have an initial allotment of %d stardates to complete") % int(game.intime)) + prout( + _("and destroy this invasion force of %d battle cruisers.") + % ((game.inkling + game.incom + game.inscom)) + ) + prout( + _("You have an initial allotment of %d stardates to complete") + % int(game.intime) + ) prout(_("your mission. As you proceed you may be given more time.")) skip(1) prout(_("You will have %d supporting starbases.") % (game.inbase)) @@ -5977,11 +6632,16 @@ def setup(): clrscr() setwnd(message_window) newqad() - if len(game.enemies) - (thing.location == game.quadrant) - (game.tholian is not None): + if ( + len(game.enemies) + - (thing.location == game.quadrant) + - (game.tholian is not None) + ): game.shldup = True - if game.neutz: # bad luck to start in a Romulan Neutral Zone + if game.neutz: # bad luck to start in a Romulan Neutral Zone attack(torps_ok=False) + def choose(): "Choose your game type." game.tourn = None @@ -5990,12 +6650,16 @@ def choose(): game.skill = SKILL_NONE gametype = None wayback = 0 - while gametype is None or game.length == 0 or game.skill == SKILL_NONE or wayback == 0: + while ( + gametype is None or game.length == 0 or game.skill == SKILL_NONE or wayback == 0 + ): eol_is_fancy = False - if not scanner.inqueue or scanner.token == "IHEOL": # Can start with command line options + if ( + not scanner.inqueue or scanner.token == "IHEOL" + ): # Can start with command line options if gametype is None: proutn(_("Would you like a regular, tournament, or saved game? ")) - elif game.length==0: + elif game.length == 0: proutn(_("Would you like a Short, Medium, or Long game? ")) elif game.skill == SKILL_NONE: proutn(_("Are you a Novice, Fair, Good, Expert, or Emeritus player? ")) @@ -6006,8 +6670,8 @@ def choose(): if game.idebug: prout("-- Token: %s=%s" % (scanner.type, repr(scanner.token))) if scanner.token == "": - raise SystemExit(0) # Early end of replay - if scanner.token.startswith("r"): # regular + raise SystemExit(0) # Early end of replay + if scanner.token.startswith("r"): # regular gametype = "regular" elif scanner.token.startswith("t"): gametype = "tournament" @@ -6016,12 +6680,14 @@ def choose(): while scanner.nexttok() == "IHEOL": if scanner.real == 0: scanner.chew() - continue # We don't want a blank entry + continue # We don't want a blank entry game.tourn = int(round(scanner.real)) rnd.seed(scanner.real) if logfp: logfp.write("# rnd.seed(%d)\n" % scanner.real) - elif scanner.token.startswith("sa") or scanner.token.startswith("fr"): # saved or frozen + elif scanner.token.startswith("sa") or scanner.token.startswith( + "fr" + ): # saved or frozen gametype = "saved" if thaw(): continue @@ -6029,29 +6695,29 @@ def choose(): if game.passwd is None: continue if not game.alldone: - game.thawed = True # No plaque if not finished + game.thawed = True # No plaque if not finished report() waitfor() return True - elif scanner.token.startswith("s"): # short + elif scanner.token.startswith("s"): # short game.length = 1 - elif scanner.token.startswith("m"): # medium + elif scanner.token.startswith("m"): # medium game.length = 2 - elif scanner.token.startswith("l"): # long + elif scanner.token.startswith("l"): # long game.length = 4 - elif scanner.token.startswith("n"): # novice + elif scanner.token.startswith("n"): # novice game.skill = SKILL_NOVICE - elif (game.skill is None) and scanner.token.startswith("f"): # fair + elif (game.skill is None) and scanner.token.startswith("f"): # fair game.skill = SKILL_FAIR - elif scanner.token.startswith("g"): # good + elif scanner.token.startswith("g"): # good game.skill = SKILL_GOOD - elif scanner.token.startswith("e"): # expert + elif scanner.token.startswith("e"): # expert game.skill = SKILL_EXPERT - elif scanner.token.startswith("em"): # emeritus + elif scanner.token.startswith("em"): # emeritus game.skill = SKILL_EMERITUS elif scanner.type == "IHREAL": wayback = scanner.int() - elif (eol_is_fancy and scanner.token.startswith("\n")): + elif eol_is_fancy and scanner.token.startswith("\n"): wayback = time.localtime().tm_year elif scanner.token.startswith("\n"): continue @@ -6060,63 +6726,80 @@ def choose(): else: # Unrecognized token prout(_("Can't interpret %s") % repr(scanner.token)) - for (name, (option, year)) in option_names.items(): + for (__, (option, year)) in option_names.items(): if wayback < year: - game.options &=~ option + game.options &= ~option setpassword() - if game.passwd == "debug": # pragma: no cover + if game.passwd == "debug": # pragma: no cover game.idebug = True prout("=== Debug mode enabled.") if game.idebug: - prout("--- Setup: type=%s length=%s skill=%s wayback=%s" % (gametype, game.length, game.skill, wayback)) + prout( + "--- Setup: type=%s length=%s skill=%s wayback=%s" + % (gametype, game.length, game.skill, wayback) + ) # Use parameters to generate initial values of things game.damfac = 0.5 * game.skill - game.inbase = rnd.integer(BASEMIN, BASEMAX+1) + game.inbase = rnd.integer(BASEMIN, BASEMAX + 1) game.inplan = 0 if game.options & OPTION_PLANETS: - game.inplan += rnd.integer(MAXUNINHAB/2, MAXUNINHAB+1) + game.inplan += rnd.integer(MAXUNINHAB / 2, MAXUNINHAB + 1) if game.options & OPTION_WORLDS: game.inplan += int(NINHAB) game.state.nromrem = game.inrom = rnd.integer(2 * game.skill) - game.state.nscrem = game.inscom = (game.skill > SKILL_FAIR) and ((game.options & OPTION_SUPERCMDR) != 0) + game.state.nscrem = game.inscom = (game.skill > SKILL_FAIR) and ( + (game.options & OPTION_SUPERCMDR) != 0 + ) game.state.remtime = 7.0 * game.length game.intime = game.state.remtime - game.inkling = int(2.0*game.intime*((game.skill+1 - 2*rnd.real())*game.skill*0.1+.15)) - game.incom = min(MINCMDR, int(game.skill + 0.0625*game.inkling*rnd.real())) - game.state.remres = (game.inkling+4*game.incom)*game.intime + game.inkling = int( + 2.0 + * game.intime + * ((game.skill + 1 - 2 * rnd.real()) * game.skill * 0.1 + 0.15) + ) + game.incom = min(MINCMDR, int(game.skill + 0.0625 * game.inkling * rnd.real())) + game.state.remres = (game.inkling + 4 * game.incom) * game.intime game.inresor = game.state.remres if game.inkling > 50: game.inbase += 1 return False + def dropin(iquad=None): "Drop a feature on a random dot in the current quadrant." while True: w = randplace(QUADSIZE) - if game.quad[w.i][w.j] == '.': + if game.quad[w.i][w.j] == ".": break if iquad is not None: game.quad[w.i][w.j] = iquad return w + def newcnd(): "Update our alert status." game.condition = "green" if game.energy < 1000.0: game.condition = "yellow" - if game.state.galaxy[game.quadrant.i][game.quadrant.j].klingons or game.state.galaxy[game.quadrant.i][game.quadrant.j].romulans: + if ( + game.state.galaxy[game.quadrant.i][game.quadrant.j].klingons + or game.state.galaxy[game.quadrant.i][game.quadrant.j].romulans + ): game.condition = "red" if not game.alive: - game.condition="dead" + game.condition = "dead" + def newkling(): "Drop new Klingon into current quadrant." - return Enemy('K', loc=dropin(), power=rnd.real(300,450)+25.0*game.skill) + return Enemy("K", loc=dropin(), power=rnd.real(300, 450) + 25.0 * game.skill) + def sortenemies(): "Sort enemies by distance so 'nearest' is meaningful." game.enemies.sort(key=lambda x: x.kdist) + def newqad(): "Set up a new state of quadrant, for when we enter or re-enter it." game.justin = True @@ -6125,7 +6808,7 @@ def newqad(): game.ientesc = game.iseenit = game.isviolreported = False game.tholian = None # Create a blank quadrant - game.quad = fill2d(QUADSIZE, lambda i, j: '.') + game.quad = fill2d(QUADSIZE, lambda i, j: ".") if game.iscate: # Attempt to escape Super-commander, so tbeam back! game.iscate = False @@ -6146,29 +6829,29 @@ def newqad(): # If we need a commander, promote a Klingon for cmdr in game.state.kcmdr: if cmdr == game.quadrant: - e = game.enemies[game.klhere-1] - game.quad[e.location.i][e.location.j] = 'C' - e.power = rnd.real(950,1350) + 50.0*game.skill + e = game.enemies[game.klhere - 1] + game.quad[e.location.i][e.location.j] = "C" + e.power = rnd.real(950, 1350) + 50.0 * game.skill break # If we need a super-commander, promote a Klingon if game.quadrant == game.state.kscmdr: e = game.enemies[0] - game.quad[e.location.i][e.location.j] = 'S' - e.power = rnd.real(1175.0, 1575.0) + 125.0*game.skill - game.iscate = (game.remkl() > 1) + game.quad[e.location.i][e.location.j] = "S" + e.power = rnd.real(1175.0, 1575.0) + 125.0 * game.skill + game.iscate = game.remkl() > 1 # Put in Romulans if needed for _i in range(q.romulans): - Enemy('R', loc=dropin(), power=rnd.real(400.0,850.0)+50.0*game.skill) + Enemy("R", loc=dropin(), power=rnd.real(400.0, 850.0) + 50.0 * game.skill) # If quadrant needs a starbase, put it in if q.starbase: - game.base = dropin('B') + game.base = dropin("B") # If quadrant needs a planet, put it in if q.planet: game.iplnet = q.planet if not q.planet.inhabited: - game.plnet = dropin('P') + game.plnet = dropin("P") else: - game.plnet = dropin('@') + game.plnet = dropin("@") # Check for condition newcnd() # Check for RNZ @@ -6176,131 +6859,138 @@ def newqad(): game.neutz = True if not damaged(DRADIO): skip(1) - prout(_("LT. Uhura- \"Captain, an urgent message.")) + prout(_('LT. Uhura- "Captain, an urgent message.')) prout(_(" I'll put it on audio.\" CLICK")) skip(1) prout(_("INTRUDER! YOU HAVE VIOLATED THE ROMULAN NEUTRAL ZONE.")) prout(_("LEAVE AT ONCE, OR YOU WILL BE DESTROYED!")) # Put in THING if needed if thing.location == game.quadrant: - Enemy(etype='?', loc=dropin(), - power=rnd.real(6000,6500.0)+250.0*game.skill) + Enemy( + etype="?", loc=dropin(), power=rnd.real(6000, 6500.0) + 250.0 * game.skill + ) if not damaged(DSRSENS): skip(1) - prout(_("Mr. Spock- \"Captain, this is most unusual.")) - prout(_(" Please examine your short-range scan.\"")) + prout(_('Mr. Spock- "Captain, this is most unusual.')) + prout(_(' Please examine your short-range scan."')) # Decide if quadrant needs a Tholian; lighten up if skill is low if game.options & OPTION_THOLIAN: - if (game.skill < SKILL_GOOD and rnd.withprob(0.02)) or \ - (game.skill == SKILL_GOOD and rnd.withprob(0.05)) or \ - (game.skill > SKILL_GOOD and rnd.withprob(0.08)): + if ( + (game.skill < SKILL_GOOD and rnd.withprob(0.02)) + or (game.skill == SKILL_GOOD and rnd.withprob(0.05)) + or (game.skill > SKILL_GOOD and rnd.withprob(0.08)) + ): w = Coord() while True: - w.i = rnd.withprob(0.5) * (QUADSIZE-1) - w.j = rnd.withprob(0.5) * (QUADSIZE-1) - if game.quad[w.i][w.j] == '.': + w.i = rnd.withprob(0.5) * (QUADSIZE - 1) + w.j = rnd.withprob(0.5) * (QUADSIZE - 1) + if game.quad[w.i][w.j] == ".": break - game.tholian = Enemy(etype='T', loc=w, - power=rnd.integer(100, 500) + 25.0*game.skill) + game.tholian = Enemy( + etype="T", loc=w, power=rnd.integer(100, 500) + 25.0 * game.skill + ) # Reserve unoccupied corners - if game.quad[0][0]=='.': - game.quad[0][0] = 'X' - if game.quad[0][QUADSIZE-1]=='.': - game.quad[0][QUADSIZE-1] = 'X' - if game.quad[QUADSIZE-1][0]=='.': - game.quad[QUADSIZE-1][0] = 'X' - if game.quad[QUADSIZE-1][QUADSIZE-1]=='.': - game.quad[QUADSIZE-1][QUADSIZE-1] = 'X' + if game.quad[0][0] == ".": + game.quad[0][0] = "X" + if game.quad[0][QUADSIZE - 1] == ".": + game.quad[0][QUADSIZE - 1] = "X" + if game.quad[QUADSIZE - 1][0] == ".": + game.quad[QUADSIZE - 1][0] = "X" + if game.quad[QUADSIZE - 1][QUADSIZE - 1] == ".": + game.quad[QUADSIZE - 1][QUADSIZE - 1] = "X" sortenemies() # And finally the stars for _i in range(q.stars): - dropin('*') + dropin("*") # Put in a few black holes - for _i in range(1, 3+1): + for _i in range(1, 3 + 1): if rnd.withprob(0.5): - dropin(' ') + dropin(" ") # Take out X's in corners if Tholian present if game.tholian: - if game.quad[0][0]=='X': - game.quad[0][0] = '.' - if game.quad[0][QUADSIZE-1]=='X': - game.quad[0][QUADSIZE-1] = '.' - if game.quad[QUADSIZE-1][0]=='X': - game.quad[QUADSIZE-1][0] = '.' - if game.quad[QUADSIZE-1][QUADSIZE-1]=='X': - game.quad[QUADSIZE-1][QUADSIZE-1] = '.' + if game.quad[0][0] == "X": + game.quad[0][0] = "." + if game.quad[0][QUADSIZE - 1] == "X": + game.quad[0][QUADSIZE - 1] = "." + if game.quad[QUADSIZE - 1][0] == "X": + game.quad[QUADSIZE - 1][0] = "." + if game.quad[QUADSIZE - 1][QUADSIZE - 1] == "X": + game.quad[QUADSIZE - 1][QUADSIZE - 1] = "." # This should guarantee that replay games don't lose info about the chart if (game.options & OPTION_AUTOSCAN) or replayfp: lrscan(silent=True) + def setpassword(): "Set the self-destruct password." if game.options & OPTION_AUTOPASS: game.passwd = "" - game.passwd += chr(ord('a')+rnd.integer(26)) - game.passwd += chr(ord('a')+rnd.integer(26)) - game.passwd += chr(ord('a')+rnd.integer(26)) + game.passwd += chr(ord("a") + rnd.integer(26)) + game.passwd += chr(ord("a") + rnd.integer(26)) + game.passwd += chr(ord("a") + rnd.integer(26)) else: while True: scanner.chew() proutn(_("Please type in a secret password- ")) scanner.nexttok() game.passwd = scanner.token - #game.passwd = getpass.getpass("Please type in a secret password- ") + # game.passwd = getpass.getpass("Please type in a secret password- ") if game.passwd is not None: break + # Code from sst.c begins here commands = [ - ("SRSCAN", OPTION_TTY), - ("STATUS", OPTION_TTY), - ("REQUEST", OPTION_TTY), - ("LRSCAN", OPTION_TTY), - ("PHASERS", 0), - ("TORPEDO", 0), - ("PHOTONS", 0), - ("MOVE", 0), - ("SHIELDS", 0), - ("DOCK", 0), - ("DAMAGES", 0), - ("CHART", 0), - ("IMPULSE", 0), - ("REST", 0), - ("WARP", 0), - ("SENSORS", OPTION_PLANETS), - ("ORBIT", OPTION_PLANETS), - ("TRANSPORT", OPTION_PLANETS), - ("MINE", OPTION_PLANETS), - ("CRYSTALS", OPTION_PLANETS), - ("SHUTTLE", OPTION_PLANETS), - ("PLANETS", OPTION_PLANETS), - ("REPORT", 0), - ("COMPUTER", 0), - ("COMMANDS", 0), - ("EMEXIT", 0), - ("PROBE", OPTION_PROBE), - ("SAVE", 0), - ("FREEZE", 0), # Synonym for SAVE - ("OPTIONS", 0), - ("ABANDON", 0), + ("SRSCAN", OPTION_TTY), + ("STATUS", OPTION_TTY), + ("REQUEST", OPTION_TTY), + ("LRSCAN", OPTION_TTY), + ("PHASERS", 0), + ("TORPEDO", 0), + ("PHOTONS", 0), + ("MOVE", 0), + ("SHIELDS", 0), + ("DOCK", 0), + ("DAMAGES", 0), + ("CHART", 0), + ("IMPULSE", 0), + ("REST", 0), + ("WARP", 0), + ("SENSORS", OPTION_PLANETS), + ("ORBIT", OPTION_PLANETS), + ("TRANSPORT", OPTION_PLANETS), + ("MINE", OPTION_PLANETS), + ("CRYSTALS", OPTION_PLANETS), + ("SHUTTLE", OPTION_PLANETS), + ("PLANETS", OPTION_PLANETS), + ("REPORT", 0), + ("COMPUTER", 0), + ("COMMANDS", 0), + ("EMEXIT", 0), + ("PROBE", OPTION_PROBE), + ("SAVE", 0), + ("FREEZE", 0), # Synonym for SAVE + ("OPTIONS", 0), + ("ABANDON", 0), # No abbreviations accepted after this point - ("DESTRUCT", 0), - ("DEATHRAY", 0), - ("CAPTURE", OPTION_CAPTURE), - ("CLOAK", OPTION_CLOAK), - ("DEBUG", 0), - ("MAYDAY", 0), - ("SOS", 0), # Synonym for MAYDAY - ("CALL", 0), # Synonym for MAYDAY - ("QUIT", 0), - ("HELP", 0), - ("SCORE", 0), - ("CURSES", 0), - ("", 0), + ("DESTRUCT", 0), + ("DEATHRAY", 0), + ("CAPTURE", OPTION_CAPTURE), + ("CLOAK", OPTION_CLOAK), + ("DEBUG", 0), + ("MAYDAY", 0), + ("SOS", 0), # Synonym for MAYDAY + ("CALL", 0), # Synonym for MAYDAY + ("QUIT", 0), + ("HELP", 0), + ("SCORE", 0), + ("CURSES", 0), + ("", 0), ] -def listCommands(): # pragma: no cover + +def listCommands(): # pragma: no cover "Generate a list of legal commands." # Coverage-disabled because testing for this is fragile # in the presence of changes in the command set. @@ -6314,6 +7004,7 @@ def listCommands(): # pragma: no cover skip(1) skip(1) + def helpme(): "Browse on-line help." key = scanner.nexttok() @@ -6341,25 +7032,25 @@ def helpme(): except IOError: pass else: - prout(_("Spock- \"Captain, that information is missing from the")) + prout(_('Spock- "Captain, that information is missing from the')) prout(_(" computer. You need to find sst.doc and put it somewhere")) proutn(_(" in these directories: %s") % ":".join(docpath)) - prout(".\"") + prout('."') # This used to continue: "You need to find SST.DOC and put # it in the current directory." return while True: linebuf = fp.readline() - if linebuf == '': - prout(_("Spock- \"Captain, there is no information on that command.\"")) + if linebuf == "": + prout(_('Spock- "Captain, there is no information on that command."')) fp.close() return - if linebuf[0] == '%' and linebuf[1] == '%' and linebuf[2] == ' ': + if linebuf[0] == "%" and linebuf[1] == "%" and linebuf[2] == " ": linebuf = linebuf[3:].strip() if cmd.upper() == linebuf: break skip(1) - prout(_("Spock- \"Captain, I've found the following information:\"")) + prout(_('Spock- "Captain, I\'ve found the following information:"')) skip(1) while True: linebuf = fp.readline() @@ -6368,16 +7059,26 @@ def helpme(): proutn(linebuf) fp.close() + def makemoves(): "Command-interpretation loop." + def checkviol(): - if game.irhere and game.state.date >= ALGERON and not game.isviolreported and game.iscloaked: - prout(_("The Romulan ship discovers you are breaking the Treaty of Algeron!")) + if ( + game.irhere + and game.state.date >= ALGERON + and not game.isviolreported + and game.iscloaked + ): + prout( + _("The Romulan ship discovers you are breaking the Treaty of Algeron!") + ) game.ncviol += 1 game.isviolreported = True - while True: # command loop + + while True: # command loop drawmaps(1) - while True: # get a command + while True: # get a command hitme = False game.optime = game.justin = False scanner.chew() @@ -6385,7 +7086,7 @@ def makemoves(): clrscr() proutn("COMMAND> ") if scanner.nexttok() == "IHEOL": - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover makechart() continue elif scanner.token == "": @@ -6395,111 +7096,112 @@ def makemoves(): setwnd(message_window) clrscr() abandon_passed = False - cmd = "" # Force cmd to persist after loop - opt = 0 # Force opt to persist after loop + cmd = "" # Force cmd to persist after loop + opt = 0 # Force opt to persist after loop for (cmd, opt) in commands: # commands after ABANDON cannot be abbreviated if cmd == "ABANDON": abandon_passed = True - if cmd == scanner.token.upper() or (not abandon_passed \ - and cmd.startswith(scanner.token.upper())): + if cmd == scanner.token.upper() or ( + not abandon_passed and cmd.startswith(scanner.token.upper()) + ): break - if cmd == "": # pragma: no cover + if cmd == "": # pragma: no cover listCommands() continue elif opt and not (opt & game.options): huh() else: break - if game.options & OPTION_CURSES: # pragma: no cover + if game.options & OPTION_CURSES: # pragma: no cover prout("COMMAND> %s" % cmd) - if cmd == "SRSCAN": # srscan + if cmd == "SRSCAN": # srscan srscan() - elif cmd == "STATUS": # status + elif cmd == "STATUS": # status status() - elif cmd == "REQUEST": # status request + elif cmd == "REQUEST": # status request request() - elif cmd == "LRSCAN": # long range scan + elif cmd == "LRSCAN": # long range scan lrscan(silent=False) - elif cmd == "PHASERS": # phasers + elif cmd == "PHASERS": # phasers phasers() if game.ididit: checkviol() hitme = True - elif cmd in ("TORPEDO", "PHOTONS"): # photon torpedos + elif cmd in ("TORPEDO", "PHOTONS"): # photon torpedos torps() if game.ididit: checkviol() hitme = True - elif cmd == "MOVE": # move under warp + elif cmd == "MOVE": # move under warp warp(wcourse=None, involuntary=False) - elif cmd == "SHIELDS": # shields + elif cmd == "SHIELDS": # shields doshield(shraise=False) if game.ididit: hitme = True game.shldchg = False - elif cmd == "DOCK": # dock at starbase + elif cmd == "DOCK": # dock at starbase dock(True) if game.ididit: attack(torps_ok=False) - elif cmd == "DAMAGES": # damage reports + elif cmd == "DAMAGES": # damage reports damagereport() - elif cmd == "CHART": # chart + elif cmd == "CHART": # chart makechart() - elif cmd == "IMPULSE": # impulse + elif cmd == "IMPULSE": # impulse impulse() - elif cmd == "REST": # rest + elif cmd == "REST": # rest wait() if game.ididit: hitme = True - elif cmd == "WARP": # warp + elif cmd == "WARP": # warp setwarp() - elif cmd == "SENSORS": # sensors + elif cmd == "SENSORS": # sensors sensor() - elif cmd == "ORBIT": # orbit + elif cmd == "ORBIT": # orbit orbit() if game.ididit: hitme = True - elif cmd == "TRANSPORT": # transport "beam" + elif cmd == "TRANSPORT": # transport "beam" beam() - elif cmd == "MINE": # mine + elif cmd == "MINE": # mine mine() if game.ididit: hitme = True - elif cmd == "CRYSTALS": # crystals + elif cmd == "CRYSTALS": # crystals usecrystals() if game.ididit: hitme = True - elif cmd == "SHUTTLE": # shuttle + elif cmd == "SHUTTLE": # shuttle shuttle() if game.ididit: hitme = True - elif cmd == "PLANETS": # Planet list + elif cmd == "PLANETS": # Planet list survey() - elif cmd == "REPORT": # Game Report + elif cmd == "REPORT": # Game Report report() - elif cmd == "COMPUTER": # use COMPUTER! + elif cmd == "COMPUTER": # use COMPUTER! eta() elif cmd == "COMMANDS": listCommands() - elif cmd == "EMEXIT": # Emergency exit - clrscr() # Hide screen - freeze(True) # forced save - raise SystemExit(1) # And quick exit + elif cmd == "EMEXIT": # Emergency exit + clrscr() # Hide screen + freeze(True) # forced save + raise SystemExit(1) # And quick exit elif cmd == "PROBE": - probe() # Launch probe + probe() # Launch probe if game.ididit: hitme = True - elif cmd == "ABANDON": # Abandon Ship + elif cmd == "ABANDON": # Abandon Ship abandon() - elif cmd == "DESTRUCT": # Self Destruct + elif cmd == "DESTRUCT": # Self Destruct selfdestruct() - elif cmd == "SAVE": # Save Game + elif cmd == "SAVE": # Save Game freeze(False) clrscr() if game.skill > SKILL_GOOD: prout(_("WARNING--Saved games produce no plaques!")) - elif cmd == "DEATHRAY": # Try a desparation measure + elif cmd == "DEATHRAY": # Try a desparation measure deathray() if game.ididit: hitme = True @@ -6507,30 +7209,30 @@ def makemoves(): capture() elif cmd == "CLOAK": cloak() - elif cmd == "DEBUGCMD": # What do we want for debug??? + elif cmd == "DEBUGCMD": # What do we want for debug??? debugme() - elif cmd == "MAYDAY": # Call for help + elif cmd == "MAYDAY": # Call for help mayday() if game.ididit: hitme = True elif cmd == "QUIT": - game.alldone = True # quit the game + game.alldone = True # quit the game elif cmd == "HELP": - helpme() # get help + helpme() # get help elif cmd == "SCORE": - score() # see current score - elif cmd == "CURSES": # pragma: no cover - game.options |= (OPTION_CURSES | OPTION_COLOR) + score() # see current score + elif cmd == "CURSES": # pragma: no cover + game.options |= OPTION_CURSES | OPTION_COLOR iostart() elif cmd == "OPTIONS": goptions() while True: if game.alldone: - break # Game has ended + break # Game has ended if game.optime != 0.0: events() if game.alldone: - break # Events did us in + break # Events did us in if game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova: atover(False) continue @@ -6546,25 +7248,40 @@ def makemoves(): if game.alldone: break if game.idebug: - prout("=== Ending") # pragma: no cover + prout("=== Ending") # pragma: no cover + def cramen(ch): "Emit the name of an enemy or feature." - if ch == 'R': s = _("Romulan") - elif ch == 'K': s = _("Klingon") - elif ch == 'C': s = _("Commander") - elif ch == 'S': s = _("Super-commander") - elif ch == '*': s = _("Star") - elif ch == 'P': s = _("Planet") - elif ch == 'B': s = _("Starbase") - elif ch == ' ': s = _("Black hole") - elif ch == 'T': s = _("Tholian") - elif ch == '#': s = _("Tholian web") - elif ch == '?': s = _("Stranger") - elif ch == '@': s = _("Inhabited World") - else: s = "Unknown??" # pragma: no cover + if ch == "R": + s = _("Romulan") + elif ch == "K": + s = _("Klingon") + elif ch == "C": + s = _("Commander") + elif ch == "S": + s = _("Super-commander") + elif ch == "*": + s = _("Star") + elif ch == "P": + s = _("Planet") + elif ch == "B": + s = _("Starbase") + elif ch == " ": + s = _("Black hole") + elif ch == "T": + s = _("Tholian") + elif ch == "#": + s = _("Tholian web") + elif ch == "?": + s = _("Stranger") + elif ch == "@": + s = _("Inhabited World") + else: + s = "Unknown??" # pragma: no cover return s + def crmena(loud, enemy, loctype, w): "Emit the name of an enemy and his location." buf = "" @@ -6577,17 +7294,21 @@ def crmena(loud, enemy, loctype, w): buf += _("Sector ") return buf + repr(w) + def crmshp(): "Emit our ship name." - return{'E':_("Enterprise"),'F':_("Faerie Queene")}.get(game.ship,"Ship???") + return {"E": _("Enterprise"), "F": _("Faerie Queene")}.get(game.ship, "Ship???") + def stars(): "Emit a line of stars" prouts("******************************************************") skip(1) + def expran(avrage): - return -avrage*math.log(1e-7 + rnd.real()) + return -avrage * math.log(1e-7 + rnd.real()) + def randplace(size): "Choose a random location." @@ -6596,24 +7317,26 @@ def randplace(size): w.j = rnd.integer(size) return w + class sstscanner: def __init__(self): self.type = None self.token = None self.real = 0.0 self.inqueue = [] + def nexttok(self): # Get a token from the user self.real = 0.0 - self.token = '' + self.token = "" # Fill the token queue if nothing here while not self.inqueue: sline = cgetline() - if curwnd==prompt_window: + if curwnd == prompt_window: clrscr() setwnd(message_window) clrscr() - if sline == '': + if sline == "": return None if not sline: continue @@ -6635,30 +7358,41 @@ class sstscanner: self.type = "IHALPHA" self.real = None return "IHALPHA" + def append(self, tok): self.inqueue.append(tok) + def push(self, tok): self.inqueue.insert(0, tok) + def waiting(self): return self.inqueue + def chew(self): # Demand input for next scan self.inqueue = [] self.real = self.token = None + def sees(self, s): # compares s to item and returns true if it matches to the length of s return s.startswith(self.token) + def int(self): # Round token value to nearest integer return int(round(self.real)) + def getcoord(self): s = Coord() self.nexttok() - if (game.options & OPTION_ALPHAMERIC): + if game.options & OPTION_ALPHAMERIC: try: - if (self.type == "IHALPHA") and (self.token[0] in "abcdefghij") and (self.token[1] in "0123456789"): + if ( + (self.type == "IHALPHA") + and (self.token[0] in "abcdefghij") + and (self.token[1] in "0123456789") + ): s.i = ord(self.token[0]) - ord("a") - s.j = int(self.token[1:])-1 + s.j = int(self.token[1:]) - 1 return s except (TypeError, IndexError): huh() @@ -6666,27 +7400,34 @@ class sstscanner: if self.type != "IHREAL": huh() return None - s.i = self.int()-1 + s.i = self.int() - 1 self.nexttok() if self.type != "IHREAL": huh() return None - s.j = self.int()-1 + s.j = self.int() - 1 return s - def __repr__(self): # pragma: no cover - return "" % (self.token, self.type, self.inqueue) + + def __repr__(self): # pragma: no cover + return "" % ( + self.token, + self.type, + self.inqueue, + ) + def ja(): "Yes-or-no confirmation." scanner.chew() while True: scanner.nexttok() - if scanner.token == 'y': + if scanner.token == "y": return True - if scanner.token == 'n': + if scanner.token == "n": return False scanner.chew() - proutn(_("Please answer with \"y\" or \"n\": ")) + proutn(_('Please answer with "y" or "n": ')) + def huh(): "Complain about unparseable input." @@ -6694,7 +7435,8 @@ def huh(): skip(1) prout(_("Beg your pardon, Captain?")) -def debugme(): # pragma: no cover + +def debugme(): # pragma: no cover "Access to the internals for debugging." proutn("Reset levels? ") if ja(): @@ -6711,7 +7453,7 @@ def debugme(): # pragma: no cover proutn("Toggle debug flag? ") if ja(): game.idebug = not game.idebug - if game.idebug: # pragma: no cover + if game.idebug: # pragma: no cover prout("Debug output ON") else: prout("Debug output OFF") @@ -6728,22 +7470,22 @@ def debugme(): # pragma: no cover ev = Event() w = Coord() legends = { - FSNOVA: "Supernova ", - FTBEAM: "T Beam ", - FSNAP: "Snapshot ", + FSNOVA: "Supernova ", + FTBEAM: "T Beam ", + FSNAP: "Snapshot ", FBATTAK: "Base Attack ", - FCDBAS: "Base Destroy ", + FCDBAS: "Base Destroy ", FSCMOVE: "SC Move ", FSCDBAS: "SC Base Destroy ", FDSPROB: "Probe Move ", - FDISTR: "Distress Call ", - FENSLV: "Enslavement ", - FREPRO: "Klingon Build ", + FDISTR: "Distress Call ", + FENSLV: "Enslavement ", + FREPRO: "Klingon Build ", } for i in range(1, NEVENTS): proutn(legends[i]) if is_scheduled(i): - proutn("%.2f" % (scheduled(i)-game.state.date)) + proutn("%.2f" % (scheduled(i) - game.state.date)) if i in {FENSLV, FREPRO}: ev = findevent(i) proutn(" in %s" % ev.quadrant) @@ -6752,7 +7494,7 @@ def debugme(): # pragma: no cover proutn("? ") scanner.chew() key = scanner.nexttok() - if key == 'n': + if key == "n": unschedule(i) scanner.chew() elif key == "IHREAL": @@ -6781,24 +7523,25 @@ def debugme(): # pragma: no cover game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova = True atover(True) -if __name__ == '__main__': + +if __name__ == "__main__": try: - #global line, thing, game + # global line, thing, game game = None thing = Thingy() game = Gamestate() rnd = randomizer() logfp = None - game.options = OPTION_ALL &~ OPTION_IOMODES + game.options = OPTION_ALL & ~OPTION_IOMODES if os.getenv("TERM"): - game.options |= OPTION_CURSES # pragma: no cover + game.options |= OPTION_CURSES # pragma: no cover else: game.options |= OPTION_TTY seed = int(time.time()) try: (options, arguments) = getopt.getopt(sys.argv[1:], "cr:s:txV") for (switch, val) in options: - if switch == '-r': + if switch == "-r": # pylint: disable=raise-missing-from try: replayfp = open(val, "r") @@ -6818,45 +7561,47 @@ if __name__ == '__main__': seed = eval(seed) elif line.startswith("# arguments"): arguments += line.split()[2:] - except ValueError: # pragma: no cover - sys.stderr.write("sst: replay file %s is ill-formed\n"% val) + except ValueError: # pragma: no cover + sys.stderr.write("sst: replay file %s is ill-formed\n" % val) raise SystemExit(1) game.options |= OPTION_TTY - game.options &=~ OPTION_CURSES - elif switch == '-s': # pragma: no cover + game.options &= ~OPTION_CURSES + elif switch == "-s": # pragma: no cover seed = int(val) - elif switch == '-t': # pragma: no cover + elif switch == "-t": # pragma: no cover game.options |= OPTION_TTY - game.options &=~ OPTION_CURSES - elif switch == '-x': # pragma: no cover + game.options &= ~OPTION_CURSES + elif switch == "-x": # pragma: no cover game.idebug = True - elif switch == '-c': # Enable curses debugging - undocumented + elif switch == "-c": # Enable curses debugging - undocumented game.cdebug = True - elif switch == '-V': # pragma: no cover + elif switch == "-V": # pragma: no cover print("SST2K", version) raise SystemExit(0) - else: # pragma: no cover + else: # pragma: no cover sys.stderr.write("usage: sst [-t] [-x] [startcommand...].\n") raise SystemExit(1) except getopt.GetoptError as err: print(err) raise SystemExit(1) from err # where to save the input in case of bugs - if "TMPDIR" in os.environ: # pragma: no cover - tmpdir = os.environ['TMPDIR'] + if "TMPDIR" in os.environ: # pragma: no cover + tmpdir = os.environ["TMPDIR"] else: tmpdir = "/tmp" try: logfp = open(os.path.join(tmpdir, "sst-input.log"), "w") - except IOError: # pragma: no cover + except IOError: # pragma: no cover sys.stderr.write("sst: warning, can't open logfile\n") sys.exit(1) if logfp: logfp.write("# seed %s\n" % seed) logfp.write("# arguments %s\n" % " ".join(arguments)) logfp.write("# SST2K version %s\n" % version) - logfp.write("# recorded by %s@%s on %s\n" % \ - (getpass.getuser(),socket.getfqdn(),time.ctime())) + logfp.write( + "# recorded by %s@%s on %s\n" + % (getpass.getuser(), socket.getfqdn(), time.ctime()) + ) logfp.write("#\n") rnd.seed(seed) scanner = sstscanner() @@ -6864,7 +7609,7 @@ if __name__ == '__main__': scanner.append(arg) try: iostart() - while True: # Play a game + while True: # Play a game setwnd(fullscreen_window) clrscr() prelim() @@ -6877,7 +7622,7 @@ if __name__ == '__main__': if replayfp: break skip(1) - if (game.options & OPTION_TTY): + if game.options & OPTION_TTY: stars() skip(1) if game.tourn and game.alldone: @@ -6887,7 +7632,7 @@ if __name__ == '__main__': scanner.push("\n") freeze(False) scanner.chew() - if (game.options & OPTION_TTY): + if game.options & OPTION_TTY: proutn(_("Do you want to play again? ")) if not ja(): break @@ -6898,7 +7643,7 @@ if __name__ == '__main__': finally: ioend() raise SystemExit(0) - except KeyboardInterrupt: # pragma: no cover + except KeyboardInterrupt: # pragma: no cover if logfp: logfp.close() print("") -- 2.31.1 From 5950b77854f3fbe98d1112c153a79ca2d43aae5b Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sat, 6 Jan 2024 20:00:04 -0500 Subject: [PATCH 11/16] Repair SPDX copyright notices. --- test/tapdiffer | 2 +- test/tapview | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/tapdiffer b/test/tapdiffer index 4af0c83..efb7b9c 100755 --- a/test/tapdiffer +++ b/test/tapdiffer @@ -1,5 +1,5 @@ #! /bin/sh -# SPDX-FileCopyrightText: Eric S. Raymond +# SPDX-FileCopyrightText: (C) Eric S. Raymond # SPDX-License-Identifier: MIT-0 # # tapdiffer - Render diff between input and checkfile as a TAP report diff --git a/test/tapview b/test/tapview index 70df8b1..df63bbc 100755 --- a/test/tapview +++ b/test/tapview @@ -1,7 +1,7 @@ #! /bin/sh # tapview - a TAP (Test Anything Protocol) viewer in pure POSIX shell # -# SPDX-FileCopyrightText: Eric S. Raymond +# SPDX-FileCopyrightText: (C) Eric S. Raymond # SPDX-License-Identifier: MIT-0 # # This code is intended to be embedded in your project. The author -- 2.31.1 From f3801f790cafb590cb3d812e4b1a8dac1a53f8ae Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Tue, 6 Feb 2024 19:58:25 -0500 Subject: [PATCH 12/16] Add reflow production. --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index 8ffb214..5a436fe 100644 --- a/Makefile +++ b/Makefile @@ -31,6 +31,9 @@ dist: sst-$(VERS).tar.gz check: pylint @cd test >/dev/null; $(MAKE) --quiet +reflow: + @black sst + pylint: @pylint --score=n sst -- 2.31.1 From bd629247950923bbf189c76acff59671649dd5f2 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Wed, 7 Feb 2024 18:55:25 -0500 Subject: [PATCH 13/16] Prevent lossage on version-number mismatch. --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile b/Makefile index 5a436fe..cf12126 100644 --- a/Makefile +++ b/Makefile @@ -41,10 +41,14 @@ clean: rm -f sst.6 sst.html sst-doc.html rm -f *.6 MANIFEST index.html +NEWSVERSION=$(shell sed -n Date: Sat, 10 Feb 2024 22:26:07 -0500 Subject: [PATCH 14/16] XML markup repair. --- doc/sst-doc.xml | 51 +++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/doc/sst-doc.xml b/doc/sst-doc.xml index 33c0c72..3945889 100644 --- a/doc/sst-doc.xml +++ b/doc/sst-doc.xml @@ -255,71 +255,72 @@ The Emeritus game is strictly for masochists. blank answer enables all SST2K features. Given a year, it will disable features not implemented in that year or earlier. The year '1973' approximated the original CDC 6600 FORTRAN game from UT Austin. -Here is a mapping of years to features: +Here is a mapping of years to features: 1974 -Planets and dilithium mining +Planets and dilithium mining 1979 -Tholians and their webs, supercommanders. +Tholians and their webs, supercommanders. 1980 -Deep-space probes. +Deep-space probes. 1981 -Bad guys do tactical movement. +Bad guys do tactical movement. 1982 -Bad guys can ram you. +Bad guys can ram you. 1997 -Death ray gets an upgrade. +Death ray gets an upgrade. 1998 -Automatic generation of self-destruct password. +Automatic generation of self-destruct password. 2004 -Upgraded shields for bases, and chance of time-waeping through a black hole. +Upgraded shields for bases, and chance of time-waeping through a black hole. + 2005 -Our ship is bracketed in the chart/ - +Our ship is bracketed in the chart/ 2006 -Logic for inhabited worlds and Klingon captures. +Logic for inhabited worlds and Klingon captures. 2007 -Automatically update the long-range scan when displaying the chart. - +Automatically update the long-range scan when displaying the chart. + 2010 -Use color in interface. +Use color in interface. + 2013 -Defeated Klingons can be captured. +Defeated Klingons can be captured. + 2014 -The cloaking device. +The cloaking device. 2019 -Consistent dot-filling in the galaxy chart. +Consistent dot-filling in the galaxy chart. 2023 -Alphameric coordinates. - +Alphameric coordinates. @@ -451,7 +452,7 @@ described by an example. 10 . . . . . . . . . . Time Left 3.72 -In fancy mode, the display will use letters for Y coordinates. +In fancy mode, the display will use letters for Y coordinates. 1 2 3 4 5 6 7 8 9 10 @@ -821,7 +822,7 @@ must be supplied. If your game is in "fancy" mode, there ia a way to input coordinates that avoids any need to remember thet the Y coordinate comes first. Y values may be given as lowercase letters starting with -a = 1. So for example: +a = 1. So for example: a1 = 1 - 1 @@ -829,7 +830,7 @@ a = 1. So for example: f2 = 6 - 2 -The previous move xommand could be expressed as +The previous move xommand could be expressed as m a c7 e8 @@ -1162,13 +1163,13 @@ you can enter to aim between two sectors. However, sector numbers must be 1 to 10 inclusive. -In fancy mode, you can write "PHO 3 2 6 1 10 4 7" as +In fancy mode, you can write "PHO 3 2 6 1 10 4 7" as pho 3 b6 a10 d7 -Fractional Y coordinates are not supported. +Fractional Y coordinates are not supported. Dock at Starbase -- 2.31.1 From 7d46bf45b8d71bc3c7b1ed93f2a715a2a179edb5 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sat, 10 Feb 2024 22:32:11 -0500 Subject: [PATCH 15/16] Add full SPDX headers. --- Makefile | 3 +++ control | 3 +++ doc/Makefile | 3 +++ doc/sst-doc.xml | 4 ++++ doc/sst.xml | 4 ++++ sst | 4 ++-- 6 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index cf12126..6fb8a62 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,7 @@ # Makefile for the SST2K project +# +# SPDX-FileCopyrightText: (C) Eric S. Raymond +# SPDX-License-Identifier: BSD-2-Clause VERS=$(shell sed +# SPDX-License-Identifier: BSD-2-Clause Package: super-star-trek diff --git a/doc/Makefile b/doc/Makefile index 6d5909d..d115c60 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,5 +1,8 @@ # From this directory, distribute the following files: # HACKING makehelp.py sst-doc.xml sst-layer.xsl sst.xml +# +# SPDX-FileCopyrightText: (C) Eric S. Raymond +# SPDX-License-Identifier: BSD-2-Clause sst.6: sst.xml xmlto man sst.xml diff --git a/doc/sst-doc.xml b/doc/sst-doc.xml index 3945889..b07f3e6 100644 --- a/doc/sst-doc.xml +++ b/doc/sst-doc.xml @@ -5,6 +5,10 @@ ]> + Super Star Trek diff --git a/doc/sst.xml b/doc/sst.xml index 47353fb..c347168 100644 --- a/doc/sst.xml +++ b/doc/sst.xml @@ -3,6 +3,10 @@ "docbook/docbookx.dtd" [ ]> + sst diff --git a/sst b/sst index e43613e..c3bdafe 100755 --- a/sst +++ b/sst @@ -11,8 +11,8 @@ Stas Sergeev, and Eric S. Raymond. See the doc/HACKING file in the distribution for designers notes and advice on how to modify (and how not to modify!) this code. """ -# Copyright by Eric S. Raymond -# SPDX-License-Identifier: BSD-2-clause +# SPDX-FileCopyrightText: (C) Eric S. Raymond +# SPDX-License-Identifier: BSD-2-Clause # pylint: disable=line-too-long,superfluous-parens,too-many-lines,invalid-name,missing-function-docstring,missing-class-docstring,multiple-statements,too-many-branches,too-many-statements,too-many-locals,too-many-nested-blocks,too-many-return-statements,too-many-instance-attributes,global-statement,no-else-break,no-else-return,no-else-continue,too-few-public-methods,too-many-boolean-expressions,consider-using-f-string,consider-using-enumerate,consider-using-with,unspecified-encoding,consider-using-generator -- 2.31.1 From e36322086680276af30cd3e881b51bba5e04eee9 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sat, 10 Feb 2024 22:33:35 -0500 Subject: [PATCH 16/16] Ready to ship 2.8 --- NEWS | 2 +- sst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index eae4b10..3959d92 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ SST2K project news. -Repository head:: +2.8: 2024-02-10: Fix for enemy dispersion on torpedo hits. Re-conform to the documentation by removing the .py estension from sst. Fancy-mode coordinates can have the Y as a letter, e,g. "c4" = "3 - 4". diff --git a/sst b/sst index c3bdafe..0c0ace9 100755 --- a/sst +++ b/sst @@ -29,7 +29,7 @@ try: except ImportError: # pragma: no cover pass -version = "2.7" +version = "2.8" docpath = (".", "doc/", "/usr/share/doc/sst/") -- 2.31.1