[Modding] Moderstellung - Fragen / Ideen / Umsetzung

Callindor

Senior Member
Registriert
03.05.2008
Beiträge
2.180
Danke, funktioniert.
 

Callindor

Senior Member
Registriert
03.05.2008
Beiträge
2.180
Gibt es eine Seite oder Programm, wo genormte Trigger aufgelistet sind, wie also Bedingungen im Allgemeinen formuliert sind? Und was es neben escapearea und escapeareamove, create, delete, spawn, die ... noch so gibt. Sozusagen eine Übersicht aller Legosteine? ...^^
 

Callindor

Senior Member
Registriert
03.05.2008
Beiträge
2.180
350 script actions ...

wow, das nenn ich mal ne lange Liste. Was finden, bzw. es erstmal im Kopf behalten ist da echt eine Herausforderung. :c:

Eh ich so weit bin dauert es sicher noch etwas, aber ich kann ja meine Idee schon mal umreißen.

Nachdem Calistro HC in Kerzenburg getroffen hat, spawnt er auf der Treppe im freundlichen Arm und hat ein Intermezzo mit Tarnesh, in dessen Verlauf Calistro Tarnesh zu Stein verwandelt.

Nun habe ich bei den Action Scripts gelesen, dass benutzte Zauber eingeprägt sein und die Figur über das nötige Level verfügen muss. Andererseits ist der *UseItem*-Befehl unwirksam (Nr. 97) *klick*

Gibt's eine andere Möglichkeit, dass eine Figur die Schriftrolle *Versteinerung* benutzt und es nicht über eingeprägte Zauber laufen muss?
 
Zuletzt bearbeitet:

Wedge

Wedgetarian
Registriert
04.07.2007
Beiträge
9.373
Benutze ForceSpell()/ForceSpellRES(). Bzw wenn du das in ner cutscene machst, kannst du dir auch nen eigenen Zauber basteln.
 

Callindor

Senior Member
Registriert
03.05.2008
Beiträge
2.180
Code:
BEGIN BCCal
CHAIN IF ~See(Player1)
	AreaCheck("AR2300")
	GLOBAL("CalistroTalkHC","GLOBAL",1)
	!StateCheck("TARNES",CD_STATE_NOTVALID)
	!StateCheck("CCAL",CD_STATE_NOTVALID)
	Global("CalistroTalksToTarnesh","GLOBAL",0)
	CombatCounter(0)
	See(ENEMY)
	!Dead("TARNES")
See("TARNES")~ THEN BCCal CalistroTalksToTarnesh1
~Wartet, Herr. Wir können ihn doch als Trophäe eurem Meister bringen. Und nicht verbrannt, zerstückelt oder ...~
DO ~SetGlobal("CalistroTalksToTarnesh","GLOBAL",1)~
== TARNES ~Unterbrich mich nicht! Wie kommst du denn jetzt auf so etwas, Bursche?~
== BCCAL ~Denkt doch nur an den Ruhm. Ihr Tarnesh, der das B ...~
== TARNES ~Genug! Dann machen wir es eben so. Hatte ohnehin noch eine Versteinerung übrig. Aber ihr werdet ihn tragen, verstanden?!~
== BCCAL ~Natürlich Meister, lasst mich nur alles vorbereiten.~
== TARNES ~Ich entbiete Euch ein Lebewohl. Wie gesagt, bleibt einfach noch kurz dort stehen.~
EXIT

IF ~GLOBAL("CalistroTalksToTarnesh","GLOBAL",1)~ THEN BEGIN TARNESHDEATH
SAY ~Nicht bewegen!~
IF ~~ THEN DO ~SetGlobal("CalistroTalksToTarnesh","GLOBAL",2)ClearAllActions()StartCutSceneMode()StartCutScene("TARNESHDEATH")~ EXIT
END

IF
	True()
