[Modding] Scripting Fragen

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
Wenn Du nach der Reihenfolge des Party-Slots gehen möchtest, kannst Du Player1Fill - Player6Fill nehmen
Oh cool, das war mir gar nicht bewusst. Dann weiß man aber die Namen nicht, oder? Also wie man mit PLAYERX den Namen für PlayerX ausgeben lassen kann. Ich fürchte mal, das gibt es hierfür so nicht.
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Vordefiniert gibt es dafür meines Wissens nach nichts, könnte man aber mit SetTokenObject() emulieren. (erst ab BG2 verfügbar)

Also vor dem Start des Dialogs in einem Skript die gewünschten Token setzen und im Dialog dann mit <TOKEN> referenzieren.
Beispiel:SetTokenObject("PLAYER1FILL", Player1Fill) setzt das Token "<PLAYER1FILL>".

Ist sicher nicht ganz einfach zu handhaben, also wahrscheinlich die Mühe nicht wert. Und ausprobiert hab' ich es auch noch nicht. :)
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Wann werden eigentlich Variablen angelegt?

Ich meine, dass wenn ich über die Konsole Variablen abfrage, dass dann immer, wenn die Variable noch nicht gesetzt wurde, die Rückmeldung ist, dass die Variable nicht existiert.

Jetzt stellt sich mir die Frage, warum die Abfrage
Code:
 IF ~Global("Name",GLOBAL,0)~
true ergibt, wenn die Variable noch gar nicht gesetzt wird? Ist das einfach so eine Konvention, die die Engine versteht? Weil die Variable ja eigentlich nie auf den Wert 0 gesetzt wird...

Und daraus ergibt sich dann die Frage nach
Code:
 IF ~!Global("Name",GLOBAL,0)~
Ist das eigentlich immer true? Weil die Variable hat ja keinen Wert, wenn sie nicht gesetzt wurde, also auch nicht "0". Je nachdem wie die Operatoren verarbeitet werden, könnte das immer true sein oder eben das "not" zur obigen Version.
Ich würde ja immer
Code:
 IF ~GlobalGT("Name",GLOBAL,0)~
benutzen, weil das für mich eindeutiger ist. Aber andere Modder benutzen die erste Version...
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
Zu Deiner ersten Frage: ja, eine noch nie gesetzte Variable, die bei Abfrage "non existent" ergibt, "hat" immer auch den Wert "0", daher ergibt die Abfrage "wahr".

Das zum Triggern für irgendwas zu verwenden ist ungünstig, da diese Abfrage nicht eindeutig ist. Das klappt nur, wenn die Skriptblöcke - oder noch schlimmer, die Dialogstates - in der Datei in der richtigen Reihenfolge stehen. Im Originalspiel wurde das gerne gemacht - ein Dialog ohne eindeutige Variable aufgerufen, und im Dialog gab's dann eine ganz andere Variable, die von "0" auf "1" gesetzt wird - schlechter Stil, weil extremst Fehleranfällig. Es sollte immer eine eindeutige Variable gesetzt werden und diese auch im Dialogtrigger stehen (und im Dialog geschlossen werden).
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Weil ich gerade Skript durchstöbere...

Code:
IF
    Global("M#AmberMatch","GLOBAL",0)
    OR(3)
        !Gender(Player1,MALE)
        !CheckStatGT(Player1,11,CHR)
        !CheckStatGT(Player1,11,INT)
THEN
    RESPONSE #100
        SetGlobal("M#AmberMatch","GLOBAL",2)
END

