[Guide][Wiki-Beitrag] How-To Total RP 3 Extended ❔

▲ Zurück nach oben
Die Datenbank und das Tutorial

Die „Datenbank der Extended-Objekte“ ist der Dreh- und Angelpunkt im Umgang mit Items, Quests, wie Kampangen in Total RP 3 Extended. Viele Funktionen der Datenbank werden bereits durch das eingebaute Tutorial von Total RP 3 Extended abgedeckt, daher möchte dieser Guide lediglich ein kurzer Abriss darüber sein, wie man zu jenem findet und in der Datenbank im allgemeinen zurecht findet.


Datenbank der Extended-Objekte

Der Button, der die Datenbank öffnet, mag zunächst recht kryptisch gelabelt wirken. „Datenbank der Extended-Objekte“. Die Tatsache, dass als Icon eine Art Uhr oder Zeitzünder gewählt wurde, ist nicht unbedingt zuträglich darin zu vermitteln was genau man dahinter zu erwarten hat.

Wer jedoch den Schritt wagt darauf zu klicken, findet das zentralste Element von Total RP 3 Extended. Die Datenbankansicht. Aber was genau hat es mit dieser auf sich?

Die Datenbank verwaltet alle Items und Kampagnen die entweder selbst erstellt worden, oder aber durch andere Charaktere geteilt worden sind.


Das Tutorial

Wenn man das erste mal die Datenbank öffnet, sollte das Tutorial von TRP3E automatisch starten. Wenn nicht, mag man es auch jeder Zeit mit dem runden Info-Button in der unteren Mitte (:information_source:) erneut starten können.

Jeder, der zuvor noch nie mit TRP3E zu tun hatte, wird nahe gelegt die Schritte des Tutorials durch zu klicken. Die sie öffnende Navigationsbox im oberen Teil gestattet es dabei durch die einzelnen Schritte zu springen.

Behandelt werden die folgenden Themen:

  • Datenbank
  • Datenbank-Typen
  • Suchfilter
  • Objekt-Zeile
  • Wurzel- und innere Objekte
  • Wurzelobjekte
  • Gegenstände erstellen

Man erhält einen Abriss darüber, wo in der Datenbank was wie zu finden und angeordnet ist.

Ebenso wird in den letzten Punkten bereits gezeigt, wie man die Erstellung eigener Items und Kampagnen anstößt.

Gegenstand erstellen:

Kampagne erstellen:

Was aber nicht erklärt wird unbedingt, ist der Import von Items. Im Falle der Funktion „Objekte schnell importieren“ gibt es bereits hier einen Guide.

Die Funktion „Komplettimport von Objekten“ ist der erstgenannten nicht sonderlich unähnlich, nur dass anstelle eines Codes eine totalRP3_Extended_Imp_Export.lua Datei genutzt wird. Ein Komplettexport funktioniert ähnlich dem Schnellexport wie im vorher genannten Guide beschrieben, nur dass man hier einen Komplettexport wählt. Für den Import muss die erzeugte Datei dann beim Zielrechner an die entsprechende Stelle gelegt werden.

Aber insbesondere der Blick in die Lasche „Unterstützer Datenbank“ lohnt sich dabei sehr, finden sich darin Items von Projektunterstützern, die bei jedem Nutzer vorhanden sind und nicht gelöscht werden können. Sie bieten bereits einige solide Beispiele wie bestimmte Item in TRP3E designt sein können und erlaubt es sogleich auch direkt einige Items ausprobieren zu können.

Die Frage an dieser Stelle ist aber wohl nur noch, wie nutzt man diese Items nun eigentlich?


Gegenstände der Tasche hinzufügen

Um ein Item tatsächlich nutzen oder weitergeben zu können, muss man es in der eigenen Tasche vorliegen haben. Was nicht der Fall ist, solange sie nur in der Datenbank gelistet stehen.

Dabei kann man sich die Datenbank als einen gemeinsamen Pool vorstellen, auf denen alle Charaktere eines Clients und Accounts gemeinsam zurückgreifen können. Daraus ergibt sich dass ein mit Charakter A erstelltes oder erhaltenes Item auch direkt einem Charakter B zur Verfügung steht.

Doch damit Charakter A als auch B es besitzen und somit nutzen können, müssen sie ein Exemplar davon in einer ihrer Taschen liegen haben.

Dies ist schnell getan. Man sucht ein Items mit den Bordmitteln, die man im Datenbanktutorial gelernt hat und klickt dann mit einem Rechtsklick auf den gewünschten Eintrag.

Der Menüpunkt „Zum Hauptinventar hinzufügen“ ist der den wir dazu suchen. Er legt eine Kopie oder mehrere Kopien des gewählten Items in die Default bag oder jede andere im Schnellzugriff sich befindende Tasche des Inventarsystems. Mehr zu dem Inventarsystem von TRP3E und wie man also dieses Item dann wiederfindet und nutzt, findet man hier.


▲ Zurück nach oben
1 Like

Die obligatorische „Hallo-Azeroth“-Kampagne

0 Bevor es losgeht…

  • Du hast einen Kampagnen-Plan.
  • Du hast dich schon einmal in der Datenbank umgesehen.
  • Einige Stellen habe ich mit :asterisk:, :eight_spoked_asterisk: oder :scream: markiert. Diese werden weiter unten erläutert.

1 Hallo Welt Azeroth

Ziel diese Beitrags soll es sein eine einfache Begrüßungskampagne zu erstellen. Im ganz klassischen Sinn gibt ein „Hallo Welt“ lediglich einen Text auf dem Bildschirm aus. Ganz so einfach soll es dann doch nicht werden. Wir möchten eine Quest erstellen, in der der Spieler „Hallo Azeroth“ sagt, woraufhin Azeroth dann zurückgrüßt.

2 Der Plan

Kampagne „Hallo Azeroth“
Eine Quest:

  • Spieler sagt (schreibt) „Hallo Azeroth!“
  • → Zwischensequenz: Azeroth sagt: „Hallo [Spielername]!“
  • → Quest erfolgreich

Die Quest soll auch die üblichen Elemente Startmelodie, Endmelodie und Questverfolgung enthalten.

3 Identifizierung der Ereignisse

Ort Ereignis/Trigger Effekte
Quest Quest startet Spiele Quest-Start-Sound ab
Zeige das Questziel (Hallo sagen) an
Schritt 1 Spieler sagt "Hallo Azeroth!" Starte Zwischensequenz
Zwischensequenz Am Ende des Dialogs Erfülle das Questziel
Wechsle zu Schritt 2 (Endschritt)
Schritt 2 Bei Erreichen von Schritt 2 Spiele Quest-erfüllt-Sound ab

Du wirst es also mit insgesamt vier Ereigissen und dementsprechend vier Arbeitsabläufen zu tun haben.

4 Eingabe der Kampagnendaten

4.1 Kampagne und Quest

  1. Öffne die Datenbank.
  2. Klicke unten in den Aktionen auf „Erstelle Kampagne“ und dann „Leere Kampagne“.
    Die Kampagnenübersicht öffnet sich.
  3. Gib der Kampagne einen Namen. Z.B. Hallo Azeroth
  4. Gib der Kampagne eine Zusammenfassung. Z.B. Meine allererste Kampagne
  5. Klicke auf das Pokal-Symbol um der Kampagne ein passendes Icon zu verleihen. Ich habe mir achievement_worldevent_childrensweek ausgesucht. Du kannst im dortigen Suchfeld (englischen) Text eingeben um die sehr große Auswahl an Icons einzuschränken.
  6. Stelle unten rechts unter „Wurzelobjekt“ die Sprache auf deutsch um.

Wechsle nun zur zweiten Registerkarte „Kanal“. Dort findest du bereits eine Quest namens „Neue Quest“, die auf „Automatisch aufdecken“ eingestellt ist. (grüner Text). Das bedeutet, dass diese Quest beim Start der Kampagne automatisch verfügbar gemacht wird, wir können uns den Effekt „Quest aufdecken“ also sparen.
Als erste Amtshandlung geben wir der Quest einen anderen Bezeichner (Id):

  1. Klicke mit gedrückter STRG-Taste auf die Quest. Gib dort eine passende Id ein, z.B. q01_say_hello :eight_spoked_asterisk:
  2. Klicke nun auf die Quest um sie anzupassen. Die Questübersicht öffnet sich.
  3. Gib der Quest einen Namen, z.B. Begrüße Azeroth, und eine Zusammenfassung, z.B. Sage Hallo zu deinem Lieblingsplaneten
  4. Auch hier kannst du dir ein Icon aussuchen, z.B. spell_nature_crystalball
  5. Klicke auf der rechten Seite auf „Questziel hinzufügen“. Ein Dialogfenster öffnet sich.
    5.1. Gib dem Ziel die Id o1_say_hello :eight_spoked_asterisk:.
    5.2. Gib als Questzieltext Sage "Hallo Azeroth!" ein.
    5.3. Wähle außerdem „Automatisch aufdecken“ aus.
    5.4. Klicke nun auf „Speichern“ im Questziel-Dialog.

Quest und Kampagne sind jetzt erstellt, aber noch leer.

:floppy_disk: Wir drücken einmal unten mittig auf „Speichern“.

4.2 Ereignis: Quest-Start

  1. Wechsle zur vierten Registerkarte „Arbeitsabläufe“
  2. Dort klickst du „Arbeitsablauf erstellen“. Gib ihm die Id onStart :eight_spoked_asterisk:.
  3. Auf der rechten Seite klickst du nun auf „Element in Arbeitsablauf einfügen“. Wähle dann Effekt > Geräusche und Musik > Klang-Id abspielen.
  4. Im Dialogfeld gibst du die Sound-Id 618 :asterisk: ein. Mit „Abspielen“ kannst du dir den Klang probeweise anhören. Quittiere mit Bestätigen.

Der erste Arbeitsablauf ist nun fertig. In der obigen Tabelle war eigentlich noch ein zweiter Effekt (Questziel aufdecken) verzeichnet, diesen können wir uns aber dank der Option „Automatisch aufdecken“ im Questziel sparen. Solltest du einmal ein Questziel benötigen, das nicht sofort beim Starten der Quest sichtbar ist, wirst du es innerhalb eines Arbeitsablaufs aufdecken müssen. Die Option „Automatisch aufdecken“ muss dann deaktiviert sein.

:floppy_disk: Wir speichern einmal.

Was fehlt jetzt noch? Richtig, das Ereignis:

  1. Wechsle zur Registerkarte „Ereignisverknüpfungen“
  2. Wähle links unter Objektereignisverknüpfungen > Bei Queststart den eben erstellten Arbeitsablauf onStart aus.

:floppy_disk: Wir genehmigen uns eine Speicherung.

4.3 Zwei Questschritte

Quests sind in Schritte unterteilt. Dabei befindet sich eine aufgedeckte Quest immer in einem bestimmten Schritt. Der aktuelle Questschritt ist also ein Zustand der Quest. Man kann ihn auch abfragen.
Questschritte können außerdem zwei Markierungen haben.

  • Die Markierung Anfangsschritt sorgt dafür, dass die Quest automatisch mit diesem Schritt beginnt, sobald sie aufgedeckt wird.
  • Die Markierung Endschritt sorgt dafür, dass die Quest als abgeschlossen gilt, sobald sie diesen Schritt erreicht. Eine Quest kann auch mehrere Endschritte haben. So kann man Entscheidungsquests mit mehreren Ergebnissen modellieren.

Unsere Quest wird zwei Schritte haben: Einen Hauptschritt, der hier auch gleichzeitig Anfangsschritt ist, in dem alles Wesentliche passiert, und einen Endschritt, der das erfolgreiche Absolvieren der Quest markiert.
Wir erstellen zunächst beide Questschritte und kümmern uns dann um den Rest.

  1. In der zweiten Registerkarte „Questschritte“ siehst du bereits einen step_1_first. Er ist auch schon als Anfangsschritt markiert. Das erkennst du am grünen Text „Automatisch aufdecken“.
  2. Natürlich passt mir der Bezeichner nicht. Gib dem Questschritt mit STRG+Klick die neue Id s1_say_hello :eight_spoked_asterisk:.
  3. Füge mit der Schaltfläche „Questschritt hinzufügen“ den Endschritt hinzu. Nenne ihn s2_final :eight_spoked_asterisk:.
  4. Klicke einmal auf den zweiten Questschritt. Wir lassen den Questlogeintrag vorerst links liegen und markieren den Schritt als Endschritt.
  5. Ganz oben in der Navigationsleiste wechselst du zur Quest zurück.
    Beim zweiten Schritt siehst du nun die grüne Markierung „Endschritt“

:floppy_disk: Was fängt mit S an und hört mit peichern auf?

4.4 Die Zwischensequenz

Da die Zwischensequenz, in der Azeroth den Spieler grüßt, während des ersten Questschritts angezeigt werden soll, ist es sinnvoll, diese auch als inneres Objekt dieses Schritts anzulegen.

  1. Klicke auf „Questschritte“, dann auf s1_say_hello. Dort klickst du auf „Innere Objekte“.
  2. Klicke auf „Neues Objekt erstellen“, dann „Zwischensequenz“. dialog_hello :eight_spoked_asterisk: ist eine gute Id.
  3. Die Zwischensequenz erscheint in der Objektliste. Klicke einmal darauf. Du landest in der Dialogübersicht.

Links siehst du die Liste der Dialogschritte (momentan einer) und rechts die Einstellungen dazu. Wenn du auf „Vorschau“ klickst, siehst du, wie der Dialog aussehen wird. Momentan noch ziemlich leer. Zeit, das zu ändern:

  1. Gib rechts oben bei „Text zu diesem Schritt“ Hallo, ${trp:player:first}! ein. Das etwas kryptische ${trp:player:first} :asterisk: ist ein Platzhalter für den TRP3-Vornamen des Spielers, ein sogenanntes Variable Tag.
  2. Ein Stück weiter unten wählst du „Endpunkt“ aus. Wir benötigen nur einen einzigen Dialogschritt, also ist der erste zugleich auch der letzte.
  3. Aktiviere dann „Dialogrichtung ändern“. Eine weitere Auswahl erscheint, in der du „Rechts“ einstellst.
  4. Direkt darunter: „Name des Redenden ändern“. Azeroth begrüßt uns, also schreiben wir hier Azeroth hinein.
    Und ja, Azeroth kann sprechen :crazy_face:.
  5. Unter Dekoration > Hintergrundbild ändern kannst du ein anderes Hintergrundbild einstellen. Ich habe mir Interface\worldmap\cosmic\cosmic-azeroth-highlight :asterisk: ausgesucht.
  6. Unter „Modelle“ klickst du „Linkes Modell ändern“ und „Rechtes Modell ändern“ an. Beim linken Modell ist player voreingestellt, das kann so bleiben. player steht für deine eigene Spielfigur. (Um es ganz genau zu nehmen ist player die Spielfigur der Person, die die Kampagne durchspielt.)
    Beim rechten Modell gibst du DID44652 :asterisk: ein, das ist die Id eines „Charaktermodells“ von Azeroth.

Wenn du nun auf „Vorschau“ klickst, siehst du den Dialog in seiner geplanten Form.

:floppy_disk: Speichern, und so.

4.5 Ereignis bei Beenden des Dialogs

Wenn der Dialog beendet wird, soll die Quest als erfüllt gelten.

  1. Wechsle zur Registerkarte „Arbeitsabläufe“ und lege einen neuen Arbeitsablauf onFinish :eight_spoked_asterisk: an.
  2. Füge auf der rechten Seite das Element Effekt > Kampagne und Quest > Questziel erfüllen ein. Ein Dialog erscheint.
    Suche dort nach deiner Quest q01_say_hello (Durchsuchen).
    Bei „Ziel ID“ gibst du das Questziel, also o1_say_hello ein.
  3. Als zweiten Effekt fügst du Effekt > Kampagne und Quest > Ändere Questschritt ein. Suche hier ebenfalls mit „Durchsuchen“ nach dem Endschritt s2_final.

:floppy_disk: Speichern nicht vergessen.

Wechsle nun zu „Ereignisverknüpfungen“ und verknüpfe dort das Ereignis „Bei Beenden der Sequenz“ mit dem eben erstellten Arbeitsablauf onFinish.

:floppy_disk: Schon gespeichert?

4.6 Ereignis zur Anzeige des Dialogs

Das Beenden des Dialogs ist behandelt, aber es fehlt noch das wichtige Starten. Dazu begibst du dich in der Navigation eine Ebene nach oben zum Questschritt s1_say_hello.
Beginnen wir mit dem Arbeitsablauf:

  1. Wechsle innerhalb des Questschritts zu „Arbeitsabläufe“ und lege dort den Arbeitsablauf onSay :eight_spoked_asterisk: an.
  2. Diesen versiehst du mit einem Element Effekt > Kampagne und Quest > Starte Zwischensequenz. Auch dort kannst du wieder die „Durchsuchen“-Funktion verwenden um deinen dialog_hello zu finden.

:floppy_disk: Gib mir ein S! Gib mir ein P! …

