Dorf-Charaktere steuern

Aus Sternenschweif Wiki
Version vom 26. Oktober 2016, 17:48 Uhr von Chrisfirefox (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Um ein Dorf bzw. eine Stadt zu beleben, sind NPCs unerlässlich. Diese können mit Sternenschweif HD relativ einfach gemodded werden, sie können an bestimmte Orte permanent platziert oder zum Herumwandern gebracht werden, sie haben einen "Tagesablauf" und Zugriffsfunktionen, die es ermöglichen, Ihnen Stichwortdialoge oder spezifische Dialoge zuzuweisen.

Grundlagen

Dorf-NPCs werden über die "Gebäudeereignisse" definiert, ihr Typ muss "Person" sein. Sie müssen eine im Dorf eindeutige Ereignis-ID haben. Die restlichen Parameter:

  • SubID (UT2) ist der Übersetzungsschlüssel für den Namen, zB "kvir_ancoron_name", dieser erscheint beim Tooltip und einem etwaigen SchlüsselwortDialog
  • Schlüsselwortdlg (UT3) ist der Schlüsselwortdialog, der beim Anklicken des Charakters aufgerufen wird. Der Standardname wird automatisch durch einen etwaigen definierten Namen ersetzt
  • Trigger kann für einen einfachen Start eines Standard-Dialogs verwendet werden

Außerdem muss der Datentyp auf "Skript" gestellt werden, damit zumindest die Dauerposition des Charakters definiert wird (Ausnahme: Vordefinierte Charaktere, die nur verändert werden)

function getSchedule() {
	return [{time:0,location:{x:20,y:10,z:30}}];
}
 
function getChardef() {
	return "humanmalebartender";
}
  • time:0 ist wichtig, damit der Eintrag rund um die Uhr gilt
  • location sind Koordinaten im obigen Format, bitte auf korrekte y-Koordinate achten
  • getChardef liefert die Charakterdefinition zurück, diese kann entweder ein Charakter Template oder eine Charakterdefinition direkt aus dem Editor sein

Fortgeschrittenes Modding

Neben den obigen Grundfunktionen bietet das Charaktermodding auch noch eine Reihe weiterer Funktionen für maximale Flexibilität im Modding. Es können folgende Funktionen im Charakter definiert werden:

function getSchedule() {
	// der Ablaufplan für den Charakter
	return [{time:0,location:{x:20,y:10,z:30}}];
}
 
function getName() {
	// Name des Charakters zurückliefern
	return getLoca( "kvir_dwarf" );
}
 
function getChardef() {
	// Charakterdefinition
	return "dwarfmale";
}
 
function onClick() {
	// Ausgeführt wenn der Charakter angeklickt wird
	return true;
}

WICHTIG: (Hilfs-)Funktionsdefinitionen außerhalb dieser Definition sollten nach Möglichkeit vermieden werden, da hier mit einem System gearbeitet wird, um das normalerweise übliche "gegenseitige Überschreiben von Funktionen im Dorfkontext" wie zB bei Dialogen üblich zu vermeiden.

Der Ablaufplan

Diese Funktion wird einmal bei Initialisierung des Charakters (betreten des Dorfes oder reloadXML) aufgerufen. Sie liefert einen Plan zurück, wann der Charakter wo sein soll. Zurückgeliefert wird ein Array aus Datenobjekten, beispielsweise so:

function getSchedule() {
	return [
		{time:0,location:{x:26,y:20,z:-28},visible:false},
		{time:8,location:{x:57,y:6,z:-19}},
		{time:10,location:{x:77,y:7,z:-40}},
		{time:12,location:{x:26,y:20,z:-28}},
		{time:14,location:{x:77,y:7,z:-40}},
		{time:16,location:{x:57,y:6,z:-19},rotation:270},
		{time:18,location:{x:77,y:7,z:-40},rotation:90},
		{time:22,location:{x:27,y:21,z:-29},visible:false}
	];
}
  • time: Die Uhrzeit, ab der die Position erreicht werden soll (also das "losgehen" von der vorherigen Position), 8:30 Uhr wäre zB 8,5
  • location: Die Koordinaten. y-Koordinate sollte so genau wie möglich sein, da diese auch für die Initialplatzierung verwendet wird
  • visible: optional, standard true ob der Charakter an dieser Position zu dieser Zeit sichtbar ist, zB um 22 Uhr erscheint er vor der Taverne, geht nach Hause und verschwindet dort wieder
  • rotation: optional die Ausrichtung des Charakters nach seiner Ankunft, 0 = Norden, 180 = Süden

time und location sind verpflichtend, ohne diese wird der Eintrag ignoriert.

Gibt es nur einen Eintrag, so bewegt sich der Charakter nicht im Dorf herum, sondern steht einfach immer am entsprechenden Platz

Um einen Charakter ganz verschwinden zu lassen, z.B. wenn ein bestimmter SpecialState oder Quest Step erfüllt ist, verwendet man folgenden Schedule:

{time:0,location:{x:0,y:1,z:0},visible:false}

getChardef: Variable Charakterdefinition

Wenn gewünscht, kann in getChardef auch entsprechende Logik umgesetzt werden, um zB einen von X verschiedenen Definitionen für eine bestimmte ID zu spawnen. Die Funktion muss in jedem Fall eine Zeichenkette mit einem gültigen Charakter zurückliefern.

getName: Variable Namensdefinition

Wenn getName definiert ist, wird der vorgegebene Name aus der UT2 mit dem entsprechenden Ergebnis dieser Funktion überschrieben. Die Funktion muss in jedem Fall eine Zeichenkette zurückliefern, ansonsten wird ihr Ergebnis ignoriert.

onClick

Sollte der einfache Aufruf eines Dialogs (trigger) oder Stichwortdialogs (ut3) nicht ausreichend sein, kann mittels onClick eine eigene Definition für die Reaktion auf ein Click-Ereignis definiert werden. Dieses hat Vorrang vor trigger und ut3, muss allerdings den Wert true zurückliefern.

Besonderheit: Objektvariablen

Durch den besonderen Aufbau der Verwendung bei den Dorfcharakteren ist es nicht möglich, im Skript auf globale Variablen zuzugreifen. Stattdessen müssen Objektvariablen verwendet werden:

// anstatt
var wert = 123;
// muss innerhalb der Funktionen so etwas verwendet werden:
this.wert = 123

Diese bleiben innerhalb der Funktionen zugriffsfähig. Außerdem sind folgende Variablen vordefiniert:

  • id die ID des aktuellen Charakters, entspricht der EreignisID
  • charvar die Bezeichnung des globalen Objekts, mit dem auf aktuellen Funktionen von außerhalb zugegriffen werden könnte, enthält zB "TOWNCHAR7". Dann könnte mittels TOWNCHAR7.wert auf den entsprechenden Wert auch von zB einem Dialog aus zugegriffen werden.

Aufrufreihenfolge

Die definierten Funktionen werden in folgender Reihenfolge und Häufigkeit aufgerufen:

  1. getSchedule: Erste überhaupt aufgerufene Funktion, kann auch zur Initialisierung von Objektvariablen genutzt werden
  2. getChardef: Unmittelbar danach aufgerufen
  3. getName: Falls vorhanden wird sie bei Bedarf aufgerufen, zB für einen Tooltip oder für die Anzeige einer Dialogkopfzeile
  4. onClick: Falls vorhanden wird sie bei Klick des Spielers aufgerufen