Aufbau der XML-Spieldateien
(Versionsstand 10.10.2024)
Wichtiger Hinweis vorneweg: Aktualität der Daten
Die hier behandelten Tags beziehen sich auf die Programmversion, die zum Zeitpunkt der Veröffentlichung dieses Dokuments aktuell war. Dieses Dokument wird nach Möglichkeit auf dem neusten Stand gehalten; dennoch kann es vorkommen, dass einige bereits umgesetzten Tags oder Attribute hier nicht aufgelistet werden.
Umgekehrt wird eine Programmversion erst dann für die Öffentlichkeit freigegeben, wenn sie stabil zu laufen scheint. Daher sind möglicherweise einige hier aufgeführten Tags in der aktuell im Netz erhältlichen Programmversion noch nicht umgesetzt. Orientieren Sie sich dazu bitte an der Version dieses Dokumentes, die dem Download-Paket beigelegt ist. Dieses passt stets zu der Version des Programmes (wie üblich ohne Garantie auf Vollständigkeit und Korrektheit).
Allgemeines zu den Bezeichnungen
Die Formulierung der Spieldateien muss ganz strikt case (und sonstiges) sensitive erfolgen. Fast alles wird komplett klein geschrieben; Spielkartenangaben (Farbe, Wert) beginnen mit einem Großbuchstaben. Die in den id-Attributen festgelegten Namen können selbstverständlich auch Großbuchstaben enthalten, jedoch wird der Name auch hier case sensitive behandelt.
Überflüssige Leerzeichen sind (meist) nicht erlaubt. Z. B. darf sich zwischen Attributnamen, Gleichheitszeichen und Anführungszeichen kein Leerzeichen befinden, bei der Angabe der Fenstergröße darf zwischen den Zahlen und dem x kein Leerzeichen stehen usw.
Die Inhalte der Attribute dürfen keine XML-Sonderzeichen, insb. Spitzklammern oder gar Tags enthalten. Der Grund liegt im sehr einfach gebauten handgestrickten XML-Parser.
Es gibt außerdem keine Abfangroutine für fehlerhafte XML-Dateien! Eine fehlerhafte Spieldatei kann im schlimmsten Fall dazu führen, dass sich das Programm aufhängt und gewaltsam beendet werden muss.
ID-Angaben
Für
Regelvarianten und
Felder sowie optional auch für
Aktionen ist die Angabe eines
id-Attributs erforderlich. Die ID eines Feldes muss nicht eindeutig sein; manchmal ist es einfacher, mehreren Feldern dieselbe ID zuzuweisen und sie dadurch gemeinsam ansprechen zu können. Verschiedene Regelvarianten sollten dagegen sinnvollerweise keine gemeinsame ID besitzen, ebenso wie verschiedene Aktionen keine gemeinsame ID erhalten sollten. Die Eindeutigkeit wird vom Programm zwar nicht überprüft, jedoch können die entsprechenden Elemente sonst nicht korrekt angesprochen werden.
Eine ID darf aus Groß- und Kleinbuchstaben sowie Ziffern bestehen, andere Zeichen (einschließlich Umlaute, Unterstriche und Leerzeichen) sind nicht erlaubt.
Viele Tags erlauben die Interaktion mit anderen Feldern, indem eine Liste von Feld-IDs angegeben wird. Dazu werden die IDs nacheinander durch Leerzeichen getrennt aufgeführt. Dies ist der Grund dafür, dass Leerzeichen innerhalb einer ID nicht erlaubt sind. Auch andere Zeichen wie
@
und
#
haben eine besondere Bedeutung (mehr dazu unter
Besondere Felder und
Beziehungen zwischen Feldern).
Angaben von Kartenfarben und -werten
An verschiedenen Stellen sind Angaben zu einer Karte möglich, z. B. wenn ein Feld nur von bestimmten Karten belegt werden darf. Die Karte wird folgendermaßen angegeben:
- Die Bezeichnungen beginnen mit einem Großbuchstaben.
- Die Farbangaben lauten Karo, Herz, Pik bzw. Kreuz, die Wertangaben 2, 3 ... 10, B, D, K bzw. A. Es kann entweder nur die Angabe einer Farbe, nur die Angabe eines Wertes oder die Kombination Farbe+Leerzeichen+Wert (z. B. Karo A) erfolgen.
- Außerdem sind die Angaben zufallsfarbe und zufallswert möglich. Zu Beginn des Spieles werden eine zufällige Farbe und ein zufälliger Wert bestimmt, welche durch diese Angaben eingebaut werden können. Als weitere Angaben ist auch z. B. zufallswert+1 oder zufallswert-4 erlaubt, allerdings nur mit Zahlen von 1 bis 9. Der verwendete Kartenwert liegt dann entsprechend höher oder niedriger als der Zufallswert.
Warnung: zufallswert funktioniert auch bei einem 32- oder 64-Kartenblatt, allerdings wird dort die Verwendung von zufallswert+1 (o. ä.) mit gewisser Wahrscheinlichkeit zu einem Fehler führen.
Spielprinzipien
Grundaufbau
Die Dateien werden vom Tag <spiel>...</spiel> umschlossen. Dieser enthält die beiden Attribute
- name: Name des Spieles
- fenster: Fensterauflösung. Dabei handelt es sich um die Anzahl der möglichen Feldpositionen in x- bzw. y-Richtung. Die Angabe "30x18" bedeutet, dass im Spiel die Felder (0, 0) bis (30, 18) verwendet werden können. Das angezeigte Fenster (Innenbereich) ist in der kleinsten Auflösung x*10+40 Pixel breit und y*10+80 Pixel hoch. (Hierbei handelt es sich um die Mindestgröße, die vom Spieler durch die Wahl eines größeren Kartenbildes geändert werden kann.)
Die maximal mögliche Auflösung ist 120x60, die minimale 32x20.
Das
spiel-Tag kann/muss folgende Unter-Tags beinhalten:
- programm (zwingend): benötigte Mindestanforderung (INTEGER-Zahlenwert) an die Programmversion zum Spiel der Patience. Die Programmversionenen werden nach Erscheinungsdatum vergeben und folgen dem Format YYMMDD.
<programm>100227</programm>
- version (zwingend): Versionsnummer der Patience als INTEGER-Zahlenwert.
<version>100227</version>
- regelwerk (optional): Definition verschiedener Regeln, die dann später eingesetzt werden können (siehe Regelvarianten)
<regelwerk>
<regel id="regel1">Anleitung zu Regel 1</regel>
<regel id="regel2">Anleitung zu Regel 2</regel>
</regelwerk>
- regel (optional): der Inhalt ist nur von Bedeutung, wenn die entsprechende Regel angewandt wird, ansonsten wird er ignoriert. Der regelwerk-Tag muss zwingend vorausgehen.
<regel id="regel1">>
<!-- Hier stehen beliebige, im Kontext erlaubte Anweisungen -->
</regel>
- levelmax (optional): Höchste Levelstufe, auf dem die Patience gespielt werden kann. Die Levelstufe kann von 0 bis zum hier angegebenen Wert reichen. Wird levelmax nicht angegeben, dann wird patfinder die Patience immer in der Levelstufe 0 aufrufen.
<levelmax>5</levelmax>
- level (optional): Der Inhalt ist nur von Bedeutung, wenn das Spiel im entsprechenden Level gespielt wird. ab gibt das mindestens benötigte Level an, bis das höchste. Beide Attribute sind optional, mindestens eines davon muss aber auftreten.
<level ab="2" bis="5">
<!-- Hier stehen beliebige, im Kontext erlaubte Anweisungen -->
</level>
- karten (zwingend): Anzahl der Spielkarten. Möglich sind die Werte 32 und 52 sowie das Doppelte, Dreifache oder Vierfache dieser Werte. Mit einem Vielfachen von 32 wird ein Kartenset mit den Werten 7 bis Ass definieren, mit einem Vielfachen von 52 ein Kartenset mit den Werten 2 bis Ass. Die Anzahl kann entweder als direkter Wert angegeben werden (z. B.
<karten>104</karten>
) oder mit einer 32 bzw. 52 direkt gefolgt von einem x und dem gewünschten Vielfachen (z. B. <karten>52x2</karten>
).
32x0 und 52x0 definiert ein leeres Kartenset; alle nötigen Karten müssen anschließend von Hand hinzugefügt werden.
Bei geradzahligen Vielfachen, also bei 64, 104, 128 und 208 Karten, erhält die Hälfte der Karten automatisch die alternative zweite Rückseite, sofern der Spieler eine Kartenrückseite mit zwei Alternativen ausgewählt hat.
Beachten Sie, dass bei einem Set mit 32 Karten die Werte Ass und 7 nicht aufeinander folgen. Wollen Sie es ermöglichen, dass der Spieler eine 7 auf eine Ass legen kann, dann müssen Sie dies z. B. durch Aktionen verwirklichen; siehe dazu Automatisierte Spielzüge, Beispiel 4.
- add, sub (optional): Hinzufügen weiterer Karten bzw. Entfernen von Karten aus dem bestehenden Kartenset. Der karten-Tag muss zwingend vorangehen. Näheres siehe Hinzufügen und Entfernen von Karten
- punktemax, punktestart (optional): gibt die Anzahl der maximal im Spiel erreichbaren Punkte bzw. die Punktzahl zu Beginn des Spieles an. Näheres siehe Punktesystem.
- markiere (optional): Die vorderste Karte eines Stapels wird unter bestimmten Voraussetzungen markiert.
<markiere farbe="ffa500">stopp</markiere>
Das optionale Attribut farbe gibt die Markierungsfarbe im Hexadezimalwert an; wird es weggelassen, dann wird die Standardfarbe verwendet. Die Angabe ffffff (weiß) deaktivert die Markierung (standardmäßig ist jedoch nur die Markierung stopp aktiviert). Das Tag kann folgenden Inhalt haben:
- stopp: Markierung für Felder, bei denen eine Stopp-Bedingung vorliegt (siehe Weitere Tags für alle Felder); Standard cc0000 (dunkelrot)
- korrekt: Stapel, die mit der richtigen, also der vorgeschriebenen Karte beginnen; Standard 008800 (dunkelgrün)
- feld (mehrfach): Festlegen eines Kartenfeldes. Hierbei kann es sich um den Kartenstock, einen Grundkartenstapel, einen Kellerplatz oder vieles anderes handeln. Siehe Hinzufügen von Vorlagen und Feldern.
- aktion und abschluss (mehrfach): Definition eines automatisierten Spielzuges, der über das reguläre Legen hinausgeht.
Es wird dringend empfohlen, bei den Tags die oben angegebene Reihenfolge einzuhalten. Der
regel-Tag fällt dabei aus der Reihe, weil er immer an den Stellen eingesetzt werden muss, an denen er gebraucht wird.
Erstellen von Regelvarianten (regelwerk, regel)
Um verschiedene Regeln eines Spieles zu ermöglichen, muss zuerst das Regelwerk definiert werden. Das Regelwerk enthält eine Anzahl von regel-Tags. Diese wiederum besitzen das Attribut id (eindeutiger Bezeichner der Regelvariante) sowie als Inhalt einen beschreibenden Text.
Bei Spielstart wird eine Liste der vorhandenen Regelvarianten erstellt; hier wird der beschreibende Text jeder Variante angezeigt. Der Spieler wählt dann eine der Varianten aus.
Die Regelvariante wird eingesetzt, indem die zur Variante gehörenden Anweisungen von einem regel-Tag mit der entspechenden id umschlossen werden. Ein ausführliches Beispiel folgt im Kapitel "Hinzufügen und Entfernen von Karten".
Es können maximal neun Regelvarianten definiert werden. Weitere Varianten werden ignoriert.
Hinzufügen und Entfernen von Karten (add, sub)
Soll nicht ein Standard-Kartenset verwendet werden, dann müssen die fehlenden bzw. überflüssigen Karten per Hand hinzugefügt bzw. entfernt werden. Das Tag karten muss bereits zuvor ein Kartenset festgelegt haben. Die von add hinzugefügten Karten hängen unter Umständen vom gewählten Kartenset ab.
- Das zwingende Attribut typ kann die Werte einzel (einzelne Karte) oder familie (Farbfamilie oder Vierergruppe desselben Wertes) annehmen. Eine Farbfamilie besteht bei einem Set mit 52 Karten (oder einem Vielfachen davon) aus den Werten 2 bis Ass der angegebenen Farbe; bei einem Set mit 32 Karten (oder einem Vielfachen davon) besteht sie aus den Werten 7 bis Ass der angegebenen Farbe.
- Das optionale Attribut rueckseite enthält den Wert 1 oder 2 und gibt die Kartenrückseite an (sofern zwei verschiedene Rückseiten zur Verfügung stehen). Wird das Attribut ausgelassen, dann fügt add Karten mit der ersten Rückseite hinzu und sub entfernt die angegebenen Karten unabhängig von der Rückseite.
Auch wenn das Hinzufügen einer Farbfamilie vom Kartenset abhängt, ist es dennoch möglich, in ein Set mit 32 Karten auch Werte einzufügen, die eigentlich nicht zum Set gehören. Wenn Sie z. B. 36 Karten mit den Werte 6 bis Ass benötigen, dann können Sie entweder aus einem 52er-Set die Werte 2, 3, 4 und 5 entfernen oder zu einem 32er-Set eine Gruppe mit dem Wert 6 hinzufügen.
Beispiel: Hinzufügen einer Familie in Herz, Entfernen einer Damen-Gruppe und einer Pik 10
<add typ="familie">Herz</add>
<sub typ="familie">D</sub>
<sub typ="einzel">Pik 10</sub>
Beispiel: Spinne in zwei Regelvarianten (vier Farben bzw. zwei Farben)
Die Hälfte der hinzugefügten Karten sollen die zweite Kartenrückseite zeigen.
<regelwerk>
<regel id="4farben">Spielvariante mit vier verschiedenen Farben</regel>
<regel id="2farben">Spielvariante mit zwei verschiedenen Farben</regel>
</regelwerk>
<karten>104</karten>
<regel id="2farben">
<sub typ="familie">Karo</sub>
<sub typ="familie">Karo</sub>
<sub typ="familie">Kreuz</sub>
<sub typ="familie">Kreuz</sub>
<add typ="familie">Herz</add>
<add typ="familie" rueckseite="2">Herz</add>
<add typ="familie">Pik</add>
<add typ="familie" rueckseite="2">Pik</add>
</regel>
Ein Kartenset kann maximal 208 Karten enthalten; sollen zu viele Karten hinzugefügt werden, so wird diese Anweisung ignoriert. Ebenso wird das Entfernen von Karten ignoriert, die sich nicht (mehr) im Kartenset befinden.
Verwendung von Jokern
Zusätzlich zu den allgemeinen Kartenwerten kann auch ein Joker in das Spiel eingefügt werden. Ein Joker kann später jeden beliebigen Kartenwert annehmen, hält sich aber ansonsten an die Legefolgen (so ist etwa in einer Abwärtsfolge die Reihenfolge K-D-Joker-10-9 möglich, die Reihenfolge K-D-Joker-4-3 dagegen nicht). Das Umlegen eines einzelnen Jokers ist damit immer möglich, wenn überhaupt umgelegt werden kann; der Joker passt ggf. seinen Wert an die neue Situation an. Das Umlegen einer Folge ist dagegen nur dann erlaubt, wenn sich ein passender Joker-Wert finden lässt, für den die neu entstehende Folge eine sinnvolle Reihenfolge bildet.
Jede Joker-Karte, die verwendet werden soll, muss einzeln mithilfe von add eingefügt werden. Das Attribut typ wird dabei ignoriert. Das Entfernen von Jokern mithilfe von sub ist nicht möglich.
Beispiel: Kartenspiel mit 2x52 Karten und 4 Jokern
<karten>52x2</karten>
<add typ="einzel">Joker</add>
<add typ="einzel">Joker</add>
<add typ="einzel" rueckseite="2">Joker</add>
<add typ="einzel" rueckseite="2">Joker</add>
Achtung: Joker können zur Zeit nicht mit Feldern eingesetzt werden, die ein gleichzeitiges Auf- und Abbauen erlauben! Alle anderen Legefolgen werden unterstützt.
Punktesystem (punktemax, punktestart)
Das Punktesystem ermöglicht die Erstellung von Statistiken zum Spiel und gibt dem Spieler eine Rückmeldung über seine Spielleistung. Am Ende jedes Spieles wird die erzielte Punktzahl an das Verwaltungsprogramm patfinder zurückgegeben (natürlich nur, wenn es von diesem gestartet wurde).
Außerdem ist das Punktesystem erforderlich, wenn das Spiel automatisch feststellen soll, dass es gewonnen wurde. Das Tag punktemax legt fest, wie viele Punkte im Spiel maximal erreicht werden können. Sobald der Spieler diese Punktezahl erreicht oder überschreitet, gibt das Spiel eine Sieg-Meldung zurück. Wird das Spiel beendet, ohne dass die erforderliche Punktzahl erzielt wurde, dann gibt das Spiel eine Verlust-Meldung zurück. Fehlt das Tag punktemax, dann wird kein Punktesystem verwendet, und das Spiel kann nicht erkennen, wann es gewonnen wurde.
Unter Umständen soll das Spiel nicht mit 0 Punkten starten. In diesem Fall kann die Startpunktzahl mit dem Tag punktestart festgelegt werden. Auch negative Startwerte sind möglich. Beachten Sie aber, dass bei Spielende immer mindestens die Punktzahl 0 zurückgegeben wird – während spielintern auch negative Punktzahlen erlaubt sind, arbeitet das Verwaltungsprogramm nie mit negativen Werten.
Auf welche Aktionen es wie viele Punkte gibt, wird durch den punkte-Tag in der Feld-Definition festgelegt; siehe dazu Tag zur Punktevergabe. Möglich ist z. B. eine Punktevergabe für das Spielen von Karten auf bestimmte Stapel (üblicherweise die Grundkartenstapel) oder auch für das Leeren eines Stapels durch Vergabe von Negativpunkten. Für jedes Feld sind mehrere Punkteangaben erlaubt. So kann z. B. auch ein Punkt für jede Karte und ein zusätzlicher Punkt für den komplett gefüllten Stapel vergeben werden.
Felder und Aktionen
Einen der wichtigsten Bereiche nehmen die Kartenfelder ein. Ein Kartenfeld ist ein Platz, an den ein Kartenstapel gelegt werden kann. Die Regeln, unter welchen Voraussetzungen welche Karten wohin gelegt werden können, werden detailiert in der Spieledatei festgelegt. Die häufigsten Legeregeln können direkt bei der Definition eines neuen Kartenfeldes angegeben werden. Komplexere Regeln werden durch automatisierte Spielzüge (Aktionen) festgelegt. Da beide Tags sehr umfangreiche Möglichkeiten bieten, werden sie in eigenen Abschnitten erläutert.
Hinzufügen von Vorlagen und Feldern (vorlage, feld)
Mit dem Tag
vorlage kann eine Feldvorlage erstellt werden. Das Tag
feld stellt ein Kartenfeld zur Verfügung. Beide Tags enthalten folgende Attribute:
<vorlage id="vorlagenname" typ="vorlage" kuerzel="k">
<!-- weitere Angaben zur Vorlage -->
</feld>
<feld id="feldname" x="32" y="6" typ="vorlage" kuerzel="k">
<!-- weitere Angaben zum Feld -->
</feld>
Bis auf
kuerzel sind alle Attribute zwingend.
- id: Name zur Identifikation. Der Name einer Vorlage muss eindeutig sein, da sie ansonsten nicht korrekt angesprochen werden kann. Der Name eines Feldes muss dagegen nicht eindeutig sein. Wird eine Feld-ID mehrfach vergeben, dann wirken sich manche Vorgänge auf alle Felder derselben ID aus, manche nur auf das erste Feld mit dieser ID.
Ein ID-Name darf nur Groß- und Kleinbuchstaben a-z sowie Ziffern 0-9 und insbesondere keine Leerzeichen enthalten. Einige Begriffe sind reserviert und können nicht verwendet werden:
- Reservierte Vorlagen-IDs: stapel, stock, abwurf, grund, hilf, keller, reserve.
Hierbei handelt es sich um vordefinierte Vorlagen, auf denen andere Vorlagen oder Felder aufbauen können.
- Reservierte Feld-IDs: quelle, ziel.
- x, y: Positionierung des Feldes im Fenster. Welche Werte erlaubt sind, hängt von der Fensterauflösung ab (siehe Grundaufbau).
Eine senkrecht liegende Karte ist 4 Einheiten breit und 6 Einheiten hoch. Um zwei Karten so nebeneinander darzustellen, dass sie sich nicht überlappen, müssen sich ihre x-Werte um 4 Einheiten (dann liegen sie direkt aneinander) oder mehr unterscheiden. Wenn die Karte quer liegt, ist sie 6 Einheiten breit und 4 Einheiten hoch. Siehe dazu den Abschnitt Tags zur grafischen Darstellung.
- kuerzel: Buchstabenkürzel für die Hilfsanzeige. Es darf lediglich ein einzelnes ASCII-Zeichen (ASCII-Code 32-127) verwendet werden; alle anderen Angaben werden ignoriert. Wird kein (oder ein nicht erlaubtes) Kürzel angegeben, dann wird das Kürzel der durch typ angegebenen Vorlage verwendet.
(Wenn als Kürzel der Leerstring verwendet wird, ist das Feld in der Hilfsanzeige nicht zu sehen.)
- typ: Name der Vorlage. Einige Feldtypen sind bereits vordefiniert:
- stock (Gebestapel / Hand; Kürzel: S),
- abwurf (Abwurf für ungenutzte Karten; Kürzel: A),
- grund (Grundkartenstapel, auf dem zuletzt alle Karten aufgebaut werden müssen; Kürzel: G),
- hilf (Hilfsstapel; Kürzel: H),
- keller (Kellerplatz zur kurzzeitigen Auslagerung; Kürzel: K),
- reserve (Reservestapel, von dem aus aufgefüllt wird; Kürzel: R) und
- stapel (für alle andere Stapel; Kürzel: X).
Darüber hinaus ist jede Vorlagen-ID erlaubt, die zuvor definiert wurde. In diesem Fall werden alle Angaben, die zu dieser Vorlage gemacht wurden, weitervererbt; sie können allerdings überschrieben werden.
Die Vorlage
stock hat eine besondere Bedeutung. Der Stock enthält zu Beginn alle verfügbaren Karten, muss also zwingend festgelegt werden, und es ist sehr empfehlenswert, ihn
als erstes Feld festzulegen. Wird der Stock im späteren Spiel nicht mehr benötigt (z. B. weil schon zu Beginn alle Karten verteilt werden), dann können für die Koordinaten Negativwerte angegeben werden; das Feld wird dann nicht im Fenster angezeigt.
Werden
nach dem Festlegen eines Stocks weitere Karten zum Spiel hinzugefügt (siehe
Hinzufügen und Entfernen von Karten), dann befinden sich diese
nicht im Stock, sondern noch im "Speicher". Wird anschließend ein weiterer Stock festgelegt, dann wandern die neuen Karten in diesen Stock.
stock kann nicht als Vorlage einer neuen Vorlage dienen; genauer gesagt arbeitet ein Feld nur dann korrekt als Stock, wenn als Typ
stock angegeben wurde, nicht aber, wenn eine Vorlage angegeben wurde, die auf
stock aufbaut.
Die meisten anderen vordefinierten Vorlagen legen lediglich das vorgegebene Kürzel für die Hilfsanzeige fest. Sie sollten den für diese Patience üblichen Bezeichnungen entsprechen. Es gibt jedoch ein paar wenige vordefinierte Einstellungen, die allerdings auch überschrieben werden können – die Erläuterungen der Tags folgen in Abschnitt 4.2 und 4.3.
- grund: setzt den auto-Tag auf ende, d. h. wenn das automatische Legen gestartet wird (Taste 'a'), werden Karten, wenn möglich, auf diesen Stapel gelegt, aber nicht von diesem Stapel weg..
- keller: setzt den folgestart-Tag auf frei und den max-Tag auf 1, d. h. dieser Stapel kann von einer beliebigen einzelnen Karte belegt werden.
Achtung: Feld-Inhalte, die mehrmals auftreten können (z. B. das im nächsten Abschnitt beschriebene Tag
ziel) und die in einer Vorlage verwendet werden, können nicht überschrieben, sondern lediglich erweitert werden.
Spezielle Tags für das Verhalten eines Stocks
"Stockspezifisches" Verhalten wie das Geben oder die Kartenaufnahme bei leerem Stapel ist nicht an den Feldtyp gebunden, sondern wird durch weitere Unter-Tags geregelt. Diese können also auch in anderen Feldern verwendet werden.
- ziel (mehrfach): Zielfeld, auf das beim Geben gelegt wird.
<ziel bedingung="leer" pruefe="stapelid" sicht="verdeckt">feldname</ziel>
Enthält ein Feld ein oder mehrere ziel-Tags, dann kann die oberste Karte dieses Stapels nicht normal aufgenommen werden, sondern sie wird bei Mausklick auf das angegebene Ziel gelegt. Bei mehreren Zielen wird solange gegeben, bis jedes Ziel bedient oder der Stapel leer ist. Alle drei Attribute sind optional:
bedingung gibt an, ob nur unter bestimmten Voraussetzungen gelegt wird. Folgende Werte werden unterstützt:
- leer: Zielfeld muss leer sein.
- belegt: Zielfeld darf nicht leer sein.
- belegbar: auf das Zielfeld kann gelegt werden, d. h. es ist noch Platz auf dem Stapel.
- erlaubt: das Legen muss regelkonform möglich sein.
- folge: die letzten Karten bilden eine zusammenhängende Kartenfolge, die mit der Startkarte des Stapels beginnt. Die Bedingung ist auch erfüllt, wenn auf einen leeren Stapel gelegt werden soll und die gelegte Karte eine Startkarte des Stapels ist.
- keinefolge: die letzten Karten bilden keine eben genannte zusammenhängende Kartenfolge.
pruefe erwartet als Inhalt eine durch Leerzeichen getrennte Liste von Feld-IDs. Vor dem Legen wird dann zuerst geprüft, ob die zu legende Karte auf eines der angegebenen Felder gelegt werden darf. Ist dies der Fall, dann wird auf dieses (das erste passende) Feld gelegt anstatt auf das in ziel angegebene Feld.
Wird sicht auf verdeckt gesetzt, dann wird die gegebene Karte verdeckt auf den/die Zielstapel gelegt, ansonsten wird offen gegeben. Bitte beachten Sie, dass nur offen liegende Karten direkt aufgenommen werden können!
Achtung: Wenn Sie als Inhalt keine Einzel-ID, sondern eine ID-Liste angeben, werden die Zielfelder nicht in der Reihenfolge der angegebenen IDs bearbeitet, sondern in der Reihenfolge, in der die Felder in der Datei definiert werden. Wenn Sie eine bestimmte, davon abweichende Reihenfolge wünschen, können Sie stattdessen mehrere ziel-Tags verwenden.
- quelle (mehrfach): Quelle, aus der ein leerer Stock zum Neugeben seine Karten bezieht.
<quelle>feldname</quelle>
Ist der Stapel eines angeklickten Feldes leer und wurden für dieses Feld eine oder mehrere Quellen angegeben, dann werden diese vollständig geleert und ihre Karten auf das Feld gelegt. Die Angabe einer Quelle ist nur sinnvoll, wenn auch wiederholtes Geben eingestellt ist.
Achtung: Wie auch beim Tag ziel werden auch hier ID-Listen als Gesamtes betrachtet und die betroffenen Felder in der Reihenfolge behandelt, in der sie in der Datei definiert werden. Wenn Sie eine bestimmte, davon abweichende Reihenfolge wünschen, können Sie stattdessen mehrere quelle-Tags verwenden.
- wiederholung: wie oft der Stock neu aufgenommen wird.
<wiederholung aufnahme="sprung" mischen="ja">1</wiederholung>
Die Angabe 1 bedeutet z. B., dass ein aufgebrauchter Stapel einmal neu aufgenommen wird; insgesamt wird also zweimal gegeben! Die Angabe frei (oder negative Werte) erlauben die Wiederaufnahme beliebig oft. Die Felder, von denen Karten aufgenommen werden, müssen mit dem quelle-Tag festgelgt werden. Fehlt das Tag wiederholung, dann wird das Feld, wenn es leer ist, als normales leeres Feld behandelt.
Erlaubte Attribute (alle optional):
aufnahme: Wird der Wert "sprung" angegeben, dann werden bei einem Klick auf den bereits geleerten Stapel nicht erst die Karten als eigener Schritt aufgenommen, sondern nach der Kartenaufnahme wird sofort wieder gegeben.
mischen: Wenn "ja", dann wird der Stapel nach dem erneuten Aufnehmen zuerst gemischt.
Beispiel: Definition des Stocks im Spiel "Kleine Harfe"
<feld id="stock" x="24" y="12" typ="stock">
<ziel>abwurf</ziel>
<quelle>abwurf</quelle>
<wiederholung>frei</wiederholung>
<sicht>verdeckt</sicht>
</feld>
sicht wird im Abschnitt
Weitere Tags zur Feldkontrolle
beschrieben.
Tags zur Bestimmung der Legefolge
Alle folgenden Tags sind optional. Je nach Art des Feldes werden bestimmte Tags benötigt oder nicht. Soll auf ein Feld gar nicht gelegt werden können, dann ist keiner der Tags notwendig.
- max: Höchstzahl der Karten, die auf diesem Feld liegen dürfen.
<max>13</max>
Wird das Tag weggelassen, dann können keine Karten auf dem Feld abgelegt werden! Dies betrifft im Übrigen nur das Legen per Hand. Computergesteuertes Legen (z. B. lege- oder ziel-Tag) ignorieren diese Beschränkung.
Statt einer Zahl kann auch der Wert frei gewählt werden; dies entspricht einem Maximalwert von 208 Karten. Beachten Sie aber immer, ob die angegebene Maximalzahl auch im Fenster angezeigt werden kann!
- folgestart: Karte, die auf ein leeres Feld gelegt werden darf (siehe Angabe von Kartenfarben und -werten)
<folgestart bedingung="farbewert">Herz A</folgestart>
Fehlt das Tag, dann kann keine Karte abgelegt werden. Es ist auch die Angabe frei erlaubt. Dann kann mit jeder Karte gestartet werden.
Für gewöhnlich kann auch dann an eine bereits bestehende Reihe angelegt werden, wenn sie mit einer anderen Karte beginnt, als unter folgestart vorgeschrieben. Das optionale Attribut bedingung legt jedoch fest, ob zu einem weiteren Aufbau bei der Anfangskarte die farbe, der wert oder farbewert (also sowohl Farbe als auch Wert) stimmen müssen.
- folgeende: Endwert der Folge
<folgeende>K</folgeende>
Auf eine Karte des angegebenen Wertes kann nicht weiter angelegt werden. Fehlt das Tag, dann ist eine zyklische Ablage möglich.
- folgefarbe: Farbreihenfolge, in der gelegt werden kann
<folgefarbe>wechsel</folgefarbe>
Möglich sind die Angaben gleich (gleichfarbig, z. B. Herz-Herz-Herz...), ungleich (nicht gleichfarbig, z. B. Herz-Pik-Kreuz-Herz...), wechsel (Schwarz-Rot im Wechsel) und frei (Folgefarbe beliebig).
- folgewert: Wertreihenfolge, in der gelegt werden kann
<folgewert>auf</folgewert>
Möglich sind die Angaben gleich (gleiche Werte, z. B. 5-5-5...), auf (z. B. D-K-A-2-3...), ab (z. B. 3-2-A-K-D...), aufab (auf oder ab in beliebigem Wechsel, z. B. 7-6-7-8-9-8...), auf3 (aufwärts in anderer Schrittweite: 3-6-9-D-2-5...; in jeder Schrittweite bis 9 und auch abwärts möglich), x2 (Schrittfolge A-2-4-8-3-6-D-B-9-5-10-7-A) oder frei (Wertfolge beliebig).
- folgeschieb: Angabe, welche Stapel verschoben werden können
<folgeschieb>offen</folgeschieb>
In der Regel können nur Folgen verschoben werden, die nach der oben angegebenen folgefarbe und dem folgewert aufgebaut sind. Manchmal ist es jedoch möglich, z. B. Folgen ohne Berücksichtigung der Farbe aufzubauen, aber nur farbechte Folgen zu verschieben. Dazu kann mit diesem Tag eine dieser Angaben gemacht werden:
- einschub: Ort, an dem die Karte eingeschoben wird
<einschub>hinten</einschub>
Für gewöhnlich werden beim Umlegen die Karten vorne auf den Zielstapel gelegt. Dieses Verhalten kann auch umdefiniert werden. Ist der Tag-Inhalt hinten, dann wird die Karte stattdessen hinten "eingeschoben"; die restlichen Karten rutschen um eins nach vorne. Möglich sind auch die Angaben vorn (Standard) sowie aussen, was das Anlegen sowohl vorn als auch hinten erlaubt.
Weitere Tags zur Feldkontrolle
- regel: Auch innerhalb eines Feldes kann eine bestimmte Regel gefordert werden. Der Inhalt wird nur berücksichtigt, wenn die entsprechende Regel gewählt wurde, sonst wird er ignoriert. Näheres siehe Regelvarianten
- level: Analog zu den Regeln wird der Inhalt nur berücksichtigt, wenn sich das Level innerhalb der angegebenen Grenzen befindet.
- fuellen: füllt das leer werdende Feld automatisch
<fuellen>feldname</fuellen>
Wird das Feld von Hand geleert, dann wird es automatisch mit einer Karte des Feldes mit zugehöriger ID gefüllt. Ist dieses Feld leer (und kann nicht neu aufgenommen werden), dann wird keine Karte gegeben.
- sperre (mehrfach): sperrt das Feld unter bestimmten Voraussetzungen
<sperre id="name" status="inaktiv" typ="legen" bedingung="belegbar" modus="and">feld1 feld2 feld3</sperre>
Wenn für eines der Sperr-Felder eine bestimmte Bedingung eintritt, dann ist das Feld gesperrt. Alle Attribute sind optional; sie regeln die genaueren Auswirkungen:
- id wird nur benötigt, wenn die Sperre durch automatisierte Spielzüge aktivierbar bzw. deaktivierbar sein soll, und gibt den Namen an, unter dem die Sperre angesprochen werden kann.
- status kann den Wert aktiv (Standard) oder inaktiv enthalten. Wird die Sperre auf inaktiv gesetzt, muss sie zunächst durch einen automatisierten Spielzug aktiviert werden, bevor sie eine Auswirkung hat.
- typ regelt, welche Aktion gesperrt ist. legen verbietet das Legen auf das Feld, nehmen verbietet es, eine Karte vom Feld aufzunehmen. Jede andere Angabe (oder das Fehlen des Attributes) verhindert sowohl das Legen als auch das Nehmen.
- bedingung gibt die Voraussetzung an, welche die Sperr-Felder erfüllen müssen, um die Sperre auszulösen. leer bedeutet: Wenn das Sperr-Feld keine Karte enthält, dann wird gesperrt. belegt sperrt, wenn das Sperr-Feld mindestens eine Karte enthält (Standard). belegbar sperrt, wenn im Sperr-Feld Platz für mindestens eine weitere Karte ist, und voll, wenn im Sperr-Feld kein Platz mehr frei ist.
- modus bestimmt, wie viele der angegebenen Sperr-Felder die Bedingung erfüllen müssen, um eine Sperre auszulösen. Standardmäßig wird or verwendet, das bedeutet, dass es genügt, wenn mindestens einmal die Bedingung zutrifft. Nur ein einziges der Sperr-Felder muss die Bedingung erfüllen, damit die Sperre ausgelöst wird.
Wird and verwendet, dann muss jedes angegebene Sperr-Feld die Bedingung erfüllen.
xor verlangt mindestens ein Sperr-Feld, das die Bedingung erfüllt und mindestens eines, das sie nicht erfüllt. Werden genau zwei Sperr-Felder angegeben, dann wirkt xor wie ein Exklusiv-Oder.
- gesperrt: sperrt das Feld für die Kartenaufnahme
<gesperrt>ja</gesperrt>
Wenn das Tag den Wert ja beinhaltet, dann kann von diesem Feld keine Karte aufgenommen werden. Jede andere Angabe (oder das Fehlen des Tags) bedeutet, dass das Feld nicht gesperrt ist.
Im Gegensatz zum sperre-Tag ist hier das Feld immer gesperrt und kann nicht entsperrt werden (außer durch einen automatisierten Spielzug).
- schiebsperre (mehrfach): sperrt das Legen von diesem Feld auf bestimmte andere
<schiebsperre id="name" status="inaktiv" bedingung="leer">feld1 feld2 feld3</schiebsperre>
Alle drei Attribute sind optional.
- id wird nur benötigt, wenn die Sperre durch automatisierte Spielzüge aktivierbar bzw. deaktivierbar sein soll, und gibt den Namen an, unter dem die Sperre angesprochen werden kann.
- status kann den Wert aktiv (Standard) oder inaktiv enthalten. Wird die Sperre auf inaktiv gesetzt, muss sie zunächst durch einen automatisierten Spielzug aktiviert werden, bevor sie eine Auswirkung hat.
- bedingung gibt an, unter welchen Voraussetzungen das Legen doch möglich ist: leer (Zielfeld muss leer sein), belegt (Zielfeld darf nicht leer sein), stopp (für das Startfeld muss gerade eine Stoppbedingung vorliegen (s. o.) oder keinstopp (es darf gerade keine Stoppbedingung vorliegen). Fehlt das Attribut, dann ist das Legen von diesem Feld auf das Zielfeld nie möglich.
- stopp: sperrt vorübergehend den weiteren Spielverlauf
<stopp bedingung="kartenzahl">max</stopp>
Sobald eine bestimmte Bedingung eintritt, muss zuerst diese Bedingung aufgelöst werden, bevor andere Aktionen durchgeführt werden können. Das zwingende Attribut bedingung gibt die notwendige Bedingung an, der Inhalt des Tags spezifiziert diese Angabe genauer.
Treten durch einen Spielzug mehrere Stopp-Bedingungen gleichzeitig ein, dann können diese in beliebiger Reihenfolge aufgelöst werden. Andere Aktionen sind jedoch erst möglich, wenn keine Stopp-Bedingung mehr vorliegt.
Folgende Bedingungen werden unterstützt:
- kartenzahl: Sobald der Stapel die angegebene Kartenzahl erreicht oder überschreitet, muss der Stapel zuerst wieder unter diese Zahl gebracht werden. Die Angabe kann ein Zahlenwert oder max sein (Maximalzahl des Stapels).
- einschub: Sobald eine Karte in den Stapel eingeschoben wird, muss zunächst die oberste Karte dieses Stapels weitergeschoben werden. Sinnvollerweise sollte gleichzeitig der Einschub in den Stapel (s. o.) festgelegt werden, z. B. auf hinten. Der Tag-Inhalt kann angeben, dass die Stopp-Bedingung nicht ausgelöst wird, wenn die farbe oder der wert der eingeschobenen Karte mit der Startfarbe bzw. dem Startwert des Feldes übereinstimmt.
- leer: Wenn ein Feld geleert wird, muss es zuerst mit einer Karte belegt werden. Von Beginn an leere Stapel sind nicht betroffen! Das Tag hat keinen Inhalt.
- sicht: verdeckte Feldanzeige
<sicht>verdeckt</sicht>
Ist der angegebene Wert verdeckt, dann werden alle Karten des Stapels stets verdeckt angezeigt, und sie können daher auch nicht aufgenommen werden. Bei jeder anderen Angabe (oder dem Fehlen des Tags) wird immer zumindest die oberste Karte offen angezeigt. Verdeckt liegende Karten können weder verschoben noch belegt, sondern nur mithilfe des Tags ziel oder durch einen automatisierten Spielzug verteilt werden.
- auto: automatisches Legen aktivieren
<auto>ja</auto>
Wird ja angegeben, dann ist es möglich, eine Karte durch Rechtsklick automatisch auf diesen Stapel zu legen. Ein Rechtsklick durchsucht alle Felder nach dem auto-Tag. Sobald ein Feld mit diesem Tag gefunden wird, auf welches das Legen erlaubt ist, wird dies automatisch durchgeführt. Auch wenn der Spieler einen automatischer Lauf startet (Taste 'a'), wird das Feld als mögliches Ziel in Betracht gezogen.
Die Angabe ende bewirkt weitgehend dasselbe, stellt jedoch sicher, dass bei einem automatischen Lauf keine Karten von diesem Feld wegbewegt werden. Die Angabe ist vorallem für Felder gedacht, auf denen letztendlich alle Karten landen sollen, und ist daher die Voreinstellung für den Feldtyp grund.
Statt ja oder ende kann auch eine Bedingung angegeben werden, welche von der zu legenden Karte erfüllt sein muss, um automatisch gelegt werden zu können. Möglich ist:
- Kartenfarbe und/oder Kartenwert, z. B. K oder Herz 9
- farbe, anderefarbe bzw. farbwechsel: die gelegte Karte muss dieselbe Farbe (z. B. Herz auf Herz), eine beliebige andere Farbe (z. B. Herz auf Pik oder Herz auf Karo) bzw. die entgegengesetzte Farbe (z. B. rot auf schwarz) besitzen.
- wert, wertauf, wertab, wertaufab: die gelegte Karte muss denselben Wert bzw. den folgenden oder vorhergehenden Wert besitzen. Auch Angaben wie wertauf3 für einen Aufbau im Dreierschritt ist möglich.
- leer bzw. belegt: der Zielstapel muss zuvor leer bzw. belegt sein.
Bedingungen können, durch Komma getrennt, kombiniert werden. Dann wird zunächst versucht, nach der ersten Bedingung zu legen, dann nach der nächsten. Wenn z. B. mehrere Felder die Angabe <auto>belegt,ja</auto> besitzen, wird zunächst versucht, auf ein bereits belegtes Feld zu legen. Geht das nicht, wird stattdessen unabhängig von der Bedingung gesucht.
- aufdecken: Umgang mit verdeckt liegenden Karten
<aufdecken>manuell</aufdecken>
Wenn eine verdeckt liegende Karte freigespielt wird, wird sie in der Regel automatisch aufgedeckt. Auf anderweitig verdeckt liegende Karten (also insb. solche, die bereits zu Beginn als letzte Karte verdeckt auf einem Stapel liegen) kann dagegen nicht zugegriffen werden. Dieses Verhalten kann auch geändert werden. Als Tag-Inhalt ist einer der folgenden Werte möglich:
- auto: Verdeckte Karten werden automatisch aufgedeckt und sind für manuellen Zugriff gesperrt. Dies entspricht dem Standardverhalten und muss nicht explizit definiert werden.
- manuell: Verdeckte Karten werden nicht automatisch aufgedeckt, sondern können nur manuell aufgedeckt werden.
- auto,manuell: Verdeckte Karten werden automatisch aufgedeckt, können aber auch manuell aufgedeckt werden. Beachten Sie: Die Angabe muss exakt in dieser Form erfolgen und enthält kein Leerzeichen.
- gesperrt: Verdeckte Karten werden weder automatisch aufgedeckt noch kann manuell auf sie zugegriffen werden. Die einzige Zugriffsmöglichkeit wären automatisierte Spielzüge.
- blindstart: Belegen von verdeckt liegenden Karten
<blindstart>K</blindstart>
Wenn die letzte Karte eines Stapels verdeckt liegt („blinder“ Stapel), kann in der Regel keine andere Karte auf sie gelegt werden. blindstart erlaubt das Legen auf einen solchen Stapel, wenn die gelegte Karte die im Tag-Inhalt angegebene Bedingung erfüllt. Möglich sind, wie bei folgestart, die Angabe einer Kartenfabe, eines Kartenwertes, einer Kombination aus Kartenfarbe und Kartenwert sowie die Angabe frei
- punkte: Anzahl der Punkte, die man für das Legen einer Karte auf dieses Feld erhält
Die Möglichkeiten der Punktevergabe ist recht umfassend und wird im Abschnitt Tag zur Punktevergabe ausführlich erläutert.
- var: eine frei belegbare Variable
<var>123</var>
Die Variable kann einen Wert von 0 bis 2147483647 annehmen und in automatisierten Spielzügen abgefragt oder neu belegt werden.
- lege (mehrfach): legt eine Karte auf das Feld
<lege typ="offen" quelle="stock" bedingung="erlaubt" anz="4">frei</lege>
Das Tag beinhaltet die Angabe der zu legenden Karte (siehe Angaben von Kartenfarben und -werten; auch die Angabe frei ist erlaubt). Es gibt zwei zwingenden Attribute typ (verdeckt oder offen) und quelle (ID des Feldes, von dem gelegt werden soll) sowie die optionalen Attribute anz (Anzahl der zu legenden Karten; Standard: 1) und bedingung (Einschränkung, wann gelegt wird). Wird das Attribut nicht gesetzt, dann wird auf jeden Fall gelegt, unabhängig von der maximalen Kartenzahl des Zielfeldes.
bedingung kann einen der folgenden Werte annehmen: erlaubt legt nur dann, wenn die entsprechende Karte regelgerecht angelegt werden kann. leer legt nur auf ein zuvor leeres Feld, belegt nur auf ein bereits belegtes Feld.
Wichtig: Damit eine Karte gegeben werden kann, muss das Quellfeld bereits zuvor definiert worden sein, und es muss Karten besitzen!
- sortiere: erlaubt nach dem Legen, bestimmte Karten im Stapel anzuordnen
<sortiere richtung="hinten">K</sortiere>
Der Tag-Inhalt gibt die Karte(n) an (siehe Angaben von Kartenfarben und -werten). Das zwingende Attribut richtung bestimmt, wo die Karte zu liegen kommt: vorn (als nächste spielbare Karte), hinten (als letzte spielbare Karte), aussen (zufällig vorn oder hinten), innen (zufällig irgendwo außer vorn oder hinten) oder zufall (zufällig irgendwo im Stapel).
Um den kompletten Stapel umzusortieren, kann als richtung auch mischen oder umdrehen verwendet werden. Damit ist immer der ganze Stapel betroffen; der Tag-Inhalt wird ignoriert.
- beziehung (mehrfach): stellt eine Relation zu einem anderen Feld her.
<beziehung id="naechstesFeld">feldID</beziehung>
Beziehungen können in automatisierten Spielzügen eingesetzt werden, insb. um beim Kartenlegen auf das Feld zuzugreifen, auf die das Start- oder Zielfeld der Legeaktion verweist. Die Relation ist einseitig; für beidseitige Relationen muss das Tag in beiden betroffenen Feldern auftreten.
id enthält den Namen, über den auf die Relation zugriffen werden kann. Der Tag-Inhalt gibt den Namen des verknüpften Feldes an. Siehe dazu Beziehungen zwischen Feldern
Tags zur grafischen Darstellung
Manche Tags werden dazu verwendet, bestimmte Darstellungsoptionen festzulegen, und haben keine weitere spielrelevante Funktion. Dazu gehören die farbliche Markierung gesperrter Stapel, Informationsanzeigen, Randanzeige leerer Felder usw. Alle folgenden Tags sind optional.
- lage: Längs- oder Querlage des Stapels
<lage>quer</lage>
Die Angabe quer sorgt dafür, dass der Stapel waagrecht liegend dargestellt wird. Fehlt das Tag, dann wird der Stapel senkrecht liegend dargestellt.
Die im spiel-Tag angegebene Fensterbreite x und Fensterhöhe y bezieht sich auf senkrecht liegende Stapel. Ein quer liegender Stapel ist 2 Einheiten breiter, aber auch 2 Einheiten weniger hoch. Er kann daher nicht mehr an der Stelle x liegen, sondern muss mindestens um 2 weiter links liegen. Dafür kann er um 2 tiefer als y gelegt werden.
- eng: Ab dieser Kartenzahl werden die Karten geschuppter Stapel gedrängt dargestellt.
<eng>7</eng>
Dadurch kann die maximale Kartenzahl eines Feldes (max-Tag) höher eingestellt werden, ohne dass das Darstellungsfenster "gesprengt" wird. In normaler Darstellung sind die Karten geschuppter Stapel zwei Einheiten (20 Pixel in der kleinsten Auflösung) voneinander entfernt, in enger Darstellung nur noch eine Einheit (10 Pixel).
- richtung: Richtung, in die der Stapel zeigt.
<richtung>unten</richtung>
Möglich sind die Angaben stapel (die Karten liegen direkt übereinander, nur die oberste ist sichtbar), oben, unten, rechts, links sowie Kombinationen wie rechts unten usw. Fehlt das Tag, dann wird stapel verwendet.
- anzeige (mehrfach): eine Information zum Stapel wird angezeigt
<anzeige id="name" status="inaktiv" typ="wiederholung" text="x geben">oben</anzeige>
Der Tag-Inhalt gibt an, ob die Anzeige oben, unten, links oder rechts der Karte platziert wird. Auch Kombinationen wie oben links sind möglich. Alle Attribute sind optional.
- id wird nur benötigt, wenn die Anzeige durch automatisierte Spielzüge aktivierbar bzw. deaktivierbar sein soll, und gibt den Namen an, unter dem die Anzeige angesprochen werden kann.
- status kann den Wert aktiv (Standard) oder inaktiv enthalten. Wird die Anzeige auf inaktiv gesetzt, muss sie zunächst durch einen automatisierten Spielzug aktiviert werden, bevor sie sichtbar wird.
- typ bestimmt, welche Feldeigenschaft angezeigt werden soll. Möglich sind alle abfragbaren Feldeigenschaften (siehe Automatisierte Spielzüge: Bedingungen), z. B. kartenzahl, startfarbe oder startwert.
- text gibt einen anzuzeigenden statischen Text an.
- Wird sowohl typ als auch text angegeben, dann wird der tatsäch angezeigte aus beiden Angaben zusammengesetzt. Wird keines der beiden Attribute angegeben, dann wird die Anzahl der Karten angezeigt, die sich im Stapel befinden.
Leere Felder, deren rand (s. u.) auf nein gesetzt ist, erhalten keine Anzeige.
- rand: Anzeige des Randes
<rand>5</rand>
Die Standardeinstellung einfach bedeutet, dass bei einem leeren Feld eine weiße "Karte" angezeigt wird. nein schaltet diese Anzeige aus. komplett zeigt statt des einzelnen Feldes den kompletten Bereich an, der vom Feld belegt werden kann (abhängig von richtung, max und eng). Ansonsten gibt die Zahl die Breite des Randes an (ebenfalls abhängig von eng).
- sichtbar: Anzahl der angezeigten Karten
<sichtbar>komplett</sichtbar>
Das Tag hat nur eine Auswirkung, wenn mehr Karten im Stapel liegen, als angezeigt werden sollen. Die Standardeinstellung komplett bewirkt eine Anzeige aller Karten des Stapels. Ansonsten kann jeder Zahlenwert von 0 bis 208 angegeben werden. Der Wert 0 versteckt dabei das Feld vollständig – es kann weder eine Karte vom Stapel aufgenommen noch darauf abgelegt werden.
Tag zur Punktevergabe
Punkte werden pro Feld vergeben; die Gesamtpunktzahl errechnet sich aus der Summe der Punkte aller einzelnen Felder. Die Art der Berechnung wird über das Tag
punkte angegeben, der innerhalb der Felddefinition auch mehrmals auftreten darf. Die für einen Sieg erforderliche Gesamtpunktzahl wird mit
punktemax und
punktestart global für das ganze Spiel festgelegt; siehe dazu den Abschnitt
Punktesystem.
Das Tag
punkte besitzt ein optionales Attribut
bedingung, welches genauer festlegt, unter welchen Bedingungen eine Punktewertung stattfindet. Wird es nicht angegeben, dann wird die Anzahl der Karten auf dem Feld gezählt. Der Inhalt des Tags gibt dann an, wie viele Punkte pro Karte auf dem Feld gezählt werden sollen. Ist die Zahl negativ, dann erhält der Spieler Punkte für das Entfernen von Karten aus diesem Feld.
Mögliche Angaben für das Attribut
bedingung sind:
Beispiele
Definition eines Grundkartenstapels und eines normalen Stapels in "Spinne"
1) Grundkartenstapel
Es können Stapel farbecht absteigend von König bis Ass abgelegt werden. Automatisches Legen ist möglich; gelegte Karten können nicht mehr aufgenommen werden. Für jede abgelegte Karte gibt es einen Punkt. (Die Notwendigkeit, genau 13 Karten abzulegen, wird weiter unten bei den automatisierten Spielzügen umgesetzt.)
<feld id="g" x="32" y="6" typ="grund">
<max>13</max>
<richtung>stapel</richtung>
<folgestart>K</folgestart>
<folgefarbe>gleich</folgefarbe>
<folgewert>ab</folgewert>
<folgeende>A</folgeende>
<auto>ja</auto>
<gesperrt>ja</gesperrt>
<punkte>1</punkte>
</feld>
2) "normaler" Stapel
Die Höchstkartenzahl von 21 ist nötig, um nicht den Fensterrahmen zu sprengen. Karten werden abwärts in beliebiger Farbfolge gelegt, allerdings können nur farbechte Stapel verschoben werden. Leere Stapel können mit einer beliebigen Karte belegt werden.
Zu Beginn werden sechs verdeckte und eine offene Karte auf den Stapel gelegt, ohne Voraussetzung an die Art der gelegten Karten.
<feld id="r1" x="1" y="1" typ="stapel">
<max>21</max>
<richtung>unten</richtung>
<folgestart>frei</folgestart>
<folgefarbe>frei</folgefarbe>
<folgewert>ab</folgewert>
<folgeende>A</folgeende>
<folgeschieb>farbe</folgeschieb>
<lege typ="verdeckt" quelle="stock" anz="6">frei</lege>
<lege typ="offen" quelle="stock">frei</lege>
</feld>
Folgendes Beispiel bildet einen Stapel aus 13 Herz- und 13 Pik-Karten und ordnet diese zufällig an.
<feld id="r1" x="1" y="1" typ="stapel">
<max>26</max>
<richtung>unten</richtung>
<lege typ="offen" quelle="stock" anz="13">Herz</lege>
<lege typ="offen" quelle="stock" anz="13">Pik</lege>
<sortiere richtung="mischen"></sortiere>
</feld>
Während das Mischen im oberen Fall zu einem sehr guten Ergebnis führt, werden Sortiervorgänge mit der Angabe
zufall in der Regel unbefriedigend sein, da hier kein "echtes" Mischen durchgeführt wird. Das "Hineinmischen" einer einzelnen Karte in einen Stapel funktioniert dagegen sehr gut, sofern diese Karte als letztes zum Stapel hinzugefügt wurde. In folgendem Beispiel werden vier Stapel gebildet, von denen jeder genau einen König enthält. Dazu wird erst ein temporärer Reservestapel gebildet, in dem zu Beginn die Könige liegen.
<spiel name="Jedem Koenig sein eigenes Reich" fenster="40x42">
<programm>090818</programm>
<version>090818</version>
<karten>52</karten>
<feld id="stock" x="-1" y="-1" typ="stock">
</feld>
<feld id="temporaer" x="-1" y="-1" typ="reserve">
<lege typ="offen" quelle="stock" anz="4">K</lege>
</feld>
<feld id="Nordreich" x="8" y="2" typ="stapel">
<max>13</max>
<richtung>rechts</richtung>
<lege typ="offen" quelle="stock" anz="12">frei</lege>
<lege typ="offen" quelle="temporaer">frei</lege>
<sortiere richtung="zufall">K</sortiere>
</feld>
<feld id="Ostreich" x="38" y="9" typ="stapel">
<max>13</max>
<richtung>unten</richtung>
<lege typ="offen" quelle="stock" anz="12">frei</lege>
<lege typ="offen" quelle="temporaer">frei</lege>
<sortiere richtung="zufall">K</sortiere>
</feld>
<feld id="Suedreich" x="32" y="40" typ="stapel">
<max>13</max>
<richtung>links</richtung>
<lege typ="offen" quelle="stock" anz="12">frei</lege>
<lege typ="offen" quelle="temporaer">frei</lege>
<sortiere richtung="zufall">K</sortiere>
</feld>
<feld id="Westreich" x="2" y="33" typ="stapel">
<max>13</max>
<richtung>oben</richtung>
<lege typ="offen" quelle="stock" anz="12">frei</lege>
<lege typ="offen" quelle="temporaer">frei</lege>
<sortiere richtung="zufall">K</sortiere>
</feld>
</spiel>
Automatisierte Spielzüge
<aktion typ="legen" id="Aktions-ID" ruecknahme="nein">
<bedingung feld="ziel" tag="karte" karte="1" beziehung="groesser">B</bedingung>
<vergleich feld1="quelle" feld2="ziel" typ="farbe">gleich</vergleich>
<aenderung feld="ziel" tag="folgewert" ziel="id">ab</aenderung>
<lege feld="quelle" ziel="id" startpos="-1" zielpos="zufall" anz="legezahl" richtung="rueckwaerts"
typ="offen" animation="ja" umschichten="auf" opt="erlaubt">ziel</lege>
<sound>legen</sound>
<warte>300</warte>
<meldung antwort="Ja\nNein" feld="stock">Willst du neu mischen?</meldung>
<setze id="menu">AUTO</setze>
<spielende>verlust</spielende>
<erfolg>naechste</erfolg>
<misserfolg>anfang</misserfolg>
</aktion>
Es gibt vier Möglichkeiten, automatisierte Spielzüge anzugeben: beginn, aktion, abschluss und ende.
- beginn wird direkt nach dem Spielstart durchgeführt. Im weiteren Spiel werden diese Züge nicht mehr berücksichtigt. Mit diesem Tag ist es möglich, zusätzliche Vorbereitungen für das Spiel zu treffen, bevor der Spieler seinen ersten Zug macht.
- aktion wird aktiv, sobald der Spieler einen Zug (Mausklick auf ein Feld, Ziehen einer Karte auf ein anderes Feld) durchführt. Die Aktion wird vor dem regulären Zug durchlaufen. Ist die Aktion erfolgreich (s. u.), dann wird der reguläre Zug nicht mehr durchgeführt. Mit aktion können weitere Legemöglichkeiten definiert werden wie z. B. das Entfernen zweier Karten, die als Paar zusammen gehören, das Sperren bestimmter Züge (über die regulären Möglichkeiten hinaus) oder das Umdefinieren bestimmter Feldeigenschaften.
- abschluss wird ebenso aktiv, sobald der Spieler einen Zug durchführt. Allerdings kommen diese Spielzüge erst nach dem regulären Zug (bzw. nach einer aktion) zur Geltung. Mit ihnen können u. a. Computergegner umgesetzt werden, die nach dem Spieler ziehen.
- ende wird während des Spiels ignoriert und kommt erst zum Einsatz, sobald das Spiel beendet wird, also wenn die erforderliche Punktzahl erreicht ist oder das Spiel abgebrochen wird. Hier kann noch einmal der Punktestand angepasst oder ein abgebrochenes Spiel unter bestimmten Bedingungen als Sieg definiert werden.
Ob ein automatisierter Zug durchgeführt wird oder nicht, wird über Bedingungen und Feld-Vergleiche überprüft. Anschließend stehen verschiedene Möglichkeiten wie das Legen von Karten und die Änderung von Feldeigenschaften zur Verfügung. In der Regel wird immer nur der erste passende Zug durchgeführt; dies kann jedoch speziell gesteuert werden.
Folgende Möglichkeiten stehen zur Verfügung:
- Das Attribut typ bestimmt die Art, wie die Aktion ausgelöst wird.
- Bei aktion ist das Attribut verbindlich und gibt an, ob es sich beim aktuellen Spielerzug um das legen einer Karte auf eine andere oder durch einen Mausklick links, rechts oder mitte handelt. Die Angabe klick erwartet einen Mausklick mit linken oder rechten Taste. Beachten Sie, dass die Definition eines Links- oder Rechtsklicks für die entsprechenden Karten die Möglichkeit des normalen bzw. automatischen Legens blockieren kann!
- Bei abschluss ist das Attribut ebenfalls verbindlich. Es gibt an, welche Art von regulären Zug zuvor stattgefunden haben muss. Hier kann es sinnvoll sein, jede beliebige Art zuzulassen. Zu diesem Zweck kann dem Attribut der Inhalt frei übergeben werden.
- Bei ende ist das Attribut optional. Es gibt an, ob das Spiel als sieg (nötige Punktzahl erreicht) oder verlust (Spielabbruch oder -neustart) beendet wurde. Wird frei angegeben oder das Attribut ausgelassen, dann werden beide Möglichkeiten berücksichtigt.
- Bei beginn ist keine Angabe von typ möglich.
- Das Attribut id ist optional und kann als Sprungmarke für die Anweisungen erfolg und misserfolg verwendet werden (näheres siehe dort).
- Das optionale Attribut ruecknahme legt fest, ob die Aktion als Zug zurückgenommen werden kann. Standardmäßig lassen sich die Auswirkung einer Aktion vom Spieler zurücknehmen. Wird für das Attribut ruecknahme der Wert nein angegeben, dann ist keine Rücknahme möglich. ruecknahme kann nicht für beginn und ende eingesetzt werden.
- bedingung gibt eine Bedingung an, die erfüllt sein muss, damit die Aktion durchgeführt wird.
- vergleich regelt den Vergleich zweier Karten. Der Vergleich muss positiv ausfallen, damit die Aktion durchgeführt wird.
- aenderung erlaubt die Änderung einer Feldeigenschaft.
- lege legt die oberste Karte eines Feldes oder mehrere Karten auf ein anderes Feld.
- warte gibt eine Zeit in Millisekunden an, die das Spiel angehalten wird.
- spielende beendet das Spiel mit einem Sieg oder einem Verlust.
- meldung gibt eine Meldung aus und wartet auf Bestätigung.
- erfolg und misserfolg geben an, wie nach einer erfolgreichen bzw. nicht erfolgreichen Abarbeitung der Aktion fortgefahren wird.
- Zunächst werden alle angegebenen Bedingungen überprüft, danach alle Vergleiche. Sobald das Programm auf eine Bedingung oder einen Vergleich stößt, die/der nicht zutrifft, wird die weitere Überprüfung für diese Aktion abgebrochen. Sie sollten daher die Bedingungen bzw. Vergleiche, die am ehesten „scheitern“ werden, möglichst weit nach vorn setzen.
Nur wenn alle Bedingungen und Vergleiche erfolgreich überprüft wurden, werden die angegebenen Änderungen, Legeaktionen usw. durchgeführt, und zwar in der angegebenen Reihenfolge. Sie können beliebig gemischt werden.
Besondere Felder
Felder werden wie üblich über ihre ID angesprochen, wobei mehrere Felder dieselbe ID besitzen können. In einem solchen Fall wird die Liste aller Felder durchlaufen, bis das erste Feld mit der angegebenen ID gefunden wird, das die erforderliche Bedingung erfüllt oder den angegebenen Vergleich besteht. Änderungen und Legeaktionen betreffen dagegen alle Felder mit der angegebenen ID (näheres siehe weiter unten).
Es gibt jedoch einige wenige besondere IDs:
- quelle ist das Feld, von dem aus der Benutzer Karten legen will. Es steht sinnvollerweise nur bei einer Aktion mit dem Typ legen zur Verfügung
- ziel ist das Feld, auf das der Benutzer Karten legen will (Aktions-Typ legen) oder auf das der Benutzer geklickt hat (bei den anderen Aktions-Typen).
- @legestapel ist ein Pseudostapel. Beim Klick auf ein Feld (unabhängig davon, ob verschoben oder nur geklickt wird) werden in der Regel alle Karten des Feldes ab der geklickten Karte in den Pseudostapel kopiert. Ausnahmen sind Felder mit
folgeschieb="einzeln"
(es wird nur die geklickte Karte kopiert) und folgeschieb="umdrehen"
(der Kopiervorgang findet in umgekehrter Richtung statt).
@legestapel ist aber kein echtes Feld. Beispielsweise ergeben Abfragen der erlaubten Legefolge oder der maximal erlaubten Kartenzahl für den Pseudostapel keinen Sinn. Auch das Legen auf oder vom Pseudostapel ist nicht zulässig (verwenden Sie dafür den echten Stapel quelle). @legestapel kann nur in Vergleichen und bei einigen wenigen Bedingungsabfragen verwendet werden.
Bedingungen
Bei Bedingungen handelt es sich in der Regel um bestimmte Feldeigenschaften. Das Attribut feld bestimmt das zu testende Feld. Dabei sind auch die Angaben quelle, ziel und in Einzelfällen auch @legestapel erlaubt.
tag bestimmt die Feldeigenschaft, der überprueft werden soll. Stimmt diese Eigenschaft mit dem Inhalt des Tags überein, dann gilt die Bedingung als erfüllt. Um Feldeigenschaften daraufhin zu überprüfen, ob sie größer oder kleiner sind als ein vorgegebener Wert, kann das optionale Attribut beziehung mit einem der Werte kleiner, kleinergleich, groesser, groessergleich oder ungleich belegt werden. Vergleichsangaben sind aber nur bei Zahlenwerten (z. B. max, var, kartenzahl …) und bei karte möglich.
Folgende Feldeigenschaften können überprüft werden:
- id, max, folgestart, folgeende, folgefarbe, folgewert, folgeschieb, einschub, fuellen, sicht, sichtbar, gesperrt, auto, var
Diese Eigenschaften entsprechen den in der Felddefinition angegebenen.
- rand: Wie in der Felddefinition angegeben, jedoch wurde die Angabe komplett bereits in den zugehörigen Zahlenwert übersetzt und steht daher nicht mehr zur Verfügung.
- start bzw. startfolge: Überprüft, ob die erste Karte des Stapels als Startkarte erlaubt ist bzw. ob die ganze Folge eine erlaubte Folge ist. Der Tag-Inhalt gibt gegebenenfalls die nötige Startkarte an. Wird er leer gelassen, dann zählen stattdessen die in der Felddefinition unter folgestart angegebenen Werte. Mit dem Attribut folge kann zudem die gewünschte Kartenfolge (offen, farbe, anderefarbe, farbwechsel, wert, wertauf, wertab, wertaufab) angegeben werden.
- kartenzahl: die aktuelle Zahl der Karten im Stapel
Sie können als feld auch den Pseudostapel @legestapel angeben. Bei einer Legeaktion erhalten Sie dasselbe Ergebnis wie mit legezahl.
- wiederholung: Anzahl der noch möglichen Wiederholungen oder frei
- startfarbe, startwert: Unterpunkte von folgestart. Während folgestart die exakte Farbe-Wert-Kombinattion beinhaltet (eine Wertangabe ohne Farbe würde bedeuten, dass die Farbe egal sein muss), fragen startfarbe und startwert Farbe und Wert getrennt ab.
- sperre, schiebsperre: gibt zurück, ob eine vorhandene (Schieb-)Sperre aktiv oder inaktiv ist. Der Name der Sperre muss im Attribut id angegeben werden. Wurde keine Sperre mit dem angegebenen Namen definiert, dann ist der Rückgabewert leer.
- legezahl: Anzahl der verschobenen Karten. Dies ist nur für den Aktionstyp legen verfügbar und ignoriert das Attribut feld.
- karte: prüft, ob die oberste Karte des Stapels dem angegebenen Kartenwert entspricht. Erlaubt sind die üblichen Angaben zu Kartenwerten. Auch Vergleiche wie kleiner sind möglich. Dabei gilt 2 als kleinste und Ass als größte Karte. Außerdem gilt z. B. Herz 2 kleiner als Herz 5 (oder als 5 allgemein), aber Herz 2 nicht kleiner als Pik 5 – sofern eine Farbe angegeben ist, muss diese also stimmen.
Soll nicht die oberste, sondern eine andere Karte des Stapels überprüft werden, dann wird die gewünschte Position mit dem Attribut karte angegeben. Positive Werte geben die direkte Position an, gerechnet von der untersten Karte des Stapels. 1 bedeutet also, dass die erste Karte geprüft wird. Negative Werte geben die Zählung von der obersten Karte gerechnet an. Dabei bedeutet -1, dass die oberste Karte geprüft wird; genau dasselbe passiert, wenn das Attribut ausgelassen wird.
Als feld ist auch der Pseudostapel @legestapel zulässig.
- status überprüft, ob die oberste Karte des Stapels offen oder verdeckt liegt. Liegt die oberste Karte verdeckt, dann kann sie nicht regulär verwendet werden; über die automatisierten Spielzüge kann man jedoch auf sie zugreifen. So ist es z. B. möglich, die verdeckte Karte mit einem Mausklick aufzudecken (siehe Beispiel 6).
- legbar überprüft, ob eine Karte auf ein bestimmtes Feld gelegt werden kann. Der Inhalt des Tags gibt das Zielfeld an, das Attribut feld die zu legende Karte. Mit dem Attribut umschichten wird außerdem das Verhältnis zwischen den Kartenzahlen beider betroffenen Stapel geprüft. umschichten kann den Wert auf beinhalten, womit der Test nur erfolgreich ist, wenn die Kartenzahl des Zielstapels nach dem Legen größer wäre als die des Quellstapels (die Kartenzahl des größeren Stapels würde größer). Wird ab angegeben, dann ist der Test erfolgreich, wenn die Kartenzahl des Zielstapels vor dem Legen kleiner ist als die des Quellstapels (die Kartenzahl des größeren Stapels würde kleiner).
In der Regel wird immer auf die Legemöglichkeit der obersten Karte geprüft. Wenn Sie als feld aber quelle oder @legestapel angeben, wird geprüft, ob der gesamte zum Verschieben vorgesehene Stapel gelegt werden kann.
- stopp überprüft, ob für das Feld die Stopp-Bedingung gesetzt ist und gibt entweder ja oder nein zurück.
- naechster gibt den Wert der Karte zurück, die auf den Stapel gelegt werden kann. Dieser ist von der obersten Karte sowie von folgewert abhängig. Für die Legefolge aufab ist diese Angabe nicht sinnvoll einsetzbar.
Vergleiche
Zwei Karten können anhand ihres Kartenwertes oder ihrer Farbe verglichen werden. Die zwingenden Attribute feld1 und feld2 geben die Felder an, deren Karten verglichen werden sollen. Als Feld kann auch quelle, ziel oder @legestapel angegeben werden. Die optionalen Attribute karte1 und karte2 bestimmen genauer, welche der Karten verglichen werden sollen. Werden sie ausgelassen, wird die oberste Karte des Stapel herangezogen. Ein positiver Wert gibt die direkte Position an, gerechnet von der untersten Karte des Stapels. 1 bedeutet also, dass die erste Karte geprüft wird. Negative Werte geben die Zählung von der obersten Karte gerechnet an. Dabei bedeutet -1, dass die oberste Karte geprüft wird (genauso wie wenn das Attribut ausgelassen wird.) Ist der Stapel kleiner als der angegebene Wert, schlägt der Vergleich fehl.
Normalerweise wird auf Gleichheit überprüft, jedoch kann mit dem optionalen Attribut beziehung auch getestet werden, ob der gesuchte Wert kleiner, kleinergleich, groesser, groessergleich oder ungleich dem im Tag-Inhalt angegebenen Wert ist.
Das zwingende Attribut typ bestimmt die Vergleichsform:
- summe: Die Kartenwerte werden addiert und mit dem Tag-Inhalt verglichen.
- differenz: Die Kartenwerte werden subtrahiert (feld1 - feld2) und mit dem Tag-Inhalt verglichen. Dabei wird
modulo 13
gerechnet; d. h. sowohl 7 - 4 als auch 2 - D ergeben denselben Wert 3.
- abstand: Der Abstand beider Werte, d. h. der Betrag der Differenz wird berechnet. Besitzt z. B. eine der Karten den Wert 3 und die andere den Wert D (egal in welcher Reihenfolge), dann ist der Abstand 9 (D - 3) oder 4 (3 - D); beide Angaben sind gleichbedeutend.
- farbe: Die Kartenfarbe werden verglichen. Der Tag-Inhalt gibt an, wie sich die Kartenfarben zueinander verhalten sollen. Sollen die Farben nicht identisch sein, ist die Angabe ungleich, wechsel (Farbfolge Schwarz-Rot oder Rot-Schwarz) und keinwechsel (Farbfolge Rot-Rot oder Schwarz-Schwarz) möglich.
- wert: Die Kartenwerte werden verglichen. Dabei spielt es nur eine Rolle, welcher Wert der größere bzw. kleinere ist. Der Tag-Inhalt gibt an, wie sich die Werte zueinander verhalten sollen. Möglich sind die Angaben kleiner, kleinergleich, gleich, groessergleich, groesser und ungleich. Wenn z. B. kleiner angegeben ist, dann muss der Wert von feld1 kleiner sein als der Wert von feld2.
Beachten Sie: Das Feld quelle nimmt das gesamte Feld in den Blick, von dem aus verschoben werden soll, nicht nur den zur Verschiebung vorgesehenen Teilstapel. @legestapel enthält dagegen nur die Karten, die verschoben werden sollen. Um zu prüfen, ob die hinterste Karte eines zu verschiebenden Stapels auf den Zielstapel passt, bietet sich die Verwendung von @legestapel an; siehe dazu auch Beispiel 7.
Änderungen
Eine bestimmte Feldeigenschaft wird geändert. Das zwingende Attribut feld gibt eine durch Leerzeichen getrennte Liste an Feld-IDs an, die geändert werden sollen. Die zu ändernde Eigenschaft wird im zwingenden Attribut tag angegeben, der neue Wert im Inhalt des Tags.
- Es können weitgehend dieselben Eigenschaften geändert werden, die man auch als Bedingung abfragen kann. Ein paar Eigenschaften können jedoch nicht geändert werden: id, kartenzahl, legezahl und karte.
- Ebenfalls geändert werden kann der Status einer (Schieb-)Sperre oder Anzeige. Das Attribut tag enthält dann einen der Werte sperre, schiebsperre oder anzeige. Außerdem wird zusätzlich das Attribut id benötigt, welches die in der Feld-Definition angegebene ID des zu ändernden Elements enthält. Als Tag-Inhalt ist nur einer der beiden Werte aktiv oder inaktiv möglich.
- Statt einer Eigenschaft kann auch sortieren angegeben werden. Der Tag-Inhalt muss dann einen der beiden Werte mischen oder umdrehen beinhalten. Im ersten Fall wird der angegebene Stapel gemischt, im zweiten Fall die Kartenfolge umgedreht (rückwärts gelegt).
Zahlenwerte (z. B. bei
wiederholung oder
var) können auch mit einem + oder - beginnen. Dann wird der neue Wert nicht auf die angegebene Zahl gesetzt, sondern die Zahl stattdessen zum bisherigen Wert addiert bzw. von ihm subtrahiert. Auf diese Weise kann beispielsweise die Anzahl der noch verfügbaren Wiederholungen um 1 reduziert werden.
Enthält das optionale Attribut opt den Wert tausch, dann gibt der Tag-Inhalt nicht die zu ändernde Feldeigenschaft an, sondern eine weitere ID-Liste. Der Eigenschaftswert beider Felder wird dann vertauscht. Die Vertauschung ist für einige Eigenschaften nicht einsetzbar (z. B. sperre).
Als betroffenes Feld sind wieder die Angaben quelle und ziel möglich. In diesem Fall ist noch ein weiteres Attribut ziel erlaubt. Wird hier id angegeben, dann ist nicht nur das Quell- bzw. Zielfeld von der Änderung betroffen, sondern auch jedes Feld, das dieselbe ID besitzt.
Für die Änderung eines Kartenwertes oder einer Kartenfarbe (z. B. startfarbe oder folgeende) besteht auch die Möglichkeit, den neuen Wert vom Wert der Quell- oder Zielkarte abhängig zu machen. Dazu dienen die Angaben zielwert, zielfarbe, quellwert und quellfarbe; Kombinationen sind nicht möglich. Die Zielkarte ist beim legen die Karte, auf die verschoben wurde, und ansonsten die angeklickte Karte. Die Quellkarte ist beim legen die verschobene Karte.
Karten legen
Mit lege werden eine oder mehrere Karten von einem Stapel auf einen anderen gelegt. Die Anweisung besitzt eine Reihe von Attributen, von denen fast alle optional sind.
- feld muss angegeben werden und enthält eine Liste von Feld-IDs, von denen aus gelegt werden soll; auch quelle und ziel ist erlaubt.
Achtung: Analog zu den Stock-Tags quelle und ziel werden die von einer ID-Liste betroffenen Felder nicht in der Reihenfolge der angegebenen IDs behandelt, sondern in der Reihenfolge, in der sie in der Datei definiert wurden. Wenn Sie eine bestimmte, davon abweichende Reihenfolge wünschen, können Sie stattdessen mehrere lege-Tags verwenden.
- Besitzt feld den Inhalt quelle oder ziel, dann kann im Attribut ziel wieder id angegeben werden, um gleichzeitig auch von allen Feldern mit derselben ID wie das Quell- bzw. Zielfeld zu legen.
- Das optionale Attribut anz gibt an, wie viele Karten gelegt werden sollen. Wird es ausgelassen, werden alle Karten ab startpos gelegt (wird auch startpos ausgelassen, dann wird eine einzelne Karte gelegt). Als Anzahl kann angegeben werden:
- eine Zahl: Diese gibt die Anzahl der zu legenden Karten an.
- legezahl: Es werden so viele Karten gelegt, wie der Spieler zum Auslösen der Aktion verschoben hat.
- offen: Es werden alle offen liegenden Karten gelegt (aber mindestens eine). Die Angabe von startpos wird ignoriert.
- folge: Es werden alle in korrekter Folge liegenden Karten gelegt (u. a. beeinflusst von folgeschieb). Die Angabe von startpos wird ignoriert.
Da höchstens so viele Karten gelegt werden können, wie zur Verfügung stehen, kann im Zusammenspiel mit startpos die Anzahl der tatsächlich gelegten Karten vom angegebenen Wert abweichen.
- Die optionalen Attribut startpos und zielpos geben die Positionen an, von der ab die Karten entnommen bzw. an welche die Karten angelegt werden.
- Positive Werte geben die direkte Position an, gerechnet von der untersten Karte des Stapels. 1 bedeutet, dass die erste Karte (und evtl. weitere) verschoben wird bzw. dass die Karten ab der ersten Stelle zu liegen kommen.
- Negative Werte geben die Zählung von der obersten Karte gerechnet an. Dabei bedeutet -1, dass die oberste Karte verschoben wird bzw. dass unter die oberste Karte gelegt wird (das Ziel ist also die Stelle, die zuvor von der obersten Karte belegt war).
- Wird startpos ausgelassen, dann berechnet sich die Startposition von der obersten Karte aus durch die Anzahl der verschobenen Karten (siehe anz). Wird zielpos ausgelassen, dann wird auf die oberste Karte gelegt.
- In zielpos ist auch die Angabe zufall erlaubt, um die Karte an einer zufälligen Stelle einzuschieben. Werden mehrere Karten gemeinsam verschoben, dann kommen diese auch hintereinander zu liegen. Wenn Sie mehrere Karten in einen anderen Stapel mischen wollen, müssen Sie jede Karte einzeln verschieben.
- Das optionale Attribut richtung kann den Wert rueckwaerts enthalten. In diesem Fall werden die Karten in umgekehrter Reihenfolge gelegt.
- Wird das Attribut umschichten angegeben, dann wird in Abhängigkeit von der Kartenzahl beider betroffenen Stapel gelegt. umschichten kann den Wert auf beinhalten, womit nur gelegt wird, wenn die Kartenzahl des Zielstapels anschließend größer ist als die des Quellstapels. Wird ab angegeben, dann wird gelegt, wenn die Kartenzahl des Zielstapels vor dem Legen kleiner ist als die des Quellstapels.
- Das optionale Attribut opt gibt genauere Anweisungen für das Legen an.
- Der Wert tausch legt fest, dass die beiden obersten Karten der angegebenen Stapel vertauscht werden. Dies funktioniert nur als direkter Austausch zwischen zwei Feldern. Werden mehrere Felder angegeben (durch eine ID-Liste oder eine mehrfach vergebene ID), dann wird nur das erste gefundene Ergebnis berücksichtigt.
- Enthält opt den Wert erlaubt, dann wird nur gelegt, wenn das Legen regelgerecht durchgeführt werden kann.
- Die Angabe einmal bestimmt, dass bei mehreren Legemöglichkeiten nur einmal gelegt wird. Dies kann eingesetzt werden, wenn als Ziel mehrere Feld-IDs oder eine mehrfach vorhandene Feld-ID angegeben wird und nur auf das erste mögliche Feld mit dieser ID gelegt werden soll.
- Die Werte können, mit Komma getrennt, kombiniert werden: erlaubt,einmal gibt an, dass auf das erste Feld gelegt wird, das die richtige ID besitzt und auf das regelkonform gelegt werden kann. Weitere Felder werden ignoriert.
- animation legt fest, dass das Legen animiert werden soll.
- Der Tag-Inhalt ja bedeutet, dass eine Animation stattfindet. Verdeckt liegende Karten sind auch bei der Animation verdeckt, offen liegende sind auch bei der Animation offen. Entscheidend ist der Zustand vor dem Legen, nicht der Zustand danach (siehe typ).
- offen erzeugt eine Animation mit offenen Karten, unabhängig davon, ob die gelegten Karten offen oder verdeckt liegen.
- verdeckt erzeugt analog dazu eine Animation mit verdeckten Karten, unabhängig davon, ob die gelegten Karten offen oder verdeckt liegen.
Die Angabe überschreibt aber nicht die Benutzereinstellungen – wenn die Animationen vom Benutzer deaktiviert wurden, werden sie auch nicht angezeigt.
- typ legt fest, ob die gelegten Karten anschließend offen oder verdeckt liegen. Wird das Attribut ausgelassen, dann werden die Karten in dem Zustand gelegt, in dem sie sich vorher befanden.
Beachten Sie: Wenn die oberste Karte eines Stapels verdeckt liegt, ist sie vom Spieler nicht regulär nutzbar (vom Stock und von Aktionen abgesehen).
- Der Inhalt des Tags gibt das Feld an, auf das gelegt werden soll. Hier ist nur eine einzige Angabe möglich, auch quelle und ziel.
Wie viele und welche Karten genau gelegt werden, hängt vom Zusammenspiel von anz, startpos und eventuell auch zielpos. Wird weder anz noch startpos angegeben, dann wird die oberste Karte des Stapels gelegt. Bei Verwendung von anz (ohne startpos) werden von der obersten Karte aus gerechnet so viele Karten gelegt wie angegeben. Bei Verwendung von startpos (ohne anz) werden alle Karten ab der angegebenen Position gelegt.
Bei Verwendung beider Attribute hat startpos Vorrang vor anz: Es werden von der angegebenen Position aus gerechnet höchstens die angegebene Zahl an Karten gelegt – besitzt der Stapel nicht ausreichend Karten, so werden weniger gelegt. Noch etwas komplizierter ist die Kombination von anz, startpos und zielpos in der Kombination mit opt="tausch". anz und startpos legen hier die Zahl der Karten fest, die vom ersten Stapel auf den zweiten gelegt werden. Genauso viele Karten werden dann auch vom zweiten Stapel an den ersten zurückgegeben, sofern dort genügend Karten zur Verfügung stehen. Ansonsten ist die zurückgegebene Menge kleiner als die erhaltene.
Beziehungen zwischen Feldern
In der Felddefinition können Beziehungen zwischen den einzelnen Feldern hergestellt und anschließend in den Aktionen verwendet werden. Eine Kette von Beziehungen könnte beispielsweise folgendermaßen aussehen:
<feld id="erstesFeld" x="2" y="2" typ="stapel">
</feld>
<feld id="zweitesFeld" x="6" y="2" typ="stapel">
<beziehung id="vorher">erstesFeld</beziehung>
</feld>
<feld id="drittesFeld" x="10" y="2" typ="stapel">
<beziehung id="vorher">zweitesFeld</beziehung>
</feld>
In einer Aktion kann nun statt einer Feld-ID auch ein Verknüpfung zu einem anderen Feld angegeben werden. Dazu folgt auf den Feldnamen ein Doppelkreuz # und die Bezeichnung der Verknüpfung. Sinnvoll ist dies besonders in Zusammenhang mit den Angaben quelle und ziel, da in allen anderen Fällen der gewüschte Stapel auch direkt angegeben werden könnte.
<aktion typ="klick">
<lege feld="ziel">ziel#vorher</lege>
</aktion>
legt bei einem Klick eine Karte auf den Stapel, der mit der Verknüpfung vorher angegeben wurde. Ein Klick auf zweitesFeld würde also auf erstesFeld legen, ein Klick auf drittesFeld würde auf zweitesFeld legen. Es ist auch möglich, auf einen Link des verlinkten Feldes zuzugreifen:
<aktion typ="klick">
<lege feld="ziel">ziel#vorher#vorher</lege>
</aktion>
Ein Klick auf drittesFeld legt damit auf den Vorgänger des Vorgängers, also auf erstesFeld.
Beziehungen müssen innerhalb eines Feldes eindeutig sein, d. h. ein Feld kann nicht zwei verschiedene Beziehungen gleichen Namens besitzen. Die angegebene Feld-ID des Bezugsfeldes muss dagegen nicht eindeutig sein. Auf obiges Beispiel bezogen: Es kann für jedes Feld nur eine einzige Beziehung vorher definiert werden; diese Feld-ID kann jedoch zu mehreren Feldern gehören. Wenn Sie für ein Feld mehrere „Vorgänger“ (mit unterschiedlicher Feld-ID) benötigen, müssen Sie mit mehreren verschiedennamigen Beziehungen arbeiten.
Beachten Sie außerdem, dass ein zu exzessiver Gebrauch von Verknüpfungen die Performance des Programms negativ beeinträchtigen kann.
Setzen globaler Parameter
setze erlaubt es, bestimmte globale Einstellungen vorzunehmen, die nicht an ein bestimmtes Feld gebunden sind. Das zwingende Attribut id gibt an, welche Einstellung betroffen ist; der Tag-Inhalt enthält den neu zu setzenden Wert.
- quelle: setzt das Feld, das ab sofort (bis zum Abarbeiten aller Aktionen) als Quelle des Legevorgangs behandelt wird. Der weitere Aktionsverlauf sowie alle in einer anschließenden Fortsetzung noch durchgeführten Aktionen agieren so, als ob von dem Feld aus gelegt worden wäre, das als neuer Wert angegeben wurde.
Beachten Sie: Wenn die angegebene Feld-ID nicht eindeutig ist, wird nur das erste zutreffende Feld als neue Quelle behandelt.
- ziel: setzt das Feld, das ab sofort (bis zum Abarbeiten aller Aktionen) als Ziel des Legevorgangs oder des Mausklicks behandelt wird. ziel funktioniert analog zu quelle.
- menu: setzt den Text, der an der Stelle des Menüs angezeigt wird (maximal bis zum Abarbeiten aller Aktionen). Der neue Text ist allerdings auf vier Zeichen beschränkt; weitere Zeichen werden ignoriert. Dieses Tag kann beispielsweise genutzt werden, um bei einem länger andauernden Aktionslauf den Menütext zu
AUTO
zu ändern, um dem Benutzer dadurch zu signalisieren, dass gerade automatisierte Spielzüge stattfinden.
Spezielle Anweisungen
warte hält die Spielausführung an. Der Tag-Inhalt gibt die Anzahl der Millisekunden an, welche das Spiel pausiert wird. Der Befehl kann beispielsweise bei einer Abfolge mehrerer Anweisungen verwendet werden, wenn der Spieler diese mitverfolgen können soll.
meldung gibt eine Meldung aus und wartet so lange, bis sie vom Spieler bestätigt wurde. Der Tag-Inhalt enthält die auszugebende Meldung; dabei können mehrere Zeilen durch den Zeilenumbruch \n
getrennt werden. Mit dem optionalen Attribut antwort kann die Beschriftung der Antwortbuttons festgelegt werden; die einzelnen Buttons werden wiederum durch \n
getrennt. Wird es ausgelassen, dann wird ein einzelnes Button mit dem Inhalt OK
verwendet. Das ebenfalls optionale Attribut feld enthält die ID eines Feldes, in dessen Variable var die Nummer des betätigten Buttons gespeichert wird, beginnend mit 1
für den Button ganz links. Meldeboxen können bis zu fünf Meldungszeilen und bis zu drei Antwortbuttons enthalten.
sound ermöglicht die Ausgabe ein oder mehrerer Soundeffekte sowie die Unterdrückung des Soundeffekts. Üblicherweise wird am Ende jeder Aktion, die das lege-Tag beinhaltet, der Sound zum Kartenlegen abgespielt. Dieses Verhalten kann unerwüscht sein, wenn z. B. mehrere Karten nacheinander mit Soundeffekt gelegt werden sollen oder das Aufnehmen des Stocks simuliert werden soll. Folgende Angaben sind als Tag-Inhalt möglich:
- legen: gibt den Soundeffekt des Kartenlegens aus.
- mischen: gibt den Soundeffekt des Kartenmischens (Stockaufnahme) aus.
- nein: unterdrückt die reguläre Soundausgabe; nur sinnvoll, wenn in derselben Aktion keine weiteren sound-Tags verwendet werden.
spielende beendet das Spiel. Der Tag-Inhalt enthält einen der Werte sieg oder verlust und gibt an, ob das Spiel vom Verwaltungsprogramm als gewonnenes oder verlorenes Spiel gewertet werden soll. Das Tag kann auch bei der Abarbeitung der End-Aktionen verwendet werden; dadurch ist es möglich, ein abgebrochenes Spiel unter bestimmten Bedingungen als Sieg zu werten oder trotz erreichter Maximalpunktzahl ein verlorenes Spiel zu erhalten.
Fortsetzung
Das Tag erfolg kann einen der Werte anfang, naechste, wiederholung, ende oder die ID einer anderen Aktion enthalten. Damit wird festgelegt, wie nach der erfolgreichen Durchführung einer Aktion weiter verfahren wird. Das Programm kann angewiesen werden, in diesem Fall den Durchlauf wieder von vorn zu starten (anfang), dieselbe Aktion ein weiteres Mal zu prüfen (wiederholung) oder mit der nächsten Aktion in der Liste fortzufahren (naechste). Wird keiner dieser Werte und auch keine gültige Aktions-ID angegeben, dann wird der Durchlauf nach erfolgreicher Durchführung beendet (entspricht ende).
Das Tag misserfolg arbeitet ähnlich, nur dass hier angegeben wird, wie der Durchlauf fortgesetzt werden soll, wenn die Ausführung nicht erfolgreich war. Es können fast dieselben Werte wie unter erfolg angegeben werden. Nur die Angabe wiederholung ist nicht möglich, da dies unweigerlich zu einer Endlosschleife führen würde. Wird nichts oder eine ungültige ID angegeben, dann wird bei Misserfolg mit der nächsten Aktion fortgefahren (entspricht naechste).
Beispiele
Die Aktionen werden vor der regulären Verschiebung durchgeführt, und zwar in der angegebenen Reihenfolge. Das bedeutet: Kann auf einem Feld auf- oder abgebaut werden, und gibt es gleichzeitig eine Regelung für eine (oder mehrere) Aktionen, dann wird die erste passende Aktion durchgeführt und die Verschiebung übergangen.
Beispiel 1: Die vordersten Karten der beiden Stapel können entfernt werden, wenn sie denselben Wert besitzen.
<feld id="abwurf" x="-1" y="-1" typ="abwurf">
</feld>
<feld id="feld" x="2" y="2" typ="stapel">
<richtung>unten</richtung>
<lege typ="offen" quelle="stock" anz="13">frei</lege>
</feld>
<feld id="feld2" x="8" y="2" typ="stapel">
<richtung>unten</richtung>
<lege typ="offen" quelle="stock" anz="13">frei</lege>
</feld>
<aktion typ="legen">
<vergleich feld1="quelle" feld2="ziel" typ="abstand">0</vergleich>
<lege feld="quelle">abwurf</lege>
<lege feld="ziel">abwurf</lege>
</aktion>
Beispiel 2: Bei manchen Spielen (z. B. die Spinne) können nur komplette Reihen von 13 Karten auf den Grundkartenstapel gelegt werden. Dazu wird eine Legeaktion auf die Grundkartenstapel abgefangen, sofern weniger als 13 Karten verschoben werden sollen. Die Aktion hat keine Auswirkung außer diejenige, dass kein normales Legen stattfindet.
<aktion typ="legen">
<bedingung feld="ziel" tag="id">g</bedingung>
<bedingung feld="ziel" tag="legezahl" beziehung="kleiner">13</bedingung>
</aktion>
Beispiel 3: Das Tag sperre erlaubt das Sperren eines Stapels bspw. dann, wenn mindestens eines der angegebenen Felder belegt ist. Soll die Sperre nur wirksam sein, wenn alle Felder belegt sind, dann kann dazu auf eine Aktion zurückgegriffen werden. Eine Karte im Keller des folgenden Beispiels ist erst verfügbar, wenn einer der beiden Sperrstapel leer ist. Wieder wird dazu lediglich das normale Legen unterbunden.
<aktion typ="legen">
<bedingung feld="quelle" tag="id">keller</bedingung>
<bedingung feld="sperrfeld1" tag="kartenzahl" beziehung="groesser">0</bedingung>
<bedingung feld="sperrfeld2" tag="kartenzahl" beziehung="groesser">0</bedingung>
</aktion>
Beispiel 4: Zusätzlich zu einer bereits in der Felddefinition angegeben Legefolge (z. B. gleichfarbig abwärts) soll eine weitere Legefolge erlaubt sein (hier: gleicher Wert). Dazu muss die erste (also hinterste) Karte des Pseudostapels @legestapel mit der obersten Karte des Zielfeldes verglichen werden.
<aktion typ="legen">
<vergleich feld1="@legestapel" feld2="ziel" karte1="1" typ="wert">gleich</vergleich>
<lege feld="quelle" anz="legezahl">ziel</lege>
</aktion>
Beispiel 5: In einem Kartenset mit 32 Karten soll das Legen einer 7 auf ein gleichfarbiges Ass ermöglicht werden. Dazu wird wieder die erste Karte des Pseudostapels @legestapel mit der obersten Karte des Zielstapels verglichen.
<aktion typ="legen">
<bedingung feld="@legestapel" tag="karte" karte="1">7</bedingung>
<bedingung feld="ziel" tag="karte">A</bedingung>
<vergleich feld1="@legestapel" feld2="ziel" karte1="1" typ="farbe">gleich</vergleich>
<lege feld="quelle" anz="legezahl">ziel</lege>
</aktion>
Beispiel 6: Nach dem Legen durch den Spieler werden alle Stapel mit der ID hilf so umgeschichtet, dass möglichst kleine oder sogar leere Stapel entstehen; die Karten werden also auf wenige Stapel konzentriert. Die Aktion wird so lange wiederholt, wie sie erfolgreich durchgeführt werden kann.
<abschluss typ="frei">
<bedingung feld="hilf" tag="legbar" umschichten="auf">hilf</bedingung>
<lege feld="hilf" umschichten="auf" opt="erlaubt">hilf</lege>
<erfolg>wiederholung</erfolg>
</aktion>
Beispiel 7: Verdeckt liegende Karten stehen für den Spieler nicht zur Verfügung. Soll es dem Spieler möglich sein, verdeckt liegende Karten mit einem Mausklick aufzudecken, so kann das mit einer Aktion umgesetzt werden. (Das Beispiel ist etwas älter – inzwischen lässt sich dieses Verhalten auch direkt durch das Feld-Tag aufdecken umsetzen.)
<aktion typ="klick">
<bedingung feld="ziel" tag="status">verdeckt</bedingung>
<aenderung feld="ziel" tag="status">offen</aenderung>
</aktion>