[Modding] Anfängerfragen Modding

Toran

Schattenritter
Registriert
09.03.2008
Beiträge
2.377
Ich habe mal ein paar grundlegende Fragen zum Erstellen eines Mods. Ich will einen NPC erstellen, der in die Gruppe aufgenommen werden kann und Dialoge mit dem HC führen kann. Mehr erst mal nicht.

Ich habe schon in diverse Tutorials reingeschaut, blicke momentan aber nicht so ganz durch.

Ich brauche doch 4 Dateien:
NPC.J - Aufnahme des NPC
NPC.P - Rauswurf des
NPC.D - Dialoge mit dem HC
BNPC - Dialog auf Situatioen

In welche Kommen später den Flirt und Romanzendialoge?
In die NPC.D?

Wie kann ich diese Dateien mit der NPC.CRE verknüpfen?
Mit NearInfinity?
Wenn ja, welche Datei wird welcher Variablen zugeordnet?




Ich habe auf d:\ die Weidu.exe kopiert und eine Datei LUCY.j angelegt.
In dieser soll der Aufnahmedialog stattfinden. Wenn ich sie mit Weidu LUCY.d
compiliere bekomme ich eine Fehlermeldung. Muss ich die Datei anders kompilieren oder ist die Datei falsch.

BEGIN LUCY

SetGlobal("Furie","LOCALS",I:0)

