Gruppenmitglieder anwerben

Unser Held fühlt sich einsam, und da der Hund uns schon beim Testen so brav geholfen hat, werden wir ihn jetzt als ersten Gefährten mitnehmen.
Ich richte mich bei meiner Vorgehensweise nach dem Follower Tutorial aus der Wiki und zwar nach der erweiterten Version, um später alle Möglichkeiten offen zu haben.

  1. Der Gefährte
  2. Der Dialog
  3. Plot zur Gruppe erstellen
  4. Die Bühne
  5. GDAs – PartyPicker
  6. Programmierung
  7. PopUp-Fenster – Talktable


Der Gefährte

Dieser Gefährte soll der schon angelegte Hund sein. Siehe „Creature erstellen“ .Wichtig sind hier die Einstellungen unter Class sowie die Einstellungen im Package Type und in der AI als PartyMember, Rank als Player.

Der Dialog

Das nächste, was ich erstelle, wird eine Unterhaltung mit dem Hund sein, in der ich ihn auffordere, mit mir zu kommen. Diese Aufforderung löst dann das Event aus, den Hund in die Gruppe zu nehmen.
Die Convo muss dem Hund natürlich unter Conversation zugeordnet werden.

Um einen besseren Übergang zu dieser Konversation zu erhalten, ändere ich die Unterhaltung mit Edwina dahingehend ab, dass sie zunächst den Willkommensgruss unterbricht und auf den Hund schimpft bzw verlangt, dass man hin hinausbefördert. In der Zeile, in der dann das Quest angenommen wird, sagt sie zum Abschluss „vielleicht kann euch ja der Hund helfen, dann ist er wenigstens nützlich“. Nun kann ich mich entscheiden, ob ich mit dem Hund sprechen will, um ihn als Begleiter zu erhalten oder ob ich ihn ignoriere. Dann hilft er mir zwar, wird aber kein fester Begleiter.

Plot zur Gruppe erstellen

Ich erstelle einen neuen Plot lhj001pt_gruppe, Name Gruppenmitglieder. Er enthält zunächst nur die Flags für den Hund (HUND_BEIGETRETEN, HUND_IN_GRUPPE, MIT_HUND_REDEN). Der letze Punkt dient der Steuerung des Gesprächs, die anderen beiden werden in den nachfolgenden Scripten benötigt. Journaleinträge gibt es für diesen Plot nicht.
Das Gespräch mit dem Hund kann nur gestartet werden, wenn MIT_HUND_REDEN True ist. Dies wird unter Action in der Unterhaltung mit Edwina  im Satz „..vielleicht kann euch ja der Hund helfen..“ eingestellt.

Die Bühne

Wie schon im Originalspiel sollen auf einer Bühne aus den Gruppenmitglieder die aktuellen Begleiter ausgewählt werden können. Auch wenn ich Bühne sage, handelt es sich um eine Area, die unter _Global als char_stage zu finden ist.

Re.-Klick auf diese Area und auswählen Duplicate. Es erscheint das Resourcenfenster und wir geben als Resourcenname lhj_char_stage an. Unter Ordner „Lehrjahre\Gruppe“ und unter Module und OwnerModule unser eigenes Modul!

In der erstellten Area, der das Layout schon zugeordnet ist, klicken wir nun mit re und setzen einen Waypoint der unbedingt mit dem Tag char_ beginnen muss: char_lhj_gr_hund. Ich verwende die gleiche Bezeichnung auch für den Namen.
Der Waypoint darf bei einem Standalone Module einfach über einen anderen Waypoint gesetzt werden. Ich selbst habe allerdings zur besseren Übersicht bis auf den char_player und char_chargen alle anderen gelöscht.

Gruppenbühne
Speichern und die Area exportieren.

GDAs – PartyPicker und Co

Es werden insgesamt 4 xls Tabellen benötigt, alle unter [Installationverzeichnis]\Dragon Age\tools\Source\2DA zu finden sind:

  • party_picker.xls
  • PartyPicker.xls
  • 2DA_base.xls
  • ALDog.xls

Diese werden nun wie früher (siehe hierzu Artikel „Objekte skalieren“) kopiert, umbenannt und wie folgt angepasst und anschließend an den ExcelProcessor wie üblich übergeben.

party_picker_lhj

Es bleiben die beiden obersten Zeilen stehen(ID, TAG und Portrait)
Als ID wird eine Zahl größer als die größte im Original eingegeben (ich habe 20 gewählt), Tag enthält den Resource-Tag unseres Begleiters lhj100cr_gr_hund und Portrait erhält den Eintrag INVALID COLUMN.
Der Blattname wird umbenannt in party_picker_lhj.

PartyPicker_lhj

