RPTools.net

Discussion and Support

Skip to content

It is currently Sat Aug 19, 2017 12:15 am 






Reply to topic  [ 154 posts ]  Go to page Previous  1 ... 6, 7, 8, 9, 10, 11  Next

Previous topic | Next topic 

  Print view

Author Message
 Offline
Giant
 
Joined: Sun Sep 14, 2014 3:27 am
Posts: 179
 Post subject: Re: Macros for Dummies - A guide to MapTool-Macros (german)
PostPosted: Tue Sep 29, 2015 2:34 pm 
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:
[dialog("waffeAdd", "width=308; height=264; temporary=1; input=0; noframe=0"):
  {
    [r: "
    <html>
      <head>
        <title>
          Waffe hinzuf&uuml;gen
        </title>
      </head>
      <body>
    "]

Als nächstes legen wir den Link zum verarbeitenden Makro fest und beginnen das Formular:

Code:
[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:
[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:
<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:
  </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:
<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&uuml;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:
    </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:
        </form>
      </body>
    </html>
    "]
  }
]


Top
 Profile  
 
 Offline
Giant
 
Joined: Sun Sep 14, 2014 3:27 am
Posts: 179
 Post subject: Re: Macros for Dummies - A guide to MapTool-Macros (german)
PostPosted: Tue Sep 29, 2015 2:35 pm 
18.6.3 - Waffe hinzufügen (Verarbeitung): Das Makro

Code:
[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&uuml;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"): ""]


Top
 Profile  
 
 Offline
Giant
 
Joined: Sun Sep 14, 2014 3:27 am
Posts: 179
 Post subject: Re: Macros for Dummies - A guide to MapTool-Macros (german)
PostPosted: Tue Sep 29, 2015 2:36 pm 
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:
[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:
[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:
[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:
[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&uuml;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:
[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:
[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:
[macro("charbogen@Lib:makros"): ""]


Top
 Profile  
 
 Offline
Giant
 
Joined: Sun Sep 14, 2014 3:27 am
Posts: 179
 Post subject: Re: Macros for Dummies - A guide to MapTool-Macros (german)
PostPosted: Tue Sep 29, 2015 2:36 pm 
18.6.5 - Waffe löschen (Formular): Das Makro

Code:
[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&ouml;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&ouml;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&ouml;schen'>
              </td>
            </tr>
          </table>

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

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


Top
 Profile  
 
 Offline
Giant
 
Joined: Sun Sep 14, 2014 3:27 am
Posts: 179
 Post subject: Re: Macros for Dummies - A guide to MapTool-Macros (german)
PostPosted: Tue Sep 29, 2015 2:37 pm 
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:
<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:
[h: waffenAnzahl = getStrProp(Waffen, "WaffenAnzahl")]
[h: waffeNummer = 1]

Jetzt notieren wir die Schleife und schließen darunter auch gleich die Tabelle:

Code:
[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:
[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:
[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:
[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.


Top
 Profile  
 
 Offline
Giant
 
Joined: Sun Sep 14, 2014 3:27 am
Posts: 179
 Post subject: Re: Macros for Dummies - A guide to MapTool-Macros (german)
PostPosted: Tue Sep 29, 2015 2:38 pm 
18.6.7 - Waffe löschen (Verarbeitung): Das Makro

Code:
[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"): ""]


Top
 Profile  
 
 Offline
Giant
 
Joined: Sun Sep 14, 2014 3:27 am
Posts: 179
 Post subject: Re: Macros for Dummies - A guide to MapTool-Macros (german)
PostPosted: Tue Sep 29, 2015 2:39 pm 
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:
[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:
[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:
[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:
[h: wAnzahl = getStrProp(Waffen, "WaffenAnzahl")]
[h: sAnzahl = wAnzahl - wLoeschen]

Notieren wir nun erst die Schleife bevor wir uns um ihren Inhalt kümmern:

Code:
[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:
[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:
[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:
[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:
[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:
[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:
[macro("charbogen@Lib:makros"): ""]


Top
 Profile  
 
 Offline
Giant
 
Joined: Sun Sep 14, 2014 3:27 am
Posts: 179
 Post subject: Re: Macros for Dummies - A guide to MapTool-Macros (german)
PostPosted: Tue Sep 29, 2015 2:40 pm 
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:
[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&uuml;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>
    "]
  }
]


Top
 Profile  
 
 Offline
Giant
 
Joined: Sun Sep 14, 2014 3:27 am
Posts: 179
 Post subject: Re: Macros for Dummies - A guide to MapTool-Macros (german)
PostPosted: Tue Sep 29, 2015 2:41 pm 
18.7.2 - Zauber hinzufügen (Verarbeitung): Das Makro

Code:
[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"): ""]


Top
 Profile  
 
 Offline
Giant
 
Joined: Sun Sep 14, 2014 3:27 am
Posts: 179
 Post subject: Re: Macros for Dummies - A guide to MapTool-Macros (german)
PostPosted: Tue Sep 29, 2015 2:41 pm 
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:
[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:
[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:
[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:
[h: Zauber = listSort(Zauber, "A")]

Am Ende rufen wir zur Aktualisierung wieder den Charakterbogen auf:

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


Top
 Profile  
 
 Offline
Giant
 
Joined: Sun Sep 14, 2014 3:27 am
Posts: 179
 Post subject: Re: Macros for Dummies - A guide to MapTool-Macros (german)
PostPosted: Tue Sep 29, 2015 2:42 pm 
18.7.4 - Zauber löschen (Formular): Das Makro

Code:
[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&ouml;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&ouml;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&ouml;schen'>
              </td>
            </tr>
          </table>

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

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


Top
 Profile  
 
 Offline
Giant
 
Joined: Sun Sep 14, 2014 3:27 am
Posts: 179
 Post subject: Re: Macros for Dummies - A guide to MapTool-Macros (german)
PostPosted: Tue Sep 29, 2015 2:43 pm 
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:
<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:
[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:
</table>


Top
 Profile  
 
 Offline
Giant
 
Joined: Sun Sep 14, 2014 3:27 am
Posts: 179
 Post subject: Re: Macros for Dummies - A guide to MapTool-Macros (german)
PostPosted: Tue Sep 29, 2015 2:43 pm 
18.7.6 - Zauber löschen (Verarbeitung): Das Makro

Code:
[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"): ""]


Top
 Profile  
 
 Offline
Giant
 
Joined: Sun Sep 14, 2014 3:27 am
Posts: 179
 Post subject: Re: Macros for Dummies - A guide to MapTool-Macros (german)
PostPosted: Tue Sep 29, 2015 2:44 pm 
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:
[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:
[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:
[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:
[h: Zauber = listDelete(Zauber, zauberIndex)]

Wie immer aktualisieren wir zum Schluss den Charakterbogen:

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


Top
 Profile  
 
 Offline
Giant
 
Joined: Sun Sep 14, 2014 3:27 am
Posts: 179
 Post subject: Re: Macros for Dummies - A guide to MapTool-Macros (german)
PostPosted: Tue Sep 29, 2015 2:45 pm 
18.8 - Charaktereditor

18.8.1 - Eingabeformular: Das Makro

Code:
[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&uuml;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 &auml;ndern'>
              </td>
            </tr>
          </table>

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

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


Top
 Profile  
 
Display posts from previous:  Sort by  
Reply to topic  [ 154 posts ]  Go to page Previous  1 ... 6, 7, 8, 9, 10, 11  Next

You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:

Who is online

In total there are 2 users online :: 0 registered, 0 hidden and 2 guests (based on users active over the past 5 minutes)
Most users ever online was 243 on Sun Nov 04, 2012 6:14 am

Users browsing this forum: No registered users and 2 guests





Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group

Style based on Andreas08 by Andreas Viklund

Style by Elizabeth Shulman