Fehlt noch das auslösende Ereignis. Lesen wir das ganze mal Wort für Wort: Sobald der SpielerHallo Azeroth!sagt, startet die Zwischensequenz.

  • sagt (bzw. schreibt): Es handelt sich um eine Chatnachricht.
  • der Spieler: Nicht irgendjemand, sondern der Spieler soll eine Chatnachricht absetzen.
  • Hallo Azeroth!: Der Spieler soll auch nicht irgendwas schreiben, sondern einen ganz bestimmten Text.

Wenn eine Chatnachricht eintrifft, bekommt das Interface eine Information, d.h. ein Spielereignis tritt ein. Für unsere Zwecke gibt es das Ereignis CHAT_MSG_SAY :asterisk:. Dieses tritt immer ein, wenn irgendjemand irgendwas im /sagen-Chat schreibt. Wenn dein Chat z.B. folgendermaßen aussieht, …

… dann tritt das Ereignis CHAT_MSG_SAY vier Mal ein, interessant ist aber nur die zweite Zeile.

Du benötigst also ein Spielereignis, verbunden mit einem Filter, damit der Dialog nur unter einer bestimmten Bedingung angezeigt wird.

  1. Wechsle zu „Ereignisverknüpfungen“ und schau dir die rechte Seite „Spielereignisverknüpfungen“ an.
  2. Dort klickst du auf „Ereignisverknüpfung hinzufügen“. Ein Dialog erscheint.
  3. Zunächst stellst du im Dropdown-Menü (dort wo „kein Link“ steht) den Arbeitsablauf onSay ein.
  4. Um die passende Ereignis-Id zu finden kannst du den Ereigniskatalog öffnen. Uns interessiert das Ereignis CHAT_MSG_SAY in der Kategorie ChatInfo. Halte deine Maus über den Eintrag CHAT_MSG_SAY im Ereigniskatalog.
  5. Im Tooltip wird aufgelistet, welche Informationen mitgeliefert werden, wenn das Ereignis eintritt. Die ersten beiden sind in diesem Fall relevant: (1) text ist das Gesagte und (2) playerName ist der Sprechende.
  6. Wähle also CHAT_MSG_SAY aus und klicke dann im Dialog auf „Speichern“.

Jetzt erscheint das Ereignis in der rechten Liste, mit dem Hinweis, dass das Ereignis keine Bedingung hat. Das können wir nicht auf uns sitzen lassen.

  1. Klicke das Ereignis mit gedrückter STRG-Taste an. Der Bedingungseditor öffnet sich.
  2. Klicke auf die erste (und einzige) Zeile, der Testeditor erscheint.
  3. Wähle im linken Dropdown Expert > Ereignisparameter als Text mit dem Argument-Index 1 aus. :scream:
    Das mittlere Dropdown bleibt wie es ist.
    Rechts klickst du auf „Einstellen“ und gibst dann Hallo Azeroth! ein.
    Das ist unsere erste Bedingung: Das Gesagte ist gleich Hallo Azeroth!.
  4. Klicke „Bestätigen“ und dann „Test hinzufügen“. Eine UND-Zeile erscheint sowie eine zweite Bedingung. Klicke auf die zweite Bedingung.
  5. Wieder wählst du links Expert > Ereignisparameter als Text aus, diesmal aber mit dem Argument-Index 2. :scream:
    Rechts wählst du Ausgewerteter Wert > Wert einer Einheit > Einheiten-Id mit dem Typ Spieler aus.
    Die zweite Bedingung ist demnach: Die Einheit „Sprecher“ ist gleich der Einheit „Spieler“.

:floppy_disk: Jetzt noch zwei mal „Bestätigen“ und dann das allseits beliebte „Speichern“.

4.7 Letzte Schritte

Die Übersicht für den ersten Questschritt s1_say_hello ist noch ziemlich leer. Hier solltest du noch eine Beschreibung einfügen.

  • Im Questlogeintrag sollte die Beschreibung des Questschritts stehen, also die Aufgabenstellung an den Spieler, das was passieren soll. Ich fasse mich hier kurz und schreibe: Begrüße Azeroth mit den Worten „Hallo Azeroth!“ Benutze dazu den Chat. (/sagen)
  • Der Questverlauf wird sichtbar, sobald der Questschritt wechselt, hier kannst du hineinschreiben was passiert ist:
    Du hast Azeroth begrüßt und es hat freundlich zurückgegrüßt.

Selbiges wiederholen wir im zweiten Questschritt, nur dass wir uns hier diesmal den Questverlauf sparen können, denn dieser Schritt ist der letzte, aus ihm führt kein Weg mehr hinaus.
Questlogeintrag: Azeroth kennt sogar deinen Namen. Wahnsinn!

Fehlt noch etwas? Ach ja, das Quest-erfüllt-Geräusch.

  1. Lege im zweiten Schritt den Arbeitsablauf onEnter :eight_spoked_asterisk: an.
  2. Dort fügst du wieder das Element Effekt > Geräusche und Musik > Klang-Id abspielen ein, diesmal mit der Sound-Id 619 :asterisk:.

:floppy_disk: Bloß nicht das Speichern vergessen.

Jetzt verknüpfst du noch das Ereignis „Bei Betreten des Questschritts“ mit dem Arbeitsablauf onEnter.

4.8 Geschafft

Geschafft?

:floppy_disk: SPEICHEEEEEEEEEEEEEEERN!!!

Geschafft. jetzt kannst du die Kampagne einmal ausprobieren. Da du immer fleißig ge-:floppy_disk: hast liegt sie schon in deinem TRP3-Questlog bereit.

5 Anmerkungen

5.1 :asterisk: Woher kommt dieser Code?

Ich habe mich darüber ausgeschwiegen, woher ich z.B. weiß, dass ich ausgerechnet 618 eingeben muss, um an das Geräusch für eine startende Quest zu kommen. Das habe ich bewusst getan um den Beitrag kurz weniger lang zu halten. Erstmal genügt zu wissen, dass es viele solcher IDs gibt. Um sie selbst zu finden, vertröste ich dich an dieser Stelle auf einen späteren Beitrag.

5.2 :eight_spoked_asterisk: Warum dieser Bezeichner?

Das ist mein System: Englische Bezeichnungen mit vorangestelltem q##_, s#_ bzw. o#_. Arbeitsabläufe benenne ich entweder nach dem Auslöser (onStart, onFinish, …) oder nach dem, was sie tun sollen (addItem, initialize, …). Das hat mehrere Vorteile:

  • Quests und Questziele sind automatisch richtig sortiert, denn TRP:E sortiert nach Id.
  • Englische Begriffe stechen in (deutschem) Text besser hervor. Wenn ich irgendwo etwas englisches sehe, weiß ich, dass etwas nicht richtig funktioniert.
  • Wenn man mal eine Frage hat, findet man mitunter mehr Hilfe, wenn man auch nichtdeutsche Personen einbezieht. Diese finden sich dann besser zurecht, auch wenn sie die deutschen Texte nicht lesen können.

Es ist dir selbstverständlich freigestellt ein anderes System zu verwenden.

5.3 :scream: WTF? Experte? In der ersten Kampagne???

Von „Experteneffekten“ brauchst du dich nicht abschrecken lassen. Das sind Effekte/Bedingungen wie alle anderen auch. Manche davon werden sogar so häufig gebraucht, dass sie eigentlich in eine andere Kategorie gehören.
Sieh es als Herausforderung. :wink:

6 „Hallo Azeroth“ als Import-Code

