Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level2:quest_menu

Das Auftragsmenü

Das Auftragsmenü ist für den Spieler ein wichtiger Überblick über alle offenen und erledigten Aufgaben. Für eine Karte mit einer Fülle an Quests solltest du als Skripter das Auftragsmenü dementsprechend gut pflegen und alle notwendigen Informationen zur Lösung der Quests darin aufschreiben.

Um die Quests voneinander zu unterscheiden, muss jede Quest eine eindeutige Id haben (i.d.R. beginnend bei 1). Um die Übersicht zu wahren, ist es ratsam, für jede Quest-Id eine Variable anzulegen, die die Quest-Id für dich besser nachvollziehbar macht. Es bietet sich beispielsweise an, die Quest-Ids in einem Table zu speichern:

Quests = {
    MainquestFindHelias = 1,
    MainquestBuildTowers = 2,
    MainquestDefeatKerberos = 3,
    SubquestHelpLeonardo = 4,
    SubquestRescueTrader = 5
}

Diese Quest-Ids werden weiter unten in den Quest-Funktionen verwendet, um Questlogeinträge anzulegen und zu aktualisieren.

Wichtig: Beachte, dass das Spiel maximal 8 Quests gleichzeitig darstellen kann! Wenn du beispielsweise 10 Quests anlegst, werden nur die 8 angezeigt, die du zuerst ins Questlos eingetragen hast.

Jede Quest hat außerdem einen Typ. Es gibt Hauptaufgaben (im Questlog mit rötlichem Symbol) und Nebenaufgaben (im Questlog mit gelblichem Symbol). Beide Aufgabentypen können entweder offen oder gelöst sein. Dafür gibt es vorgefertigte Variablen, die das ausdrücken:

MAINQUEST_OPEN -- Variable für offene Hauptaufgabe
MAINQUEST_CLOSED -- Variable für gelöste Hauptaufgabe
SUBQUEST_OPEN -- Variable für offene Nebenaufgabe
SUBQUEST_CLOSED -- Variable für gelöste Nebenaufgabe

Für die Spiellogik ist es nicht von Belang, welchen Questtyp du wählst. Für die Übersicht des Spielers kann es aber helfen, die Quests entsprechend den Bestimmungen deines Kartenablaufs anzuzeigen.


Eine Quest anlegen

Es gibt zwei verschiedene Funktionen, mit denen sich Quests anlegen lassen. Diese unterscheiden sich aber nur marginal.

Logic.AddQuest

Mit Logic.AddQuest(_PlayerId, _QuestId, _QuestType, _QuestTitle, _QuestText, _Info) kann eine neue Quest ins Questlog eingetragen werden oder eine bereits vorhandene verändert. Die Parameter sind:

  1. _PlayerId - Die Spieler-Id des Spielers, dem die Quest angezeigt werden soll, also eine ganze Zahl zwischen 1 und 8
  2. _QuestId - Die oben bereits erwähnte, für jede Quest einzigartige Quest-Id
  3. _QuestType - Einer der oben gelisteten Questtypen, also MAIN/SUBQUEST_OPEN/CLOSED
  4. _QuestTitle - Der Titel der Quest, wie er im Auftragsmenü erscheinen soll, als String
  5. _QuestText - Die Questbeschreibung, wie sie im Auftragsmenü erscheinen soll, als String
  6. _Info - Entweder 0 oder 1. Bei 1 entsteht am linken Bildschirmrand eine Notiz „Neuer Auftrag“ und der Mentor verkündet den Erhalt eines neuen Auftrags

Die erste Hauptaufgabe, Helias zu finden, könnte also so ins Questlog eingetragen werden:

Logic.AddQuest(1, Quests.MainquestFindHelias, MAINQUEST_OPEN, "Findet Helias", "Irgendwo in Crawford "..
    .."muss Helias zu finden sein. Sucht nach Ihm!", 1)

Logic.AddQuestEx

