Willow Pattern

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Willow Pattern
Titelbild vom Spiel
Spiel Nr. 1089
Bewertung 6.50 Punkte bei 2 Stimmen
Entwickler Greg Duddle
Firma Mr. Micro Ltd
Verleger Firebird, Pubblirome/Game 2000
Musiker David Whittaker
HVSC-Datei /MUSICIANS/W/Whittaker_David/Willow_Pattern.sid
Release 1985
Plattform(en) C64, ZX Spectrum, Amstrad CPC
Genre Actionadventure
Spielmodi Einzelspieler
Steuerung Icon Port2.pngIcon joystick.png Icon tastatur.png
Medien Icon kassette.png Icon disk525.png Icon cartridge.png
Sprache Sprache:englisch Sprache:italienisch
Information aka The Willow Pattern Adventure
Il Pirata Sprache:italienisch


Beschreibung[Bearbeiten | Quelltext bearbeiten]

Willow Pattern ist ein Actionadventure, das sich über 64 Bildschirme erstreckt. Scrolling gibt es keines, die Bildschirme werden im Flick-Screen-Verfahren dargestellt. In Gestalt des chinesischen Sekretärs Chang kämpft sich der Spieler durch ein streng bewachtes Gartenlabyrinth, um Prinzessin Koong-Shee zu befreien. Sobald Chang mit ihr zusammen die Flucht auf ein rettendes Schiff gelingt, ist seine Mission erfüllt.

Startbildschirm von "Willow Pattern", eventuell mit Punktestand des vorigen Spiels


Vorgeschichte

Chang
Koong-Shee

Der Titel des Spiels (zu deutsch "Weidenmuster") bezieht sich auf eine chinesische Legende, die auf unzähligen Tee-Services blau auf weiß dargestellt wird: Der böse Mandarin Li Chi will seine Tochter, Prinzessin Koong-Shee, gegen ihren Willen mit dem Herzog (oder, in einer anderen Version der Geschichte, mit dem Kaufmann) Ta-Jin vermählen. Als er erfährt, dass die Prinzessin den Sekretär Chang liebt, beschließt der Mandarin, sie in einem Gartenlabyrinth einzusperren und bis zur Hochzeit mit Ta-Jin streng bewachen zu lassen. Chang schleicht sich daraufhin als Diener verkleidet zu ihrem Gefängnis, befreit Koong-Shee und flieht mit ihr und den Juwelen, die der von ihrem Vater ausgesuchte Bräutigam als Hochzeitsgeschenk mitgebracht hatte, auf dessen Schiff zu einer fernen Insel.

Nicht im Spiel verarbeitet, sondern allenfalls im obigen Titelbild angedeutet wird der zweite Teil der Legende, in dem der Mandarin Jahre später das Versteck von Chang und Koong-Shee entdeckt und die beiden töten lässt (oder, in einer anderen Version der Geschichte, Chang töten lässt, woraufhin Koong-Shee Selbstmord begeht). Die beiden Schwalben im Titelbild sollen möglicherweise die beiden Vögel darstellen, in die die Götter die Liebenden daraufhin verwandeln.


Gestaltung[Bearbeiten | Quelltext bearbeiten]

Das Gartenlabyrinth, das Chang auf der Suche nach der Prinzessin Koong-Shee durchstreift, ist zwar aus einer überschaubaren Anzahl sich wiederholender Elemente zusammengesetzt, wirkt aber dennoch abwechslungsreich und ist in seiner Farbenpracht schön anzuschauen — blühende Bäume und Büsche, dazwischen kleine Teehäuser, filigrane Zäune und malerische Wasserläufe (linkes Bild der nachfolgenden Galerie).

Einige Teile des Irrgartens sind durch Brücken verbunden, die jedoch jeweils von drei Riesen versperrt sind (rechtes Bild). Hier muss Chang den Fluss überqueren, indem er von Stein zu Stein hüpft und dabei den nach ihm greifenden Riesen ausweicht. Da der Bewegungsablauf der Gegner immer gleich ist, wird dieses Hindernis schnell langweilig und vor allem lästig.

Gleiches gilt für die fernöstlich klingende Melodie, die das Spiel untermalt, sich jedoch alle 18 Sekunden wiederholt. Auch wenn sich ihr Tempo steigert, sobald Chang ein Schwert mit sich führt, so wirkt die Musik doch schon nach kurzer Zeit eintönig.


In seiner Eile hat Chang wahrscheinlich keinen Blick für die Schönheit des Gartens
Drei Riesen versperren die Brücke und greifen nach Chang



Grafik

Die grafische Darstellung findet im Multicolor-Bitmap-Modus statt, wobei nur ein Ausschnitt von 256x192 Pixeln Größe für die Szenen aus dem Gartenlabyrinth verwendet wird. Da im Hauptspeicher des Commodore 64 hierfür nur eine Bildschirmseite reserviert ist (an Adresse $6000, zugehörige Farbinformation im Bildschirmspeicher ab Adresse $4400), ist beim Übergang von einem Screen zum nächsten für etwa 0,2 Sekunden ein Durcheinander aus altem und neuem Bildschirminhalt zu sehen.

Chang, Koong-Shee, alle Gegner und alle Bonus-Gegenstände werden durch einfarbige Sprites in einfacher Breite und Höhe dargestellt. Insbesondere Chang wirkt dadurch sehr schlicht, und gelegentlich etwas unförmig. Große Mühe hat sich der Autor aber mit der Animation der Figuren gegeben: Für jede der vier möglichen Bewegungsrichtungen wechseln sich vier Sprites ab, und das jeweils für den unbewaffneten Chang, für "Chang mit Schwert" und für "Chang mit Koong-Shee". Nur die Kombination "Chang mit Koong-Shee und Schwert" gibt es nicht; sobald Chang auf dem Rückweg zum rettenden Schiff eine Waffe aufnimmt, verschwindet kurzzeitig die Prinzessin.


