Oblivion:Gescriptete Konversation zwischen NPCs: Unterschied zwischen den Versionen
Keris (Diskussion | Beiträge) K |
Keris (Diskussion | Beiträge) K |
||
Zeile 18: | Zeile 18: | ||
− | 1. Der einfachste Weg um eine Konversation herzustellen ist ein neues [[ob:Topic|Topic]] für jede Antwort auf dem [[ob:Oblivion:Dialog#Conversation_Reiter|Conversation-Reiter]] des [[ob:Quest Window|Quest Window]] zu erstellen. Erstelle eine Info unter jedem [[ob:Topic|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 [[ob:Topic|Topic]] zu erstellen, wird bei längeren Konversationen sehr aufwendig sein. | + | 1. Der einfachste Weg, um eine Konversation herzustellen, ist ein neues [[ob:Topic|Topic]] für jede Antwort auf dem [[ob:Oblivion:Dialog#Conversation_Reiter|Conversation-Reiter]] des [[ob:Quest Window|Quest Window]] zu erstellen. Erstelle eine Info unter jedem [[ob:Topic|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 [[ob:Topic|Topic]] zu erstellen, wird bei längeren Konversationen sehr aufwendig sein. |
Zeile 25: | Zeile 25: | ||
* Als erstes musst du die Konversation in einer Quest erstellen, die als "Allow repeated Conversation topics" markiert wurde (Siehe [[Oblivion:Quest_Data_Window|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 [[ob:Topic|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). | * Als erstes musst du die Konversation in einer Quest erstellen, die als "Allow repeated Conversation topics" markiert wurde (Siehe [[Oblivion:Quest_Data_Window|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 [[ob:Topic|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 [[Oblivion:Dialog#Conversation_Reiter|Conversations-Reiter]] erstelle ein [[ob:Topic|Topic]] für deine Konversation (z.B. bei MS40Conversation). Nun erstelle die Anfangs-Info deiner Conversation (Ich gehe davon aus, dass du "[[ob:StartConversation|StartConversation]]" benutzt. Wenn du "Find Package" benutzt, wird die erste Info ein HELLO sein, welches dann auf dein gewünschtes [[ob:Topic|Topic]] verlinkt). | + | * Im [[Oblivion:Dialog#Conversation_Reiter|Conversations-Reiter]] erstelle ein [[ob:Topic|Topic]] für deine Konversation (z.B. bei MS40Conversation). Nun erstelle die Anfangs-Info deiner Conversation (Ich gehe davon aus, dass du "[[ob:StartConversation|StartConversation]]" benutzt. Wenn du "[[ob:Find Package|Find Package]]" benutzt, wird die erste Info ein HELLO sein, welches dann auf dein gewünschtes [[ob:Topic|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). | + | * Erstelle eine [[ob:Quest Variable|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. | * 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. | ||
Zeile 33: | Zeile 33: | ||
* Im "Link To" Feld füge deine erstellten Conversation [[ob:Topic|Topics]] hinzu - dabei werden wir das [[ob:Topic|Topic]] mit sich selbst verlinken während der ganzen Konversation. Wenn das der Start der Konversation ist, lasse das "Link From" Feld frei. | * Im "Link To" Feld füge deine erstellten Conversation [[ob:Topic|Topics]] hinzu - dabei werden wir das [[ob:Topic|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 | + | * 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 | + | * Vorausgesetzt du willst, dass der [[ob:NPC|NPC]] aufhört zu sprechen, belasse den "Next Speaker" als "Target" (wenn du willst, das der [[ob:NPC|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: | * 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 | + | ** Füge unser erstelltes [[ob:Topic|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) | + | **Ändere die [[ob:Condition|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) | * 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) | ||
Zeile 49: | Zeile 49: | ||
− | Um einem [[ob:NPC|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 [[ob:NPC|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 [[ob:NPC|NPC]] anwesend ist, der aber nichts sagt). | + | Um einem [[ob:NPC|NPC]] eine "Rede" halten zu lassen (wo er der einzige ist, der redet), sind ähnliche Vorgehensweisen wie oben beschrieben erforderlich. Du kannst ebenfalls "[[ob:StartConversation|StartConversation]]" benutzen, um dem [[ob:NPC|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 [[ob:NPC|NPC]] anwesend ist, der aber nichts sagt). |
Zeile 55: | Zeile 55: | ||
− | Um mehr als zwei [[ob:NPC|NPCs]] miteinander reden zu lassen, oder miteinander reden zu lassen und dabei zu gehen, bedeutet den Konversations-Generator konmplett 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 [[ob:NPC|NPCs] zu sprechen. Alle [[ob:NPC|NPC]] Konversationen in der Charakter-Erstellungs Sequenz sind so hergestellt worden. | + | Um mehr als zwei [[ob:NPC|NPCs]] miteinander reden zu lassen, oder miteinander reden zu lassen und dabei zu gehen, bedeutet den Konversations-Generator konmplett zu vergessen und alles per Scripts zu machen. Die Schlüssel-Befehle sind "[[ob:Say|Say]]" und "[[ob:SayTo|SayTo]]" in Kombination mit Script-Timern die steuern, wann es Zeit ist für den anderen [[ob:NPC|NPCs] zu sprechen. Alle [[ob:NPC|NPC]] Konversationen in der Charakter-Erstellungs Sequenz sind so hergestellt worden. |
− | * Erstelle ein Quest Script um den Haupt-Timer zu starten und | + | * Erstelle ein Quest Script, um den [[ob:Timer|Haupt-Timer]] zu starten und verbinde die Konversation-Variablen (Siehe CharGenQuest Script). Der [[ob:Timer|Haupt-Timer]] ist ein Standard Script [[ob:Timer|Timer]]: |
Zeile 77: | Zeile 77: | ||
− | * Erstelle eine Variable im Quest Script um den NPC zu verbinden, der als nächstes dran ist zu sprechen. Als Beispiel im CharGenQuest Script: | + | * Erstelle eine Variable im Quest Script um den [[ob:NPC|NPC]] zu verbinden, der als nächstes dran ist zu sprechen. Als Beispiel im CharGenQuest Script: |
<tesscript> | <tesscript> | ||
Zeile 102: | Zeile 102: | ||
* | * | ||
− | In jedem | + | In jedem [PC-Script füge eine Sektion hinzu, die nach der [[ob:quest variable|Quest -Variable]] sieht, ob er dran ist zu sprechen. [[ob:Say|Say] und [[ob:SayTp|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: |
Zeile 147: | Zeile 147: | ||
− | 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: | + | 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 [[ob:Topic|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> | <tesscript> |
Version vom 21. August 2008, 14:35 Uhr
Inhaltsverzeichnis
Gescriptete Konversation zwischen NPCs
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:
- 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 konmplett 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 [[ob:NPC|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 [PC-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.