Macros for Dummies - A MapTool Macro-Tutorial (german)

Doc requests, organization, and submissions

Moderators: dorpond, trevor, Azhrei

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

18.6.2 - Waffe hinzufügen (Formular): Die Erklärung

Zum Hinzufügen von Waffen benutzen wir ein HTML-Formular, wir benötigen also insgesamt zwei Makros. Erstelle in deinem Library-Token das Makro "waffeNeu", das du ja auch schon im Charakterbogen verlinkt hast. Dieses Makro beinhaltet das Eingabeformular.

Zuerst erstellen wir ein Dialog-Fenster und notieren den Anfang des HTML-Aufbaus. Damit wir den MapTool Stack-Speicher entlasten notieren wir erneut alles als String, und dort wo es notwendig ist benutzen wir strformat. Beachte, dass ich auch hier den Anfang eines Strings [r: " und das Ende eines Strings "] zur Übersicht in einer eigenen Zeile notiere. Das werde ich auch in allen nachfolgenden Makros machen die wir noch basteln.

Code: Select all

[dialog("waffeAdd", "width=308; height=264; temporary=1; input=0; noframe=0"):
  {
    [r: "
    <html>
      <head>
        <title>
          Waffe hinzufügen
        </title>
      </head>
      <body>
    "]
Als nächstes legen wir den Link zum verarbeitenden Makro fest und beginnen das Formular:

Code: Select all

[h: processLink = macroLinkText("waffeNeuProcess@Lib:makros")]
[r: strformat("<form action='%s'>", processLink)]
Das Formular besteht aus einer Tabelle mit drei Zeilen und jeweils einer Zelle zur Strukturierung des Inhalts. Notieren wir also den Anfang dieser Tabelle:

Code: Select all

[r: "
<table style='border-spacing: 0px; border: 2px solid #008000; background-color: #ffffff; width: 280'>
  <tr>
    <td style='text-align: center'>
In der ersten Zelle ganz oben erstellen wir eine weitere Tabelle als eine Art Überschrift:

Code: Select all

<table style='border-spacing: 0px; margin-top: 10px; margin-bottom: 10px; width: 240'>
  <tr>
    <td style='font-size: 14pt; font-weight: bold; color: #ffffff; text-align: center; background-color: #008000'>
      Neue Waffe
    </td>
  </tr>
</table>
Dann schließen wir die Zelle und öffnen die nächste in der Zeile darunter:

Code: Select all

  </td>
</tr>
<tr>
  <td style='text-align: center'>
Innerhalb dieser Zelle erstellen wir eine weitere Tabelle mit einigen Text-Eingabefeldern, damit der User die Daten (Name, Bonus & Schadenswürfel) der neuen Waffe eingeben kann:

Code: Select all

<table style='border-spacing: 0px'>
  <tr>
    <td>
      Waffenname:
    </td>
    <td>
      <input type='text' name='wName' size='15' maxlength='12'>
    </td> 
  </tr>
  <tr>
    <td>
      Waffenbonus:
    </td>
    <td>
      <input type='text' name='wBonus' size='2' maxlength='1'>
    </td> 
  </tr>  
  <tr>
    <td>
      Schadenswürfel:
    </td>
    <td>
      <input type='text' name='wSchaden' size='2' maxlength='1'>
    </td> 
  </tr>
</table>
Die Zelle der äußeren Tabelle wird nun geschlossen und die nächste Zelle eine Zeile darunter erstellt. Diese Zelle enthält den Senden-Button für das Formular. Dann schließen wir die gesamte äußere Tabelle.

Code: Select all

    </td>
  </tr>
  <tr>
    <td style='text-align: center; padding: 10px'>
      <input type='submit' name='processButton' value='Waffe eintragen'>
    </td>
  </tr>
</table>
Zum Schluss schließen wir das Formular, den HTML-Bereich und das Dialog-Fenster:

Code: Select all

        </form>
      </body>
    </html>
    "]
  }
]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

18.6.3 - Waffe hinzufügen (Verarbeitung): Das Makro

Code: Select all

[h: "<!-- Daten aus Eingabeformular empfangen und in Variable speichern -->"]

[h: waffeDaten = macro.args]

[h: "<!-- Eingabeformular schliessen -->"]

[h: closeDialog("waffeAdd")]

[h: "<!-- Aktuelle Waffenanzahl abrufen -->"]

[h: waffenAnzahl = getStrProp(Waffen, "WaffenAnzahl")]

[h: "<!-- Nummer der neuen Waffe und neue Waffenanzahl bestimmen -->"]

[h: waffeNummer = waffenAnzahl + 1]

[h: "<!-- Daten aus Eingabeformular in Variablen speichern  -->"]

[h: waffeName = getStrProp(waffeDaten, "wName")]
[h: waffeBonus = getStrProp(waffeDaten, "wBonus")]
[h: waffeSchaden = getStrProp(waffeDaten, "wSchaden")]

[h: "<!-- Daten aus Eingabeformular auf Fehler pruefen  -->"]

[h,if(waffeName == ""): waffeName = "Unbekannte Waffe"; waffeName = waffeName]
[h,if(waffeBonus == ""): waffeBonus = 0; waffeBonus = waffeBonus]
[h,if(waffeSchaden == ""): waffeSchaden = 1; waffeSchaden = waffeSchaden]

[h: assert(isNumber(waffeBonus), "<span style='font-weight: bold'>Fehler!</span> Die Eingabe ist keine Zahl. Bitte wiederhole den Vorgang.", 0)]
[h: assert(isNumber(waffeSchaden), "<span style='font-weight: bold'>Fehler!</span> Die Eingabe ist keine Zahl. Bitte wiederhole den Vorgang.", 0)]

[h,if(waffeBonus != round(waffeBonus) || waffeSchaden != round(waffeSchaden)): pruefwert = 0; pruefwert = 1]
[h: assert(pruefwert, "<span style='font-weight: bold'>Fehler!</span> Die Eingabe ist keine ganze Zahl. Bitte wiederhole den Vorgang.", 0)]

[h,if(waffeBonus < 0 || waffeSchaden < 0 || waffeSchaden > 3): pruefwert = 0; pruefwert = 1]
[h: assert(pruefwert, "<span style='font-weight: bold'>Fehler!</span> Du hast einen ungültigen Wert eingegeben.", 0)]

[h: "<!-- Neue Waffe in Property eintragen  -->"]

[h: Waffen = setStrProp(Waffen, strformat("Waffe%{waffeNummer}Name"), waffeName)]
[h: Waffen = setStrProp(Waffen, strformat("Waffe%{waffeNummer}Bonus"), waffeBonus)]
[h: Waffen = setStrProp(Waffen, strformat("Waffe%{waffeNummer}Schaden"), waffeSchaden)]

[h: "<!-- Neue Waffenanzahl in Property eintragen  -->"]

[h: Waffen = setStrProp(Waffen, "WaffenAnzahl", waffeNummer)]

[h: "<!-- Charakterbogen aufrufen und aktualisieren  -->"]

[macro("charbogen@Lib:makros"): ""]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

18.6.4 - Waffe hinzufügen (Verarbeitung): Die Erklärung

Jetzt geht es daran die Daten aus dem Eingabeformular zu verarbeiten. Erstelle also das neue Makro "waffeNeuProcess" in deinem Library-Token.

Zuerst empfangen wir die Daten aus dem Eingabeformular und schließen das dann Eingabefenster:

Code: Select all

[h: waffeDaten = macro.args]
[h: closeDialog("waffeAdd")]
Jetzt brauchen wir natürlich eine Nummer für die neue Waffe. Dafür rufen wir einfach die aktuelle Anzahl der Waffen ab und rechnen eins dazu:

Code: Select all

[h: waffenAnzahl = getStrProp(Waffen, "WaffenAnzahl")]
[h: waffeNummer = waffenAnzahl + 1]
Nun ist es an der Zeit die Daten der neuen Waffe aus dem Eingabeformular in einzelnen Variablen zu speichern:

Code: Select all

[h: waffeName = getStrProp(waffeDaten, "wName")]
[h: waffeBonus = getStrProp(waffeDaten, "wBonus")]
[h: waffeSchaden = getStrProp(waffeDaten, "wSchaden")]
Und natürlich müssen die vom User eingegebenen Daten wieder überprüft werden:

Code: Select all

[h,if(waffeName == ""): waffeName = "Unbekannte Waffe"; waffeName = waffeName]
[h,if(waffeBonus == ""): waffeBonus = 0; waffeBonus = waffeBonus]
[h,if(waffeSchaden == ""): waffeSchaden = 1; waffeSchaden = waffeSchaden]

[h: assert(isNumber(waffeBonus), "<span style='font-weight: bold'>Fehler!</span> Die Eingabe ist keine Zahl. Bitte wiederhole den Vorgang.", 0)]
[h: assert(isNumber(waffeSchaden), "<span style='font-weight: bold'>Fehler!</span> Die Eingabe ist keine Zahl. Bitte wiederhole den Vorgang.", 0)]

[h,if(waffeBonus != round(waffeBonus) || waffeSchaden != round(waffeSchaden)): pruefwert = 0; pruefwert = 1]
[h: assert(pruefwert, "<span style='font-weight: bold'>Fehler!</span> Die Eingabe ist keine ganze Zahl. Bitte wiederhole den Vorgang.", 0)]

[h,if(waffeBonus < 0 || waffeSchaden < 0 || waffeSchaden > 3): pruefwert = 0; pruefwert = 1]
[h: assert(pruefwert, "<span style='font-weight: bold'>Fehler!</span> Du hast einen ungültigen Wert eingegeben.", 0)]
Ist mit den Daten alles in Ordnung können wir die neue Waffe in der Waffenliste des Propertys eintragen. Dafür nutzen wir natürlich die Funktion setStrProp() für die Eintragung in der String Property List und strformat() zur Angabe der neuen Waffennummer.

Code: Select all

[h: Waffen = setStrProp(Waffen, strformat("Waffe%{waffeNummer}Name"), waffeName)]
[h: Waffen = setStrProp(Waffen, strformat("Waffe%{waffeNummer}Bonus"), waffeBonus)]
[h: Waffen = setStrProp(Waffen, strformat("Waffe%{waffeNummer}Schaden"), waffeSchaden)]
Wenn die neue Waffe eingetragen ist müssen wir natürlich noch die Waffenanzahl um eins erhöhen. Dafür nutzen wir die Nummer der neuen Waffe, da diese ja auch der Gesamtzahl der Waffen entspricht.

Code: Select all

[h: Waffen = setStrProp(Waffen, "WaffenAnzahl", waffeNummer)]
Zum Schluss rufen wir den Charakterbogen neu auf, in dem nun natürlich auch die neue Waffe sichtbar ist:

Code: Select all

[macro("charbogen@Lib:makros"): ""]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

18.6.5 - Waffe löschen (Formular): Das Makro

Code: Select all

[h: "<!-- Eingabefenster oeffnen und HTML-Aufbau notieren -->"]

[dialog("waffeDel", "width=308; height=258; temporary=1; input=0; noframe=0"):
  {
    [r: "
    <html>
      <head>
        <title>
          Waffe löschen
        </title>
      </head>
      <body style='background-color: #A4C8A4'>
    "]

        [h: "<!-- Beginn des Eingabeformulars -->"]

        [h: processLink = macroLinkText("waffeLoeschenProcess@Lib:makros")]
        [r: strformat("<form action='%s'>", processLink)]

          [h: "<!-- Beginn der aeusseren Tabelle -->"]

          [r: "
          <table style='border-spacing: 0px; border: 2px solid #008000; background-color: #ffffff; width: 280'>
            <tr>
              <td style='text-align: center'>

                <!-- Tabelle fuer Ueberschrift -->

                <table style='border-spacing: 0px; margin-top: 10px; margin-bottom: 10px; width: 240'>
                  <tr>
                    <td style='font-size: 14pt; font-weight: bold; color: #ffffff; text-align: center; background-color: #008000'>
                      Waffe löschen
                    </td>
                  </tr>
                </table>

          <!-- Weiterfuehrung der aeusseren Tabelle -->

              </td>
            </tr>
            <tr>
              <td style='text-align: center'>

                <!-- Tabelle fuer Eingabefelder -->

                <table style='border-spacing: 0px'>
          "]

                [h: "<!-- Waffenanzahl feststellen und Waffennummer festlegen -->"]

                [h: waffenAnzahl = getStrProp(Waffen, "WaffenAnzahl")]
                [h: waffeNummer = 1]

                [h: "<!-- Schleifenausgabe fuer Auswahl der zu loeschenden Waffe -->"]

                [r,count(waffenAnzahl, ""), code:
                  {
                    [h: waffeName = getStrProp(Waffen, strformat("Waffe%{waffeNummer}Name"))]

                    [r: strformat("
                    <tr>
                      <td valign='center'>
                        <input type='radio' name='waffeAuswahl' value='%s'>
                      </td>
                      <td valign='center'>
                        %s
                      </td>
                    </tr>
                    ", waffeNummer, waffeName)]

                    [h: waffeNummer = waffeNummer + 1]
                  }
                ]

          [r: "
                <!-- Tabelle fuer Eingabefelder schliessen -->

                </table>

        <!-- Abschluss der aeusseren Tabelle mit Senden-Button -->

              </td>
            </tr>
            <tr>
              <td style='text-align: center; padding: 10px'>
                <input type='submit' name='processButton' value='Waffe löschen'>
              </td>
            </tr>
          </table>

        <!-- Formular, HTML-Bereich und Dialog-Fenster schliessen -->

        </form>
      </body>
    </html>
    "]
  }
]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

18.6.6 - Waffe löschen (Formular): Die Erklärung

Nachdem der User nun neue Waffen hinzufügen kann, soll ihm natürlich auch die Möglichkeit geboten werden Waffen zu löschen. Wieder benutzen wir ein HTML-Formular, benötigen also zwei Makros. Das Formular wird eine Liste aller Waffen enthalten, und über Radio Buttons wird der User die zu löschende Waffe auswählen können.

Erstelle nun das Makro "waffeLoeschen" in deinem Library-Token. Der Inhalt dieses Makros hat große Ähnlichkeit mit dem Formular-Makro zum Waffen hinzufügen, nur ein paar Kleinigkeiten, z. B der Fenstertitel oder der Link zum verarbeitenden Makro, ändern sich. Es beinhaltet also ebenfalls eine äußere Tabelle mit drei Zeilen und jeweils einer Zelle zur Strukturierung. Daher kommen wir gleich zur zweiten Zelle dieser Tabelle mit der Liste der Waffen. Den Rest des Makros solltest du mittlerweile auch so verstehen. Wenn nicht, schaue dir nochmal die Erklärung zum Makro "Waffe hinzufügen (Formular)" an.

Gut, schauen wir uns also die zweite Zelle an. Diese enthält eine weitere Tabelle für unsere Waffenliste:

Code: Select all

<table style='border-spacing: 0px'>
In dieser Tabelle wollen wir mit Hilfe einer COUNT-Schleife Zeile für Zeile die Waffen ausgeben. Das kennst du schon vom Charakterbogen, nur dieses Mal wollen wir noch Eingabefelder (Radio Buttons) für jede Waffe hinzufügen. Dafür verzichten wir auf andere Waffendaten, es soll immer nur der Name einer Waffe angezeigt werden.

Wie beim Charakterbogen müssen wir für die Schleife erst noch zwei Variablen festlegen. Einmal die aktuelle Anzahl der Waffen, womit wir auch die Anzahl der Schleifendurchläufe bestimmen, und die aktuelle Waffennummer, die natürlich wieder bei "1" beginnt.

Code: Select all

[h: waffenAnzahl = getStrProp(Waffen, "WaffenAnzahl")]
[h: waffeNummer = 1]
Jetzt notieren wir die Schleife und schließen darunter auch gleich die Tabelle:

Code: Select all

[r,count(waffenAnzahl, ""), code:
  {

  }
]

</table>
Kommen wir nun zum Inhalt der Schleife, die so oft ausgeführt wird wie die Anzahl der Waffen beträgt. Zuerst besorgen wir uns den Namen der Waffe mit der aktuellen Waffennummer. Zur Angabe der Waffennummer benutzen wir erneut strformat().

Code: Select all

[h: waffeName = getStrProp(Waffen, strformat("Waffe%{waffeNummer}Name"))]
Anschließend erzeugen wir eine Tabellenzeile mit zwei Zellen. Die erste Zelle enthält den Radio Button, wobei wir für "value" die Nummer der aktuellen Waffe angeben. Diese Nummer wird also an das verarbeitende Makro übertragen, sollte der User diese Waffe auswählen. Das Attribut "name" ist natürlich bei allen Radio Buttons gleich, denn sie sollen zusammen ja eine Gruppe bilden. Die zweite Zelle enthält dann den Namen der aktuellen Waffe.

Code: Select all

[r: strformat("
  <tr>
    <td valign='center'>
      <input type='radio' name='waffeAuswahl' value='%s'>
    </td>
    <td valign='center'>
      %s
    </td>
  </tr>
", waffeNummer, waffeName)]
Zum Schluss erhöhen wir noch die Waffennummer um eins, damit beim nächsten Schleifendurchlauf auch die Daten der nächsten Waffe abgerufen werden:

Code: Select all

[h: waffeNummer = waffeNummer + 1]
Das war der Inhalt der zweiten Zelle der äußeren Tabelle. Wenn du mit dem Makro fertig rufe es gleich mal aus dem Charakterbogen heraus auf, damit du auch das Ergebnis siehst.

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

18.6.7 - Waffe löschen (Verarbeitung): Das Makro

Code: Select all

[h: "<!-- Daten aus Eingabeformular empfangen und in Variable speichern -->"]

[h: daten = macro.args]

[h: "<!-- Eingabeformular schliessen -->"]

[h: closeDialog("waffeDel")]

[h: "<!-- Waffennummern fuer Schleife festlegen -->"]

[h: wLoeschen = getStrProp(daten, "waffeAuswahl")]
[h: wKopieren = wLoeschen + 1]

[h: "<!-- Makro abbrechen wenn keine Daten vorhanden sind -->"]

[h,if(wLoeschen == ""): abort(0)]

[h: "<!-- Anzahl der Schleifendurchlaeufe bestimmen -->"]

[h: wAnzahl = getStrProp(Waffen, "WaffenAnzahl")]
[h: sAnzahl = wAnzahl - wLoeschen]

[h: "<!-- Schleife starten -->"]

[h,count(sAnzahl), code:
  {
    [h: "<!-- Daten der zu kopierenden Waffe speichern -->"]

    [h: copyName = getStrProp(Waffen, strformat("Waffe%{wKopieren}Name"))]
    [h: copyBonus = getStrProp(Waffen, strformat("Waffe%{wKopieren}Bonus"))]
    [h: copySchaden = getStrProp(Waffen, strformat("Waffe%{wKopieren}Schaden"))]

    [h: "<!-- Daten der zu loeschenden Waffe ueberschreiben -->"]

    [h: Waffen = setStrProp(Waffen, strformat("Waffe%{wLoeschen}Name"), copyName)]
    [h: Waffen = setStrProp(Waffen, strformat("Waffe%{wLoeschen}Bonus"), copyBonus)]
    [h: Waffen = setStrProp(Waffen, strformat("Waffe%{wLoeschen}Schaden"), copySchaden)]

    [h: "<!-- Waffennummern erhoehen  -->"]
		
    [h: wLoeschen = wLoeschen + 1]
    [h: wKopieren = wKopieren + 1]
  }
]

[h: "<!-- Letzte Waffe in der Liste loeschen -->"]

[h: Waffen = deleteStrProp(Waffen, strformat("Waffe%{wAnzahl}Name"))]
[h: Waffen = deleteStrProp(Waffen, strformat("Waffe%{wAnzahl}Bonus"))]
[h: Waffen = deleteStrProp(Waffen, strformat("Waffe%{wAnzahl}Schaden"))]

[h: "<!-- Neue Waffenanzahl festlegen -->"]

[h: wAnzahl = wAnzahl - 1]
[h: Waffen = setStrProp(Waffen, "WaffenAnzahl", wAnzahl)]

[h: "<!-- Charakterbogen aufrufen und aktualisieren -->"]

[macro("charbogen@Lib:makros"): ""]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

18.6.8 - Waffe löschen (Verarbeitung): Die Erklärung

Es folgt das verarbeitende Makro zum Löschen von Waffen. Erstelle also das Makro "waffeLoeschenProcess" in deinem Library-Token. Bevor es losgeht müssen wir aber noch verstehen nach welchem Prinzip das Löschen einer Waffe funktioniert.

Am Anfang haben wir nur die Waffennummer der Waffe die gelöscht werden soll. Tatsächlich werden wir diese Waffe nicht löschen, sondern die Daten (Name, Bonus, Schaden) mit den Daten der nächsten Waffe in der Liste überschreiben. Dann gehen wir zur nächsten Waffe in der Liste und machen dort das Gleiche. So fahren wir fort bis wir bei der letzten Waffe angekommen sind. Wir verschieben also quasi alle Waffen nach der zu löschenden Waffe um einen Platz nach vorne, wofür wir eine COUNT-Schleife benutzen. Schlussendlich löschen wir die letzte Waffe in der Liste, denn sonst gäbe es diese ja zweimal.

Als Beispiel nehmen wir an, dass es in unserer Waffenliste insgesamt acht Waffen gibt. Waffe Nr. 5 soll nun gelöscht werden. Die Daten dieser Waffe werden also mit den Daten von Waffe Nr. 6 überschrieben. Die Daten von Waffe Nr. 6 mit den Daten von Waffe Nr. 7, und die Daten von Waffe Nr. 7 mit den Daten von Waffe Nr. 8. Waffe Nr. 8 wird am Schluss dann gelöscht.

Gut, fangen wir an. Zuerst rufen wir die Formulardaten ab und schließen das Formularfenster:

Code: Select all

[h: daten = macro.args]

[h: closeDialog("waffeDel")]
Die Nummer der zu löschenden Waffe speichern wir nun in einer Variable. Ebenso die Nummer der nächsten Waffe in der Liste, von der ja die Daten kopiert werden sollen.

Code: Select all

[h: wLoeschen = getStrProp(daten, "waffeAuswahl")]
[h: wKopieren = wLoeschen + 1]
Sollte der User gar keine Waffe zum Löschen ausgewählt haben, brechen wir das Makro an dieser Stelle mit abort()ab:

Code: Select all

[h,if(wLoeschen == ""): abort(0)]
Jetzt müssen wir die Anzahl der Durchläufe der COUNT-Schleife bestimmen. Wenn wir die Nummer der zu löschenden Waffe von der Gesamtzahl der Waffen abziehen, erhalten wir als Ergebnis die Anzahl der Waffen in der Waffenliste nach der zu löschenden Waffe. Das ist dann natürlich auch die Anzahl der Schleifendurchläufe.

Code: Select all

[h: wAnzahl = getStrProp(Waffen, "WaffenAnzahl")]
[h: sAnzahl = wAnzahl - wLoeschen]
Notieren wir nun erst die Schleife bevor wir uns um ihren Inhalt kümmern:

Code: Select all

[h,count(sAnzahl), code:
  {

  }
]
Jetzt der Inhalt der Schleife. Zuerst besorgen wir uns die Daten der nächsten Waffe nach der zu löschenden Waffe:

Code: Select all

[h: copyName = getStrProp(Waffen, strformat("Waffe%{wKopieren}Name"))]
[h: copyBonus = getStrProp(Waffen, strformat("Waffe%{wKopieren}Bonus"))]
[h: copySchaden = getStrProp(Waffen, strformat("Waffe%{wKopieren}Schaden"))]
Mit diesen Daten werden nun die Daten der zu löschenden Waffe überschrieben:

Code: Select all

[h: Waffen = setStrProp(Waffen, strformat("Waffe%{wLoeschen}Name"), copyName)]
[h: Waffen = setStrProp(Waffen, strformat("Waffe%{wLoeschen}Bonus"), copyBonus)]
[h: Waffen = setStrProp(Waffen, strformat("Waffe%{wLoeschen}Schaden"), copySchaden)]
Am Ende der Schleife müssen wir noch die Nummer der zu löschenden Waffe erhöhen, und natürlich auch die Nummer der nächsten Waffe, von der dann wieder die Daten kopiert werden sollen.

Code: Select all

[h: wLoeschen = wLoeschen + 1]
[h: wKopieren = wKopieren + 1]
Damit ist die Schleife fertig. Danach löschen wir noch die letzte Waffe in der Waffenliste. Als Waffennummer geben wir einfach die alte Waffenanzahl an, denn das ist ja logischerweise auch die Nummer der letzten Waffe in der Liste.

Code: Select all

[h: Waffen = deleteStrProp(Waffen, strformat("Waffe%{wAnzahl}Name"))]
[h: Waffen = deleteStrProp(Waffen, strformat("Waffe%{wAnzahl}Bonus"))]
[h: Waffen = deleteStrProp(Waffen, strformat("Waffe%{wAnzahl}Schaden"))]
Es gibt jetzt eine Waffe weniger, also senken wir die Waffenanzahl um eins und speichern das auch im Property:

Code: Select all

[h: wAnzahl = wAnzahl - 1]
[h: Waffen = setStrProp(Waffen, "WaffenAnzahl", wAnzahl)]
Jetzt noch den Charakterbogen zur Aktualisierung aufrufen, damit der User auch sieht, dass die Waffe gelöscht wurde.

Code: Select all

[macro("charbogen@Lib:makros"): ""]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

18.7 - Zauberverwaltung

18.7.1 - Zauber hinzufügen (Formular): Das Makro

Um einen neuen Zauber hinzuzufügen benutzen wir erneut ein HTML-Formular, benötigen also insgesamt zwei Makros. Erstelle das Formular-Makro "zauberNeu" in deinem Library-Token. Das Makro ist genauso aufgebaut wie das Makro zum Hinzufügen einer Waffe, nur gibt es hier natürlich nur ein Eingabefeld, da wir ja nur den Zaubername brauchen. Eine nähere Erklärung des Makros spare ich mir also, das kennst du schließlich schon alles. Schaue es dir einfach genau an:

Code: Select all

[h: "<!-- Eingabefenster oeffnen und HTML-Aufbau notieren -->"]

[dialog("zauberAdd", "width=308; height=214; temporary=1; input=0; noframe=0"):
  {
    [r: "
    <html>
      <head>
        <title>
          Zauber hinzufügen
        </title>
      </head>
      <body>
    "]

        [h: "<!-- Beginn des Eingabeformulars -->"]

        [h: processLink = macroLinkText("zauberNeuProcess@Lib:makros")]
        [r: strformat("<form action='%s'>", processLink)]

          [h: "<!-- Beginn der aeusseren Tabelle -->"]

          [r: "
          <table style='border-spacing: 0px; border: 2px solid #008000; background-color: #ffffff; width: 280'>
            <tr>
              <td style='text-align: center'>

                <!-- Tabelle fuer Ueberschrift -->

                <table style='border-spacing: 0px; margin-top: 10px; margin-bottom: 10px; width: 240'>
                  <tr>
                    <td style='font-size: 14pt; font-weight: bold; color: #ffffff; text-align: center; background-color: #008000'>
                      Neuer Zauber
                    </td>
                  </tr>
                </table>

          <!-- Weiterfuehrung der aeusseren Tabelle -->

              </td>
            </tr>
            <tr>
              <td style='text-align: center'>

                <!-- Tabelle fuer Eingabefelder -->

                <table style='border-spacing: 0px'>
                  <tr>
                    <td>
                      Zaubername:
                    </td>
                    <td>
                      <input type='text' name='zName' size='15' maxlength='25'>
                    </td> 
                  </tr>
                </table>

        <!-- Abschluss der aeusseren Tabelle mit Senden-Button -->

              </td>
            </tr>
            <tr>
              <td style='text-align: center; padding: 10px'>
                <input type='submit' name='processButton' value='Zauber eintragen'>
              </td>
            </tr>
          </table>

        <!-- Formular, HTML-Bereich und Dialog-Fenster schliessen -->

        </form>
      </body>
    </html>
    "]
  }
]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

18.7.2 - Zauber hinzufügen (Verarbeitung): Das Makro

Code: Select all

[h: "<!-- Daten aus Eingabeformular empfangen und in Variable speichern -->"]

[h: zauberDaten = macro.args]

[h: "<!-- Eingabeformular schliessen -->"]

[h: closeDialog("zauberAdd")]

[h: "<!-- Daten aus Eingabeformular in Variablen speichern  -->"]

[h: zauberName = getStrProp(zauberDaten, "zName")]

[h: "<!-- Daten aus Eingabeformular auf Fehler pruefen  -->"]

[h,if(zauberName == ""): pruefwert = 0; pruefwert = 1]
[h: assert(pruefwert, "<span style='font-weight: bold'>Fehler!</span> Keinen Zauber eingetragen.", 0)]

[h: "<!-- Neuen Zauber in Property eintragen  -->"]

[h: Zauber = listAppend(Zauber, zauberName)]

[h: "<!-- Zauberliste in Property sortieren  -->"]

[h: Zauber = listSort(Zauber, "A")]

[h: "<!-- Charakterbogen aufrufen und aktualisieren  -->"]

[macro("charbogen@Lib:makros"): ""]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

18.7.3 - Zauber hinzufügen (Verarbeitung): Die Erklärung

Die Zauber werden in einer String-List gespeichert. Einen neuen Eintrag hinzuzufügen ist quasi ein Kinderspiel. Erstelle also das neue Makro "zauberNeuProcess" in deinem Library-Token.

Wie immer müssen wir erst die Daten des Formulars empfangen. Anschließend schließen wir das Eingabefenster und speichern den Namen des neuen Zaubers in einer Variable:

Code: Select all

[h: zauberDaten = macro.args]

[h: closeDialog("zauberAdd")]

[h: zauberName = getStrProp(zauberDaten, "zName")]
Erneut prüfen wir die Eingabe des Users. In diesem Fall schauen wir nur ob er überhaupt etwas eingegeben hat:

Code: Select all

[h,if(zauberName == ""): pruefwert = 0; pruefwert = 1]
[h: assert(pruefwert, "<span style='font-weight: bold'>Fehler!</span> Keinen Zauber eingetragen.", 0)]
Jetzt fügen wir den neuen Zauber der String-List des Propertys hinzu. Dafür benutzen wir die Funktion listAppend(), bei der wir als Parameter die Liste und den neuen Eintrag angeben:

Code: Select all

[h: Zauber = listAppend(Zauber, zauberName)]
Der neue Zauber wird ganz am Ende der String-List eingefügt, also sortieren wir die Liste noch mit listSort():

Code: Select all

[h: Zauber = listSort(Zauber, "A")]
Am Ende rufen wir zur Aktualisierung wieder den Charakterbogen auf:

Code: Select all

[macro("charbogen@Lib:makros"): ""]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

18.7.4 - Zauber löschen (Formular): Das Makro

Code: Select all

[h: "<!-- Eingabefenster oeffnen und HTML-Aufbau notieren -->"]

[dialog("zauberDel", "width=308; height=258; temporary=1; input=0; noframe=0"):
  {
    [r: "
    <html>
      <head>
        <title>
          Zauber löschen
        </title>
      </head>
      <body style='background-color: #A4C8A4'>
    "]

        [h: "<!-- Beginn des Eingabeformulars -->"]

        [h: processLink = macroLinkText("zauberLoeschenProcess@Lib:makros")]
        [r: strformat("<form action='%s'>", processLink)]

          [h: "<!-- Beginn der aeusseren Tabelle -->"]

          [r: "
          <table style='border-spacing: 0px; border: 2px solid #008000; background-color: #ffffff; width: 280'>
            <tr>
              <td style='text-align: center'>

                <!-- Tabelle fuer Ueberschrift -->

                <table style='border-spacing: 0px; margin-top: 10px; margin-bottom: 10px; width: 240'>
                  <tr>
                    <td style='font-size: 14pt; font-weight: bold; color: #ffffff; text-align: center; background-color: #008000'>
                      Zauber löschen
                    </td>
                  </tr>
                </table>

          <!-- Weiterfuehrung der aeusseren Tabelle -->

              </td>
            </tr>
            <tr>
              <td style='text-align: center'>

                <!-- Tabelle fuer Eingabefelder -->

                <table style='border-spacing: 0px'>
          "]

                [h: "<!-- Schleifenausgabe fuer Auswahl des zu loeschenden Zaubers -->"]

                [r,foreach(item, Zauber, ""), code:
                  {
                    [r: strformat("
                    <tr>
                      <td valign='center'>
                        <input type='radio' name='zauberAuswahl' value='%s'>
                      </td>
                      <td valign='center'>
                        %s
                      </td>
                    </tr>
                    ", item, item)]
                  }
                ]

          [r: "
                <!-- Tabelle fuer Eingabefelder schliessen -->

                </table>

        <!-- Abschluss der aeusseren Tabelle mit Senden-Button -->

              </td>
            </tr>
            <tr>
              <td style='text-align: center; padding: 10px'>
                <input type='submit' name='processButton' value='Zauber löschen'>
              </td>
            </tr>
          </table>

        <!-- Formular, HTML-Bereich und Dialog-Fenster schliessen -->

        </form>
      </body>
    </html>
    "]
  }
]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

18.7.5 - Zauber löschen (Formular): Die Erklärung

Erneut ein HTML-Formular, also insgesamt zwei Makros. Erstelle das neue Formular-Makro "zauberLoeschen" in deinem Library Token. Es ist genau so aufgebaut wie das Formular-Makro zum Löschen einer Waffe. Das hast du mittlerweile bestimmt drauf, oder du schaust bei der entsprechenden Erklärung des genannten Makros nach. Wir kümmern uns wieder nur um die zweite Zelle der äußeren Tabelle, die die Zauberliste mit Radio Buttons zur Auswahl des zu löschenden Zaubers enthält.

Beginnen wir also mit dem Inhalt besagter Zelle und erstellen darin eine neue Tabelle:

Code: Select all

<table style='border-spacing: 0px'>
Jetzt wollen wir Zeile für Zeile die Zauber mit Radio Buttons ausgeben, damit der User einen Zauber zum Löschen auswählen kann. Da es sich bei dem Property "Zauber" um eine String-List handelt, eignet sich dafür sehr gut eine FOREACH-Schleife. Innerhalb der Schleife erzeugen wir eine Tabellenzeile mit zwei Zellen. Die erste Zelle enthält den Radio Button, wobei wir für "value" den Namen des aktuellen Zaubers angeben. Dieser Name wird also an das verarbeitende Makro übertragen, sollte der User diesen Zauber auswählen. Das Attribut "name" ist natürlich bei allen Radio Buttons gleich, denn sie sollen zusammen ja eine Gruppe bilden. Die zweite Zelle enthält dann den Namen des aktuellen Zaubers.

Code: Select all

[r,foreach(item, Zauber, ""), code:
  {
    [r: strformat("
      <tr>
        <td valign='center'>
          <input type='radio' name='zauberAuswahl' value='%s'>
        </td>
        <td valign='center'>
          %s
        </td>
      </tr>
    ", item, item)]
  }
]
Zum Schluss schließen wir noch die Tabelle, das war es dann.

Code: Select all

</table>

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

18.7.6 - Zauber löschen (Verarbeitung): Das Makro

Code: Select all

[h: "<!-- Daten aus Eingabeformular empfangen und in Variable speichern -->"]

[h: daten = macro.args]

[h: "<!-- Eingabeformular schliessen -->"]

[h: closeDialog("zauberDel")]

[h: "<!-- Daten aus Eingabeformular in Variable speichern  -->"]

[h: zauberName = getStrProp(daten, "zauberAuswahl")]

[h: "<!-- Makro abbrechen wenn keine Daten vorhanden sind  -->"]

[h,if(zauberName == ""): abort(0)]

[h: "<!-- Index des ausgewaehlten Zaubers im Property feststellen  -->"]

[h: zauberIndex = listFind(Zauber, zauberName)]

[h: "<!-- Ausgewaehlten Zauber im Property loeschen  -->"]

[h: Zauber = listDelete(Zauber, zauberIndex)]

[h: "<!-- Charakterbogen aufrufen und aktualisieren  -->"]

[macro("charbogen@Lib:makros"): ""]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

18.7.7 - Zauber löschen (Verarbeitung): Die Erklärung

Das Löschen des Zaubers aus der String-List ist eine einfache Aufgabe, der Zaubername aus dem Eingabeformular langt uns da völlig. Erstelle also das neue Makro "waffeLoeschenProcess" im Library-Token.

Wie immer gilt es zuerst die Daten aus dem Eingabeformular zu empfangen, das Eingabefenster zu schließen und den Namen des zu löschenden Zaubers in einer Variable zu speichern:

Code: Select all

[h: daten = macro.args]

[h: closeDialog("zauberDel")]

[h: zauberName = getStrProp(daten, "zauberAuswahl")]
Sollte der User keinen Zauber zum Löschen ausgewählt haben, brechen wir das Makro mit der Funktion abort() an dieser Stelle ab:

Code: Select all

[h,if(zauberName == ""): abort(0)]
Jetzt brauchen wir den Index des zu löschenden Zaubers in der String-List. Dafür benutzen wir die Funktion listFind(), die uns als Rückgabewert den Index in der Liste liefert. Als Parameter geben wir die Liste an, und natürlich den String, den wir in dieser Liste suchen.

Code: Select all

[h: zauberIndex = listFind(Zauber, zauberName)]
Mit der Funktion listDelete() löschen wir jetzt den Zauber aus der String-List. Dafür geben wir als Parameter die Liste und den Index des zu löschenden Eintrags an.

Code: Select all

[h: Zauber = listDelete(Zauber, zauberIndex)]
Wie immer aktualisieren wir zum Schluss den Charakterbogen:

Code: Select all

[macro("charbogen@Lib:makros"): ""]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

18.8 - Charaktereditor

18.8.1 - Eingabeformular: Das Makro

Code: Select all

[h: "<!-- Eingabefenster oeffnen und HTML-Aufbau notieren -->"]

[dialog("chareditor", "width=308; height=391; temporary=1; input=0; noframe=0"):
  {
    [r: "
    <html>
      <head>
        <title>
          Charaktereditor
        </title>
      </head>
      <body>
    "]

        [h: "<!-- Beginn des Eingabeformulars -->"]

        [h: processLink = macroLinkText("chareditProcess@Lib:makros")]
        [r: strformat("<form action='%s'>", processLink)]

          [h: "<!-- Beginn der aeusseren Tabelle -->"]

          [r: "
          <table style='border-spacing: 0px; border: 2px solid #008000; background-color: #ffffff; width: 280'>
            <tr>
              <td style='text-align: center'>

                <!-- Tabelle fuer Ueberschrift -->

                <table style='border-spacing: 0px; margin-top: 10px; margin-bottom: 10px; width: 240'>
                  <tr>
                    <td style='font-size: 14pt; font-weight: bold; color: #ffffff; text-align: center; background-color: #008000'>
                      Charaktereditor
                    </td>
                  </tr>
                </table>

          <!-- Weiterfuehrung der aeusseren Tabelle -->

              </td>
            </tr>
            <tr>
              <td style='text-align: center'>
          "]

          [h: "<!-- Variablen fuer Vorselektierung der Klassenliste erstellen -->"]

          [h: selectKrieger = ""]
          [h: selectSchurke = ""]
          [h: selectMagier = ""]

          [h: "<!-- Klassenliste vorselektieren -->"]

          [h,switch(Klasse):
            case "Krieger": selectKrieger = "selected='selected'";
            case "Schurke": selectSchurke = "selected='selected'";
            case "Magier": selectMagier = "selected='selected'";
            default: selectKrieger = "selected='selected'"
          ]

          [h: "<!-- Tabelle fuer Eingabefelder -->"]

          [r: strformat("
                <table style='border-spacing: 0px'>
                  <tr>
                    <td>
                      Klasse:
                    </td>
                    <td>
                      <select name='nKlasse'>
                        <option %s>Krieger</option>
                        <option %s>Schurke</option>
                        <option %s>Magier</option>
                      </select>
                    </td> 
                  </tr>
                  <tr>
                    <td>
                      Kraft:
                    </td>
                    <td>
                      <input type='text' name='nKraft' size='2' maxlength='2' value='%s'>
                    </td> 
                  </tr>
                  <tr>
                    <td>
                      Geschick:
                    </td>
                    <td>
                      <input type='text' name='nGeschick' size='2' maxlength='2' value='%s'>
                    </td> 
                  </tr>  
                  <tr>
                    <td>
                      Klugheit:
                    </td>
                    <td>
                      <input type='text' name='nKlugheit' size='2' maxlength='2' value='%s'>
                    </td> 
                  </tr>
                  <tr>
                    <td>
                      Grundangriff:
                    </td>
                    <td>
                      <input type='text' name='nAngriff' size='2' maxlength='2' value='%s'>
                    </td> 
                  </tr>
                  <tr>
                    <td>
                      Grundverteidigung:
                    </td>
                    <td>
                      <input type='text' name='nVerteidigung' size='2' maxlength='2' value='%s'>
                    </td> 
                  </tr>
                  <tr>
                    <td>
                      Rüstung:
                    </td>
                    <td>
                      <input type='text' name='nRuestung' size='2' maxlength='2' value='%s'>
                    </td> 
                  </tr>
                  <tr>
                    <td>
                      Maximale HP:
                    </td>
                    <td>
                      <input type='text' name='nHP' size='2' maxlength='2' value='%s'>
                    </td> 
                  </tr>
                </table>
          ", selectKrieger, selectSchurke, selectMagier, Kraft, Geschick, Klugheit, Angriff, Verteidigung, Ruestung, HPmax)]

          [r: "
          <!-- Abschluss der aeusseren Tabelle mit Senden-Button -->

              </td>
            </tr>
            <tr>
              <td style='text-align: center; padding: 10px'>
                <input type='submit' name='processButton' value='Charakter ändern'>
              </td>
            </tr>
          </table>

        <!-- Formular, HTML-Bereich und Dialog-Fenster schliessen -->

        </form>
      </body>
    </html>
    "]
  }
]

Post Reply

Return to “Documentation Requests/Discussion”