Reactor 64
Reactor
Reactor

Dies ist - nach "Unser Sonnensystem", "Sternenhimmel", dem "TSB-Testbild" und zuletzt dem Spiel "North Sea Oil" - nun bereits die fünfte Portierung eines Simons'-Basic-Programms auf TSB. In allen diesen Projekten ging es einerseits darum, Programmen, die es wert sind, eine Chance auf weiteren Bestand zu geben. Alle portierten Programme haben jedoch auch von der Neubearbeitung profitiert, z.B. dadurch, dass ihre Ablaufgeschwindigkeit verbessert wurde oder dass eine Menge neuer Features zum Originalprogramm dazugekommen sind.

Hier nun ein Simons'-Basic-Spiel, das in der Januarausgabe 1985 der Zeitschrift "Homecomputer" als Programm des Monats veröffentlicht wurde: Reactor 64. Im Spiel geht es darum, die aus dem Ruder gelaufene Energieaufladung eines Atomreaktors durch Gegenenergie zu neutralisieren und damit einen atomaren Super-GAU - ein "China-Syndrom" - zu verhindern (im Eingangsbild oben sieht man die bläulich leuchtenden Reaktorwandungen und die kreuzförmige rote Neutralisierungssonde). Behindert wird man durch im Reaktorraum herumschwirrende Neutronen, im Wege stehende Gegenstände und später durch ein die Sonde verfolgendendes aggressives Proton. Gesteuert wird die Sonde mit dem Joystick (oder mit der Tastatur).

StartbildschirmBild 1: Der StartbildschirmTechnisch besteht das Spiel aus drei Abteilungen: der Benutzeroberfläche, dem eigentlichen Spiel und den Initialisierungsroutinen, die das Spiel nach jeder Runde neu aufbauen. Diese dritte Abteilung ist deswegen erforderllich, weil das Spiel einerseits die Multicolor-Grafik verwendet (für den Startbildschirm, s. Bild 1), aber andererseits die Spielumgebung mithilfe eines eigenen Zeichensatzes erzeugt. In Simons' Basic (und auch TSB) liegen Grafik und eigene Zeichensätze im gleichen Speicherraum und schließen sich daher gegenseitig aus. Will man trotzdem auf beides nicht verzichten, muss jedesmal neu initialisiert (oder nachgeladen) werden. Das hat die TSB-Version nach dem Port beibehalten (die Neudefinition der Zeichen ist nicht besonders zeitraubend).

Benutzeroberfläche TSBBild 3: TSB-UIBenutzeroberfläche SBBild 2: Original-UIDie erste Abteilung, die Benutzeroberfläche, ist im Original allerdings recht lieblos gestaltet. Sie wurde für die TSB-Version optisch erheblich aufgemöbelt (Bilder 2 und 3, man kann die Bilder vergrößern,wenn man sie in einem eigenen Fenster anzeigt). Auch den Warte-Bildschirm, der während des (in dieser Zeit also versteckten) Aufbaus des grafischen Startbildschirms angezeigt wird, haben wir modernisiert. Er erscheint jetzt ansehnlicher und ein bisschen informativer (Bilder 4 und 5).

Wartebildschirm TSBBild 5: TSB-Warte-ScreenWartebildschirm SBBild 4: Original-Warte-Screen Die gesamte Programmierung der Benutzeroberfläche ist in TSB moderner, nämlich strukturierter und damit leichter nachvollziehbar. Außerdem führen TSBs Eigenschaften dazu, dass ein Programm weniger Platz braucht. Beispiel: In TSB können - anders als in SB - mehrere Prozeduraufrufe nacheinander in einer Zeile stehen. Das spart bei jedem Aufruf vier Bytes (zwei für die interne Zeilenverknüpfung, zwei für die Zeilennummer), durch das Weglassen des Schlüsselworts EXEC werden noch einmal drei Bytes eingespart (zwei für das Schlüsselwort-Token, eins für den in SB obligatorischen Abstandhalter, das Leerzeichen). Sieben Bytes weniger pro zusätzlichem EXEC in einer Zeile! Zur Veranschaulichung hier zwei Code-Beispiele. Zuerst der Anfang der Prozedur "bildaufbau" an Zeile 40000 (links der SB-Code, rechts TSB):

40000 PROC BILDAUFBAU                               40000 proc bildaufbau
40010 COLOUR 0,0:REM UMRANDUNG                      40010 color 0,0
40020 FCOL 0,0,31,25,5                              40020 insert r1$,0,0,30,25,5
40030 POKE $CC00,81
40040 FCHR 0,1,28,1,80
40050 FCHR 1,0,1,23,82
40060 POKE $CC00+24*40,83
40070 FCHR 24,1,28,1,84
40080 POKE $CC00+40*24+29,85
40090 FCHR 1,29,1,23,86
40100 POKE $CC00+29,87
40110 MMOB 1,120,127,120,127,3,0:REM REAKTORKERN    40110 mob set 1,1,7,0,0,3: mmob 1,120,127
40120 MOB SET 1,1,7,0,0

SpielfeldBild 6: Das SpielfeldBeide Code-Schnippsel tun das Gleiche: sie bauen das Spielfeld auf, den grünen Rand des Reaktorraums und das Sprite des Reaktorkerns in der Mitte (hier braun, die blaue Wand des Kerns folgt erst später).

Sind die ersten zwei Zeilen noch identisch, spart TSB dann ganze neun von elf Basic-Zeilen ein, bei gleichem Ergebnis! Lediglich die Definitionszeile zum String r1$ (Zeile 40020, TSB-Seite des Code-Beispiels) befindet sich nicht hier, sondern in einer Initialisierungsprozedur an anderer Stelle. Übrigens, statt der POKEs hätten im SB-Code auch FCHR-Befehle funktioniert (hier werden mit POKE die Ecken des Spielfeldrands gesetzt).