THEN
	RESPONSE #100
		CutSceneId("CCal")
		Wait(2)
		ForceSpell("Tarnes",WIZARD_WORD_OF_POWER_STUN)
		Wait(2)
		DisplayStringHead(Myself,4439) // Argh ...
		Wait(2)
		ForceSpell("Tarnes",WIZARD_PETRIFICATION)
		Wait(2)
END

IF
	True()
THEN
	RESPONSE #100
		CutSceneId("Tarnes")
		Wait(5)
		DisplayStringHead(Myself,4439) // Was macht ihr da? Ihr sollt ihn versteinern, nicht mich, Idiot!
		Wait(2)
		DisplayStringHead(Myself,4439) // Verräter!
		ForceSpell(Myself,PRIEST_HARM)
		AttackNoSound("CCal")
		Wait(2)
		ForceSpell("CCal",WIZARD_PETRIFICATION)
END

IF
	True()
THEN
	RESPONSE #100
		CutSceneId(Player1)
		Wait(12)
		Petrificate("Tarnes")
		EndCutSceneMode()
END

Das ist meine Cutscene zwischen Calistro, Tarnesh und der Gruppe um HC. Das ganze soll unmitelbar an den Begrüßungsdialog anschließen, sobald Tarnesh feindlich wird. Da sind sicher noch Fehler drin. Da bitte ich um eine Korrektur. Und dann habe ich noch Fragen bzgl. einiger Befehle.

1. CombatCounter(0) und See Enemy, geht das zusammen?

1.5. Ist der Gespräch richtig geschrieben, wie heißen die Dialog/Banterordner für Chars aus BG1? BTARNE habe ich nicht gefunden oder etwas annäherndes.

2.Bricht die Attacke von Tarnesh nach dem Angriff mit dem Leid-Zauber ab, wenn noch ein "wait" danach folgt?

3. Wie kann ich einstellen, dass Tarnesh den Stun-Zauber zu 100% (Geht das dann auch mit response?) überwindet (auch über einen *give-Item*-Befehl mit handlungsfreiheit, wo müsste diese Zeile dann hin?) Ebenso soll der Leidbefehl zu 100% wirken und treffen, Tarnesh aber mit einer weiteren Nahkampfattacke nicht treffen (weil dann ja Calistro stirbt ...^^)

4. Ist die 4439 bei dem DisplayStringHead immer dieselbe oder ist das Char- bzw. Ortsspezifisch? Was bedeutet die Zahl?

5. Ist die Gesamtzeitberechnung der Cutscene passend? Ich weiß gar nicht, wie lange die Zauberanimationen gehen ... Gilt das Zauberlevel gleich Zauberzeit?

6. Gibt es überhaupt einen petrificate-Befehl (ich habe bei den Beispielen immer nur *kill* gesehen.

7. Und Tarnesh soll dann versteinert neutral und nicht feindlich sein, sonst müsste man ihn ja töten, was ich nicht will. Geht das mit *Neutral ("tarnes")* zwischen petrificate ("tarnes") und EndCutScenMode()?

Das ist der erste Versuch, jeweils aus Beispielen aus Foren reinkopiert und meinen Situationen angepasst, wie ich mir das so dachte und wie ich es halt auch machen wollte.
 
Zuletzt bearbeitet:

Wedge

Wedgetarian
Registriert
04.07.2007
Beiträge
9.373
Was den Code angeht: Dein State muss vor die CHAIN, sonst kann WeiDu damit nicht arbeiten. Außerdem kannst du Scripte (und das ist ne Cutscene) und Dialoge nicht miteinander mischen. Das muss beides in getrennte Dateien.


Zu dem anderen Kram.

1. Klar. Du kannst alles mischen. Die Frage ist nur, ob es auch funktioniert und du keine Logik konstruierst, die keine valide Antwort enthalten kann.

1.5. Nur Party-NPCs haben mehrere Dialogdateien (bzw. können es, denn Pflicht ist das nicht). Alle anderen haben nur eine einzige Datei (im Normalfall ^^).

2. Ka.

3. Die einfachste und sicherste Methode ist, sich eigene Zauber zu basteln, die nur die Grafikeffekte abspielen oder keinen Rettungswurf zulassen und ähnliches.

4. Der Befehl DisplayStringHead() benutzt den Test, der im angegeben wird. Wenn du da eine Nummer drinne hast, dann benutzt er den entsprechenden Text aus der dialog.tlk, wenn du einen eigenen Text haben willst, dann schreibst du den da einfach rein. Beispiel: DisplayStringHead(Myself,~Immer schön langsam mit den jungen Klosterkindern. Der Bogen gehört mir und das bleibt so.~)

5. Welche Gesamtzeitberechnung? Und was was meinst du mit Zauberzeit?

6. Der Opcode 134 sorgt für Versteinerung.

7. Seinen Status kannst du mit der Action Allegiance() ändern. Wäre dann sowas wie ActionOverride("Tarnes",Allegiance(Myself,NEUTRAL)) im letzten Block. Ob das da auch funzt, musst du ausprobieren.
 

White Agnus

Senior Member
Registriert
05.09.2008
Beiträge
5.088
Hab grade nicht wirklich viel Zeit, aber vielleicht kann ich ja ein paar Sachen beantworten... ;)

