[Tutorial] Moddingerfahrungen - Tricks und Kniffe

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.920
@Acifer das ist interessant, danke für die Hinweise.
Dass der NPC irgendwo steckenbleibt weil der Spieler die Area zu früh verlässt würde ich wahrscheinlich über einen sntsprechend offenen Skriptblock mit dem Laufbefehl umgehen, der erst deaktiviert wird, wenn der NPC in der Nähe eines Triggers ankommt.
Leider sind für meine Anwendungen das MoveToPointNoInterrupt nicht immer geeignet. Für Aaron hätte man das sicher so machen können. Da habe ich jetzt aber schon die Änderung eingefügt, dass er am Rülpsenden Drachen stehen bleibt.
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.379
Ich habe mal noch ein wenig rumgegraben und alte Sachen gefunden. Hier ein Tutorial zum erstellen von NPCs. Ist alles sehr alt, aber der Syntax müsste noch funktionieren, auch wenn man das heute alles sehr viel kürzer schreiben kann (gerade die Dialoge). Und die email-Adresse in dem pdf existiert schon viele Jahre nicht mehr ;)

Also eher was Nostalgisches, das durchaus noch brauchbar ist.
 

Anhänge

  • tutorial1_1.pdf
    149,1 KB · Aufrufe: 3

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.920
Ich habe hier dazugeschrieben, wie ich das Problem mit der Koordinatenaktualisierung bei JumpToPoint() etc. löse.
 

Jarl

Senior Member
Registriert
28.04.2006
Beiträge
972
Eine kurzer Beitrag von mir zum Thema *.ARE-Dateien:

Wenn man einen Actor hinzufügt, steht der Offset "Expiry Time" (in NI - bei DLTCEP heißt er "Visible") standardmäßig auf -1. Steht er auf 0 erscheint der Actor nicht bzw. ist inaktiv. Leider ändert der Script-Befehl "Activate()" nichts daran.

Mache ich hier einen Fehler? .Wenn ich mich recht erinnere, funktioniert das in der IWD-Vanilla-Engine nämlich.

Um den gewünschten Effekt zu erzielen, kann man stattdessen den Actor erst mit "Deactivate()" deaktivieren und zum gewünschten Zeitpunkt wieder aktivieren - "Activate()".

Das kann sehr nützlich sein, wenn man Actors je nach Bedingungen mal auftauchen und mal wieder verschwinden lassen möchte.
Denn die Alternative, das per Script ( CreateCreature() & DestroySelf() ) zu lösen, bedeutet viel Scriptingaufwand und hat den Nachteil, dass dann nach jedem CreateCreature() die LOCALS-Variablen wieder auf 0 stehen, da es sich technisch gesehen jedes Mal um neue Kreaturen handelt.

Grüße!
Jarl
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.920
Cutscene-Funkyness:

Die EE (mit Siege of Dragonspeare) macht ja gerne Gebrauch von Animationsbefehlen, also "Bewegungen" der Charaktere in Cutscenes. Hierbei bricht eine Cutscene als Skript aber, wenn z.B. "ActionOverride(PlayerX,SetSequence(SEQ_SLEEP))" für nicht präsente Gruppenmitglieder beinhaltet ist. Soll die Szene auch bei nicht mit 6 Personen voll besetzter Gruppe funktionieren, müssen die Cutscenes über das Areaskript laufen - hier wird das Skript richtig ausgeführt, auch wenn Slots nicht belegt sind.
Hinweis: ich hatte bei den tests immer nur 3 Gruppenmitglieder, also streng genommen weiß ich nicht, ob ein Cutscene-Skript mit diesen Befehlen mit vollbesetzter Gruppe überhaupt durchlaufen würde.


Korrektur: Wenn eine Cutscene, bei der Player1 die CutsceneId ist, ein ActionOverride(Player1) enthält, dann werden nachfolgende Aktionen nicht mehr ausgeführt, s. Taimons Post unten.

Das war mein gestriger Nachmittag und Abend. :rolleyes:
 
Zuletzt bearbeitet:

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Wie äußert sich das? Also was genau "bricht" da.
Und besteht das Problem auch in den originalen Versionen?
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.920
@Taimon mit hängen meine ich, dass die Cutscene nicht zu Ende ausgeführt wird und der Cutscenemode nicht endet. Um das etwas zu konkretisieren:
Meine Gruppe bestand aus drei Charakteren, HC und zwei NPCs.
Meine Cutscene sah so aus:
IF
True()