WillowPattern FigurLinks.gif
WillowPattern FigurRechts.gif
WillowPattern FigurHoch.gif
WillowPattern FigurRunter.gif
WillowPattern SchwertLinks.gif
WillowPattern SchwertRechts.gif
WillowPattern SchwertHoch.gif
WillowPattern SchwertRunter.gif
WillowPattern PrinzessinLinks.gif
WillowPattern PrinzessinRechts.gif
WillowPattern PrinzessinHoch.gif
WillowPattern PrinzessinRunter.gif



Auch die Gegner sind in gleicher Weise animiert, so dass allein für die Figuren insgesamt 72 Spritedefinitionen hinterlegt sind:


WillowPattern GegnerLinks.gif
WillowPattern GegnerRechts.gif
WillowPattern GegnerHoch.gif
WillowPattern GegnerRunter.gif
WillowPattern GegnerHellrot.gif
WillowPattern GegnerOrange.gif
WillowPattern GegnerGrau.gif



Hinweise[Bearbeiten | Quelltext bearbeiten]

Bedienung[Bearbeiten | Quelltext bearbeiten]

Die Spielfigur lässt sich wahlweise mit einem Joystick in Port 2 oder mit der Tastatur steuern.

Bei Verwendung des Joysticks wirft Chang, sofern er bewaffnet ist, mit einem Druck auf den Feuerknopf sein Schwert in die Richtung, in die er sich zuletzt bewegt hat. Unabhängig davon, ob er dabei einen Gegner trifft oder nicht, ist das Schwert anschließend verschwunden, so das Chang unbewaffnet zurückbleibt. Während der Überquerung eines Flusses springt Chang, sobald man den Feuerknopf betätigt.

Bei einer Steuerung über die Tastatur gilt die folgende Zuordnung:

  • SPACE : Start des Spiels.
  • A  / S : Links / Rechts.
  • :  / ; : Oben / Unten.
  • SHIFT : Schwert werfen / über Fluss springen.
  • H  / T : Pause / Fortsetzen.

Bildschirmaufbau[Bearbeiten | Quelltext bearbeiten]

Nachdem Chang einem auf ihn geworfenen Schwert ausgewichen ist, kann er die Waffe nun an sich nehmen. Der Bonusgegenstand ist nur über angrenzende Räume erreichbar.

An zahlreichen Stellen im Gartenlabyrinth sind Durchgänge durch Wächter versperrt, die Chang besiegen muss, um seinen Weg fortsetzen zu können. Da er zu Beginn des Spiels unbewaffnet ist und zudem jedes Schwert nur für einen einzigen Wurf benutzen kann, ist Chang darauf angewiesen, auf seinem Weg immer wieder neue Waffen einzusammeln. Am einfachsten geht dies, indem er Schwerter aufnimmt, auf die er beim Durchqueren des Labyrinths stößt (abgebildet ganz links in der nachfolgenden Galerie der Bonusgegenstände). An insgesamt 14 Stellen im Irrgarten findet Chang auf diese Weise eine Waffe. Ein solcher Fund erhöht nicht den in Prozent angegebenen Punktestand, beim erfolgreiche Einsatz des Schwerts gegen einen Gegner steigt dieser jedoch um 1%.

Von den restlichen Gegenständen ist nur der Schlüssel zu Koong Shees Gefängnis, der in der folgenden Illustration ganz rechts zu sehen ist, für die Lösung des Spiels wichtig. Die restlichen Bonusgegenstände erhöhen zwar den Punktestand — 3 Äpfel und 2 Dracheneier um je 1%, 5 Kristalle und 4 Goldmünzen um je 2% — bringen Chang jedoch seinem Ziel nicht näher, die Prinzessin zu befreien und mit ihr zusammen zu fliehen.


WillowPattern Bonus.gif

Bonusgegenstände: Schwerter, Äpfel, Dracheneier, Kristalle, Goldmünzen und der Schlüssel zu Koong Shees Gefängnis


Da die im Irrgarten bereitliegenden Schwerter bei weitem nicht ausreichen, um sich den Weg zu Koong Shee freizukämpfen, kann Chang sich weitere Waffen besorgen, indem er Wächter entwaffnet und ihr Schwert an sich nimmt; diese Möglichkeit besteht aber nur bei hellrot und bei orange gefärbten Gegnern. Chang nähert sich hierfür einem Wächter von links oder rechts so lange, bis dieser sein Schwert nach ihm wirft. Weicht Chang nun rechtzeitig zurück oder zur Seite aus, ohne dabei aber den aktuellen Bildschirm zu verlassen, so fällt das Schwert in einiger Entfernung von Gegner zu Boden und kann von Chang aufgenommen werden. Falls er von diese Möglichkeit keinen Gebrauch macht, so nimmt der Gegner das Schwert wieder an sich, sobald Chang den aktuellen Bildschirm verlässt, ansonsten ist der Gegner von nun an unbewaffnet. Chang kann ein auf diese Weise erworbenes Schwert wahlweise gegen dessen ehemaligen Besitzer oder gegen einen anderen Gegner einsetzen (linke Animation der nachfolgenden Galerie).

Fortbewegung[Bearbeiten | Quelltext bearbeiten]