Du nutzt CD_STATE_NOTVALID fügst du das selbige auch in der tp2 hinzu?

1. Meines Wissens klappt dass zusammen nicht (wenn ein Feind gesichtet wird, steigt der CombatCounter...)

1.5. wieso suchst du nach ner BTARNE.dlg? Du kannst Tarnesh ja nicht aufnehmen, dem reicht seine normale dlg... ;)

4. Die Zahl ist der StringRef in der Dialog.tlk... ;)

7. Nimm doch einfach: ChangeEnemyAlly("TARNES",NEUTRAL) oder ActionOverride("Tarnes",Allegiance(Myself,NEUTRAL))

€dith sagt, Allegiance ist ja ein Trigger nimm lieber: ActionOverride("Tarnes",ChangeEnemyAlly(Myself,NEUTRAL))
 
Zuletzt bearbeitet:

Callindor

Senior Member
Registriert
03.05.2008
Beiträge
2.180
@ Wedge:

Also die Cutscene dauert ja Zeitintervalle, in denen das alles abläuft, und die Frage war einfach, ob so, wie es derzeit geschrieben steht, auch alles passend abläuft, also Zauber, Text, Zauber, Text, Angriff und nicht parallel und ob die Cutscene mit (12) lang genug ist oder sie endet, bevor alle Sachen durchgeführt wurden.
Und mit Zauberzeit meinte ich, dass z.B. Einkerkerung als Stufe 9 Zauber eben solange dauert wie der wait(9) - Befehl.

Ok, opcodes sind die Effekte im Spiel, das habe ich inzwischen rausgefunden, nur per google jetzt mal in einem Script erwähnt auf die Schnelle nicht. Wie und wo bau ich die ein?

edit: Du hast in Post #20 die CHAIN doch auch vor das IF gesetzt, wieso ist es jetzt hier andersrum? Wobei ich mich überhaupt frage, wohin die dann soll. Das ist doch insgesamt nur ein state. Ist die CHAIN in dem Sinne unnötig, denn sie soll ja scheinbar was verbinden. Außerdem stands so in dem Beispiel drin. Für sich gesehen, ist sie dann unnötig, das Beispiel wurde sicher mittendrin ausgeschnitten, dann macht es sicher mehr Sinn.

@ WA:

Nun ja, laut einem Thread über NPC-NPC-Dialog-Modding, überprüft das, den Status von wegen ansprechbar. Was sich dahinter noch weiter verbirgt, sehe ich dann irgendwann (;)) Entsprechend bin ich auch über damit zusammenhängende Paralleleinstellungen bei anderen Dateien noch nicht im Bilde.
Aber irgendwo muss ich halt mal mit irgendwas anfangen, sonst gebe ich bei der Gewaltigkeit an Sachen ja schon auf, bevor ich richtig beginne. Ich sitz schon seit drei Tagen hier und wenn ich anfangen will, ja womit eigentlich.

