Oblivion:Gescriptete Konversation zwischen NPCs

Aus Skript-Wiki
Wechseln zu: Navigation, Suche

Allgemeines

Eine einfache gescriptete Konversation zwischen zwei NPCs ist recht einfach herzustellen. Aber drei oder mehr NPCs, die alle zusammen reden, besonders wenn du willst, dass sie noch etwas anderes tun außer still zu stehen, ist da schon etwas komplizierter. Hier wollen wir nun das Thema etwas durchleuchten und fangen natürlich mit dem einfachsten an.


Eine grundlegende gescriptete Konversation zwischen zwei NPCs erstellen

Es gibt zwei einfache Wege um zwei NPCs miteinander reden zu lassen:

  • Ein NPC mit einem Find Package wird automatisch die Konversation mit dem angepeilten NPC beginnen. Es beginnt mit dem HELLO Konversations-Thema (Topic). Das ist der selbe Weg, wie NPCs auch die zufälligen Unterhaltungen miteinander führen.
  • Durch Benutzung von StartConversation kann man eine Konversation beginnen lassen. Das ist hilfreich, wenn man eine Konversation mit einem bestimmten Thema starten will (Also nicht mit "HELLO").


Wenn man eine Konversation zwischen zwei NPCs erzwingen will, muss man die Dialog-Infos hinzufügen, welche das Thema benötigt, so dass eine sinngemäße Konversation stattfinden kann. Im Grunde wird dabei folgendermaßen vorgegangen:


1. Der einfachste Weg, um eine Konversation herzustellen, ist ein neues Topic für jede Antwort auf dem Conversation-Reiter des Quest Window zu erstellen. Erstelle eine Info unter jedem Topic und benutze "Link To" und "Link From" Felder um die Infos so zu verlinken, in welcher Reihenfolge sie gesprochen werden sollen. Dieses ist eine nette Lösung für kleinere Unterhaltungen. Aber für jede Info ein neues Topic zu erstellen, wird bei längeren Konversationen sehr aufwendig sein.


