HOWTO: Erstellen einer Patience

Teil 1: Das Grundgerüst

1. Schritt: Überlegungen zur Patience

Bevor die Arbeit an der XML-Spieledatei losgehen kann, sollten Sie sich über die Regeln und Abläufe in der von Ihnen gewählten Patience im Klaren sein. Wenn Sie selbst eine neue Patience entwickeln wollen, können Sie natürlich experimentieren. Dennoch werden Sie einige Grundfragen im Vornherein klären:

Ich möchte an dieser Stelle eine Patience erstellen, die weitgehend bekannt ist. Bei "Canfield" wird ein einfaches Kartenset mit 52 Karten verwendet. Es gibt vier Grundkartenstapel, wobei zu Beginn auf den ersten bereits eine Karte gelegt wird. Desweiteren gibt es vier Arbeitsstapel und eine Reserve. 13 Karten kommen verdeckt (die letzte offen) auf die Reserve, die automatisch freiwerdende Arbeitsstapel auffüllt. Der Stock legt je drei Karten auf den Abwurf.

Die optimale Positionierung der Felder und damit zusammenhängend die Gesamtgröße des Fensters kann einerseits durch Probieren bestimmt und jederzeit verändert werden, andererseits ist sie bereits zu Beginn der Testphase wichtig, da ohne sie keine Felder angezeigt werden. Ich verwende dazu bereits abgestimmte Werte und erhalte folgendes Grundgerüst:

<spiel name="Canfield" fenster="47x36" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="patfinder.xsd">
  <programm>140417</programm>
  <version>140417</version>
  <karten>52</karten>
  <feld id="stock" x="2" y="2" typ="stock">
  </feld>
  <feld id="abwurf" x="8" y="2" typ="abwurf">
  </feld>
  <feld id="g1" x="45" y="10" typ="grund">
  </feld>
  <feld id="g2" x="45" y="18" typ="grund">
  </feld>
  <feld id="g3" x="45" y="26" typ="grund">
  </feld>
  <feld id="g4" x="45" y="34" typ="grund">
  </feld>
  <feld id="r" x="2" y="10" typ="reserve">
  </feld>
  <feld id="h1" x="22" y="10" typ="stapel">
  </feld>
  <feld id="h2" x="27" y="10" typ="stapel">
  </feld>
  <feld id="h3" x="32" y="10" typ="stapel">
  </feld>
  <feld id="h4" x="37" y="10" typ="stapel">
  </feld>
</spiel>

Ich bezeichne die Version nach dem Erstellungsdatum, da ich hier am besten sehe, wie aktuell die Datei ist. Die Programmversion dagegen entscheidet, ab welcher Revisionsnummer von patwork Ihre Patience ausführbar ist – im Zweifelsfall verwenden Sie den Wert, der innerhalb des Programms angezeigt wird (zum Zeitpunkt der Erstellung dieses Dokuments ist die aktuelle patwork-Version 3.0.220808; die Angabe wäre dann <programm>220808</programm>). Dass im obigen Beispiel Programm-Version und Patiencen-Version identisch sind, ist mehr oder weniger Zufall; die Revision 140417 unterstützt erstmalig die Verwendung von Vorlagen (dazu später mehr).

Feld-IDs kürze ich nach Typ und eine eventuell folgende Nummerierung. Natürlich können Sie hier nach Ihren eigenen Vorlieben handeln.

2. Schritt: Interaktion zwischen den Feldern

a) Analyse der notwendigen Interaktionen

Auf dem Stapel g1 liegt zu Beginn eine Karte des Zufallswertes. Diese wird durch das lege-Tag hinzugefügt. Auch auf den Stapeln h1 bis h4 liegt je eine Karte; auf r liegen 12 verdeckte und eine offene. Damit der Spieler die Karten sehen kann, ist noch eine Angabe nötig, in welche Richtung die Karten des Stapels aufgefächert werden sollen. Dazu dient das Tag richtung. Wird er ausgelassen, dann liegen die Karten aufeinander; es ist dann also immer nur die oberste Karte sichtbar.