Mehrere Stellen des Labyrinths sind nur über Brücken passierbar (in Screen B1, C4, F4, A7 und A8). Sobald Chang die an diesen Stellen dargestellte Brücke berührt, wechselt der Bildschirm zu einer Szene, in der Chang den Fluss überqueren muss, indem er von Stein zu Stein hüpft (mittleres Bild der Galerie). Die Brücke selbst ist durch drei Riesen blockiert, die nach Chang greifen. Da diese Bewegung jedoch völlig regelmäßig verläuft, braucht er nur darauf zu achten, dass er sich nahe am nächsten Zwischenraum positioniert und in dem Moment springt, in dem der vor ihm lauernde Riese die Hand zur Faust ballt.

Wenn Chang es sich anders überlegt und den Fluss doch nicht überqueren möchte, so ist eine sofortige Rückkehr ans Ufer nicht möglich — bei einem Rücksprung vom ersten Stein aus fällt Chang ins Wasser und verliert ein Leben. Stattdessen muss er die Brücke zunächst überqueren und anschließend vom gegenüberliegenden Ufer aus zurückkehren.

Auch falls Chang durch einen Fehltritt oder den Griff der Riesen ins Wasser fällt, so verliert er ein Leben. Ein eventuell beim Betreten der Brücke mitgeführtes Schwert bleibt ihm dabei aber erhalten. Falls Chang dagegen auf dem Weg durch den Garten ein Leben verliert, während er gerade im Besitz eines Schwertes war, so startet er sein nächstes Leben unbewaffnet.

Sobald Chang die Prinzessin Koong-Shee befreit hat, werden die beiden auf ihrer Flucht zum rettenden Schiff vom Mandarin verfolgt. Gegen diesen Endgegner hilft kein Schwert, sondern nur schnelle Flucht (rechtes Bild). Er betritt jeden neuen Screen genau 1,12 Sekunden nach Chang und Koong-Shee, lässt sich also nicht abschütteln. Allerdings bedeutet dieses Bewegungsmuster auch, dass eine Sackgasse für die beiden keine Gefahr darstellt: Sie brauchen den Screen nur innerhalb von 1,12 Sekunden wieder zu verlassen und können ihre Flucht dann in der Gegenrichtung fortsetzen.


Schnell noch ein Mitbringsel für die Prinzessin besorgen...
Chang überquert einen Fluss
Gegen den Mandarin hilft nur schnelle Flucht




Lösung[Bearbeiten | Quelltext bearbeiten]

Um die im Spiel gestellte Aufgabe zu lösen, muss der Spieler nacheinander der Schlüssel zu Koong Shees Gefängnis einsammeln, dann die Prinzessin befreien und schließlich mit ihr zusammen das für die Flucht benötigte Schiff erreichen.

Für den Weg zu Kong Shees Gefängnis hat Chang unbegrenzt Zeit, und nur beim Überqueren von Flüssen und beim Entwaffnen von Gegnern sind schnelle und teilweise pixel-exakte Bewegungen erforderlich. Während aber das fehlerfreie Springen von Stein zu Stein schon nach kurzer Zeit keine Herausforderung mehr darstellen dürfte, braucht der Bewegungsablauf beim gezielten Annähern und beim blitzschnellen Ausweichen angesichts bewaffneter Gegner, und insbesondere das Abschätzen der dabei notwendigen Entfernungen, durchaus etwas Übung.


In Screen D8 (Koordinaten siehe Karte im nachfolgenden Abschnitt) reicht der Platz nicht aus, um dem Schwert des Gegners auszuweichen und ihn zu entwaffnen...
... und in Screen A7 sind schnelle und exakte Bewegungen erforderlich.
Immerhin: In Screen G5 kommt ein Baum zu Hilfe.



Auf dem Rückweg zum Schiff werden Chang und Koong-Shee, in Anlehnung an die zugrundeliegende Legende, von dem Mandarin gejagt (der im Spiel aber eher aussieht wie die Hexe aus "Hänsel und Gretel"). Dieser Verfolger lässt sich nicht abschütteln, sondern betritt jeden Screen, in dem sich Chang und Koong-Shee aufhalten, innerhalb von 1,12 Sekunden durch den gleichen Eingang, den auch die beiden genutzt haben. Anschließend geht er auf möglichst direktem Weg in ihre Richtung. Falls man sich den beiden nur auf einem Umweg nähern kann, der kurzzeitig von ihnen wegführt, so erkennt der Mandarin diese Möglichkeit nicht. Da er sich aber auch diagonal bewegen kann, während das Paar nur wahlweise nach oben/unten oder nach links/rechts gehen kann, hat er einen deutlichen Geschwindigkeitsvorteil.


Karte


Zu besseren Orientierung ist die Karte mit einem Gitternetz und einem Koordinatensystem versehen, auf das sich im folgenden alle Ortsangaben beziehen.

Karte des Gartenlabyrinths

Für die Lösung des Spiels wichtig sind neben dem Startbildschirm A8 vor allem der Gefängnisschlüssel im Screen mit den Koordinaten D3, Koong Shees Gefängnis in A1, und die Anlegestelle für das zur Flucht verwendete Schiff in A6. Sobald Chang im Besitz des Schlüssels ist, verschwindet das Gitter rechts von der Prinzessin, und sobald er von ihr begleitet wird, ist das Schiff frei zugänglich.