IF
    Global("M#AmberMatch","GLOBAL",2)
    Gender(Player2,MALE)
    CheckStatGT(Player2,11,CHR)
    CheckStatGT(Player2,11,INT)
    CheckStat(Player2,0,MORALEBREAK)
    !HasItemEquiped("belt05",Player2)  // Girdle of Gender
    !Name("BIDDE",Player2)
    !Name("SUBRU",Player2)
    !Name("JCBruce",Player2)
    !Name("G#CASS",Player2)
    !Name("FWGHARETH",Player2)
    !Name("CLFHSFNX",Player2)
    !Name("lrirenic",Player2)  // Jon Irenicus
    !Name("DKido",Player2)
    !Name("KWOLF",Player2)
    !Name("Kindrek",Player2)
    !Name("NATH",Player2)
    !Name("SK#NEHT",Player2)
    !Name("Therrin",Player2)
    !Name("TSUJATH",Player2)
    !Name("VANIM",Player2)
    !Name("Wikaede",Player2)
    !Name("TLXAN",Player2)
    !Name("SDNPC",Player2)
    !Name("Robilard",Player2)
    !Name("Avaunis",Player2)
    !Name("Adario",Player2)
    !Name("KAGAINdd",Player2)
    !Name("KIVANDD",Player2)
    !Name("montaron",Player2)  // Montaron
    !Name("xzardd",Player2)
    !Name("yeslicdd",Player2)
    !Name("BOLIVAR",Player2)
    !Name("TOMASTM",Player2)
THEN
    RESPONSE #100
        SetGlobal("M#AmberMatch","GLOBAL",3)
END

Sowas in der baldur.bcs ist schon Sch... kein Wunder, dass da das Spiel lagt. Ich fühle mich zwar geehrt, dass Vanim als LoveInterest in Betracht gezogen wird, aber echt mal... und das für alle Player-Positionen...
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
Könnte man in der Tat einfach in ihr eigenes Skript packen. Aber es ist nur ein Skriptblock, warum sollte es laggen?
Und Vanim wird gerade nicht als Loveinterest in Betracht gezogen, das soll ja Multiplayer-Player2 identifizieren. ;)
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Klar, ich meinte, dass er bei der Abfrage berücksichtigt wird. Die Masse macht es, weil ja permanent hier die Blocks gescannt werden. Und bei mir sind das in baldur.bcs inzwischen knapp 8000 Zeilen. Viel von Lava, der wohl alle Abfragen in die baldur.bcs packt. Aber halt auch so Überflüssiges... ist nur ein Beispiel. Und es ist nicht der einzige Skriptblock in der Art von Amber ;)
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
Ja, das stimmt. Ich bin da mittlerweile auch dazu übergegenagen, Skriptblöcke möglichst nicht in die Baldur.bcs zu packen. Manchmal hat man aber keine Wahl. (Manchmal).
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Ok, folgendes Problem: Aura ist in meiner Gruppe und hat einen Stutter-Bug. Folgendes Skript feuert:
Code:
Switch("C0AuraTalk","GLOBAL")
THEN
    RESPONSE #1
        IncrementGlobal("C0AuraTalk","GLOBAL",1)
        ActionOverride(Player1,DisplayString(Myself,561609))  // Running block 11 of C0AURA.BCS
        ActionOverride(Player1,DisplayStringHead(Myself,561609))  // Running block 11 of C0AURA.BCS
    RESPONSE #2
        StartDialogNoSet(Player1)

AuraTalk ist vorher auf 1 gesetzt worden, der erste Skriptblock erhöht um 1 auf 2. Dann kommt der Dialog mit ihr. In der J-dlg steht:
Code:
CHAIN IF ~Global("C0AuraTalk","GLOBAL",2)~ THEN C0AURAJ t1
~Th-thank you for letting me join you, <CHARNAME>... I'm not sure what I'd be able to do all by myself. I, um... I won't let you down.~ [C0BLANK]
DO ~IncrementGlobal("C0AuraTalk","GLOBAL",1)
RealSetGlobalTimer("C0AuraTalkRealTimer","GLOBAL",THIRTY_MINUTES)
SetGlobalTimer("C0AuraTalkRealTimer","GLOBAL",THREE_DAYS)~
END

