[Modding] Modding Tutorials

Aeri

Senior Member
Registriert
03.10.2010
Beiträge
201
Hmm interessant :-/
Hast du einen komplett neuen Spielstand angefangen?
Ich habe den NPC in den "Big World Clean Install" Ordner (bzw eine Kopie davon) installiert und einfach einen Spielstand geladen bei dem ich da Brückenviertel noch nicht besucht habe.
 

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
Das hat in erster Linie damit nichts zu tun. Du kannst einen Charakter auf zwei Arten in ein gebiet reinbringen:

1.) Du patchst das Gebiet und setzt die Figur als Actor rein. Das hat ein paar Vorteile aber auch ein paar Nachteile.
Vorteile sind z.B.: Du kannst, wenn du z.B. eine Figur mehrfach verwendest, ihr verschiedene Scripte zuweisen. Und du kannst ihre Anwesenheit besser zeitlich begrenzen.
Und der große Nachteil ist: Das Gebiet darf noch nicht besucht worden sein.

Du hast die Figur über das Areaskript eingefügt, das so oder so immer abläuft. Da macht es nichts ob du noch nie in dem Gebiet warst oder schon oft, Skripte werden jedes mal neu von oben nach unten abgearbeitet, die können auch während eines laufenden Spieles verändert werden. mach nen Stutter-Debug auf ar0500.bcs und schau ob dein Befehl überhaupt ausgeführt wird. der müsste dann Block 0 sein.
 

Jarl

Senior Member
Registriert
28.04.2006
Beiträge
982
Von mir auch noch ein kurzer Tip am Rande: Wenn du deine Mod zu Testzwecken installiert hast und dann doch noch eine kleine Änderung in der tp2 oder so vornimmst, geh bei WeiDu nicht auf "Reinstall", sondern immer schön erst "Uninstall" und dann wieder "Install".

Ansonsten haust du dir schnell Bugs in die Installation ;)

Viel Spaß weiterhin! Wie Jastey schon sagte - der Virus hat dich gepackt :D

Gruß Jarl
 

Aeri

Senior Member
Registriert
03.10.2010
Beiträge
201
Ja es macht in der Tat Spaß, auch wenn es umständlich ist einzelne Zwischensteps ausreichend zu testen :-/

Vielleicht finden sich ja noch ein oder zwei andere Interessierte die Lust haben gemeinsam an einem Projekt zu arbeiten :)
So könnte man einzelne Bereiche sinnvoll aufteilen und es macht ja auch mehr Spaß in der Gruppe ;-)
Man könnte ja dann ein git repo dazu eröffnen um effektiv miteinander arbeiten zu können.

// Wie genau führe ich btw einen "Stutter Debug" aus?
////ok hab den Thread gefunden ^^
 
Zuletzt bearbeitet:

Aeri

Senior Member
Registriert
03.10.2010
Beiträge
201
Sooo, ich habs geschafft mir den Test mal im Spiel anzuschauen (lag schlichtweg daran, dass ich das falsche Spiel gestartet habe :shine:) und hab ein paar Fehler entdeckt.

1) Der NPC ist grün umrandet, obwohl ich eigentlich in dessen Creaturefile "neutral 128" ausgewählt habe.
2) Folgender Block wird nicht ausgeführt:
Code:
IF ~NumTimesTalkedToGT(0)~ THEN BEGIN Talk2
SAY ~Schön Euch wieder zu treffen Freund! Darf ich mich Euch anschließen?~
IF ~~ THEN REPLY ~Warum nicht.~ DO ~SetGlobal("TestiJoined","LOCALS",1)
JoinParty()~ EXIT
IF ~~ THEN REPLY ~Ich kann zur Zeit leider keine weiteren Gefährten gebrauchen.~ EXIT
END