Beim Kartenlegen gibt es zwei Besonderheiten: der stock legt drei Karten auf den abwurf, und h1 bis h4 werden durch r aufgefüllt. Der Stock kann beliebig oft gegeben werden. In der XML-Datei - ich kürze hier ähnliche oder nicht relevante Teile heraus - sieht das dann so aus:

<spiel name="Canfield" fenster="47x36">
...
  <feld id="stock" x="2" y="2" typ="stock">
    <ziel>abwurf</ziel>
    <ziel>abwurf</ziel>
    <ziel>abwurf</ziel>
    <wiederholung>frei</wiederholung>
    <quelle>abwurf</quelle>
    <sicht>verdeckt</sicht>
  </feld>
  <feld id="abwurf" x="8" y="2" typ="abwurf">
  </feld>
  <feld id="g1" x="45" y="10" typ="grund">
    <richtung>stapel</richtung<
    <lege typ="offen" quelle="stock">zufallswert</lege>
  </feld>
...
  <feld id="r" x="2" y="10" typ="reserve">
    <richtung>rechts</richtung<
    <lege typ="verdeckt" quelle="stock" anz="12">frei</lege>
    <lege typ="offen" quelle="stock">frei</lege>
  </feld>
  <feld id="h1" x="22" y="10" typ="stapel">
    <richtung>unten</richtung<
    <fuellen>r</fuellen>
    <lege typ="offen" quelle="stock">frei</lege>
  </feld>
...
</spiel>

Die dreimalige Erwähnung von abwurf als Ziel von stapel stellt sicher, dass stets drei Karten gegeben werden. Das sicht-Tag wurde deshalb schon hinzugefügt, weil die Definition von stapel damit bereits komplett ist.

h1 (und natürlich auch h2, h3 und h4) enthält das Tag fuellen. Dieses bewirkt, dass das Feld h1 immer dann, wenn es leer wird, eine Karte von r erhät, solange dort noch Karten vorrätig sind.

b) Verwendung von Vorlagen

Spätestens jetzt wird klar, dass sich viele Angaben mehrmals wiederholen. Die Felder h1 bis h4 enthalten – bis auf ihre Position – vollkommen identische Angaben. Das Gleiche gilt, insbesondere später, für g1 bis g4, wenn man vom lege-Tag absieht, der nur in g1 verwendet werden soll.

Es empfiehlt sich also die Verwendung von Vorlagen. Zum einen spart man dadurch Schreib- bzw. Kopierarbeit (und damit auch Kopierfehler), zum anderen können Änderungen viel leichter an einer zentralen Stelle vorgenommen werden als an verschiedenen Stellen gleichzeitig. Zusammen mit den Vorlagen erhalten wir folgendes Zwischenergebnis:

<spiel name="Canfield" fenster="47x36" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="patfinder.xsd">
  <programm>140417</programm>
  <version>140417</version>
  <karten>52</karten>
  <vorlage id="standardgrund" typ="grund">
    <richtung>stapel</richtung>
  </vorlage>
  <vorlage id="normal" typ="hilf">
    <richtung>unten</richtung>
    <fuellen>r</fuellen>
    <lege typ="offen" quelle="stock">frei</lege>
  </vorlage>

  <feld id="stock" x="2" y="2" typ="stock"></feld>
  <feld id="abwurf" x="8" y="2" typ="abwurf">
  </feld>
  <feld id="g1" x="45" y="10" typ="standardgrund">
    <lege typ="offen" quelle="stock">zufallswert</lege>
  </feld>
  <feld id="g2" x="45" y="18" typ="standardgrund"></feld>
  <feld id="g3" x="45" y="26" typ="standardgrund"></feld>
  <feld id="g4" x="45" y="34" typ="standardgrund"></feld>
  <feld id="r" x="2" y="10" typ="reserve">
  </feld>
  <feld id="h1" x="22" y="10" typ="normal"></feld>
  <feld id="h2" x="27" y="10" typ="normal"></feld>
  <feld id="h3" x="32" y="10" typ="normal"></feld>
  <feld id="h4" x="37" y="10" typ="normal"></feld>