Die ersten beiden Reihen bleiben wieder. Ich habe auch die Reihe mit Dog gelassen und dann nur die ersten 3 Einträge durch meine ersetzt:
ID = die gleiche wie im party_picker, Label = Hund oder Name, der beim Auswählen gezeigt werden soll, Tag = Resourcenname.
Die übrigen Einträge habe ich gelassen, sie können aber gemäß der ID-Einträge in der ANIM_base oder vFx_base geändert werden.
Der Blattname wird wieder entsprechend umbenannt (xy_lhj)

M2DA_BASE_lhj

Diese Exceltabelle enthält die oberen 2 Zeilen aus dem gleichnamigen Tabellenblatt der 2DA_base.xls.
Sie enthält eine ID größer als die größte im Original verwendete (bei mir 50501) – diese Zahl merken, da sie in der Programmierung gebraucht wird.
Den Eintrag eines Labels Hund sowie den Verweis auf das Worksheet ALDOG und 0 für die PackageID.
Das Tabellenblatt erhält den gleichen Namen wie die Tabelle.

ALDOG_lhj
Hier habe ich keine Veränderungen vorgenommen, sondern nur an Blatt und Tabelle meine _lhj gehängt.
Man kann allerdings, wenn man möchte, hier die Reihenfolge der Skillungen verändern, falls man automatisch skillen lassen möchte.

BUG-Behebung
Eine BUG-Behebung sollte man noch durchführen, damit der Hund die richtigen Talente in der Leiste bzw. im Talentbuch angezeigt bekommt:
In der 78. Zeile von packages_base in packages.xls muss in der Spalte LevelUpTable die 0 durch 257 ersetzt werden. Macht man das nicht werden die Krieger Skills angezeigt.

Ich habe die Tabelle, um keine Veränderungen am Original durchzuführen, ebenfalls kopiert, umbenannt (_lhj), verändert, in eine GDA gewandelt und in meinen Ordner geschoben.

Hat man alle Excel-Dateien angepasst und durch den ExcelProcessor geschickt, verschiebt man die GDA-Dateien wieder in den GDA-Ordner nach
..Documents\BioWare\Dragon Age\AddIns\Lehrjahre\module\override\toolsetexport.

Programmierung

Nachdem nun alle Vorarbeiten getroffen wurden, muss das Ganze mittels Code zusammengefügt bzw. aufgerufen werden.

Veränderungen im Modulscript

Ich rufe meine Gruppen-Bühne direkt im Modulscript über ein Event auf:

case EVENT_TYPE_MODULE_GETCHARSTAGE:
{

SetPartyPickerStage(„lhj_char_stage“, „partypicker“);
break;

}

Weiter im Modul stattfindende Ereignisse stellen das Hinzufügen und Entfernen der jeweiligen Gruppenmitglieder da:

case EVENT_TYPE_PARTYMEMBER_ADDED:
{

object oFollower = GetEventObject(ev, 0);
SetLocalInt(oFollower, CREATURE_REWARD_FLAGS, 0); //Allows the follower to gain XP
AddCommand(oFollower, CommandJumpToLocation(GetLocation(GetHero()))); //Ensures follower appears at PC's location.
if (GetTag(oFollower) == "lhj100cr_gr_hund")
{
WR_SetPlotFlag(PLT_LHJ001PT_GRUPPE, HUND_IN_GRUPPE, TRUE);
}
SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE); //Adds follower to the active party
break;

}

case EVENT_TYPE_PARTYMEMBER_DROPPED:
{

object oFollower = GetEventObject(ev, 0);
if (GetTag(oFollower) == "lhj100cr_gr_hund")
{
WR_SetPlotFlag(PLT_LHJ001PT_GRUPPE, HUND_IN_GRUPPE, FALSE);
}

}

Unter den #include wieder den Plot plt_lhj001pt_gruppe zufügen.

Mit diesen Events werden nicht nur die Gruppenmitglieder zugefügt und entfernt, sondern auch die Flags entsprechend im Gruppenplot gesetzt und sichergestellt, dass der Begleiter Erfahrung gewinnt.

hireCustomFollower und Actionscript

Nachdem die Bühnenereignisse gesteuert werden, wird es jetzt noch nötig, das eigentliche Anwerbungsverfahren, das meist über ein Gespräch (siehe oben) gesteuert wird, festzulegen.
Hierfür erstelle ich zwei neue Scripts
lhj_hireCustomFollower_h und
lhj001_mitglied_zur_gruppe.

Das 1. Script ersetzt die Funktion UT_HireFollower(), die nach Angaben des Tutorial Autors anfällig für Fehler ist. Da es ein sehr umfangreiches Script ist einfach kopieren und einfügen: lhj_hireCustomFollower_h.
Der entscheidene Teil steckt hier in (am Ende der langen Kommentierung=grünen Passage):