IF inParty("Aerie")
SetGlobal("Furie","LOCALS",1
END


IF ~NumTimesTalkedTo(0)
Gender(Player1,"MALE")
!alignment(Player1,"LAWFUL_GOOD")
!alignment(Player1,"LAWFUL_NEUTRAL")
!alignment(Player1,"LAWFUL_GOOD")
!alignment(Player1,"NEUTRAL_GOOD")
!alignment(Player1,"NEUTRAL")
!alignment(Player1,"CHAOTIC_GOOD")
!alignment(Player1,"CHAOTIC_NEUTRAL")
ReputationLT(Player1,13)~
THEN BEGIN Aufnahmedialog01
SAY~(Ihr seht eine Dame, die sich Euch gemächlich nähert. Ihre Kleidung ist von allerbester Qualität Als Sie Euch erreicht hat bleibt Sie stehen. Mit blasierter Mine hält Sie Euch vornehm die Hand hin.)~
IF ~~ THEN REPLY
~(Als Kavalier bemerkt Ihr sofort, dass Sie einen Handkuss erwartet. Eine Pflicht, der Ihr mit Vergnügen nachkommt. Euer Handkuss ist perfekt.) Es ist mir ein außerordentliches Vergnügen, eine wunderschöne Dame wie Euch kennen zu lernen. Gestattet mir mich vorzustellen: Ich bin <CHARNAME>. Mit wem habe ich das Vergnügen?~
GOTO Kavalier
IF ~~ THEN REPLY
~(Als Kavalier bemerkt Ihr sofort, dass Sie einen Handkuss erwartet. Eine Pflicht, der Ihr mit Vergnügen nachkommt.) Es ist mir ein Vergnügen Euch kennen zu lernen. Ich bin <CHARNAME>. Mit wem habe ich das Vergnügen?~
GOTO Kavalier
IF ~~ THEN REPLY
~(Als Kavalier bemerkt Ihr sofort, dass Sie einen Handkuss erwartet. Eine Pflicht, der Ihr mit Vergnügen nachkommt.) Es ist mir ein Vergnügen, eine wunderschöne Dame wie Euch kennen zu lernen. Gestattet mir mich vorzustellen: Ich bin <CHARNAME>. Mit wem habe ich das Vergnügen?~
GOTO Kavalier
IF ~~ THEN REPLY
~(Als Kavalier bemerkt Ihr sofort, dass Sie einen Handkuss erwartet. Eine Pflicht, der Ihr mit Vergnügen nachkommt.) Es ist mir ein Vergnügen Euch kennen zu lernen. Ich bin <CHARNAME>. Mit wem habe ich das Vergnügen?~
GOTO Kavalier
IF ~~ THEN REPLY
~(Als Kavalier bemerkt Ihr sofort, dass Sie einen Handkuss erwartet. Eine Pflicht, der Ihr nicht nachkommt. Was bildet dieses Weib Sich ein?) Was wollt Ihr von mir?~
GOTO Holzklotz
END


IF ~~ THEN BEGIN Kavalier
SAY~Gestattet das ich mich vorstelle. Ich bin Lady Lucretia Sadre~
IF ~~ THEN REPLY
~Ja, reist mit uns.~ DO ~SetGlobal("LucretiaJoinedParty","GLOBAL",1)JoinParty()~EXIT
IF ~~ THEN REPLY
~Nein, zur Zeit nicht~
GOTO AngebotAblehnen
END

IF ~~ THEN Holzklotz
SAY~(Ihr Gesicht nimmt einen extrem überheblichen Ausdruck an, als Sie Euch antwortet). Mit Pöbel wie Euch gebe ich mich nicht ab. (Mit geschürzter Robe rauscht Sie von dannen. Ihr werdet Sie nie wiedersehen.)~
IF ~~ THEN REPLY
~EscapeAera()~
GOTO Ende
END


IF ~~ THEN BEGIN Aufnahmedialog01
SAY~Gestattet das ich mich vorstelle. Ich bin Lady Lucretia Sadre~
IF ~~ THEN REPLY
~Ja, reist mit uns.~ DO ~SetGlobal("LucretiaJoinedParty","GLOBAL",1)JoinParty()~EXIT
IF ~~ THEN REPLY
~Nein, zur Zeit nicht~
GOTO AngebotAblehnen
END


IF ~~ THEN BEGIN AngebotAblehnen
SAY ~Na schön, ich werde warten bis ihr zurückkommt.~
IF ~~ THEN
EXIT
END

IF ~~ THEN BEGIN Ende
SAY~~
END

Die Fehlermeldung lautet in etwa:
Parse Error on line 3 near Text SetGlobal
Not an Integer


Viele Fragen und für die meisten von euch wahrscheinlich absolute Grundlagen, aber ich habe mich eben noch nie an einem Mod versucht...
 
Zuletzt bearbeitet:

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
Fast. Du braucht folgendes:

NPC.D -> Alles das, was gesagt wird, wenn der NPC noch nicht in der Gruppe ist.
NPCJ.D -> Wird im Script mit "StartDialogNoSet" gestartet. Das können Dialoge mit dem HC, getimte GEspräche mit anderen NPCs oder einfach nur Kommentare sein.
NPCB.D -> Wird im Script mit "Interact" gestartet, kann alles das sein, was NPCJ.D auch kann, allerdings werden hier auch die Banter, die zufällig vom Programm gestartet werden und ich glaube auch die PIDs (Player initiated Dialogs) abgerufen.
NPCP.D -> Gespräche, die stattfinden, sobald der NPC Teil der Gruppe war und dann rausgeworfen wurde.

Die Endung ist immer .D !!!

Außerdem ist die Zeile "SetGlobal("Furie","LOCALS",I:0)" überflüssig, da alle Variablen am Anfang den Wert Null haben. Dazu kommt dass du eine Bedingung stellen musst:

IF
!Globall("Furie","LOCALS",0)
THEN
RESPONSE #100
SetGlobal("Furie","LOCALS"0)
END

Zum Beispiel.
 
Zuletzt bearbeitet:

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
Und so wäre es richtig:

DIESER Block gehört in das Script. LUCY.BAF z.B.

IF //WENN
InParty("Aerie") //Sich Aerie in der Gruppe befindet
THEN //Dann
RESPONSE #100 //Mache folgendes auf jeden Fall. #50 wäre nur in der Hälfte der Fälle z.B.
SetGlobal("Furie","LOCALS",1)
END


DIESER Teil kommt in die Datei Lucy.D

BEGIN LUCY

IF ~NumTimesTalkedTo(0)
Gender(Player1,"MALE")
!alignment(Player1,"LAWFUL_GOOD")
!alignment(Player1,"LAWFUL_NEUTRAL")
!alignment(Player1,"LAWFUL_GOOD")
!alignment(Player1,"NEUTRAL_GOOD")
!alignment(Player1,"NEUTRAL")
!alignment(Player1,"CHAOTIC_GOOD")
!alignment(Player1,"CHAOTIC_NEUTRAL")
ReputationLT(Player1,13)~
THEN BEGIN Aufnahmedialog01
SAY~(Ihr seht eine Dame, die sich Euch gemächlich nähert. Ihre Kleidung ist von allerbester Qualität Als Sie Euch erreicht hat bleibt Sie stehen. Mit blasierter Mine hält Sie Euch vornehm die Hand hin.)~
IF ~~ THEN REPLY
~(Als Kavalier bemerkt Ihr sofort, dass Sie einen Handkuss erwartet. Eine Pflicht, der Ihr mit Vergnügen nachkommt. Euer Handkuss ist perfekt.) Es ist mir ein außerordentliches Vergnügen, eine wunderschöne Dame wie Euch kennen zu lernen. Gestattet mir mich vorzustellen: Ich bin . Mit wem habe ich das Vergnügen?~
GOTO Kavalier
IF ~~ THEN REPLY
~(Als Kavalier bemerkt Ihr sofort, dass Sie einen Handkuss erwartet. Eine Pflicht, der Ihr mit Vergnügen nachkommt.) Es ist mir ein Vergnügen Euch kennen zu lernen. Ich bin . Mit wem habe ich das Vergnügen?~
GOTO Kavalier
IF ~~ THEN REPLY
~(Als Kavalier bemerkt Ihr sofort, dass Sie einen Handkuss erwartet. Eine Pflicht, der Ihr mit Vergnügen nachkommt.) Es ist mir ein Vergnügen, eine wunderschöne Dame wie Euch kennen zu lernen. Gestattet mir mich vorzustellen: Ich bin . Mit wem habe ich das Vergnügen?~
GOTO Kavalier
IF ~~ THEN REPLY
~(Als Kavalier bemerkt Ihr sofort, dass Sie einen Handkuss erwartet. Eine Pflicht, der Ihr mit Vergnügen nachkommt.) Es ist mir ein Vergnügen Euch kennen zu lernen. Ich bin . Mit wem habe ich das Vergnügen?~
GOTO Kavalier
IF ~~ THEN REPLY
~(Als Kavalier bemerkt Ihr sofort, dass Sie einen Handkuss erwartet. Eine Pflicht, der Ihr nicht nachkommt. Was bildet dieses Weib Sich ein?) Was wollt Ihr von mir?~
GOTO Holzklotz
END


IF ~~ THEN BEGIN Kavalier
SAY~Gestattet das ich mich vorstelle. Ich bin Lady Lucretia Sadre~
IF ~~ THEN REPLY
~Ja, reist mit uns.~ DO ~SetGlobal("LucretiaJoinedParty","GLOBAL",1)JoinParty()~EXIT
IF ~~ THEN REPLY
~Nein, zur Zeit nicht~
GOTO AngebotAblehnen
END

IF ~~ THEN Holzklotz
SAY~(Ihr Gesicht nimmt einen extrem überheblichen Ausdruck an, als Sie Euch antwortet). Mit Pöbel wie Euch gebe ich mich nicht ab. (Mit geschürzter Robe rauscht Sie von dannen. Ihr werdet Sie nie wiedersehen.)~
IF ~~ THEN DO ~EscapeAera()~ EXIT //Hier brauchts kein GOTO mehr!
END


IF ~~ THEN BEGIN Aufnahmedialog01
SAY~Gestattet das ich mich vorstelle. Ich bin Lady Lucretia Sadre~
IF ~~ THEN REPLY
~Ja, reist mit uns.~ DO ~SetGlobal("LucretiaJoinedParty","GLOBAL",1)JoinParty()~EXIT
IF ~~ THEN REPLY
~Nein, zur Zeit nicht~
GOTO AngebotAblehnen
END


IF ~~ THEN BEGIN AngebotAblehnen
SAY ~Na schön, ich werde warten bis ihr zurückkommt.~
IF ~~ THEN EXIT
END
 

Wedge

Wedgetarian
Registriert
04.07.2007
Beiträge
9.373
Und in Zeile 5 kommt dann der nächste Fehler, weil in Zeile 4 hinten die Klammer fehlt. ^^ Und dann könntest du Probleme bekommen, weil du den zweiten Wert der Conditions in "" gesetzt hast. Ich kenne es nur ohne, aber vielleicht geht es auch mit.

Des weitern musst du ganz am Anfang bei dem ersten BEGIN schauen, was du da beginnst. Der Dateiname ist erstmal egal, wichtig ist, was da steht. Bei deinem Beispiel compilierst (erstellst) du die LUCY.DLG, egal ob die Datei LUCYJ.D oder was auch immer heißt.


EDIT:
Mal wieder viel zu langsam... :D
 

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
Es ist dann, um die Verwirrung vollkommen zu machen, total Wurst, ob die Datei LUCY.D, Hanswurst.D oder sonstwie heißt. Wenn die Datei von Weidu compiliert wird, wird das Gespräch eh in viele Bröckchen aufgebrochen, die den DLG-Dateien zugewiesen werden, die mit BEGIN gekennzeichnet werden. Wenn BEGIN LUCY am Anfang steht, wird alles, was danach kommt, in die Datei LUCY.DLG gehauen, bis ein neues BEGIN kommt.
 

Lich

Senior Member
Registriert
14.09.2007
Beiträge
1.560
IF ~NumTimesTalkedTo(0)
Gender(Player1,"MALE")
!alignment(Player1,"LAWFUL_GOOD")
!alignment(Player1,"LAWFUL_NEUTRAL")
!alignment(Player1,"LAWFUL_GOOD")
!alignment(Player1,"NEUTRAL_GOOD")
!alignment(Player1,"NEUTRAL")
!alignment(Player1,"CHAOTIC_GOOD")
!alignment(Player1,"CHAOTIC_NEUTRAL")
ReputationLT(Player1,13)~

LAWFUL_GOOD ist zweimal gennant, außerdem kannst du dir hier die ganzen einzelnen Gesinnungsauflistungen sparen, in dem du folgendes schreibst:

!alignment(Player1,"MASK_GOOD")
!alignment(Player1,"MASK_GENEUTRAL")

Damit wird jeder nichtböse PC ausgeschlossen.

Außerdem trat der Parse Error auf, weil eine Zahl erforderlich ist, du jedoch Buchstaben verwendet hast.

Lich
 
Zuletzt bearbeitet:

Toran

Schattenritter
Registriert
09.03.2008
Beiträge
2.377
Hier steh ich nun ich armer Tor(an) und bin so klug wie zuvor. ;)

