Introduction to Macro Writing/de: Difference between revisions

From RPTools Wiki
Jump to navigation Jump to search
(wieder etwas weiter übersetzt)
mNo edit summary
 
(13 intermediate revisions by the same user not shown)
Line 2: Line 2:
[[Category:MapTool]][[Category:Tutorial]]{{Beginner}}
[[Category:MapTool]][[Category:Tutorial]]{{Beginner}}


==Das Einzig Wirklich Wichtige hier: Code Syntax ==
==Das wirklich Wichtige hier: Code Syntax ==
Wenn du bisher nie Code geschrieben hast, wird das nun Folgende erst einmal KEINEN Sinn für dich machen (aber ''lies weiter''). Hier findest du die wichtigsten Grundlagen zu  (MT-)Makros in MapTool. Wenn du am Ende dieses (recht langen) Textes angekommen bist, kommwieder hierher und lies noch einmal.. Wenn du dann deinen ersten Code geschrieben hast, komm nochmal her und lies wieder. Dann wird das hier Gelesene immer mehr Sinn machen bis du irgendwann irgendwann komplett durchblickst ("Heureka"). Dann wirst du verstehen, warum das hier er wichtigste Teil des Wikis ist. :D Gutes Gelingen.
Wenn du bisher nie Code geschrieben hast, wird das nun Folgende erst einmal KEINEN Sinn für dich machen (aber ''lies weiter''). Hier findest du die wichtigsten Grundlagen zu  (MT-)Makros in MapTool. Wenn du am Ende dieses (recht langen) Textes angekommen bist, komm wieder hierher und lies den Text noch einmal. Wenn du dann deinen ersten Code geschrieben hast, komm hierher und lies wieder. Dann wird das hier Gelesene jedesmal mehr Sinn machen bis du irgendwann komplett durchblickst ("Heureka"). Dann wirst du verstehen, warum das hier er wichtigste Teil des Wikis ist. :D Gutes Gelingen.


Wenn du dich mit dem Coden auskennst und du das hier auf Anhieb verstehst, wirst du gleich verstehen, warum das hier der wichtigste Teil des Wikis ist.
Wenn du dich mit dem Coden auskennst und du das hier auf Anhieb verstehst, wirst du wissen, warum das hier der wichtigste Teil des Wikis ist.


Wie immer bei Code gibt es eine Syntax, an die du dich halten musst. ''ALLE Maptool Skript-/Codezeilen bestehen aus 0 oder mehr Optionen und einer Funktion bzw. einem Ausdruck'' (mit einer Ausnahme: {{roll|code}}).  
Wie immer bei Code gibt es eine Syntax, an die du dich halten musst. ''ALLE Maptool Skript-/Codezeilen bestehen aus 0 oder mehr Optionen und einer Funktion bzw. einem Ausdruck'' (mit einer Ausnahme: {{roll|code}}).  
Ein paar Begriffserklärungen:


Eine '''Option''' ist etwas, was die Ausgabe im Chatfenster beeinflusst, zum Beispiel:
Eine '''Option''' ist etwas, was die Ausgabe im Chatfenster beeinflusst, zum Beispiel:
*Die Option {{roll|h}} versteckt (engl. hide) die Ausgabe des Ergebnisses der Funktion  
*Die Option {{roll|h}} versteckt (engl. hidden) die Ausgabe des Ergebnisses der Funktion  
*Die Option {{roll|r}} zeigt nur das Ergebnis (engl. result)  
*Die Option {{roll|r}} zeigt nur das Ergebnis (engl. result)  
*Die Option {{roll|if}} zeigt nur das eine oder andere Ergebnis anzeigen (abhängig davon, wie die Prüfung ausfällt)
*Die Option {{roll|if}} zeigt nur das eine oder andere Ergebnis (abhängig davon, wie die Prüfung ausfällt)
Wenn es keine Optionen gibt, wird die gesamte Ausführung der Funktion im Chat ausgegeben.
Wenn es keine Optionen gibt, wird die gesamte Ausführung der Funktion im Chat ausgegeben.


Line 20: Line 22:


Eine '''Funktion''' ist etwas, das ein Ergebnis zurückliefert. Du hast also einen Ausgangswert (oder mehrere) und wendest darauf eine Funktion an, um ein Ergebnis zu bekommen. Das Ergebnis entsteht also aus dem Ausgangswert, indem er von der Funktion verarbeitet wird. Beispiele:  
Eine '''Funktion''' ist etwas, das ein Ergebnis zurückliefert. Du hast also einen Ausgangswert (oder mehrere) und wendest darauf eine Funktion an, um ein Ergebnis zu bekommen. Das Ergebnis entsteht also aus dem Ausgangswert, indem er von der Funktion verarbeitet wird. Beispiele:  
*Die Funktion {{func|abs}} gibt den positiven Wert einer Zahl (=Ausagangswert), indem es das Minuszeichen entfernt, sofern eins vorhanden war. {{code|abs(-3)}} ergibt also 3. Der Ausgangswert ist -3 und das Ergebnis ist 3.
*Die Funktion {{func|abs}} gibt den positiven Wert einer Zahl (=Ausgangswert), indem es das Minuszeichen entfernt, sofern eins vorhanden war. {{code|abs(-3)}} ergibt also 3. Der Ausgangswert ist -3 und das Ergebnis ist 3.
*Die Funktion {{func|if}} (es gibt sowohl eine ''Option'' {{roll|if}}als auch eine ''Funktion'' {{func|if}}) erhält zwei Ausgangswerte und eine Bedingung. Sie gibt den ersten Ausgangswert (oder eine Berechnung daraus) zurück, wenn die Bedingung wahr ist oder entsprechend den zweiten Wert (oder die Berechnung mit dem zweiten Wert), wenn die Bedingung falsch ist. Die Funktion {{code|if(0,"Black", "White")}}  gibt also "White" zurück, da der Rechner "0" also falsch interpretiert. '''Anmerkung''': Da dies eine Funktion ist, werden beide möglichen Ergebnisse berechnet aber nur eins von beiden wird zurückgegeben.
*Die Funktion {{func|if}} (es gibt sowohl eine ''Option'' {{roll|if}} als auch eine ''Funktion'' {{func|if}}) erhält zwei Ausgangswerte und eine Bedingung. Sie gibt den ersten Ausgangswert (oder eine Berechnung daraus) zurück, wenn die Bedingung wahr ist oder entsprechend den zweiten Wert (oder die Berechnung mit dem zweiten Wert), wenn die Bedingung falsch ist. Die Funktion {{code|if(0,"Black", "White")}}  gibt "White" zurück, da der Rechner "0" als falsch interpretiert. '''Anmerkung''': Da dies eine Funktion ist, werden beide möglichen Ergebnisse berechnet aber nur eins von beiden wird zurückgegeben.


===Aufbau von [[:Category:Macro_Function|Funktionen]]===
===Aufbau von [[:Category:Macro_Function|Funktionen]]===
Line 41: Line 43:
   die Aussage ist falsch
   die Aussage ist falsch
    
    
Beachte, dass JEDES Skript mit einer eckigen Klammer "[" beginnt und endet "]". Wenn Optionen verwendet werden, werden sie immer durch EINEN Doppelpunkt ":" von der Funktion getrennt. Wenn du mehr als eine Option verwenden möchtest, werden diese durch Kommata "," getrennt. Es gibt <b title="Für die Erbsenzähler: Ja, es gibt Ausnahmen wie ''switch'', ''code roll option'' ''strings''.">NIE</b> mehr als EINE von diesen drei ("[", "]" and ":") Zeichenin einer Skriptaussage. Alles AUSSERHALB der beiden Klammern "[" "]" ist Klartext (oder HTML) und KEIN Code, egal was darin steht. Dieser Klar- oder HTML-Text wird <b title="Für die Erbsenzähler: Ja, es gibt wieder Ausnahmen wie ''ignore output in UDF'' und die Verwendung von ''abort(0)''.">IMMER</b> unverändert im Chatfenster erscheinen und kann nicht durch Code beeinflusst werden.
Beachte, dass JEDES Skript (also der Makrocode) mit einer eckigen Klammer "[" beginnt und endet "]". Wenn Optionen verwendet werden, werden sie immer durch EINEN Doppelpunkt ":" von der Funktion getrennt. Wenn du mehr als eine Option verwenden möchtest, werden diese durch Kommata "," getrennt. Es gibt <b title="Für die Erbsenzähler: Ja, es gibt Ausnahmen wie ''switch'', ''code roll option'' ''strings''.">NIE</b> mehr als EINE von diesen drei ("[", "]" und ":") Zeichen in einer Skriptaussage. Alles AUSSERHALB der beiden Klammern "[" und "]" ist Klartext (oder HTML) und KEIN Code, egal was darin steht. Dieser Klar- oder HTML-Text wird <b title="Für die Erbsenzähler: Ja, es gibt wieder Ausnahmen wie ''ignore output in UDF'' und die Verwendung von ''abort(0)''.">IMMER</b> unverändert im Chatfenster erscheinen und kann nicht durch Code beeinflusst werden.


Wie gesagt, mag das jetzt keinen Sinn ergeben haben. Schreib es auf einen Zettel, pinne ihn dir irgendwohin und lies es hin und wieder. Es wird Sinn machen!
Wie gesagt, mag das jetzt keinen Sinn ergeben haben. Schreib es auf einen Zettel, pinne ihn dir irgendwohin und lies es hin und wieder. Es wird Sinn machen!
Line 48: Line 50:
Eine weitere häufige Panne ist für Anfänger die Behandlung von Zeichenketten gegenüber Variablen. Wenn der vorige Satz dir nichts erklärt, dann sieh dir den folgenden Code an:
Eine weitere häufige Panne ist für Anfänger die Behandlung von Zeichenketten gegenüber Variablen. Wenn der vorige Satz dir nichts erklärt, dann sieh dir den folgenden Code an:
   [variable = "String"]
   [variable = "String"]
Eine Variable ist ein Gefäß in dem man irgendetwas aufbewahren kann. Eine Zeichenkette ("String") ist ein Stück Text (der aus Buchstaben, Ziffern und Satzzeichen besteht), der in Anführungszeichen eingeschlossen ist. Das können einfache oder doppelte (Gänsefüßchen) sein. Beachte, das du auch eine Zahl (z.B. 50) in eine Variable packen kannst. Zahlen unterscheiden sich von Zahlenzeichenketten durch die fehlenden Anführungszeichen. Aus diesem Grund kann eine Variable nicht mit einer Zahl beginnen! (MapTool wäre sehr verwirrt.) Beispiele:
Eine Variable ist ein Gefäß in dem man irgendetwas aufbewahren kann. Eine Zeichenkette ("String") ist ein Stück Text (der aus Buchstaben, Ziffern und Satzzeichen besteht), der in Anführungszeichen eingeschlossen ist. Das können einfache oder doppelte (Gänsefüßchen) sein. Beachte, das du auch eine Zahl (z.B. 50) in eine Variable packen kannst. Zahlen unterscheiden sich von Zahlen-Zeichenketten durch die fehlenden Anführungszeichen. Aus diesem Grund kann eine Variable nicht mit einer Zahl beginnen! (MapTool wäre sehr verwirrt.) Beispiele:
   FALSCH: [42Variable = "Hello World"] (Es kann wirklich seltsamer Kram passieren, wenn du sowas schreibst)
   FALSCH: [42Variable = "Hello World"] (Es kann wirklich seltsamer Kram passieren, wenn du sowas schreibst)
   RICHTIG: [Variable42 = "Hello World"]
   RICHTIG: [Variable42 = "Hello World"]
Beachte: Code ist alles IN den [Klammern]; außerhalb ist alles einfacher Text.  Es ist egal, ob dort etwas in Anführungszeichen steht oder nicht: Es ist Text.
Beachte: Code ist alles IN den [Klammern]; außerhalb ist alles einfacher Text.  Es ist egal, ob dort etwas in Anführungszeichen steht oder nicht: Es ist Text.


Auch wichtig zu unterscheiden ist, dass der Wert einer Variable eine Zahl oder ein Text sein kann:
Achte darauf, dass der Wert einer Variable eine Zahl oder ein Text sein kann:
   [variable = 42] 42 als Zahl gespeichert
   [variable = 42] 42 als Zahl gespeichert
   [variable = "42"] 42 als Text gespeichert
   [variable = "42"] 42 als Text gespeichert
Aber... (und das kann wirklich richtig nerven) sobald eine Zeichenkette, die nur aus Ziffern besteht, in einer Aussage verwendet wird, wird sie automatisch in eine Zahl konvertiert!! Das kann für viel Verwissung sorgen.  
Aber... (und das kann wirklich richtig nerven) sobald eine Zeichenkette, die nur aus Ziffern besteht, in einer Aussage verwendet wird, wird sie automatisch in eine Zahl konvertiert!! Das kann für viel Verwirrung sorgen.  
Hier der Grund:
Hier der Grund:
   [x = 21 + 21] speichert die Zahl 42 in der Variable x
   [x = 21 + 21] speichert die Zahl 42 in der Variable x
Line 93: Line 95:
:'''Angriffswurf''': <font color="blue">« Wurf + Bonus = 18 + 9 = 27 »</font> gegen AC
:'''Angriffswurf''': <font color="blue">« Wurf + Bonus = 18 + 9 = 27 »</font> gegen AC


Ein bißchen hässlich, aber nicht schlimm. Bei schwierigeren Aufgaben eines Makros kann das dann aber anders aussehen:
Ein bisschen hässlich, aber nicht schlimm. Bei schwierigeren Aufgaben eines Makros kann das dann aber anders aussehen:


:'''Giftwolke''' gegen: <font color="blue">« angriff = 1d20+angriffBonus = angriff = (4 + 7) = 11 » « schaden = 1d6 + 2 = schaden = (5 + 2) = 7 »</font> Ziel 0: Angriff 11; <font color="blue">« schaden = 7 » schaden. « angriff = 1d20+anngriffBonus = angriff = (14 + 7) = 21 » « schaden = 1d6 + 2 = schaden = (3 + 2) = 5 »</font> Ziel 1: Angriff 21; <font color="blue">« schaden = 5 » schaden. « angriff = 1d20+angriffBonus = angriff = (6 + 7) = 13 » « schaden = 1d6 + 2 = schaden = (1 + 2) = 3 »</font> Ziel 2: Angriff 13; <font color="blue">« schaden = 3 »</font> schaden. <font color="blue">« angriff = 1d20+angriffBonus = angriff = (17 + 7) = 24 » « schaden = 1d6 + 2 = schaden = (2 + 2) = 4 »</font> Ziel 3: Angriff 24; <font color="blue">« schaden = 4 »</font> schaden.
:'''Giftwolke''' gegen: <font color="blue">« angriff = 1d20+angriffBonus = angriff = (4 + 7) = 11 » « schaden = 1d6 + 2 = schaden = (5 + 2) = 7 »</font> Ziel 0: Angriff 11; <font color="blue">« schaden = 7 » schaden. « angriff = 1d20+angriffBonus = angriff = (14 + 7) = 21 » « schaden = 1d6 + 2 = schaden = (3 + 2) = 5 »</font> Ziel 1: Angriff 21; <font color="blue">« schaden = 5 » schaden. « angriff = 1d20+angriffBonus = angriff = (6 + 7) = 13 » « schaden = 1d6 + 2 = schaden = (1 + 2) = 3 »</font> Ziel 2: Angriff 13; <font color="blue">« schaden = 3 »</font> schaden. <font color="blue">« angriff = 1d20+angriffBonus = angriff = (17 + 7) = 24 » « schaden = 1d6 + 2 = schaden = (2 + 2) = 4 »</font> Ziel 3: Angriff 24; <font color="blue">« schaden = 4 »</font> schaden.


Das ist wirklich nicht mehr lesbar und kaum zu verstehen.
Das ist wirklich nicht mehr lesbar und kaum zu verstehen.
Line 109: Line 111:
==Schreibweisen==
==Schreibweisen==


Ich werde versuchen, mich im Folgenden an diese Schreibweisen zu halten, um es verständlich zu halten:
Ich werde im Folgenden diese Schreibweisen verwenden, um es verständlich zu halten:


* '''Makro''' bezeichnet eine Reihe verknüpfter Kommandos, die eine bestimmte Aufgabe erledigen.
* '''Makro''' bezeichnet eine Reihe verknüpfter Anweisungen, die eine bestimmte Aufgabe erledigen.
* '''Makrokommando''' bezeichnet ein bestimmtes ''individuelles'' Kommando oder eine Funktion, die in einem Makro verwendet wird.
* '''Makroanweisung''' bezeichnet eine bestimmte ''individuelle'' Anweisung oder eine Funktion, die in einem Makro verwendet wird.
* '''Makro-Sprache''' bezeichnet die Gesamtheit aller Kommandos, Funktionen und Operationen, die in einem Makro verwendet werden können. Du findest eine große Sammlung in der [[:Category:Macro Function|Makrofunktionsliste]].
* '''Makro-Sprache''' bezeichnet die Gesamtheit aller Anweisungen, Funktionen und Operationen, die in einem Makro verwendet werden. Du findest eine große Sammlung in der [[:Category:Macro Function|Makrofunktionsliste]].


