[Modding] Scripting Fragen

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
10.180
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

Senior Member
Registriert
25.11.2001
Beiträge
1.338
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
8.146
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
10.180
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
8.146
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
10.180
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
8.146
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
10.180
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).
 
Oben