[Modding] DLG-Scripting: Die Anfänge

Pereghost

Member
Registriert
22.05.2004
Beiträge
88
Hab aber noch keine tp2 erstellt gehabt.
Ich hab es über die Eingabeforderung und dann per Weidu die dlg direkt aus der HScapt01.d erstellt.

Sonst hört sich das super an, wenn ich Skript mach, wenn der Gegenstand im Inventar ist. Ich glaube das würde ich sogar hinkriegen :)

Ich hab nun noch eine Frage!
Namen und Bezeichnungen und das ganze sind ja auch Strings, die in die dialog.tlk müssen.
Wie krieg ich also einen Namen als String in die dialog.tlk?

Oder muss ich das bei der Kreaturerstellung machen?
 

Seradin

Kleine Drow
Registriert
20.09.2002
Beiträge
1.386
Da eins der ersten Dinge die ich immer schreibe die tp2-Datei ist, kann ich dir nur so helfen.

Du hast die Möglichkeit mit der tp2-Datei NPC Namen und Biographien zu geben. Items und spells kannst du auch die Namen und Beschreibungen zuordnen.
Dies ist die eleganteste Möglichkeit, da du keine Gefahr läufst dir die tlk zu zuerhauen. Man kann aber auch mit editoren wie NearInfinity einen neuen string anlegen. Hier musst du aber aufpassen, dass er von beiden tlks genommen wird und keinen alten überschreibt.
 

Pereghost

Member
Registriert
22.05.2004
Beiträge
88
Mit NI etc. kann ich ja auch Dialoge und alles als String extra einfügen. Jedoch wollte ich ja wenn, dann jetzt alles per WeiDu einfügen.

Also dann muss ich mir heute mal die tp2-Dateien anschauen, wenn ich nur über diese Namen vergeben kann :)

Hatte es sonst jetzt per Shadowkeeper versucht eine CRE-Datei zu erstllen, die kriegt aber den Namen von der CHR-Datei nicht mit, leider!

PS:
wie sieht das Skript aus, wenn mehrere Möglichkeiten bestehen sollen, was der Akteur sagen soll!
Also das es z.B. 6 verschiedene Möglichkeiten gibt!

Ich dachte an

Code:
BEGIN ~HSGuardM~

IF ~ ReputationGT(Player1, 15) ~ THEN BEGIN Guard1
SAY ~Wendet euch an den Hauptmann!~ EXIT
SAY ~Ich bin beschäftigt.~ EXIT
SAY ~Nirgends kann man ungestört sein...~ EXIT
END

IF ~ReputationLT(Player1,16) ReputationGT(Player1, 5)~ THEN BEGIN Guard2
SAY ~Der Mief ist ja unerträglich hier!~ EXIT
SAY ~Verschwindet endlich.~ EXIT
SAY ~Da hinten ist die Tür!~ EXIT
END

IF ~ReputationLT(Player1, 6) ~ THEN BEGIN Guard3
SAY ~Ihr habt dort etwas am Hals...~ DO ~ENEMY() Attack(NearestEnemyof(Myself)) ~ EXIT
SAY ~Meine Klinge ist gerade geschärft!~ DO ~ENEMY() Attack(NearestEnemyof(Myself)) ~ EXIT
SAY ~Eurer ärmliches Leben soll hier beendet werden!~ DO ~ENEMY() Attack(NearestEnemyof(Myself)) ~ EXIT
END

PPS: wie heisst die Bedingung, dass der HC weiblich ist?
Erledigt: Gender(Player1, female)
 
Zuletzt bearbeitet von einem Moderator:

Pereghost

Member
Registriert
22.05.2004
Beiträge
88
Also mit der Zufallsauswahl scheint es:

RandomNum() zu sein.
Jetzt weiss ich aber nicht wie diese Bedingung eingesetzt wird.

Heisst es dann:
Code:
IF ~Random(1-3,1)~ THEN BEGIN Guard1
SAY ~ Text ~ ?

Das würde ja kein Sinn machen, weil ich dann nur zwischen den 3 Blöcken hin und her wechsle.
Ich will aber die 3 Sätze innerhalb eines Blockes per Random aussuchen lassen. Und ich frag mich jetzt wie das möglich sein kann :)

So sry für Doppelpost, aber das ständige editieren, ist langsam echt nervig *g*
Ich hoffe es gibt noch ein paar Modder hier :)
Bis jetzt hat mir ja schon Maus, Cas und Seradin geholfen. Aber hier gibt es doch sicher mehr, oder?
 
Zuletzt bearbeitet von einem Moderator:

Caswallon