Wenn ich das richtig verstanden habe, sollte dieses Gespräch doch immer stattfinden wenn man mehr als 0x (also mindestens 1x ^^) mit dem NPC gesprochen hat, wo liegt also der Fehler?
Oder gilt das nur für NPCs die man schonmal aus der Gruppe gekickt hat (das Tutorial sah diesen Block für derartige Situationen ursprünglich vor)

Und noch eine Frage:

Um welche Dateien handelt es sich bei folgenden eigentlich und wie setzt sich der Name zusammen (habe einfach geraten was den Namen der Files anging, schien aber zu stimmen)?

Code:
APPEND ~pdialog.2da~
~CoTesti CoTestiP CoTestiJ CoTestiD CoTes25P CoTes25J CoTes25D CoTest25~
UNLESS ~CoTesti~

APPEND ~interdia.2da~
~CoTesti CoTestiB CoTesB25~
UNLESS ~CoTesti~

Ich verstehe nicht nach welchem Muster hier manchmal "CoTes" oder "CoTesti" oder "CoTest" verwendet wurde :-/
 

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
1.) Testi ist bei mir als PC und nicht als Neutreal angegeben. Nicht gespeichert vielleicht?

2.) Das ist ja auch ein Dialogblock. Wenn du willst dass die Figur von sich aus spricht brauchst du ein Skript. Das ist in dem von mir ganz oben verlinkten Thread beschrieben.

3.) PDIALOG.2DA und INTERDIA.2DA sind Tabellen (2da = 2 Dimensional Arrays oder sowas). in der PDIALOG wird festgehalten, welche DLG-Datei wann benutzt wird: CoTesti.dlg ist die Datei, wenn die Figur noch nie in der Gruppe war. CoTestiP = nachdem die Figur in der Party war CoTestiJ = während sie in der Party ist. CoTestiD = das Dreamscript, also eine BCS-Datei die abgefragt wird bevor die Gruppe rastet. CoTes25P CoTes25J CoTes25D CoTest25 = Alles das gleiche nur für Thron des Bhaal

die Interdia.2da wird abgefragt wenn es um Banter geht. Da stehen also die Banterdateien drin.
 

Aeri

Senior Member
Registriert
03.10.2010
Beiträge
201
Danke soweit, das mit dem Script habe ich schon verstanden.
Ich meinte vielmehr, dass der Dialogblock ausgeführt werden sollte wenn ich den NPC nochmal anspreche (IF ~NumTimesTalkedToGT(0)~).
Doch egal wie oft ich Testi anspreche, der Dialog ist immer der selbe :-/
 

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
Wenn du sie noch nicht auf Neutral geändert hast dann musst du das machen. Ich habs gerade mal ausprobiert und es scheint, dass PCs immer auf NumTimesTalkedTo(0) stehen.
 

Aeri

Senior Member
Registriert
03.10.2010
Beiträge
201
So, ich hab mich dann auch mal an den ersten ernsthaften Dialog gesetzt.
Folgender Dialog soll quasi in die Geschehnisse meines Mods einführen und auch gleich ein paar Questlog einträge liefern. (dazu siehe unten)

Hier mal mein Dialog:

IF ~NumTimesTalkedTo(0)~ THEN BEGIN InitialTalk
SAY ~Ihr dort! Bitte wartet!~
IF ~~ GOTO Talk2
END

IF ~~ THEN BEGIN Talk2
SAY ~Bitte bleibt einen Moment stehen, ich benötige Eure Hilfe!~
IF ~~ THEN REPLY ~Beruhigt Euch, wie kann ich Euch helfen?~ GOTO Help
IF ~~ THEN REPLY ~Nun gut, aber lasst Euch gesagt sein, dass meine Dienste nicht umsonst sind.~ GOTO Pay
IF ~~ THEN REPLY ~Es tut mir Leid, aber ich habe keine Zeit um mich Euren Problemem zu widmen.~ GOTO NoTime
IF ~~ THEN REPLY ~Zur Seite, Dirne! Eure Probleme interessieren mich nicht!~ GOTO Decline
END