int GetCustomFollowerALTable(object oFollower)
{
int nTable = _GetTableToUseForAL(oFollower);
if (GetTag(oFollower) == "lhj100cr_gr_hund")
{
nTable = 50501;

}
}

Hier taucht die von uns vergebene ID aus der M2DA_base auf, mittels der auf die entsprechende AL verwiesen wird, die die Skillungen enthält.
Übrigens wird beim Compilieren zu diesem Zeitpunkt ein Fehler angegeben, da es eine Header (-h)-Datei ist, die innerhalb einer main-Funktion eines anderen Skriptes aufgerufen werden muss.

Dieses 2. Skript wird mit lhj001-mitglied-zur-gruppe erstellt:

#include "lhj_hireCustomFollower_h"
#include "plt_LHJ001PT_GRUPPE"
void main()
{
object oFollower = GetObjectByTag("lhj100cr_gr_hund");
//Use CreateObject() if the creature isn't present in the module yet
//UT_HireFollower(oFollower); //Hires the follower
hireCustomFollower(oFollower, CLASS_DOG, PLT_LHJ001PT_GRUPPE, HUND_BEIGETRETEN, 0, 0, FALSE, FOLLOWER_STATE_AVAILABLE, "", 0, 0, FALSE);
SetPartyPickerGUIStatus(2);
ShowPartyPickerGUI(); //Shows the Party Picker; necessary for the follower to gain XP
}

Für die markierte hireCustomFollower-Anweisung gibt es verschiedene Inhalte. Hierzu bitte im Follower Tutorial (Wiki) nachsehen.

Dieses Script wird nun der Hunde-Convo an der Stelle als Aktion zugefügt, an der das Mitglied in die Gruppe kommen soll:

Convo SkriptNun kann der Hund in die Gruppe eingeladen werden:

Gruppe

Der Spieler soll dem Hund selbst einen Namen geben dürfen. Dies wird über ein PopUp-Fenster geregelt.
Ich füge zunächst ein neues Event in mein Modulskript ein:

case EVENT_TYPE_POPUP_RESULT:
{
object oOwner= GetEventObject(ev,0);
int nPopupID=GetEventInteger(ev,0);
int nButton = GetEventInteger(ev,1);
string sName = GetEventString(ev,0);
switch (nPopupID)
{
case 2:
{ SetName(oOwner,sName);
break;
}
}
}

Dieses Event übergibt eine durch den Spieler gemachte Eingabe (sName) im Popup-Fenster an den Namen des zugehörigen Besitzers des Fensters. Case 2 ist aus der Popup xls entnommen und gilt für Eingabe-PopUp-Fenster.

Um das Popup-Fenster zu gestalten, rufe ich zunächst über Tools den String Editor auf und klicke hier mit re und wähle Insert String. Im erscheinenden Fenster erfolgen dann meine Angaben für das PopUp-Fenster:

TalktableDie ID, die nach Klick auf Ok automatisch generiert wird, bitte unbedingt merken. Sie wird für die weitere Programmierung benötigt.
Anschließend re. Klick auf Palettenfenster All. Klick auf Lehrjahre und Export talk table.

Installationsorte für die TalktablesDanach in den Ordner Documents gehen und hier aus dem ToolsetExport-Verzeichnis sowohl im packages\Core als auch im Addins – Core die Talktables (*.tlk) löschen. Im Addins\module\ToolsetExport die vorhandene Talktable (engl) umbenennen in Lehrjahre_de-de.tlk

Ich habe den Aufruf der ShowPopup-Funktion in das Event Partymember Added gesteckt:

case EVENT_TYPE_PARTYMEMBER_ADDED:
{
object oFollower = GetEventObject(ev, 0);
SetLocalInt(oFollower, CREATURE_REWARD_FLAGS, 0); //Allows the follower to gain XP
AddCommand(oFollower, CommandJumpToLocation(GetLocation(GetHero()))); //Ensures follower appears at PC's location.
if (GetTag(oFollower) == "lhj100cr_gruppe_hund")
{
WR_SetPlotFlag(PLT_LHJ001PT_GRUPPE, HUND_IN_GRUPPE, TRUE);
ShowPopup(883912629, 2, oFollower, TRUE);
}
SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE); //Adds follower to the active party
break;
}

Bei der ersten Zahl handelt es sich um die StringID, die eben erstellt wurde, die 2 steht für die Art des PopUpfensters (siehe popup.xls), es erfolgt der Besitzer des Fensters, True = Eingabefenster anzeigen, die letzte Option der Funktion wird nicht ausgefüllt, da der Spieler die Eingabe durchführen soll, sonst könnte hier ein vorgegebener Text stehen.

Damit kann jetzt dem Hund nach der Anwerbung ein eigener Name gegeben werden:

PopUp-Fenster

Speichern, exportieren, testen.

BtB – Datei: Lehrjahre007
Oben


Weiterlesen…