THEN
RESPONSE #100
CutSceneId(Player1)
FadeToColor([30.0],0)
SmallWait(20)
DayNight(MIDNIGHT)
ActionOverride(Player1,JumpToPoint([215.396]))
ActionOverride(Player1,Face(SE))
ActionOverride(Player1,SetSequence(SEQ_SLEEP))
ActionOverride(Player2,JumpToPoint([131.485]))
ActionOverride(Player2,Face(E))
ActionOverride(Player2,SetSequence(SEQ_SLEEP))
ActionOverride(Player3,JumpToPoint([152.510]))
ActionOverride(Player3,Face(NE))
ActionOverride(Player3,SetSequence(SEQ_SLEEP))
ActionOverride(Player4,JumpToPoint([179.544]))
ActionOverride(Player4,Face(NE))
ActionOverride(Player4,SetSequence(SEQ_SLEEP))
ActionOverride(Player5,JumpToPoint([202.567]))
ActionOverride(Player5,Face(NE))
ActionOverride(Player5,SetSequence(SEQ_SLEEP))
ActionOverride(Player6,JumpToPoint([239.581]))
ActionOverride(Player6,Face(N))
ActionOverride(Player6,SetSequence(SEQ_SLEEP))
Wait(3)
MoveViewObject(Player1,INSTANT)
Wait(1)
FadeFromColor([20.0],0)
Wait(1)
CreateCreature("bdireni",[596.220],NW)
SmallWait(16)
ActionOverride("bdireni",MoveToPoint([423.333]))
Wait(1)
ActionOverride(Player1,SetSequence(SEQ_AWAKE))
SmallWait(4)
ActionOverride(Player1,Face(SW))
SmallWait(1)
ActionOverride(Player1,JumpToPoint([331.359]))
ActionOverride(Player1,SetSequence(SEQ_READY))
ActionOverride(Player1,FaceObject("bdireni"))
SmallWait(6)
ActionOverride("bdireni",StartDialogNoSet(Player1))
END
Also, die Gruppe sollte sich schlafen legen, dann sollte der verhüllte Mann auftauchen, der HC sollte aufstehen und sich zu ihm umdrehen, und dann sollte ein Gespräch starten.
Was zu sehen war: Der Bildschirm wurde schwarz, man hörte das "Plumps"-Geräusch wenn sich alle hinlegen. Es wurde wieder hell, und alle lagen an ihren Stellen. Danach blieb es im Cutsene-Modus, aber es geschah nichts mehr.
Zum Testen habe ich die Anweisungen für die NPCs rausgenommen, dann erschien der verhüllte Mann.
Da ich die Cutscene aus Cutscenes des Spiels zusammenkopiert habe, habe ich dann nochmal nachgesehen, wie die im Originalspiel aussehen. Und dabei eben festgestellt, das alle "Cutscenes", bei denen die NPC auch entsprechend mit SetSequence angesprochen werden, nicht als Cutscene-Skripte laufen, sondern (als Cutscenes) über das Areaskript ausgeführt werden.
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Und wie wurde die Cutscene gestartet, als es hängen blieb? (Zum Nachstellen.)
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.920
@Taimon von einem Areascript aus:
Code:
IF
    Global("chapter","global",13)
    Global("C#AfH_jail_visitors","c#afh3",9)
THEN
    RESPONSE #100
        StartCutSceneMode()
        SetGlobal("C#AfH_jail_visitors","c#afh3",10)
        ClearAllActions()
        StartCutSceneEx("c#afh64",TRUE)
END
Es handelt sich um eine Kopie des obersten Stockwerks des Palastes (und SoD).
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Meine spontane Idee war, dass es wieder mit dem ActionOverride() zusammenhängt und das scheint sich auch zu bewahrheiten.
Da die Cutscene für Player1 ist, werden bei ActionOverride(Player1, ...) alle anderen Aktion, die kein ActionOverride() sind, aus dem Cutscene-Skript entfernt.
Es sollte also nur mit dem ActionOverride(Player1) zusammenhängen und nicht mit den anderen. (Bei Player1 kannst du das einfach entfernen, ist nicht notwendig.)

Beim Testen ist das Spiel bei mir aber trotzdem am Ende noch im CutsceneMode. Ich bin mir gar nicht sicher, wie dieser normalerweise beendet wird. (explizit vs. implizit)
Wenn ich ans Ende der Cutscene noch EndCutSceneMode() packe (und das ActionOverride(Player1) entferne), dann klappt es bei mir.
/Edit: Ich hatte beim Testen am Ende keinen Dialog gestartet, wahrscheinlich liegt es daran. (Der Start oder das Ende des Dialogs beendet sicher auch immer den CutsceneMode.)
 
Zuletzt bearbeitet:

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.920
Es sollte also nur mit dem ActionOverride(Player1) zusammenhängen und nicht mit den anderen. (Bei Player1 kannst du das einfach entfernen, ist nicht notwendig.)
Oh, Du hast (wie immer) Recht. Ich hatte nicht alle ActionOverrides für Player1 entfernt, als ich das ausprobiert habe - auf die Idee war ich gekommen, aber habe sie nicht konsequent umgesetzt. Wenn alle ActionOverride(Player1) entfernt werden, dann läuft sie in der Tat durch. Ich werde das oben in meinem Postkorrigieren.

Die Cutscenemode würde durch das gestartete Gespräch auch beendet, das bei Dir im Testsetting natürlich nicht vorhanden war.
Interessant, danke für das Testen!
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Interessant, danke für das Testen!
Kein Problem, ich hoffe, es ist nicht falsch rübergekommen, dass ich mir das noch einmal anschauen wollte.
Die Erklärung hatte irgendwie nicht mit meinem Verständnis der Engine zusammengepasst, das hat meine Neugierde geweckt.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.920
ich hoffe, es ist nicht falsch rübergekommen, dass ich mir das noch einmal anschauen wollte.
Gar nicht. Ich finde das im Gegenteil richtig klasse!
Ich merke immer wieder, dass ich mir bei Zusammenhängen, die mich nicht wirklich tiefer interessieren, eine Lösung zusammenreime. Das ist dann gut, wenn das jemand korrigiert. Danke an dieser Stelle für Deine Geduld, auch was das Testen meiner Probleme angeht. Witzigerweise waren die "Cutscenes", die ich mir dann im Spiel angesehen habe, wirklich alle über Areaskripte ausgeführt - was wohl auch der Grund war, dass sie als Vorlage die Aktionen für Player1 auch über ActionOverride gesteuert haben.
 
Oben