=====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: - **_PlayerId** - Die Spieler-Id des Spielers, dem die Quest angezeigt werden soll, also eine ganze Zahl zwischen 1 und 8 - **_QuestId** - Die oben bereits erwähnte, für jede Quest einzigartige Quest-Id - **_QuestType** - Einer der oben gelisteten Questtypen, also ''MAIN''/''SUB''''QUEST_''''OPEN''/''CLOSED'' - **_QuestTitle** - Der Titel der Quest, wie er im Auftragsmenü erscheinen soll, als String - **_QuestText** - Die Questbeschreibung, wie sie im Auftragsmenü erscheinen soll, als String - **_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: - **_PlayerId** - Die Spieler-Id des Spielers, dem die Quest angezeigt werden soll, also eine ganze Zahl zwischen 1 und 8 - **_QuestId** - Die oben bereits erwähnte, für jede Quest einzigartige Quest-Id - **_QuestType** - Einer der oben gelisteten Questtypen, also ''MAIN''/''SUB''''QUEST_''''OPEN''/''CLOSED'' - **_QuestTitle** - Der Titel der Quest, wie er im Auftragsmenü erscheinen soll, als String - **_QuestText** - Die Questbeschreibung, wie sie im Auftragsmenü erscheinen soll, als String - **_PosX** - X-Wert der Quest-Position - **_PosY** - Y-Wert der Quest-Position - **_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 [[ scripting:tutorials:level1:briefings |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: - **_PlayerId** - Die Spieler-Id des Spielers, dem die Quest angezeigt werden soll, also eine ganze Zahl zwischen 1 und 8 - **_QuestId** - Die oben bereits erwähnte, für jede Quest einzigartige Quest-Id - **_PosX** - X-Wert der Quest-Position - **_PosY** - Y-Wert der Quest-Position - **_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: - **_PlayerId** - Die Spieler-Id des Spielers, dem die Quest angezeigt werden soll, also eine ganze Zahl zwischen 1 und 8 - **_QuestId** - Die oben bereits erwähnte, für jede Quest einzigartige Quest-Id - **_QuestType** - Einer der oben gelisteten Questtypen, also ''MAIN''/''SUB''''QUEST_''''OPEN''/''CLOSED'' - **_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: - **_PlayerId** - Die Spieler-Id des Spielers, dem die Quest angezeigt werden soll, also eine ganze Zahl zwischen 1 und 8 - **_QuestId** - Die oben bereits erwähnte, für jede Quest einzigartige Quest-Id - **_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. [[ scripting:tutorials:level2:tribute| Voriges Kapitel: Tribute ]] \\ [[ scripting:tutorials:level2:chests | Nächstes Kapitel: Schatztruhen ]] \\ [[ scripting:tutorials:level2:quest_menu | Zurück nach oben ]]