Import-Code anzeigen !vA12YTTnq0Vf7Pp0oTYIKw2nwZKh0nBPP2sjgYooDYasisisebbQaa5mYDk)v6psFl)yDbb0fkBR0msIIaCb2Dp7zpGyF8y8qF4RxW54HbyKVVFd)lo1ZZ7I(F(Sg4HNcwGA1bUQXOXFeJ60cJqUXjunHXv2bVVNX0V45hQiRcZOCE(URTDlZObDWi1c4zHcIEPKgglxP0e(ecNJrD7b7njLwe1hgNxe90YIOektqNxeDnJoHZePQfCIGQPcm6D3IBJrdHiQnnv(T)9B)dS0wprL56mWxdHNQDrlkxG0eP2ClAS5Qj3rulaa3XsGilFPijKLeQO8PyerMQSphHU8bd(m8C)3aBP5dc(YzknE9h01dm7Zi0wFbtEtxZK3mccZrMX9BTfkF)DLbz5yBmP2d82F1oq0KyOlhGNyt(kRc19b4hGBzeLEdAuenXHqWCqswervgtGrtLuycoloZG3GnXZsxB7jqG(WlHUfrZzAtTrue9HCP28)XUIMZKJoUiQnvSu)eSSeITucM1b86jfr)CDfuPf)sLkez1bRpjmcppnuvcU7wE2J2wevHgwePQmYTnw861QMLfkRR7Dpq773AC4nORcrT(yza7cxuNrRTZfNyuCgnEwi9rQqh(ircrk21MvU1M(S3(wxR1JGNQcBBS5xTM8932GNVTG5lfmDOb1CMHG(MvujwVZNsAia3wUR2rhrvaOn0WoDbGUrDF)6bEfrb(n9cAgCgmpqgruoeyQAJZKLDYOxyohngHEL95Ela5i5DhGh6Tl54sMGPYoi)4llPkD4CIC2OjFUBUG(dqskXV8DNypMbceCminC5vCCA(4CKMU4hWRa1miCktq4hMiUvEP3oyHRacqfQlAtaz6yl5u)wr0p9xA5IM2kFZPmPs)3hbvbOcC7GR6Bk8JmQi9EN56T3z2RUnAC(zbwLLnAPTVc4gcnvoLet)0xZL8K5KfFkoxnNf7(RgXADTmwAgh(zc67EgVB9jcWDBY9dj1TwKBTTL53gzOzuHaeIu5PeP7ScqJzizovaImFGKjumH4Os5YkNg0ZKnhKn9)50Gl(ULT1N)T7PdwFR3Q(7Adlx4O2Lb4ENeysA7rJptMf8rRYCZ5zlscfw485xU700P9773q7FrZt9A65bld078pPbKu37E1Gk9Ubb19AupWhwYBa7B679I976sE24NrH3jT3(obK4mgS45gTTs2LvMdMLNiPc1xP0zabf4bGBRbE2eNMxx4gtfVicCivsb6nC)FqMVGKAA(hCdgDfrk)tqkO1egNPxvdozEcNQSKQQqzjLKgVuc2DneaCJykiS2WchAm()o
2 Likes
▲ Zurück nach oben
Eine Karte

Bei diesen Beispiel ein besonderer Dank an Hathel(@DieAldorEU) vom Bund des Lichts. Die Idee für dieses Item basiert auf einer Rollenspielgegebenheit im Rollenspiel mit seinem Bund.

Die Grundidee hinter der Karte in TRP3E basiert darauf, dass man in Form eines interaktiven Items über eine Karte verfügen möchte, die man an andere Charaktere weiter reichen möchte. Hierbei gibt es zwei grundlegende Vorgehens weisen. Zum einen ein schlichtes Dokumenten-Item, welches eine hohe Sicherheitstufe besitzt, jedoch Grenzen aufzeigt in ihrer Ausgestaltung. Alternativ ist eine Variante mit einem Makro und zwei simpler Skripte möglich, die es dem Item gestattet, die Ingame-Karte von World of Warcraft zu verwenden. Jedoch zu dem Preis, dass dieses Item gemäß Sicherheitsstufe als niedrig eingestuft wird.

Sollte jemand Schwierigkeiten haben, so kann sie oder er das Item welches wir nun bauen auch als Import-Code weiter unten finden.

Aber der Reihe nach.

Je nachdem für welche Variante du dich interessierst, wähle nun einen der beiden Themen:


Dokument-Item

Erstelle erstellen wir ein neues Dokumenten-Item, indem wir in der Datenbank Gegenstand erstellen → Dokumentengegenstand auswählen. Anschließend können wir die die Anzeigeinstellungen und Gegenstandseigenschaften so ausfüllen, dass einem Verwender deutlich wird: Er hält gerade eine Karte in der Hand. Dies könnte zum Beispiel folgendermaßen aussehen:

Nun speichern nicht vergessen.

Nun wechseln wir in den Reiter Innere Objekte. Klicken dort auf das Dokument in der Liste, so dass sich ein Texteditor öffnet. Im Editor klicken wir auf den Button Bild und suchen im Filter nach den Dateien TAXIMAP um eine für uns geeignete Karte auszuwählen. Zum Beispiel die Karte der Östlichen Königreiche.

Das Bild ausgewählt, sollte nun im Seiteneditor folgende Zeile zu finden sein: {img:Interface\TAXIFRAME\TAXIMAP0:512:512}

Was bedeutet diese? Recht simpel. Wir haben ein bereits im Addon TRP3E vorhandenes Bild einer Karte eingefügt mit den Abmessungen von 512*512 Pixeln. Damit dieses Bild aber nicht beim anzeigen des Dokumentes abgeschnitten ist, müssen wir das Bild entweder auf die Größe des Dokumentes anpassen indem wir die Zahlen in der oberen Zeile verringern. Oder aber, indem wir das Dokument selbst vergrößern.

Da wir den Rahmen des Dokumentes berücksichtigen müssen, der ungefähr ~80 Pixel beträgt, tragen wir also in der linken Seite unter Seitenhöhe und Seitenbreite 590 jeweils ein. Ein Klick auf die Vorschau sollte nun etwas was hier nach aussieht anzeigen:

Nun speichern nicht vergessen.

Und das war es auch schon. Wir haben nun eine funktionsfähige Karte der Östlichen Königreiche, die wir über die Datenbank in unsere Tasche legen können. Wer bis hier hin Schwierigkeiten gehabt haben sollte, weiter unten findet man den Importcode für das Item mit dem man es direkt im eigenen Client nachvollziehen kann wie das Item funktioniert.

Lust auf mehr? Nun folgt die geskriptete Variante.


Skript-Item

Für das geskriptete Item, fangen wir zunächst ähnlich wie zuvor an. Doch anstelle eines Dokumentengegenstand erstellen wir nun einen Experten-Gegenstand. Doch keine Sorge, es wird nun nicht so schwer, wie der Name des Items vermuten lassen könnte. Zunächst müssen wir ohnehin wie zuvor das Item so gestalten, dass es wie eine Karte aussieht.

Nun speichern nicht vergessen.

Nun gehen wir in den Reiter Arbeitsabläufe und legen zunächst einen Arbeitslauf links mit dem Button Arbeitsablauf erstellen. Anschließend mit dem Button Element in den Arbeitsablauf einfügen rechts einen Makroeffekt einfügen.

Effekt → Experte → Makro ausführen

Wichtig: Nicht vergessen diesen Arbeitsablauf unter Ereignisverknüpfung bei ‚Bei Benutzung‘ einzutragen, damit er auch bei einem Rechtsklick auf das Item ausgeführt wird.

Nun speichern nicht vergessen.

Ein Klick auf dieses Element öffnet eine Textbox, recht ähnlich wie wenn ihr ein Makro im Client selbst anlegt. Dort kopieren wir nun folgende Zeilen hinein:

/run ToggleFrame(WorldMapFrame);
WorldMapFrame:SetMapID(13);

Soweit so leicht. Aber was bedeuten diese Zeilen eigentlich? Bei diesen Zeilen handelt es sich um schlichte Lua-Skripte, die man auch direkt im Warcraft-Chat ausführen kann, sofern man die Ausführung von Skripten erlaubt hat im Client.

/run ToggleFrame(WorldMapFrame); ist ein Toggle-Befehl, der die Ingamekarte öffnet wenn sie geschlossen ist oder sie schließt wenn sie offen ist.

WorldMapFrame:SetMapID(13); teil der Karte mit, dass sie die Region mit der ID 13 anzeigen soll.

Die Karte der Östlichen Königreiche wird im Client mit der ID 13 referenziert. Wenn man andere Regionen anzeigen möchte, muss man somit nur die ID der Karte herausfinden und man kann sie wie eine jede Karte im Spiel anzeigen lassen. So simpel ist es. Um heraus zu finden welche ID welche Karte hat hilft diese Liste:

Nun speichern nicht vergessen.

Wer bis hier hin Schwierigkeiten gehabt haben sollte, weiter unten findet man den Importcode für das Item mit dem man es direkt im eigenen Client nachvollziehen kann wie das Item funktioniert.


Noch ein paar Worte zu Sicherheitsstufen

Wie bereits zu Beginn angedeutet, werden alle Items in Sicherheitsstufen eingeordnet. Wobei ‚Hoch‘ die unbedenklichste ist und ‚Niedrig‘ die potentiell bedenklichste.

Aber was genau bedeutet dies eigentlich? Gemeinhin sei gesagt, dass Items mit einer niedrigen Einstufung weder Schaden am Spieler-PC, dem Client, dem Charakter oder seiner Gilde anrichten können. Darauf hat das Addon TRP3 schlichtweg keinen Einfluss. Wohl aber können manche Arbeitsschritte mit ‚bösartigen‘ Absichten formuliert werden.

Makros können nämlich auch Effekte besitzen, die einem Spieler in eine Unvorteilhafte Situation versetzen könnten. Zum Beispiel indem sie Mitteilungen in den Chat schreiben, deren Ursprung andere Personen nicht als ein Ergebnis eines Makros erkennen können sondern annehmen müssen, dass der Verfasser der Spieler hinter dem Charakter war. Ebenso können Makros die Fähigkeiten eines Charakter auslösen oder wie wir vorhin gesehen haben, bestimmte Fender im Spiel steuern.

Daher ist stets zu empfehlen, sollte ein Item aus nicht vertrauenswürdiger Quelle eine Einstufung als Mittel oder Niedrig besitzen, ind er Datenbank nachzusehen was genau dieses Item eigentlich macht oder im Zweifel es nicht benutzen.


An dieser Stelle sei bedankt, wer mir bis hier hin gefolgt ist. Und ich hoffe, dieser kleine Guide konnte dem ein oder anderen von Nutzen sein.

Wer nun Probleme oder Fragen hat darf gerne sich an uns in der Schreibstube wenden. Oder sie oder er möge in das Beispielitem hinein schauen. Wie dieser Code zu verwenden ist kann man hier nachlesen.

Beispiel-Item-Code Simple Karte (klicken zum erweitern ...)

!Trv4YPnoq4xOluBkCb4Fogi4cyiiG0BMoYwGfgnXwIrsU9AUP(XO)TVf9x5F8ID7kdzYL5gWYY7UA3p9TFsuF6AASp83RDpACBkXRJxp45w)(3pExNqA8hHiirX4yj7uIIBSfI9h5jAo(cTV(VOKHlOKzrWxwk5UfyojtcA(CYiAC3(EG9107OesyJ5Lbn1gtWNPK)ruMpisA56dS98VSo4ZrJxfmFKB28GLEd663gF(bSySiHtPX9G3yAiXbaeupvvYLoVt(yYyk5EwjFSsAJv6swXmMoNtjJxr3rjpgDbut8XihcBlH87yWtQWOM0gn)qfyhnM0yD51SUwPkSItt4SmUMsMpebXCGdIx4GN9kWgoIsgjK860zmz2tmTfMcRPo98pVWKY60PN)TuK3WOTQ)uDA9NgIXSrBoPp)Im3fyD6wKDmg01rMTo1aMRtZ1QZ)c8o)8lyqzSsb4lNxY2FeMCszbwrWlkaN3ZpWoQ5YD8MQ9h1PRuvweevYS60foa(vf8TRzWHQvNY2z4cR5cYxEa211PCH85kRMLZLTaQHant)(GekkKsGkl4FLJTJKNvsEcNzGSjFsiZZuLMepqGmd4MPiJqjHlWMc2fN2qr38gc6)YpGcAng8dbovgiJW2PBClyQJNh0vdxHsTvrusWoZ(JAXblcEyhqEslozvArvPbApiQB71Ns2qWv8WimpK7WXnX4yORypcA42qITx0Ve1jUmboqGZb8aJoLm)vnTiJsYu7DkYeZr13asrNBA8)(Jz1P)VNTUOKG)fcJLE9hjJBzIctZ5i3PoYInVbt2RkYzlWGHnbEU7OiJDZqbpOitbA2T04BbpdbW07dED(qB)6uVod8UDGpqhzBHDuRoqX36UD4pBK3JGtQK3VeF)bD66yT3xeRRZIWlczX5psJHMZWnUxarsGcqGMu3)gNScMGlbVpjATRLSUjmLCJb2gbHVQpyvhG(Abk(WLy47R0c73NbIUc8sRR3(ybfHBN0QnmN(V

Beispiel-Item-Code geskriptete Karte (klicken zum erweitern ...)

!TnvZYPnmq4xNKzAi2yYpqo5y72scysy5N2Eqybwy0GrMrsK0Md(XOx7BrpLB8I1DfPzs60XEK3)3pVFRy(SrSuF81R5LS0MmWlWZ3piOzRlKRI)MhlnaJa6MINwgCDiPfNWGePsuN1JRYxZ1wumxORZ2)tJTuUyLqvND7(FRKfAbP2O(M6S6BIPygRnB17Fwv4cSoBIqVKBmKRvCBDMbnxNvOR2)l0B)9ptbLZ3irFfIn8fRqHTvwHYkfLLOZpjwYxPfQ5IdD7d1zdR2zjqStLxNnWbWhQq9Uklge2T6m(CJqAnVG87wYZrJcP6PDwnVqOAWG7aCY43ghlDJya2zP4bXgSXZEQsjMj4gSAQ1svrE1gZmpFg0dNn3stegenGnNbPHVyOo7K3mGE)8HbWik47dj2aUlKuM6oNGMA555H1Bi7AgmSldcNBwSslxAjWJ)bWATCRTsl3TXG0dH6METzWyGY4(eQoW1054u6mY1SPjiJJfg5viI41hR0Rxww94SQTc1Sn8TKrey4jTNaIdllOKmNbgXIDAbg2cDfoC0fMdUHt17Wj9OQIIsXh18nIJMwPlZ7Z360o(Q6S3zOdiSOC34J8do(keo0dGVLsJL93hixy5YsJdtjrZgMecdsN1pmA4GxA8)U76sRxxkJbJ)F)EO7(XK7OymB)t9coTPFDMFqNGMDADHBObjkHXs7mNelfHL5vAKuW7fxIPHUHvYC(BC1BabvSW43KVGYtWPxJw4p0e31SZXuOUD(RDRvh)2DoRnHMOboW2LON(tzPiRhp29bzialcGS)zFNegIcukJ(kUDoYX1JoewLASbbqy0RlE8DlXfMsARMsXXCs7p6HBZLUj3NdD3VT4QMdTnAIYS)a

▲ Zurück nach oben
2 Likes

Vielen lieben Dank für das Tutorial.

Ich habe einiges dort herausnehmen können, leider aber auch vieles nicht. Gibt es extern irgendwelche deutschsprachigen Tutorials die mich unterstützen könnten etwas komplexere Kampagnen zu machen?

Das Beispiel „Hallo Azeroth“ war super hilfreich aber es behandelte leider nicht alle Themen um die Kampagnen/Quests herum.

Vielen lieben Dank für die Antworten :slight_smile:

1 Like

Freut mich zu hören, dass Seleves Guide dir bisher gute Diente leisten konnte.

Leider sind mir keine anderen deutschspachigen Guides bekannt, die auch nur Ansatzweise so sehr in die Tiefe gehen wie die ihren.

Englisch sähe dort natürlich besser aus. Auf dem GitHub der Entwickler wurden einige Video-Tutorials zusammen getragen, denen man womöglich auch noch so manchen Kniff entnehmen könnte, selbst wenn man in der Sprache sich nicht so sattelfest wähnt.

Wenn du konkrete Fragen hast, könntest du natürlich auch versuchen mit Seleves@Thrall in Kontakt zu treten. Erfahrungsgemäß sind individuelle Fragen zu TRP3 recht mühseelig hier im Forum zu beantworten.

Sollte das nicht zum Erfolg führen und die einige konkrete Fragen besitzt, wäre das womöglich der ideale Aufhänger für einen TRP3E FAQ/Troubleshootin Thread. :slightly_smiling_face:

Ich hoffe das mag dir erst einmal weiterhelfen können.

Extended am Sonntag #1


Sounds und wie man sie findet

Extended wird gern verwendet, um Geräusche oder Musik abzuspielen. Aber welchen Effekt sollte man verwenden? Und wo findet man diese ominösen "Sound Ids"?

Soundeffekte

Zunächst stehen zwei verschiedene Effekte zur Verfügung: "Sound-Id abspielen" und "Musik abspielen".

Musik abspielen

Mit Effekt > Geräusche und Musik > Musik abspielen ersetzt du die Hintergrundmusik durch ein von dir gewähltes Musikstück. "Musik anhalten" sorgt dafür, dass wieder die Standardmusik des Gebiets abgespielt wird, in dem du dich befindest.

Sound-Id abspielen

Effekt > Geräusche und Musik > Sound-Id abspielen ist für jedes Geräusch gedacht, das keine Musik ist, also z.B. Kampfgeräusche, gesprochener Text (Voice Over), Emotes usw. Im Gegensatz zu Musik können auch mehrere Sounds gleichzeitig abgespielt werden.

Bei diesem Effekt kannst du dir ebenfalls aussuchen, ob der Sound im SFX- oder im Umgebungskanal abgespielt werden soll. Der SFX-Kanal ist üblicherweise etwas lauter eingestellt (Regler „Sound“ in den Spielsoundeinstellungen) als der Umgebungskanal (Regler „Umgebung“).

Umgebungs-Sounds

Neben den beiden obigen Effekten gibt es "Umgebungs-Sound abspielen" und "Umgebungs-Musik abspielen". Diese sorgen dafür, dass auch andere Spieler in der Nähe deine Sounds oder Musik hören können. Ansonsten funktionieren sie analog. Das ganze geht natürlich nur, wenn die anderen Spieler ebenfalls Extended benutzen und wenn sie die Sounds anderer Spieler in ihren Extended-Einstellungen zulassen.

Sound Ids

Wenn du Musik abspielen möchtest, stellt dir Extended einen Musikbrowser zur Verfügung, mit dessen Hilfe du Musikstücke anhand ihres englischen Namens finden kannst. (Klicke auf "Durchsuchen" in den Musikeffekteinstellungen)

Für jeden anderen Sound benötigst du eine Sound Id.

Sound Ids finden

Wowhead bietet eine Soundsuche an.

Beispiel
Ich möchte das Geräusch verwenden, das bei der Jägerfähigkeit „Begleiter rufen“ zu hören ist (ein lautes Pfeifen).

  1. Öffne die Sound-Suche von Wowhead: https://www.wowhead.com/sounds/.
  2. Im Suchfeld gibst du den (englischen!) Namen der Fähigkeit ein: call pet.
  3. Es sollten vier Suchergebnisse erscheinen, zwei davon heißen PetCall. Du kannst sie dir dort probeweise anhören.
  4. Sollte ein passendes Ergebnis dabei sein, enthält dessen URL die gesuchte Id, in diesem Fall https://www.wowhead.com/sound=3980/petcall. Die gesuchte Id ist also 3980.
  5. Probiere es aus: /run PlaySound(3980)

Alternativ kannst du auch bei der Fähigkeit selbst dein Glück versuchen:

  1. Suche bei Wowhead nach begleiter rufen. Du wirst mehrere Treffer haben.
  2. Bei einigen Suchergebnissen ist die Sound-Id (bzw. Klang-Id) unten unter „Weiteres“ gelistet.

Diese Suchstrategien führen leider nicht immer zum Ziel. Allgemein empfehle ich:

  • Versuche herauszufinden, wann der Sound abgespielt wird. Ist er an einen Zauber gebunden? Ein Spielzeug? Einen NSC? …
  • Suche auf englisch. Die Dateinamen haben meistens etwas mit dem Inhalt zu tun, aber diese sind eben englisch.

Sounddatei-Id

Sound-Ids wie oben beschrieben, stehen nicht für eine bestimmte Datei, sondern für eine Gruppe von Dateien. Bspw. hat jedes Volk unterschiedliche Witze auf Lager (/witz), aber die Witze sind nach Volk und Geschlecht zu einer einzigen Sound-Id zusammengefasst.

/run PlaySound(9695)
wird dir unterschiedliche weibliche Draenei-Witze liefern.
Wenn du also an einem ganz bestimmten Draeneiwitz interessiert bist (z.B. „Wie genau rast man in einen Planeten…?“), musst du die Sounddatei-Id verwenden.

  1. Suche nach deinem Sound wie oben. Suchbegriff: draenei silly
  2. Die Ergebnisseite zeigt 7 unterschiedliche Witze. https://www.wowhead.com/sound=9695/draeneifemalevocalsilly
  3. Der siebte Sound DraeneiFemalePissed13 ist der gesuchte Witz.
    Aus unerfindlichen Gründen haben die Entwickler sich für den Namen DraeneiFemalePissed## anstatt DraeneiFemaleSilly## entschieden. :man_shrugging:
  4. Halte deine Maus über das Download-Symbol neben dem Soundeffekt. Der Download-Link wird dich zur URL https://wow.zamimg.com/sound-ids/live/enus/58/539706/DraeneiFemalePissed13.ogg führen.
  5. Auch in diesem Fall ist die Sounddatei-Id Teil der URL: 539706. Es ist die zweite, meist sechsstellige Zahl.

Probiere es aus:
/run PlaySoundFile(539706)

Die Sounddatei-Id ist also immer dann nützlich, wenn es exakt ein bestimmter Sound bzw. Voiceover sein muss. Falls du die Sounddatei-Id verwendest, muss in den Effekteinstellungen das entsprechende Feld „Sounddatei-Id“ ausgewählt sein.


Viel Spaß beim Experimentieren und
:wave: bis zum nächsten Sonntag…

4 Likes

Leider kann ich dir nur ein Herz pro Beitrag geben, sei dir aber um weit mehr bewusst wenn ich könnte!


Ich habe den ersten Beitrag (Die Liste) in diesem Thread zu einem Wiki-Beitrag umgewandelt. Wiki-Beiträge kann ein jeder Forenbenutzer bearbeiten.

Sollte also jemand nicht warten wollen und es sich zutrauen, so kann man nun selbständig den eigenen How-To in der Eingangsliste eintragen!


▲ Zurück nach oben
1 Like

Das mit dem Wiki-Beitrag werde ich gleich mal ausprobieren, aber jetzt heißt es erstmal…

Extended am Sonntag #2


Variablen

Wer sich beim Wort „Variable“ mit Schrecken an seine Mathestunden erinnert, muss sich keine Sorgen machen. Variablen in Extended sind viel schrecklicher, ähm, ich meine, sie erfüllen einen ganz anderen Zweck.

Eine Schublade für jede Information

Immer, wenn sich Extended etwas für einen bestimmten Zeitraum merken soll, wird eine Variable benötigt, zum Beispiel:
  • Text, den der Spieler eingibt
  • Anzahl der bereits besiegten Monster in einer „Killquest“
  • eine Entscheidung, die der Spieler in einer Zwischensequenz trifft

Jenachdem, wie lange die Information benötigt wird, bietet Extended unterschiedliche Speicherorte, oder Quellen an.
Außerdem gibt es verschiedene Operationen, mit denen man den gespeicherten Wert verändern kann.

Wo Variablen gespeichert werden

Arbeitsablauf-Variablen

Diese sind nur so lange gültig, bis der Arbeitsblauf, in dem sie erschaffen werden, beendet wurde. Beispielsweise verwendet die Wurfmünze eine solche Variable. Da sie nur benötigt wird, um einen Münzwurf zu simulieren, ist sie im Arbeitsablauf genau richtig.
Wenn man die Münze ein weiteres Mal wirft, wird die Variable neu berechnet, unabhängig vom vorherigen Wert.

Objekt-Variablen

Wählt man als Quelle Objekt aus, wird der Wert in dem Item gespeichert, das den Arbeitsablauf auslöst.

Vorsicht: Damit das funktioniert, muss Extended einen Bezug zu einem Item herstellen können. Wenn der Arbeitsablauf zu einem Item gehört, ist das möglich, bei einem Questschritt bspw. aber nicht.

Solche Variablen sind persistent, sie bleiben auch bestehen, wenn man sich ausloggt oder das Profil wechselt. Sie werden erst gelöscht, wenn das Item, in dem sie gespeichert sind, zerstört wird.

Außerdem werden diese Variablen für jedes Item individuell gespeichert. Solltest du mehrere Kopien eines solchen Items in deinem Inventar haben, können sich die Werte von Item zu Item unterscheiden.

Kampagnen-Variablen

Ähnlich wie Objektvariablen sind diese individuell und persistent für jede einzelne Kampagne. Sie werden erst dann gelöscht, wenn die Kampagne zurückgesetzt bzw. neu gestartet wird.

Damit eine Variable in der aktiven Kampagne gespeichert werden kann, muss natürlich eine Kampagne aktiv sein.

Beachte, dass man lediglich einstellen kann, dass eine Variable in der momentan aktiven Kampagne gespeichert werden soll, man kann sich aber nicht auf eine bestimmte Kampagne festlegen. Du solltest daher die Quelle „Aktive Kampagne“ nur dann verwenden, wenn sich der Arbeitsablauf innerhalb einer Kampagne oder innerhalb von dessen inneren Objekten befindet.

Wie man Variablen verändern kann

Könnte man Variablen nicht verändern, dann wären sie nicht sehr variabel…

Der Effekt Experte > Variablenoparation bietet neben den vier Grundrechenarten auch Initialisierung und Wertzuweisung an. Über Wertzuweisung kannst du deiner Variablen einen neuen Wert geben, der alte geht dabei verloren. Initialisierung weist der Variablen nur dann einen Wert zu, wenn diese noch nicht existiert, d.h. eine Wertzuweisung ohne Überschreiben.

Mit Experte > Dynamischer Wert kannst du deiner Variablen einen Wert aus einer Vielzahl von Zuständen innerhalb der Spielumgebung zuweisen, z.B.

  • Name des Gebiets, in dem sich der Charakter befindet
  • Charakter-Level
  • zufälliger Wert

Wie man Variablen benennt

Wie in der Beschriftung eines Formulars sollte der Variablenname Aufschluss über den Inhalt geben, gleichzeitig einprägsam und eindeutig sein. Vermeide Sonderzeichen im Variablennamen.

Beispielsweise sind gute Bezeichner für die Anzahl besiegter Gegner innerhalb einer Quest mobsSlain, monsterKillCounter oder numMobsKilled. Weniger treffend sind x, mobs oder count.

Wie man Variablen benutzt

Was nützen die vielen Variablen, wenn man nicht darauf zugreifen kann? Es gibt zwei wesentliche Methoden, um an den Wert einer Variablen zu kommen.

Variablen in Bedingungen

Innerhalb einer Bedingung kann man mit Expert > Variablenwert (Text/Numerisch) den momentanen Wert mit einem anderen vergleichen.

Variablen in Tags

Wird der Variablenwert direkt benötigt, helfen Variable Tags. Das ist ein Thema für einen anderen Sonntag. Hier sei nur kurz erwähnt, dass man ${var} als Platzhalter für den Wert der Variable var verwenden kann.

Beispiel 1: Wurfmünze mit Gedächtnis

Ich möchte die oben erwähnte Wurfmünze etwas aufmotzen. Der Tooltip soll mir anzeigen, wie oft Kopf bzw. Zahl geworfen wurden.

  1. erstelle ein neues Item
    1. linker Tooltip-Text: Kopf: ${headsCount::0} mal
      Mit ${headsCount::0} weisen wir Extended an, diese Passage durch den Wert der Variable headsCount zu ersetzen.
      ::0 sorgt dafür, dass 0 angezeigt wird, falls die Variable (noch) nicht existieren sollte.
    2. rechter Tooltip-Text: analog Zahl: ${tailsCount::0} mal
  2. Stelle das Item als benutzbar ein.
  3. Wechsle ins Tab Arbeitsabläufe, dort stellst du 7 Schritte ein:
    1. Variablenoperation Initialisierung headsCount auf 0.
      Als Quelle geben wir Objekt an.
      Damit setzen wir vor dem ersten Wurf die Anzahl der Kopf-Würfe auf 0.
    2. analog: Variablenoperation Initialisierung tailsCount auf 0.
    3. Dynamischer Wert coinToss als zufällige Zahl zwischen 1 und 2. Die Quelle Arbeitsablauf genügt.
    4. Textausgabe "Kopf", mit Bedingung: coinToss = 1
      Klicke mit gedrückter STRG-Taste auf den Effekt, um die Bedingung einzustellen.
    5. analog "Zahl", falls coinToss = 2
    6. Variablenoperation Addition: headsCount um 1 erhöhen.
      Hier muss dieselbe Beedingung wie in Schritt 4 eingefügt werden. Beachte, dass die Variablenquelle im Effekt Objekt ist, während in der Effektbedingung Arbeitsablauf stehen sollte.
    7. analog zu Schritt 6 für tailsCount
Import-Code: Wurfmünze mit Gedächtnis !9svBpknqq4FlM43mEx3Tuj0e(q5LyicLtMcepJduAxKQL2lTf4uJ8RXFg(T7pMZSTr0k3zIjEbyA3z3zEEMzyFqb6HUc6RHPb6krqinSmmKsRwMoxVkaDnPtadCjBbcDC4vxbuaIwceMcyheg2hHxLEZA7JlpU8PFzJYpmVB6UKcBBJVEC5w)ye6ogxHGRdcZ3LTE7DFp5ZkAROIJlFPk8UVfSPijkhbWJp3RD0Kb6WlM6Y2zKldkpt4fZ7Rx0JjIuysb0x72HTxPTd6IquY(fBJYdweKgLSq0IcxN(jdq4A)nXveUWpkUoHPIf6YfBAY0Cf)cXmYYnmqv21O3IcryVF2I0vFqfqX4N9(8YnHuDj822VJ7HWPMc62abdca(dqFJJYjBccs2H59aWnQm)KWFdbUQ8sZZ1aDqddFM0TmevZvEpxzfA1WRb7q(pwqNAA3FbzYoS(taku3wW0NQNk3v7vIDWgvWhxqX7xH8bnY)SCzCyhTBx93Z9NkXFLW8i(j6gG55y3lyhnEuyN4mSJVX8aSZID08Hho)37GLJ8NDUbUOoPl4o6JhDf)f6w7cN4C94MNUxKRc2Lfv8PHQ9QyDciTnpTiqLea4qVEqLTMKScJiXRrArmoysCJo64bS2cmHNDaqsmw32Omb0JEt1kwJMZpOqcv6(zPS6OEC8dhZUPSrsQGkMis(Z92K5htYNZq3M0UZOc5Igxq5RBp6oN1Lc5LsXXLgg2sPTfjWvmRsmhgrPZL(b1pPPW2SLwCTomev8EdjDYKs300yvG4p(

Beispiel 2: Anpassbare Taschen

Zur Organisation des Extended-Inventars möchte ich eine Tasche erstellen, der ich eine Kategorie zuweisen kann, z.B. Briefe, Kampagnen-Items, Erfindungen,…

  1. erstelle einen Behälter-Gegenstand
  2. Lege ${category::(keine)} als Tooltip-Text fest, links oder rechts je nach Präferenz
  3. Setze die Tasche auf benutzbar
  4. füge im Tab "Arbeitsabläufe" einen Effekt hinzu
    1. Effekt: Experte > Eingabeaufforderung
    2. Text: neue Kategorie eingeben
    3. Variablenname: category
    4. Variablenquelle: Objekt
  5. Fertig ist die anpassbare Tasche.
    Mit der rechten Maustaste kannst du die Kategorie festlegen.
    Mit Doppelklick öffnest du die Tasche wie gewohnt.
Import-Code: Anpassbare Tasche !LfvBpQjqq4)m9JT3Tahnxjnnbr)G501RoOM(LbqyJUremSRMABo(10)j9p2nZYzAtB2ndZ(W8YZ8mOhMIsp6kceO0hbpFrONFGqiEUvyBqzafbmvswlcJI5xpducEpgq4jiOBUKDuBkZ2wSll4JimBccpvyv7A70keswGBrqgJqAHPCpHaPmYxJr5duXI5hBC21eKGYyj)y5ueE3plhk01OOpFqPBuF5fegZ93xqrUcWru9gXXVs6Q6e2MKY4BMWLJOnKW0UTzLrXou)jlp6GAy(jpDfcxk6Yo11E8eLtr3oZWp)ZW0NtuyNARQXPv34glsqRBAqzi7ADhGU1AJfVDGkLTqxBgeZ5J5(oBbdtuMhevT6IY8H09Df11KEGsspHXiicV3Z)EFV(Cp)OGpffsDm5)WfrSOyx)2(eQwtJ5DpChrS5uBKlCA1)2gRBhruzXuw7MVXTegVY9HKoGshOLr43zNLKdNs63O1FQBfKoe2G(cXKBNQCV1COwxEq18((8Zh7Z)lv8hN7Z)9VAQuDnCPmQYZDA71zeRQzX060YbMBr81

Viel Spaß beim Experimentieren und
:wave: bis zum nächsten Sonntag…

2 Likes

Extended am Sonntag #3


Variablen-Tags

Im vorherigen Beitrag ging es darum, wie und wo man Variablen erstellt, und diesmal soll es um eine flexible Methode gehen, diese einzusetzen: Variablen-Tags.

Hier könnte Ihre Variable stehen

Tags sind Platzhalter, die in einem Text oder anderswo eingebaut werden. Sie signalisieren Extended, dass anstelle des Tags der Wert, der mit dem Tag verbunden ist, verwendet werden soll.
Tags werden mit Hilfe der Sequenz ${...} ausgezeichnet. Innerhalb der geschweiften Klammern steht die Referenz.

Beispiel: Aus ${wow:player} ist ${wow:player:class}. wird in meinem Fall Seleves ist Jägerin.

Wo man Tags einsetzen kann

Viele Eingabefelder in Extended unterstützen Tags, aber nicht alle. Dort, wo sie nicht unterstützt werden, bleibt das Tag einfach wie eingegeben stehen.

Die folgende Liste habe ich vom GitHub der Entwickler übernommen (https://github.com/Total-RP/Total-RP-3-Extended/wiki/Variable-tags):

Liste dynamischer Felder
Kategorie Feld
Items
  • linker und rechter Tooltip
  • Tooltip-Beschreibung
  • Text bei Benutzung
Dokumente
  • Seiteninhalt
Zwischensequenzen
  • Dialogtext
  • Sprecher
  • Antwortoptionen
Kampagnen
  • Kampagnenbeschreibung
  • Questzieltext
  • Questbeschreibung und Questlogtexte
Effekt Verzögerung
  • Verzögerungstext / Zauberbalken-Beschriftung
Effekt: Textanzeige
  • Anzeigetext
Effekte: Sprechen und Emotes
  • Gesprochener Text
Effekt: Item hinzufügen/zerstören
  • Anzahl
Effekt: Behälter reparieren/beschädigen
  • Haltbarkeitspunkte
Effekt: Abklingzeit starten
  • Dauer
Effekt: Kamera-Zoom
  • Zoom
Effekt: Makro ausführen
  • Makrotext
Effekt: Variablenoperation
  • Wert (!!!)
    Besonders nützlich, da man hierdurch Variablen addieren kann oder Texte aneinanderknüpfen.
Effekt: Signal senden
  • Signalwert
Zufälliger Wert
  • Ober- und Untergrenze

Worauf man mit Tags zugreifen kann

Wenig überraschend dürfte sein, dass man auf den Wert von Variablen zugreifen kann, doch auch Item Ids werden durch den farblich markierten Namen des Items ersetzt (z.B. blau bei seltenen Gegenständen).
Außerdem gibt es verschiedene vorgefertigte Tokens, für die man keine eigene Variable erstellen muss (bspw. Charaktername).

Tag Beispiel Ergebnis
Token

${wow:player}

Seleves

Variable

${decision_direction}

north
(sofern es eine Variable mit diesem Namen und diesem Wert gibt)

Item

${0924220631wG6dn item_letter}

[Brief]

Die eingebaute Vorfahrt

Was passiert, wenn die Variable var als Objektvariable erstellt wurde und im „Benutzen“-Arbeitsablauf nochmals mit selbem Namen als Arbeitsablauf-Variable? Wie wird ${var} ausgewertet?
Extended hat für solche Fälle eine festgelegte Reihenfolge. Sobald ein Treffer ausgemacht wurde, wird dessen Wert verwendet.

  1. Tokens
  2. Arbeitsablauf-Variablen
  3. Objektvariablen
  4. Kampagnen-Variablen
  5. Item Ids

Die Antwort auf die obige Frage lautet also: Es wird der Wert der Arbeitsablauf-Variablen verwendet, man sagt auch, sie überdeckt die Objektvariable.
An dieser Stelle sei daran erinnert, dass man möglichst eindeutige Variablennamen verwenden sollte, um solche Effekte zu vermeiden.

Tokens

Wie oben erwähnt, bietet Extended verschiedene Tokens für häufig verwendete Werte, wie dem Spielernamen, der Klasse, usw.

Eine vollständige Liste ist ebenfalls dem GitHub der Entwickler zu entnehmen:

Liste vorgefertigter Tags

Token Wert Bemerkung

${wow:player}

Spielername

${wow:target}

Name des Ziels (d.h. der anvisierten Einheit)

${wow:player:id}

Spieler-Id z.B. Seleves-Thrall

${wow:target:id}

Ziel-Id

${wow:player:race}

Volk des Spielers lokalisiert1

${wow:target:race}

Volk des Ziels lokalisiert1

${wow:player:class}

Klasse des Spielers lokalisiert1

${wow:target:class}

Klasse des Ziels lokalisiert1

${trp:player:full}

Voller Name aus dem TRP3-Profil weicht auf wow: aus2

${trp:player:first}

Vorname aus dem TRP3-Profil weicht auf wow: aus2

${trp:player:last}

Nachname aus dem TRP3-Profil weicht auf wow: aus2

${trp:target:full}

Voller Name aus dem TRP3-Profil des Ziels weicht auf wow: aus2

${trp:target:first}

Vorname aus dem TRP3-Profil des Ziels weicht auf wow: aus2

${trp:target:last}

Nachname aus dem TRP3-Profil des Ziels weicht auf wow: aus2

${trp:player:race}

Volksname aus dem TRP3-Profil weicht auf wow: aus2

${trp:target:race}

Volksname aus dem TRP3-Profil des Ziels weicht auf wow: aus2

${trp:player:class}

Klasse aus dem TRP3-Profil weicht auf wow: aus2

${trp:target:class}

Klasse aus dem TRP3-Profil des Ziels weicht auf wow: aus2

${gender:player:M:W}

männliche/weibliche Variante, abhängig vom Geschlecht des Spielers Damit kann man recht leicht grammatikalisch korrekte Sätze bauen, z.B.
${trp:player:first} zieht ${gender:player:seine:ihre} Waffe.

${gender:target:M:W}

männliche/weibliche Variante, abhängig vom Geschlecht des Ziels

${event.1}${event.n}

n-tes Ereignis-Argument nur in Arbeitsabläufen, die von einem Spielereignis ausgelöst werden

${last.return}

Rückgabewert des letzten Effekts z.B. das Ergebnis des „Würfeln“-Effekts

1 Lokalisiert bedeutet, dass der Wert in die Sprache des Spielclients übersetzt wird. Z.B. kann ${wow:player:class} auf einem deutschen Client den Wert „Blutelf“ haben, im englischen jedoch „Blood Elf“.
2 weicht auf wow: aus bedeutet, dass der entsprechende Standardwert aus dem Spiel benutzt wird, falls kein TRP3-Profil existiert, oder dort keine Information vorhanden ist.

Modifikatoren von Variablen-Tags

Standardwert

Mit :: kann man einen Wert für den Fall festlegen, dass die Variable nicht existiert.
Z.B. wird mit

${count::0}

der Wert der Zählervariablen count ausgegeben, oder Null, falls es diese Variable (noch) nicht gibt.

Dezimalstellen festlegen

Mit #n kann man bei einer Zahl einstellen, auf wieviele Dezimalstellen diese gerundet werden soll.
Z.B. liefert

${distance#1}

einen Wert wie 11,6.
Standardmäßig wird auf zwei Stellen gerundet.


Viel Spaß beim Experimentieren und
:wave: bis zum nächsten Sonntag…

2 Likes

Extended am Sonntag #4


Dokumente

Dokumente in Extended sind - wer hätte es gedacht - Objekte, die hauptsächlich zur Anzeige von Text verwendet werden.
Man kann aber auch (spieleigene) Bilder, Links und andere dynamische Elemente einbetten. Sie sind also vielfältiger, als der Name vermuten lässt.

Dokumente erstellen und benutzen

Ein Dokument ist kein eigenständiger Gegenstand, sondern muss als inneres Objekt angelegt werden. Um das Dokument anzuzeigen (ähnlich wie bei einem Buch), kannst du den Effekt Dokument > Dokument anzeigen verwenden. Es kann immer nur ein Dokument gleichzeitig auf dem Bildschirm angezeigt werden.
Für ein einfaches Buch/Brief/etc. bietet die Datenbank die Option „Gegenstand erstellen > Dokumentgegenstand“. Dadurch wird ein Item erstellt, das bei Benutzung ein Dokument anzeigt. Das Dokument, das du nun füllen kannst, findest du im erstellten Gegestand unter „innere Objekte“.
Man kann Dokumente aber auch mit komplizierteren Mechanismen öffnen, zum Beispiel nach Eingabe eines Passworts.

Inhalt und Formatierung

Dokumente können aus mehreren Seiten bestehen, und es gibt mehrere Formatierungsmöglichkeiten, die man auch aus anderen Textprogrammen kennt:

  • Überschriften (H1, H2, H3)
  • Ausrichtung links, rechts, zentriert
  • Textfarbe

Wenn du Formatierungselemente wie H1 oder P (für Absätze) benutzt, wirst du feststellen, dass Marken wie {h1}{/h1} oder {p}{/p} in das Dokument eingefügt werden. Das Dokument besteht also aus Text mit bestimmten Auszeichnungselementen (englisch markup).
Für Überschriften, Absätze, und farbigen Bereiche gibt es eine Anfangs- und eine Endmarke ({...} und {/...}), bei den anderen Elementen reicht eine Marke.

Beispiel
Markup
{h1:c}Zanderfilet{/h1}
{h2}Zutaten{/h2}
{p}
Zander
Filet
{/p}
{h2}Zubereitung{/h2}
{p}
Den Zander und das Filet in eine Pfanne geben...
{/p}
Ergebnis

Zanderfilet

Zutaten

Zander
Filet

Zubereitung

Den Zander und das Filet in eine Pfanne geben...

Links

Mit dem Markup {link*linkziel*linktext} kann man anklickbare Links im Dokument erstellen.

Links zu externen URLs

Wenn ich als Linkziel eine URL angebe, wird der Betrachter des Dokuments die Möglichkeit haben, die angegebene URL in einem Web-Browser zu öffnen.
Beispielsweise baut man mit {link*https://eu.forums.blizzard.com/de/wow/*WoW-Forum} einen Link zu diesem Forum ein.
Aus naheliegenden Gründen wird diese URL nicht automatisch geöffnet. Dem Betrachter wird stattdessen ein Fenster zum kopieren der URL angeboten. Selbstredend sollte man solche URLs prüfen, bevor man sie öffnet.

Links zu Arbeitsabläufen

Wenn du den Namen eines Arbeitsablaufs als Linkziel angibst, z.B. {link*on_doc_link_click*Arbeitsablauf starten}, wird beim Anklicken der entsprechende Arbeitsablauf ausgeführt. Damit das funktioniert, muss der Arbeitsablauf innerhalb des Dokuments angelegt werden.
Mit etwas Fantasie kann man diese Links sehr vielfältig verwenden. Als Einstiegsbeispiel sei hier ein Musik-Dokument genannt, also ein Dokument, das verschiedene Links beinhaltet, die unterschiedliche Musikstücke abspielen.

Links mit Parametern

Wenn der Link einen Arbeitsablauf ansteuert, können an diesen Parameter übergeben werden.
{link*on_doc_link_click(var1=value1,var2=value2,...)*Arbeitsablauf starten}
In der Klammer stehen dabei die Variablen mit ihren zugehörigen Werten. Wenn der Spieler auf den Link klickt, werden diese Parameter als Arbeitsablauf-Variablen voreingestellt und sind im gesamten Arbeitsablauf verwendbar.

Variablen-Tags in Dokumenten

Dokumente können auch auf Variablen zugreifen. Man bindet sie mit ${variable} ein. Beachte das $-Zeichen, welches ein Variablen-Tag von den anderen Marken unterscheidet.
Wichtig ist hierbei, dass zuerst Variablen ausgewertet werden und danach die restlichen Marken. Damit werden sehr flexible Dokumente möglich, denn die Variable selbst kann Textmarken beinhalten.
Beispielsweise kann ich einer Variablen option den Wert {link*run_option_a*Option A} zuweisen. Mit ${option} landet dann dieser dynamisch erzeugte Link in meinem Dokument.
Mit Hilfe dieses Mechanismus wurden Minispiele in Extended realisiert.

Dokumente sind "faul"

Variablen werden nur zum Zeitpunkt der Anzeige des Dokuments ausgewertet. Wenn sich der Wert einer Variablen ändert, während das Dokument auf dem Bildschirm sichtbar ist, wird sich das Dokument nicht ändern.
Das ist meistens auch gewollt. Wenn sich das Dokument aber mit einer Variablen aktualisieren soll, musst du es mit dem Effekt „Dokument anzeigen“ erneut öffnen.


Viel Spaß beim Experimentieren und
:wave: bis zum nächsten Sonntag…

3 Likes

Danke für die Erklärung :slight_smile:

1 Like

Extended am Sonntag #5


Ein Minispiel: Geschenke Sortieren

Heute soll es um ein Extended-Item gehen, mit dem man ein kleines Spiel spielen kann.
In diesem geht es darum, Geschenke möglichst schnell in die richtige Kategorie (bzw. Geschenksack) einzusortieren. Wenn man den falschen Sack auswählt oder zu langsam ist, ist das Spiel zuende.

Import-Code

Probieren geht hier vor analysieren, deshalb gleich zu Beginn der Import-Code, danach die Erklärung.

Geschenksortierspiel

!TN1xtTnss8pllvQ6c5YzSSnBaxfpa2qaIrMWyc3LTwzpwASLonEgxZmcc416ZY9q(mSpLNo)f76EKKT5poqi3v7UxTa1OrJ65x)h1DpDl8C86456a)vUAzp3kEeNkvQvE7nFtTT305QRpXZTkqb5ixCmsyusCsN)HhPzBpsRJG7mEK9AJGqoC3SBpCFp3nlxgwVJ3EEesdCpAdvzWjKo4iYyclJ7i0baf(QOXW2PQH6Shq4sFkpTNp1WgkvxN2BN0EJOMWskQiqo6LoVoTx11tpoNUidBKlDeZs3lNKE8K16WccUU)SpRw71PhV2PjJhZSZouYVHfPzI(0qHDLpgjeAjpa4v2cNr1Ag3o9aP00NYZUzpAsmF2VAUjdjIFiSaJpEatfyx5ez)iE2d)inPptD1SVOgaqnfwcKQ1ElF2xcVIfLXhIjYpg0ToYbdyGSFAsqqKyyb4YyjNgKb3ju1nrJPz7ZvMmKAgRO8irUi3UV2elv9ZXvY55pypf1qhpixDiJzXjCQjkrBVVfRFCIFiqBHe6MO1XcQFmlZW9oM6MCOUGcIPy8aoBitZmz2hwatL2lreaQb4MKjT7X0gMFCbrxqv4RMdyC(OzFPW85o7ZH3WsMRUcgt7hgX6NZ5wr(HgMkMzYrTbD0yW8qt0QzFrBsal100JNU(pv4L8Z)0DDrCkV(pNEC6XGK8bQ6LOdgS6AY1WXITH3umF9vqBHdgEtX81bxE8xc8hpsdJcpsfCHQ33hpq6NmIjmD1HYRULR(Dc8s7neW(HGUgUqL7d9Luvxz))jZ)2HqxzdR3bdKjMWi9zs4TKNBnpYlMOW5tFiMufxyteA4AFWu6hcxNZpFjGr(n5sqMaaor(XDbaO3I9lymYjRaTtEQLvTrPLm18nzfr45)yX8Az7gP9tWtM9z)qWDtN27TOdetexQujiPINlKikitkGjmo9Aq(TBtGQiS4BUVX0W(0TnJTyrwx8Bss7XPIHA6OsPh3eIHTrSIyZn0qE90EVyI2xQytro6w5U2wdQaR2RWNl1S7)24nlSaNU78D25V7rMe6u3FAHgdIIwQmrmftmzJqhiUyY4PnPGr5cmQubzQ8dhaHLP9e0qtEeBqeBHvdXicxvi9dHrm8BoSMFadJ2JXI4WI7dG96jBmoJnt8L86LHFgmykzCeJJr1t2awDk4mZcN9RkyprcGFmyyzY7ZPjOeNrlbs7uc5tojBbenfsrXe6rrqwa(Tbfb7UOA3Yqi)GyvWsPiVblh4CdQHEiKntOnZ(SiG9y4NVxL0Cp0lSgWlf4seeNupsCz3rrA)U9Pd76uUBFEcR(pwB6)(FH)(W0muXyIhJiflajzotdRKX1LmStGJgIFL9O3x1sQTQK5VO)HP5InS1Wkzjai714DEUBbxrpmI7UWr8YyRBj(0dR29apYBHCshifgxPAeL3cIpyEKdoZRVh5IJYp0)qhKYMGtwK4AK4dtqQoScU87tG1Xf7MT6PfO2rk5MOXhYGJ6uEKtAIcXjqngUTZepB6WNzThqADBcZvw6Hkr09kPkEahZk)0ZULLKQ4uJ5j3s)LFPi92LlLeyP0jzBe1P2xc67Qob5bsZ)FzrDNNKGkG0HNTuQ4LYNzVfG153odSZFumWRwqFcg4Q)2zGR(hfd8Qf0hZaV45FnR8JDq9Qk7Bf1MLjA)vBTz2QgS1L58qgZVXQ(wgz18k(EqKxuQ3tc5Nx9KyvBzvS9N989N989)N98TOxIV3Us2cr6R1NWZV7rSvcY2F7z2CkJRSfsU53zDeUDXCqgVNE9)Ug5S3o)8VV2PgF)5Ox15k3t7S96DfvHTRaddOC0RBE7jpd18Ho05XCwQU49Z3A)QPhxCmsPfXm1TTTz7V5ftkIbNA7DbFY74qYualAYG820uycKOH40cm0GfWctEVz2oJW6wF1xVnTIwWkOVYkOFElB3DdvxXgYBFlV)TmR1VV7bZuiyn3h82XMkzqh9SOLTYzVo1y))aYe4vVZwG)95eSBSw4(k(0aEKgTrHg1YL(6exzZ9ZZraIPasE)U2qdWxcvs74h21McTHvVBI8PcQ4h1a8qlm0dJgy6wgIkE)(ivN7IJK9WXgwCVyFeetrBIsX5A2ZpsENVNi5VHu7zFg(NuG6tqExu3z5hsExkuoGzOrCT1aTFJUNT)UK2UDHxbhDANCGZeTIgdY2MTrDs7ZlSVMcplstqMRTHtLnQ4aNx7u3PwDhyRnW(2zC2Lm9FRtiuQd4h8bWXgIlc(aypkvRun77X7rf6RUpKLXaKB)pAqA1gLBaZBXRYBxFZ3uVgEWb6eII3rwFJZWtXjKJGlFQM1TakAL08CRV2jxK7TOz(jQiZ1TaMZT6n4E3jJ8mDKSlmvXapzDSn5KakEizu2Po9zdHYozcek8RzCe(HlSomwnZ459Fc

Dieses Item verwendet einen Lua-Skripteffekt, um die zufälligen Geschenke zu erzeugen. Daher ist die Sicherheitsstufe des Items niedrig.

Wie es funktioniert

Grundstruktur

Das Spiel-Item enthält zwei innere Dokument-Objekte. Das Dokument intro weist den Spieler in das Spiel ein, es enthält einen Link, mit dem sich das Spiel starten lässt.
Die Hauptarbeit leistet das Dokument game. Damit wird eine komplette Spielrunde modelliert, also:

  • Geschenk zufällig auswählen
  • Geschenk anzeigen
  • Aktion des Spielers auswerten

Geschenk auswählen

Jedes Geschenk wird zufällig aus 30 möglichen Geschenken ausgewählt. Diese sind vorab einer der drei Kategorien zugeordnet. Die Auswahl wird von einem Lua-Skripteffekt übernommen.
In diesem Effekt verwende ich math.random, um zufällige Werte auszuwürfeln, sowie setVar. setVar ermöglich es mir, Objektvariablen aus dem Skripteffekt heraus zu setzen. Ich exportiere also die beiden Ergebnisse category, damit das Spiel weiß, was die richtige Lösung ist, sowie itemName, damit der Spieler sieht, um welches Geschenk es sich handelt.

Erste Abbruchbedingung: Falsche Kategorie

Falls der Spieler den falschen Geschenksack erwischt, soll das Spiel beendet werden. Dazu bereite ich zwei Arbeitsabläufe vor: nextRound und gameOver. Diese beiden Arbeitsabläufe werden innerhalb der drei Arbeitsabläufe cat1, cat2 bzw. cat3 aufgerufen, diese wiederum durch Klicks auf die im game-Dokument dargestellten Säcke.
gameOver wird dabei ausgelöst, wenn der vorher gespeicherte Wert von category nicht mit der Kategorie übereinstimmt. (Beachte die Effektbedingung)

Zweite Abbruchbedingung: Zu langsam

Für diese ist ein kleiner Trick nötig. Zunächst starte ich nach dem Anzeigen des game-Dokuments einen Verzögerungs-Effekt. Nachdem die Verzögerung abgelaufen ist, ist das Spiel gelaufen, aber halt! Das soll natürlich nur dann passieren, wenn die Spieler zwischendurch nichts angeklickt hat.
Das realisiere ich mit einem Rundenzähler round. Diesen gibt es einmal als Objektvariable und einmal als Arbeitsablauf-Variable thisRound. Zu Beginn jeder Runde (d.h. nachdem der Spieler etwas angeklickt hat) erhöhe ich den Rundenzähler um eins und weise dann diesen Wert der Variable thisRound zu. Auf diese Weise kann ich erkennen, ob ein „Timeout“ noch gültig ist (round = thisRound), oder nicht (round > thisRound).
An dieser Stelle sei nochmal daran erinnert, dass Arbeitsablauf-Variablen eine kürzere Gültigkeit haben als Objekt-Variablen. Mit jedem Klick im Dokument erzeuge ich neue Arbeitsablauf-Variablen, deshalb kann es auch mehrere Versionen der Variable thisRound geben, die Objektvariable gibt es aber nur ein einziges Mal pro Item.

Ende des Spiels

Am Ende des Spiels zeige ich eine lapidare Meldung an, weshalb das Spiel beendet wurde (zu langsam oder falsch geklickt), dazu noch eine Punktzahl score, die ich vorher in jeder Runde um eins erhöht habe.

Genug Platz für Ideen

Das Item ist ausdrücklich nicht nur dazu da, benutzt zu werden, sondern auch verbessert.

Zum Beispiel kannst du dich an folgendem versuchen:

  • Verändere die Liste der Geschenke oder füge welche hinzu.
  • Gestalte das game- und intro-Dokument hübscher.
  • Verschönere die „Spiel zuende“-Meldung, und/oder baue einen „nochmal spielen“-Link ein.
  • Verringere oder erhöhe die Zeit, die der Spieler zum Reagieren hat.
  • Hübsch sortierte Säcke. Wäre doch schade drum, wenn jemand in jeder Runde die Reihenfolge vertauschen würde… Wer tut sowas nur?
  • Mach ein Endlosspiel draus. Bei Fehlern gibt es Punktabzug statt Spielende.
  • Speichere einen Highscore ab.
  • Es geht auch ohne Lua-Skript. Überführe das Skript in normale Arbeitsablauf-Elemente.
  • (für Fortgeschrittene) Ein Dokument reicht auch aus. Versuche, das ganze Spiel mit einem einzigen Dokument zu bauen.

Viel Spaß beim Experimentieren und
:wave: bis zum nächsten Sonntag…

3 Likes

Extended am Sonntag #6


Zwischensequenzen

Zwischensequenzen (engl. Cutscenes) oder Dialoge sind, ähnlich wie Dokumente, besondere Objekte, die eine bestimmte Situation auf dem Bildschirm anzeigen. In Zwischensequenzen geht es darum, eine Szene mit bis zu zwei Akteuren darzustellen. Sie sind maßgeschneidert für die Anzeige von Dialogen, insbesondere innerhalb von Quests, z.B.:

  • Erklärung einer Questaufgabe in Dialogform
  • ein NSC erzählt etwas
  • Darstellung von Interaktionen mit Objekten (Truhen, Geräte,…)

Wie Dokumente sind auch Zwischensequenzen keine eigenständigen Objekte, sondern müssen als innere Objekte eingebettet werden.

Sichtbare Struktur

Für den Spieler sichtbar ist ein Fenster mit zwei 3D-Modellen, die sich anschauen. Im unteren Bereich befindet sich ein Textfeld, welches den gesprochenen Text der Akteure darstellen kann.
Jede Zwischensequenz kann aus mehreren „Szenenbildern“ bestehen. Mit einem Klick auf das Textfeld gelangt man zum nächsten Schritt.
Außerdem ist es möglich, dem Spieler bis zu fünf Wahlmöglichkeiten anzubieten. In diesem Fall muss sich der Spieler für eine der angebotenen Optionen entscheiden, bevor es weitergeht.

Anzeige einer Zwischensequenz

Mit dem Effekt „Kampagne und Quests > Zwischensequenz starten“ wird eine bestimmte Zwischensequenz angezeigt. Diese beginnt jedes Mal von vorn. es ist also nicht möglich, eine Zwischensequenz ab einem bestimmten Schritt starten zu lassen.
Auch wenn der Effekt unter „Kampagnen“ gelistet ist, können Zwischensequenzen auch außerhalb einer Kampagne verwendet werden.

Verlauf einer Zwischensequenz

Der einfachste Dialog verläuft geradlinig. Jeder Dialogschritt wird der Reihe nach durchlaufen.

Aber es geht noch viel dynamischer.

Wahlmöglichkeiten

Mit der Schaltfläche „Wahlmöglichkeiten“ öffnet man das Menü zur Einstellung von Optionen. Jede Option ist mit einer Schrittnummer versehen. Eine Wahlmöglichkeit ist also eine Sprungmarke. Nachdem der Spieler auf eine Option klickt, springt der Dialog zum angegebenen Schritt.
Optionen können auch mit Bedingungen versehen werden. Man kann den Spieler also auch in seiner Auswahl einschränken. Bestimmte Optionen könnten nur Magiern zur Verfügung stehen, oder nur dann, wenn man vorher eine bestimmte Quest erledigt hat, oder oder oder…

Nächster Schritt

Im Feld „Nächster Schritt“ kann man eintragen, womit es im Dialog weitergehen soll. Das ist zusammen mit Wahlmöglichkeiten praktisch, denn auf diese Weise kann man Dialogteile überspringen, die zu einer anderen Auswahl gehören.
Wenn man das Feld leer lässt, geht es mit dem direkt folgenden Schritt weiter.
Es ist auch möglich, im Dialog rückwärts zu springen, bspw. wenn man möchte, dass der Spieler solange probiert, bis die „richtige“ Option gefunden wurde.

Endschritt

Setzt man die Markierung Endschritt, hört der Dialog nach Anzeige des betreffenden Schritts auf, auch wenn danach noch weitere Schritte folgen sollten. Auch das ist im Zusammenhang mit Wahlmöglichkeiten interessant, denn so lassen sich Dialogteile am Ende überspringen.

Ereignisse und Arbeitsabläufe

Vor, während, und nach einer Zwischensequenz treten Ereignisse ein, die man mit Arbeitsabläufen verknüpfen kann.

  • Bevor der Dialog startet, tritt das Ereignis „Dialog startet“ ein.
  • Nachdem der Dialog beendet wurde, tritt das Ereignis „Dialog beendet“ ein. Wichtig: Dieses Ereignis tritt nicht ein, wenn der Spieler das Dialogfenster zwischendurch schließt.
  • Jeder einzelne Dialogschritt kann mit einem Arbeitsabluf verknüpft werden. Dieser wird vor der Anzeige des Schritts ausgeführt. Hier kann man z.B. Sounds einbauen.

Akteure

Bei „Linkes Modell“ und „Rechtes Modell“ können wir einstellen, wer oder was angezeigt werden soll. Dazu stehen verschiedene Optionen zur Verfügung.

Spielfigur

Geben wir player ein, erscheint die Spielfigur des Spielers.
Bitte beachte, dass es nicht möglich ist, das Aussehen der eigenen Spielfigur in Extended abzuspeichern, bspw. kann ich nicht meinen Charakter als Akteur in einem Dialog anzeigen, den du auf deinem Account ansiehst.

Ziel

Mit target legen wir fest, dass das momentan anvisierte Ziel angezeigt werden soll.
In der einfachsten Version eines Questgeberdialogs steht demnach auf einer Seite player und auf der anderen target.

NSC-Id

Wenn man einen numerischen Wert eingibt, z.B. 10184, wird der NSC mit der angegebenen Id dargestellt, in meinem Beispiel Onyxia. Wer sich an den Beitrag zu Sounds erinnert, wir ahnen, woher ich diese Id kenne: https://www.wowhead.com/npc=10184/onyxia. Man suche nach dem Namen des gewünschten NSC, und der Wowhead-Link wird dessen Id enthalten.
Bei der Benutzung von NSC-Ids ist allerdings Vorsicht geboten:

NSC-Anzeige-Id

NSC-Ids haben zwei Einschränkungen:

  • Das NSC-Modell wird nur angezeigt, wenn es sich im Cache befindet. Das ist normalerweise der Fall, wenn man in letzter Zeit in der Nähe des NSCs war. Beim oberen Beispiel würde Onxyia wahrscheinlich nur dann zu sehen sein, wenn man in letzter Zeit die Raidinstanz besucht hat.
  • Manche NSCs haben mehrere Modelle. Die meisten Stadtwachen haben z.B. ein weibliches und ein männliches Modell. Wenn man die NSC-Id benutzt, wird ein zufälliges Modell ausgewählt.

Beide Einschränkungen kann man mit Anzeige-Ids (engl. display id) umgehen. Diese Ids sind auch auf Wowhead zu finden. Dazu klicke ich auf „Links“ und dann „Anzeige ID“. Wowhead sagt 8570. Damit Extendend normale NSC-Ids von Anzeige-Ids unterscheiden kann, muss ich DID voranstellen. Ich trage also DID8570 ein und Onyxia erscheint (mal wieder).

Wer ein Bisschen auf Wowhead stöbert, wird merken, dass dort immer nur eine einzige Anzeige-Id steht, selbst wenn es mehrere Modelle gibt.
Leider ist es nicht so leicht, alle Anzeige-Ids eines NSCs zu finden, meistens liegen die numerischen Werte aber nahe beieinander. Die gefundene Id plus/minus 1,2,3,… liefert oft die anderen Modelle.

Noch etwas Deko

Dialogtext

Neben Variablen-Tags (${variable}) kann man auch Sternchen oder Spitze Klammern verwenden, um Emotes zu kennzeichnen. Diese erscheinen dann in der gewohnten Emote-Farbe.
Beispiel: <Der Questgeber gähnt laut.> Was willst du?

Hintergrund

Standard-Hintergrund einer Zwischensequenz ist eine nachtelfisch angehauchte Szene. Dort kann man jeden Bildpfad aus dem Spiel eingeben, sofern man ihn kennt. Wie man diese findet, steht in einem anderen Tutorial. :wink:
Fürs erste kannst du versuchen, nightelf im Standardpfad durch den englischen Namen eines anderen Volks zu ersetzen, um thematisch an deren Hintergrundbilder zu kommen.

Bild

Zusätzlich zum Hintergrund ist es möglich, ein Bild in der Mitte des Dialogs anzuzeigen.


Viel Spaß beim Experimentieren und
:wave: bis zum nächsten Sonntag…

2 Likes

Extended am Sonntag #7


Heute mal etwas für Fortgeschrittene und/oder Unerschrockene:

Der Lua-Skripteffekt

WoW-Addons (und auch Weakauren) sind in der Programmiersprache Lua geschrieben. Auch Extended erlaubt es, Lua-Codeschnipsel in eine Kreation einzubauen, falls die vorgefertigten Effekte nicht ausreichen sollten.
Den Effekt findest du unter „Experte > Eingeschränktes Lua-Skript ausführen“.

Eingeschränkt?

Extended kennt verschiedene Sicherheitsstufen. Der Lua-Effekt ist als niedrig eingestuft, trotzdem bietet das Addon einen gewissen Schutz, denn man kann mit dem Effekt nicht beliebigen Code ausführen. Wir werden gleich sehen, dass der Funktionsumfang trotzdem recht groß ist.
Damit erfüllt der Lua-Effekt seinen Zweck als „Sammelstelle“ für vieles, was mit den anderen Effekten nicht geht.
Die Blizzard-API bleibt dem Effekt allerdings verwehrt.

Das Basispaket

Zunächst kann man neben den Strukturelementen if, for, function, … die globalen Elemente date, ipairs, math, next, pairs, select, string, table, tonumber, tostring, type und unpack benutzen.
string ist hier besonders hervorzuheben, denn darin stecken die üblichen Funktionen zur Manipulation von Zeichenketten.
Auch math kann interessant sein, wenn man bspw. eine Wurzel berechnen muss zur Entfernungsmessung.

Der Eingabeparameter args

Code, den man in das Eingabefeld eingibt, wird letztendlich als Funktion ausgeführt:

function(args)
-- dein Code wird hier eingefügt
end

args ist dabei ein Parameter, den man weiterreichen sollte, wenn man die folgenden Funktionen verwendet.

getVar und setVar

Mit getVar kann man Variablen aus Arbeitsablauf, Objekt oder Kampagne in das Skript laden:

local wfVar   = getVar(args, "w", "workflowVar")
local objVar  = getVar(args, "o", "objectVar")
local campVar = getVar(args, "c", "campaignVar")

Umgekehrt kann man mit setVar ein Ergebnis, das im Skript berechnet wird, in Arbeitsablauf, Objekt oder Kampagne speichern:

setVar(args, "w", "workflowVar", wfVar)
setVar(args, "o", "objectVar", objVar)
setVar(args, "c", "campaignVar", campVar)

Effekte auslösen mit effect

Aus einem Lua-Skript heraus kann man auch Effekte auslösen. Das ist praktisch, denn so kann man sich pro Arbeitsablauf auf ein Skript beschränken, sofern man überhaupt auf Skripte angewiesen ist.
Grundsätzlich löst man Effekte mit

effect("effect_id", args, ...)

aus. Man muss also die Ids der Effekte kennen. Bevor ich mit einer langweiligen Liste aufkreuze, lieber ein paar Beispiele.

effect("text", args, "Gruß aus Luanien", 1)
-- gibt einen Text im Chatfenster aus

effect("item_add", args, nil, "xyz123", "5", false)
-- legt 5 Mal das Item mit der Id xyz123 ins Inventar

effect("sound_id_self", args, "SFX", 1234, false)
-- spielt den Sound mit der Id 1234 im SFX-Kanal ab
Alle Effekt-Ids
cam_load
cam_save
cam_zoom_in
cam_zoom_out
companion_dismiss_critter
companion_dismiss_mount
companion_random_critter
companion_summon_mount
dialog_quick
dialog_start
do_emote
document_close
document_show
item_add
item_bag_durability
item_consume
item_cooldown
item_loot
item_remove
item_roll_dice
item_sheath
item_use
quest_goToStep
quest_markObjDone
quest_revealObjective
quest_start
run_item_workflow
run_workflow
script
secure_macro
signal_send
sound_id_local
sound_id_local_stop
sound_id_self
sound_id_stop
sound_music_local
sound_music_local_stop
sound_music_self
sound_music_stop
speech_env
speech_npc
speech_player
text
var_object
var_operand
var_prompt

Operanden auswerten mit op

result = op("operand_id", args, ...)

wertet den Operanden mit einer vorgegebenen Id aus und gibt das Ergebnis an die Variable result zurück. Auch hier muss man die Ids kennen.
Zum Beispiel:

local playerName = op("unit_name", args, "player")
-- gibt den Namen des Spielers

local playerName = op("time_hour", args)
-- gibt die momentane Stunde

local itemCount = op("inv_item_count", args, "xyz123", nil)
-- gibt an, wieviele Items mit der Id xyz123 im Inventar sind
Alle Operanden-Ids
char_achievement
char_cam_distance
char_facing
char_falling
char_flying
char_indoors
char_minimap
char_mounted
char_resting
char_stealth
char_subzone
char_swimming
char_zone
check_event_var
check_event_var_n
date_day
date_day_of_week
date_month
date_year
inv_container_slot_id
inv_item_count
inv_item_icon
inv_item_id_weight
inv_item_name
inv_item_quality
inv_item_value
inv_item_weight
quest_is_npc
quest_is_step
quest_obj
quest_obj_all
quest_obj_current
random
time_hour
time_minute
unit_class
unit_classification
unit_creature_family
unit_creature_type
unit_distance_inspect
unit_distance_me
unit_distance_point
unit_distance_trade
unit_exists
unit_faction
unit_guild
unit_guild_rank
unit_health
unit_id
unit_is_dead
unit_is_player
unit_level
unit_name
unit_npc_id
unit_position_x
unit_position_y
unit_race
unit_sex
unit_speed
var_check
var_check_n

Benutze den Skript-Effekt sparsam

Wenn der Lua-Effekt alles kann, was die anderen Effekte auch können, könnte man in Versuchung kommen, einfach alles mit einem Skript umzusetzen.
Davon sollte man aus mindestens zwei Gründen absehen:

  1. Der Effekt ist als letztes Mittel gedacht, falls es unmöglich sein sollte, die Kreation auf andere Weise zu erstellen.
  2. Der Effekt umgeht den normalen Schritt-für-Schritt-Ansatz des Addons und macht Arbeitsabläufe schwerer nachvollziehbar.

Überlege also, ob es wirklich ein Skript sein muss, oder ob es vielleicht auch einfacher geht.

Den Überblick behalten

In seiner Rolle als Auffanglösung hat der Skript-Effekt nur ein einfaches Eingabefenster bekommen, in das der Lua-Code hineingeschrieben werden muss.
Ich empfehle, den Code in einem „guten“ Editor, z.B. einem mit Syntaxhervorhebung, zu schreiben, und dann alles zu kopieren und in das Fenster einzufügen.
Verwende Kommentare ausgiebig, damit du auch noch nach Wochen weißt, was dein Code macht oder machen soll.


Viel Spaß beim Experimentieren und
:wave: bis zum nächsten Sonntag…

1 Like

Wunderschöne Guidesammlung!
Vielleicht baue ich damit auch mal weiter an eigenen Ideen.
Vielen lieben Dank dafür!

1 Like

Extended am Sonntag #8


Spielereignisse

Heute soll es um einen Mechanismus gehen, mit dem das Spiel dem Interface (also auch Addons wie Extended) mitteilt, was gerade auf dem Bildschirm passiert: Spielereignisse oder Events. Wer beim Wort „Event“ an ein Rockfestival denkt, den muss ich enttäuschen. Auch simple Dinge wie ein Mausklick sind Ereignisse, und das Spiel wird uns über jeden Mausklick informieren, wenn wir das wollen.

Ereignisse "abhören"

Technisch gesehen ist ein Ereignis einfach nur eine Nachricht, die jedem Addon übermittelt wird, das danach fragt. Wenn ich z.B. informiert werden möchte, sobald meine Spielfigur das Gebiet wechselt, muss sich ein Addon für das Ereignis ZONE_CHANGED registrieren. Extended übernimmt hierbei die Registrierungsarbeit für uns und wir müssen lediglich einen Arbeitsablauf festlegen, der bei einem bestimmten Ereignis starten soll.
Die Auswahl an Ereignissen ist reichlich. Probiere es aus:

/eventtrace

öffnet ein Fenster, das alle Ereignisse in Echtzeit auflistet. Selbst, wenn nichts besonderes auf dem Bildschirm passiert, können Ereignisse im Sekundentakt eintreten. Wenn du kämpfst oder in einer belebten Stadt bist, explodiert das Log förmlich.

Wo kann man Ereignisse einsetzen?

Grundsätzlich können nur Kampagnen auf Ereignisse „hören“, bei Items geht das nicht.
Innerhalb von Kampagnen kannst du Ereignisverknüpfungen auf Kampagnen-, Quest- sowie auf Questschrittebene einstellen.

  • Kampagnenereignisse bleiben solange aktiv, wie die Kampagne aktiv ist. Wird die Kampagne pausiert, wird kein Ereignis verarbeitet.
  • Questereignisse werden verarbeitet, solange die Quest sichtbar und nicht erfüllt ist.
  • Questschrittereignisse werden verarbeitet, solange die zugehörige Quest sich im betreffenden Schritt befindet und nicht erfüllt wurde. Es ist also nicht sinnvoll, einem Endschritt Ereignisse zuzuweisen.

Bedingte Ereignisse

Unter „Ereignisverknüpfungen“ kannst du jedem Ereignis mit STRG+Klick eine Bedingung zuweisen. Diese sorgt dafür, dass das Ereignis nur dann weiterverarbeitet wird, wenn die Bedingung erfüllt ist.
Das ist hilfreich, denn die meisten Ereignisse sind allgemein gehalten. Bspw. informiert das oben erwähnte Ereignis ZONE_CHANGED nur, dass man das Gebiet gewechselt hat, aber nicht, in welches. Die Quest „Reise nach Eisenschmiede“ könnte man also erfolgreich abschließen, wenn das Ereignis ZONE_CHANGED eintritt und der Gebietsname „Eisenschmiede“ lautet.

Ereignisparameter

Manche Ereignisse übermitteln zusätzliche Informationen. Z.B. liefert das Mausklickereignis GLOBAL_MOUSE_UP mit, ob die linke (leftButton) oder rechte (rightButton) Maustaste betätigt wurde.
Der Operand „Experte > Ereignisparameter (Text/Zahl)“ ist sowohl in der Ereignisbedingung als auch im aufgerufenen Arbeitsablauf abrufbar.
Alternativ kannst du das Variablen-Tag ${event.X} benutzen, wobei X für den Argument-Index steht.
Beachte, dass die Argumente nur in unmittelbar aufgerufenen Arbeitsabläufen verfügbar sind.

Spezielle Extended-Ereignisse

Fünf Ereignisse werden nicht vom Spiel generiert, sondern von Extended selbst. Um es ganz genau zu nehmen, reagiert Extended auf ein anderes Spielereignis und erzeugt daraus ein angepasstes Ereignis.
Sie werden genauso behandelt wie die anderen Ereignisse, tauchen aber nicht im /eventtrace-Log auf.

  • TRP3_EMOTE, wenn jemand ein vorgefertigtes Emote wie /hallo verwendet
  • TRP3_ITEM_USED, wenn der Spieler ein TRP-Item benutzt
  • TRP3_KILL, wenn der Spieler oder ein Gruppenmitglied eine Einheit tötet
  • TRP3_ROLL, wenn der „Würfeln“-Effekt verwendet wurde
  • TRP3_SIGNAL, wenn der „Signal senden“-Effekt verwendet wurde

Wie man Ereignisse findet

Wenn du ein neues Ereignis einstellst, hast du die Möglichkeit, den Ereigniskatalog zu durchsuchen. Dort sind viele (aber nicht alle) Ereignisse nach Kategorie aufgelistet, zusammen mit ihren Parametern, d.h. den Informationen, die mitgeliefert werden. Wenn du schon ungefähr weißt, in welche Kategorie dein Ereignis gehören könnte, kann dieser Katalog eine Hilfe sein.

Die „Probiermethode“ kann auch zum Ziel führen. Öffne dazu das /eventtrace-Tool. Dann tust du, was in deiner Quest bzw. Kampagne getan werden soll. Beobachte dabei, welche Ereignisse eintreten. Wenn ein Ereignis immer eintritt, wenn du die Questaufgabe erledigt, hast du einen guten Kandidaten gefunden.

Sei präzise

Bedenke, dass Ereignisse nicht nur für Extended entwickelt wurden. Meistens werden Ereignisse öfter ausgelöst als benötigt. Du kannst Bedingungen einsetzen, um das „richtige“ Ereignis herauszufischen.
Es kann auch vorkommen, dass mehrere Ereignisse bei einer bestimmten Aktion auslösen. Das Aufsteigen auf ein Reittier löst z.B. eine Reihe von Ereignissen aus, darunter UNIT_SPELLCAST_STOP (weil aufmountern als Zauber zählt) und COMPANION_UPDATE. Wenn die Questaufgabe darin besteht, auf ein Mount zu steigen, solltest du COMPANION_UPDATE verwenden, wenn es darum geht, einen Zauber zu wirken, kann UNIT_SPELLCAST_STOP helfen. Versuche also, ein möglichst passendes Ereignis zu wählen.


Viel Spaß beim Experimentieren und
:wave: bis zum nächsten Sonntag…

1 Like

Extended am Sonntag #9


Mehr Einsicht mit TRP3:Intended

Wenn die eigenen TRP3-Kreationen ambitionierter werden, wenn sich in deiner Kampagne eine stattliche Anzahl an Quests gesammelt hat oder wenn dein Item mit mehreren Variablen jongliert, kann es schonmal passieren, dass der Überblick verloren geht, insbesondere, wenn irgendetwas nicht so funktioniert, wie es soll.

Damit ich bei der Erstellung mehr Kontrolle über meine Kreation habe, habe ich mir ein Addon-Modul gebastelt, dass ihr euch bei CurseForge herunterladen könnt:

https://www.curseforge.com/wow/addons/total-rp-3-intended

Ein stiller Helfer

Zunächst wirst du nur eine neue :beetle:-Schaltfläche im TRP3-Menü sehen und so soll es auch sein: Das Modul wird nur aktiv, wenn man es explizit anweist, ein Item oder eine Kampagne zu beobachten, ansonsten bleibt es dezent im Hintergrund.
Kampagnen kannst du mit der Schaltfläche „Aktive Kampagne verfolgen“, Items mit STRG+Klick auf die Beobachtungsliste setzen. Bei einem Item wird nur das ausgewählte Exemplar beobachtet, denn jedes Exemplar kann einen anderen Status besitzen.

Objektdaten

Unter „Objektdaten“ findest du alle Objektvariablen mit ihren momentanen Werten. Außerdem gibt es eine Funktion, um den momentanen Zustand zu exportieren. So kann man bspw. andere Spieler auf den selben Stand in einer Kampagne bringen, um etwa einen Fehler zu untersuchen.

Questübersicht

Bei einer verfolgten Kampagne kannst du dir eine Übersicht mit allen enthaltenen Quests ansehen und diese nach Belieben starten oder zu beliebigen Schritten wechseln.
Das ist hilfreich, wenn du Quests testen möchtest, denn auf diese Weise musst du nicht jedes Mal die Kampagne neu starten.

Arbeitsabläufe

Zu jeder verfolgten Kreation notiert sich Intended alle Arbeitsabläufe, die ausgelöst wurden.
So kannst du nachvollziehen, ob und in welcher Reihenfolge deine Arbeitsabläufe ausgeführt wurden, oder ob sie z.B. öfter bzw. seltener als gedacht auslösen.

Kontrollpunkte

Innerhalb von Arbeitsabläufen ist es möglich, mit einem speziellen Effekt einen Kontrollpunkt anzulegen (Debug-Effekte > Kontrollpunkt). Damit hast du Einsicht in den Arbeitsablauf selbst.
Auch wenn dieser Effekt nur Intended-Benutzern zur Verfügung steht, funktionieren Kreationen weiter, wenn man das Modul nicht installiert hat. Trotzdem solltest du Kontrollpunkte löschen, sobald du sie nicht mehr benötigst, so wie ein Baugerüst abgebaut wird, wenn das Haus fertig ist.

Warnungen

Intended hat eine Bescheidene Form der sog. statischen Analyse, d.h. es kann bestimmte problemantische Konstrukte erkennen.
Wegen der Komplexität von TRP3 kann diese Liste nicht vollständig sein, und es kann mitunter falschen Alarm geben, aber es kann nicht schaden, mal einen Blick auf die Warnungen zu werfen, wenn etwas nicht richtig funktioniert.

Spoilerwarnung

Intended lässt zu, dass du mehr von einem Item oder einer Kampagne siehst, als das normalerweise der Fall wäre. Beim Erstellen, Testen und der Fehlersuche ist das praktisch, für alles andere ist das Modul nicht gedacht.

  • Benutze das Modul nicht, während du eine Kampagne durchspielst!
  • Fordere andere Spieler nicht auf, eine Variable manuell einzustellen, bevor sie ein von dir erstelltes Item benutzen können!
  • Gehe immer davon aus, dass deine Mitspieler Intended nicht installiert haben!

Viel Spaß beim Experimentieren und
:wave: bis zum nächsten Sonntag…

1 Like

Extended am Sonntag #10


Der dynamische Notizblock

Ein Notizblock? Könnte man da nicht einfach ein Dokument-Item erstellen und fertig?

Könnte man.

Aber dann lernen wir ja gar nichts über dynamische Dokumente. Und Variablen. Und man braucht jedes Mal ein neues Item für eine simple Notiz. Und außerdem. Und überhaupt.

Import-Code

Bevor es losgeht findet ihr hier das fertige Item zum Schnell-Importieren:

Notizblock

!1Ev3YPTru4xgFvMMyjHTtqtCNbd4c1oIeV4F60PRqiDSzRxKi6hNyiwpl9POx1RAEX65SlcqGi21tYypIDxT7589D(5BbUjVp3Xe)3OMb3XIZmmTQBw30W61hCYh)yc3PgUdwxh6zyukSCwqKp9r)FJZA1JZoTlolLZoQhzqwNg6PDAZDoWWaxVp)ioJ1KotuyJGG(WNtBkf(3sRW6tpj0WanKWrIao7oVy3jXrJNG2Yl(Me9lzhjstH8bKnYhaIWBGHqOIaEbbGY2e0zrCN9wXFDdNKHVyF6fPQ)y4)srsAX0126JbTOH)j4xgArkyCOY9(rHPqyQce7mB(ShMn5H)9VMT7eAWoZwa4hOLwhwSqoZIwWAtaGzGSXObDtgf9PsyyTSy(ak1LpGszBJ2mXnHpT0XtGZXrYefPNnQMT)dziVJNcc)rHaMVUlkmFWoZsJNypr6DpeBFDMuI0FuTTZ)A)pbZVF4FOGtcYlV0SyqHN2Iqmo4eLkMUvCSzi6hvWNixn(IKW7BSWd9VIIDMySdXNivcu0X8HL1q5)QEmfP1iMDuZt4oVHZExlYcVd7jD6PmR7XC2hYGK0JXd42j7gGZo(mQD8YUyuzFS7SJjTPw4EeH3tBtVRowvD2o1Ov)fVXq)OizQyshWlaIreqeG50aTu0TQOtb1ivIU9x2)FEc8nRZwl6ImnO49Z3Ko97pcWkwMxPuViuKk8KIPqGY7QAZdNlLDhg(JZGcG9SZBBRPmol09trX3ET87dWZ)YxECOV(X3SewnDLn8SBYl6RwfRuN1QiBJ40Ev7KVHWUifKRPSR6dkPQtvrBrm)zRxuH81mPi82xu(sRxOV6zKiCA21F9FUbcjn95BCHw6lOrcigF7wv32Blfspz0wCbtvgFf1f1f0SENxe4WLoNX19KZxI1ahonBC(GtHeafhJb)rPj3subtc4jA2tzKU8HOcZLChu6O15QpiRGGG1LZ2)Z0GZWb0rk(MaAXHwTPBcxikBBJkYQ881Eylr8CT5PawfGkXS3ZqsBw3sHvuW6u84QAdfugQfBw5iQQAC5p0qfSqfvCY5o0ZlAOWzZZOjN1LGHQIY2(TNaeiu29NrN2ICQLrD0mTPn3TjvUFN7yrIVljk4AGH(lv2MDe9SPYPx2M8q6QkWTVQi8RP)s(uYOt8MaXdZcdKGHLNMMxGRibbw9haLclBq9HYislzjZTkyUgJvWC)ryjfKyBBAyuIX6WSM3AUPJERXWNQo(tRiwdgvrmINTQIurlDseg0CfbUjG86sUGD8vKt0rB0ld)U179Ynb92A9Woa0IdxyBC5dESlfCdx)AHcxvCLWBxEHGJXIgCT7hg7f6pIMuHMlwGp2f)(Mp(1Ek)yQJBedXkvuMjk((QyQQn)GT4oKSj4v58kUpcNfaPEcjbLQvO0DsN2J2PQGKXajChK8Y(JI9KyVWf4VVathSwyIS(UgM7AzLpWYWU2BSTOI(sRBwhl4TTEnIe8CQF0trBkRzfgp4cmk8Q9ELQo5zO9v81EQuOTK46pLpG0DrHis3DLU98bEdNMj)6FNOvGta)Syr69NIavsjiT4Fbk5)h

Was das Item können soll

Ich möchte einen handelsüblichen Notizblock modellieren, von dem man Zettel abreißen und einzeln beschreiben kann.

  • Jeder Zettel soll zunächst eine Überschrift bekommen.
  • Man kann danach beliebig viel Text hinzufügen, das muss nicht sofort passieren, d.h. man soll alte Notizen später ergänzen können.
  • Man kann eine Notiz unterschreiben. Wenn man eine Notiz unterschrieben hat, soll es nicht mehr möglich sein, Text anzufügen.
    Bei einem echten Notizzettel würde das natürlich trotzdem gehen, aber… ich will das so :yum:

Objektstruktur

Der Notizblock ist ein Item (wow, Sherlock…), der ein inneres Item enthält, das einen einzelnen Notizzettel modelliert. In diesem befindet sich ein Dokument, dass die eigentliche Notiz anzeigt. Wir haben es also mit einem Dokument in einem Item in einem Item zu tun.
Da ich mehrere Arbeitsabläufe pro Item und Dokument benötigen werde, überführe ich als erste Amtshandlung meine Objekte in den Expertenmodus.

Variablen

Der Notizblock an sich benötigt nur eine Objektvariable: Mit charges speichere ich, wieviele (leere) Zettel der Block noch enthält.

Die einzelnen Zettel brauchen da etwas mehr Information. Beachte, dass die Objektvariablen der Notizzettel nichts mit der des Blocks zu tun haben. Auch wenn der Block zerstört wird, bleiben die abgelösten Zettel erhalten.

  • initialized erhält den Wert true, sobald der Zettel zum ersten Mal benutzt wird.
  • title speichert den Titel bzw. das Thema der Notiz.
  • content enthält den eigentlichen Inhalt, der nach und nach eingegeben wird.
  • controls beinhaltet die Schaltflächen „Text hinzufügen“ und „Signieren“. Nachdem signiert wurde, wird diese Variable mit einem Text „unterschrieben von…“ überschrieben.
  • signature enthält die „Unterschrift“, sobald unterschrieben wurde.
  • addedText ist eine temporäre Variable, um Text zwischenzuspeichern, der hinzugefügt werden soll.

Das äußere Item: Notizblock

Der Notizblock ist ein benutzbares Item. Im Tooltip informiere ich den Spieler mit ${charges::100} darüber, wieviele leere Zettel noch am Block heften. Die ::100 stellt dabei sicher, dass auch dann etwas angezeigt wird, wenn der Block noch nie benutzt wurde und somit die Variable charges noch nicht existiert.
Benutzt man den Notizblock, wird onUse ausgeführt. Achtung: Es gibt einen weiteren Arbeitsablauf mit selbem Namen im Notizzettel-Item.

  1. Initialisiere die Variable charges mit 100. Indem ich „Initialisieren“ statt „Wertzuweisung“ verwende, wird der Effekt nur bei der ersten Benutzung aktiv. Danach wird er ignoriert, da es die Variable charges schon gibt.
  2. Verringere charges um 1, denn wir reißen gleich ein Blatt ab.
  3. Spiele einen passenden Sound ab. Geschenkt.
  4. Füge das innere Item (Notizzettel) dem Spielerinventar hinzu.
  5. Bedingung: wenn charges Null erreicht:
  6. Verbrauche (d.h. Zerstöre) den Notizblock.

Das Dokument

Der Inhalt des Dokuments, also des Objekts, das später meine Notiz auf den Bildschirm bringt, sieht… unspektakulär aus:

{h1:c}${title}{/h1}${content}
${controls}

In diesem Fall liegt die Würze in der Kürze.
${title} wird durch den vom Spieler vergebenen Titel ersetzt, ${content} entsprechend durch den Inhalt.
${controls} beinhaltet die beiden Schaltflächen/Links, mit denen ich Text hinzufügen kann oder signieren.

Die drei Dokument-Arbeitsabläufe onAddTextClick, onAddTextInput und onSignClick heben wir uns für später auf, denn zuerst kümmern wir uns um…

Das innere Item: Notizzettel

Wie der Notizblock ist dieses Item als benutzbar angelegt. Im Tooltip zeige ich mit ${title::<Kein Titel>} den Titel an. Man muss also nicht jede Notiz „durchklicken“, um den Titel zu erfahren.
Außerdem fülle ich das Feld „Beschreibungstext“ mit ${signature::Ein einfacher Notizzettel} aus. Das sorgt dafür, dass eine nicht unterzeichnete Notiz mit der Bemerkung „Ein einfacher Notizzettel“ versehen wird, ein unterschriebener hingegen mit der entsprechenden „Unterschrift“.

Der Notizzettel hat zwei Arbeitsabläufe: onUse und initialize. Wenn man einen Notizzettel benutzt (also rechtsklickt), …

  1. … wird das innere Dokument angezeigt, aber nur, wenn die Variable initialized auf true gesetzt ist.
  2. … wird initialize aufgerufen, aber nur, wenn die Variable initialized nicht auf true gesetzt ist.

Anders ausgedrückt: onUse bereitet den Notizzettel vor, falls das noch nicht geschehen ist, ansonsten zeigt es seinen Inhalt an.

initialize kümmert sich darum, dass beim ersten Benutzen alle Variablen korrekt eingerichtet werden:

  1. Setze initialized auf true.
  2. Lege die Variable content an. In der Datenbank sieht das Konstrukt etwas merkwürdig aus. Dort steht content [=], aber es hat seine Richtigkeit. Der Inhalt soll anfangs leer sein.
  3. Weise der Variable controls den Wert {h3:c}{link*onAddTextClick*Text hinzufügen} {link*onSignClick*Signieren}{/h3} zu. Hier sind also die beiden Schaltflächen, die später im Dokument zu sehen sein werden. Sie stehen deshalb nicht direkt im Dokument, damit ich sie nach dem Signieren entfernen kann.
  4. Eingabeaufforderung für die Variable title. Der Spieler soll hier einen Titel wählen. Sobald das geschehen ist, wird onUse aufgerufen.

Wer aufmerksam gelesen hat, wird feststellen, dass die beiden Arbeitsabläufe sich gegenseitig aufrufen. Das könnte sich zu einer gefährlichen Endlosschleife entwickeln. In diesem Fall ist das kein Problem, denn wir steuern die Aufrufe über die Variable initialized. Indem wir sie im ersten Schritt auf true setzen, stellen wir sicher, dass es kein ewiges hin und her geben kann.

Interaktionen im Dokument

Wie oben erwähnt, bleiben noch die drei Dokument-Arbeitsabläufe zu klären.

onAddTextClick wird ausgelöst, sobald der Spieler auf die entsprechende Schaltfläche unten im Dokument klickt. Als einzigen Effekt enthält der Arbeitsablauf eine Eingabeaufforderung für die Variable addedText.

Ist der Spieler fertig mit Schreiben, wird onAddTextInput aufgerufen.

Hier wird im ersten Schritt die Variable content modifiziert: ${content}{p} {/p}{p}${addedText}{/p}. Der neue Wert besteht aus dem alten Wert (dafür sorgt der erste Teil ${content}), sowie dem neuen Text ${addedText}, der in einen Absatz eingebettet wird (dafür sorgen {p} und {/p}).
Dazwischen habe ich ein komisches Konstrukt {p} {/p} reingemogelt. Dieses erzeugt eine Leerzeile. Das Leerzeichen in der Mitte ist ein geschütztes Leerzeichen, sonst funktioniert der Trick nicht.
Das geschützte Leerzeichen ist über die Tastenkombination ALT+255 erreichbar. Im Gegensatz zum normalen Leerzeichen wird es wie Text behandelt. Ohne dieses spezielle Zeichen würde Extended „denken“, dass mein Absatz leer ist, und ihn nicht anzeigen. Ich habe also einen nicht leeren Absatz und Extended spendiert mir den Zeilenumbruch, den ich haben möchte. Der Absatz an sich ist nicht zu sehen, weil… naja, weil er nur aus Leerzeichen besteht.

Im zweiten Schritt wird das Dokument erneut angezeigt. Bedenke, dass an dieser Stelle das Dokument bereits offen ist, aber indem ich es erneut öffne, wird auch der Inhalt mit dem neuen Wert von content aktualisiert.

Der letzte Arbeitsablauf ist onSignClick, der ausgelöst wird, wenn der Spieler seine Notiz unterzeichnen möchte.
Ähnlich wie bei onAddTextInput werden hier Variablen neu gesetzt.
Zunächst bekommt controls den neuen Wert {h3:c}unterzeichnet von ${trp:player:full}{/h3}. Damit werden die beiden Schaltflächen durch einen Text ersetzt und sind nicht mehr anklickbar. ${trp:player:full} ist ein Variablen-Tag, das den Spielernamen beinhaltet.
Danach wird das Dokument erneut angezeigt, damit die Änderungen sichtbar werden.
Im letzten Schritt wird die Variable signature eingestellt. Dadurch ist dann bereits im Item-Tooltip ersichtlich, dass die Notiz fertiggestellt wurde, und nicht mehr veränderbar ist.


Viel Spaß beim Experimentieren und
:wave: bis zum nächsten Sonntag…

2 Likes

Diese Richtlinie mit nur 3 Posts ist seltsame. Die Guides sind aber gut.

1 Like

Extended am Sonntag #11


Karten und Würfel

Heute geht es um eine häufig vorkommende Frage: Wie kann man Würfel oder das Ziehen von Karten aus einem Kartenstapel modellieren?
Man ahnt es vielleicht schon, es wird um Zufallswerte gehen.

Würfel erzeugen unabhängige Zufallsereignisse. Wenn ich mehrmals würfle, hat das Ergebnis nichts mit den vorherigen Würfen zu tun. Selbst bei einem gezinkten Würfel ist das so, auch wenn dort nicht alle Ergebnisse gleich wahrscheinlich sind. Münzwürfe fallen auch in diese Kategorie.

Im Gegensatz dazu entstehen beim Kartenziehen abhängige Ergebnisse. Wenn ich in einem normalen 32-Karten-Blatt einmal das Pik As ziehe, kann die nächste Karte sicher kein Pik As mehr sein. Beim Lotto ist es ähnlich.

Überlege also zuerst, in welche Kategorie deine zufälligen Ereignisse passen könnten.

Einmal Würfeln, gleiche Chancen

Wenn man „nur“ würfeln möchte, hat Extended das passende Werkzeug: Inventar > Würfeln.
Hier kannst du einstellen, wie gewürfelt werden soll. 1d6 steht z.B. für den klassischen, sechsseitigen Würfel, 1d100 entspricht dem /würfeln-Makro. Das Würfelergebnis wird auf dem Bildschirm ausgegeben. Optional kannst du das Ergebnis in eine Variable speichern.

Wenn das Ergebnis keine Zahl, sondern eine zufällige Begrüßung, ein zufälliger Soundeffekt, o.ä. sein soll, benutzt man einen Trick: Jedes mögliche Ergebnis bekommt eine Nummer. Dann würfelt man die Nummer aus und voilà.
Hierzu sollte man Experte > Dynamischer Wert > Zufallswert einsetzen, denn wir sind nicht am Ergebnis selbst interessiert (der Zahl), sondern dem zugewiesenen Ereignis.

Eine ausführliche Beschreibung zum Erstellen einer Wurfmünze findet ihr hier: [Guide][Wiki-Beitrag] How-To Total RP 3 Extended ❔ - #4 von Enestress-die-aldor .

Das folgende Beispielitem gibt die Worte „EINSicht“, „AbZWEIgung“ oder „RunDREIse“ aus, jenachdem wie man gewürfelt hat. Das Grundprinzip ist immer das selbe: Erzeuge im ersten Effekt einen zufälligen Wert und frage ihn danach in den Effektbedingungen der Reihe nach ab.

Wörterwürfel !9ozuVTjmqC8prRfCGULi1hiatcPoNUCjG2EWjuIxckeycijD7H8XApT36xS()m0TQLSxRWY(8DNV7hN9PSvZusBmSgyPKcfzjSCX4g3HzwXwFujhapOijMBv0SVazSN8zTvLZB0SanJN5yr6UacP8vk6qA9IQVRRtlXM061nDwPv5z6PvffMuEKtcX(uTtjDEHi2gm02)ryuK3G5sfjyfoNNVw9JWqwfsxV6EBDOKTrNTDboFAphhna8hA48WkU92()7d)LGxJ)09LbtdJWppZO9)siwh8MWM4cS59WxtcJwVVC9LHJlFoScXBcI2xaXWijLNTP9)d4RU2xPBtZlA6E)9PaoS(b4DQ71wIRfItlfwJCVzK7qOFmEkQl0h0nVB2M6uGefBECrxWYDt4GJyIvjlhJNWx5CLdqjUVJGOZs1WrqpqXFcJYKi1diejkjCoyUzbnhOctuKICFKfMcb(in6S915T)4oWrHHRXECqUNq6Sh(b0BHJMxEyXU8MSfCDDHLTjvijspfL80VQB11hF631FdHGB8GLp7zk737XBMl55ypdk(t5nbC8f2VhEgACHuJn1eiNyoKVjojH8HAno01K33ItEq8N73DAzsxMlpTSwJBWMTf5zB1LDx9oVuaBvQN)d

Würfeln mit ungleichen Chancen

Wenn ein gezinkter Würfel oder allgemein unterschiedlich wahrscheinliche Ereignisse benötigt werden, kann man sehr ähnlich wie im ersten Teil vorgehen, nur, dass man diesmal den Ergebnisbereich abfragt.

Als Beispiel habe ich eine Schatulle gebaut, die mit 15%-iger Wahrscheinlichkeit ein seltenes Item enthält. Ich habe das Item so konstruiert, dass es nach der Benutzung nicht verschwindet oder „leer“ ist. So könnt ihr den Effekt leichter ausprobieren.

Schatulle !nx12UTnpm4NO1AlNGGvSnG0KITa060f5KIDJSvSzs0IpuiRCO7c)ySNMDxFXgPSttNtXF)3agWsmKLejf)iP(OfUIaHVl(445i8zcUdZPlZ1L50zAqxZEHVhQbFKpnA0YYv0KPCAKpqWlYNwccJGFzFARB54r5(wxRkZf8bJPr)(c(h1p(J8Y7L5ODKlDWFc(N7BDk)ssT76tJZWTqjdMqlgsNhZ1d18kA9i0LQ8THFf2bPXA5cJkFzypNWLqMdlCPga0b3ApOP(weeyp6ROd1yXCWbuhyHsaUn9NWkUZ4rK(3CNfedNAFrbAh81ibV7EAYeCczInTGVVziz6nJXqDmTo4lOmReTudVEgJXEHmwaOsRI2wKxfnotwf9jvAcuwfnujtGStsJEVAA0Pt70ySUyxEOJ7)sPSJZFrpZPBSCO(AlotLi4BL6WI7bTmhxi1llRLYtuXWKI0u7DSD2uePtrMWVZH79Kmkn2esO3XNuvjoI3Ky0gEN6rLbYcLj4S4c0PnIAKxdO4vq86q8mKnOzNfgpHjYx0gFOHITfvQ7bm8SGOfHSkQMfsM6sMoNcgQAc5Mc9dTJcdfe)nX)7E)VBay5e)FXpvf8owCkH4nAL5HRHTqQTI2MzX7Jt)2MSQOh)(If5asF0q8kt56uv8AS9WF292293oqHMxSpKiwh5T84vsZM0uWEJD(tn5Eof7)Sjhgrx(RK5wmYAUZ1i3H62nGugsXes5BcwPLyTHpt43ZEeNiHpeRiDp3HDoJvfXCVWT3fyR)dmrEYmSUCwNZWqYmR57c8bNye7cmOrOKagPkTSPLavjRn2ie)m

Obwohl es in diesem Beispiel nur zwei mögliche Items gibt, würfle ich von 1 bis 100. Wenn ich eine Zahl zwischen 1 und 15 erwürfelt habe (beachte die Effektbedingung), bekommt der Spieler das besondere Item, ansonsten Schrott. 15 von 100 Würfelergebnissen sind also „gut“, das entspricht den 15%, die ich vorher festgelegt habe. Ich hätte auch 86 bis 100 als „gut“ definieren können, nur die Größe des Bereichs ist hier wichtig.

Karten ziehen

Sobald wir mehr als eine Karte aus einem Deck ziehen, müssen wir etwas tiefer in die Trickkiste greifen. Extended muss sich nämlich irgendwie merken, welche Karten bereits gezogen wurden, oder alternativ, welche noch gezogen werden können.

Bevor ich mich darum kümmere, erstelle ich ein Kartendeck-Item für ein Skatdeck, d.h. ich werde 32 innere Items benötigen. Jetzt könnte ich die 32 Items von Hand erstellen… oder ich baue mir fix ein paar Makros.

Kleiner Exkurs in die TRP3-API

Der folgende Teil ist optional. Ihr könnt die inneren Items auch wie gewohnt erstellen.

/run _A = function(id, name) TRP3_ToolFrame.specificDraft.IN[id] = {TY = TRP3_DB.types.ITEM, MD = {MO = TRP3_DB.modes.NORMAL}, BA = {NA = name}} end

Makro Nummer 1 erzeugt eine Funktion, die ein inneres Item mit vorgegebener Id und vorgegebenem Namen erstellt. Das Item muss dabei in der Datenbank geöffnet sein.

/run _V = {"Sieben", "Acht", "Neun", "Zehn", "Bube", "Dame", "König", "As"} _C = {"Herz", "Pik", "Kreuz", "Karo"}

Das zweite Makro enthält die zukünftigen Namen der Karten.

/run local i = 1 for _, v in pairs(_V) do for _, c in pairs(_C) do _A(("card%02d"):format(i), c .. " " .. v) i = i + 1 end end

Das dritte Makro führt letztendlich meine Einfügefunktion 32 Mal aus. Damit man die Items auch sieht, muss man gegebenenfalls einmal ins Übersichtstab und zurück wechseln.

Zurück zum Deck

Wir haben es also irgendwie geschafft, die inneren Items card01 bis card32 zu erstellen.
Bei einem echten Kartenspiel würde man das Deck zuerst mischen, und dann so viele Karten von oben abnehmen, wie benötigt.
Es gibt aber noch eine andere Methode, die zumindest mathematisch gleichwertig ist: Man beginnt mit einem sortierten Deck. Dann würfelt man von 1 bis 32 und entnimmt die Karte an der entsprechenden Position. Für die zweite Karte würfelt man von 1 bis 31 usw.
Diese Methode werde ich vorstellen. In meinem Beispiel soll folgendes passieren:

  • „mische“ den Stapel, d.h. sortiere alle Karten
  • entnehme bis zu 5 Karten
  • nachdem 5 Karten entnommen wurden, entferne alle gezogenen Karten aus dem Spielerinventar und mische neu
Kartendeck !DEv4YnQnq43f3PZKmtQpHSVCjE69dsSN5CsoSRfoPT)qgmOeRAmCJqKEx6uES6lqFX6kjigi1tL7yhzqR(0(PD3Vfc1H6t9CGVObiQhMsqy05ieC7qIJxro1BaScYup1yuOigRqq(8y94mkXBgvsj()cSgyMRCvZ75sjFIjEPmyC4ogyxwHfBh258TDHcSZEOU57b6yjFVvWkac7XksB41JdCt)IFVDqnXPB)7)kL)udwBj6kh)RSnnyn(C7aRJvVXZwMJUnuK1nCHV0oSMZCRS0XKEB7uNHhb02bQbh1zTfF)GDinN0Rkw3OugDHDyR8A0gzdSw636cYwGDSm9ubUnRDSSOYW6ofKdSeRXXTv(iTgCjrnsUMsYsxMRmxH7ExQhcS4txtj)KRQzgzUR6MLEQX5eykNloNsEqp71l02iQXXkBy0aa4eTTzQrYvQX9zpcNTMLcw1U4Hjk)j1CXVMn(Ac4tRc2W(aZmBQA9F(bn)gV0qt4ame(zkL8(VQUybCHcIUbR8GbP6yHLjbtxWwjF8Xv50TTa64sHvXS9vpwwZRjE7cpSLTgmfEDKAw2gTQHuB1ILNyd22f8il7jz4C3GfYY2s6GvxWylJ0gx3nnJpkI3rOAz7fta71M4VQKnk1lXA15v1QXkVjzPXSOTnf64APQryx1iWOVRu2xwRSNc6UWOnC2ZSDSu5QNk4jXFHj2Ukjm(BjfQDUzxdl06eDFj19E6R4XusEKG)fy9HINYngijzrHjLbx7Uy8Q5U((tw4vg8XYGEDErRYavm87r44EL3OW3pB9VXIK9FouKRr82jZeLb)XFwEd)XYG0m5BxsFvmZSUV7a2(ryNXFOmqUHLwEtzWb3KpA8LAfpQ2qUEkNZgGldIZmguFyp(iG8KECjB3kbBx2ZSENz21ZAhhgb7ZUq5j8tbdoie6097ImCDcRppnNjKN8VYiadVcauBuDrLVLSVkB40EJ5mOwxxfvg87fIy1VPSIYGNy745GUVVA5oW(XsYzMnRkZj0NtGNB6lctJZ2DIZzhkCEAlKQeQgS5WyIfh8WioT9zqh)cJJ)pcEkNOJFWFyf)tJRLvW3eEUKw)HeZKH8KCDj8KRxTyIlzM3kqYmDUFv5A3x)xJ7UPkiZw24HVgzozmG483HWVddvbooJqdhHvIqq(syjGAl)h83ictsa9jOyVam1cccnYbnAa8KW7GogQNYkVV6Fgr3dzYpRf5VzZIVh0F9h2FOIl)pEC7NuDCA0DQ7RxqCHlfmOWiFBcpAllfcVf7GSdpTUuQm4fOa6foBJU)ljNfvi4YVDhW0evWus9gUNM0)5