Wie geschrieben, war das ein erster Test, von dem, was sich von anderen Blöcken reinkopieren lässt und wie Trigger wann und wo eingeschoben werden.
 
Zuletzt bearbeitet:

White Agnus

Senior Member
Registriert
05.09.2008
Beiträge
5.088
Hmm, wie lange die Zauber dauern musst du dir halt bei den entsprechenden Zaubern rausziehen (da ist ja immer die Duration hinterlegt... ;))

Opcodes sind nichts anderes als Effekte, diese können bei Items, Spells, Creatures, Effects, etc. verwendet werden, im IESDP sind die mit kurzer Erklärung aufgelistet: http://iesdp.gibberlings3.net/opcodes/index.htm

Hmm, jep, das Ding überprüft ob ein NPC ansprechbar ist, dass Ding ist aber nicht im Vanilla BG2 enthalten, deswegen musst du es von der tp2 in die State.ids appenden:

Code:
APPEND ~STATE.IDS~ ~0x80101FEF CD_STATE_NOTVALID~
UNLESS ~CD_STATE_NOTVALID~

Näheres zu CD_STATE_NOTVALID: http://www.shsforums.net/topic/36779-using-cd-state-notvalid/
 

Callindor

Senior Member
Registriert
03.05.2008
Beiträge
2.180
Ich möchte gerne abhängig von den Antwortn von HC in den Dialogen analog zu Dragon Age sowas wie *stimmt zu* oder *ist dagegen* bei einer globalen/lokalen Variable einbauen. Gibt es etwas wie einen reduce- oder add-Befehl für sowas? Wo es sich unabhängig vom gerade bestehenden Wert um x verringert oder erhöht.
 

White Agnus

Senior Member
Registriert
05.09.2008
Beiträge
5.088
Nennt sich IncrementGlobal... ;)

109 IncrementGlobal(S:Name*,S:Area*,I:Value*)
This action alters the specified variable, in the specified scope, by the amount indicated. The amount can be positive or negative. Variables in the local scope cannot be changed with this action.