</spiel>

Die Vorlage für die Grundkartenstapel ist im Moment noch nicht sehr effektiv, insbesondere da die Stapelung aller Karten aufeinander sowieso das Standardverhalten ist. Das wird sich aber gleich ändern.

3. Schritt: Legemöglichkeiten des Benutzers

Auf die Felder h1 bis h4 kann in wechselnden Farben abwärts gelegt werden, wobei das Ass die letzte Karte ist, d. h. es ist nicht möglich, auf ein Ass einen König zu legen. Ein leeres Feld kann (sobald die Reserve aufgebraucht ist) mit einer beliebigen Karte oder Reihe belegt werden. Die Grundkartenstapel g1 bis g4 dagegen werden gleichfarbig in aufsteigende Richtung aufgebaut. Sie können nur mit der durch den Zufallswert festgelegten Karte beginnen.

Für beide Feldergruppen gibt es eine maximale Anzahl an Karten, über die hinaus nichts mehr auf die Felder gelegt werden kann. In unserem Fall sind die Werte so hoch gewählt, dass sie keine Einschränkung für den Spieler darstellen; die Angabe ist dennoch nötig, da sonst keine Ablage möglich ist.

Sowohl auf den Abwurf als auch auf den Reservekartenstapel kann der Spieler keine Karten ablegen. Daher werden hier keine Legereihenfolgen festgelegt. Es bleiben damit zunächst nur die beiden Vorlagen zu ändern.

...
  <vorlage id="standardgrund" typ="grund">
    <max>13</max>
    <richtung>stapel</richtung>
    <folgestart>zufallswert</folgestart>
    <folgefarbe>gleich</folgefarbe>
    <folgewert>auf</folgewert>
  </vorlage>
  <vorlage id="normal" typ="hilf">
    <max>27</max>
    <eng>14</eng>
    <richtung>unten</richtung>
    <folgestart>frei</folgestart>
    <folgefarbe>wechsel</folgefarbe>
    <folgewert>ab</folgewert>
    <fuellen>r</fuellen>
    <lege typ="offen" quelle="stock">frei</lege>
  </vorlage>
...

Auf den Hilfskartenstapeln können bis zu 27 Karten liegen – der Stapel kann damit sehr viel Platz in Anspruch nehmen. Mit dem Tag eng werden die Karten ab einer bestimmten Anzahl zusammengestaucht dargestellt, um Platz zu sparen.

Beachten Sie an dieser Stelle: Wenn auf einem Feld mehr Karten zu liegen kommen, als in die Anzeige-Richtung dargestellt werden können, ist es dem Benutzer nicht mehr möglich, die oberste Karte aufzunehmen. Behalten Sie auch solche Extremfälle im Auge! Gegebenenfalls können Sie zusätzlich mit dem Tag sichtbar arbeiten, um die oberste Karte erreichbar zu halten.

4. Schritt: Punktewertung

Bei "Canfield" gibt es eine sehr einfache Punktewertung: Jede Karte auf einem der vier Grundkartenstapel gibt einen Punkt. Um das Legen auf einen Grundkartenstapel zu vereinfachen, werden wir außerdem das auto-Tag verwenden. Wird eine Karte mit einem Rechtsklick ausgewählt, dann prüft das Programm, ob sie auf einen mit auto markierten Stapel gelegt werden kann. Dies wird auch beim automatischen Legen (Taste 'a') verwendet.

...
  <vorlage id="standardgrund" typ="grund">
    <max>13</max>
    <richtung>stapel</richtung>
    <folgestart>zufallswert</folgestart>
    <folgefarbe>gleich</folgefarbe>
    <folgewert>auf</folgewert>
    <auto>ja</auto>
    <punkte>1</punkte>
  </vorlage>
...