Das ist soweit ok, AuraTalk auf 2 ist im Spiel verifiziert, es kommt ein Dialog, aber nicht der Satz hier. Und deswegen wird die Variable auch nicht hochgezählt und es stuttert. Soweit, so gut. Nur: warum wird nicht die J-dlg für das Gespräch herangezogen?? In der pdialog steht die Datei korrekt drin.
Ich suche mal noch, ob ich die dlg-Datei finde, auf die hier zugegriffen wird.
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Kann ja sein, dass ein anderer State aus der Dialogdatei davor triggert.
Die Reihenfolge der State Trigger ist entscheidend.
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Nein, der String ist gar nicht in der Datei. Ich hab ihn inzwischen gefunden: er ist in der MultiJ.dlg. Macht Sinn, wenn das System denkt, dass Aura keine j-Datei zugeordnet ist. Aber ich dachte, dafür ist die pdialog.2da da... Aber wohl nicht... Kennt jemand die Datei, in der man das editieren müsste?
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
warum wird nicht die J-dlg für das Gespräch herangezogen??
Die Mod ist ja fertig und vröffentlicht. Ich hatte das Problem mit meinen NPCs, wenn - ich glaube - der "Allow Export" flag in der cre noch gesetzt war. Ich erinnre mich aber nur dunkel.
Insgesamt macht es keinen Sinn, wenn sie richtig installiert ist und die Flags richtig gesetzt sind, dass sie im MultiJ spricht. Und dass die variable dann auf 2 gesetzt wird zweimal nicht, wenn dieser Dialog in ihrer j.dlg nicht läuft. :hae:
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Doch die Variable passt: steht auf 1, wird eins hochgezählt (sie erste Switch-Aktion im bcs) und ist dann auf 2. Dann startet die zweite Switch-Aktion im bcs und der Dialog wird gestartet. Und dann wird nicht wie geplant im Dialog auf 3 hochgezählt, weil der falsche Dialog hochgezählt wird.

Ich vermute ein Problem bei der EET_end, weil da die Installation einmal hing und die pdialog.2da beteiligt war. Aber die Datei an sich sieht sauber aus.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
Achso, ja hast recht.
Hast Du Dir die cre in einem Save mal angesehen?
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Hm, mit was (Tool) sollte ich da was sehen? EEKeeper steht afaik nichts über Verknüpfungen mit dlg-Dateien drin...
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
Ich meinte mit near Infinity in das GAM File (D)eines Saves und da die Gruppenmitglieder angucken.
Ich erinnere mich grad nicht mehr, was genau war, als ich dasselbe problem mit Brandock hatte, dass er mit der MultiJ gesprochen hat. War aber was, was ich in der Mod ändern musste, nicht einfach nur ein zufälliger Glitch.
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Hm, habe ich tatsächlich gefunden, dass da bei Aura in der cre die multi.dlg eingetragen war. Hat aber für das Savegame nichts geändert. Wahrscheinlich, weil es halt die j-Datei ist, die ich ändern müsste und die steht nicht in der cre-Datei drin.
Interessante Frage bleibt aber: wie konnte das passieren?? Weil der Aufnahmedialog hätte mit einer Multi.dlg ja gar nicht in der gewohnten Weise stattfinden können. Es müsste daher während des Spiels die dlg geändert worden sein. Allerdings war das ein kurzer Weg bisher mit Aura: Silke, die besorgte Frau, Karlat (der zwergische Attentäter) und Tulbor. Danach ging der Stutterbug los, weil der erste Dialog getriggert war...
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Wahrscheinlich, weil es halt die j-Datei ist, die ich ändern müsste und die steht nicht in der cre-Datei drin.
Beim Beitritt zur Party schreibt die Engine die j-Dialogdatei bzw. das was in pdialog.2da steht in die CRE.
Kann aber nachträglich mit SetDialog() geändert worden sein.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
@Maus dass da die multij drin steht macht genau keinen Sinn. Nur interessehalber - ist der "Export allowed" flag bei der cre im Save gesetzt?
 
Oben