Die nachfolgende Karte illustriert den Weg vom Startpunkt zur Prinzessin (orange Linie, von der linken unteren Ecke zur linken oberen Ecke). Er ist mitbestimmt durch die Tatsache, dass Chang jeweils nur ein Schwert mit sich führen kann, und die Notwendigkeit, sparsam mit den vorhandenen Schwertern umzugehen und eventuell auch später zu einer Waffe, die man zunächst nicht hatte aufnehmen können, zurückzukehren. So wäre beispielsweise vom Startpunkt A1 aus die Zwischenstation A6 nicht nur wie eingezeichnet über A8/A7, sondern auch über B8/C8/D8/D7/D6/C6/B6 erreichbar, was Chang das Überqueren zweier Brücken ersparen würde. Allerdings verbraucht dieser alternative Weg zwei Schwerter, die im weiteren Spielverlauf benötigt werden. Ebenso lohnt es sich immer wieder, Gegner, die den Weg nicht blockieren, nur zu entwaffnen.

Umwege, die ausschließlich dazu dienen, zusätzliche Schwerter zu besorgen, sind in dieser Karte rosa eingetragen; der kurze Umweg zum Gefängnisschlüssel ist hellblau. Aus Gründen der Übersichtlichkeit bleiben Bonusgegenstände, die nicht zur Rettung von Koong Shee beitragen, unberücksichtigt.

Weg vom Startpunkt bis zum Gefängnis der Prinzessin (orange). Umwege, auf denen sich zusätzliche Schwerter finden lassen, sind rosa eingezeichnet.

Die Flucht zum rettenden Schiff folgt den gleichen Pfaden, die Chang schon auf seinem Weg vom Startpunkt zum Gefängnis der Prinzessin gegangen ist. Das Schiff in Screen A6 ist nun frei zugänglich, der bisher rechts davon befindliche Zaun ist verschwunden. Sobald Chang und Koong-Shee durch den stattdessen vorhandenen Durchgang zum Schiff schlüpfen, endet das Spiel mit der lapidaren Meldung "WELL DONE":

Chang und Koong Shee haben es geschafft: Ein Schiff bringt sie zu einer fernen Insel.

Zudem erklingt ab jetzt wieder die Titelmelodie, die auch den Startbildschirm und die Überquerung der Flüsse untermalt. Die Legende besagt, dass das Schiff von Ta-Jin das Paar nun zu einer fernen Insel bringt.


Cheats[Bearbeiten | Quelltext bearbeiten]

In der CSDb gibt es mehrere Cracks mit einer Trainerfunktion...


Unendlich viele Leben...
... dazu beliebig viele Schwerter und keine Angst mehr vor den Riesen auf der Brücke ...
... und jetzt wird die Flucht endgültig zum Spaziergang.


... und in der Gamebase64 gibt es eine Version, bei der sich jemand richtig ausgetobt hat:


Wer merkt sich diese ganzen Tasten?


Alternativ können die im nächsten Abschnitt vorgestellten internen Datenstrukturen so manipuliert werden, dass sich maßgeschneiderte Cheats ergeben.

Interne Datenstrukturen[Bearbeiten | Quelltext bearbeiten]

Die nachfolgend aufgeführten internen Datenstrukturen des Spiels erlauben eine gezielte Veränderung des Spielablaufs, indem die hier zitierten Tabellen und Maschinenbefehle entsprechend modifiziert werden. Allerdings beziehen sich die angegebenen Adressen nicht auf die geladene Datei, sondern auf das bereits gestartete Spiel im Hauptspeicher (also nach dem Umkopieren der einzelnen Programmteile an ihren endgültigen Speicherort — ein Vorgang, der bei allen im World Wide Web angebotenen Kopien des Spiels unterschiedlich gelöst ist). Zu jeder Datenstruktur ist daher im folgenden auch die Adresse (in Klammern und im Dezimalsystem, passend für eine Verwendung mittels POKE) angegeben, an der sie sich direkt nach dem Laden von "Willow Pattern" in Form des CSDb-Release 102753 finden.


Dynamische Elemente[Bearbeiten | Quelltext bearbeiten]

Das zentrale Steuerungselement des Spiels ist eine 8 x 8 Byte große Tabelle an Adresse $42C0–$42FF. Jedem Screen im Labyrinth ist in dieser Tabelle ein Byte zugeordnet. Das höherwertige Nibble speichert die Art des Gegners, der Chang in diesem Screen gegenübertritt, das niederwertige Nibble die Art des Bonusgegenstands:

High Nibble Bild Typ des Gegners Bemerkung
$0x - Kein Gegner -
$8x
WillowPattern GegnerOrange.gif
Oranger Gegner ohne Schwert Entsteht durch Entwaffnen während des Spiels
$9x
WillowPattern GegnerGrau.gif
Grauer Gegner ohne Schwert 21 Mal vorhanden
$Ax
WillowPattern GegnerHellrot.gif
Hellroter Gegner ohne Schwert Entsteht durch Entwaffnen während des Spiels
$Cx
WillowPattern GegnerOrange.gif
Oranger Gegner mit Schwert 19 Mal vorhanden
$Dx
WillowPattern GegnerGrau.gif
Grauer Gegner mit Schwert Im Spiel nicht verwendet
$Ex
WillowPattern GegnerHellrot.gif
Hellroter Gegner mit Schwert 20 Mal vorhanden

Wenn Chang beispielsweise im Raum mit der Nummer X das Schwert eines Gegners an sich nimmt, so wird dieser entwaffnet, indem die folgenden Maschinesprachebefehle Bit 6 seines Eintrags in dieser Tabelle löschen (CSDb: 32347):

9E8B: LDA $42C0,X
9E8E: AND #$BF
9E90: STA $42C0,X

Ein Gegner in Raum X wird als besiegt markiert, indem Bit 7 seines Eintrags gelöscht wird (CSDb: 31983):