2. Ein etwas komplizierterer Weg (und der Weg, der bei Oblivion für die meisten Konversationen genutzt wird), ist einen einzelnen Topic zu benutzen, wo die Infos an eine Variable geknüpft sind, die aufsteigend im Results-Feld jeder Info angegeben wird. Schaue im Conversations-Reiter auf die Quest "MSConversations" in der Oblivion-Masterfile, um einige Beispiele zu sehen, wie das gemacht wurde. Die wichtigsten Schritte sind wie folgt:

  • Als erstes musst du die Konversation in einer Quest erstellen, die als "Allow repeated Conversation topics" markiert wurde (Siehe Quest-Data Reiter. Normalerweise wird das Spiel innerhalb einer Konversation nicht zweimal das selbe Thema ansprechen (Um Wiederholungen in zufälligen Unterhaltungen zu vermeiden), aber in diesem Fall wollen wir das selbe Topic weiter bearbeiten, wie in unserem Script gedacht (In unserem Beispiel "MSConversations" ist eine Quest die für gescriptete Konversation für verschiedene Quests gedacht ist).
  • Im Conversations-Reiter erstelle ein Topic für deine Konversation (z.B. bei MS40Conversation). Nun erstelle die Anfangs-Info deiner Conversation (Ich gehe davon aus, dass du "StartConversation" benutzt. Wenn du "Find Package" benutzt, wird die erste Info ein HELLO sein, welches dann auf dein gewünschtes Topic verlinkt).
  • Erstelle eine Quest Variable, um den Fortschritt der Konversation einen festen Pfad zuzuordnen (z.B. MS40.convo). Verbinde die erste Info mit dieser Variable (GetQuestVariable MS40.convo=0), sowie alle weiteren Variablen, die gebraucht werden (z.B. GetIsID, GetStage usw).
  • Stelle sicher, das "Run immediately" aktiviert ist. Das sagt dem Spiel, dass es den Ablauf startet, wenn die Konversation erstellt ist, statt wenn es gesprochen wird. Ohne diese Aktivierung würde unsere Variable nicht erhöht werden und unsere Konversation würde nicht laufen.
  • Im "Link To" Feld füge deine erstellten Conversation Topics hinzu - dabei werden wir das Topic mit sich selbst verlinken während der ganzen Konversation. Wenn das der Start der Konversation ist, lasse das "Link From" Feld frei.
  • Im Results-Feld erhöhe deine Variable (z.B. Setze MS40.convo auf MS40.convo+1), so dass die nächste Info (die wir gleich erstellen) nun die Bedingungen erfüllt.
  • Vorausgesetzt du willst, dass der NPC aufhört zu sprechen, belasse den "Next Speaker" als "Target" (wenn du willst, das der NPC mehr als eine Zeile spricht, kannst du das in "Self" umwandeln)
  • Jetzt wo wir eine ganz gute Schablone erstellt haben, kopiere sie und ändere den Text zum nächsten Thema der Conversation. Wir müssen darüber hinaus nur noch zwei Änderungen vornehmen:
    • Füge unser erstelltes Topic dem "Link From" Feld hinzu (So das es mit der ersten Info verbunden ist)
    • Ändere die Condition (Bedingung) (z.B. GetQuestVariable MS40.conv==1)
  • Wiederhole diesen Prozess bis deine Konversation beendet ist. Die letzte Info sollte das "Link To" Feld frei behalten und das "Goodbye"-Feld sollte aktiviert werden, um anzugeben, das dieses das Ende der Conversation ist (Andernfalls wird sich das Spiel automatisch ein zufälliges GOODBYE suchen)


Erstelle eine Rede eines einzelnen NPCs

Um einem NPC eine "Rede" halten zu lassen (wo er der einzige ist, der redet), sind ähnliche Vorgehensweisen wie oben beschrieben erforderlich. Du kannst ebenfalls "StartConversation" benutzen, um dem NPC den Befehl zu geben, sich mit sich selbst zu unterhalten (z.B. BurdRef.StartConversation BurdRef) oder die Konversation erstellen, so dass alle Infos "Next Speaker: Self" sind (z.B. auch wenn ein zweiter NPC anwesend ist, der aber nichts sagt).


Erstellten einer Konversation zwischen mehreren NPCs

Um mehr als zwei NPCs miteinander reden zu lassen, oder miteinander reden zu lassen und dabei zu gehen, bedeutet den Konversations-Generator komplett zu vergessen und alles per Scripts zu machen. Die Schlüssel-Befehle sind "Say" und "SayTo" in Kombination mit Script-Timern, die steuern, wann es Zeit ist für den anderen NPCs zu sprechen. Alle NPC Konversationen in der Charakter-Erstellungs Sequenz sind so hergestellt worden.

  • Erstelle ein Quest Script, um den Haupt-Timer zu starten und verbinde die Konversation-Variablen (Siehe CharGenQuest Script). Der Haupt-Timer ist ein Standard Script Timer:


<tesscript> begin gamemode

    ; count down timer
    if convTimer > 0
    set convTimer to convTimer - getSecondsPassed
    endif

end </tesscript>



  • Erstelle eine Variable im Quest Script um den NPC zu verbinden, der als nächstes dran ist zu sprechen. Als Beispiel im CharGenQuest Script:

<tesscript>

Wird in Konversations-Scripts genutzt um anzugeben, wer dran ist zu sprechen.

short speaker

short target

1 = Baurus
2 = Renote
3 = Glenroy
4 = Emperor
5 = player (als target)

</tesscript>


  • In jedem NPC-Script füge eine Sektion hinzu, die nach der Quest -Variable sieht, ob er dran ist zu sprechen. [[ob:Say|Say] und SayTo gibt die Zeit in Sekunden zurück, die der angegebene Dialog braucht, um ausgesprochen zu werden. So wird das NPC-Script die Quest-Timer-Variable richtig setzen. Als Beispiel in Glenroy's Script:


<tesscript> begin gamemode

talk when it is time

if CharacterGen.speaker == 3 && CharacterGen.convTimer <= 0

    set target to CharacterGen.target
    if target == 0
         set CharacterGen.convTimer to Say CharGenMain 1
    elseif target == 1
         set CharacterGen.convTimer to SayTo BaurusRef, CharGenMain 1
    elseif target == 2
         set CharacterGen.convTimer to SayTo RenoteRef, CharGenMain 1
    elseif target == 3
         set CharacterGen.convTimer to SayTo GlenroyRef, CharGenMain 1
    elseif target == 4
         set CharacterGen.convTimer to SayTo UrielSeptimRef, CharGenMain 1
    elseif target == 5
         set CharacterGen.convTimer to SayTo player, CharGenMain 1
    endif 

endif

end </tesscript>


Der letzte Schritt ist dann, den Dialog zu erstellen. Jede Info sollte an den Sprecher und eine Variable geknüpft sein (so dass du einen einzelnen Topic in deinem Script benutzen kannst, z.B. CharGenMain). Das Results-Feld jeder Info erhöht die verknüpfte Variable und setzt den Sprecher und die Target-Variable (wenn erforderlich) für den nächsten Sprecher. Als Beispiel:

<tesscript> set characterGen.convCount to characterGen.convCount + 1

set characterGen.speaker to 1 ; Baurus

set characterGen.target to 2 ; Renote </tesscript>


Schau dir die Quests "CharakterGen" und den "CharGenMain" Topic für ein umfassendes Beispiel an.

Links