Logic.AddQuestEx(_PlayerId, _QuestId, _QuestType, _QuestTitle, _QuestText, _PosX, _PosY, _Info) unterscheidet sich von Logic.AddQuest nur dadurch, dass zusätzlich eine Position für die Quest angegeben werden kann. Die ist aber nur relevant, wenn _Info 1 ist. In dem Fall kann der Spieler mit einem Klick auf den Quest-Hinweis am linken Bildschirmrand die Kamera zur Position der Quest bewegen. Dementsprechend ähnlich sind die Parameter:

  1. _PlayerId - Die Spieler-Id des Spielers, dem die Quest angezeigt werden soll, also eine ganze Zahl zwischen 1 und 8
  2. _QuestId - Die oben bereits erwähnte, für jede Quest einzigartige Quest-Id
  3. _QuestType - Einer der oben gelisteten Questtypen, also MAIN/SUBQUEST_OPEN/CLOSED
  4. _QuestTitle - Der Titel der Quest, wie er im Auftragsmenü erscheinen soll, als String
  5. _QuestText - Die Questbeschreibung, wie sie im Auftragsmenü erscheinen soll, als String
  6. _PosX - X-Wert der Quest-Position
  7. _PosY - Y-Wert der Quest-Position
  8. _Info - Entweder 0 oder 1. Bei 1 entsteht am linken Bildschirmrand eine Notiz „Neuer Auftrag“ und der Mentor verkündet den Erhalt eines neuen Auftrags. Mit einem Klick auf die Notiz springt die Kamera zur Quest-Position

Wenn der Spieler in einer Mission beispielsweise einige Ballistatürme an einer bestimmten Position errichten soll, kann man die Position mit in die Quest geben. Wir gehen im Beispiel unten davon aus, dass auf der Map eine ScriptEntity mit dem Skriptnamen „QuestBuildTowers“ existiert.

local PositionQuestBuildTowers = GetPosition("QuestBuildTowers")
Logic.AddQuestEx(1, Quests.MainquestBuildTowers, MAINQUEST_OPEN, "Baut drei Ballistatürme", "Um die Verteidigung "..
    "der Stadt zu stärken, solltet Ihr an der angegebenen Position drei Ballistatürme bauen.",
    PositionQuestBuildTowers.X, PositionQuestBuildTowers.Y, 1)

Beachte, dass die Angabe der Position in der Quest keinerlei Auswirkungen hat außer den Kamerasprung beim Klick auf das Info-Symbol. Eine Markierung, wie beispielsweise durch ein Briefing, müsste an anderer Stelle gesetzt werden.


Eine Quest ändern

Weitere Informationen, die ein Spieler über eine Quest sammelt, sollten ebenfalls im Questlog festgehalten werden. Wenn der Spieler eine Aufgabe löst, sollte das im Questlog entsprechend dargestellt werden.

Logic.AddQuest

Logic.AddQuest kann nicht nur dafür verwendet werden, eine neue Quest einzutragen, sondern auch eine vorhandene zu verändern. Die Parameter bleiben die gleichen.
Das ist auch der Grund, warum es wichtig ist, die Quest-Ids sauber zu trennen. Wenn du in der Funktion die falsche Quest-Id angibst, überschreibst du u.U. den Eintrag einer existierenden Quest oder legst eine Quest doppelt an.

Um das Beispiel mit Helias fortzuführen: Möglicherweise kann der Spieler einen Arbeiter ansprechen, der Helias vor kurzem gesehen hat und dadurch seine Position näher eingrenzen kann. Ein weiterer Aufruf von Logic.AddQuest mit den gleichen Parametern, aber anderem Quest-Text, kann das bewerkstelligen:

-- Mit @cr im String kannst du einen "carriage return", also einen Sprung in die nächste Zeile forcieren
Logic.AddQuest(1, Quests.MainquestFindHelias, MAINQUEST_OPEN, "Findet Helias", "Irgendwo in Crawford "..
    .."muss Helias zu finden sein. Sucht nach Ihm! @cr @cr Ein Arbeiter erzählte Euch, dass "..
    "er Helias zuletzt in der Nähe des Friedhofs gesehen hat.", 0)

Durch die Angabe eines anderen Questtyps kann diese Quest beispielsweise auch mit Logic.AddQuest geschlossen werden. Die Funktion Logic.SetQuestType ist dafür aber geeigneter.

Das Verändern vorhandener Quests funktioniert analog mit Logic.AddQuestEx.

Logic.SetQuestPosition