9C8F: LDA $42C0,X
9C92: AND #$7F
9C94: STA $42C0,X
Low Nibble Bild Typ des Bonusgegenstands Wert
$x0 - Kein Bonusgegenstand -
$x8
WillowPattern BonusSchluessel.gif
Gefängnisschlüssel 5
$x9
WillowPattern BonusDrachenei.gif
Drachenei 1
$xA
WillowPattern BonusApfel.gif
Apfel 1
$xB
WillowPattern BonusMuenze.gif
Goldmünze 2
$xC
WillowPattern BonusKristall.gif
Kristall 2
$xD
WillowPattern BonusSchwert.gif
Schwert 0

Beim Einsammeln eines Bonusgegenstands in Raum X wird in dessen Eintrag Bit 3 gelöscht (CSDb: 31319):

99C1: LDA $42C0,X
99C4: AND #$F7
99C6: STA $42C0,X

Ersetzt man nun im Hauptspeicher des C64 — bei einem Emulator mit einem Debugger oder durch Nachbearbeiten eines Speicherabzugs — die Bitmaske $F7 an Adresse $99C5 durch $FF, so kann man bei jedem Betreten eines Screens den dort ursprünglich vorhandenen Bonusgegenstand erneut vorfinden und einsammeln. Der Wert der einzelnen Gegenstände findet sich in einer 6 Byte langen Liste ab Adresse $4090 (CSDb: 14009), ihre Farbe in einer ebenfalls 6 Byte langen Liste ab Adresse $4080 (CSDb: 13993). Bei Modifikationen der Werte ist darauf zu achten, dass sie als "packed BCD"-Zahlen interpretiert werden ($00...$99 entspricht einem Wert von 0%...99%).

Das nachfolgende Schaubild zeigt die initiale Bedatung der zentralen Tabelle. An den Rändern sind, wie schon bei den Karten des Labyrinths, die Koordinaten aufgetragen. Der Wert $CB in der linken oberen Ecke bedeutet also beispielsweise, dass im Screen A1 des Labyrinths ein oranger Gegner mit einem Schwert und eine Goldmünze auf Chang warten. Wie in der linken Animation am Ende des Abschnitts "Hinweise" zu sehen, ist diese Interpretation korrekt.

Bei jedem Start des Spiels wird diese Tabelle durch Umkopieren von Adresse $93C0 (CSDb: 30064) inisitalisiert.

A B C D E F G H
1 $CB $90 $C0 $C0 $C0 $9A $E0 $E0 1
2 $C0 $CC $E0 $E0 $ED $9D $CC $90 2
3 $99 $ED $EB $C8 $9D $90 $E0 $90 3
4 $E0 $EC $C0 $EA $90 $9D $EB $C0 4
5 $0D $E0 $C9 $E0 $CD $9C $ED $90 5
6 $90 $EC $CD $90 $9D $C0 $90 $90 6
7 $C0 $90 $ED $90 $90 $ED $CB $00 7
8 $90 $E0 $0D $CA $0D $C0 $E0 $C0 8
A B C D E F G H

Die genaue Position der Sprites, die die Objekte darstellen, ergibt sich — je nach Typ — aus einer Tabelle an Adresse $41C0–$41FF für die Wächter (CSDb: 14168–14231), aus einer Tabelle an $3FC0...$3FFF für die Bonusgegenstände (CSDB: 13853-13906), und aus einer Tabelle an $8C60–$8C9F für die Brücken mit den Riesen (CSDB: 28452–28465/28467). Die Adressbereiche zweier Tabellen im Programmcode des CSDb-Release sind kürzer als 64 Bytes, weil die Daten per Lauflängencodierung komprimiert sind: Eine Folge von mehr als 2 Nullbytes wird durch den Code $6C gefolgt von der Anzahl der Nullbytes dargestellt. Zudem wurden die Nullbytes am Ende der Brücken-Tabelle mit weiteren nachfolgenden Nullen zu einer gemeinsamen Codierung verschmolzen.

Statische Elemente[Bearbeiten | Quelltext bearbeiten]

Jeder Screen des Labyrinths ist in 8 Spalten und 6 Zeilen unterteilt, so er dass insgesamt Platz bietet für 48 Elemente mit einer Größe von jeweils 32x32 Pixeln. Der Aufbau aller Screens ist in einem 3 kByte großen Speicherbereich (8 x 8 Räume mit jeweils 8 x 6 Elementen) an Adresse $8000–$8BFF gespeichert, in der die Screens zeilenweise, und die Elemente jedes Screens wiederum zeilenweise aufeinander folgen.

Die nachfolgende Tabelle illustriert alle Elemente, aus denen das Labyrinth aufgebaut ist. Die Beschriftung am linken und am oberen Rand gibt dabei das High- und das Low-Nibble des Codes an, der das betreffende Element repräsentiert. Das erste Speicherzelle $8000 des beschriebenen Speicherbereichs enthält beispielsweise den Wert $2A, entsprechend der linken oberen Ecke des hellblauen Rahmens.

Die Codes $40–$4B sind für die Überquerung des Flusses in einem Extrabildschirm reserviert und werden im Labyrinth nicht verwendet.