IF ~NumTimesTalkedToGT(0)~ THEN BEGIN InitialTalk2
SAY ~Wollt Ihr mir nun helfen? Ich flehe euch an!~
IF ~~ THEN REPLY ~Beruhigt Euch, wie kann ich Euch helfen?~ GOTO Help
IF ~~ THEN REPLY ~Nun gut, aber lasst Euch gesagt sein, dass meine Dienste nicht umsonst sind.~ GOTO Pay
IF ~~ THEN REPLY ~Es tut mir Leid, aber ich habe immer noch keine Zeit.~ GOTO NoTime
IF ~~ THEN REPLY ~Ich sagte doch bereits, verschwindet!~ GOTO Decline
END

IF ~~ THEN BEGIN Pay
SAY ~Ich biete Euch mein ganzes Geld, wenn Ihr mir nur helft!~
IF ~~ THEN REPLY ~Musik in meinen Ohren, was ist Euer Anliegen?~ GOTO Help
END

IF ~~ THEN BEGIN Help
SAY ~Mystra sei gepriesen, endlich erhört mich jemand!~
= ~Wir wurden letzte Nacht nicht weit nördlich von hier überfallen. Sie kamen nachts während wir schliefen, wir konnten uns nicht einmal verteidigen...~
IF ~~ THEN REPLY ~Und wir sollen nun Euer Hab und Gut von den Räubern beschaffen nehme ich an?~ GOTO Property
IF ~~ THEN REPLY ~"Wir"? Ihr seid nicht alleine?~ GOTO We
END

IF ~~ THEN BEGIN Property
SAY ~*Taldrins stimme zittert während sie spricht* Es geht nicht um Geld oder irgendwelche Gegenstände! Sie haben mir etwas viel wichtigeres genommen.~
= ~Meine Tochter und ich waren nach Norden unterwegs. Ich d-dachte ich könnte uns beschützen!~
= ~Bitte! Ihr müsst sie zurückholen!~
IF ~~ THEN REPLY ~Ihr seid getrennt worden? Wo ist sie jetzt?~ GOTO Where
END

IF ~~ THEN BEGIN We
SAY ~*Taldrins stimme zittert während sie spricht* N-nein, meine Tochter und ich waren nach Norden unterwegs. Ich d-dachte ich könnte uns vor den Gefahren der Straße beschützen!~
= ~Bitte! Ihr müsst sie zurückholen!~
IF ~~ THEN REPLY ~Ihr seid getrennt worden? Wo ist sie jetzt?~ GOTO Where
END

IF ~~ THEN BEGIN Where
SAY ~Ich weiß es nicht, sie haben sie gepackt und verschleppt ehe ich meine Waffe ergreifen konnte.~
= ~Sie hatten es nur auf Alienne abgesehen. Normalerweise kann sie auf sich selbst aufpassen, aber anscheinend wurde sie ebenfalls überrascht.~
= ~Das letzte was ich von ihnen sah war, wie sie Richtung Norden flüchteten.~
IF ~~ THEN REPLY ~Wir werden alles daran setzen sie zu finden, macht Euch keine Sorgen!~ GOTO Accept
IF ~~ THEN REPLY ~Das klingt nach einer langen und schwierigen Aufgabe. Wenn die Bezahlung stimmt können wir sofort aufbrechen.~ GOTO AcceptPay
IF ~~ THEN REPLY ~Warum wendet Ihr euch nicht an die Flammende Faust?~ GOTO Guard
IF ~~ THEN REPLY ~Das klingt nach jeder Menge Ärger. Wir können keine weiteren Feinde gebrauchen, wir müssen ablehnen.~ GOTO Decline
END