Auch wenn es möglich ist, in MapTool ein Makro aus dem anderen heraus anzustoßen (man nennt das "(auf)rufen" eines anderen Makros), werden wir in diesem Dokument Makros nur über Schaltflächen in den verschiedenen [[MapTool_User_Interface/de#Makro-Fenster|Makrofenstern]] starteen und sie wirken nur auf die Spielmarke, auf der sie aufgerufen werden.
Auch wenn es möglich ist, in MapTool ein Makro aus dem anderen heraus anzustoßen (man nennt das "(auf)rufen" eines anderen Makros), werden wir in diesem Dokument Makros nur über Schaltflächen in den verschiedenen [[MapTool_User_Interface/de#Makro-Fenster|Makrofenstern]] starten und sie wirken nur auf die Spielmarke, auf der sie aufgerufen werden.


==Warum soll ich die denn nutzen?==
==Warum soll ich Makros nutzen?==


Es ist nicht nötig, Makros in MapTool überhaupt zu nutzen. Der zentrale Zweck von MapTool ist es, Karten mit Freunden zu teilen und darauf zu spielen - all das, was in "[[Introduction to Mapping/de|Einführung ins Kartenzeichnen]]" und [[Introduction to Game Hosting/de|Hosten von Spielrunden]] beschrieben steht. MapTool stellt all das auch ohne Makros bereit: Karten, Spielmarken, einen Chat und Würfel.  
Es ist nicht nötig, Makros in MapTool überhaupt zu nutzen. Der zentrale Zweck von MapTool ist es, Karten mit Freunden zu teilen und zu spielen - all das, was in "[[Introduction to Mapping/de|Einführung ins Kartenzeichnen]]" und [[Introduction to Game Hosting/de|Hosten von Spielrunden]] beschrieben steht. MapTool stellt all das auch ohne Makros bereit: Karten, Spielmarken, einen Chat und Würfel.  


Trotzdem kann man noch viel mehr mit MapTool anstellen. Beispielsweise gibt es in vielen Spielen Situationen, wo man würfelt und einen Bonus addiert oder von einem anderen Wert abzieht. Solche Dinge kommen bei manchen Spielen sehr häufig vor und man kann sie mit Makros automatisieren. Makros sind wie Taschenrechner: Man muss sie nicht nutzen... es ist aber praktisch.  
Trotzdem kann man viel mehr mit MapTool anstellen. Beispielsweise gibt es in vielen Spielen Situationen, wo man würfelt und einen Bonus addiert oder von einem anderen Wert abzieht. Solche Dinge kommen bei manchen Spielen sehr häufig vor und man kann sie mit Makros automatisieren. Makros sind wie Taschenrechner: Man muss sie nicht nutzen... es ist nur praktisch.  
Im Folgenden wird erklärt, wie man ins Thema einsteigen kann...
Im Folgenden wird erklärt, wie man ins Thema einsteigen kann...


==Wo sind diese sogenannten "Makros"?==
==Wo sind diese Makros?==


Makros können an ganz verschiedenen Stellen von MapTools auftauschen. Der Grund dafür ist, dass sie sich auch auf ganz verschiedene Bereiche auswirken können. Praktisch betrachtet gibt es vier Orte, an denen ein Makro sein kann:
Makros können an ganz verschiedenen Stellen von MapTools auftauchen. Der Grund dafür ist, dass sie sich auf ganz verschiedene Bereiche auswirken können. Praktisch betrachtet gibt es vier Orte, an denen ein Makro sein kann:


===Spielmarken-Makros===
===Spielmarken-Makros===
Line 147: Line 149:
===Allgemeine Makros===
===Allgemeine Makros===


Globale oder Allgemeine Makros sind nicht an eine Spielmarke oder eine Kampagne gebunden - sie werden mit deinen Einstellungen zu Maptool gespeichert. Sie sind also verfügbar, egal welche Kampagne du gestartet hast. Sie sind nur lokal bei dir sichtbar.
Globale oder Allgemeine Makros sind nicht an eine Spielmarke oder eine Kampagne gebunden - sie werden mit deinen Einstellungen zu Maptool gespeichert. Sie sind also verfügbar, egal welche Kampagne du gestartet hast. Sie sind nur ''lokal bei dir'' sichtbar.


Es ist also ein guter Ort, um solche Makros zu plazieren die sonst keiner sehen soll - Dinge, die deinen Spielern verborgen bleiben sollen, solange du das willst oder Aufgaben, die deine NSCs betreffen.
Es ist also ein guter Ort, um solche Makros zu platzieren, die sonst keiner sehen soll - Dinge, die deinen Spielern verborgen bleiben sollen, solange du das willst oder Aufgaben, die deine NSCs betreffen.


==Die Makrofenster==
==Die Makrofenster==
Line 163: Line 165:
* Allgemein
* Allgemein


Du nsolltest nun die Fenster wie in der Abbildung (oder so ähnlich) in Maptool sehen.In der Abbildung sind im Fenster "Allgemein" eine ganze Reihe an Schaltflächen zu sehen. Jede dieser Schaltflächen führt ein Makro aus; sie entstehen, wenn du ein neues Makro erstellst.  
Du solltest nun die Fenster wie in der Abbildung (oder so ähnlich) in Maptool sehen. In der Abbildung sind im Fenster "Allgemein" eine ganze Reihe an Schaltflächen zu sehen. Jede dieser Schaltflächen führt ein Makro aus; sie entstehen, wenn du ein neues Makro erstellst.  


'''Bitte beachte''', dass die Makros im Fenster "Allgemein" nur auf ''deinem'' Rechner und nur in ''deiner'' Installation von Maptool vorhanden sind.Die Schaltflächen im Screenshot sind ''meine'' Allgemeinen Makros; deine... naja, die wirst du selber schreiben müssen.
'''Bitte beachte''', dass die Makros im Fenster "Allgemein" nur auf ''deinem'' Rechner und nur in ''deiner'' Installation von Maptool vorhanden sind. Die Schaltflächen im Screenshot sind ''meine'' Allgemeinen Makros; deine... naja, die wirst du selber schreiben müssen.


===Die Fenster Ausgewählt und Verkörpern===
===Die Fenster Ausgewählt und Verkörpern===


Es gibt zei Makrofenster, die sich direkt mit Spielmarken beschäftigen: Ausgewählt und Verkörpern.  
Es gibt zwei Makrofenster, die sich direkt mit Spielmarken beschäftigen: Ausgewählt und Verkörpern.  


Das '''Ausgewählt'''-Fenster enthält Schaltflächen, die direkt zu der von dir gerade markierten Spielmarke gehören. Sie sind also ein Teil der Spielmarke, auf die du mit der Maus geklickt hast. Jede dieser Schaltflächen führt eine Reihe von Makrobefehlen aus.
Das '''Ausgewählt'''-Fenster enthält Schaltflächen, die direkt zu der von dir gerade markierten Spielmarke gehören. Sie sind also ein Teil der Spielmarke, auf die du mit der Maus geklickt hast. Jede dieser Schaltflächen führt eine Reihe von Makrobefehlen aus.


Das '''Verkörpern'''-Fenster enthält entsprechend die Makro-Schaltflächen der Spielmarke, die du gerade verkörperst, d.h. deren Identität du gerade annimmst. Im Chat erscheinen deshalb deine Nachrichten so, als würde die Spielmareke sprechen. Es ist möglich, eine Spielmarke zu verkörpern und gleichzeitig eine andere ausgewählt zu haben. Du solltest deshalb immer darauf achten, auf welchen Makrofenster du gerade bist.
Das '''Verkörpern'''-Fenster enthält entsprechend die Makro-Schaltflächen der Spielmarke, die du gerade verkörperst, d.h. deren Identität du gerade annimmst. Im Chat erscheinen deshalb deine Nachrichten so, als würde die Spielmarke sprechen. Es ist möglich, eine Spielmarke zu verkörpern und gleichzeitig eine andere ausgewählt zu haben. Du solltest deshalb immer darauf achten, auf welchen Makrofenster du gerade bist.


===Das Kampagne-Fenster===
===Das Kampagnenfenster===


Dieses Fenster zeigt die Makro-Schaltflächen der gerade geladenen Kampagne und kann, je nach Einstellungen des Servers, mit den anderen Spielern geteilt werden oder nicht. Spieler (also alle außer der Spielleitung) können hier keine Makros hinzufügen oder entfernen (siehe auch [[Managing Macros in Panels/de|Makros in Fenstern verwalten]]).
Dieses Fenster zeigt die Makro-Schaltflächen der gerade geladenen Kampagne und kann, je nach Einstellungen des Servers, mit den anderen Spielern geteilt werden oder nicht. Spieler (also alle außer der Spielleitung) können hier keine Makros hinzufügen oder entfernen (siehe auch [[Managing Macros in Panels/de|Makros in Fenstern verwalten]]).
Line 183: Line 185:
Makros im Fenster SL gehören ebenfalls zur Kampagne, werden aber nur der Spielleitung angezeigt.
Makros im Fenster SL gehören ebenfalls zur Kampagne, werden aber nur der Spielleitung angezeigt.


===Global Panel===
===Allgemein-Fenster===
 
This panel contains the Global Macros you've set up. Remember, these are ''only visible to you.''


==Before You Go Any Further: The Basics==
Dieses Fenster enthält alle allgemeinen (globalen) Makros. Berücksichtige, dass ''nur du'' diese Einträge siehst.


Before we proceed, there are some ''essential'' elements of the macro syntax you need to understand, or unpredictable things will happen. Macros originated as ways to script short sections of text and very brief dice rolls, which were sent to the chat window. So, if you wanted a battle cry to be displayed, but didn't want to retype it every time, you could write a "macro" to send that battle cry to the chat window. Likewise, if you always rolled 2d6 to make an attack, you could write a macro to generate that output, rather than typing {{code|/roll 2d6}} every time you needed to roll.
==Bevor wir endlich loslegen: Entstehung==


From there, it grew - the macro commands became more complex until they were almost a programming language; but they're still just a bunch of text passed to a ''parser'', which handled all the commands in the macro, and generated results.  
Bevor wir richtig ins Thema einsteigen, hier ein paar ''historische'' Informationen zu Makros. Sie sind ursprünglich entstanden, um einfache kleine Aufgaben nicht jedesmal wieder machen zu müssen. Wenn du bei jedem Angriff mit 2W6 würfeln musst kannst du das machen, indem du {{code|/roll 2d6}} in den Chat tippst.Stattdessen kannst du aber auch ein Makro für deine Spielmarke schreiben und von da an nur noch auf die Schaltfläche für das Makro klicken. Mit der Zeit wurden die Ideen, was Makros automatisert erledigen könnten, immer komplexer. Die Makrokommandos in Maptool wurden immer mehr bis sie schließlich den Umfang einer kleinen Programmiersprache hatten. Was sich aber nicht geändert hat: Makros sind nach wie vor einfach nur Text, der von einem Parser ausgewertet wird um die erzeugten Ergebnisse auszugeben.  


So, one of the big things to remember is this:
Deshalb ist eins der wichtigen Dinge, die man im Hinterkopf behalten sollte:


'''IMPORTANT: Macros are a sequence of text containing both text you want to display in chat AND special commands that do things like make dice rolls'''.
'''WICHTIG: Makros sind eine Reihe von Text, den du im Chat ausgeben willst UND speziellen Anweisungen, die Dinge wie Würfelwürfe erledigen.'''


===The Current Token===
===Die aktuelle Spielmarke===


Before you begin writing macros, please consult the page on the [[Current Token]] concept. When you write macros, you will usually - unless the macros are very minimal - be manipulating [[Token Property|Token Properties]]. In order to manipulate the ''correct'' set of properties with your macro, it is crucial to understand the concept of the [[Current Token]].  
Ehe du mit dem Schreiben von Makros beginnst, solltest du unbedingt das Konzept der ''aktuellen Spielmarke'' verstanden haben. Sieh dir deshalb bitte unbedingt [[Current Token/de|die Seite dazu]] an. Wenn du ein Makro schreibst, wirst du in aller Regel [[Token Property/de|Spielmarkeneigenschaften]] lesen oder ändern wollen. Damit du auch die ''richtigen'' Eigenschaften änderst, solltest du also verstehen, was deine [[Current Token|aktuelle Spielmarke]] ist, die dein Makro bearbeitet.  


'''IMPORTANT: A macro''' '''''always''''' '''refers to the Current Token, unless you explicitly instruct the functions/operations of that macro to address a token other than the Current Token. '''
'''WICHTIG: Ein Makro bezieht sich ''' '''''immer''''' '''auf die aktuelle Spielmarke, solange nicht eine spezielle Funktion oder Anweisung explizit eine andere Spielmarke aufruft.'''


===Brackets and Braces===
===Eckige und geschweifte Klammern===


Now, because they are plain text, there must be a way to distinguish the parts that are just text to send to chat, and the parts that are "programming commands." MapTool handles that by enclosing the programming commands in brackets - either the square brackets, {{code|[ ]}}, or the curly braces, {{code|{ } }}.  
Da in Makros sowohl normaler Text als auch Anweisungen stehen können, müssen diese irgendwie zu unterscheiden sein. In Maptool machen diesen Unterschied Klammern. Alles was darin steht, wird als Makro ausgewertet - entweder eckige {{code|[ ]}} oder geschweifte {{code|{ } }} Klammern.  


'''IMPORTANT: Anything found in between square brackets or curly braces is handled not as regular text, but as a command to the parser to do something. Likewise, if it's''' '''''not''''' '''between curly braces or square brackets, it is sent to the chat window as text.'''
'''WICHTIG: Alles innerhalb von eckigen oder geschweiften Klammern wird nicht als normaler Text sondern als Anweisung an den Parser interpretiert. Umgekehrt ist alles, was''' '''''nicht''''' '''in eckigen oder geschweiften Klammern steht, Text, der einfach im Chatfenser ausgegeben wird.'''


So, something like:
So wird das hier:


<syntaxhighlight lang="mtmacro">
<syntaxhighlight lang="mtmacro">
Line 215: Line 215:
</syntaxhighlight>
</syntaxhighlight>


or
oder das


<syntaxhighlight lang="mtmacro">
<syntaxhighlight lang="mtmacro">
Line 221: Line 221:
</syntaxhighlight>
</syntaxhighlight>


is not telling MapTool to send the text <nowiki>[1d20]</nowiki> or <nowiki>{1d20}</nowiki> to chat; rather, it's saying "generate a random number between 1 and 20 and send ''that'' to the chat window." The brackets and braces (although braces aren't recommended for use anymore, due to complications they cause with the branching and looping functions) indicate to MapTool that the information ''between'' them is a macro command or variable, and not just text. So, as you'll see later, you can mix text and macro commands:
von MapTool nicht als Text <nowiki>[1d20]</nowiki> oder <nowiki>{1d20}</nowiki> in den Chat geschrieben; stattdessen sagt es dem Parser "erzeuge eine Zufallszahl zwischen 1 und 20 und schreibe sie in den Chat". Die eckigen oder geschweiften Klammern sagen MapTool, dass dazwischen etwas steht, was es als Makroanweisung interpretieren soll.
'''Anmerkung: Geschweifte Klammern werde inzwischen nicht mehr verwendet, weil sie zu Schwierigkeiten mit Verzweigungs- und Schleifenfunktionen führen können.'''
 
Wie später noch genauer beschrieben wird, lassen sich Text und Makroanweisungen auch mischen:


<syntaxhighlight lang="mtmacro">
<syntaxhighlight lang="mtmacro">
I roll [1d20+4] for initiative.
Ich würfle [1d20+4] für die Initiative.
</syntaxhighlight>
</syntaxhighlight>


in a macro will replace the <nowiki>[1d20+4]</nowiki> with the result of that dice expression, and then print the entire sentence to chat, so it looks something like:
Das Makro ersetzt <nowiki>[1d20+4]</nowiki> mit dem Ergebnis des Würfelausdrucks und gibt dann alles zusammen im Chat aus:


<syntaxhighlight lang="mtmacro">
<syntaxhighlight lang="mtmacro">
I roll 16 for initiative.
Ich würfle 16 für die Initiative.
</syntaxhighlight>
</syntaxhighlight>


===Roll Options===
===Roll Options - Würfel-Optionen===


Roll Options are another special feature of the macro language. Their name is somewhat of a legacy - since most macros were dice rolls (e.g. the aforementioned <nowiki>[1d20+4]</nowiki>, there was a request to have different ways to display them (or not display them at all). Since those options were used to change how a roll appeared, they were called Roll Options, and the name stuck. In fact, it's still applicable, even though the options no longer really just handle how something is displayed.  
"Roll Options" sind eine weitere Eigenheit der Makrosprache von MapTool. Der Name ist eine Art Vermächtnis (oder Altlast) der Anfänge der Makros. Da die meisten Makrobefehle zu Beginn Würfelwürfe waren (wie z.B. das vorgenannte <nowiki>[1d20+4]</nowiki>), kam schnell der Wunsch einer schöneren Anzeige (oder Nicht-Anzeige) auf. Da es darum ging, die Möglichkeiten der Darstellung von Würfelwürfen zu beeinflussen, kamen die Makrobefehle so ihren Namen: "Roll Options" und dabei blieb es. Ganz falsch ist das bis heute nicht, auch wenn diese Befehle inzwischen viel mehr können.
(Anm. d. Ü.: Auch wenn das etwas sperrig klingen mag, werde ich zukünftig den Begriff Würfeloptionen verwenden. Schließlich übersetze ich euch das, damit ihr euch nicht mit englischen Begriffen rumärgern müsst.)


Roll Options are a critical thing to understand in macro writing. There are a couple of rules. First, the general format of any macro command in MapTool is this:
Würfeloptionen sind ein wichtiger Teil des Makroschreibens. Dabei gibt es einige Regeln. Hier zuerst einmal das generelle Schema:


<syntaxhighlight lang="mtmacro">
<syntaxhighlight lang="mtmacro">
[(comma-list-of-options): operation(s)]
[(Kommagetrennte Liste von) Optionen : Operation(en)]
</syntaxhighlight>
</syntaxhighlight>


Now, to explain: a roll option has the following rules:
Zur Erläuterung hier die Regeln:


# It always goes at the beginning of a macro statement (for our purposes, a statement is any macro line between square brackets).  
# Die Würfeloption steht immer am Beginn eines Makroblocks (das was mit den eckigen Klammern beginnt und endet).  
# It is always followed by a colon.
# Es folgt immer ein Doppelpunkt.
# It may be combined with other roll options; if so, you separate each option with a comma, and at the end of the comma-separated list, you put a single colon.
# Mehrere Optionen können, durch Komma getrennt, gemeinsam genutzt werden; den durch Komma getrennten Optionen folgt dann EIN Doppelpunkt.
# It needs to appear only once in a given macro statement for it to apply to the operations contained within. This gets tricky when you start using the CODE roll option, since you can begin to nest entire, separate statements, but that is explained in the sections on branching and looping.  
# Eine Option muss nur einmal gesetzt sein und gilt dann für den ganzen Makroblock. Das kann kompliziert werden, wenn man die Option {{code|CODE}} verwendet, in der man viele einzelne Anweisungen unterbringen kann. Das ist dann aber später bei den Verzweigungen und Schleifen erklärt.


A simple example of a roll option is this:
Ein einfaches Beispiel für eine Würfeloption ist:


<syntaxhighlight lang="mtmacro">
<syntaxhighlight lang="mtmacro">
Line 256: Line 260:
</syntaxhighlight>
</syntaxhighlight>


That uses the "regular output" roll option to display the result of 1d20+4 as plain text (without highlighting or tooltips). A complex example might look like this:
Die Würfeloption ist hier "regular output" (normale Ausgabe) {{code|[r:]}}, die das Ergebnis des Würfelwurfes 1d20+4 als reinen Text (ohne Markierungen oder Tooltip) ausgibt. Ein komplizierteres Beispiel sieht dann so aus:


<syntaxhighlight lang="mtmacro">
<syntaxhighlight lang="mtmacro">
[h: d20roll = 1d20]
[h: d20roll = 1d20]
[h,if(d20roll == 20): output = "Critical Hit"; output = "Not a Critical Hit"]
[h,if(d20roll == 20): output = "Kritischer Treffer"; output = "Kein kritischer Treffer"]
</syntaxhighlight>
</syntaxhighlight>


This combines the [h: ] roll option (which means, "hide this from the chat window"), and the [if(): ] roll option, which performs an if-then operation. Note, though, the roll options all appear only at the beginning of the macro statement to which they apply.  
Hier werden die Würfeloptionen "hidden" (versteckt) {{code|[h:]}} und "if()" (wenn) {{code|[if():]}} kombiniert; Verzweigungen wie die mit ''wenn'' werden später erklärt. Beachte, dass auch hier alle Würfeloptionen am Anfang vor dem Doppelpunkt stehen.


A ''very'' complex example might involve the use of the [CODE: ] roll option (learn more about that at [[Introduction_to_Macro_Branching|Introduction to Macro Branching]]) to allow you to nest entire macro statements within blocks to be executed as if they were a single statement. For instance:
Ein "sehr" kompliziertes Beispiel verwendet hier auch die Würfeloption "code" (mehr dazu in [[Introduction_to_Macro_Branching/de|Verzweigungen]]), die statt einer einzelnen Anweisung je einen ganzen Makroblock setzen kann. Hier ist es:


<syntaxhighlight lang="mtmacro">
<syntaxhighlight lang="mtmacro">
Line 271: Line 275:
[h,if(d20roll == 20),CODE:
[h,if(d20roll == 20),CODE:
{
{
     [damageAmount = 16]
     [Schaden = 16]
     [damageType = "acid"]
     [Schadesart = "Säure"]
     [TargetHP = TargetHP - damageAmount]
     [ZielTP = ZielTP - Schaden]
};
};
{
{
     [damageAmount = 1d10+6]
     [Schaden = 1d10+6]
     [damageType = "acid"]
     [Schadesart = "Säure"]
     [TargetHP = TargetHP - damageAmount]
     [ZielTP = ZielTP - Schaden]
}]
}]
</syntaxhighlight>
</syntaxhighlight>


This is a complex statement, but the roll options for the overall command (the outermost set of square brackets) are all at the beginning, separated by commas, and followed by a single colon. The inner statements are ''nested''.
Auch in diesem Makro stehen die Würfeloptionen wieder ganz vorne, auch wenn durch die {{code|CODE:}}-Anweisung danach noch ein paar mehr eckige Klammern auftauchen.  


===Quotes and Apostrophes===
===Einfache Anführungszeichen und Apostrophe===


Under most circumstances, macros containing single quotes (or apostrophes) will work fine - they're just text, and thus they will be sent to the chat window without issue. However, there are certain situations where a lone, or unmatched, single quote will cause MapTool to think you have created an ''unterminated string''. When that happens, the text of the macro (all the commands, etc.) is usually dumped to chat, resulting in a big block of ugly output.
In den meisten Fällen funktionieren Makros mit einfachen Anführungszeichen gut. Sie sind einfach nur Text und werden ohne Aufhebens ans Chatfenser geschickt. Es gibt aber Situationen (innerhalb eines Makroblocks), in denen MapTool glaubt, du hättest eine "unbeendete" Zeichenkette eingegeben. In solchen Fällen kann es vorkommen, dass der gesamte Makrotext (also alle Anweisungen) einfach in den Chat geschrieben werden, statt ausgeführt zu werden.


To avoid this, remember this rule: if you have text that you wish to appear in chat contained between a set of square brackets or curly braces, a lone quote character (single or double quotes) will cause an error. So, modifying the example above:  
Um das zu vermeiden, solltest du immer wenn du Text innerhalb eines Makroblocks (in eckigen oder geschweiften Klammern) ausgeben willst, diesen Text auf einzelne Anführungszeichen prüfen. Zur Anschauung nochmal das vorige Beispiel - nur etwas anders:


<syntaxhighlight lang="mtmacro">
<syntaxhighlight lang="mtmacro">
Line 294: Line 298:
[h,if(d20roll == 20),CODE:
[h,if(d20roll == 20),CODE:
{
{
     [damageAmount = 16]
     [Schaden = 16]
     [damageType = "acid"]
     [Schadesart = "acid"]
     [TargetHP = TargetHP - damageAmount]
     [ZielTP = ZielTP - Schaden]
     The target's HP is now [r:TargetHP].
     Des Ziel's TP sind noch [r:ZielTP].  
};
};
{
{
     [damageAmount = 1d10+6]
     [Schaden = 1d10+6]
     [damageType = "acid"]
     [Schadesart = "acid"]
     [TargetHP = TargetHP - damageAmount]
     [ZielTP = ZielTP - Schaden]
}]
}]
</syntaxhighlight>
</syntaxhighlight>
''(Anm.d.Ü.: Ich weiß! Des Ziel's" ist schrecklich bis falsch!  Es tut mir in der Seele weh. Aber wie kriegt man da sonst einen Apostroph rein?)''


The single quote character in the line {{code|The target's HP is now [r:TargetHP]}} will cause an error. There are two ways around this:  
Das einfache Anführungszeichen im Text {{code|Des Ziel's TP sind noch [r:ZielTP].}} erzeugt einen Fehler. Es gibt zwei Möglichkeiten, das zu umgehen:  


# Don't use apostrophes. This can be a bit awkward.
# Verwende keine einfachen Anführungszeigen oder Apostrophe. Das mag allerdings etwas seltsam sein.
# Replace the apostrophe with the HTML character code for the single quote: '''{{code|&amp;#39;}}'''
# Ersetze den Apostroph durch einen entsprechenden HTML Charaktercode: '''{{code|&amp;#39;}}'''


===Comments===
===Kommentare===


'''THERE IS NO COMMENT MECHANISM IN THE MACRO CODE. ALL PROPERLY WRITTEN MACRO COMMANDS IN A MACRO''' '''''WILL BE EXECUTED.'''''
'''ES GIBT KEINE KOMMENTARFUNKTION IN MT-MAKROS. ALLES GESCHRIEBENE IM MAKROBLOCK IST EIN MAKRO UND''' '''''WIRD AUSGEFÜHRT.'''''


The macro language directs all of the content of a macro through the built-in parser, looking for text to send to chat and commands to execute. It is possible to hide output from the chat window in a couple of fashions, but it is not possible to prevent the execution of properly written macro commands. In other words, you '''cannot comment out code.'''
Der ganze Inhalt des Makros wird an den Parser übergeben und er sucht alles, was an den Chat schicken oder ausführen kann. Es gibt Möglichkeiten dafür zu sorgen, dass Text nicht im Chat erscheint; aber der Parser wird alles was er findet entweder in den Chat schreiben oder ausführen!
Anders gesagt: '''Du kannst Code nicht auskommentieren!'''


There are two ways to hide output: the {{roll|h}}, or "hidden", roll option, and HTML comment format. The hidden roll option you've already seen, but if you're not familiar with HTML, comments in HTML look like this:
Es gibt zwei Wege, um etwas nicht im Chat erscheinen zu lassen:
# Die bereits weiter oben kennengelernte Würfeloption "hidden" {{roll|h}}
# Ein HTML-Kommentar, der zwar ausgegeben aber nicht angezeigt wird.
 
Solltest du HTML-Kommentare nicht kennen:


<syntaxhighlight lang="html4strict">
<syntaxhighlight lang="html4strict">
<!--This is an HTML comment-->
<!-- Ich bin ein HTML-Kommentar -->
</syntaxhighlight>
</syntaxhighlight>


In an actual HTML page, anything between the <nowiki><!--</nowiki> and <nowiki>--></nowiki> is completely ignored. In contrast, in MapTool's macro language, anything between the comment tags is ''hidden'' from chat, but if you embed macro commands in there, they ''will'' be executed. In other words, in a macro, if you have this line:
In einer HTML-Seite wird alles zwischen <nowiki><!--</nowiki> und <nowiki>--></nowiki> nicht dargestellt. Im Gegensatz dazu versteht MapTools Makroparser den HTML-Kommentar einfach als Text, solange darin keine Makrobefehle auftauchen. Das Chatfenster versteht HTML und zeigt den Kommentar nicht an. Gibst du die folgende Zeile in den Chat ein, dann gibt es eine Ausgabe:


<syntaxhighlight lang="html4strict">
<syntaxhighlight lang="html4strict">
<!--In this part of the macro I roll some dice-->
<!--In diesem Teil des Makros wird gewürfelt-->
</syntaxhighlight>
</syntaxhighlight>


it will be hidden from chat and act like a comment. However, if the line said:
aber sie ist leer. (Der HTML-Kommentar "<nowiki><!--</nowiki>In diesem Teil des Makros wird gewürfelt<nowiki>--></nowiki>" ist unsichtbar bzw. nicht dargestellt.)
Gibst du diese Zeile ein:


<syntaxhighlight lang="html4strict">
<syntaxhighlight lang="html4strict">
<!--In this part of the macro I roll some dice using the format [r:1d20+9]-->
<!--In diesem Teil des Makros wird gewürfelt mit [r:1d20+9]-->
</syntaxhighlight>
</syntaxhighlight>


the parser will hide all that from chat, but it ''will'' perform that macro command, whether you want it to or not.
bekommst du ebenfalls eine leere Ausgabe, in der nicht dargestellt etwas wie "<nowiki><!--</nowiki>In diesem Teil des Makros wird gewürfelt mit 18<nowiki>--></nowiki>" steht, wobei die 18 irgendeine Zahl zwischen 10 und 29 sein kann - das Makro wird also im Kommentar ausgeführt, ob du das willst oder nicht.


The lesson to be learned here: '''You cannot comment out macro code.'''
Die wesentliche Aussage dieses Beispiels: '''Du kannst Makro-Code nicht auskommentieren!'''


==Writing Macros==
==Makros schreiben==


[[Image:Camp-panel-nomacros.png|thumb|The '''Campaign Panel'''. You can see there are no macros here yet.]]
[[Image:Camp-panel-nomacros.png|thumb|The '''Campaign Panel'''. You can see there are no macros here yet.]]
Line 345: Line 356:
[[Image:Camp-panel-rcaddnew.png|thumb|Right-clicking on the Campaign Panel lets you add a new macro.]]
[[Image:Camp-panel-rcaddnew.png|thumb|Right-clicking on the Campaign Panel lets you add a new macro.]]


Macro creation is a three-step procedure (though those three steps can contain multitudes!):
Das Schreiben von Makros besteht immer aus drei Schritten (wobei sich die einzelnen Schritte wiederholen können):


1. Right-click on the panel where you want the macro to appear (either one of the token panels, the Campaign panel, or the Global panel) and select '''Add New Macro'''. A gray button with the label '''(new)''' will appear.
# Mache einen Rechtsklick auf das Fenster, in das du das Makro schreiben willst (also das Ausgewählt-Fenster, das Allgemein-Fenster usw.) und wähle aus dem Kontextmenü den Eintrag '''Neues Makro hinzufügen'''. Ein grauer Schriftzug "(new)" erscheint.
# Mache einen Rechtsklick auf den Schriftzug und wähle aus dem Kontextmenü "Bearbeiten...".
# Trage deinen Makrocode ein, gib dem Makro einen Namen und bestätige über die Schaltfläche '''OK'''. Und schon hast du dein erstes Makro erstellt!


2. Right-click on the button, and select '''Edit'''.
Warte... was meint Makrocode?


3. Enter your macro code, give it a name, and hit '''OK'''. There! You've created a macro!
Wie schon angedeutet: diese drei Schritte können ''viele'' Einzelschritte beinhalten, Tipps, Tricks, Siege, Niederlagen, Frustration, manchal auch Rumbrüllen und Zähneknirschen. Also nochmal einen Schritt zurück. Es gibt jede Menge Forumseinträge, Tutorials usw. zu Makros zu allen möglichen Zwecken. Wir fangen mit etwas ganz Einfachem und Nützllichen an und das Schritt für Schritt.


But wait...what do you mean, "macro code?"
===Initiative würfeln===
 
As I said, those three steps can contain a ''huge'' amount of details, steps, tips, tricks, victories, failures, frustrations, and sometimes, hollering and gnashing of teeth. So, we'll take a step back and look at some very simple macros in a step-by-step fashion. If you want to see what some advanced macros can look like, there are plenty of tutorials and how-tos on this wiki to read through. For now, though, we'll do some simple, but useful, macro writing.
 
===Roll for Initiative===


[[Image:Camp-panel-newbutton.png|thumb|After selecting "Add New Macro," a button labeled '''(new)''' appears on the Campaign Panel.]]
[[Image:Camp-panel-newbutton.png|thumb|After selecting "Add New Macro," a button labeled '''(new)''' appears on the Campaign Panel.]]
Line 367: Line 376:
[[Image:Camp-panel-exbutton.png|thumb|The '''Campaign Panel''' with your newly created macro on it]]
[[Image:Camp-panel-exbutton.png|thumb|The '''Campaign Panel''' with your newly created macro on it]]


The simplest macros are no more than text, which is output to the chat window. In effect, a macro containing text (in fact, all macros) just send a string of commands to the chat window where it is read and interpreted. Most programming languages start off with the classic "Hello World!" program, so this guide is ''not'' going to do that. Instead, let's do something a bit more RPG: create the dreaded "Roll for Initiative!" message!
Das einfachste Makro ist einfach nur Text, der im Chat ausgegeben wird. Die meisten Tutorials über Programmiersprachen fangen mit einem "Hello world!"-Beispiel an, wir aber ''nicht''. Wir machen was rollenspielartiges: den gefürchteten Satz "Würfle die Initiative!"


1. Select the Campaign Panel.
# Wähle das Kampagnenfenster.
# Mache einen Rechtsklick darauf und wähle aus dem Kontextmenü den Eintrag '''Neues Makro hinzufügen'''.
# Mache einen Rechtsklick auf "(new)" und wähle aus dem Kontextmenü den Eintrag '''Bearbeiten...'''.
# Der Makroeditor öffnet sich mit dem Reiter '''Editor'''. Schreibe in das Textfeld <blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>"Würfle die Initiative!"</tt></blockquote>
# Wechsle zum Reiter Details und fülle das Feld '''Beschriftung''' ebenfalls mit "Würfle die Initiative!" (Um die anderen Felder musst du dich jetzt ncht kümmern.)
# Klicke '''OK'''.
# Wenn du fertig bist, siehst du jetzt eine Schaltfläche mit der Aufschrift "Würfle die Initiative!". Klickst du darauf, erscheint der Text "Würfle die Initiative!" im Chatfenster.


2. Right-click on it, and select '''Add New Macro'''.
Das ist die einfachste Version, ein Makro zu schreiben: Du gibst Text ein und der wird an den Parser und anschließend an das Chatfenster weitergegeben wenn du die Schaltfläche klickst.  


3. Right-click on the new macro button, and click '''Edit'''.
===Etwas Interessanteres===


4. In the '''Label''' field, enter "Roll for Initiative!"
Das "Würfle die Initiative!"-Makro ist, auch wenn es für Unruhe bei den Spielern sorgt, nicht sonderlich ''interessant'' als Makro. Du hast dir vielleicht gedacht: "Warum soll ich das nicht einfach in den Chat tippen?" und möglicherweise würdest du das tun. Also lass uns etwas Spannenderes tun, was mehr mit dem zu tun hat, weshalb wir MapTool nutzen. Schließlich ist MapTool nicht zum Programmieren von Makros gedacht, sondern zum Spielen: Wir nehmen noch ein paar ''Makroanweisungen'' mit zum reinen Text. Sie sind als besondere Befehle dazu da, nicht nur Text im Chat auszugeben, sondern zum Beispiel zu würfeln, also Zufallsergebnisse zu erzeugen oder etwas zu berechnen.


5. Leave the '''Group''' and '''Sort Prefix''' fields blank.
Makroanweisungen müssen ''immer'' in eckige Klammern (z.B. [''macro command'']) oder geschweifte Klammern (z.B. {''macro command''}) gesetzt werden. Das zeigt dem Parser, dass es hier etwas zu tun gibt. Andernfalls gäbe er den Anweisungstext einfach im Chat aus.  


6. In the '''Command''' field, type
====Würfeln====
 
<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>Roll for Initiative!</tt></blockquote>
 
7. Click '''OK'''.
 
8. When you're done, you'll see that the button has changed - it now says '''Roll for Initiative!''' on it, and when you click it, lo and behold, the text "Roll for Initiative!" appears in the chat window.
 
That is macro writing at its most basic: you enter some text in the macro, and that text is read by the parser and sent to the chat window when you press the button.
 
===Something More Interesting===
 
"Roll for Initiative!" though scary when your GM utters it, is not all that ''interesting'' a macro. You probably thought "why wouldn't I just type that in chat?" And, in fact, the answer is "you probably would." So let's do something more interesting, and more in keeping with why we're using MapTool in the first place (after all, we're not here to write programs - we're here to play games): we're going to add some ''macro commands'' to the macro, in addition to just plain text. Macro commands are special instructions that, when read by the parser, tell it to do something more than just print text in the chat window, like roll some dice or calculate a value.
 
Macro commands must ''always'' be enclosed in square brackets (e.g, [''macro command'']) or curly braces (e.g., {''macro command''}). Enclosing them in this fashion is what clues the parser in that a command is coming - otherwise, it will treat the command just like any other text, and print it in chat.
 
====Roll Some Dice====


[[Image:Macro-editor-rolldice.png|thumb|A macro with text and a basic dice roll of 1d20+7]]
[[Image:Macro-editor-rolldice.png|thumb|A macro with text and a basic dice roll of 1d20+7]]


This is a simple macro that's going to automatically roll some dice, and add a number to that roll, before displaying the whole thing in the chat window.  
Schreiben wir also ein Makro, das einfach für uns würfelt und einen festen Wert addiert, ehe wir das Ergebnis zu sehen kriegen.
 
1. Create a new macro (this can be created anywhere you like - on a token, in the campaign panel, or in the global panel), and open the edit dialog (remember, you do that by right-clicking on the button labeled '''(new)''').
 
2. In the '''Label''' field, call the macro something like "Attack Roll" or "Dice Roll"
 
3. In the '''Command''' area, enter:
 
<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>My attack roll is [1d20+7]!</tt></blockquote>
 
4. Click '''OK'''. You should see a button labeled with whatever you chose in Step 2, above. When you click it, you'll see something like the following appear in chat:
 
<blockquote style="border:1px solid gray; width:50%;">Chris: My attack roll is <font style="background-color:lightgray;">8</font>!</blockquote>


What has happened is that MapTool read through the contents of the macro, and when it got to the section '''[1d20+7]''', it knew to:
# Erzeuge ein neues Makro (egal ob bei der Spielmarke, im Allgemeinen oder dem Kampagnenfenster) und öffne den ''Bearbeiten''-Dialog. Zur Erinnerung: Ein neues Makro erzeugst du durch Rechtsklick im Makrofenster und Auswahl von "Neues Makro hinzufügen".
# Trage bei der Bezeichung etwas ein wie "Angriffswurf" oder "Würfeln".
# Im Textbereich '''Befehl''' trägst du nun folgendes ein:<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>Mein Angriffswurf ist [1d20+7]!</tt></blockquote>
# Klicke auf '''OK'''. Du hast jetzt eine neue Schaltfläche mit der von dir eben gewählten Aufschrift. Wenn du ihn anklickst, solltest du im Chat etwa das sehen: <blockquote style="border:1px solid gray; width:50%;">Chris: Mein Angriffswurf ist <font style="background-color:lightgray;">8</font>!</blockquote>MapTool hat die Anweisung im Makro gelesen, den Text ausgegeben und als es zur Klammer '''[1d20+7]''' kam wusste es, dass es:


# Roll a 20-sided die (or, in reality, choose a random number between 1 and 20), and
# Einen Würfelwurf mit einem 20-seitigen Würfel simulieren (oder, in Wirklichkeit, eine Zufallszahl zwischen 1 und zwanzig erzeugen) soll,
# Add 7 to that result, and
# dazu 7 addieren und
# Display the results in the chat window, inserted into the text in the right place.
# das Ergebnis statt der Klammer im Chat ausgeben soll.


You'll see that the number 8 has a gray background. If you hover over that number, a "tooltip" will pop up showing how that number was reached. In this case, I managed to roll a 1 on the 1d20 (bummer! a critical fumble!) If you don't see this tooltip, check your [[MapTool Preferences#Chat]] settings, specifically '''Use ToolTips for Inline Rolls'''.
Du siehst, dass die Zahl im Chat einen grauen Hintergrund hat. Wenn du mit der Maus über die Zahl gehst, erscheint ein Tooltip, der die Berechnung der Zahl erläutert. In diesem Fall war der Wurf eine eins, also (in vielen Spielsystemen) ein kritischer Fehler. Solltest du den Tooltip nicht sehen, dann sie in deinen [[MapTool Preferences#Chat|MapTool Einstellungen]] nach, ob der Haken bei '''Hilfetexte für eingebettete Würfelwürfe verwenden''' gesetzt ist.


Also, you probably won't see the name "Chris", unless your name happens to be Chris. That part of the chat output is just indicates who "said" that particular bit of text; if it was a token, it would have the token's picture and name instead of boring old "Chris."
Wahrscheinlich wird da auch nicht Chris stehen, wenn du nicht zufällig auch so heißt. :-) Dieser Teil der Ausgabe zeigt nur an, wer das Makro ausgeführt bzw. das Gesagte gesprochen hat. Wenn es eine Spielmarke(-nmakro) gesagt hat, dann steht da stattdessen der Name der Spielmarke (die natürlich auch Chris heißen könnte).


====More than Just Numbers====
====Mehr als nur Zahlen====


Macro commands can work with numbers and with text -- you can manipulate ''strings'' (that is, collections of alphanumeric characters) as well using the MapTool macro language. Say, for instance, you wanted to roll your attack, but wanted to enter the name of your target so that it showed up in chat.
Makroanweisungen können mit Zahlen arbeiten und mit Text -- du kannst auch Zeichenketten (also eine Reihe von alphanumerischen Zeichen) für ein MapTool-Makro verwenden. Sagen wir, du möchtest einen Angriff würfeln, möchtest dabei aber auch dein Ziel nennen.


[[Image:Macro-editor-basiccommands.png|thumb|A macro with a basic dice command and a variable called ''target'']]
[[Image:Macro-editor-basiccommands.png|thumb|A macro with a basic dice command and a variable called ''target'']]
Line 431: Line 421:
[[Image:Prompt-undeclared-variable.png|thumb|A prompt for an "undeclared variable"]]
[[Image:Prompt-undeclared-variable.png|thumb|A prompt for an "undeclared variable"]]


What you can do is edit your Attack Roll macro to look like this:
Du kannst dein Makro dann einfach so erweitern:


<blockquote style="background-color:lightgray; width:50%;"><tt>My attack roll against [target] is [1d20+7]!</tt></blockquote>
<blockquote style="background-color:lightgray; width:50%;"><tt>Mein Angriffswurf gegen [target] ist [1d20+7]!</tt></blockquote>


When you run this macro, though, suddenly a window pops up in your face demanding a "Value For target." What happened?
Wenn du das Makro nun ausführst, erscheint plötzlich ein Fenster mit dem Titel "Wert für target." Was ist passiert?


Well, when MapTool looked at that macro, it saw a macro command that just says '''[target]'''. MapTool assumes that any word ''inside'' a macro command that is ''not'' enclosed in quotes is actually the name of a ''variable'' (in other words, a value that might change).  
Wenn sich der Parser von MapTool das Makro ansieht, dann findet er die Anweisung '''[target]'''. MapTool geht davon aus, dass jedes Wort, das es nicht kennt, eine Variable, also ein Platzhalter, ist. Da diese Variable bisher keinen Wert hat, erklärt MapTool es zu einer (wie man das in der Programmierung nennt) "undeclared" Variablen. Da er nicht weiß, welcher Wert dafür richtig ist, fragt er dich danach. Gibst du jetzt irgendwas in das Feld ein, egal ob Text, Zahl oder irgendwas völlig Unsinniges, gibt MapTool es nach der Bestätigung des Dialoges anstatt '''[target]''' aus.  


MapTool also noted that nowhere in that macro do we say ''what'' the variable ''target'' happens to be equal to. Programming languages call this sort of situation an ''undeclared variable'' (in other words, you never declared what it equaled). Since MapTool has no way of knowing what ''target'' should be, it asks! If you type a name, number, or pretty much anything in that popup window, MapTool will take that information, assign it to the variable ''target'', and finish the macro.  
Schreib also "böse Orkse" (ohne Anführungszeichen) in das Feld und bestätige. der Chat zeigt nun:


Go ahead and type "Nasty Orcses" (you can leave off the quotes) in the box, and hit '''OK'''. You should see in the chat window something like:
<blockquote style="border:1px solid gray;" width:50%;>Chris: Mein Angriffswurf gegen <font style="background-color:lightgray;">böse Orkse</font> ist <font style="background-color:lightgray;">23</font>!</blockquote>


<blockquote style="border:1px solid gray;" width:50%;>Chris: My attack roll against <font style="background-color:lightgray;">Nasty Orcses</font> is <font style="background-color:lightgray;">23</font>!</blockquote>
Wieder hat der Parser das Makro durchgearbeitet, einfachen Text einfach an den Chat weitergegeben und die Teile in Klammern ausgewertet. Wo es eckige Klammern gefunden hat, hat es diese durch einen der Anweisung entsprechenden Text (oder Zahlen) ersetzt.


Once again, the parser read through the text and macro commands you put inside the macro, and in the places where a macro command was indicated (by the square brackets, remember), MapTool substituted the appropriate information.
==Variablen in Makros==


==Using Variables in a Macro==
Wir sind schon in mehreren Beispieln auf Variablen (wie {{code|target}} im vorgen Beispiel) in unseren Makros gestoßen, haben uns aber noch nicht näher damit beschäftigt. Da Variablen aber für das Schreiben von Makros wichtig sind, beschäftigen wir uns genau jetzt damit.


We've seen in a couple of the examples some use of variables (like {{code|target}} in the example above) in a macro, but we haven't gone into the process too deeply yet. However, variables, and their use, is really the core of macro writing, so it would be remiss of me to leave it go.
===Was ist eine Variable?===


===What's a Variable?===
Wenn du schon programmiert hast, ist das ein alter Hut für dich. Wenn du aber gerade ins kalte Wasser springst, hier eine einfache (MapTools-)Definition von Variablen:


If you're familiar with programming at all, you will know this already, but if you're just stepping into this stuff cold, the simple definition of a ''variable'' in terms of the macro language is:
:'''Eine Variable ist ein Wert, der sich ändern kann, abhängig von einer Spielmarkeneigenschaft, einer Berechnung oder einer anderen Makroanweisung.'''


:'''A variable is a value that might change (i.e., vary) based on a token property, a calculation, or another macro command'''
Da sich der Wert der Variable ändern kann, müssen wir ihr einen Namen geben (in der Programmierung heißt das "Deklaration" - du gibst bekannt, dass die Variable existiert) damit wir über sie sprechen können. Wenn wir jetzt den aktuellen Wert dieser Variable brauchen, können wir stattdessen einfach ihren Namen schreiben. Der Parser von MapTool ersetzt dann einfach den Namen, der Variable durch ihren Wert.


Since the value of a variable might change, we have to give it a name (which is called ''declaring'' the variable - you declare that "this variable exists!") in order to talk about it. Then, whenever we need to use whatever value the variable has ''at that time'', we just put its name in the macro command, and MapTool will substitute the appropriate value at that time.  
Eine Variable ist wie ein Würfelwurf: Du weißt, dass irgendwas zwischen 1 und 20 herauskommen wird. Nun kannst du aber vorher nicht überall 19 hinschreiben; es könnte auch eine 2 oder 12 oder 5 sein. Stattdessen schreibst du: "Was immer bei dem Wurf rauskommt, schreib es hierher." Rollenspieler kürzen das gerne auf ein "W20" - das könnte unser Name der Variable sein.  


Think of it this way: if the value of a dice roll could be anything between 1 and 20, for example, you can't just enter 19 wherever you need to use that dice roll - it could be 19, or 2, or 7, or whatever. So instead, you'd want to say "whatever this dice roll is, put that number here."
:'''Anmerkung''': Das bedeutet nicht, dass MapTool dir den ''richtigen'' Wert für ''deinen'' Bedarf einsetzt; es heißt nur, dass die Variable mit dem Wert ersetzt wird, den sie gerade hat. Hat dein Programm einen Fehler, dann landet da vielleicht auch ein falscher Wert. MapTool kennt kein ''falsch'' oder ''richtig'' - es kennt nur ''so ist es gerade''.


:'''Note''': that doesn't mean that MapTool will substitute the ''correct'' value for ''your'' needs; it means it will substitute the value corresponding to that variable at that time. So if your program has a mistake in it, the value might end up being wrong - but MapTool doesn't understand "wrong," it just understand "this is what it says right now."
===Variablen Werte zuweisen===


===Variable Assignments===
Wenn du einer Variable einen Wert gibst, dann nennt man das eine Zuweisung. Der Wert (oder eine Berechnung des Wertes) wird der Variable ''zugewiesen''. Das Rechenzeichen (auch Operator) für die Zuweisung ist das Gleichheitszeichen ( = ). Dieses Zeichen sagt ja einfach, dass auf beiden Seiten das Gleiche steht - nur eben vielleicht auch verschieden erklärt. Also sagt die Gleichung "2+2=4", dass 2+2 so viel ist wie vier. Eigentlich steht also auf beiden Seiten vier. So machen wir es auch bei einer Zuweisung:
 
When you want to give a variable a value, this is called "assigning" a value to the variable. The "assignment operator" in MapTool is the equals sign ( = ). That sounds fancy, but it just means that you use an equals sign to tell MapTool that a particular variable has a particular value. An example of a variable assignment is


<blockquote>
<blockquote>
<syntaxhighlight lang="mtmacro">
<syntaxhighlight lang="mtmacro">
[h:myHP = 30]
[h:meineTP = 30]
</syntaxhighlight>
</syntaxhighlight>
</blockquote>
</blockquote>


As you have probably figured out, what that line does is first ''declare'' a variable called {{code|myHP}} exists, and then ''assign'' it the value {{code|30}}. That is variable assignment at its root - ''some variable'' equals ''some value''. The '''h''': with a colon tells maptools to "hide" the output. It's not necessary, but if you don't want all your variable numbers being sent to the chat window you should put an '''h''': in front of your assignments.
Wie du dir vielleicht schon gedacht hast, ''deklarieren'' wir hier eine Variable {{code|meineTP}} um ihr anschließend den Wert {{code|30}} ''zuweisen'' zu können. Das ist die einfachste Art der Zuweisung: ''eine variable'' ist gleich ''ein Wert''. Das '''h''' mit einem Doppelpunkt danach sagt MapTool, dass es diesen Wert ''verstecken" soll, also nicht in den Chat schreiben. Das musst du zwar nicht machen, aber wie du weiter oben schon gesehen hast, können die Berechnungen in Makros ziemlich umfangreich werden. Das sollte dann nicht alles im Chat stehen.


You'll remember from the example where you were prompted for the name of a target that you can use a variable name without assigning a value to it. If you do that, you have declared that the variable exists, but no value is assigned, so MapTool asks you (or whoever runs that macro) for a value. The lesson learned is that a variable needs to have a value assigned to it for the macro to finish, but you don't always have to enter it ahead of time - sometimes you want to get ''input'' from the user.
Du erinnerst dich an das Beispiel, in dem MapTool nach dem Ziel fragte, weil es die Variable nicht kannte? Du musst also einer Variable keinen Wert zuweisen. Machst du das, dann sagst (= deklarierst) du MapTool nur, dass es diese Variable gibt. MapTool wird beim Ausführen des Makros dann fragen, welchen Wert diese Variable denn haben soll. Was du dir merken solltest ist, dass MapTool für jede Variable einen Wert braucht, um ein Makro beenden zu können. Du musst diesen Wert aber nicht unbedingt immer vorher schon festlegen. Manchmal willst du auch bei der Ausführung erst eine Eingabe durch den Anwender.


Variable assignments are the only way to set or change the value of a variable; no variables are modified in-place. If you're using a function to change the value of a variable the function returns the content of the modified variable which must be assigned to the existing variable or a new variable.
Zuweisungen sind der einzige Weg, einer Variable einen Wert zu geben oder ihn zu ändern. Implizit ist es nicht möglich. Wenn du also eine Variable in einer Funktion verwendest, dann ändert sie sich nur, wenn du den neuen Wert der Variable auch zuweist. Was damit gemeint ist, erklärt sich vielleicht auch im nächsten Abschnitt noch besser.


===When to Make an Assignment===
===Wann sollte man eine Zuweisung machen===


MapTool processes each macro command in a macro in order, starting at the top. Therefore, unless you want MapTool to pop up a window asking for input from the user, you have to assign a value to a variable ''before'' you use it! For example, in the macro command:
MapTool arbeitet jede Anweisung in der Reihenfolge ab, in der es sie liest - von oben nach unten. Wenn du also keine Nachfragen nach Variablenwerten willst, müssen die Variablen in ''vor'' diesem Zeitpunkt zugewiesen sein. Zum Beispiel in der folgenden Anweisung:


{{code|The hit does [damage] [damageType] damage, leaving you with [remainingHP] hit points!}}
{{code|Der Angriff durch [schadensart] verursacht [schaden] Schaden und dir bleiben noch [meineTP] Trefferpunkte!}}


Unless you want MapTool to prompt the user for the variables {{code|damage}}, {{code|damageType}}, and {{code|remainingHP}}, you'll want to make sure to give them a value ''before'' you get to that line. Maybe something like:
Wenn du nicht möchtest, dass der Anwender des Makros nach den Werten für {{code|schaden}}, {{code|schadensart}} und {{code|meineTP}} gefragt wird,müssen sie einen Wert zugewiesen bekommen, ''bevor'' diese Zeile ausgeführt wird. Das könnte dann so aussehen:


<blockquote style="background-color:lightgray;">
<blockquote style="background-color:lightgray;">
<syntaxhighlight lang="mtmacro">
<syntaxhighlight lang="mtmacro">
[h:damage = 1d6+4]
[h:schaden = 1d6+4]
[h:damageType = "fire"]
[h:schadensart="Feuer"]
[h:remainingHP = 30 - damage]
[h:meineTP = 30 - schaden]
The hit does [damage] [damageType] damage, leaving you with [remainingHP] hit points!
Der Angriff durch [schadensart] verursacht [schaden] Schaden und dir bleiben noch [meineTP] Trefferpunkte!
</syntaxhighlight>
</syntaxhighlight>
</blockquote>
</blockquote>


As you can see, we've made three variable assignments ''before'' the variables are used in the line about the hit. We've assigned the value of a dice roll of 1d6+4 to the variable {{code|damage}}, the value {{code|"fire"}} to the variable {{code|damageType}}, and the value of the operation {{code|30 - damage}} to the variable {{code|remainingHP}}.
Wie du siehst, haben wir drei Zuweisungen ''vor'' die Zeile von oben geschrieben. Dem {{code|schaden}} haben wir einen Würfelwurf zugewiesen, der Schadensart ein Wort {{code|"Feuer"}} (eine Zeichenkette) und der Wert für {{code|meineTP}} wird mit der Rechnung {{code|30 - schaden}} ermittelt.  
 
If you look carefully, you'll see that we've even used one variable in assigning a value to another variable: the value of the variable {{code|damage}} is used when we assign a value to {{code|remainingHP}} - so variables can be used to set and manipulate other variables.  
 
===Variable Rules===


There are two rules to remember when making up variables:
Ist dir aufgefallen, dass wir sogar eine Variable mit einer anderen bestimmt haben? Der Wert für den Schaden wird genutzt, um von den vorherigen Trefferpunkten abgezogen zu werden und das Ergebnis wird {{code|meineTP}} zugewiesen. Wir können also auch Variablen mithilfe von anderen Variablen verändern.


# No spaces: variable names can't have spaces in them, so you can't use the variable {{code|Hit Points}} - it has to be {{code|HitPoints}}.
===Regeln für Variablen===
# Special Variables: there are several "special variables" that MapTool has reserved - which means you can't use them for other purposes than what MapTool already reserves them for. You can usually tell a special variable because it has a period in it's name, like {{code|[[roll.count]]}} or {{code|[[macro.args]]}}. We'll get into those in another guide, but for now, just know that you can't create a variable with the same name as any of the variables on the [[:Category:Special Variable|Special Variables]] page.


==Stepping Up Our Game==
Es gibt zwei Regeln auf die man bei der Erstellung von Variablen achten muss:


The examples above show very basic macro use: printing text to the chat window at the click of a button; making a simple dice roll inside a macro; and even getting some simple input from the user in order to complete a macro.
# Keine Leerzeichen: Variablennamen müssen immer aus einem Wort bestehen, können also keine Leerzeichen enthalten wie in {{code|Hit Points}} - die Variable muss {{code|HitPoints}} heißen.
# Spezielle Variablen: Es gibt bestimmte Variablen, die MapTool für sich nutzt. Sie dürfen nicht für etwas anderes verwendet werden. Die meisten dieser Variablen erkennst du daran, dass sie einen Punkt im Namen haben, wie etwa {{code|[[roll.count]]}} oder {{code|[[macro.args]]}}. Wir werden uns das an anderer Stelle genauer ansehen; hier nur der Hinweis, dass du keinen der Variablennamen aus der Liste [[:Category:Special Variable|Spezialvariablen]] verwenden kannst.
(''Anm. d. Übers''.: Im Deutschen schreibt man viel mehr zusammen, deshalb hier das englische Beispiel.)


Now, let's step it up: we'll play with some formatting options, change token properties, and look at some basic looping (doing the same thing over and over again) and branching (doing different things based on some condition or situation).
==Komplexere Makros==


===Formatting Options===
Die bisherigen Beispiele waren sehr einfach: Text ausgeben, einen Würfelwurf machen oder einen Wert beim Anwender erfragen.


Macro output (like any chat output) can be formatted using basic HTML tags, as well as some options built into MapTool. We'll first look at the HTML briefly, and then at a couple of [[:Category:Display Roll Option|Display Roll Options]].
Jetzt machen wir es mal ein wenig komplizierter: Wir spielen mit Formatierungsoptionen rum, ändern Eigenschaften von Spielmarken und sehen uns Schleifen (etwas immer wieder tun) und Verzweigungen (je nach Situation etwas anderes tun) an.


====Expanded Rolls====
===Formatierungsoptionen===


In MapTool 1.3.b54, the default way to output the result of a dice roll or calculation is just to print out the total or final value. So if you rolled 1d20+7, what will appear in chat is just the final result, with the tooltip (remember when you hovered your mouse over the number) showing the mathematical breakdown.  
Makroausgaben (wie Text im Chat) kann mit HTML oder einigen Funktionen von MapTool formatiert werden. Zuerst sehen wir uns HTML an, und dann einige [[:Category:Display Roll Option|Anzeige-Würfeloptionen]].


If you wish, you can instruct MapTool to print out the full math breakdown for a roll too, by using a Roll Formatting Option - specifically, the '''Expanded Roll'''.
====Erweiterte Würfelwurfanzeige====


Think of a formatting option as a switch telling MapTool how to treat the results of a roll. To get the expanded form, edit your attack roll macro to show:
Bis zur Version 1.3.b54 war der Standard, nur das Endergebnis von Würfelwürfen oder Berechnungen in den Chat zu schreiben. Wenn du also 1W20+7 würfelst, dann steht nur eine Zahl als Ergebnis im Chat; die Berechnung dazu zeigt der Tooltip (du erinnerst dich an die Einstellung weiter oben).


<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>My attack roll against [target] is [e:1d20+7]!</tt></blockquote>
Wenn du möchtest, kann MapTool auch den gesamten Rechenweg in den Chat schreiben - hierzu verwendest du die ''Erweiterter Wurf''-Option. Sie funktioniert so:


Then, when you run it, you'll get something like this in the chat:
<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>Mein Angriffswurf gegen [ziel] ist [e:1d20+7]!</tt></blockquote>


<blockquote style="border:1px solid gray;width:50%;">My attack roll against <font style="background-color:lightgray; ">Nasty Orcses</font> is <font style="background-color:lightgray; color:blue;">« 1d20+7 = 1 + 7 = 8 »</font></blockquote>
Wenn du das Makro ausführst (und {{code|ziel}} vorher deklariert und einen Wert zugewiesen hast), erhältst du die folgende Ausgabe:


Now you can see the full breakdown of your roll.
<blockquote style="border:1px solid gray;width:50%;">Mein Angriffswurf gegen <font style="background-color:lightgray; ">böse Orkse</font> ist <font style="background-color:lightgray; color:blue;">« 1d20+7 = 1 + 7 = 8 »</font></blockquote>


====Result-Only Rolls====
Jetzt bekommst du den gesamten Rechenweg angezeigt. (In diesem Fall fällt so sofort der kritische Fehler auf.)


But what if you ''don't'' want anyone to be able to see the breakdown? So far, both options still let everyone see the actual roll. For this, you use the '''Result Roll''' option. Edit your macro to look like this:
====Ergebnis-Würfeloption====


<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>My attack roll against [target] is [r:1d20+7]!</tt></blockquote>
Vielleicht möchtest du niemanden sehen lassen, wie es zu einem Ergebnis kommt. Mit den bishergen Methoden kann man sich den Rechenweg - so oder so - anzeigen lassen. Das lässt sich mit dem '''Ergebnis - Wurf''' bewerkstelligen, der so aussieht:


And your output will look like this:
<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>Mein Angriffswurf gegen [ziel] ist [r:1d20+7]!</tt></blockquote>


<blockquote style="border:1px solid gray; width:50%;">My attack roll against <font style="background-color:lightgray">Nasty Orcses</font> is 11!</blockquote>
und die Ausgabe dann so:


Note that there's no gray background behind the number 11, and you can't get a tooltip if you hover over it. The Results Roll option strips out the special formatting, giving you just the plain text. If you wanted to get rid of the highlight behind the words "Nasty Orcses," you can just change the macro to:
<blockquote style="border:1px solid gray; width:50%;">Mein Angriffswurf gegen <font style="background-color:lightgray; ">böse Orkse</font> ist  11!</blockquote>


<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>My attack roll against [r:target] is [r:1d20+7]!</tt></blockquote>
Wie du schon bemerkt hast, ist jetzt kein grauer Hintergrund unter der 11 und dir wird kein Tooltip angezeigt, wenn du darüber fährst. Die Ergebnis-Würfeloption gibt ausschließlich das Endergebnis aus, ohne irgendwie Zugriff auf den Rechenweg zu gewähren. Das funktioniert nicht nur bei Rechnungen und Würfelwürfen. Mit der folgenden Makrozeile kriegst du dann auch die Unterlegung der "bösen Orkse" los:The Results Roll option strips out the special formatting, giving you just the plain text. If you wanted to get rid of the highlight behind the words "Nasty Orcses," you can just change the macro to:


And the name of the target will be shown without any special highlighting.
<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>Mein Angriffswurf gegen [r:ziel] ist [r:1d20+7]!</tt></blockquote>


====Hidden Rolls====
====Versteckt-Würfeloption====


Sometimes, you don't want to see any output from the macro - maybe you just want it to show some text, and do the math in the background, without revealing everything. In those cases, you would replace the "r:" or "e:" in the above examples with an "h:", like in the example below:
Manchmal möchtest du vielleicht von einem Makroblock gar nichts ausgeben lassen oder nur etwas Text ohne die einzelnen Schritt zu offenbaren. In solchen Fällen kannst du das "r:" or "e:" eifach durch ein "h:" ersetzen, wie hier gezeigt:


<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>
<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>
[h:myHP = 30]<br/>
[h:meineTP = 30]<br/>
[h:Bloodied = myHP / 2]<br/>
[h:blutend = meineTP / 2]<br/>
My bloodied value is [Bloodied].</tt></blockquote>
Mein Blutend-Wert ist [blutend].</tt></blockquote>


The example above is a very simple illustration of how the '''hidden roll''' is useful. In that macro, we're doing three things:
Das Beispiel zeigt auf einfache Weise, wann die Versteckt-Option praktisch ist.Das Makro macht drei Dinge:


# Setting the value of the variable ''myHP'' to 30, but telling MapTool to hide this calculation,
# Die Variable ''meineTP''wird deklariert und der Wert 30 zugewiesen; MapTool soll diesen Schritt aber verbergen (h:)
# Setting the value of the variable ''Bloodied'' to the value of ''myHP'' divided by 2, but telling MapTool to hide this calculation too,
# Die Variable ''blutend''wird deklariert und die Hälfte des Wertes von meineTP zugewiesen. MapTool soll auch diesen Schritt verbergen
# Displaying some text, and inserting the value of ''Bloodied'' in at the end of the text output.
# Nun wird ein Text ausgegeben und an dessen Ende der Wert von "blutend"


If you run this macro, the output will look like:
Wenn du das Makro ausführst, bekommst du diese Ausgabe:
<blockquote style="border:1px solid gray; width:50%;">
<blockquote style="border:1px solid gray; width:50%;">
My bloodied value is <font style="background-color:lightgray;">15</font>
Mein Blutend-Wert ist <font style="background-color:lightgray;">15</font>
</blockquote>
</blockquote>


However, if you ''don't'' use the '''hidden roll''' option, the output would look like:
Würdest du die Versteckt-Würfeloption nicht nutzen, dann sähe dein Makro im Chat so aus:


<blockquote style="border:1px solid gray; width:50%;">
<blockquote style="border:1px solid gray; width:50%;">
<font style="background-color:lightgray;">30</font> <font style="background-color:lightgray">15</font> My bloodied value is <font style="background-color:lightgray;">15</font>
<font style="background-color:lightgray;">30</font> <font style="background-color:lightgray">15</font> Mein Blutend-Wert ist <font style="background-color:lightgray;">15</font>
</blockquote>
</blockquote>


The extra numbers come from the two calculations ''before'' the line of text. You don't need to see those, so, conveniently, you can hide them!
Die zusätzlichen Zahlen stammen aus den ersten beiden Zeilen. Du brauchst sie nicht, also kannst du sie verstecken.


====HTML Formatting====
====HTML Formatierung====


MapTool macros support formatting using some basic HTML tags. Let's say you wanted to put the name of your target as one line, the attack roll you're making as another, and as a third line, you wanted to add a dice roll for damage. You might edit your Attack Roll macro to look like this:
MapTool unterstützt im Chat die Formatierung des Textes mit HTML Auszeichnungen nach der Spezifikation HTML3.2. Möchtest du z.B., dass in der ersten Zeile steht, dass du einen Angriff machst und danach soll je eine Zeile für das Ziel, den Angriffswurf und den Schaden kommen, dann könnte das so aussehen:


<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>
<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>
<nowiki>I make an attack roll!<br></nowiki><br>
<nowiki>Ich greife an!<br></nowiki><br>
<nowiki><b>Target</b>: [r:target]<br></nowiki><br>
<nowiki><b>Ziel</b>: [r:ziel]<br></nowiki><br>
<nowiki><b>Attack</b>: [1d20+7]<br></nowiki><br>
<nowiki><b>Angriff</b>: [1d20+7]<br></nowiki><br>
<nowiki><b>Damage</b>: [1d8+5]</nowiki>
<nowiki><b>Schaden</b>: [1d8+5]</nowiki>
</tt></blockquote>
</tt></blockquote>


When you run that macro, your output in chat will look like:
Im Chat sähe das dann so aus:


<blockquote style="border:1px solid gray; width:50%;">
<blockquote style="border:1px solid gray; width:50%;">
I make an attack roll!<br/>
I make an attack roll!<br/>
'''Target''': Nasty Orcses<br/>
'''Ziel''': Böse Orkse<br/>
'''Attack''': <font style="background-color:lightgray;">15</font><br/>
'''Angriff''': <font style="background-color:lightgray;">15</font><br/>
'''Damage''': <font style="background-color:lightgray;">7</font><br/>
'''Schaden''': <font style="background-color:lightgray;">7</font><br/>
</blockquote>
</blockquote>


That's just simple formatting - you could put the output in a table, change the font and background colors, change its size...many options are available!
Das ist eine sehr einfache Formatierung; du könntest die Ausgabe auch in eine Tabelle setzen, Schriftart und Farbe des Textes anpasen oder den Hintergrund einfärben... es gibt viele Möglichkeiten.


'''NOTE''': If you're handy with HTML, be aware that MapTool supports HTML 3.2 - so things like the <nowiki><br></nowiki> tag should ''not'' be closed - it's <nowiki><br></nowiki>, not <nowiki><br/></nowiki>. Additionally, MapTool supports a subset of CSS 1 in the form of in-line styles, and also style sheets in certain instances. More information on the supported CSS tags can be found at [[Supported CSS Styles]].
'''ANMERKUNG''': Wenn du dich mit HTML auskennst, achte darauf, dass der Chat nur HTML3.2 versteht. Der Zeilenumbruch kennt keinen Schrägstrich (<nowiki><br></nowiki>). Du kannst auch einen Teil der Spezifikation für CCS1 als Inline-Styles und Stylesheets nutzen. Mehr Informationen über die unterstützten CSS-Tags findest du in [[Supported CSS Styles]].


===Using Token Properties===
===Spielmarkeneigenschaften nutzen===


So far, we've manipulated some variables that are entered ahead of time, or that MapTool will ask for when you run a macro. We've got a formatted attack macro that lists a target, an attack, and a damage roll. However, we're still either ''hardcoding'' the values into the macro, or having the user put them in themselves every time they're needed. Since RPG characters are not all the same, we'll have to figure out a way to automate some of the numbers, so we can:
Bisher haben wir Variablen verwendet, die wir vorher deklariert und zugewiesen haben. Wir haben ein Angriffsmakro mit der Angabe eines Ziel seinem Angriff und Schaden geschrieben. Die Werte in den Makros waren dabei bisher immer ''hard-coded'', d.h. sie wurden entweder fest eingegeben, über einen Dialog abgefragt oder aus einer festgelegten Formel erwürfelt. Da Rollespielcharaktere nicht alle gleich sind, wollen wir nun dafür sorgen, dass unser Makro dem Rechnung trägt. Wir wollen:


# Make one macro that many people or characters can use
# Eine Makro, dass für verschiedene Charaktere individuell reagiert
# Minimize how much typing we have to do!
# Ein Makro, dass für verschiedene Spielmarken verwendet werden kann
# Möglichst wenig tippen müssen


As discussed in the [[Introduction to Tokens]], every token carries around with it a personal "character sheet" of sorts, in the form of the token's ''properties''. These properties can be ''referenced'' by a macro - so you can, for instance, write a macro that says "Roll 1d20, and add my character's Dexterity to the roll." I'm sure you see how this might be useful.
Wie in der Beschreibung zu den [[Introduction to Tokens/de|Spielmarken]] beschrieben, hat jede ihr eigenes Charakterblatt mit Eigenschaften und Werten. Auf diese Eigenschaften und Werte können wir in einem Makro Bezug nehmen und sie verändern. Wir können also in einem Makro sagen: "Würfle 1W20 und addiere meine Geschicklichkeit." Ich denke, du erkennst sofort, wie nützlich das sein kann.


====Setting Some Sample Properties====
====Ein paar Muster-Eigenschaften====


Of course, for token properties to work, we've got to set them up. It's a good thing you read the [[Introduction to Properties]] and created a campaign file for the MapTool RPG [[Sample Ruleset]]!
Für Makros, die mit Eigenschaften arbeiten sollen, sollten wir ein paar Eigenschaften haben. Ein guter Weg ist, den Artikel "[[Introduction to Properties/de|Eigenschaften in MapTool]]" durchzugehen und die Beispielkampagne für unser [[Sample Ruleset/de|MapTool Rollenspiel]] zu erstellen!


The first step is to open up the '''MTRPG.cmpgn''' file (or whatever name you saved it as), and drag a token onto the map (if you don't already have one on there). If you've got no idea what that means, check out the [[Introduction to Mapping]] to learn about making maps and putting tokens on them. Now, follow these steps:
Der erste Schritt ist, die Kampagne zu laden und eine Spielmarke auf die Karte zu ziehen. Achte darauf, dass du dabei auf dem Spielmarkenebene bist. Solltest du gerade nicht wissen, was hier gemeint ist, dann sieh dir die [[Introduction to Mapping/de|Einführung ins Kartenzeichnen]] an und kehre dann hierher zurück. Weiter geht es so:


1. Double click on a token to open the '''Edit Token''' dialog.
1. Öffne mit Doppelklick auf die Spielmarke den Dialog "Spielmarke bearbeiten".


2. Go to the tab marked '''Properties'''.
2. Wechsle auf den Reiter '''Eigenschaften'''.


3. You'll see a spreadsheet-style list of all the properties in the token that you can edit directly (tokens have other properties that can be edited only with macros, but for now, let's not worry about them!). You should see (if you're using the MTRPG.cmpgn file we set up in [[Introduction to Properties]]):
3. Hier siehst du eine Tabelle mit allen Eigenschaften der Kampagne und den individuellen Werten der Spielmarke, die du hier auch ändern kannst. Es gibt auch Eigenschaften der Spielmarke, die du hier nicht siehst und die nur per Makro verwendet werden können; das soll uns aber jetzt erst einmal nicht interessieren. Du solltest (wenn du die MapTool-Kampagne aus [[Introduction to Properties/de|Eigenschaften in MapTool]] nutzt) das hier sehen:


<blockquote style="background-color:lightgray; width:50%;"><tt>
<blockquote style="background-color:lightgray; width:50%;"><tt>
  *Strength:1<br>
  *Stärke:1<br>
  *Dexterity:1<br>
  *Geschick:1<br>
  *Intelligence:1<br>
  *Intelligenz:1<br>
  *Endurance:1<br>
  *Ausdauer:1<br>
  *HitPoints(HP):{Endurance * 6}<br>
  *Trefferpunkte(TP):{Ausdauer * 6}<br>
  *Armor(AR)<br>
  *Rüstungsklasse(Rl)<br>
  *Movement(MV):{Dexterity}<br></tt>
  *Bewegung(Bw):{Geschick}<br></tt>
</blockquote>
</blockquote>


4. Click in the cell next to Strength. A cursor will appear, showing that you can type in that cell. Enter a number in that cell as the token's Strength value. I'm going to use 6.  
4. Klicke in die Textzeile Neben Stärke. Ein Cursor erscheint, damit du etwas eingeben kannst. Trage eine Zahl ein, die die Stärke angibt. Ich wähle die sechs.  


5. Repeat step 4 for Dexterity, Intelligence, and Endurance, choosing whatever number you like (I'm going to use 3, 2, and 6, respectively). Remember that ''HitPoints'' and ''Movement'' will be automatically calculated!
5. Wiederhole das für alle anderen Hauptattribute. Trefferpunkte und Bewegung müssen nicht eingegeben werden; sie werden errechnet.


6. Click '''OK'''. You have just manually updated the token's properties. If you double-click on the token, and look at those properties again, you'll see that the numbers you entered are remembered.  
6. Wähle '''OK'''. Du hast jetzt manuell die Eigenschaften dieser Spielmarke angepasst. Wenn du den eben geschlossenen Dialog wieder öffnest, sind deine geänderten Werte noch zu sehn.


You'll also see that now, when you hover your mouse over the token, a little popup appears in the lower left corner of the map, showing the values for the properties you've entered. This popup is called the '''Statsheet''', and is a quick way to look at the token's properties - it's basically a convenient quick-reference "character sheet."
Wenn du mit der Maus über die Spielmarke fährst, siehst du auch deine Werte neben einem Porträt der Spielmarke: das Werteblatt. Das Werteblatt ist eine Schnellübersicht über die Eigenschaften einer Spielmarke - eine Art schnell erreichbares Charakterblatt.


====Referencing a Token Property in a Macro====
====Auf Eigenschaften der Spielmarke im Makro zugreifen====


Now that we've configured some token properties, let's use them in a macro. For our first macro, we're going to roll 1d20, and instead of adding 7, we're going to add the token's '''Strength'''.  
Da unsere Spielmarke jetzt eigene Werte hat, wollen wir im Makro darauf zugreifen. Für das erste Makro würfeln wir mit 1W20. Statt aber einfach 7 zu addieren, zählen wir die '''Stärke''' unserer Spielmarke hinzu.


1. Open up your Attack Roll macro.
1. Öffne dein Angriffsmakro.


2. In the lower left corner, make sure the box '''Apply to Selected Tokens''' is checked (otherwise, the macro won't know which token's Strength to use!)
2. Prüfe, dass im Reiter '''Details''' das Häkchen bei "Auf ausgewählte Spielmarken anwenden" markiert ist. Andernfalls weiß das Makro nicht, wessen Stärke es nutzen soll.
 
3. Trage das Makro im Reiter '''Editor''' wie folgt ein:
3. Edit your macro to look like this:


<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>
<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>
<nowiki>I make an attack roll!<br></nowiki><br>
<nowiki>Ich greife an!<br></nowiki><br>
<nowiki><b>Target</b>: [r:target]<br></nowiki><br>
<nowiki><b>Ziel</b>: [r:ziel]<br></nowiki><br>
<nowiki><b>Attack</b>: [1d20+Strength]<br></nowiki><br>
<nowiki><b>Angriff</b>: [1d20+Stärke]<br></nowiki><br>
<nowiki><b>Damage</b>: [1d8+5]</nowiki></tt>
<nowiki><b>Schaden</b>: [1d8+5]</nowiki>
</blockquote>
</blockquote>


You'll note I replaced the 7 with the word "Strength." Since ''Strength'' is not in quotes, MapTool will know that you mean it to be a variable, and it will look on the ''current token'' (that is, the token that is selected) for a property called ''Strength''. If it doesn't find it (or if the property has never been set), it will prompt you for it (just like you were prompted for the value of ''target''). If it ''does'' find it, MapTool will put the value of ''Strength'' into the macro when it runs.  
Du siehst, dass hier der Wert 7 durch das Wort Stärke ersetzt ist. Da Stärke nicht in Anführungszeichen geschrieben steht, sucht MapTool nach einer Variable dieses Namens bei der aktuellen Spielmarke (also die gerade gewählte). Wird diese Variable dort nicht gefunden oder wurde ihr nie ein Wert zugewiesen, dann wird MapTool dich nach dem Wert fragen. Wenn das Makro die Eigenschaft findet, weist es der Variable den Wert der Eigenschaft zu. Du kannst das im Tooltip des Ergebnisses prüfen.


4. Select your token, and run the macro by clicking the button. The output will look something like:
4. Also los! Wähle die Spielmarke und lasse sie angreifen. Im Chat siehst du jetzt etwa das:  


<blockquote style="border:1px solid gray; width:50%;">
<blockquote style="border:1px solid gray; width:50%;">
I make an attack roll!<br>
I make an attack roll!<br/>
Target: Nasty Orcses<br>
'''Ziel''': Böse Orkse<br/>
Attack: <font style="background-color:lightgray;">27</font><br>
'''Angriff''': <font style="background-color:lightgray;">26</font><br/>
Damage: <font style="background-color:lightgray;">6</font>
'''Schaden''': <font style="background-color:lightgray;">6</font><br/>
</blockquote>
</blockquote>


The important thing to note is that if you hover over the attack roll result, the tooltip will now say something like ''&laquo; 1d20 + Strength = 17 + 10 &raquo;'' indicating that the value being plugged in to the dice roll is the property ''Strength''.
Wichtig ist hier, dass du im Tooltip des Angriffs siehst, dass das Makro nun tatsächlich die Eigenschaft Stärke der Spielmarke verwendet.


====Changing a Property with a Macro====
====Eine Eigenschaft mit einem Makro ändern====


Token properties can also be changed using a macro. Suppose we want to reduce the token's hit points after an enemy hit the character. You can manually edit the token and change the value in the ''HP'' property, or you can create a macro that subtracts the amount of damage from the value of ''HP''. Here's how:
Die Eigenschaften von Spielmarken können auch von einem Makro geändert werden. Stelle dir vor, wir wollen die Trefferpunkte eines Charakters verringern, wenn ein Monster ihn trifft. Du kannst das manuell machen (was ziemlich nervig wird) oder dein Makro erledigt das einfach automatisch. Das geht dann so:


1. Create a new macro on the '''Campaign''' panel.
1. Erzeuge ein neues Makro im Kampagnenfenster.


2. In the '''Label''' field, enter "Damage".
2. Trage bei '''Beschriftung''' das Wort "Schaden" ein.


3. In the '''Command''' field, enter:
3. In den Reiter Editor kommt jetzt:


<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>
<blockquote style="background-color:lightgray; border=1px solid gray; width:50%;"><tt>
Aarrgh! I'm hit! I have [HitPoints = HitPoints - damage] hit points left. </tt>
Autsch! Ich wurde getroffen. Ich habe noch [Trefferpunkte = Trefferpunkte - schaden] Trefferpunkte übrig. </tt>
</blockquote>
</blockquote>


4. Check the box '''Apply to Selected Tokens''' (in the lower left corner).
4. Prüfe, dass im Reiter '''Details''' das Häkchen bei "Auf ausgewählte Spielmarken anwenden" markiert ist.


5. Click '''OK'''. When you run the macro, you will be prompted for a value to put in the variable ''damage''. I put in the number 7. The output will look something like this:
5. Wähle '''OK'''. Wenn du das Makro ausführst, wirst du nach dem Schaden gefragt. Anschließend wird diese Zahl von den Trefferpunkten der Spielmarke abgezogen. Ich wähle 4.


<blockquote style="border:1px solid gray; width:50%;">
<blockquote style="border:1px solid gray; width:50%;">
Aarrgh! I'm hit! I have <font style="background-color:lightgray;">23</font> hit points left
Autsch! Ich wurde getroffen. Ich habe noch <font style="background-color:lightgray;">2</font> Trefferpunkte übrig!
</blockquote>
</blockquote>


And, if you double click on the token, you will see that the property ''HP'' is now 23. What this macro did was:
Du kannst dir die Eigenschaften der Spielmarke jetzt ansehen und stellst fest, dass die Trefferpunkte dem Wert entsprechen, der in deinem Chat genannt ist. Was ist genau passiert? Das Makro...


# Prompt the user for a value for ''damage'' (in this example, I entered 7)
# fragt nach der unbekannten Variable "schaden". (ich habe 4 eingegeben.)  
# Retrieve the value of ''HitPoints'' from the token (in this example, the value is 30, because it is equal to Endurance * 6)
# erhält den Wert der ''Trefferpunkte'' vom aktuellen Token (hier 6)
# Subtract the value of ''damage'' from the value of ''HitPoints'' (30 - 7, resulting in 23)
# zieht von den Trefferpunkten den Schaden ab (6-4=2)
# Set the value of ''HitPoints'' (originally 30) to the newly calculated total (23)
# schreibt in die Eigenschaft ''Trefferpunkte'' der Spielmarke den neuen Wert (2)
# Output the text and the new value of ''HitPoints'' to chat
# gibt den Text mit dem neuen Wert im Chat aus


===String Concatenation===
===Verknüpfung von Zeichenketten===


An essential ability to master when writing macros is the ability to assemble ''strings'' - that is, collections of alphanumeric characters that are then manipulated or sent to chat. Frequently, you'll want to construct a string from some text that is always the same ("hardcoded" text) and text that can change (text that is the value of a variable, in other words). The construction of a string is often called "concatenation," but it just means "building a long string out of multiple short pieces."
Eine wichtige Fähigkeit beim -schreiben von Makros ist der richtige Umgang mit Zeichenketten. und wie man sie zusammenfügt. Zeichenketten sind Reihen von alphanumerischen Zeichen, die dann im Makro verändert oder an den Chat gesendet werden können. Oft wirst du Text an den Chat schicken wollen der zum Teil aus fest vorgegebenen Passagen (''hardcoded'' text) und zum anderen aus solchem besteht, der sich je nach Wert einer Variable oder eines Würfelwurfes verändert. Dieses Zusammenfügen verschiedener Textteile wird oft als ''Verkettung'' bezeichnet. Es bedeutet einfach, verschiedene Texte aneinander zu reihen und aus kurzen Stücken einen langen Text zu erzeugen.


There are two ways to do this in a macro - outside of a macro command, and inside of a macro command.
Es gibt zwei Möglichkeiten der Verkettung in einem Makro:


====Outside of a Command====
====Außerhalb einer Anweisung====


The basic way a macro works is this:
Die grundsätzliche Arbeitsweise eines Makros ist:


# The parser reads through the whole macro, and separates the macro commands from the plain text
# Der Parser liest ein Makro und trennt die Makroblöcke vom reinen Text
# The parser diverts those macro commands to the appropriate places to be processed (so, numbers are added up, dice are rolled, etc.)
# Der Parser verteilt die einzelnen Makroanweisungen an die passenden Stellen, wo sie verarbeitet werden (Zahlen werden addiert, Würfelwürfe gemacht etc.)
# The processed commands are sent ''back'' to the parser, which substitutes the ''results'' of those commands in the place where each command was.
# Die Ergebnisse der verarbeiteten Anweisungen kommen zurück und werden an den Stellen, von denen die Anweisungen geholt wurden eingesetzt.
# The whole mess - plain text, and the results of the commands (now sitting in place of the actual commands) is sent to the chat window.
# Das ganze Durcheinander - Textteile und die Ergebnisse der Anweisungen (anstelle der Anweisungen) - wird zum Chatfenster weitergegeben.


So, when you want to display the result of a command along with some text (for instance, you want to print the word "Attack:" and then next to it print the result of a 1d20 roll) in a macro, the easiest way is to just insert a command in the right place in your text, like so:
Willst du einen Text zusammen mit dem Ergebnis einer Makroanweisung (z.B. das Wort "Angriff:" und dann einen erwürfelten und/oder berechneten Wert) in deinem Makro ausgeben, dann ist der einfachste Weg, die Anweisung an der Stelle einzusetzen, wo später deren Wert ausgegeben werden soll, also:


<blockquote>
<blockquote>
<syntaxhighlight lang="mtmacro">
<syntaxhighlight lang="mtmacro">
Attack: [1d20]
Angriff: [1d20]
</syntaxhighlight>
</syntaxhighlight>
</blockquote>
</blockquote>


The parser will read that whole thing, send off the command {{code|[1d20]}} to be processed, and when it gets that result back, plug it in in place of the command, and send it off to chat. The result will be something like "Attack: 17."
Der Parser liest alles, schickt die Anweisung los (1W20 würfeln: {{code|[1d20]}}), bekommt das Ergebnis (z.B. 17) zurück und ersetzt die Anweisung durch das Ergebnis und übergit es an den Chat: "Angriff: 17".


That's the most straightforward way to send text to chat - just put the variables you want displayed in the right place in the text, and they will be shown in the chat window.
Das ist der direkteste Weg, Text an den Chat zu schicken - setze die Variablen an die richtigen Stellen im Text und schicke das an das Chatfenster.


====Inside of a Macro Command====
====Innerhalb der Anweisung====


Sometimes, though, you need to use strings ''inside'' of the square brackets. In that case, putting them together is a little different. First of all, within square brackets, you need to use single or double quotes to surround something you want to be treated as a string. Otherwise, MapTool will think you want each word to be a variable! For example:
Manchmal ist es aber notwendig, Text innerhalb eines Anweisungsblocks (innerhalb der eckigen Klammern) zu verarbeiten.In diesem Falle muss man etwas anders vorgehen.Zuerst einmal brauchst du im Makroblock für Text immer einfach oder doppelte Anführungszeichen. Andernfalls hält der Parser sie für Variablen! Ein Beispiel:


'''Correct String'''
'''Richtige Verwendung'''
<blockquote>
<blockquote>
<syntaxhighlight lang="mtmacro">
<syntaxhighlight lang="mtmacro">
[string = "This is a string"]
[string = "Dies ist eine Zeichenkette"]
</syntaxhighlight>
</syntaxhighlight>
</blockquote>
</blockquote>


'''Incorrect String'''
'''Falsche Verwendung'''
<blockquote>
<blockquote>
<syntaxhighlight lang="mtmacro">
<syntaxhighlight lang="mtmacro">
[string = This is a string]
[string = Dies ist eine Zeichenkette]
</syntaxhighlight>
</syntaxhighlight>
</blockquote>
</blockquote>


Remember - outside of square brackets, no need for quotes. Inside? QUOTES.
'''Merke''': Außerhalb der eckigen Klammern: keine Anführungszeichen - innerhalb? ANFÜHRUNGSZEICHEN!


So what if we need to build up a string dynamically? That is, what if we need to make a string that is partly "hardcoded," and partly based on user input? You can't guess what the user is going to say, so you can't write that part ahead of time. What you ''can'' do is ''concatenate'' the user input into your hardcoded string. The way to do that is to use the plus sign ('''+'''), which - when it's used with ''strings'' - will piece them together into a long string.  
Wie geht das dann, wenn wir einen Text brauchen, der teils festgelegt ("hardcoded") und teils variabel oder per Eingabe des Benutzers erzeugt ist. Du kannst vorher nicht wissen, welche Eingabe der Nutzer macht. Du kannst den Text also auch nicht vorher komplett schreiben. In einem Makro fügen wir die Texte mit einem Plus-Zeichen ('''+''')aneinander. Wird es mit einem Text verwendet, dann verkettet es die beiden zu einem längeren Text.


Here's an example: suppose we want the user to enter the name of a skill, and we then want to put that skill name into an existing, hardcoded string, which will be stored in another variable. You would do that like this:
Hier ein Beispiel: Angenommen, wir wollen den Nutzer den Namen einer _Fertigkeit eingeben lassen.Dann wollen wir diesen Fertigkeitsnamen in unserem Text wieder in eine andere Variable schreiben. Du würdest das so machen:


<blockquote>
<blockquote>
<syntaxhighlight lang="mtmacro" line>
<syntaxhighlight lang="mtmacro" line>
[h:existingString = "The skill name you entered is "]
[h:festerText = "Der Name der eingegebenen Fertigkeit ist "]
[h:concatString = existingString+skill+"."]
[h:verketteterText = festerText+fertigkeit+"."]
[r:concatString]
[r:verketteterText]
</syntaxhighlight>
</syntaxhighlight>
</blockquote>
</blockquote>


What happens here is this:
Was hier passiert:


* Line 1 sets the "hardcoded" portion of the output
* Zeile 1: setzt den unveränderlichen Text fest
* Line 2 sets the concatenated string - {{code|concatString}} to equal the value of {{code|existingString}} ''plus'' the value of {{code|skill}} (which MapTool will prompt for). However, in this case, since MapTool knows that {{code|existingString}} is a string, it will not try to add them mathematically, but just append the value of {{code|skill}} after the value of {{code|existingString}}. To be grammatically correct, we concatenate another little string on the end, this time, the period. Remember - strings inside square brackets need to be in quotes (but variable names, of course, do not!)
* Zeile 2 deklariert eine weitere Variable für den Ergebnistext und weist ihr eine Verkettung von drei anderen Teilen zu:
* Line 3 displays the final value of {{code|concatString}}, after {{code|skill}} has been appended to it. The output will look something like:
** den unveränderlichen Text
** die neu deklarierte Variable "fertigkeit"
** eine Zeichenkette mit nur einem Zeichen (",")
* Maptool weiß, dass die erste Variable eine Zeichekette enthält, also wird es trotz des Pluszeichens nicht versuchen, die Werte zu addieren. Stattdessen verkettet es die Werte. Da die Variable keinen Wert enthält (keine Zuweisung hat), fragt MapTool den Anwender nach dem Wert für "fertigkeit" und hängt dann diese Zeichenkette und den Punkt an.
* Zeile 3 zeigt den Wert der Variable "verketteterText" im Chat an.


<blockquote>
<blockquote>
The skill name you entered is Archery.
Der Name der eingegebenen Fertigkeit ist Schmieden.
</blockquote>
</blockquote>


That's a very simple example, but it illustrates the essence of constructing strings - you "add" them together with a plus sign.
Das ist ein einfaches Beispiel, aber es zeigt gut, wie innerhalb eines Makros mit Texten umgegangen wird - sie werden mit Pluszeichen verkettet.


==Where do We Go From Here?==
==Wie geht es jetzt weiter?==


This guide barely brushes the surface of the full potential of the macro language in MapTool. However, using just the basic techniques shown here, you can create a lot of very handy, convenient macros to make playing your game easier and more fun. In future guides, I'll cover more advanced macro commands and techniques.
Diese Anleitung hat nur an der Oberfläche dessen gekratzt, wozu Makros in MapTool fähig sind. Schon mit diesen einfachen Anweisungen kann man aber viele nützliche Dinge tun und wiederkehrende Abläufe beschleunigen und dem Spielspaß mehr Raum schaffen.  
Nach dem Testen (!) mit ein paar selbst geschriebenen Makros kannst du dir mal die Artikel über [[Introduction to Macro Branching|Verzweigungen]] (en), [[More Branching Options|Weitere Verzweigungsmöglichkeiten]] (en) und [[Introduction to Macro Loops|Schleifen]] (en) ansehen. Eine gute Option sind auch immer andere Makros, die du in Frameworks findest, im Forum oder in den entsprechenden Discordkanälen.
Viel Spaß!
{{Languages|Introduction to Macro Writing}}
{{Languages|Introduction to Macro Writing}}

Latest revision as of 07:06, 6 September 2023

Languages:  English  • Deutsch  • français  • italiano  • 日本語  • 한국어

BEGINNER
THIS IS A BEGINNER ARTICLE


Das wirklich Wichtige hier: Code Syntax

Wenn du bisher nie Code geschrieben hast, wird das nun Folgende erst einmal KEINEN Sinn für dich machen (aber lies weiter). Hier findest du die wichtigsten Grundlagen zu (MT-)Makros in MapTool. Wenn du am Ende dieses (recht langen) Textes angekommen bist, komm wieder hierher und lies den Text noch einmal. Wenn du dann deinen ersten Code geschrieben hast, komm hierher und lies wieder. Dann wird das hier Gelesene jedesmal mehr Sinn machen bis du irgendwann komplett durchblickst ("Heureka"). Dann wirst du verstehen, warum das hier er wichtigste Teil des Wikis ist. :D Gutes Gelingen.

Wenn du dich mit dem Coden auskennst und du das hier auf Anhieb verstehst, wirst du wissen, warum das hier der wichtigste Teil des Wikis ist.

Wie immer bei Code gibt es eine Syntax, an die du dich halten musst. ALLE Maptool Skript-/Codezeilen bestehen aus 0 oder mehr Optionen und einer Funktion bzw. einem Ausdruck (mit einer Ausnahme: [code():]).

Ein paar Begriffserklärungen:

Eine Option ist etwas, was die Ausgabe im Chatfenster beeinflusst, zum Beispiel:

  • Die Option [h:] versteckt (engl. hidden) die Ausgabe des Ergebnisses der Funktion
  • Die Option [r:] zeigt nur das Ergebnis (engl. result)
  • Die Option [if():] zeigt nur das eine oder andere Ergebnis (abhängig davon, wie die Prüfung ausfällt)

Wenn es keine Optionen gibt, wird die gesamte Ausführung der Funktion im Chat ausgegeben.

Beachte, dass es viel mehr Würfeloptionen gibt.

Ein Ausdruck ist ein Wert oder eine Kombination von Werten und Operatoren (wie '+', '-', '*', '/', etc.).

Eine Funktion ist etwas, das ein Ergebnis zurückliefert. Du hast also einen Ausgangswert (oder mehrere) und wendest darauf eine Funktion an, um ein Ergebnis zu bekommen. Das Ergebnis entsteht also aus dem Ausgangswert, indem er von der Funktion verarbeitet wird. Beispiele:

  • Die Funktion abs() gibt den positiven Wert einer Zahl (=Ausgangswert), indem es das Minuszeichen entfernt, sofern eins vorhanden war. abs(-3) ergibt also 3. Der Ausgangswert ist -3 und das Ergebnis ist 3.
  • Die Funktion if() (es gibt sowohl eine Option [if():] als auch eine Funktion if()) erhält zwei Ausgangswerte und eine Bedingung. Sie gibt den ersten Ausgangswert (oder eine Berechnung daraus) zurück, wenn die Bedingung wahr ist oder entsprechend den zweiten Wert (oder die Berechnung mit dem zweiten Wert), wenn die Bedingung falsch ist. Die Funktion if(0,"Black", "White") gibt "White" zurück, da der Rechner "0" als falsch interpretiert. Anmerkung: Da dies eine Funktion ist, werden beide möglichen Ergebnisse berechnet aber nur eins von beiden wird zurückgegeben.

Aufbau von Funktionen

Allgemein sieht eine Funktion immer so aus:

 [option, option, ...: ergebnis = funktion(wert, parameter)] 

z.B.

 [h: var = 2]
 [h: ergebnis = if(var == 3, "die Aussage ist richtig", "die Aussage ist falsch")] 
 [r,s:  ergebnis]

Erläuterung (hier erst einmal sehr ausführlich):

 Erste Zeile: h (Option: zeige nichts im Chat an): var (ein Wert mit dem Namen var) = 2
 Zweite Zeile: h (Option: zeige nichts im Chat an): ergebnis (ein Wert mit dem Namen ergbenis) = (das Ergebnis der Funktion) if
     (Die Bedingung von) if (prüft, ob) var == 3 (, ob also 2 genau so groß ist wie 3; die Bedingung ist also falsch)
     (Die Funktion gibt also das zweite Ergebnis an die Variable ergebnis zurück, weil die Bedingung falsch ist.)
 Dritte Zeile: r (zeige das Ergebnis), s (und zwar nur dem Ausführenden): ergebnis (schreibe den Wert der Variable ergebnis in den Chat) 

Im Chat erscheint nun:

 die Aussage ist falsch
 

Beachte, dass JEDES Skript (also der Makrocode) mit einer eckigen Klammer "[" beginnt und endet "]". Wenn Optionen verwendet werden, werden sie immer durch EINEN Doppelpunkt ":" von der Funktion getrennt. Wenn du mehr als eine Option verwenden möchtest, werden diese durch Kommata "," getrennt. Es gibt NIE mehr als EINE von diesen drei ("[", "]" und ":") Zeichen in einer Skriptaussage. Alles AUSSERHALB der beiden Klammern "[" und "]" ist Klartext (oder HTML) und KEIN Code, egal was darin steht. Dieser Klar- oder HTML-Text wird IMMER unverändert im Chatfenster erscheinen und kann nicht durch Code beeinflusst werden.

Wie gesagt, mag das jetzt keinen Sinn ergeben haben. Schreib es auf einen Zettel, pinne ihn dir irgendwohin und lies es hin und wieder. Es wird Sinn machen!

Zeichenkette contra Variable

Eine weitere häufige Panne ist für Anfänger die Behandlung von Zeichenketten gegenüber Variablen. Wenn der vorige Satz dir nichts erklärt, dann sieh dir den folgenden Code an:

 [variable = "String"]

Eine Variable ist ein Gefäß in dem man irgendetwas aufbewahren kann. Eine Zeichenkette ("String") ist ein Stück Text (der aus Buchstaben, Ziffern und Satzzeichen besteht), der in Anführungszeichen eingeschlossen ist. Das können einfache oder doppelte (Gänsefüßchen) sein. Beachte, das du auch eine Zahl (z.B. 50) in eine Variable packen kannst. Zahlen unterscheiden sich von Zahlen-Zeichenketten durch die fehlenden Anführungszeichen. Aus diesem Grund kann eine Variable nicht mit einer Zahl beginnen! (MapTool wäre sehr verwirrt.) Beispiele:

 FALSCH: [42Variable = "Hello World"] (Es kann wirklich seltsamer Kram passieren, wenn du sowas schreibst)
 RICHTIG: [Variable42 = "Hello World"]

Beachte: Code ist alles IN den [Klammern]; außerhalb ist alles einfacher Text. Es ist egal, ob dort etwas in Anführungszeichen steht oder nicht: Es ist Text.

Achte darauf, dass der Wert einer Variable eine Zahl oder ein Text sein kann:

 [variable = 42] 42 als Zahl gespeichert
 [variable = "42"] 42 als Text gespeichert

Aber... (und das kann wirklich richtig nerven) sobald eine Zeichenkette, die nur aus Ziffern besteht, in einer Aussage verwendet wird, wird sie automatisch in eine Zahl konvertiert!! Das kann für viel Verwirrung sorgen. Hier der Grund:

 [x = 21 + 21] speichert die Zahl 42 in der Variable x
 [y = "21" + "21"] or [y = "21" + 21] speichert die ZAHL 2121 in der Variable y

Hier nimmt MapTool den falschen Weg:

 [x = "2"]
 [y = "3"]
 [z = x + y]

Das sollte 23 ergeben, es wird aber zum Ergebnis 5 führen!! Der einzige Weg, um MapTool zu zwingen, die Werte der Variablen als Text zu interpretieren besteht darin, eine Variable mit einem leeren Text zu verbinden:

 [z = x + (y+"")]

Das ergibt 23. Die Variable y wird hier gezwungen, sich wie eine Zeichenkette zu verhalten und dann mit der als Zahl interpretierten Variable x verbunden. Da x mit einer Zeichenkette nicht addiert werden kann, verhält auch sie sich nun als Zeichenkette.


Wenn du hierher wegen des Verweises 'lies das' kamst, dann kannst du hier erst einmal aufhören. Was bis hier stand war der 'musst du gelesen haben'-Teil. Wenn du ein Anfänger bist, dann lies weiter.

Was ist ein Makro?

Wie schon im Artikel zu den Spielmarken-Makros erwähnt, ist ein Makro einfach ein Weg, Aufgaben in MapTool zu automatisieren. Im Wesentlichen sind Makros Skripte, die von einem Parser gelesen wird, der sie interpretiert und dafür sorgt, dass die richtigen Dinge am richtigen Ort passieren, z.B. dass zwei Zahlen addiert werden statt das alles einfach nur als Text im Chat ausgegeben wird.

Makros starteten in MapTool ganz klein, wurden aber inzwischen zu einer umfangreichen Programmiersprache mit einem vielfältigen Satz an Kommandos und Funktionen, die fast alles können, was du dir nur vorstellen kannst.

Was du schon wissen solltest

Makros sind der Punkt, an dem wir in die mächtigeren - und komplexeren - Möglichkeiten von Maptool eintauchen. Auch wenn diese Anleitung für Einsteiger sein soll, müssen an dieser Stelle einige Dinge vorausgesetzt werden:

  1. Du hast die Einführung ins Kartenzeichnen gelesen, bist also vertraut mit der MapTool-Oberfläche und weißt, wie man Karten erstellt, Kampagnendateien speichert und Spielmarken auf der Karte platziert.
  2. Du hast auch Erstellung und Nutzung von Spielmarken gelesen und hast eine grundsätzliche Vorstellung davon, wie man mit Spielmarken umgeht, wie man ihre Eigenschaften aufruft usw.
  3. Schließlich, da Makros sehr stark mit den Eigenschaften von Spielmarken (und Kampagnen) agieren, hast du die Eigenschaften in MapTool durchgearbeitet, eine neue Kampagne auf Basis des MTRPG Regelwerks erstellt. Hast du das nicht getan, dann tu das jetzt. Nur so machen die weiteren Erklärungen und Beispiele Sinn.

Voraussetzungen schaffen

Eine wichtige Voraussetzung ist, dass eine bestimmte Einstellung in MapTool gesetzt ist, damit die folgenden Beispiele auch funktionieren. Es geht um Hilfetexte für eingebettete Würfelwürfe verwenden, die unbedingt aktiv sein muss. Zur Erläuterung:

Im Standard wird bei der Ausführung von Macros alles in Chat ausgegeben, was im Makro passiert. Das ist bei kleinen Macros nicht weiter wild und sieht vielleicht so aus:

Angriffswurf: « Wurf + Bonus = 18 + 9 = 27 » gegen AC

Ein bisschen hässlich, aber nicht schlimm. Bei schwierigeren Aufgaben eines Makros kann das dann aber anders aussehen:

Giftwolke gegen: « angriff = 1d20+angriffBonus = angriff = (4 + 7) = 11 » « schaden = 1d6 + 2 = schaden = (5 + 2) = 7 » Ziel 0: Angriff 11; « schaden = 7 » schaden. « angriff = 1d20+angriffBonus = angriff = (14 + 7) = 21 » « schaden = 1d6 + 2 = schaden = (3 + 2) = 5 » Ziel 1: Angriff 21; « schaden = 5 » schaden. « angriff = 1d20+angriffBonus = angriff = (6 + 7) = 13 » « schaden = 1d6 + 2 = schaden = (1 + 2) = 3 » Ziel 2: Angriff 13; « schaden = 3 » schaden. « angriff = 1d20+angriffBonus = angriff = (17 + 7) = 24 » « schaden = 1d6 + 2 = schaden = (2 + 2) = 4 » Ziel 3: Angriff 24; « schaden = 4 » schaden.

Das ist wirklich nicht mehr lesbar und kaum zu verstehen.

Um zu vermeiden, dass diese Verarbeitungsinformationen des Makros im Chat ausgegeben werden, aktivierst du die oben genannte Einstellung und die Ausgabe landet stattdessen im Tooltip (und ist nur noch zu sehen, wenn du im Chat mit der Maus über das Ergebnis fährst).

  1. Öffne das Menü Bearbeiten > Eigenschaften.
  2. Auf der rechten Seite des Reiters Interaktionen ist der Bereich "Chat". Stelle sicher, dass hier Hilfetexte für eingebettete Würfelwürfe verwenden markiert ist.
  3. Bestätige mit OK.

Die gerade beschriebenen Schritte sorgen dafür, dass die Einzelschritte eines Makros nicht mehr direkt im Chat ausgegeben werden, sondern nur noch im Tooltip des Ergebnisses angezeigt werden. Du kannst sie also immer noch sehen, wenn du die Maus über das Ergebnis im Chat ziehst.

Schreibweisen

Ich werde im Folgenden diese Schreibweisen verwenden, um es verständlich zu halten:

  • Makro bezeichnet eine Reihe verknüpfter Anweisungen, die eine bestimmte Aufgabe erledigen.
  • Makroanweisung bezeichnet eine bestimmte individuelle Anweisung oder eine Funktion, die in einem Makro verwendet wird.
  • Makro-Sprache bezeichnet die Gesamtheit aller Anweisungen, Funktionen und Operationen, die in einem Makro verwendet werden. Du findest eine große Sammlung in der Makrofunktionsliste.

Auch wenn es möglich ist, in MapTool ein Makro aus dem anderen heraus anzustoßen (man nennt das "(auf)rufen" eines anderen Makros), werden wir in diesem Dokument Makros nur über Schaltflächen in den verschiedenen Makrofenstern starten und sie wirken nur auf die Spielmarke, auf der sie aufgerufen werden.

Warum soll ich Makros nutzen?

Es ist nicht nötig, Makros in MapTool überhaupt zu nutzen. Der zentrale Zweck von MapTool ist es, Karten mit Freunden zu teilen und zu spielen - all das, was in "Einführung ins Kartenzeichnen" und Hosten von Spielrunden beschrieben steht. MapTool stellt all das auch ohne Makros bereit: Karten, Spielmarken, einen Chat und Würfel.

Trotzdem kann man viel mehr mit MapTool anstellen. Beispielsweise gibt es in vielen Spielen Situationen, wo man würfelt und einen Bonus addiert oder von einem anderen Wert abzieht. Solche Dinge kommen bei manchen Spielen sehr häufig vor und man kann sie mit Makros automatisieren. Makros sind wie Taschenrechner: Man muss sie nicht nutzen... es ist nur praktisch. Im Folgenden wird erklärt, wie man ins Thema einsteigen kann...

Wo sind diese Makros?

Makros können an ganz verschiedenen Stellen von MapTools auftauchen. Der Grund dafür ist, dass sie sich auf ganz verschiedene Bereiche auswirken können. Praktisch betrachtet gibt es vier Orte, an denen ein Makro sein kann:

Spielmarken-Makros

Der erste und häufigste Ort, an dem Makros eingesetzt werden können, sind Spielmarken. Sie sind verbunden mit der Spielmarke in der sie "leben" und wandern mit ihr herum. Nur wer die Spielmarke besitzt, kann das Makro darin nutzen. Jemand anders sieht nicht einmal, dass die Spielmarke ein Makro hat.

Kampagnen-Makros

Kampagnenmakros sind nicht an eine Spielmarke gebunden, sondern an die Kampagne selbst. Sie funktionieren genau wie das Makro einer Spielmarke mit Ausnahme dieser Eigenschaften:

  1. Du musst nicht irgendwas auswählen, um die Makros zu sehen
  2. Jeder (in der Kampagne) kann sie sehen und ausführen

Kampagnenmakros sind ziemlich hilfreich für die Spielleitung un die Spieler, um allgemeine Funktionen zu verteilen. Man muss das Makro nicht erst zu jedem kopieren - es ist bereits da, wenn jemand die Kampagne startet oder sich an ihr anmeldet.

Spielleitungs-Makros

SL-Makros sind im Grunde Kampagnenmakros. Der Unterschied ist, dass nur die SL sie sehen und ausführen kann.

Allgemeine Makros

Globale oder Allgemeine Makros sind nicht an eine Spielmarke oder eine Kampagne gebunden - sie werden mit deinen Einstellungen zu Maptool gespeichert. Sie sind also verfügbar, egal welche Kampagne du gestartet hast. Sie sind nur lokal bei dir sichtbar.

Es ist also ein guter Ort, um solche Makros zu platzieren, die sonst keiner sehen soll - Dinge, die deinen Spielern verborgen bleiben sollen, solange du das willst oder Aufgaben, die deine NSCs betreffen.

Die Makrofenster

The four Macro Panels
The four panels stacked together, selectable by the tabs at the bottom (many users stack them like this to save space)

Du fragst dich vielleicht, wo denn nun all diese Makros und ihre Schaltflächen versteckt sind? Du findest sie in den fünf vorhandenen Makrofenstern. Im Fenster-Menü kannst du sie aufrufen und auf der Karte so positionieren, wie es für dich passt. Hake die folgenden Einträge an:

  • Ausgewählt
  • Verkörpert
  • Kampagne
  • SL
  • Allgemein

Du solltest nun die Fenster wie in der Abbildung (oder so ähnlich) in Maptool sehen. In der Abbildung sind im Fenster "Allgemein" eine ganze Reihe an Schaltflächen zu sehen. Jede dieser Schaltflächen führt ein Makro aus; sie entstehen, wenn du ein neues Makro erstellst.

Bitte beachte, dass die Makros im Fenster "Allgemein" nur auf deinem Rechner und nur in deiner Installation von Maptool vorhanden sind. Die Schaltflächen im Screenshot sind meine Allgemeinen Makros; deine... naja, die wirst du selber schreiben müssen.

Die Fenster Ausgewählt und Verkörpern

Es gibt zwei Makrofenster, die sich direkt mit Spielmarken beschäftigen: Ausgewählt und Verkörpern.

Das Ausgewählt-Fenster enthält Schaltflächen, die direkt zu der von dir gerade markierten Spielmarke gehören. Sie sind also ein Teil der Spielmarke, auf die du mit der Maus geklickt hast. Jede dieser Schaltflächen führt eine Reihe von Makrobefehlen aus.

Das Verkörpern-Fenster enthält entsprechend die Makro-Schaltflächen der Spielmarke, die du gerade verkörperst, d.h. deren Identität du gerade annimmst. Im Chat erscheinen deshalb deine Nachrichten so, als würde die Spielmarke sprechen. Es ist möglich, eine Spielmarke zu verkörpern und gleichzeitig eine andere ausgewählt zu haben. Du solltest deshalb immer darauf achten, auf welchen Makrofenster du gerade bist.

Das Kampagnenfenster

Dieses Fenster zeigt die Makro-Schaltflächen der gerade geladenen Kampagne und kann, je nach Einstellungen des Servers, mit den anderen Spielern geteilt werden oder nicht. Spieler (also alle außer der Spielleitung) können hier keine Makros hinzufügen oder entfernen (siehe auch Makros in Fenstern verwalten).

SL-Fenster

Makros im Fenster SL gehören ebenfalls zur Kampagne, werden aber nur der Spielleitung angezeigt.

Allgemein-Fenster

Dieses Fenster enthält alle allgemeinen (globalen) Makros. Berücksichtige, dass nur du diese Einträge siehst.

Bevor wir endlich loslegen: Entstehung

Bevor wir richtig ins Thema einsteigen, hier ein paar historische Informationen zu Makros. Sie sind ursprünglich entstanden, um einfache kleine Aufgaben nicht jedesmal wieder machen zu müssen. Wenn du bei jedem Angriff mit 2W6 würfeln musst kannst du das machen, indem du /roll 2d6 in den Chat tippst.Stattdessen kannst du aber auch ein Makro für deine Spielmarke schreiben und von da an nur noch auf die Schaltfläche für das Makro klicken. Mit der Zeit wurden die Ideen, was Makros automatisert erledigen könnten, immer komplexer. Die Makrokommandos in Maptool wurden immer mehr bis sie schließlich den Umfang einer kleinen Programmiersprache hatten. Was sich aber nicht geändert hat: Makros sind nach wie vor einfach nur Text, der von einem Parser ausgewertet wird um die erzeugten Ergebnisse auszugeben.

Deshalb ist eins der wichtigen Dinge, die man im Hinterkopf behalten sollte:

WICHTIG: Makros sind eine Reihe von Text, den du im Chat ausgeben willst UND speziellen Anweisungen, die Dinge wie Würfelwürfe erledigen.

Die aktuelle Spielmarke

Ehe du mit dem Schreiben von Makros beginnst, solltest du unbedingt das Konzept der aktuellen Spielmarke verstanden haben. Sieh dir deshalb bitte unbedingt die Seite dazu an. Wenn du ein Makro schreibst, wirst du in aller Regel Spielmarkeneigenschaften lesen oder ändern wollen. Damit du auch die richtigen Eigenschaften änderst, solltest du also verstehen, was deine aktuelle Spielmarke ist, die dein Makro bearbeitet.

WICHTIG: Ein Makro bezieht sich immer auf die aktuelle Spielmarke, solange nicht eine spezielle Funktion oder Anweisung explizit eine andere Spielmarke aufruft.

Eckige und geschweifte Klammern

Da in Makros sowohl normaler Text als auch Anweisungen stehen können, müssen diese irgendwie zu unterscheiden sein. In Maptool machen diesen Unterschied Klammern. Alles was darin steht, wird als Makro ausgewertet - entweder eckige [ ] oder geschweifte { } Klammern.

WICHTIG: Alles innerhalb von eckigen oder geschweiften Klammern wird nicht als normaler Text sondern als Anweisung an den Parser interpretiert. Umgekehrt ist alles, was nicht in eckigen oder geschweiften Klammern steht, Text, der einfach im Chatfenser ausgegeben wird.

So wird das hier:

[1d20]

oder das

{1d20}

von MapTool nicht als Text [1d20] oder {1d20} in den Chat geschrieben; stattdessen sagt es dem Parser "erzeuge eine Zufallszahl zwischen 1 und 20 und schreibe sie in den Chat". Die eckigen oder geschweiften Klammern sagen MapTool, dass dazwischen etwas steht, was es als Makroanweisung interpretieren soll. Anmerkung: Geschweifte Klammern werde inzwischen nicht mehr verwendet, weil sie zu Schwierigkeiten mit Verzweigungs- und Schleifenfunktionen führen können.

Wie später noch genauer beschrieben wird, lassen sich Text und Makroanweisungen auch mischen:

Ich würfle [1d20+4] für die Initiative.

Das Makro ersetzt [1d20+4] mit dem Ergebnis des Würfelausdrucks und gibt dann alles zusammen im Chat aus:

Ich würfle 16 für die Initiative.

Roll Options - Würfel-Optionen

"Roll Options" sind eine weitere Eigenheit der Makrosprache von MapTool. Der Name ist eine Art Vermächtnis (oder Altlast) der Anfänge der Makros. Da die meisten Makrobefehle zu Beginn Würfelwürfe waren (wie z.B. das vorgenannte [1d20+4]), kam schnell der Wunsch einer schöneren Anzeige (oder Nicht-Anzeige) auf. Da es darum ging, die Möglichkeiten der Darstellung von Würfelwürfen zu beeinflussen, kamen die Makrobefehle so ihren Namen: "Roll Options" und dabei blieb es. Ganz falsch ist das bis heute nicht, auch wenn diese Befehle inzwischen viel mehr können. (Anm. d. Ü.: Auch wenn das etwas sperrig klingen mag, werde ich zukünftig den Begriff Würfeloptionen verwenden. Schließlich übersetze ich euch das, damit ihr euch nicht mit englischen Begriffen rumärgern müsst.)

Würfeloptionen sind ein wichtiger Teil des Makroschreibens. Dabei gibt es einige Regeln. Hier zuerst einmal das generelle Schema:

[(Kommagetrennte Liste von) Optionen : Operation(en)]

Zur Erläuterung hier die Regeln:

  1. Die Würfeloption steht immer am Beginn eines Makroblocks (das was mit den eckigen Klammern beginnt und endet).
  2. Es folgt immer ein Doppelpunkt.
  3. Mehrere Optionen können, durch Komma getrennt, gemeinsam genutzt werden; den durch Komma getrennten Optionen folgt dann EIN Doppelpunkt.
  4. Eine Option muss nur einmal gesetzt sein und gilt dann für den ganzen Makroblock. Das kann kompliziert werden, wenn man die Option CODE verwendet, in der man viele einzelne Anweisungen unterbringen kann. Das ist dann aber später bei den Verzweigungen und Schleifen erklärt.

Ein einfaches Beispiel für eine Würfeloption ist:

[r:1d20+4]

Die Würfeloption ist hier "regular output" (normale Ausgabe) [r:], die das Ergebnis des Würfelwurfes 1d20+4 als reinen Text (ohne Markierungen oder Tooltip) ausgibt. Ein komplizierteres Beispiel sieht dann so aus:

[h: d20roll = 1d20]
[h,if(d20roll == 20): output = "Kritischer Treffer"; output = "Kein kritischer Treffer"]

Hier werden die Würfeloptionen "hidden" (versteckt) [h:] und "if()" (wenn) [if():] kombiniert; Verzweigungen wie die mit wenn werden später erklärt. Beachte, dass auch hier alle Würfeloptionen am Anfang vor dem Doppelpunkt stehen.

Ein "sehr" kompliziertes Beispiel verwendet hier auch die Würfeloption "code" (mehr dazu in Verzweigungen), die statt einer einzelnen Anweisung je einen ganzen Makroblock setzen kann. Hier ist es:

[h: d20roll = 1d20]
[h,if(d20roll == 20),CODE:
{
    [Schaden = 16]
    [Schadesart = "Säure"]
    [ZielTP = ZielTP - Schaden]
};
{
    [Schaden = 1d10+6]
    [Schadesart = "Säure"]
    [ZielTP = ZielTP - Schaden]
}]

Auch in diesem Makro stehen die Würfeloptionen wieder ganz vorne, auch wenn durch die CODE:-Anweisung danach noch ein paar mehr eckige Klammern auftauchen.

Einfache Anführungszeichen und Apostrophe

In den meisten Fällen funktionieren Makros mit einfachen Anführungszeichen gut. Sie sind einfach nur Text und werden ohne Aufhebens ans Chatfenser geschickt. Es gibt aber Situationen (innerhalb eines Makroblocks), in denen MapTool glaubt, du hättest eine "unbeendete" Zeichenkette eingegeben. In solchen Fällen kann es vorkommen, dass der gesamte Makrotext (also alle Anweisungen) einfach in den Chat geschrieben werden, statt ausgeführt zu werden.

Um das zu vermeiden, solltest du immer wenn du Text innerhalb eines Makroblocks (in eckigen oder geschweiften Klammern) ausgeben willst, diesen Text auf einzelne Anführungszeichen prüfen. Zur Anschauung nochmal das vorige Beispiel - nur etwas anders:

[h: d20roll = 1d20]
[h,if(d20roll == 20),CODE:
{
    [Schaden = 16]
    [Schadesart = "acid"]
    [ZielTP = ZielTP - Schaden]
    Des Ziel's TP sind noch [r:ZielTP]. 
};
{
    [Schaden = 1d10+6]
    [Schadesart = "acid"]
    [ZielTP = ZielTP - Schaden]
}]

(Anm.d.Ü.: Ich weiß! Des Ziel's" ist schrecklich bis falsch! Es tut mir in der Seele weh. Aber wie kriegt man da sonst einen Apostroph rein?)

Das einfache Anführungszeichen im Text Des Ziel's TP sind noch [r:ZielTP]. erzeugt einen Fehler. Es gibt zwei Möglichkeiten, das zu umgehen:

  1. Verwende keine einfachen Anführungszeigen oder Apostrophe. Das mag allerdings etwas seltsam sein.
  2. Ersetze den Apostroph durch einen entsprechenden HTML Charaktercode: &#39;

Kommentare

ES GIBT KEINE KOMMENTARFUNKTION IN MT-MAKROS. ALLES GESCHRIEBENE IM MAKROBLOCK IST EIN MAKRO UND WIRD AUSGEFÜHRT.

Der ganze Inhalt des Makros wird an den Parser übergeben und er sucht alles, was an den Chat schicken oder ausführen kann. Es gibt Möglichkeiten dafür zu sorgen, dass Text nicht im Chat erscheint; aber der Parser wird alles was er findet entweder in den Chat schreiben oder ausführen! Anders gesagt: Du kannst Code nicht auskommentieren!

Es gibt zwei Wege, um etwas nicht im Chat erscheinen zu lassen:

  1. Die bereits weiter oben kennengelernte Würfeloption "hidden" [h:]
  2. Ein HTML-Kommentar, der zwar ausgegeben aber nicht angezeigt wird.

Solltest du HTML-Kommentare nicht kennen:

<!-- Ich bin ein HTML-Kommentar -->

In einer HTML-Seite wird alles zwischen <!-- und --> nicht dargestellt. Im Gegensatz dazu versteht MapTools Makroparser den HTML-Kommentar einfach als Text, solange darin keine Makrobefehle auftauchen. Das Chatfenster versteht HTML und zeigt den Kommentar nicht an. Gibst du die folgende Zeile in den Chat ein, dann gibt es eine Ausgabe:

<!--In diesem Teil des Makros wird gewürfelt-->

aber sie ist leer. (Der HTML-Kommentar "<!--In diesem Teil des Makros wird gewürfelt-->" ist unsichtbar bzw. nicht dargestellt.) Gibst du diese Zeile ein:

<!--In diesem Teil des Makros wird gewürfelt mit [r:1d20+9]-->

bekommst du ebenfalls eine leere Ausgabe, in der nicht dargestellt etwas wie "<!--In diesem Teil des Makros wird gewürfelt mit 18-->" steht, wobei die 18 irgendeine Zahl zwischen 10 und 29 sein kann - das Makro wird also im Kommentar ausgeführt, ob du das willst oder nicht.

Die wesentliche Aussage dieses Beispiels: Du kannst Makro-Code nicht auskommentieren!

Makros schreiben

The Campaign Panel. You can see there are no macros here yet.
Right-clicking on the Campaign Panel lets you add a new macro.

Das Schreiben von Makros besteht immer aus drei Schritten (wobei sich die einzelnen Schritte wiederholen können):

  1. Mache einen Rechtsklick auf das Fenster, in das du das Makro schreiben willst (also das Ausgewählt-Fenster, das Allgemein-Fenster usw.) und wähle aus dem Kontextmenü den Eintrag Neues Makro hinzufügen. Ein grauer Schriftzug "(new)" erscheint.
  2. Mache einen Rechtsklick auf den Schriftzug und wähle aus dem Kontextmenü "Bearbeiten...".
  3. Trage deinen Makrocode ein, gib dem Makro einen Namen und bestätige über die Schaltfläche OK. Und schon hast du dein erstes Makro erstellt!

Warte... was meint Makrocode?

Wie schon angedeutet: diese drei Schritte können viele Einzelschritte beinhalten, Tipps, Tricks, Siege, Niederlagen, Frustration, manchal auch Rumbrüllen und Zähneknirschen. Also nochmal einen Schritt zurück. Es gibt jede Menge Forumseinträge, Tutorials usw. zu Makros zu allen möglichen Zwecken. Wir fangen mit etwas ganz Einfachem und Nützllichen an und das Schritt für Schritt.

Initiative würfeln

After selecting "Add New Macro," a button labeled (new) appears on the Campaign Panel.
Right-clicking on the button opens the macro editor.
Entering a macro label and the macro command
The Campaign Panel with your newly created macro on it

Das einfachste Makro ist einfach nur Text, der im Chat ausgegeben wird. Die meisten Tutorials über Programmiersprachen fangen mit einem "Hello world!"-Beispiel an, wir aber nicht. Wir machen was rollenspielartiges: den gefürchteten Satz "Würfle die Initiative!"

  1. Wähle das Kampagnenfenster.
  2. Mache einen Rechtsklick darauf und wähle aus dem Kontextmenü den Eintrag Neues Makro hinzufügen.
  3. Mache einen Rechtsklick auf "(new)" und wähle aus dem Kontextmenü den Eintrag Bearbeiten....
  4. Der Makroeditor öffnet sich mit dem Reiter Editor. Schreibe in das Textfeld

    "Würfle die Initiative!"

  5. Wechsle zum Reiter Details und fülle das Feld Beschriftung ebenfalls mit "Würfle die Initiative!" (Um die anderen Felder musst du dich jetzt ncht kümmern.)
  6. Klicke OK.
  7. Wenn du fertig bist, siehst du jetzt eine Schaltfläche mit der Aufschrift "Würfle die Initiative!". Klickst du darauf, erscheint der Text "Würfle die Initiative!" im Chatfenster.

Das ist die einfachste Version, ein Makro zu schreiben: Du gibst Text ein und der wird an den Parser und anschließend an das Chatfenster weitergegeben wenn du die Schaltfläche klickst.

Etwas Interessanteres

Das "Würfle die Initiative!"-Makro ist, auch wenn es für Unruhe bei den Spielern sorgt, nicht sonderlich interessant als Makro. Du hast dir vielleicht gedacht: "Warum soll ich das nicht einfach in den Chat tippen?" und möglicherweise würdest du das tun. Also lass uns etwas Spannenderes tun, was mehr mit dem zu tun hat, weshalb wir MapTool nutzen. Schließlich ist MapTool nicht zum Programmieren von Makros gedacht, sondern zum Spielen: Wir nehmen noch ein paar Makroanweisungen mit zum reinen Text. Sie sind als besondere Befehle dazu da, nicht nur Text im Chat auszugeben, sondern zum Beispiel zu würfeln, also Zufallsergebnisse zu erzeugen oder etwas zu berechnen.

Makroanweisungen müssen immer in eckige Klammern (z.B. [macro command]) oder geschweifte Klammern (z.B. {macro command}) gesetzt werden. Das zeigt dem Parser, dass es hier etwas zu tun gibt. Andernfalls gäbe er den Anweisungstext einfach im Chat aus.

Würfeln

A macro with text and a basic dice roll of 1d20+7

Schreiben wir also ein Makro, das einfach für uns würfelt und einen festen Wert addiert, ehe wir das Ergebnis zu sehen kriegen.

  1. Erzeuge ein neues Makro (egal ob bei der Spielmarke, im Allgemeinen oder dem Kampagnenfenster) und öffne den Bearbeiten-Dialog. Zur Erinnerung: Ein neues Makro erzeugst du durch Rechtsklick im Makrofenster und Auswahl von "Neues Makro hinzufügen".
  2. Trage bei der Bezeichung etwas ein wie "Angriffswurf" oder "Würfeln".
  3. Im Textbereich Befehl trägst du nun folgendes ein:

    Mein Angriffswurf ist [1d20+7]!

  4. Klicke auf OK. Du hast jetzt eine neue Schaltfläche mit der von dir eben gewählten Aufschrift. Wenn du ihn anklickst, solltest du im Chat etwa das sehen:

    Chris: Mein Angriffswurf ist 8!

    MapTool hat die Anweisung im Makro gelesen, den Text ausgegeben und als es zur Klammer [1d20+7] kam wusste es, dass es:
  1. Einen Würfelwurf mit einem 20-seitigen Würfel simulieren (oder, in Wirklichkeit, eine Zufallszahl zwischen 1 und zwanzig erzeugen) soll,
  2. dazu 7 addieren und
  3. das Ergebnis statt der Klammer im Chat ausgeben soll.

Du siehst, dass die Zahl im Chat einen grauen Hintergrund hat. Wenn du mit der Maus über die Zahl gehst, erscheint ein Tooltip, der die Berechnung der Zahl erläutert. In diesem Fall war der Wurf eine eins, also (in vielen Spielsystemen) ein kritischer Fehler. Solltest du den Tooltip nicht sehen, dann sie in deinen MapTool Einstellungen nach, ob der Haken bei Hilfetexte für eingebettete Würfelwürfe verwenden gesetzt ist.

Wahrscheinlich wird da auch nicht Chris stehen, wenn du nicht zufällig auch so heißt. :-) Dieser Teil der Ausgabe zeigt nur an, wer das Makro ausgeführt bzw. das Gesagte gesprochen hat. Wenn es eine Spielmarke(-nmakro) gesagt hat, dann steht da stattdessen der Name der Spielmarke (die natürlich auch Chris heißen könnte).

Mehr als nur Zahlen

Makroanweisungen können mit Zahlen arbeiten und mit Text -- du kannst auch Zeichenketten (also eine Reihe von alphanumerischen Zeichen) für ein MapTool-Makro verwenden. Sagen wir, du möchtest einen Angriff würfeln, möchtest dabei aber auch dein Ziel nennen.

A macro with a basic dice command and a variable called target
A prompt for an "undeclared variable"

Du kannst dein Makro dann einfach so erweitern:

Mein Angriffswurf gegen [target] ist [1d20+7]!

Wenn du das Makro nun ausführst, erscheint plötzlich ein Fenster mit dem Titel "Wert für target." Was ist passiert?

Wenn sich der Parser von MapTool das Makro ansieht, dann findet er die Anweisung [target]. MapTool geht davon aus, dass jedes Wort, das es nicht kennt, eine Variable, also ein Platzhalter, ist. Da diese Variable bisher keinen Wert hat, erklärt MapTool es zu einer (wie man das in der Programmierung nennt) "undeclared" Variablen. Da er nicht weiß, welcher Wert dafür richtig ist, fragt er dich danach. Gibst du jetzt irgendwas in das Feld ein, egal ob Text, Zahl oder irgendwas völlig Unsinniges, gibt MapTool es nach der Bestätigung des Dialoges anstatt [target] aus.

Schreib also "böse Orkse" (ohne Anführungszeichen) in das Feld und bestätige. der Chat zeigt nun:

Chris: Mein Angriffswurf gegen böse Orkse ist 23!

Wieder hat der Parser das Makro durchgearbeitet, einfachen Text einfach an den Chat weitergegeben und die Teile in Klammern ausgewertet. Wo es eckige Klammern gefunden hat, hat es diese durch einen der Anweisung entsprechenden Text (oder Zahlen) ersetzt.

Variablen in Makros

Wir sind schon in mehreren Beispieln auf Variablen (wie target im vorgen Beispiel) in unseren Makros gestoßen, haben uns aber noch nicht näher damit beschäftigt. Da Variablen aber für das Schreiben von Makros wichtig sind, beschäftigen wir uns genau jetzt damit.

Was ist eine Variable?

Wenn du schon programmiert hast, ist das ein alter Hut für dich. Wenn du aber gerade ins kalte Wasser springst, hier eine einfache (MapTools-)Definition von Variablen:

Eine Variable ist ein Wert, der sich ändern kann, abhängig von einer Spielmarkeneigenschaft, einer Berechnung oder einer anderen Makroanweisung.

Da sich der Wert der Variable ändern kann, müssen wir ihr einen Namen geben (in der Programmierung heißt das "Deklaration" - du gibst bekannt, dass die Variable existiert) damit wir über sie sprechen können. Wenn wir jetzt den aktuellen Wert dieser Variable brauchen, können wir stattdessen einfach ihren Namen schreiben. Der Parser von MapTool ersetzt dann einfach den Namen, der Variable durch ihren Wert.

Eine Variable ist wie ein Würfelwurf: Du weißt, dass irgendwas zwischen 1 und 20 herauskommen wird. Nun kannst du aber vorher nicht überall 19 hinschreiben; es könnte auch eine 2 oder 12 oder 5 sein. Stattdessen schreibst du: "Was immer bei dem Wurf rauskommt, schreib es hierher." Rollenspieler kürzen das gerne auf ein "W20" - das könnte unser Name der Variable sein.

Anmerkung: Das bedeutet nicht, dass MapTool dir den richtigen Wert für deinen Bedarf einsetzt; es heißt nur, dass die Variable mit dem Wert ersetzt wird, den sie gerade hat. Hat dein Programm einen Fehler, dann landet da vielleicht auch ein falscher Wert. MapTool kennt kein falsch oder richtig - es kennt nur so ist es gerade.

Variablen Werte zuweisen

Wenn du einer Variable einen Wert gibst, dann nennt man das eine Zuweisung. Der Wert (oder eine Berechnung des Wertes) wird der Variable zugewiesen. Das Rechenzeichen (auch Operator) für die Zuweisung ist das Gleichheitszeichen ( = ). Dieses Zeichen sagt ja einfach, dass auf beiden Seiten das Gleiche steht - nur eben vielleicht auch verschieden erklärt. Also sagt die Gleichung "2+2=4", dass 2+2 so viel ist wie vier. Eigentlich steht also auf beiden Seiten vier. So machen wir es auch bei einer Zuweisung:

[h:meineTP = 30]

Wie du dir vielleicht schon gedacht hast, deklarieren wir hier eine Variable meineTP um ihr anschließend den Wert 30 zuweisen zu können. Das ist die einfachste Art der Zuweisung: eine variable ist gleich ein Wert. Das h mit einem Doppelpunkt danach sagt MapTool, dass es diesen Wert verstecken" soll, also nicht in den Chat schreiben. Das musst du zwar nicht machen, aber wie du weiter oben schon gesehen hast, können die Berechnungen in Makros ziemlich umfangreich werden. Das sollte dann nicht alles im Chat stehen.

Du erinnerst dich an das Beispiel, in dem MapTool nach dem Ziel fragte, weil es die Variable nicht kannte? Du musst also einer Variable keinen Wert zuweisen. Machst du das, dann sagst (= deklarierst) du MapTool nur, dass es diese Variable gibt. MapTool wird beim Ausführen des Makros dann fragen, welchen Wert diese Variable denn haben soll. Was du dir merken solltest ist, dass MapTool für jede Variable einen Wert braucht, um ein Makro beenden zu können. Du musst diesen Wert aber nicht unbedingt immer vorher schon festlegen. Manchmal willst du auch bei der Ausführung erst eine Eingabe durch den Anwender.

Zuweisungen sind der einzige Weg, einer Variable einen Wert zu geben oder ihn zu ändern. Implizit ist es nicht möglich. Wenn du also eine Variable in einer Funktion verwendest, dann ändert sie sich nur, wenn du den neuen Wert der Variable auch zuweist. Was damit gemeint ist, erklärt sich vielleicht auch im nächsten Abschnitt noch besser.

Wann sollte man eine Zuweisung machen

MapTool arbeitet jede Anweisung in der Reihenfolge ab, in der es sie liest - von oben nach unten. Wenn du also keine Nachfragen nach Variablenwerten willst, müssen die Variablen in vor diesem Zeitpunkt zugewiesen sein. Zum Beispiel in der folgenden Anweisung:

Der Angriff durch [schadensart] verursacht [schaden] Schaden und dir bleiben noch [meineTP] Trefferpunkte!

Wenn du nicht möchtest, dass der Anwender des Makros nach den Werten für schaden, schadensart und meineTP gefragt wird,müssen sie einen Wert zugewiesen bekommen, bevor diese Zeile ausgeführt wird. Das könnte dann so aussehen:

[h:schaden = 1d6+4]
[h:schadensart="Feuer"]
[h:meineTP = 30 - schaden]
Der Angriff durch [schadensart] verursacht [schaden] Schaden und dir bleiben noch [meineTP] Trefferpunkte!

Wie du siehst, haben wir drei Zuweisungen vor die Zeile von oben geschrieben. Dem schaden haben wir einen Würfelwurf zugewiesen, der Schadensart ein Wort "Feuer" (eine Zeichenkette) und der Wert für meineTP wird mit der Rechnung 30 - schaden ermittelt.

Ist dir aufgefallen, dass wir sogar eine Variable mit einer anderen bestimmt haben? Der Wert für den Schaden wird genutzt, um von den vorherigen Trefferpunkten abgezogen zu werden und das Ergebnis wird meineTP zugewiesen. Wir können also auch Variablen mithilfe von anderen Variablen verändern.

Regeln für Variablen

Es gibt zwei Regeln auf die man bei der Erstellung von Variablen achten muss:

  1. Keine Leerzeichen: Variablennamen müssen immer aus einem Wort bestehen, können also keine Leerzeichen enthalten wie in Hit Points - die Variable muss HitPoints heißen.
  2. Spezielle Variablen: Es gibt bestimmte Variablen, die MapTool für sich nutzt. Sie dürfen nicht für etwas anderes verwendet werden. Die meisten dieser Variablen erkennst du daran, dass sie einen Punkt im Namen haben, wie etwa roll.count oder macro.args. Wir werden uns das an anderer Stelle genauer ansehen; hier nur der Hinweis, dass du keinen der Variablennamen aus der Liste Spezialvariablen verwenden kannst.

(Anm. d. Übers.: Im Deutschen schreibt man viel mehr zusammen, deshalb hier das englische Beispiel.)

Komplexere Makros

Die bisherigen Beispiele waren sehr einfach: Text ausgeben, einen Würfelwurf machen oder einen Wert beim Anwender erfragen.

Jetzt machen wir es mal ein wenig komplizierter: Wir spielen mit Formatierungsoptionen rum, ändern Eigenschaften von Spielmarken und sehen uns Schleifen (etwas immer wieder tun) und Verzweigungen (je nach Situation etwas anderes tun) an.

Formatierungsoptionen

Makroausgaben (wie Text im Chat) kann mit HTML oder einigen Funktionen von MapTool formatiert werden. Zuerst sehen wir uns HTML an, und dann einige Anzeige-Würfeloptionen.

Erweiterte Würfelwurfanzeige

Bis zur Version 1.3.b54 war der Standard, nur das Endergebnis von Würfelwürfen oder Berechnungen in den Chat zu schreiben. Wenn du also 1W20+7 würfelst, dann steht nur eine Zahl als Ergebnis im Chat; die Berechnung dazu zeigt der Tooltip (du erinnerst dich an die Einstellung weiter oben).

Wenn du möchtest, kann MapTool auch den gesamten Rechenweg in den Chat schreiben - hierzu verwendest du die Erweiterter Wurf-Option. Sie funktioniert so:

Mein Angriffswurf gegen [ziel] ist [e:1d20+7]!

Wenn du das Makro ausführst (und ziel vorher deklariert und einen Wert zugewiesen hast), erhältst du die folgende Ausgabe:

Mein Angriffswurf gegen böse Orkse ist « 1d20+7 = 1 + 7 = 8 »

Jetzt bekommst du den gesamten Rechenweg angezeigt. (In diesem Fall fällt so sofort der kritische Fehler auf.)

Ergebnis-Würfeloption

Vielleicht möchtest du niemanden sehen lassen, wie es zu einem Ergebnis kommt. Mit den bishergen Methoden kann man sich den Rechenweg - so oder so - anzeigen lassen. Das lässt sich mit dem Ergebnis - Wurf bewerkstelligen, der so aussieht:

Mein Angriffswurf gegen [ziel] ist [r:1d20+7]!

und die Ausgabe dann so:

Mein Angriffswurf gegen böse Orkse ist 11!

Wie du schon bemerkt hast, ist jetzt kein grauer Hintergrund unter der 11 und dir wird kein Tooltip angezeigt, wenn du darüber fährst. Die Ergebnis-Würfeloption gibt ausschließlich das Endergebnis aus, ohne irgendwie Zugriff auf den Rechenweg zu gewähren. Das funktioniert nicht nur bei Rechnungen und Würfelwürfen. Mit der folgenden Makrozeile kriegst du dann auch die Unterlegung der "bösen Orkse" los:The Results Roll option strips out the special formatting, giving you just the plain text. If you wanted to get rid of the highlight behind the words "Nasty Orcses," you can just change the macro to:

Mein Angriffswurf gegen [r:ziel] ist [r:1d20+7]!

Versteckt-Würfeloption

Manchmal möchtest du vielleicht von einem Makroblock gar nichts ausgeben lassen oder nur etwas Text ohne die einzelnen Schritt zu offenbaren. In solchen Fällen kannst du das "r:" or "e:" eifach durch ein "h:" ersetzen, wie hier gezeigt:

[h:meineTP = 30]
[h:blutend = meineTP / 2]

Mein Blutend-Wert ist [blutend].

Das Beispiel zeigt auf einfache Weise, wann die Versteckt-Option praktisch ist.Das Makro macht drei Dinge:

  1. Die Variable meineTPwird deklariert und der Wert 30 zugewiesen; MapTool soll diesen Schritt aber verbergen (h:)
  2. Die Variable blutendwird deklariert und die Hälfte des Wertes von meineTP zugewiesen. MapTool soll auch diesen Schritt verbergen
  3. Nun wird ein Text ausgegeben und an dessen Ende der Wert von "blutend"

Wenn du das Makro ausführst, bekommst du diese Ausgabe:

Mein Blutend-Wert ist 15

Würdest du die Versteckt-Würfeloption nicht nutzen, dann sähe dein Makro im Chat so aus:

30 15 Mein Blutend-Wert ist 15

Die zusätzlichen Zahlen stammen aus den ersten beiden Zeilen. Du brauchst sie nicht, also kannst du sie verstecken.

HTML Formatierung

MapTool unterstützt im Chat die Formatierung des Textes mit HTML Auszeichnungen nach der Spezifikation HTML3.2. Möchtest du z.B., dass in der ersten Zeile steht, dass du einen Angriff machst und danach soll je eine Zeile für das Ziel, den Angriffswurf und den Schaden kommen, dann könnte das so aussehen:

Ich greife an!<br>
<b>Ziel</b>: [r:ziel]<br>
<b>Angriff</b>: [1d20+7]<br>
<b>Schaden</b>: [1d8+5]

Im Chat sähe das dann so aus:

I make an attack roll!
Ziel: Böse Orkse
Angriff: 15
Schaden: 7

Das ist eine sehr einfache Formatierung; du könntest die Ausgabe auch in eine Tabelle setzen, Schriftart und Farbe des Textes anpasen oder den Hintergrund einfärben... es gibt viele Möglichkeiten.

ANMERKUNG: Wenn du dich mit HTML auskennst, achte darauf, dass der Chat nur HTML3.2 versteht. Der Zeilenumbruch kennt keinen Schrägstrich (<br>). Du kannst auch einen Teil der Spezifikation für CCS1 als Inline-Styles und Stylesheets nutzen. Mehr Informationen über die unterstützten CSS-Tags findest du in Supported CSS Styles.

Spielmarkeneigenschaften nutzen

Bisher haben wir Variablen verwendet, die wir vorher deklariert und zugewiesen haben. Wir haben ein Angriffsmakro mit der Angabe eines Ziel seinem Angriff und Schaden geschrieben. Die Werte in den Makros waren dabei bisher immer hard-coded, d.h. sie wurden entweder fest eingegeben, über einen Dialog abgefragt oder aus einer festgelegten Formel erwürfelt. Da Rollespielcharaktere nicht alle gleich sind, wollen wir nun dafür sorgen, dass unser Makro dem Rechnung trägt. Wir wollen:

  1. Eine Makro, dass für verschiedene Charaktere individuell reagiert
  2. Ein Makro, dass für verschiedene Spielmarken verwendet werden kann
  3. Möglichst wenig tippen müssen

Wie in der Beschreibung zu den Spielmarken beschrieben, hat jede ihr eigenes Charakterblatt mit Eigenschaften und Werten. Auf diese Eigenschaften und Werte können wir in einem Makro Bezug nehmen und sie verändern. Wir können also in einem Makro sagen: "Würfle 1W20 und addiere meine Geschicklichkeit." Ich denke, du erkennst sofort, wie nützlich das sein kann.

Ein paar Muster-Eigenschaften

Für Makros, die mit Eigenschaften arbeiten sollen, sollten wir ein paar Eigenschaften haben. Ein guter Weg ist, den Artikel "Eigenschaften in MapTool" durchzugehen und die Beispielkampagne für unser MapTool Rollenspiel zu erstellen!

Der erste Schritt ist, die Kampagne zu laden und eine Spielmarke auf die Karte zu ziehen. Achte darauf, dass du dabei auf dem Spielmarkenebene bist. Solltest du gerade nicht wissen, was hier gemeint ist, dann sieh dir die Einführung ins Kartenzeichnen an und kehre dann hierher zurück. Weiter geht es so:

1. Öffne mit Doppelklick auf die Spielmarke den Dialog "Spielmarke bearbeiten".

2. Wechsle auf den Reiter Eigenschaften.

3. Hier siehst du eine Tabelle mit allen Eigenschaften der Kampagne und den individuellen Werten der Spielmarke, die du hier auch ändern kannst. Es gibt auch Eigenschaften der Spielmarke, die du hier nicht siehst und die nur per Makro verwendet werden können; das soll uns aber jetzt erst einmal nicht interessieren. Du solltest (wenn du die MapTool-Kampagne aus Eigenschaften in MapTool nutzt) das hier sehen:

*Stärke:1
*Geschick:1
*Intelligenz:1
*Ausdauer:1
*Trefferpunkte(TP):{Ausdauer * 6}
*Rüstungsklasse(Rl)
*Bewegung(Bw):{Geschick}

4. Klicke in die Textzeile Neben Stärke. Ein Cursor erscheint, damit du etwas eingeben kannst. Trage eine Zahl ein, die die Stärke angibt. Ich wähle die sechs.

5. Wiederhole das für alle anderen Hauptattribute. Trefferpunkte und Bewegung müssen nicht eingegeben werden; sie werden errechnet.

6. Wähle OK. Du hast jetzt manuell die Eigenschaften dieser Spielmarke angepasst. Wenn du den eben geschlossenen Dialog wieder öffnest, sind deine geänderten Werte noch zu sehn.

Wenn du mit der Maus über die Spielmarke fährst, siehst du auch deine Werte neben einem Porträt der Spielmarke: das Werteblatt. Das Werteblatt ist eine Schnellübersicht über die Eigenschaften einer Spielmarke - eine Art schnell erreichbares Charakterblatt.

Auf Eigenschaften der Spielmarke im Makro zugreifen

Da unsere Spielmarke jetzt eigene Werte hat, wollen wir im Makro darauf zugreifen. Für das erste Makro würfeln wir mit 1W20. Statt aber einfach 7 zu addieren, zählen wir die Stärke unserer Spielmarke hinzu.

1. Öffne dein Angriffsmakro.

2. Prüfe, dass im Reiter Details das Häkchen bei "Auf ausgewählte Spielmarken anwenden" markiert ist. Andernfalls weiß das Makro nicht, wessen Stärke es nutzen soll. 3. Trage das Makro im Reiter Editor wie folgt ein:

Ich greife an!<br>
<b>Ziel</b>: [r:ziel]<br>
<b>Angriff</b>: [1d20+Stärke]<br>
<b>Schaden</b>: [1d8+5]

Du siehst, dass hier der Wert 7 durch das Wort Stärke ersetzt ist. Da Stärke nicht in Anführungszeichen geschrieben steht, sucht MapTool nach einer Variable dieses Namens bei der aktuellen Spielmarke (also die gerade gewählte). Wird diese Variable dort nicht gefunden oder wurde ihr nie ein Wert zugewiesen, dann wird MapTool dich nach dem Wert fragen. Wenn das Makro die Eigenschaft findet, weist es der Variable den Wert der Eigenschaft zu. Du kannst das im Tooltip des Ergebnisses prüfen.

4. Also los! Wähle die Spielmarke und lasse sie angreifen. Im Chat siehst du jetzt etwa das:

I make an attack roll!
Ziel: Böse Orkse
Angriff: 26
Schaden: 6

Wichtig ist hier, dass du im Tooltip des Angriffs siehst, dass das Makro nun tatsächlich die Eigenschaft Stärke der Spielmarke verwendet.

Eine Eigenschaft mit einem Makro ändern

Die Eigenschaften von Spielmarken können auch von einem Makro geändert werden. Stelle dir vor, wir wollen die Trefferpunkte eines Charakters verringern, wenn ein Monster ihn trifft. Du kannst das manuell machen (was ziemlich nervig wird) oder dein Makro erledigt das einfach automatisch. Das geht dann so:

1. Erzeuge ein neues Makro im Kampagnenfenster.

2. Trage bei Beschriftung das Wort "Schaden" ein.

3. In den Reiter Editor kommt jetzt:

Autsch! Ich wurde getroffen. Ich habe noch [Trefferpunkte = Trefferpunkte - schaden] Trefferpunkte übrig.

4. Prüfe, dass im Reiter Details das Häkchen bei "Auf ausgewählte Spielmarken anwenden" markiert ist.

5. Wähle OK. Wenn du das Makro ausführst, wirst du nach dem Schaden gefragt. Anschließend wird diese Zahl von den Trefferpunkten der Spielmarke abgezogen. Ich wähle 4.

Autsch! Ich wurde getroffen. Ich habe noch 2 Trefferpunkte übrig!

Du kannst dir die Eigenschaften der Spielmarke jetzt ansehen und stellst fest, dass die Trefferpunkte dem Wert entsprechen, der in deinem Chat genannt ist. Was ist genau passiert? Das Makro...

  1. fragt nach der unbekannten Variable "schaden". (ich habe 4 eingegeben.)
  2. erhält den Wert der Trefferpunkte vom aktuellen Token (hier 6)
  3. zieht von den Trefferpunkten den Schaden ab (6-4=2)
  4. schreibt in die Eigenschaft Trefferpunkte der Spielmarke den neuen Wert (2)
  5. gibt den Text mit dem neuen Wert im Chat aus

Verknüpfung von Zeichenketten

Eine wichtige Fähigkeit beim -schreiben von Makros ist der richtige Umgang mit Zeichenketten. und wie man sie zusammenfügt. Zeichenketten sind Reihen von alphanumerischen Zeichen, die dann im Makro verändert oder an den Chat gesendet werden können. Oft wirst du Text an den Chat schicken wollen der zum Teil aus fest vorgegebenen Passagen (hardcoded text) und zum anderen aus solchem besteht, der sich je nach Wert einer Variable oder eines Würfelwurfes verändert. Dieses Zusammenfügen verschiedener Textteile wird oft als Verkettung bezeichnet. Es bedeutet einfach, verschiedene Texte aneinander zu reihen und aus kurzen Stücken einen langen Text zu erzeugen.

Es gibt zwei Möglichkeiten der Verkettung in einem Makro:

Außerhalb einer Anweisung

Die grundsätzliche Arbeitsweise eines Makros ist:

  1. Der Parser liest ein Makro und trennt die Makroblöcke vom reinen Text
  2. Der Parser verteilt die einzelnen Makroanweisungen an die passenden Stellen, wo sie verarbeitet werden (Zahlen werden addiert, Würfelwürfe gemacht etc.)
  3. Die Ergebnisse der verarbeiteten Anweisungen kommen zurück und werden an den Stellen, von denen die Anweisungen geholt wurden eingesetzt.
  4. Das ganze Durcheinander - Textteile und die Ergebnisse der Anweisungen (anstelle der Anweisungen) - wird zum Chatfenster weitergegeben.

Willst du einen Text zusammen mit dem Ergebnis einer Makroanweisung (z.B. das Wort "Angriff:" und dann einen erwürfelten und/oder berechneten Wert) in deinem Makro ausgeben, dann ist der einfachste Weg, die Anweisung an der Stelle einzusetzen, wo später deren Wert ausgegeben werden soll, also:

Angriff: [1d20]

Der Parser liest alles, schickt die Anweisung los (1W20 würfeln: [1d20]), bekommt das Ergebnis (z.B. 17) zurück und ersetzt die Anweisung durch das Ergebnis und übergit es an den Chat: "Angriff: 17".

Das ist der direkteste Weg, Text an den Chat zu schicken - setze die Variablen an die richtigen Stellen im Text und schicke das an das Chatfenster.

Innerhalb der Anweisung

Manchmal ist es aber notwendig, Text innerhalb eines Anweisungsblocks (innerhalb der eckigen Klammern) zu verarbeiten.In diesem Falle muss man etwas anders vorgehen.Zuerst einmal brauchst du im Makroblock für Text immer einfach oder doppelte Anführungszeichen. Andernfalls hält der Parser sie für Variablen! Ein Beispiel:

Richtige Verwendung

[string = "Dies ist eine Zeichenkette"]

Falsche Verwendung

[string = Dies ist eine Zeichenkette]

Merke: Außerhalb der eckigen Klammern: keine Anführungszeichen - innerhalb? ANFÜHRUNGSZEICHEN!

Wie geht das dann, wenn wir einen Text brauchen, der teils festgelegt ("hardcoded") und teils variabel oder per Eingabe des Benutzers erzeugt ist. Du kannst vorher nicht wissen, welche Eingabe der Nutzer macht. Du kannst den Text also auch nicht vorher komplett schreiben. In einem Makro fügen wir die Texte mit einem Plus-Zeichen (+)aneinander. Wird es mit einem Text verwendet, dann verkettet es die beiden zu einem längeren Text.

Hier ein Beispiel: Angenommen, wir wollen den Nutzer den Namen einer _Fertigkeit eingeben lassen.Dann wollen wir diesen Fertigkeitsnamen in unserem Text wieder in eine andere Variable schreiben. Du würdest das so machen:

[h:festerText = "Der Name der eingegebenen Fertigkeit ist "]
[h:verketteterText = festerText+fertigkeit+"."]
[r:verketteterText]

Was hier passiert:

  • Zeile 1: setzt den unveränderlichen Text fest
  • Zeile 2 deklariert eine weitere Variable für den Ergebnistext und weist ihr eine Verkettung von drei anderen Teilen zu:
    • den unveränderlichen Text
    • die neu deklarierte Variable "fertigkeit"
    • eine Zeichenkette mit nur einem Zeichen (",")
  • Maptool weiß, dass die erste Variable eine Zeichekette enthält, also wird es trotz des Pluszeichens nicht versuchen, die Werte zu addieren. Stattdessen verkettet es die Werte. Da die Variable keinen Wert enthält (keine Zuweisung hat), fragt MapTool den Anwender nach dem Wert für "fertigkeit" und hängt dann diese Zeichenkette und den Punkt an.
  • Zeile 3 zeigt den Wert der Variable "verketteterText" im Chat an.

Der Name der eingegebenen Fertigkeit ist Schmieden.

Das ist ein einfaches Beispiel, aber es zeigt gut, wie innerhalb eines Makros mit Texten umgegangen wird - sie werden mit Pluszeichen verkettet.

Wie geht es jetzt weiter?

Diese Anleitung hat nur an der Oberfläche dessen gekratzt, wozu Makros in MapTool fähig sind. Schon mit diesen einfachen Anweisungen kann man aber viele nützliche Dinge tun und wiederkehrende Abläufe beschleunigen und dem Spielspaß mehr Raum schaffen. Nach dem Testen (!) mit ein paar selbst geschriebenen Makros kannst du dir mal die Artikel über Verzweigungen (en), Weitere Verzweigungsmöglichkeiten (en) und Schleifen (en) ansehen. Eine gute Option sind auch immer andere Makros, die du in Frameworks findest, im Forum oder in den entsprechenden Discordkanälen. Viel Spaß!

Languages:  English  • Deutsch  • français  • italiano  • 日本語  • 한국어