IF
See([EVILCUTOFF]
!Specifics(LastSeenBy(),4000)
!Inparty(LastSeenBy())
!Allegiance(LastSeenBy([GOODCUTOFF])
THEN
RESPONSE #100
ChangeSpecifics(LastSeenBy(),4000)
IncrementGlobal("KR_MONSTER_COUNTER_ALIVE","GLOBAL",1)
END

Geht aber meines Wissens nur mit Globalen ;)
 

Callindor

Senior Member
Registriert
03.05.2008
Beiträge
2.180
Was heißen diese Kürzel (S:,S:,I: )?

Das hat mich schon bei der ganzen Effekt/Trigger/Scriptübersicht so abgeschreckt, dass das so furchtbar allgemein gehalten ist. Ich kann mehr mit sowas anfangen, wenn sie ein Beispiel und eine Übersetzung dazu mit reingetan hätten ... :c:
 

Callindor

Senior Member
Registriert
03.05.2008
Beiträge
2.180
Hmm, ich konnte in der tarnes.dlg keine Global finden, mit der ich das Starten meines zusätzlichen Dialogs anhängen könnte. Wie stelle ich denn sowas dann ein, z.B. das eine Cre nach einem Dialog spawnt und einen neuen Dialog anfängt?
 

Wedge

Wedgetarian
Registriert
04.07.2007
Beiträge
9.373
Ne, die Cutscene dauert so lange, wie der Kram darin dauert und nicht solange, wie du irgendwo angibst. Zumahl ich immer noch nicht weiß, wo du jetzt die 12 her hast. Und der Befehl Wait() hält die gesammte Scriptverarbeitung für die Anzahl der Sekunden an, die du in den Klammern definerst. Wieviel Wait()s du da reinbauen musst, damit das alles so abläuft, wie du das gerne willst, musst du halt in Spiel selber durch testen rausfinden.

Opcodes benutzt du wie Agnus schon sagte in Zaubern oder in Items.

@ CHAIN
Ich habe in Post 20 aber keine ganze d-Datei gepostet sondern nur gesagt, dass du statt einem State auch eine CHAIN benutzen kannst. ^^

Wenn du mal eine CHAIN mit einem normalen State vergleichst, dann stellst du fest, dass du in dem State nur den Namen des States angibst, (IF ~~ THEN BEGIN derstate1), in einer CHAIN aber auch die DLG-Datei, in die der Inhalt soll (CHAIN IF ~~ THEN CCal diechain). Und darum muss das Zeug in der d-Datei in einer bestimmten Reihenfolge vorliegen, weil WeiDu sonst nicht mehr weiß, wo der State hinsoll. Wenn du also am Anfang deiner d-Datei mit BEGIN CCalB deine DLG erstellst, dann müssen alle States darauf folgen und anschließend kannst du die CHAINs hinpacken. Oder du packst alles in CHAINs, dann ist die Reihenfolge egal. Oder du musst mit APPENDs arbeiten. Probiers halt einfach aus und versuch die d-Datei zu kompilieren und du wirst sehen, dass es so nicht funktioniert.



EDIT:
Du lässt die Cre im letzten State des Dialogs in einer DO spawnen und packst der neuen Cre in das Override, dass sie sofort nen Dialog anfangen soll. (IF See(whatever) THEN StartDialog() etc.)
 
Zuletzt bearbeitet:

Callindor

Senior Member
Registriert
03.05.2008
Beiträge
2.180
Wie editiert man die dialog.tlk? Ich habe da jetzt dieses Programm gefunden IWD 1.1, jedoch scheitere ich schon an den Setup-Einstellungen.

Setting Name(völlig egal oder Modbezogen, hat das irgendeinen Einfluss?)
GamePath(wobei damit wohl nicht der SvA-Ordner gemeint ist, denn den Pfad wollte er nicht annehmen)
GameType(wo ich mal annehme, dass da ToB richtig ist?)
KEY Path
TLK Path

Leider Gottes ging die readme überhaupt nicht darauf ein (muss man wohl nicht, weil es offensichtlich ist!?), sonst würde ich nicht fragen.

Übrigens betrifft das dieses DLTCEP genauso, da komm ich auch nicht weiter über die Setup-Einstellungen.

Es wäre wirklich eine tolle Aktion, wenn hier mal die Cracks unter den Moddern, sowas zeigen. Wegen jedem Bisschen zu fragen und nichts Hilfreiches irgendwo zu finden ist nicht so lustig.

Da ich mir die dialog.tlk wie gesagt noch nicht ansehen konnte, ist das Folgende vielleicht auch wieder eine Idiotenfrage, die eigentlich vollkommen selbsterklärend ist, aber wie wird das denn geregelt, wenn ich der .tlk nun eine Zeile Text hinzufüge und jemand anders macht das auch und diese beiden Sachen kommen zusammen, überschreibt dann der eine den anderen oder kommen die nacheinander und einer kriegt ne neue Nummer? Und wird dann sein Textbezug im Script auch automatisch geändert?
 

Wedge

Wedgetarian
Registriert
04.07.2007
Beiträge
9.373
Wieso willst du denn die TLK editieren? Das ist eigentlich so ungefähr das allerletzte, was man machen sollte.

IWD1.1 kenne ich nicht und bei DLTCEP müsstest du jetzt mal sagen, wo dein Problem ist. Um das einzurichten geht man auf Settings -> Change Settings -> Kram einstellen -> Add Setup -> Save & Back. Ich weiß jetzt natürlich nicht, was da nicht funktioniert bei dir.

Alle Texte des Spiels liegen in der dialog.tlk und alle installierten (kompilierten sagt man da) Dialog-Dateien und Script-Dateinen haben anstatt dem Text eine Referenznummer, die dem Spiel sagt, welchen Text aus der dialog.tlk es an der Stelle anzeigen soll. Das ist praktisch dasselbe System wie die d-Dateien und die TRAs bei übersetzten Mods. Bei der Installation einer Mod hängt WeiDu den neuen Text einfach mit der fortlaufenden Referenznummer hinten an die dialog.tlk an und schreibt die entsprechende Referenznummer dann in die Dialog-/Script-Dateien beim Kompilieren. Und da man Mods nicht parallel installiert, hat die Mod, die zuerst installiert wird, halt die kleineren Nummern und der Kram der späteren Mods kommt hinter die Einträge der früheren Mods. Das macht WeiDu aber alles komplett selbstständig, so dass wir uns damit überhaupt nicht beschäftigen müssen.


Es wäre wirklich eine tolle Aktion, wenn hier mal die Cracks unter den Moddern, sowas zeigen. Wegen jedem Bisschen zu fragen und nichts Hilfreiches irgendwo zu finden ist nicht so lustig.

Ich arbeite bereits an einem Tutorial. ^^
 

Callindor

Senior Member
Registriert
03.05.2008
Beiträge
2.180
Es um den Punkt *Kram einstellen*

Es ploppt ja gleich eine Nachricht auf mit *Run Setup first*

So simpel es sich anhört, was, wie, wo?

Und dann noch ...

Code:
BEGIN CCal

IF 	~NumTimesTalkedTo(0)
	 Global("CalTalksToHC","LOCALS",0)~ THEN BEGIN CalTalksToHC1
SAY ~Oh, Entschuldigung. Ein Versehen ...~
IF ~~ THEN DO ~SetGlobal("CalTalksToHC","LOCALS",1)EscapeArea()~
IF ~Global("CalTalksToHC","LOCALS",1)~ THEN DO ~GiveItem("CCalScrl01",LastTalkedToBy)~ EXIT // Calistros Warnung und Verabredung

END

Zeile 7 soll einen Fehler zu haben, ich sehe ihn nicht. Die CCalScrl01 liegt im override als .itm, braucht es da noch was? Alles andere gibt's ja schon (bam's), da es nur einen anderen Text hat und aus was anderem umbenannt wurde. Von daher erschließt sich mir keine Fehlerquelle.