IF ~~ THEN BEGIN Guard
SAY ~Die Faust? Diese Tölpel sind ihren Sold nicht wert! Ohne konkrete Anhaltspunkte waren sie nicht bereit die Entführer zu verfolgen.~
= ~Bitte, ich brauche Eure Hilfe. Alleine werde ich es kaum schaffen die Verfolgung aufzunehmen!~
IF ~~ THEN REPLY ~Wir werden alles daran setzen sie zu finden, macht Euch keine Sorgen!~ GOTO Accept
IF ~~ THEN REPLY ~Das ist eine schwierigen Aufgabe, aber wenn die Bezahlung stimmt können wir sofort aufbrechen.~ GOTO AcceptPay
IF ~~ THEN REPLY ~Das klingt nach jeder Menge Ärger. Es tut uns Leid, aber wir können keine weiteren Feinde gebrauchen, wir müssen ablehnen.~ GOTO Decline
END

IF ~~ THEN BEGIN Accept
SAY ~Ich weiß garnicht wie ich Euch danken kann! Ihr solltet Eure Suche in Beregost beginnen, die Entführer haben sicherlich in einem der Wirthshäuser übernachtet.~
= ~Wir haben keine Zeit zu verlieren, Ihr solltet gleich aufbrechen! Ich werde mich ebenfalls dorthin begeben und mich umhören.~
= ~Möge Mystra Euch beistehen.~
IF ~~ THEN EXIT
END

IF ~~ THEN BEGIN AcceptPay
SAY ~Ich gebe Euch alles was ich habe, solange Ihr mir nur meine Alienne zurückbringt! Ihr solltet Eure Suche in Beregost beginnen, die Entführer haben sicherlich in einem der Wirthshäuser übernachtet.~
= ~Wir haben keine Zeit zu verlieren, Ihr solltet gleich aufbrechen! Ich werde mich ebenfalls dorthin begeben und mich umhören.~
= ~Möge Mystra Euch beistehen!~
IF ~~ THEN EXIT
END

IF ~~ THEN BEGIN NoTime
SAY ~Ich flehe Euch an, es ist von größter Wichtigkeit! Wenn Ihr Zeit findet kommt bitte umgehend zu mir!~
IF ~~ THEN EXIT
END

IF ~~ THEN BEGIN Decline
SAY ~*Taldrin schaut Euch ungläubig an und wendet sich schließlich mit Tränen in den Augen ab.* ~
IF ~~ THEN EXIT
END

Was haltet ihr von dem Text? Passt sich mein Schreibstil (soweit erkennbar) in das Spiel gut ein? Verbesserungsvorschläge?



Außerdem habe ich noch ein Problem mit den Journalentries, die wollen nicht so recht.
Ich habe z.B. versucht einen Eintrag wie folgt zu verfassen (copy paste aus nem Tutorial)

IF ~~ THEN BEGIN Accept
SAY ~Ich weiß garnicht wie ich Euch danken kann! Ihr solltet Eure Suche in Beregost beginnen, die Entführer haben sicherlich in einem der Wirthshäuser übernachtet.~
= ~Wir haben keine Zeit zu verlieren, Ihr solltet gleich aufbrechen! Ich werde mich ebenfalls dorthin begeben und mich umhören.~
= ~Möge Mystra Euch beistehen.~ DO ~SetGlobal("EntryTest","GLOBAL",1)~
UNSOLVED_JOURNAL %Quest Entry

This should be your quest entry.% EXIT
END


Leider meckert der Installer hier immer beim "DO", wo liegt der Fehler?

Ps: Nein, ich werde jetzt nicht für jeden Dialog eure Meinung einholen :-P
 

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
Ein Dialog ist immer sp aufgebaut:


IF ~~ THEN BEGIN Accept
SAY ~...~ = ~...~ = ~...~
IF ~~ THEN DO ~SetGlobal("EntryTest","GLOBAL",1)~ UNSOLVED_JOURNAL %Quest Entry

This should be your quest entry.% EXIT
END

So geht's.
 

Wedge