Chronist
Registriert
13.08.2001
Beiträge
11.460
Zu RandomNum:
In deinem BG2-Verzeichnis gibt es ein Verzeichnis "script compiler", da ist eine "Scripting Quick Reference.doc" drin, wo viele (nicht alle) Scriptbefehle erläutert werden.
Dort steht zum Thema:
RandomNum(Range, Value)
Compares a random number between 0 and Range to Value.


RandomNum(3,1) würde also heißen: wenn eine Zufallszahl zwischen 0 und 3 den Wert 1 annimmt.
Drei Auswahlmöglichkeiten wären also
RandomNum(2,0)
RandomNum(2,1)
RandomNum(2,2)

Zum Problem der Auswahl aus den Blöcken kann ich derzeit nichts sagen... bin nicht mehr ganz so fit im Denken gerade. :D

Das Editieren hat außerdem den Nachteil, daß ich z.B. mich immer danach richte, ob hier neue Posts im Unterforum stehen - bei einem Edit kriege ich das also nicht mit.
Weiß aber nicht, wie andere das machen.

Cas
Edit: Öh... wieso zeigt's meinen Beitrag in der Übersicht nicht an? :confused:
 
Zuletzt bearbeitet:

Arodon

Kleriker des Helm
Registriert
01.04.2002
Beiträge
1.787
Rebellion!
Das Forum selbst ist auf unserer Seite!
Es zeigt die Beiträge von Mods nicht mehr an!
Auf die Barikaden, stürmt ihre Häuser, verbrennt die Kreischlingslaufräder, sucht die Ausgänge!
 
Zuletzt bearbeitet:

Pereghost

Member
Registriert
22.05.2004
Beiträge
88
aber wie sieht dann das Script aus mit Random drin?

Ich will ein Random innerhalb jedes Blockes einbauen, dass heisst eigentlich vor jedem SAY
aber dort ist kein Platz wo ich RandomNum(3,1), RandomNum(3,2), RandomNum(3,3) einsetzen kann! :(

Oder sieht es sonst so aus?

Code:
BEGIN ~HSGuardM~

IF ~ ReputationGT(Player1, 15) ~ THEN BEGIN Guard1
IF ~RandomNum(3,1)~ THEN SAY ~Wendet euch an den Hauptmann!~ EXIT
IF ~RandomNum(3,2)~ THEN SAY ~Ich bin beschäftigt.~ EXIT
IF ~RandoumNum(3,3)~ THEN SAY ~Nirgends kann man ungestört sein...~ EXIT
END

Das jetzt nur für den ersten Block, aber in der Art, oder wie?
Problem ist also, dass ich nicht weiss wo RandomNum hingehört, weil der Syntax nirgends zwischen geschoben werden kann...
 
Zuletzt bearbeitet von einem Moderator:

Seradin

Kleine Drow
Registriert
20.09.2002
Beiträge
1.386
Ich glaube sowohl maus wie auch ich können dir hier nicht weiter helfen. Am Besten schaust du mal im Rosenranken Forum (rosenranken.de) vorbei.
 

Pereghost

Member
Registriert
22.05.2004
Beiträge
88
och mist :(

Ich hab gehofft ihr würdet euch sonst damit super auskennen *hm*
dann wende ich mich mal ans dritte Forum dann schon...

gibt es denn niemand deutschsprachigen mehr, der wirklich richtig viel moddet, sowohl Area, DLG, BCS Scripting?
Das wäre ja verdammt schade, denn ich glaube fast, dass sich noch viel größere Fragen ergeben werden, die irgendwie gelöst werden wollen. Aber ich hab schon Probleme mein Problem in deutsch auszudrücken... in engisch wird es dann eh keiner mehr verstehen, so das gar keiner mehr antwortet :D

Na sonst lass ich erstmla diese RandomNum Option weg, vielleicht les ich irgendwo noch ein Scripting Beispiel wo diese verwendet wird.
 

Pereghost

Member
Registriert
22.05.2004
Beiträge
88
noch eine kurze Frage zum dlg-Skripting!

Kann man die CharP.d und die CharJ.d etc. alle in eine Textdatei stecken?

Weil man diese ja schliesslich durch Begin CharP.d etc. trennt, ist dies möglich, oder muss man tatsächlich soviele Textdateien zu erstellen?
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.425
Kann man; allerdings heissen die halt BEGIN ~NameDerDLGDateiOhneEndung~ ;)
 

Caswallon

Chronist
Registriert
13.08.2001
Beiträge
11.460
Man muß die Dialoge dann nur richtig in die PDialog.2da eintragen.
Hat man z.B. P und J in einer MymodJP.dlg, dann trägt man MYMODJP eben sowohl unter Post_Dialog als auch unter Join_Dialog ein.
Solaufein z.B. hat alles zusammen in einer Sola.dlg; dann steht da durch die Bank SOLA in der PDialog.2da.

Cas
 

Pereghost

Member
Registriert
22.05.2004
Beiträge
88
ich hab wieder mal ein Problem...

ich arbeite wieder mal an mehreren Dialogen, und nun wird auf einmal bei WeiDu ein Fehler angezeigt...

der im Aktionsbereich hinter DO liegen soll... vielleicht bin ich blind, und seh den nicht, aber da ist kein Fehler! Oder etwa doch?

Code:
IF ~~ THEN BEGIN Celes5
SAY ~Hilfe, Meister! Ich werde angegriffen!~ DO~CreateCreature("Alucard2",[200,400],6) Enemy() Attack(NearestEnemyofMyself)~ EXIT
END
 
Zuletzt bearbeitet von einem Moderator:

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.425
Hm, ich mach immer ein Leerzeichen zwischen die unteschiedlichen Befehle, aber ich glaube nicht, dass es daran liegt.

Ah, jetzt sehe ich es ;)

