製作者:麥克·米菲得(Mike Mayfield),鮑勃·李登(Bob Leedom)
發行日期:未發行的原版(1971);《STTR1》(HP, 1973);《SPACWR》 (EDU, 1973);李登的版本(1974);《超級星際迷航》 (《創意計算》, 1975)
編碼語言:BASIC
平臺:SDS Sigma 7
1963 年 6 月 3 號,《星際迷航》 的終集播出,而它的超級粉絲麥克·米菲得 (Mike Mayfield) 恰好剛剛高二畢業。 最後一集的名字是 ”逆轉侵襲“,拍的並不怎麼好。《星際迷航》 曾險遭腰斬,只不過因為粉絲持續不斷的請願才得以倖存,但這一回看起來是徹底迴天無力了。該劇的第三季整體上毫無創意,奄奄一息。 連《臥底偵緝隊》(The Mod Squad)重映版的觀眾都是它的兩倍。下一部全新制作的 《星際迷航》 電視劇都得在十年之後了。在那之前,粉絲們只能靠自己讓《星際迷航》保持活力。
和其他懂得技術的星際迷一樣,米菲得從微型計算機日漸強大的算力上看到了讓劇集精神延續的方法。而像其它早期遊戲一樣,複雜度各異的《星際迷航》遊戲在 60 年代末,70 年代初就已經出現在主機系統上,被複制、分享和各種改進。如今已經很難去拼湊起這麼多早期遊戲的傳承關係,一是它們很少會標明出處,甚至不會署名,二是它們很多都是重名的,都簡單的取名為《星際迷航》。在遊戲中很難模擬出電視劇中有些劇集展現的精髓(比如 “永恆邊緣的城市”一集),但是戰艦之間的戰鬥策略倒是比較容易模仿,比如第一季中廣受粉絲喜愛的 “恐怖平衡”這集裡面,柯克和羅慕倫指揮官的那場貓捉老鼠的把戲。《星際迷航》還為遊戲提供了現成的世界觀,這樣製作者就不必往本已捉襟見肘的存儲空間中塞進全新的設定。這一切對米菲得來說是其實是一個學術問題,真的,因為在當時所有的計算機都是寶貴的資源,它們都被鎖在大學的實驗室裡,一個 16 歲的小屁孩哪有機會得到一臺計算機啊。
在電視劇完結後不久,米菲得在他高中旁邊的加州大學爾灣分校看到了《SpaceWar!》的宣傳 (《SpaceWar!》 是早期另一個極具影響力的太空戰鬥遊戲)。《SpaceWar!》 用當時領先的 CRT 顯示器來繪製戰艦的矢量圖,玩家們在幾乎空無一物的屏幕上駕駛著戰艦閃轉騰挪,一邊向其他人發射魚雷,一邊試圖抵消中心恆星的引力。《SpaceWar!》 有趣,令人上癮,未來感強烈:當時大多數的計算機還使用著電傳打字機,可以想象,一個能實時更新的屏幕該多麼令人興奮啊,簡直堪比神蹟。米菲得大受震撼,從此便心心念念地渴望獲得一臺他自己的計算機。他清楚,用電傳打字機連接一臺遠端的計算機對他而言還是有點可能的,因為全國很多學校都在這麼做,但要用一臺顯示器去連接電腦就難於登天了,所以他一開始也只能白日做夢:
我和我高中的極客朋友們花了很長時間去腦暴在沒有一個圖形終端的情況下,我們能幹些什麼事情。我是當時唯一一個有點計算機知識的人(知道的也不多),我們最終想出了很多根本無法實現的點子。其中一個點子我一直記著,就是打印一幅星系地圖和星圖,然後用它們來幫助玩家射擊。
最終,米菲得向加州大學爾灣分校的一個學生借了一個賬號(嚴格來說這種行為是被禁止的)才獲得了 Sigma 7 的遠程登錄權限。他慢慢地跟著教科書,用電傳打字機一行一行地自學 BASIC。因為他的賬號沒有永久存儲權限,所以每次結束時,他都要把程序寫在打孔紙帶上,想修改的時候,需要小心翼翼地重新加載。儘管進展緩慢, 但在 1971 年高三的夏天結束之時,米菲得做出了一部在遊戲性和複雜度之間保持了恰好平衡的 《星際迷航》遊戲。
米菲得的遊戲最初只被簡單地稱作《星際迷航》,它讓玩家擔任企業號
的指揮官,奉命在全宇宙追擊克林貢人。遊戲的地形 8 乘 8 地分成 64 個扇區,每個扇區包含 64 個正方形的星區,整個地圖因此有近四千種不同的位置。每個扇區擁有若干恆星,它們是克林貢人的掩體,也是阻擋玩家前進的阻礙。有些扇區存在一個星空基地,在那裡企業號可以重新裝填光子魚雷,並恢復用於遷躍和護盾的能量。玩家的目標就是在三十個星際日內找到並打敗所有的克林貢人。在地圖中,符號 * 代表恆星,<*> 代表玩家的飛船。
[注: 以下所有的腳本都來自於 1974 年米菲得和李登聯合發表的那版遊戲。米菲得自己的那版大同小異,但排版不太一樣,並且語言更簡陋。我移除了一些水平空格來減少文字被換行的可能。]
《星際迷航》遊戲中的地圖是被後來稱之為 ASCII 圖形的早期案例,它將文字按一定方式排列,在電傳打字機上形成簡單的圖形。許多年以後,roguelike 類型的遊戲還將這種藝術發展成了一種頗具辨識度的風格。但本質上,米菲得的遊戲設計有更多的突發事件 ,比其他同期的作品更加扣人心絃,同時提供了更大的空間去容納不同的策略。玩家可以使用八種不同的命令分別控制引擎,護盾,光炮,光子魚雷,短距/長距探測器,損止系統以及百科電腦。許多命令可以接受額外的參數:轉移到護盾的能量值,需要獲取的電腦指令或者遷躍的速度以及方向(使用數字標註的羅盤)。因為支持浮點數,所以玩家可以精確地控制飛船在扇區進出:如果足夠精確,玩家可以遷躍過大半個宇宙,恰好到達一個發起攻擊的完美位置。遊戲命令的組合明顯比 《登月艙》 或者 《狩獵旺普斯》豐富,為了追擊敵人,玩家必須探索地形網格,這讓遊戲氣氛十分緊張,並且帶來許多發現的樂趣。敵人的火力或者過度使用遷躍引擎都會損傷飛船,玩家要根據各種不同的損傷去權衡是否要繼續追擊敵人,還是花點時間去找星空基地來修復戰艦。
要在遊戲中完成計劃通常需要執行很多步驟,這給了玩家一種他指揮的是一艘複雜的星際飛船、而不是一個星號字符的幻覺。如果玩家想找到克林貢人,就得動用他的百科電腦以及兩種探測器。長距探測器會將周邊的扇區標記上一個三位數的數字,玩家必須學著去解密它們:114 表示這個扇區有一個克林貢人,一個星空基地以及四顆恆星。如果玩家遷躍進了一個有敵人的扇區,那麼在將一部分能量用於展開護盾之後,玩家就得開始思考是用光炮還是魚雷,二者各自有各自的戰略得失。光炮可以無視距離攻擊多個敵人,但是這些敵人必須處於玩家的視野中,這就意味著玩家必須機動繞過一顆恆星,在看見敵人之時也將自身暴露在敵人的反擊火力下。而要發射魚雷,玩家必須計算出一條合適的彈道,或者學會使用百科電腦來幫忙計算軌道,並手動輸入百科電腦提供的數值。玩米菲得的 《星際迷航》 要求玩家全神貫注。它展露的嚴肅性和對細節的追求是此前很多遊戲無法做到的。
遊戲的代碼使用了各種奇淫巧技來克服早期 BASIC 語言的嚴重限制。光存儲遊戲中的 4096 個網格位置就已經超出了當時絕大多數機器的能力,所以與其用一個二維數組來一次性存儲每個網格對應的內容,不如將這部分信息“壓縮”成長距探測器會使用的那種三位數編碼。只有在玩家進入一個扇區後,遊戲才會根據編碼提供的信息,將一定數量的敵人和恆星隨機分佈在地圖中。因為玩家幾乎沒有理由重複進出同一個扇區,所以這種取巧的方式才能成功。即使玩家確實需要重新進入扇區,那也是因為他需要逃離敵人,那這時候,扇區裡的敵人處在不同的位置也情有可原。大多數玩家基本上都不會注意到恆星其實也跟著變了位置。
同時,遊戲的代碼也暴露了它是一個邊學邊做的產物,比如像是抱著試試的心態,用了一兩次就不再使用的 HP2000C BASIC 語言特性。整個程序僅僅定義了一個函數(在當時的 BASIC 中還相對是一個新概念),但也就只用了兩次而已,絕大部分都還是依賴傳統的 GOSUB/RETURN 來重複使用代碼。遊戲裡,作者用一個三位數的編碼來代表某個扇區裡有何物,並將所有扇區的編碼都存在了一個 8 x 8 的數組裡。在具體描述某個扇區裡的東西的分佈情況時,作者本可以再次使用數組來記錄,但他卻選擇了使用字符串這種更加刁鑽的方法,表明很可能這種方法是作者早期不懂數組時實現的。在當時,每個字符串最長為 72 個字符,而每個扇面上有 64 個星區,每個星區長度為 3,所以至少需要三個字符串才能完全表示這 192 個空間,作者將這三個字符串變量命名為 Q$, R$, S$ 。如果要查詢或者更新地圖上的某一個地方,那麼得首先根據座標信息找到這個地方是記錄在哪個變量上的。下面是算法的部分代碼,根據 Z1 和 Z2 兩個座標信息,從 Q$, R$, S$ 中找到具體的內容信息,並存在變量 A$ 中:
5520 S8=Z1*24+Z2*3-26 5530 IF S8>72 THEN 5560 5540 Q$[S8,S8+2]=A$ 5550 GOTO 5600 5560 IF S8>144 THEN 5590 5570 R$[S8-72,S8-70]=A$ 5580 GOTO 5600 5590 S$[S8-144,S8-142]=A$ 5600 RETURN
上述的代碼代表了在上世紀70年代早期使用 BASIC 語言來寫複雜程序時會遇到的各種挑戰。變量名稱只能由單個字母加額外的數字組成,沒有全局變量和本地變量的區別,也不能為一段代碼塊賦予一個有意義的名稱。儘管 BASIC 相比其他早期的語言已是一大進步,但搞明白一段不熟悉的代碼到底是幹嘛的依舊是個挑戰。這也恰是早期極客的樂趣之一,他們就喜歡拿著一堆有趣的程序,坐在那兒逐行分析它到底是怎麼運作的。
隨著在 1970 年代早期被多次轉手,米菲得的 《星際迷航》 升級使用了最新版本的 BASIC 語言,有時各種特性也被加強。最著名的改版來自於鮑勃·李登(Bob Leedom),他是職業程序員,就職於威斯汀屋(Westinghouse),負責研發通用數據超新星(Data General Nova)系列微機。李登在 1974 年斷斷續續地對《星際迷航》行進改進,保留了米菲得的核心繫統和遊戲流程,同時增加了一些讓遊戲更加完善、更具動感的改動。他的版本將原版中的指令全部換成了三個字母的代號(比如 LRS 代表長距探測,NAV 代表啟動引擎),令人想起阿波羅登月計劃中,宇航員使用過的機載計算機上的那些按鈕。李登添加了更有趣的指示以及消息:當魚雷的路線穿過恆星時,米菲得的版本會提示——“傻瓜,你不能摧毀一顆恆星”,李登的版本則替換成了更成熟和更有沉浸感的語言—— “星區 7 ,3,魚雷被恆星消解”。原版中,如果一個星空基地被摧毀,那麼代表它的符號只會無聲無息地從地圖上消失。而在李登的版本中,星際艦隊則會考慮對玩家展開軍事審判。更令人印象深刻的還有許多被重寫的狀態報告和錯誤消息,彷彿他們真的就是劇中艦橋的船員在傳遞消息一般。當玩家試圖遷躍出地圖的邊緣時,李登的版本則會提示:
李登給遊戲的扇區設定了更易聯想的名字,比如參宿四;給百科電腦新增了實用的函數;讓克林貢人在被攻擊後隨機移動到新的方位(而非像原著一樣坐以待斃,恭候玩家的魚雷)。這些改編不僅成功保留了原作的精髓,同時也讓遊戲更加好玩了。
李登改進的程序發行於 David H.Ahl 的 《創意計算》 雜誌上,為了和其他版本區分開,它用名《超級星際迷航》(Super Star Trek)。再後來,它被收錄於發行超百萬冊的 《BASIC電腦遊戲》 一書中,這讓它成了那個年代最為著名的 《星際迷航》 遊戲。接著湧現出了無數的衍生和改進版本,但都幾乎都沒有提到原作者是誰。一個叫做 WAR 的雙人版本演變成了多人遊戲的 DECWAR,再然後變成了 CompuServe 平臺上流行的 MegaWars 系列策略遊戲。在蘋果二代電腦上出現了一個叫做 《蘋果迷航》(Apple Trek)的版本。Radio Shack 為 Trandy 髮型了一版 "Space Trek"。1979 年,《星際奇兵》(Star Raider)登上了雅達利平臺,這個版本更先進,能以 3D 形式在動態的星域中進行戰鬥。《星際奇兵》作為雅達利平臺早期的現象級作品,直接影響了以後出現的 《Elite》 和 《Wing Commander》,後兩者則直接塑造了那個年代的太空戰鬥模擬遊戲。儘管在當時派拉蒙也後知後覺地發佈了幾部官方授權的《星際迷航》遊戲,但它們和其他遊戲相比幾乎沒激起任何水花。
《超級星際迷航》 不是那個年代最有文學性或者最複雜的《星際迷航》遊戲。1973 年 Willian K. Char 推出的一版迷航裡有大量艦橋船員的對話,數十種命令,玩家可以緊急拋棄遷躍核心,或者嘗試類似 Kirk 在原劇“Corbomite Maneuer”一集中所使用的策略。除此之外,當然還有非常多無人問津的《星際迷航》遊戲。米菲得和李登的程序能成為典範,就在於它們有趣且不過於複雜,代碼足夠精簡,可以被打印在雜誌或者書本上。在那個年代,人們認為書本或者雜誌才是獲取程序的最好途徑。作為 《BASIC電腦遊戲》 上最長的一個程序(除去指令大概有500行代碼),《星際迷航》 需要用比其他程序更小一號的字體,更緊密的間距來打印。還好它能擠得下,假如它的代碼再多一點點,那恐怕就很難被打印出來,更別說被大眾口耳相傳了。
一直以來,技術的不足總會限制文字遊戲的上限。然而對於上世紀的作者而言,頁數和字體大小也會成為遊戲開發的限制,《超級星際迷航》就是一個例子,但它也是最後一個。因為從那之後,遊戲的發展將遠超任何圖書印刷商的想象。
可以在這裡試試《超級星際迷航》,和原來的版本音效和色彩都不太一樣,但已經是最接近的版本了。要是有BASIC電腦的話,源碼在這裡。在Internet Archive上可以繼續閱讀由Maury Markowitz撰寫的本遊戲發展歷史。如果你感興趣的話,去年我還研究過這份源碼。
本文作者:Aaron A. Reed,撰稿人,推特@aaronareed,已取得翻譯轉載授權,原文鏈接
翻譯:@丁Ding 校對排版:@觀樂