Wedgetarian
Registriert
04.07.2007
Beiträge
9.373
Was Ascalon damit sagen tut, ist, dass du deine Transition (IF ~~ THEN oder ++ ~~) brauchst, an die du deine Actions (DO, UNSOLVED_JOURNAL) anhängen kannst.

IF ~~ THEN BEGIN bla //Statekopf und Eröffnungsbedingungen (conditions)
SAY ~etepetete~ = ~mehr etepetete~ = ~noch mehr~ //das was gesagt wird von einer einzigen Person
IF ~~ THEN DO ~~ /*muss nicht sein*/ UNSOLVED_JOURNAL ~~ /*muss auch nicht sein*/ GOTO/EXTERN/EXIT //muss immer sein und das ganze sind dann die Bedingungen für und das Ziel für den Übergang (transition).
 

Aeri

Senior Member
Registriert
03.10.2010
Beiträge
201
Kann ich auch mehrere "DO"s zusammen ausführen?
z.B. den Journal Entry verfassen und den NPC das Gebiet verlassen lassen.

IF ~~ THEN BEGIN Blub
SAY ~Plop.~
IF ~~ THEN DO ~EscapeArea()~ DO ~SetGlobal("EntryTest","GLOBAL",1)~ UNSOLVED_JOURNAL %Quest Entry

This should be your quest entry.%
EXIT
END
 

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
Du kannst verschiedene Befehle zusammenfassen. Allerdings brauchst du nur ein DO dafür:

Code:
DO ~SetGlobal("EntryTest","GLOBAL",1)EscapeArea()~

Und immer darauf achten, dass Befehle wie EscapeArea() oder DestroySelf() oder StartDialogNoSet() am Ende der Kette stehen, sonst werden die anderen Befehle nicht ausgeführt.
 

Jarl

Senior Member
Registriert
28.04.2006
Beiträge
982
Ja, aber die schreibst du hintereinander weg:

IF ~~ THEN BEGIN Blub
SAY ~Plop.~
IF ~~ THEN DO ~SetGlobal("EntryTest","GLOBAL",1)EscapeArea()~ UNSOLVED_JOURNAL %Quest Entry

This should be your quest entry.% EXIT
END

Befehle wie DestroySelf() EscapeArea() usw. immer als letztes ;) Denn sobald die Person verschwunden ist, würden nachfolgende Befehle nicht mehr ausgeführt werden...

Gruß Jarl

EDIT: Hööp? Wo kommt denn dein post plötzlich her, Ascalon? :hae:
 

Aeri

Senior Member
Registriert
03.10.2010
Beiträge
201
Ok, das sieht doch schonmal sehr gut aus.
Die Syntax ist mir an einigen Stellen noch nicht gazn klar, aber mit Try&Error kommt man ja auch gut voran :-P

Mal schauen wos als nächstens hängen wird ;-)
 

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
Ach, das sind alles Kinderkrankheiten, das verwächst sich mit der Zeit. Irgendwann macht's dann plopp und gut ist. Schau dir vor allem Mods an, in denen der eine oder andere Effekt passiert den du auch erzielen willst. So lernt man am besten.

@ Jarl: Hab ich mit EXTEND_TOP eingefügt. Wieso?
 

Jarl

Senior Member
Registriert
28.04.2006
Beiträge
982
Oh, war mehr ne rhetorische Frage. Ich wunderte mich nur, dass du bereits 5 Minuten vor mir dasselbe geschrieben hast, ohne dass ich den Post bei mir gesehen habe ;)
 

Aeri

Senior Member
Registriert
03.10.2010
Beiträge
201
Genau das habe ich vor bzw. bereits gemacht :-P
 

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
Witzige Anekdote am Rande: Als ich mit dem Modden angefangen und mich bei den Rosenranken angemeldet habe, war genau das meine erste Frage:

Code:
SAY ~Alles klar.~ Do ~SetGlobal("AscJoinedParty","GLOBAL",1)JoinParty()~ EXIT

wo ist der Fehler? :D
 
Oben