Das zweite Code-Beispiel zeigt die Einsparungen durch die einfacheren Prozeduraufrufe in TSB und den Einsatz von Strukturbefehlen statt GOTO. Dies ist ein Teil der Prozedur "spielen" (an Zeile 10000):

10030 IF LEVEL>7 THEN PRO=1:ELSE:PRO=0                10030 repeat: if lv>7 then pr=1: else pr=0
10040 EXEC LEVEL                                      10040 level:zeichensatz:sprites:bildaufbau
10045 EXEC ZEICHENSATZ
10046 EXEC SPRITES
10050 EXEC BILDAUFBAU
10060 EXEC SOUND2                                     10060 .sound2: .sound3: .sound4
10070 EXEC SOUND3
10080 EXEC SOUND4
10090 SYS GAME                                        10090 sys ga: .reset: e=peek(2)
10095 EXEC RESET
10100 E=PEEK(2)
10110 IF E=8 THEN EXEC POINTS                         10110 if e=8 then points: lv=lv+1: sp=6
10120 IF E=8 THEN LEVEL=LEVEL+1:GOTO 10030
10130 IF E=1 THEN PRINTAT(8,4)"{LIGHT GREEN}CHINA SYNDROM!":
                  PRINT AT(8,6)"YOU HAVE LOST!"
10140 RCOMP GOTO11000
10150 SPIELER=SPIELER-1                               10150 sp=sp-1
10160 IFSPIELER>0THEN10030                            10160 until e=1 or sp=0: sl=lv

Diese Schleife wird solange ausgeführt, bis in der Variablen e der Wert 1 steht oder sp auf 0 fällt. In SB realisiert als GOTO-Schleife (zwischen den Zeilen 10030 und 10160), in TSB als REPEAT-UNTIL-Schleife (für die Reaktion auf den Wert 8 in e steht in SB in Zeile 10120 wiederum ein GOTO, in TSB ist sie Teil der Schleifenstruktur). Der TSB-Code verzichtet aus Platzgründen auf lange Variablennamen. Also: statt 17 Basic-Zeilen in SB reichen in TSB ganze sieben Zeilen (wobei - wie eben beschrieben - allein hier 49 Bytes Code eingespart werden).

Die Prozedur "level" ist ein Countdown auf den Spielstart (den man in TSB durch Tastendruck auch abkürzen kann, was den Spielspaß erheblich steigert!), "zeichensatz" und "sprites" sind der bereits erwähnte Neuaufbau der Spielmaterialien, der nach jedem Startbildschirm erfolgen muss. Die Prozedur "bildaufbau" erzeugt das Spielfeld (s. Bild 6) und sorgt für die zufallsgesteuerte Positionierung der Neutronen (die gelben "Kaulquappen"). Nach einem Startton (durch die drei SOUNDs) geht das Spiel los, das komplett im Maschinenprogrammteil von Reactor stattfindet (Zeile 10090). Man kehrt nur dann aus dem Spielmodus zurück, wenn die Spielzeit abgelaufen ist (e=1) oder wenn keine Neutralisierungssonden mehr vorhanden sind (sp=0, gleichbedeutend mit Level nicht geschafft).

An dieser Stelle habe ich in TSB an drei Stellen ins Spielkonzept eingegriffen. Mit sp=6 in Zeile 10110 sorge ich dafür, dass im nächsten Level der Vorrat an Sonden wieder auf fünf aufgefüllt wird (das Spiel ist sonst nicht zu schaffen!), und sl=lv in Zeile 10130 sorgt dafür, dass das Spiel nicht vergisst, in welchem Level man zuletzt gewesen ist, denn TSB zeigt das an (Bild 3) und startet beim Weiterspielen dann auch in diesem (ja vorher nicht geschafften) Level. Auch der Highscore geht dabei nicht verloren (wie in SB, wird dort in Zeile 10020 gelöscht) und kann in TSB von Level zu Level weiter aufgebaut werden.

An der Funktionsweise des Maschinenprogrammteils von Reactor habe ich so gut wie nichts geändert, allerdings konnte ich den Code um sage und schreibe 150 Bytes verkürzen! Noch ein weiteres Schwierigkeits-Feature des Programms, nämlich das Erscheinen eines "Protons", das ab Level 9 die aktive Neutralisierungssonde verfolgt und letztendlich zerstört, habe ich entschärft. Man kann nämlich durch Drücken der Feuertaste (steuert hier die Stasis-Energie) alle Aktivität im Reaktorraum (außer der eigenen) einfrieren und somit einem zu nahe gekommenen Proton entwischen. Doch leider entlädt sich die Stasis-Energie im Original viel zu schnell. Ohne sie hat man aber keine Chance mehr, einen Level erfolgreich zu absolvieren.

Der langsamere Entladungsvorgang kann natürlich programmtechnisch wieder beschleunigt werden. Mit der von mir geänderten jetzigen TSB-Einstellung hat man mehr Stasis-Energie. Wer aber das Original-Feeling ausprobieren möchte, fügt im Basic-Programm in Zeile 110 den Befehl POKE $7a88,1 an. Wer es eher nur halb so schnell wie im Original wünscht, nimmt statt der 1 eine 9 für den POKE.

Viel Spaß mit dem Reactor!

<nach oben>


Download Reactor TSB (D64)
Auf der Disk befinden sich auch Simons' Basic (in gepackter Form) und das Originalspiel.
Kommentiertes Listing des Maschinenspracheteils von Reactor auf Github