Muss heissen:

Code:
SAY ~~
IF ~~ THEN DO ~~ EXIT
END

Nicht direkt nach dem SAY mit DO anfangen. Immer erst die (leere) Antwort. Eventuell liegt es auch dem Attack... Möglicherweise darf man das nur in einem Skript verwenden...
 
Zuletzt bearbeitet von einem Moderator:

Pereghost

Member
Registriert
22.05.2004
Beiträge
88
ne ich hab es schon bei einem Wärter verwendet, also dürfte es damit keine Probleme geben... aber ich Trottel hab tatsächlich das THEN vergessen :(

ist ja auch logisch... weil es heisst ja sonst auch
Code:
SAY ~~
IF ~~ THEN REPLY

somit auch:
Code:
SAY ~~ 
IF ~~ THEN DO
also besten Dank :D
 
Zuletzt bearbeitet von einem Moderator:

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.425
Hm, gut zu wissen, dass das auch so funktioniert. Da kann ich mir ja in Zukunft ein paar Zeilen sparen...
 

Pereghost

Member
Registriert
22.05.2004
Beiträge
88
wäre schlimm wenn das nicht funktioniert :D

Weil wenn ich mir die nachfolgenden Zeilen anschaue...

Code:
IF ~Gender(Player1, Male) InParty("Aerie") GlobalGT("AerieRomanceActive","GLOBAL",1) GlobalLT("AeireRomanceActive","GLOBAL",3)~ THEN REPLY ~Für eine Nacht mit Euch würde ich sie notfalls zum Schweigen bringen.~ EXTERN ~AERIEJ~ AerieEinspruch1

die Bedingungen klappen sonst immer sehr gut, aber soviele hatte ich sonst noch nie in einem Dialogblock drin... zu jedem Romanzenpartner gibt es dann einen solchen

im Einspruch des jeweiligen Partners wollte ich dann die Globalen Romanzenvariablen auf 3 setzen, und die Beziehung dann beenden...

ich hoffe also noch um die ganze Skriptsache herum zu kommen :)

auf jeden Fall funktioniert das Attack() ausgezeichnet!
 
Zuletzt bearbeitet von einem Moderator:

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.425
Das sind doch nicht viele Bedingungen... ;) Manchmal braucht man das halt. Allerdings könntest du dir eine sparen und einfach schreiben:
Global("AerieRomanceActive","GLOBAL",2)
 

Pereghost

Member
Registriert
22.05.2004
Beiträge
88
ja, aber dann dachte ich, dass man sich ja vielleicht eine Beziehung zu Aerie erhofft, und man noch nicht weiss ob diese aktiv ist... deshalb wollte ich da schon InParty("Aerie") machen...

dann fiel mir ein, dass eine Romanze ja auch aktiv ist, wenn der Wert auf 1 steht!
Daher dann das GlobalGT und GlobalLT etc.

aber eigentlich hättest du recht :)

ich mach mir halt doppelt und dreifache Arbeit ;)

aber ich hab ein neues Problem (:

ich hab mich versucht im Dialogumbruch! Angeblich funktioniert dies, indem man beide gesprochene Dialog mit ~~ von einander abtrennt und dazwischen dann ein Gleichheitszeichen setzt...
doch da ist irgendwie ein Fehler drin

Code:
IF ~~ THEN BEGIN Celes32
SAY ~Wieso seid ihr so gemein zu mir?! Stört euch meine vampirische Gestalt denn so sehr, dass ihr mich nicht wie einen Menschen behandeln könnt?~ 
=
~Ich offenbare euch meine tiefsten Gefühle, und ihr missbraucht mein geschenktes Vertrauen so hinterhältig!~

Oki hat sich erledigt...
war ein anderer Fehler und das SAY ~~ = ~~ funktioniert wirklich :)
 
Zuletzt bearbeitet von einem Moderator:
Oben