Das ganze funktioniert mit einem Lua-Skripteffekt. Ich habe das Skript kopiert und Zeilennummern hinzugefügt, damit ich jede Zeile einzeln erklären kann. Wenn ihr den Code weiterverwenden wollt, müsst ihr die Zeilennummern löschen.

01 local CARD_PATTERN = "0206001034S1Nus card%02d"
02 args.object.vars = args.object.vars or {}
03 if not args.object.vars.deck or #args.object.vars.deck <= 27 then
04   args.object.vars.deck = {}
05   for i = 1,32 do
06     effect("item_remove", args, CARD_PATTERN:format(i), 1000)
07     table.insert(args.object.vars.deck, i)
08   end
09   effect("text", args, "Die Karten wurden neu gemischt.", 1)
10 else
11   local r = math.random(1, #args.object.vars.deck)
12   local card = table.remove(args.object.vars.deck, r)
13   effect("item_add", args, CARD_PATTERN:format(card), 1, 2)
14 end

Zeile 1
Hier speichere ich die Id einer Spielkarte ab %02d steht als Platzhalter für die Kartennummer. Der erste Teil ist die Id des Kartendecks. Wenn ihr ein eigenes Item baut, müsst ihr diese entsprechend ändern.

Zeile 2
Mit args.object.vars habe ich direkten Zugriff auf die Objektvariablen. Ich muss getVar nicht verwenden und in diesem Fall könnte ich es auch gar nicht, denn meine Variable deck wird eine Tabelle enthalten. Dieser Fall wird von getVar nicht richtig behandelt.
Diese Zeile übernimmt den Fall, dass es noch keine Variablen im Objekt gibt (also Initialisierung).

Zeile 3
Hier prüfe ich, ob mein Deck gespeichert wurde, und wenn ja, wieviele Karten noch darin sind. Es muss gemischt werden, wenn die Variable deck nicht existiert oder 27 oder weniger Karten im Deck sind.

Zeile 4
Bevor ich mische, lege ich einen leeren Kartenstapel an.

Zeile 5
Ich betrete eine Schleife über alle meine 32 möglichen Karten.

Zeile 6
Innerhalb der Schleife entferne ich jede Karte aus dem Inventar. Sollte die Karte gar nicht im Inventar liegen, passiert nichts. Als Vorsichtsmaßnahme werden bis zu 1000 Exemplare einer Karte entfernt. Es könnte nämlich sein, dass der Spieler mehrere Decks im Inventar hat und simultan zieht.

Zeile 7
Hier wird die Tabelle mit verfügbaren Karten gefüllt. nachdem das passiert ist, stehen dort einfach nur die Zahlen 1 bis 32 der Reihe nach.

Zeile 9
Ich gebe dem Spieler den Hinweis, wenn gemischt wird, damit sich niemand wundert, warum die ausgegebenen Karten verschwinden.

Zeile 10
Ab hier wird der Fall behandelt, dass eine Karte gezogen werden soll anstatt gemischt.

Zeile 11
Zuerst würfle ich aus (math.random), welche Karte vom Stapel genommen werden soll. Diese Zahl ist die Kartenposition, nicht die Kartennummer.

Zeile 12
Mit table.remove entnehme ich die Karte an der zuvor ausgewürfelten Position. In der Variable card steht jetzt eine Kartennummer.

Zeile 13
Schließlich muss ich noch die Karte ins Spielerinventar legen. Mit CARD_PATTERN:format(card) erzeuge ich aus der Kartennummer eine Karten-Id.

Uff, so ein Kartendeck zu bauen war dann doch ein ganzes Stück schwieriger als ein paar Würfel. Das liegt daran, dass sich Extended die verfügbaren Karten merken muss. In diesem Fall ist der Lua-Effekt kaum zu vermeiden, denn das ist momentan die einzige Möglichkeit, in Extended Tabellen bzw. Listen zu verarbeiten.


Viel Spaß beim Experimentieren und
:wave: bis zum nächsten Sonntag…

1 Like