Ein solches einfaches Verfahren wird bei einer Vielzahl von Patiencen benötigt. Bei Patiencen ohne Grundkartenstapel, bei denen alle Karten auf dem Tisch bleiben und dort zu Familien zusammengestellt werden sollen, müssen ausgefeiltere Punktesysteme verwendet werden. So können Punkte z. B. auch nur dann gezählt werden, wenn das Feld eine durchgängige Folge beinhaltet, oder es gibt Punkte, wenn sich auf einem Feld keine Karten befinden; hier gibt es zahlreiche Variationsmöglichkeiten. Felder können auch mit Minuspunkten belegt werden, sodass es einen Punkt für jede Karte gibt, die vom Stapel entfernt wird. Damit ist es sogar möglich, im Laufe des Spieles eine negative Punktzahl zu erreichen – beachten Sie jedoch, dass das Programm dem Patiencenmanager nie weniger als 0 Punkte zurückgeben wird.

5. Schritt: Regelvarianten

Die Bereitstellung von Regelvarianten ist natürlich ein Extra, das in einer Patience nicht vorkommen muss. Vermutlich wird man sich zunächst auf eine einzige Grundfassung beschränken und gegebenenfalls erst später eine Erweiterung um eine Variante in Betracht ziehen. Andererseits lassen sich die Varianten (sofern sie nicht zu ausgefallen sind) für gewöhnlich leicht in eine bereits bestehende Patience einbauen.

Für "Canfield" existieren zwei offizielle Regelvarianten. In der ersten Version legt ein Klick auf den Stock drei Karten auf den Abwurf, der Stock kann beliebig oft gegeben werden. Alternativ dazu kann vom Stock auch immer nur eine Karte gegeben werden; dann jedoch wird der Stock nur ein einziges Mal gegeben. Diese Regelvarianten werden zunächst festgelegt:

<spiel name="Canfield" fenster="47x36" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="patfinder.xsd">
  <programm>090818</programm>
  <version>090818</version>
  <bemerkung>(hier steht die zusätzliche Bemerkung zum Spiel)</bemerkung>
  <anleitung>(hier steht die Spielanleitung)</anleitung>
  <regelwerk>
    <regel id="3aufdeck">je drei Karten geben; Talon kann wieder aufgenommen werden</regel>
    <regel id="1aufdeck">je eine Karten geben; Talon wird nicht wieder aufgenommen</regel>
  </regelwerk>
...
</spiel>

Die Regelvarianten kommen an zwei Stellen zur Geltung: beim Geben vom Stock und bei der Festlegung der Wiederholungen. Beide Angaben beziehen sich auf den Stock, also muss nur dieser verändert werden.

...
  <feld id="stock" x="2" y="2" typ="stock">
    <ziel>abwurf</ziel>
    <regel id="3aufdeck">
      <ziel>abwurf</ziel>
      <ziel>abwurf</ziel>
      <wiederholung>frei</wiederholung>
    </regel>
    <regel id="einfach">
      <wiederholung>1</wiederholung>
    </regel>
    <quelle>abwurf</quelle>
    <sicht>verdeckt</sicht>
  </feld>
...

Von der Umsetzung her eng mit den Regelvarianten verwandt ist das Levelsystem. Der entscheidende Unterschied ist, dass die Regelvariante vom Benutzer selbst festgelegt wird, während sich das Level automatisch durch Spielgewinne und -verluste anpasst.

Schlussbemerkung

Gegebenenfall können jetzt noch ein paar optische Anpassungen vorgenommen werden, wie die Anzeige der Anzahl noch verbleibender Karten im Stock oder ähnliches. Ansonsten ist die Patience aber fertig und spielbereit. Allerdings: Auch wenn die verfügbaren XML-Tags eine große Fülle an Möglichkeiten bieten, decken sie doch nur die grundlegenden Mechaniken ab. Viele Patiencen warten dagegen mit sehr speziellen Regeln auf, die auf anderem Weg umgesetzt werden müssen. Zu diesem Zweck stehen Aktionen zur Verfügung, die im nächsten Teil angegangen werden.