Ich wollte erst mal um die Sache einfach zu halten Logik und Texte in der
LUCY.d lassen. Mein Ziel war es eigentlich, dass Aerie beim Anmeldedialog dazwischenfunken soll, weil ihr Lucy viel zu hochnäsig ist.

Ich wandele die Datei bisher mit d:\weidu lucy.d um.

Wenn LUCY.d so aussieht


Code:
BEGIN LUCY

IF //WENN
InParty("Aerie") //Sich Aerie in der Gruppe befindet
THEN //Dann
RESPONSE #100 //Mache folgendes auf jeden Fall. #50 wäre nur in der Hälfte der Fälle z.B.
SetGlobal("Furie","LOCALS",1) 
END

bekomme ich eine Fehlermeldung die sich auf Zeile 4 bezieht.


Das mit
!alignment(Player1,"MASK_GOOD")
!alignment(Player1,"MASK_GENEUTRAL")
hat funktioniert danke.
 
Zuletzt bearbeitet:

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
Weil das eben nicht in die LUCY.D gehört, sondern ins Script. Wenn sich Aerie einmischen soll, dann ist das einfachste eine CHAIN daraus zu machen.
 

Lich

Senior Member
Registriert
14.09.2007
Beiträge
1.560
Ganz einfach, das sollte da auch nicht rein;)