Mit Logic.SetQuestPosition(_PlayerId, _QuestId, _PosX, _PosY, _Info) kann einer existierenden Quest nachträglich eine Position gegeben werden (so als wäre sie mit Logic.AddQuestEx erzeugt worden). Auch das bewirkt nur den Kamerasprung beim Klick auf das Info-Symbol. Die Parameter sind:

  1. _PlayerId - Die Spieler-Id des Spielers, dem die Quest angezeigt werden soll, also eine ganze Zahl zwischen 1 und 8
  2. _QuestId - Die oben bereits erwähnte, für jede Quest einzigartige Quest-Id
  3. _PosX - X-Wert der Quest-Position
  4. _PosY - Y-Wert der Quest-Position
  5. _Info - Entweder 0 oder 1. Bei 1 entsteht am linken Bildschirmrand eine Notiz „Neuer Auftrag“ und der Mentor verkündet den Erhalt eines neuen Auftrags. Mit einem Klick auf die Notiz springt die Kamera zur Quest-Position

Auf der Suche nach Helias begegnet der Spieler einem Kundschafter, der ihn direkt auf einen nahen Hügel verweist, auf dem er Helias mit seinem Fernrohr bereits sehen kann:

local PositionHelias = GetPostion("Helias")
Logic.SetQuestPosition(1, Quests.MainquestFindHelias, PositionHelias.X, PositionHelias.Y, 1)

Logic.SetQuestType

Mit Logic.SetQuestType(_PlayerId, _QuestId, _QuestType, _Info) kann der Typ einer existierenden Quest nachträglich geändert werden. Normalerweise wird das benutzt, um den Typ einer Quest von _OPEN nach _CLOSED zu setzen. Eine Quest von einer Sub- zu einer Mainquest zu machen, ist zwar möglich, i.d.R. aber nicht sinnvoll. Die Parameter sind:

  1. _PlayerId - Die Spieler-Id des Spielers, dem die Quest angezeigt werden soll, also eine ganze Zahl zwischen 1 und 8
  2. _QuestId - Die oben bereits erwähnte, für jede Quest einzigartige Quest-Id
  3. _QuestType - Einer der oben gelisteten Questtypen, also MAIN/SUBQUEST_OPEN/CLOSED
  4. _Info - Entweder 0 oder 1. Bei 1 entsteht am linken Bildschirmrand eine Notiz „Neuer Auftrag“ und der Mentor verkündet den Erhalt eines neuen Auftrags

So kann die Helias-Quest beendet werden, wenn der Spieler ihn endlich findet:

Logic.SetQuestType(1, Quests.MainquestFindHelias, MAINQUEST_CLOSED, 1)

Eine Quest entfernen

Logic.RemoveQuest(_PlayerId, _QuestId, _Info) entfernt eine Quest wieder aus dem Auftragsmenü. Sie wird also nicht als „erledigt“ markiert, sondern komplett daraus gelöscht. Das ist vor allem nützlich, wenn man mit mehr als 8 Quests arbeitet und lange irrelevant gewordene Quest entfernen möchte, um neuen Platz im Questlog frei zu machen. Andernfalls ist es für den Spieler übersichtlicher, wenn erledigte Quest nicht ohne guten Grund aus dem Menü verschwinden. Die Parameter sind:

  1. _PlayerId - Die Spieler-Id des Spielers, dem die Quest angezeigt werden soll, also eine ganze Zahl zwischen 1 und 8
  2. _QuestId - Die oben bereits erwähnte, für jede Quest einzigartige Quest-Id
  3. _Info - Entweder 0 oder 1. Bei 1 entsteht am linken Bildschirmrand eine Notiz „Neuer Auftrag“ und der Mentor verkündet den Erhalt eines neuen Auftrags

Die wichtigsten Aspekte der Questprogrammierung sind hiermit alle beschrieben. In den folgenden Kapiteln wollen wir untergeordnete Aspekte betrachten und beginnen bei Schatztruhen.

Voriges Kapitel: Tribute
Nächstes Kapitel: Schatztruhen
Zurück nach oben

scripting/tutorials/level2/quest_menu.txt · Zuletzt geändert: 2023/11/15 15:21 von fritz_98