$x0 $x1 $x2 $x3 $x4 $x5 $x6 $x7 $x8 $x9 $xA $xB $xC $xD $xE $xF
$0x
WillowPattern Element00.gif
WillowPattern Element01.gif
WillowPattern Element02.gif
WillowPattern Element03.gif
WillowPattern Element04.gif
WillowPattern Element05.gif
WillowPattern Element06.gif
WillowPattern Element07.gif
WillowPattern Element08.gif
WillowPattern Element09.gif
WillowPattern Element0A.gif
WillowPattern Element0B.gif
WillowPattern Element0C.gif
WillowPattern Element0D.gif
WillowPattern Element0E.gif
WillowPattern Element0F.gif
$1x
WillowPattern Element10.gif
WillowPattern Element11.gif
WillowPattern Element12.gif
WillowPattern Element13.gif
WillowPattern Element14.gif
WillowPattern Element15.gif
WillowPattern Element16.gif
WillowPattern Element17.gif
WillowPattern Element18.gif
WillowPattern Element19.gif
WillowPattern Element1A.gif
WillowPattern Element1B.gif
WillowPattern Element1C.gif
WillowPattern Element1D.gif
WillowPattern Element1E.gif
WillowPattern Element1F.gif
$2x
WillowPattern Element20.gif
WillowPattern Element21.gif
WillowPattern Element22.gif
WillowPattern Element23.gif
WillowPattern Element24.gif
WillowPattern Element25.gif
WillowPattern Element26.gif
WillowPattern Element27.gif
WillowPattern Element28.gif
WillowPattern Element29.gif
WillowPattern Element2A.gif
WillowPattern Element2B.gif
WillowPattern Element2C.gif
WillowPattern Element2D.gif
WillowPattern Element2E.gif
WillowPattern Element2F.gif
$3x
WillowPattern Element30.gif
WillowPattern Element31.gif
WillowPattern Element32.gif
WillowPattern Element33.gif
WillowPattern Element34.gif
WillowPattern Element35.gif
WillowPattern Element36.gif
WillowPattern Element37.gif
WillowPattern Element38.gif
WillowPattern Element39.gif
WillowPattern Element3A.gif
WillowPattern Element3B.gif
WillowPattern Element3C.gif
WillowPattern Element3D.gif
WillowPattern Element3E.gif
WillowPattern Element3F.gif
$4x
WillowPattern Element40.gif
WillowPattern Element41.gif
WillowPattern Element42.gif
WillowPattern Element43.gif
WillowPattern Element44.gif
WillowPattern Element45.gif
WillowPattern Element46.gif
WillowPattern Element47.gif
WillowPattern Element48.gif
WillowPattern Element49.gif
WillowPattern Element4A.gif
WillowPattern Element4B.gif
WillowPattern Element4C.gif
WillowPattern Element4D.gif
WillowPattern Element4E.gif
WillowPattern Element4F.gif

Im Programmcode ist diese Tabelle in komprimierter Form zu finden: Folgen von mehr als zwei Nullbytes direkt aufeinander — also das Äquivalent zu einer freien Flächen aus drei oder mehr nebeneinanderliegenden, vollkommen schwarzen Elementen —, so wird dies durch den Code $BF, gefolgt von der Anzahl der Nullbytes, codiert. Auf diese Weise sinkt der Speicherplatzbedarf von 3 kByte (3072 Bytes) auf 2586 Bytes.

Lädt man die oben erwähnte CSDb-Release 102753 von "Willow Pattern", so liegt die komprimierte Darstellung des Labyrinths im Adressbereich von 26297 bis 28882. Wer gern einmal durch einen leeren Garten spazieren möchte, in dem nur ein paar Wächter einsam ihre Schwerter schwingen, der kann nach dem Laden dieser Datei durch Eingabe von

POKE 144*256,0:POKE 44,144:NEW

Platz für ein BASIC-Programm schaffen und dann den folgenden Code eintippen und ausführen. Das Resultat ist im linken und im mittleren Bild der untenstehenden Galerie zu sehen. Und wer seinen Garten ausschließlich mit hellblau blühenden Bäumen bepflanzen möchte, ersetzt noch die "0" am Ende von Zeile 20 durch eine "1" (rechtes Bild der nachfolgenden Galerie).

10 FOR N=26297 TO 28882:V=PEEK(N):IF V=191 THEN N=N+1:NEXT
20 IF (V<22) OR (V=27) OR (V=40) OR (V=41) OR (V=55) OR (V>58) THEN POKE N,0
30 IF (V=0) OR (V=76) OR (V=77) THEN POKE N,V
40 NEXT:SYS2087


Worauf wartet die Prinzessin? Der Fluchtweg steht offen!
Ein einsamer Apfel, allein auf weiter Flur
Das Gartenlabyrinth wird zur Monokultur



Für Modifikationen des Labyrinths von Interesse sind auch noch die folgenden kurzen Codesequenzen beim Start des Spiels:

; Schiff unzugänglich machen (CSDb: 2630)
0981: LDA #$21  ; Element "Ufer mit Baum"
0983: STA $878B ; als Anlegestelle für das Schiff speichern 
0986: LDA #$4E  ; Element "Gitter"
0988: STA $878C ; Schiff unzugänglich machen
;
; Chang an Start bringen, Prinzessin einsperren (CSDb: 30189)
9450: LDA #$38  ; Nummer des Startscreen
9452: STA *$5F  ; als aktuelle Raumnummer setzen
9454: LDX #$4E  ; Element "Gitter"
9456: STX $8026 ; Gefängnis der Prinzessin wiederherstellen
; Anfangskoordinaten des Chang-Sprite an $4381/$4382 (CSDb: 14533/14534)

und die Gegenrichtung beim Auffinden des Schlüssels und beim Befreien der Prinzessin:

; Weg zum Schiff freimachen (CSDb: 3432)
0D7E: LDA #$00  ; Element "Schwarzer Hintergrund"
0D80: STA $878B ; Ufer mit Baum überschreiben/entfernen
0D82: STA $878C ; Gitter vor Schiff überschreiben/entfernen
; Prinzessin befreien (CSDb: 31300)
99AE: LDA #$00  ; Element "Schwarzer Hintergrund"
99B0: STA $8026 ; Gefängnisgitter überschreiben/entfernen
;

