
Bild 1: Ein Level in Ghost Valley
Da Ghost Valley auf Hires-Grafik verzichten kann und fast alle grafischen Elemente mit dem Zeichensatz erledigt, war der Ablageort für diese Routine (der Platz für die Farben einer Hires-Grafik an Adresse $C000) gerade richtig. Ghost Valley 2.0 war geboren.
Warum nicht so etwas als Befehl in TSB integrieren? @Omega (Christian Nennewitz) hat unübersehbar bewiesen, dass Basic-Spiele - zumal in TSB programmiert - richtig Spaß bereiten können! Da wäre ein neuer Befehl, der schnelle Level-Screens ausgibt, doch wirklich nützlich! Gesagt, getan.
Mit der Ausgaberoutine von @1570 als Vorlage war schnell der Befehl MAP erstellt. Er zeichnet 2×2-Kacheln (Tiles, gesammelt in einem Tile-Set) aus einem dafür erstellten Spiele-Zeichensatz auf den Bildschirm. Dabei verwendet er eine Vorlage, die die Positionen dieser Kacheln auf dem Screen wiedergibt, die eigentliche Map.

Bild 2: Ghost-Valley-Zeichensatz
Und wie funkioniert das mit den Farben? Gut, MAP färbt kachelweise ein, nicht zeichenweise. Dafür erwartet der Befehl ein Integer-Array, dimensioniert auf die Anzahl der Kacheln (also bis zu 48). Integer ist zwingend erforderlich, da der Befehl die Farben direkt aus dem Speicher ausliest und nur wissen muss, wo die Farb-Daten beginnen.
Dies ist die Syntax von MAP:
MAP Spalte, Zeile, Kachel$, Farb-Array%
und optional noch nach einem Trennzeichen (wie dem Semikolon) angehängte Ausgabeparameter, wie sie auch bei PRINT vorkommen würden (z.B. AT(Spalte, Zeile) "Text" usw.) Achtung: Die Werte von Zeile und Spalte bei MAP werden intern verdoppelt, da jede Kachel aus 2×2 Zeichen besteht, ein Wert von 5 schreibt also nach 10.
MAP muss ausdrücklich ins TSB-System eingebunden werden, da es sich um einen Spezialbefehl handelt, der Platz belegt, der sonst auch anderweitig verwendet werden könnte. Er macht nur Sinn, wenn es darum geht, schnelle Spiele-Bildschirme anzuzeigen. Außerdem kann man den Befehl so viel einfacher umprogrammieren und um weitere Features erweitern.
Folgende Basic-Zeilen aktivieren den Befehl MAP (der sich unter dem Namen "ext.map" auf der Disk befinden muss). Das TSB-System muss dazu mindestens die Versionsnummer 2.30525 aufweisen (lässt sich mit RETRACE feststellen).
100 if peek($cb00)=$ad then poke$873d,$ff:poke$873e,$ca 110 if d!peek($873d)<>$caff then load"ext.map",0,0,$cb00
Für Bild 1 ergäbe sich die folgende Screen-Vorlage (Map) von 40×20 Kacheln, es handelt sich um Screen 3 in Level 5 von Ghost Valley, wo man am Drachen vorbei muss, um den gelben Schlüssel zu bekommen (im Bild ist das gerade schiefgegangen, denn der arme Prinz wurde soeben ein Opfer der Drachenflammen):
Map: 6666666666%%%%%%%%%% "6" ist Code 54 (das Wasser), "%" ist Code 37 (das Mauerwerk) 6666%%%%%%% % 6666% ? % "?" ist Code 63 und steht für ein im Spiel unsichtbares Signalzeichen %%%%% ? % %%%% +++ % "+" ist Code 43 (die grüne Hecke) & %%%%%%%%%%%%% "&" ist Code 38 (die Tür) %%%%% 6666% # "#" ist Code 35 (die Baumkrone) 6666%%%%%%% $& & "$" ist Code 36 (der Baumstamm) 6666666666%%%%%%%%%% Hier nicht aufgeführte Zeichen aus Bild 1 sind Sprites.
Für die Farben muss jeweils der Wert 35 von den Codes abgezogen werden, damit die Position im Farb-Array stimmt. Für das Wasser ergibt sich 54 - 35 = 19, d.h. wenn das Array den Namen co% hat, wird an Position co%(19) der Wert 6 (blau) eingetragen, und für das Mauerwerk kommt 37 - 35 = 2 heraus, nach co%(2) muss der Wert 2 (rot) geschrieben werden.
In Ghost Valley hat @Omega folgende Variablen festgelegt:
- ma$(4,10): die vier Screen-Maps pro Level, Feldindex 0 wird nicht verwendet
(4 Screens mit je 10 Kachelzeilen, jede Zeile in einem eigenen MA$-Index)
- co%(48): die 48 Kachelfarben, Feldindex 0 wird auch hier nicht verwendet
- nr%: Nummer der aktuellen Level-Map (in Bild 1 ist das nr%=3)
Hier die Routine, die alle vier Level-Maps einliest. Die Daten dafür beginnen in Zeile 12720, Screen 3 liegt an Zeile 12940 (hier weggelassen, die Werte haben wir ja oben schon gezeigt):
12630 rem ---------- 12640 proc mapdaten 12650 reset12720 Beginn der DATA-Zeilen für die vier Screen-Maps 12660 for i=1 to 4 Vier Maps... 12670 : for j=1 to 10 ...zu je 10 Kachelzeilen 12680 : read ma$(i,j) 12690 : next j 12700 next 12710 rem -screen 01------- 12720 data " # '? ?' '?&" 12730 data " $@ '? ? ?' #c '? "
Und die Routine, die eine ganze Screen-Map (blitzschnell) ausgibt, sieht so aus:
920 rem ---------- 930 proc map 940 spritesaus04567 Sprites erstmal aus 950 bloeschen 960 for i=1 to 10 10 Kachelzeilen ausgeben 970 : map 0,i-1,ma$(nr%,i),co%(1) 980 next i 990 end proc
Da die Array-Indizes 0 in Ghost Valley nicht benutzt werden, gibt man hier beim MAP-Befehl den Ausgangspunkt der Farben mit Index 1 statt 0 an: co%(1). Die interne Berechnung durch MAP geht nämlich davon aus, dass Index 0 verwendet wird (dann müsste man co%(0) angeben). So könnte man auch mehrere verschiedene Farblisten erstellen: Das Farb-Array entsprechend groß machen und im MAP-Befehl den Basiswert für die jeweilige Farbliste angeben (hier also: 1).
Der MAP-Befehl rechnet die Werte für die Bildschirmzeilen selbsttätig korrekt aus (mit dem doppelten Wert der Laufvariablen, hier also von 0 bis 18 in Zeile 970: i-1 intern mal 2). Man kann solche Screens nach der Ausgabe durch MAP natürlich noch zusätzlich (mit FCOL) nachfärben, wie man ganz oben auf dieser Seite im Titelbild oder bei den hier unten folgenden Beispielen sehen kann.
Zu Demonstrationszwecken haben wir nämlich eine Diskette zusammengestellt, auf der fünf solcher Screen-Maps zu finden sind, hauptsächlich aus Material entnommen, das dem PC-Programm CharPad der englischen Firma Subchrist beiliegt. Wir sind nicht ganz sicher, ob es sich dabei um Zeichensätze aus kommerziellen Spielen handelt, weil wir jeweils nur wenige Informationen recherchieren konnten.
Die Screen-Maps und deren TSB-Darstellungsprogramm auf der Diskette sollen aber auf jeden Fall zeigen, wie gut der MAP-Befehl auch Basic-Programme dazu befähigt, beeindruckende Spieleszenarien zu entwickeln. Eine große Hilfe beim Umsetzen der CharPad-Daten nach TSB war auch das großartige C64Studio von Georg Rottensteiner (@Endurion), mit dem wir die Zeichensatzdefinitionen, Tile-Sets und Farbinformationen erfolgreich nach TSB konvertieren konnten (TSB selber war natürlich auch sehr hilfreich, s. die Make-Hilfsprogramme auf unserer Disk).
Jetzt Screenshots von unserem Programm "testmaps" auf der unten auf dieser Seite downloadbaren Demo-Disk für den neuen TSB-Befehl MAP. Im Folgenden zunächst ein Beispiel aus dem (unveröffentlichten?) Spiel "Danger Castle", an dem Saul Cross beteiligt war:
Ein weiteres Beispiel ist ein Screenshot aus dem Spiel Kirby's Dreamland (ursprünglich für Nintendo):
Und schließlich noch ein Screenshot, von dem ich nur den Titel des Bildes, aber nicht das dazugehörige Spiel kenne ("Icehouse"):
Alle diese Screenshots kann man sich nacheinander auf dieser Diskette anschauen: D64 downloaden, TSB starten und dann das Programm "testmaps" laden und starten.