Wie Ascalon schon schrieb, kommt sowas am besten in ihr Skript. Natürlich auch noch entsprechender Code, der das ganze rückgängig macht, wenn man Aerie nicht mehr in der Party hat, wenn man Lucy
anspricht.

Lich
 
Zuletzt bearbeitet:

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
In diesem Fall braucht es gar keine Variable. Da geht es mit eienr CHAIN wirklich einfacher:

CHAIN
IF ~~ THEN LUCY Kavalier
SAY~Gestattet das ich mich vorstelle. Ich bin Lady Lucretia Sadre~
==BAERIE IF ~InParty("AERIE")~ THEN ~Eigebildete Gans.~
END
IF ~~ THEN REPLY ~Ja, reist mit uns.~ DO ~SetGlobal("LucretiaJoinedParty","GLOBAL",1)JoinParty()~EXIT
IF ~~ THEN REPLY
~Nein, zur Zeit nicht~
GOTO AngebotAblehnen
 

Toran

Schattenritter
Registriert
09.03.2008
Beiträge
2.377
Vielen Dank erstmal.

Und wie kriege ich die Scripte und Texte zusammen?
 

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
Compilieren. :D

Aber das sind doch alles die absoluten Grundlagen, die sind doch in jedem Tutorial beschrieben, oder? Hm, ich seh schon, irgendwann muss ich DOCH noch mal ein vernünftiges Tutorial schreiben... :D
 

Toran

Schattenritter
Registriert
09.03.2008
Beiträge
2.377
So genau wollte ich es eigentlich nicht wissen :D Aber mal ernsthaft.

Ich versuche das ganze erst mal sehr einfach zu halten, um es besser zu verstehen. Deshalb stehen Scripte und Texte noch in den selben Dateien und ich hangele mich von Fehler zu Fehler weiter. Zur Zeit habe ich folgende Setup.Lucy.tp2:

BACKUP ~Lucy/backup~
AUTHOR ~Ich~

VERSION ~1.0~

BEGIN "Lucy"
COPY ~Lucy1/Lucy.cre~ ~override/Lucy.cre~


COMPILE ~Lucy1/Lucy.d~
COMPILE ~Lucy1/LucyJ.d~
COMPILE ~Lucy1/LucyB.d~
COMPILE ~Lucy1/LucyP.d~

EXTEND_BOTTOM ~AR0602.bcs~ ~Lucy1/AR0602.BAF~

//CamDawgs CD_STATE_NOTVALID zum Checken der Dialogfähigkeit eines Char
//Thank you very much, CamDawg!
APPEND ~STATE.IDS~ // adds custom IsValidForPartyDialogue state
~0x80101FEF CD_STATE_NOTVALID~
UNLESS ~CD_STATE_NOTVALID~

APPEND ~pdialog.2da~
~Lucy LucyP LucyJ LucyD LucyP LucyJ LucyD Lucy25~
UNLESS ~Lucy~

APPEND ~interdia.2da~
~Lucy LucyB LucyB25~
UNLESS ~Lucy~

Die Compilierung funktioniert einwandfrei und Lucy erscheint auch an der gewünschten Stelle. So weit so gut.

Was überhaupt nicht funktioniert sind die Dialoge.

Müssen die Dialogdateien vor dem Compilieren, mit NearInfinity, mit der Lucy.cre verknüpft werden?

Wenn ja, mit welchem Parameter muss welche Datei verknüpft werden?
 

Wedge

Wedgetarian
Registriert
04.07.2007
Beiträge
9.373
Ja klar, du musst natürlich deiner CRE ihr Sript und ihre dlg zuweisen.

Hast du dir denn schonmal ein Tutorial angeschaut? Dieses hier behandelt die grundlegensten Grundlagen und das Englisch ist äußerst simple.

Das zuweisen ist äußerst simple. Einfach mit NI öffnen und die entsprechenden Namen an die entsprechenden Stellen schreiben.
 

Toran

Schattenritter
Registriert
09.03.2008
Beiträge
2.377
Ich habe knapp 3 Tage die verschiedensten Tutorials durchgestöbert, bevor ich hier die erste Frage gestellt habe. Dabei habe ich mich wohl gewaltig verzettelt, zumal ich grosse Probleme mit der Schreibweise hatte. :o
 

Wedge

Wedgetarian
Registriert
04.07.2007
Beiträge
9.373
Ach was, aller Anfang ist schwer. ^^

Sobald man sich sich ein wenig eingearbeitet hat, fällt einem das auch leichter und man bemerkt selber, dass ein Fehler an einer bestimmten Stelle liegen könnte, auch wenn man vielleicht anfangs nicht weiß, wie man den Fehler beheben soll.

Das Problem am Anfang ist einfach, dass man Sachen vergisst oder übersieht und dann keine Ahnung hat, warum irgendwas nicht funktioniert. Da sprech ich aus eigener Erfahrung. :D
 

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
Wenn ich daran denke, was ICH damals alles für Fragen gestellt hab... das darf man eigentlich keinem erzählen (z.B. die kompletten Rosenranken mehrere Tage beschäftigt, weil ich steif und fest behauptet hatte, alles richtig gemacht zu haben, nur eben die Scripte und die Dialoge eben NICHT mit meiner Figur verbunden). :D

Das mit dem Script und den Dialogen in einer Datei verwirrt mich allerdings. Geht denn das eigentlich? :confused:
 

Toran

Schattenritter
Registriert
09.03.2008
Beiträge
2.377
Kaum macht mans richtig finktioniert das ganze auch. Ich weiss nur nicht weshalb. ;)

Sorry, aber das oben genannte Tutorial drückt sich an der Stelle der Verknüpfungen der Dialogdatein mit der .cre meiner Meinung nach etwas unklar aus (mal K#JOHN / mal K#JOHN.d).

Scripte und Texte:
Es scheint ansatzweise zu klappen. Ich weiss allerdings nicht ob die Syntax die gleiche ist und alle Befehle zur Vefügung stehen.
 
Zuletzt bearbeitet:

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
Vielleicht liegt es daran, dass du noch gar kein richtiges Skript geschrieben hast. Sonst wirst du nämlich eine .baf-Datei brauchen. Vielleicht bin ich schon ein bisschen zu tief drin, aber ich hab das Tutorial mal überflogen und versteh nicht, wo das Problem ist. Klingt alles vollkommen glasklar.
 
Oben