Sonstiges[Bearbeiten | Quelltext bearbeiten]

Die nachfolgende Tabelle stellt noch eine Reihe weiterer interessanter Speicherzellen zusammen.

Adresse Inhalt
$0024 Wächter im aktuellen Raum ist... $00=unbewaffnet, $80=bewaffnet
$0040 Verbleibende Anzahl Leben
$005F Nummer des aktuellen Screens (0="A1", ..., 63="H8")
$008E Chong ist... $00=unbewaffnet, $80=bewaffnet
$43CB/$43CC Aktueller Punktestand (packed BCD, big endian)

Die Anzahl verbleibender Leben wird im Labyrinth mittels des Befehls 9BAF: DEC *$40 (CSDb: 31774) und beim Überqueren eines Flusses durch den Befehl 0CC4: DEC *$40 (CSDb: 3291) vermindert. Ersetzt man den Opcode $C6 für "DEC zeropage" in diesen Befehlssequenzen jeweils durch $A5 für "LDA zeropage", so wird die Anzahl verbleibender Leben nicht mehr heruntergezählt.

Die folgende Zusammenstellung von POKEs präsentiert ein Beispiel eines maßgeschneiderten "Trainers" für das Spiel "Willow Pattern".

POKE 3291,165 :REM UNENDLICH VIELE LEBEN AN DER BRUECKE
POKE 31774,165 :REM UNENDLICH VIELE LEBEN IM LABYRINTH
POKE 13993+3,15: POKE 14009+3,3 :REM PLATINMUENZE IM WERT VON 3% STATT GOLDMUENZE IM WERT VON 2%
POKE 30064+7*8+0,224 :REM HELLROTER STATT GRAUER GEGNER IM STARTSCREEN "A7"
POKE 31319+4,255 :REM BONUSGEGENSTAENDE MEHRFACH EINSAMMELN
POKE 28452+13,0 :REM BRUECKE IM STARTSCREEN ENTFERNEN

Bewertung[Bearbeiten | Quelltext bearbeiten]

Bewertung der C64-Wiki-Benutzer (10=die beste Note):
6.50 Punkte bei 2 Stimmen.
Zur Stimmabgabe musst Du angemeldet sein.
ZZAP64 60% (Presentation 79%, Graphics 71%, Sound 68%, Hookability 60%, Lastability 56%, Value For Money 65%) Ausgabe 9 (Christmas & New Year 1985/1986), S. 20
Spectrum Computing 6 / 10 13. März 2022 - 4 votes
Commodore User Graphics 5/5, Sound 3/5, Toughness 3/5, Staying Power 4/5, Value 5/5 Ausgabe 28 (January 1986), S. 22-23
Your Commodore Originality 6/10, Playability 7/10, Graphics 9/10, Value for Money 8/10 Ausgabe 17 (Febuary 1986), S. 49
Computer Gamer 54% (Impact 45%, Originality 55%, Gameplay 60%, X-Factor 55%) Ausgabe 24 (March 1987), S. 54
Lemon64 7,8 13. März 2022 - 41 votes

Kritik[Bearbeiten | Quelltext bearbeiten]

Stephan64: "Eigentlich ein völlig stupides Spiel... Man rennt durch ein Labyrinth, das bei jedem Start gleich aussieht, die immer gleichen Wege entlang, massakriert ein paar komplett berechenbare Gegner, ärgert sich dabei über den Mangel an Waffen — und sackt nebenbei den Plunder ein, der überall herumliegt. Wohl wegen der wunderschönen Grafik ertappe ich mich aber trotzdem von Zeit zu Zeit dabei, dass ich das Spiel gern ein Weilchen spiele. Daher wohlwollende 6 Punkte, vor allem für die liebevolle Gestaltung des Gartenlabyrinths."


Riffislam: "Willow Pattern ist ein Spiel, bei dem ich nie zur Ruhe komme. Trotz der eigentlich simplen Gegner geht es schnell ein Leben zu verlieren. Und dann lauert noch so ein gemeiner Gegner direkt hinter einem Durchgang, so dass man keine Chance hat. Die Brücke mit den tückischen Riesen hat mir dann oft das letzte Leben gekostet. Das Spiel hat sich 7 Punkte verdient."

Sonstiges[Bearbeiten | Quelltext bearbeiten]

Cover[Bearbeiten | Quelltext bearbeiten]

Cover der Kassette zum Spiel "Willow Pattern"


Inlay[Bearbeiten | Quelltext bearbeiten]

Außenseite des Inlay zum Spiel "Willow Pattern"
Innenseite des Inlay zum Spiel "Willow Pattern".


Kassette[Bearbeiten | Quelltext bearbeiten]

Kassette zum Spiel "Willow Pattern"


Theme[Bearbeiten | Quelltext bearbeiten]

Die musikalische Untermalung besteht aus zwei kurzen Melodien. Die erste Melodie erklingt, während das Titelbild angezeigt wird, während Chang einen Fluss überquert, und wenn das rettende Schiff erreicht ist; die andere untermalt das Durchstreifen des Gartenlabyrinths. Die nachfolgende Galerie zeigt diese beiden Musikstücke in der üblichen Notenschreibweise. Sobald Chang bewaffnet ist, steigt die Wiedergabegeschwindigkeit der zweiten Melodie auf das anderthalbfache.