Das wird wohl so neben der noch fehlenden Verständnis das Hauptproblem, dass ich davorsitze und den Fehler nicht sehe, der in irgendeiner Zeile sein soll, weil für mich alles stimmt ...
 
Zuletzt bearbeitet:

Wedge

Wedgetarian
Registriert
04.07.2007
Beiträge
9.373
Der Fehler ist in der Zeile 6 am Ende. Da fehlt nämlich das Ziel (GOTO/EXTERN/EXIT) des Übergangs und das muss immer da sein. Der Fehler passiert gerne, weswegen ich das in meinem kunterbunten Kleinsttutorial direkt adressiert hatte. :D


Was das wie, was, wo angeht: Settings -> Change Settings -> Kram einstellen -> Add Setup -> Save & Back.
 
Zuletzt bearbeitet:

Callindor

Senior Member
Registriert
03.05.2008
Beiträge
2.180
Ist der GiveItem - Befehl falsch? Er spricht ihn an, er geht weg, aber es wird nichts in das Inventar von HC abgelegt.

Ich nehm mal an, das Item muss im anderen Inventar vorhanden sein, damit es übergeben werden kann. Leider kann ich über NI der Figur das nicht ins Inventar legen, weil es unter den .itm's nicht aufgelistet ist, obwohl es im override abgespeichert ist. Was fehlt da noch, dass NI das wahr nimmt?
 
Zuletzt bearbeitet:
Oben