Für eine kreative Weiterverwendung beider Musikstücke stehen die Noten auch als PDF-Dokument (Datei:WillowPattern Theme PDF.pdf) und in der ABC-Musiknotation (Datei:WillowPattern Theme.abc.txt) zur Verfügung.


Musiknoten der Begleitmelodie zum Titelbild, zur Überquerung eines Flusses und zur erfolgreichen Flucht, rekonstruiert durch Mitprotokollieren aller Schreibzugriffe auf den SID
Musiknoten der Begleitmelodie zum Spiel



Schnelllader[Bearbeiten | Quelltext bearbeiten]

Die Kassettenversion von Willow Pattern verwendet einen integrierten Software-Schnelllader, der beim Laden automatisch aktiviert wird, den Ladevorgang aber nur etwa um den Faktor 1,7 beschleunigt. Eine detaillierte Analyse der Laderoutinen offenbart den Grund für diese eher dürftige Performance: Zum einen enthält der erste geladene Programmteil gar nicht den Schnelllader, sondern nur eine kurze Befehlssequenz, die ihrerseits dann mit Hilfe des Kernals ein 1 kByte großes Modul mit gleich zwei unabhängigen Laderoutinen nachlädt.

Zum anderen verwenden diese Laderoutinen dann zwar kürzere Codierungen für 0- und 1-Bits als der Kernal, sind aber ansonsten vor allem darauf optimiert, ihre eigene Arbeitsweise zu verschleiern und ein Rekonstruieren des Spiels durch Analyse der Banddaten zu verhindern. Hierzu gehört auch, dass die nachgeladenen Daten durch XOR-Verknüpfung mit dem Code des Schnellladers verschlüsselt sind; dadurch bestehen sie — anders als sonst üblich — zu mehr als 50% aus 1-Bits, welche wiederum durch längere Impulse codiert werden.

Beide Schnelllade-Routinen lesen eine beliebig lange Folge von Blocks zu je 256 Byte Länge vom Band und platzieren diese — nicht notwendigerweise direkt aufeinanderfolgend — im Hauptspeicher des C64. Gemeinsam ist den Routinen zudem, dass sie vor jedem Block eine erneute Synchronisierung des C64 mit dem Datenstrom vornehmen und dadurch viel Zeit und auch Platz auf der Kassette verschwenden.

Die erste Schnelllade-Routine erwartet vor jedem Block einen 7 Byte langen Header, der die Blocknummer (1 Byte), die Ladeadresse, die Endadresse der gesamten Blocksequenz und die Einsprungadresse des enthaltenen Programmteils (alle Adressen jeweils 2 Bytes im Little Endian-Format, Einsprungadresse $0000 bedeutet "Programmteil nach dem Laden nicht anspringen") enthalten. Auf diesen Header folgen 256 Datenbytes und die über diese Bytes durch XOR-Verknüpfung errechnete Prüfsumme. Die ersten Schnelllade-Routine lädt drei Programmabschnitte in die Bereiche $1F00–$47FF, $0800–$1FFF und $E000–$FFFF und übergibt dann die Kontrolle an die zweite Routine.

Diese wiederum erwartet vor jedem Block einen 4 Byte langen Header, bestehend aus dem für den nächsten Block gültigen Synchronisationskennzeichen, der Blocknummer (jeweils 1 Byte) und die Ladeadresse (2 Bytes um Little Endian-Format). In Block Nummer 0 schließen sich an diesen Header 64 Datenbytes an, ansonsten 256 Datenbytes. Anstatt die Datenstruktur nun aber mit der Prüfsumme abzuschließen, folgt nun noch ein Byte, das angibt, wie viele zusätzliche Füllbytes (zwischen 1 und 31 Bytes) folgen, die lediglich überlesen und ignoriert werden. Allein schon dieser Ballast erhöht das Datenvolumen bei 120 Blocks und einer durchschnittlichen Anzahl von etwas mehr als 15 Füllbytes pro Block um insgesamt 1928 Bytes. Auf die sich anschließende Prüfsumme folgt noch eine Adresse, die nach dem Laden des Blocks angesprungen wird und meist auf den Schnelllader selbst zeigt. Viele der hier beschriebenen Datenelemente sollen wohl nur dem Zweck dienen, eine Rekonstruktion der Programmdaten zu erschweren.

Ein wahres Meisterwerk der Verschleierung enthält schließlich der letzte Datenblock: Er ist zum größten Teil noch verschlüsselt und muss sich daher durch byteweise XOR-Verknüpfung mit der zweiten Schnelllader-Routine zunächst selbst decodieren. Anschließend verschiebt und entschlüsselt er durch mehrfache XOR-Verknüpfung die geladenen Programmdaten, basierend auf 4 noch vom Band nachgeladenen Adressen (zu je 2 Byte, Little Endian-Format). Zuletzt wird endlich das Spiel gestartet, indem eine Befehlssequenz den BRK-Vektor auf den Einsprungpunkt des Spiels umbiegt und sich dann selbst mit Nullbytes — dem Opcode des BRK-Befehls — überschreibt.

Die genaue Funktionsweise dieses Schnellladers ist aus dem kommentierten Assemblerlisting ersichtlich.

Highscore[Bearbeiten | Quelltext bearbeiten]

Topscore von Riffislam
  1. Riffislam - 77% (03.04.2022)
  2. Stephan64 - 74% (17.03.2022)
  3. Ivanpaduano - 32% (17.03.2022)


2. Platz von Stephan64 3. Platz von Ivanpaduano
2. Platz von Stephan64 3. Platz von Ivanpaduano


Weblinks[Bearbeiten | Quelltext bearbeiten]


Videos