You are not logged in.

Dear visitor, welcome to Laras Levelbase Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Monday, September 22nd 2008, 11:56am

Inhaltsverzeichnis

1. TRNG - Was ist das und wo bekomme ich das her?

2. TRNG und TREP im Vergleich - ein kurzer Überblick

3. Triggern mit der TRNG
3.1 Das Triggerfenster
3.2. Die neuen Triggertypen
3.3 Trigger und Scripting - Triggergroup, Globaltrigger,Organizer und mehr

4. Das Scripting im TRNG
4.1 Allgemeines
4.2 Die Programmoberfläche des NG_Centers
4.3 Die Grundstruktur von Scriptkommandos (Syntax)
4.4 Eine Übersicht der neuen Scriptkommandos

5. Neue OCB-Werte für Objekte - vielfältiger Einsatz von Pushables, Rollingballs, Keypads und Statics

6. Verfügbare Beispielprojekte von Paolone





1. TRNG - Was ist das und wo bekomme ich das her?

TRNG- das ist die Tomb Raider Next Generation-Engine, die zusammen mit dem NGLE, dem Next Generation Level Editor arbeitet. Beides wird von dem Italiener Paolone entwickelt.

Was brauche ich und wo bekomme ich das her?
Update 5.1.2008: Es gibt ab sofort einen automatischen Installer, der alle benötigten Dateien an die richtigen Stellen bringt: FullInstaller. Bevor man den Fullinstaller startet, sollte man den normalen Leveleditor und auch Wadmerger installiert haben!
Danach macht man noch das neueste Update (siehe Paolones TRNG-Webseite oder auf skribblerz.com), womit dann im NG_Center ein automatischer Updater installiert wird, der periodisch nach neuen Updates sucht, sie runterlädt und installiert.
Das Ganze befindet sich in ständiger Entwicklung und es gibt ständig Updates, wo neues hinzugefügt wird und Bugs beseitigt werden. Das betrifft insbesondere die tomb_nextgeneration.dll und auch den NGCenter. Deshalb sollte man ständig nach Updates nachschauen. Um also startbereit zu sein, muß man noch die letzen Updates herunterladen und die entsprechenden Dateien mit der neuesten Version aus dem letzten Update ersetzen.

Hier die Seiten, auf der sämtliche Downloadlinks zu finden sind:
Hier: TRNG-Webseite
Hier gibt es auch ein paar kleine Beispielprojekte, die Paolone zusammengestellt hat, um bestimmte Sachen zu erklären!
Und hier: Skribblerz-TRNG
Die Updates sind hier oftmals schneller, als auf der TRNG-Seite!

Skribblerz hat auch gute englische Tutorials:
Skribblerz-Tutorials

Das Skribblerz-Forum ist der Hauptkontaktpunkt für TRNG-News und Patches. Paolone schaut öfters mal hier vorbei und beantwortet Fragen.
Skribblerz-TRNG-Forum
Gelegentlich schaut Paolone auch im trle.net-Forum vorbei.

2. TRNG und TREP im Vergleich - ein kurzer Überblick

Was bringt nun die TRNG gerade im Vergleich zu TREP? Ich habe in beide Systeme einen gewissen Grundeinblick und kann da zumindest ein paar Grundaussagen treffen. Beide, TREP und TRNG dehnt die Begrenzungen der alten Engine sehr weit aus.
Es wird so bleiben, dass TREP nicht kompatibel zur TRNG ist, aber die TRNG weitestgehend alle Fähigkeiten von TREP nach und nach auf ihre Weise einbezieht und darüber hinaus, noch einiges mehr möglich macht! TREP und die TRNG sind einfach zwei verschiedene Konzepte, die Möglichkeiten der TR-Engine zu erweitern.
Beide haben ihre Vor-und Nachteile. TREP ist schon länger auf dem Markt und hat gegenwärtig mehr Nutzer, was natürlich schon ein gewissen Vorteil bringt. Das große Plus von TREP sind momentan, dass seine Vielfältigkeit in Bezug auf allgemeine Anpassungen der Gameengine größer ist und dass es sehr übersichtlich strukturiert ist. Ein weiteres Plus ist sicherlich, dass mit DRACO-Patches mehrere Leute an der Entwicklung von TREP teilhaben können. Im Bereich des dynamichen Eingreifens in die Gameengine halte ich aber die TRNG mit ihrem Triggerkonzept für überlegener. Wer also neues Gameplay in einem lebendigen Level haben möchte, ist bei der TRNG besser aufgehoben. In einigen anderen Bereichen ist die TRNG ebenfalls stärker. Es sind jetzt z.B. 32 statt bisher 8 Flipmaps möglich. tc14 hat gerade erst kürzlich berichtet, das er ein Projekt mit der TRNG weiterführen konnte, dass mit TREP schon an die Grenzen gestoßen war. In der TRNG kann man Motorboote nutzen, Pushables und Rollingballs haben vielfältigere Einsatzmöglichkeiten. Es gibt sehr umfangreiche Möglichkeiten, Fahrstühle einzusetzen. Die Soundengine der TRNG ist vielseitiger einsetzbar.

Was wird die Zukunft bringen? Paolone arbeitet weiter hart an der Entwicklung der TRNG. Es wird ständig Updates und Erweiterungen geben. Ich denke aber, dass die TRNG sehr viel Potential hat und würde es als sehr positiv für die Entwicklung der TR-Costumlevel-Szene empfinden, wenn dort mehr Energie fokussiert werden könnte. Es wäre zu schade, wenn dieses Potential zu wenig genutzt bliebe! Es wird insgesamt wohl beide Systeme für längere Zeit nebeneinander geben, so dass man wählen muss, welches man nutzt. Man sollte allerdings wirklich einen genaueren Blick auf die TRNG bei seiner Entscheidung werfen und nicht einfach beim eventuell vertrauteren TREP stehen bleiben.
Das Herz der TRNG bilden das Scripting und das neue Triggerkonzept. Dazu in den folgenden Abschnitten mehr!

This post has been edited 9 times, last edit by "Raymond" (Feb 8th 2009, 2:11pm)


2

Tuesday, September 23rd 2008, 4:41pm

3. Triggern mit der TRNG

Das Triggerkonzept ist für mich das Prunkstück der TRNG. Es ermöglicht unendlich mehr kreative Möglichkeiten für das Levelbauen. Es ist damit natürlich auch komplexer als man vom alten Editor gewohnt ist.

3.1 Das Triggerfenster



Hier ist das neue Triggerfenster.
In der ersten Zeile findet man, was zu triggern ist. Neu bzw. grundlegend ausgebaut sind Action, Flipeffect, Parameter, FMV und Timer Field. Im zweiten Feld findet man das zu triggernde "Objekt". Das sind dann Listen, die entweder die im Level vorhandenen Objekte enthalte, wie z.B. bei dem Actiontrigger oder es sind Listen der möglichen Flipeffekte für den Flippeffecttrigger. In der dritten Zeile findet man den Triggertyp, also die Art, wie etwas getriggert wird. Neu ist der Triggertyp Condition. In der vierten und fünften Zeile Timer & und (E)xtra findet man Parameter, die den gewählten Trigger, je nach Auswahl, noch näher beschreiben.
Im gewählten Beispiel habe ich einen Flipeffekttrigger "Lara.(Health)Damage Lara, decreasing life by & percentage of full vitality in (E) way".
Der Flippeffekt betrifft also Lara und zwar ihre Gesundheit (Health). Ihr wird Schaden (Damage) zugefügt, wobei ihre Lebenskaft um eine bestimmte Prozentzahl(percentage) in einer bestimmten Art (way) veringert wird. Da stehen auch die beiden Parameter & und E, die bestimmen, was genau geschieht. Wenn also E und & in der Triggerbeschreibung auftaucht, muss in Zeilen vier und fünf die Parmater noch näher bestimmt werden. Für & kann man nun aus einer langen Liste die gewünschte Prozentzahl auswählen, in meinem Fall um 10 Prozent. Für den Parameter E habe ich Immediatly (sofort), one shot(einmalig) gewählt. Ihr werden also sofort und einmalig zehn Prozent ihrer vollen Lebenskraft abgezogen. Es wäre noch continuously (kontinuierlich) möglich gewesen, d.h. so lange Lara auf dem Trigger steht, werden ihr kontinuierlich zehn Prozent abgezogen. Da würde es mit Lara schnell zu Ende gehen!

3.2. Die neuen Triggertypen

Flipeffekttrigger

Es gibt in der zweiten Zeile unter Flipeffect gegenwärtig insgesamt rund 100 Flipeffekte zur Auswahl, die ihn Gruppen in alphabetischer Reihenfolge geordnet sind. Mal ein paar Beispiele:
Animated Textures: Hier können Texturenfolgen in vielfältigster Weise animiert werden.
Inventory Item: Hier kann man Laras Inventar manipulieren.
Item Group: Man kann im Script definierte Objektgruppen manipulieren!
Keyboard: Tastaturkommandos werden beeinflußt!
Lara: Flipeffekte rund um Lara`s Eigenschaften
Moveable: Moveables werden neue Bewegungseigenschaften verliehen!
Sound: Umfangreiche Möglichkeiten der Beeinflußung von Audioeigenschaften
Static: Statische Objekte bewegen und zahlreiche neue Eigenschaften verleihen!
Text: Variable Texteinblendungen im Spiel!
Weather: Beeinflussung des Wetters
etc. etc. etc.

Besonders umfangreiche Gruppen wie Lara und Statics sind dann nochmal unterteilt in Untergruppen:
Bei Lara lassen sich z.B. folgende Breiche manipulieren: Animation, Health, Mesh, Physics(Bewegungseigenschften), Skills (Fähigkeiten), Weapon (Waffen).
Bei Statics kann man folgendes beeinflussen: Burning (Lara bei Berührung verbrennen), Color (Farbe verändern), Collision-Kollision verändern, Damage-Lara bei Berührung schaden, Explosion-Objekte und Lara explodiern lassen oder Shattereigenschften zuweisen, Move-Static bewegen, Poison-Lara vergiften, Rotation-Static rotieren, Transperacy-dem Static transparente Glas- oder Eiseigenschaft verleihen, Visibility-Static verschwinden/auftauchen lassen
Na wem an der Stelle noch nicht der Kinnladen runtergeklappt ist, dem wird dass spätestens geschehen, wenn er die Möglichkeiten im Spiel sieht. Ich werde später ein Beispielprojekte von Paolone vorstellen, wo man mal in den neuen Umgang mit Statics reinschnuppern kann.

An späterer Stelle werde ich aus bestimmten Gründen eingehen, um was es bei Organizer, Triggergroup and Globaltrigger geht. Da eröffnen sich nochmal neue Welten.

Actiontrigger
Der Actiontrigger ist eigentlich auch ein Flipeffekttrigger. Früher gab es mal eine deutlichere Unterteilung. Der Bereich Flipeffekt bezog sich auf Flipeffekte um alles, was Lara betrifft oder nicht direktes Objekt im Spiel ist. Action bezog sich auf Objekte. Das ist mittlerweile aus bestimmten Gründen nicht mehr ganz so.
In der zweiten Zeile bestimmt man das zu beeinflußende Objekt. In der vierten Zeile steht die Liste der Flipeffekte und in der fünften mögliche Parameter.
Man kann hier bestimmte Effekte zu Objekten hinzufügen, Animationen und Meshes beeinflussen, Moveables/Animatings bewegen/rotieren und Feindeigenschaften verändern.
Obercool sind die Möglichkeiten, eine Vielzahl verschiedener Fahrstühle einfügen zu können. Näheres kommt später auch in einem Beispielprojekt.
Es sind hier auch ein paar von den normalen Objekttriggern abgewandelt zu finden, mit dem Vorteil, dass der Antitrigger für Objekte hier als Trigger zu finden ist. Der aufwendige Rollenballtrick für das Antitriggern mit Schaltern/Keys ist also Geschichte, weil man die jetzt auch unter einen Switch- oder Keytrigger bekommt.
Außerdem ist es so möglich verschiedene Türen gleichzeitig auf einem Feld zu triggern bzw. zu antitriggern, oder Zeitaufgaben verschiedener Länge von einem Feld aus zu starten.

Conditional Triggers - der Parametertrigger

Mit Hilfe das Aktivierungstyps Condition (dritte Zeile), der nur mit dem Parametertrigger (erste Zeile) zusammenarbeitet, kann man eine Reihe von Bedingungen stellen, wann Trigger ausgeführt werden sollen. Dazu plaziert man diesen Trigger auf das Feld mit dem anderen Trigger. Es ist auch möglich mehrere Bedingungen zu stellen, in dem man mehrere Parametertrigger übereinander legt oder einen Parametertrigger Multiple Conditions wählt, wo man allerdings dann noch im Script etwas eintragen muß. Der Trigger, der unter dem Parametertrigger liegt, wird dann ausgeführt, wenn die Bedingungen erfüllt sind.
Was können das für bedingungen sein? Hier einige Beispiele:
Berührt Lara ein Objekt?
Was treibt ein anderes Lebewesen im Level so (In welchen Zustand ist es? was für eine Animation macht es? Welche State-ID hat es?)
Was treibt Lara gerade so? (Welche Animation, State-ID, Lebenskraft, Status, Aktion hat/macht sie gerade?)
Wieviel Zeit ist auf dem Timer abgelaufen?
Wo befindet sich gerade Lara im Raum? Es lassen sich eine Vielzahl von Bedingungen stellen, die sich auf die Umgebung beziehen.

Fragmentierte Trigger
Auf welchen Teil eines Triggerfeldes befindet Lara sich? Ja, es sind jetzt nicht nur Trigger möglich, die sich über ein ganzes Feld ausdehnen, sondern die sich nur auf Teile eines Feldes beziehen. Man kann dabei au einer Vielzahl von verschiedenen Konfigurationen auswählen. Die Grundunterteilungen umfassen dabei entweder vier, neun oder 16 Quadrate in einem Triggerfeld.

Die Grundunterteilungen (die Bilder sind von Paolone)


Beispiel zwei gekreuzte Streifen


Beispiel zwei gekreuzte Diagonalen


Damit kann man dann z.B. komplexe Sensorzonen erstellen.

Vertikale Trigger
In welcher Höhe soll der Trigger wirken!?
Exzellente Sache, wenn man z.B. nur bestimmte Höhenbereiche einer Wand bekletterbar machen will. Dann setzt man eine Leiter auf einem Feld an einer Wand und auf dem selben Feld wird dann das Tastaturkommando Aktion nur in einer bestimmten Höhe wirksam, so dass Lara nur da klettern kann. Aber es sind da natürlich auch viele andere Anwendungen möglich! Später stelle ich noch ein Beispielprojekt von Paolone dazu vor!

FMV-Trigger
Kann ich nicht viel dazu sagen. Man kann jetzt halt FMV´s in ein Level einfach einbinden! Dafür ist aber auch ein Scripteintrag notwendig.

Timer_Field-Trigger
Bei den normalen Objekttriggern kann man, wie bisher, ganz normal die Zeit für eine Zeitaufgabe in das Timerparameterfeld eintragen (vierte Zeile). Es gibt aber jetzt ja eine ganze Menge von Triggern, in denen das Timerparameterfeld durch andere Sachen belegt ist. Dann muß man für eine Zeitaufgabe diesen Timer_Field-Trigger auf dem selben Feld plazieren. Die Zeit für die Zeitafgabe kommt hier aber in das zweite Feld!

This post has been edited 15 times, last edit by "Raymond" (Oct 8th 2008, 10:26am)


masha

Godmother of construction

  • "masha" is female

Posts: 19,779

wcf.user.option.userOption56: CTU

wcf.user.option.userOption57: dies und das

Location: Colmar

  • Send private message

3

Thursday, September 25th 2008, 9:50am

TRNG Tutorial von Raymond

[TH]

4

Friday, September 26th 2008, 2:24pm

3.3 Trigger und Scripting - Triggergroup, Globaltrigger,Organizer und mehr

Allgemeines

Das Triggerkonzept ist nicht ohne das Scripting zu verstehen. Es gibt viele Schnittstellen, wo Parameter für manche Trigger über das Script definiert werden, oder wo Trigger in Scriptkommandos exportiert werden, um sie in gänzlich neue Zusammenhänge zu stellen. Genaueres zum Scripting gibt es dann in einem speziellen Kapitel zu dem Thema. An der Stelle möchte ich drei Scriptkommandos vorstellen, die Trigger auf verschiedene Weise zur Anwendung bringen. In diesem Kapitel werde ich die Syntax der Skriptkommandos noch nicht im Detail erläutern. Das mache ich dann aber im Kapitel über das Scripting.
Ihr habt euch vielleicht schon gefragt, was das Feld Export Scripttrigger bedeutet. Wenn man den im falle meines Beispiels drückt erhält man folgengende Textdatei auf dem Bildschirm:
; Exporting: TRIGGER(18:0) for FLIPEFFECT(89)
; <#> : Lara. (Health) Damage Lara, decreasing life by <&>percentage of full vitality in (E) way
; <&> : 10 Percentage
; (E) : Immediatly, one-shot
;Add following three values in your script command:
$2000, 89, $12
Die ersten vier Zeilen enthalten nochmal eine Beschreibung des Triggers. Es ist äußerst empfehlenswert, diese als Dokumentation mit ins Script zu nehmen, damit man später auch noch weiß, was das alles zu bedeuten hat. In der sechsten Zeile steht dann das Entscheidende: drei hexidezimale Zahlen, die den Trigger beschreiben und die an vorgegebener Stelle in das Skriptkommando eingefügt werden müssen und zwar in unserem Fall in das Triggergroupkommando In dieses Kommando legt man Gruppen von Triggern (oder auch einzelne Trigger) ab, die dann gemeinsam ausgeführt werden. Es können Action-, Flipeffekt- und Parametertrigger exportiert werden.

Die Triggergruppe
Wenn ich obigen Trigger in das Skriptkommando Triggergroup exportiere, dann sieht meine Triggergruppe folgendermaßen aus:
TriggerGroup=1,$2000, 89, $12.
Das ist also meine erste Triggergruppe, die erst mal nur diesen einen Trigger enthält. Man kann aber beliebig viele Trigger in das Kommando exportieren, wobei man nacheinander immer diesen Dreierpack von Werten für die Trigger einfügt. Welchen Sinn kann eine solche Triigergruppe haben. Ich kann damit z.B. die anzahl der Trigger im Projekt erheblich reduzieren, was solchen Triggerfanatikern, wie ich es einer bin, hilft, nicht zu schnell an die Grenze von 512 möglichen Triggern im NGLE zu stoßen. Wenn ich z.B. fünf Dinge mit einem Schalter auslösen will, dann kann ich die fünf Trigger in eine Triggergrupe exprtieren und habe dann im Projekt statt der fünf nur einen Trigger beim Schalter, nämlich derjenige Flipeffekt, der die Triggergruppe auslöst! Der zweite wesentliche Grund für dieses Kommando ist, das ich es benötige, um Werte andere Skriptkommandos, z.B. an die Kommandos Globaltrigger und Organizer weiter zu geben.

Globale Trigger

Lassen wir die Sache mal praktisch werden. Mein Ziel ist es, folgendes zu schaffen. Ich will einen Stein auf Lara von der Decke fallen lassen, der Aua Aua macht, wenn er auf Lara trifft und Lara 10 Prozent von ihrer Lebenskraft nimmt. Ok, ich habe mir so ein Steinchen als Static gebaut und ihn an der Decke plaziert. Dann habe ich ein Flipeffekttrigger für Statics gesetzt, so dass der Stein mit rumpeln und Aufschlag nach unten fällt und dabei möglicherweise auch Lara trifft. Wie schaffe ich es, dass Lara dabei verletzt wird (Lebenskraft abgezogen wird)? Da hätten wir z.B. die Möglichkeit einen anderen Static-Flippeffekt zu nutzen, der ermöglicht, das Lara bei Berührung mit Objekten Lebenskraft abgezogen wird. der Wert, der abgezogen wird, ist aber festgelgt und er gefällt mir nicht. Ich möchte eben zehn Prozent haben. Da kommt jetzt der Globaltrigger ins Spiel. Globale Trigger sind Trigger, in einem beliebigen Bereich des Levels nach der Erfüllung einer Bedingung ausgeführt werden. da gibt es einen Globalen Trigger (GT_COLLIDE_...) , der nach der Berührung durch ein Objekt eines bestimmten Slots (bei uns der Staticslot für den Stein) ausgelöst wird. Aber leider muß ich in der Beschreibung des NGCenters für diese Bedingung lesen, dass dass nur für Moveableslots gilt.
Da muß ich mir also etwas anderes einfallen lassen! Es gibt meist mehrere Wege zum Ziel. Bedingungen kann ich mittels der Parametertrigger auch direkt in die Triggergruppe reinpacken. Was steht uns da zur Verfügung? Da haben wir die Trigger, die abfragen, ob Lara etwas berührt ( Collision. Lara is touching...). Wieder geht es aber nur mit Moveables.
Ich bin hartnäckig und erinnere mich, dass es noch eine dritte Möglichkeit geben könnte mit Hife des Scriptkommandos MultEnvCondition, in dem eine oder mehrere sogenannte Environmental Conditions (Umgebungsbedingungen) festgelegt werden können. Diese Umgebungsbedingungen werden dann in den Parametertrigger Multiple Condition of MultiEnvCondition-script command eingefügt. In der Liste der Möglichkeiten finde ich zwar Bedingungen, die sich auf Objekte beziehen (Env_Item_Extra_ ...), aber wieder geht es leider nur mit Moveables.
Was nun? Entweder ich packe den Stein dann doch einfach in ein MoveableSlot oder ich frage bei Paolone an, ob es nicht möglich wäre, das auch für Statics möglich zu machen und warte auf seine nächsten Updates. Natürlich warte ich jetzt nicht, sondern packe den Stein in ein Moveable Slot und setze die erste und einfachste von obigen drei Möglichkeiten um. Mein Globaler Trigger nimmt dann folgende Form an:
GlobalTrigger=1, IGNORE,GT_COLLIDE_ITEM, 20, IGNORE, 1. Was bedeutet das: Das ist mein Globaler Trigger Nr. 1, der wirksam wird, wenn Lara mit dem Objekt ID 20 (das sei mein Stein) kollidiert und dann meine Triggergruppe 1 triggert. Die Objekt ID sieht man im Editor in dem kleinen gelben Feld, wenn man mit dem Mauszeiger über das Objekt fährt. Globale Trigger fragen grundsätzlich im ganzen Level ab, ob die gegebene Bedingung efüllt ist, also auch vom Levelstart an. Wenn man aber aus bestimten Gründen will, das der Globale Trigger das nur für bestimmte Teile des Levels tut, dann muß man den Globalen Trigger mittels dem Flipeffekttriggers GlobalTriggers. &Enable/Disable the E Global trigger je nach Bedarf aus-bzw. anschalten.
Nach all der Mühe entdecke ich doch noch einen einfacheren Weg. Statics können mittels OCB neue Eigenschaften zugewiesen werden. Man kann ihn so auch die Eigenschaft zuweisen, das sie Lara schaden, wen Lara sie berührt. Der angerichtete Schaden hat zwar einen voreingstellten Wert, man kann ihn aber mit Hilfe eines Skriptkommandos Costumize auf den gewünschten Wert verändern. Also könnten wir den Stein doch in einem Staticslot verwenden. Viele Wege führen zum Ziel und mit Forschergeist findet man einen, der wirklich funktioniert bzw. den besten von einigen!

Jetzt muß ich noch den Flipeffekt starten, um den an der Decke plazierten Stein im rechten Moment runter purzeln lassen. Dazu verwende ich den Flipeffekttrigger Moveable Move. Move Moveable with data in & parameter list (wenn der Stein in einem Moveable Slot ist) oder Statics. Move. Move static with data in <&>parameters list (wenn der Stein im Static Slot ist). Paramater list bezieht sich auf ein anderes Scriptkommando Parameter, in dem ich zahlreiche Parameter für die Bewegung diese Moveables (Statics) festlegen kann, die Richtung der Bewegung (in unserem Fall nach unten), die Länge der Bewegung (Da muß man im Editor natürlich nachschauen, wie groß der Abstand zwischen Stein und Boden ist!), die Geschwindigkeit der Bewegung. Außerdem kan ich noch einen Sound während der Bewegung abspielen lassen und ebenso einen Sound am Ende der Bewegung, was bei uns natürlich ein schöner Sound für den Aufschlag des Steines auf dem Boden wäre. Diesen Trigger setze ich natürlich so, dass Lara potenziell genau in den fallenden Stein reinläuft. Ist schonmal ein bisschen Arbeit, um so etwas zu erschaffen, aber damit habe ich praktisch eine neue Falle kreiert. Nun fehlt natürlich noch der Test, ob wirklich alles so läuft, wie ich es mir vorgestellt habe. Unter Umständen muss ich dann halt noch weiter an der ganzen Sache basteln, bis es auch wirklich so funktioniert, wie ich es mir vorgestellt habe.
Aber Moment mal! Ich will doch nicht nur ein einziges Steinchen runterpurzeln lassen. Nein, ich will gleich mehrere Steine in einer bestimmten zeitlichen Reihenfolge von der Decke auf Lara herabregnen lassen! Ach Quatsch, ich will ganz großes Theater: es bebt, die Steine regnen herab, Objekte bewegen sich durch die Gegend, der Boden reißt auf und Lava quillt hervor, giftige Dämpfe steigen auf, Wege werden verschüttet, wenn Lara nicht schnell genug ist usw. und das alles schön zeitlich choreographiert. Da kommen wir zum Organizer.

Das Organizer-Skriptkommando

Wie sieht so ein Organizer aus: Organizer=1, IGNORE, IGNORE, 6, 1, 5, 2, 4, 3.
Das ist mein Organizer Nr.1. In den nächsten beiden Feldern kann man bestimmte Flags (Zeichen) bestimmen, die das Verhalten des Organizers bestimmen. Die Felder werden hier nicht genutzt, weswegen dort IGNORE (ignorieren) steht. Die Reihe der Zahlen besagt folgendes Nach 6 s wird meine erste Triggergruppe aktiviert, nach weiteren 5 s die zweite und nach weiteren 4 s die dritte. Als mögliche Flags im dritten Feld kann z.B. FO_LOOP stehen, was bedeutet, das mein Organizer als Schleife sich ständig wiederholt. Mit FO_TICK_TIME kann man die Zeitzählung verändern. Im obigen Organizer sind die Zeitabstände in Sekunden. Wenn ich aber dieses Flag eintrage, werden die Zeitabstände in 1/30s angegeben (Wenn man also einen Zeitabstand von einer halben Sekunde haben will, müßte man 15 an entsprechender Stelle eintragen und für eine Sekunde 30 usw.). Wenn man also sehr genau steuern muß (z.B. bei einer Fallensequenz) oder Ereignisse sehr schnell hintereinander stattfinden sollen, dann setzt man dieses Flag.
So eine Abfolge, wie weiter oben beschrieben, ließe sich also mit einem Organizer sehr gut zeitlich steuern. Ein Organizer kann übrigens bis zu 18 Stunden lang sein!
Lassen sich obige Ereignisse auch mit em TRNG umsetzen und wie ginge das (grob beschrieben)? Ja, es geht prinzipiell alles und wirklich im erstaunlich flexiblen Ausmaß, was man sich füher hätte sicher nicht vorstellen können. Ok, ein beben kenne wir ja schon als alten Flipeffekt. Wie man Steine herabregnen lässt, habe ich ausführlich beschrieben. Für die Bewegung von Objekten gibt es auch eine ganze Menge von schon teilweise hier erwähnten Flipeffekten. Damit kann man natürlich nicht alles erreichen, aber mit der Überlagerung von mehreren Bewegungen/Rotationen kann man Objekte schon recht komplex bewegen. Eine umfallende Säule z.B. dürfte mit diesen Mitteln schwer zu erreichen sein. Für ein paar Sachen müsste man dann halt Moveables mit entsprechenden Animationen bauen. Den Boden kann man natürlich mit Flipmaps aufreißen lassen. Veränderungen der Raumgeometrie und der Raumbeleuchtung ist bisher nur mit Flipmaps möglich, von denen ja jetzt mit dem TRNG 32 statt bisher 8 möglich sind. Nach wie vor kann man einen Raum nur einmal flippen. Es gibt aber Tricks, da noch variabler zu arbeiten. Mit einem Flipeffekttrigger kann man Lara wirklich absolut unbemerkt ohne Unterbrechung des Spielflusses in einen neuen, gleichartigen Raum teleportieren. So könnte man dann mit etwas Aufwand natürlich, Raumgeometrie und Beleuchtung eines Raums scheinbar mehrfach verändern. Also Wege verschütten und den Boden aufreißen läßt sich sehr flexibel bewerkstelligen. Um einen Wasserraum zu erstellen, braucht man übrigens keine Flipmap mehr (Für unsere Zwecke könnten wir so recht einfach einen Lavasee erstellen.).Da gibt es auch einen Flipeffekt. Texturen lassen sich mit der Flipeffektgruppe Animated Textures auch auf sehr flexible Art und Weise verändern. Himmel und Wetter kann man auch sehr effektvoll mit der Flipeffektgruppe Weather steuern. Da gibt dazu es ein sehr schönes Beispielprojekt von Paolone (siehe später).
Wie man sieht ist mit dem TRNG eine unglaubliche neue Flexibilität möglich, von der man früher nur träumen konnte. Es erfordet natürlich viel Wille und Zeit zu lernen und alles mögliche und ummögliche auzuprobieren, um die neuen Möglichkeiten in ihrem ganzen Potential auszuschöpfen.
Aber so können wir dann völlig neuartige Sachen in Costumlevels sehen und die Costumlevelszene lebendig halten.
Das war aber nur ein neuer wesentlicher Bereich der TRNG. Auch das Scripting hat sich stark verändert. Dazu noch mehr im nächsten Kapitel. Vorher nochmal eine Übersicht für das Zusammenwirken von Triggern und Scripting.

Übersicht der Verbindungen zwischen Triggern und Scripting

Action-, Flipeffekt und Parametertrigger können in das Scriptkommando Triggergroup transportiert werden und dort zusammengefasst werden. Triggergroups können mit einem Flipeffekttrigger auf einem Feld ausgelöst werden. Triggergroups können in die Scriptkommandos Globaltrigger und Organizer transportiert werden, wo sie in flexibler räumlicher und zeitlicher Reihenfolge organisiert werden. Globaltrigger und Organizer werden dann mit Flipeffekttriggern im Level ausgelöst/gestoppt.
Einige Flipeffekttrigger, wie z.B. die Flippeffekte Moveable Move oder viele Flippeffekte Statics brauchen Parameter, die mit dem Parameter-Scriptkommando bereitgestellt werden.
Das Scriptkommando MultEnvCondition stellte Umgebungsparameter für den Parametertrigger MultEnvCondition bereit.
Das sind nur Verbindungen, die in den vergangenen Abschnitten in der einen oder anderen Weise näher erläutert wurden. In anderen Bereichen gibt es natürlich noch mehr Verbindungen.

This post has been edited 3 times, last edit by "Raymond" (Oct 8th 2008, 10:56am)


5

Sunday, September 28th 2008, 10:52am

4. Das Scripting im TRNG

4.1 Allgemeines

Für das Scripting im TRNG gibt es ein eigenes Programm, das man benutzen muss! Im Scripter-Zip sind drei Dateien entalten. Die entpackt man und dann einfach auf Setup klicken. Die Dateien werden dann im NG_Scripter innerhalb des Programme-Ordner auf dem Computer installiert. Dann geht man in den NG_Scripter-Ordner und klickt auf NG_Center. Beim ersten mal wird man anfangs noch nach dem Ort des trle-Hauptordners gefragt, damit das Programm automatisch die Skriptdateien finden kann.

4.2 Die Programmoberfläche des NG_Centers

So sieht die Programmoberfläche dann aus:


Oben findet man fünf Auswahlmöglichkeiten. Script öffnet die script.txt zur Bearbeitung (siehe oben). Strings öffnet die english (german ,...).txt. IM Reference fenster findet man eine sehr gute Dokumentation aller Skriptkommandos. Im Settingsfenster kann man den Ort des trle-Hauptordners ändern. Im Toolsfenster findet man ein Programm zur Überwachung von Animationen. Dazu kann ich leider nicht viel sagen.

Das Scriptfenster

Man bearbeitet hier die scripteinträge wie in einer Textbearbeitung. Mit dem Feld Save wird gesichert und mit dem Feld Build wird die script.dat erstellt. dabei wird automatisch auch gesichert. Mit Find kann man im Text nach Wörtern usw. suchen lassen.
Im grünen Feld unten werden die Fehler beim Konvertieren angezeigt. Die Fehler kann man sich mit Show Errors auch als Textdatei ausgeben lassen.

Das Stringsfenster



Hier bearbeitet man die english(german,..).txt. Den String, den man ändern möchte anklicken und dann kann man ihn im Textfeld unten ändern und unten auf Update klicken. Die Dateien werden konvertiert, wenn man im Scriptfenster auf Build klickt.

Das Referenzfenster



Hier findet man umfangreiche Dokumentationen zu verschiedenen Bereichen. Die Bereiche können oben aus dem Menü ausgewählt werden:
1. Script new commands
Hier sind die ganzen neuen Scriptkommandos beschrieben. Man klickt auf das Scriptkommando, das man erläutert haben möchte und bekommt unten im kleinen grünen Feld die nformation angezeigt. Man kann sich diese Information aber auch ausführlich in einem eigenen Textfenster anzeigen lassen, in dem man auf Expand Info klickt. Mit Output list in text file wird die Info als eine txt-Datei im NG_Scripter Ordner hinterlegt. Mit Copy name in Clipboard kann man sich das Kommando in die Zwischenablage speichern und dann in sein Script einfügen. In den anderen Bereichen funktioniert das analog.
2. Mnemonic Constants
Hier werden die ganzen Teilbestandteile der neuen Scriptkommandos erläutert. Wenn hier was zu finden ist, wird vom obigen Erläuterungen hierher verwiesen. Man kann drei verschiedene Werte von diesen Indexlisten in die Scriptkommandos übertragen: einen dezimalen Zahlenwert, einen hexadezimalen Zahlenwert und einen Textwert. Mit Copy Value in Clipboard wird der dezimale Wert in der Zwischenablage gespeichert.
3. Es gibt auch einen Extrabereich für die alten Scriptkommandos (Script old commands)
4. OCB list: eine Liste aller OCB-Werte
5. Damage Enemy list gibt wichtige Informationen für die Anpassung von Feinden, die beim Enemy-Scriptkommando gebraucht werden
6. Keybord Scancodes list, Slot Moveable-, Slot Statics- und Sound SFX indices lists: Hier findet man Indexlisten für Tastaturtasten, Moveable- und Static slots und die Sound SFX- Dateien. Man kann drei verschiedene Werte von diesen Indexlisten in die Scriptkommandos übertragen: einen dezimalen Zahlenwert, einen hexadezimalen Zahlenwert und einen Textwert. Mit Copy Value in Clipboard wird der dezimale Wert in der Zwischenablage gespeichert.

This post has been edited 6 times, last edit by "Raymond" (Oct 8th 2008, 11:03am)


6

Wednesday, October 1st 2008, 12:09pm

4.3 Die Grundstruktur von Scriptkommandos (Syntax)

Die Grundstruktur kennt man ja schon vom alten script: Scriptkommando= Wert, ....,.....,..... ; Kommentare zur Dokumentation
Je nach verwendeten Scriptkommando kann der Wertebereich kürzer oder ziemlich lang werden.

Beispiel Triggergroup
TriggerGroup=1,$2000, 89, $12 (siehe vorangeganges Kapitel)
Die allgmeine Syntax für das Kommando ist: TriggerGroup= IdGroup, ExportValue1 + TGROUP_ flags, ExportValue2, ExportValue3, Other Values 1/2/3 of exported triggers or conditions.
Der erste Werte ist also die ID des Triggergroupkommandos. Dann folgen Dreiergruppen mit den Werten für die exportierten Trigger (siehe auch vorhergehendes Kapitel). Wenn wir in einer Gruppe sieben Trigger hätten, dann hätten wir also insgesamt 1+7*3=22 durch Kommas abgetrennte Werte dazustehen. Die Parametertrigger mit den Bedingungen stehen immer vor den anderen triggern.
Bei einem Parametertrigger können zu dem ersten Zahlenwert mit einem Plus noch ein Flag (TGROUP_) hinzufügen. Dieser Flag kann z.B. ein logischer Operator sein: and, or , not, else. Ohne einen solchen Operator werden alle Bedingungen in den Parametertriggern abgefragt. Wenn alle erfüllt sind, werden die nachfolgenden Trigger ausgelöst. Durch den Operator wird die Abfrage modifiziert.
Beispiele: A sei ein Parametertrigger mit der Bedingung 1, B sei ein Trigger mit der Bedingung 2 , C sei ein beliebiger Actiontrigger:
C soll ausgeführt werden, wenn einer der beiden Bedingungen erfült ist:
Triggergroup=1, A1, A2,A3,B1+TGROUP_OR,B2,B3,C1,C2,C3
C soll ausgeführt werden, wenn die Bedingung A nicht erfüllt ist und die Bedingung B erfült ist
Triggergroup=1, A1+TGROUP_NOT, A2,A3,B1,B2,B3,C1,C2,C3

Stellen wir uns mal folgende praktische Situation am Ende einer Levelserie vor. Wir wollen den Zugriff zum Bonuslevel von den gefundenen Secrets abhängig machen:
Wenn der Spieler weniger als 10 Secrets gefunden hat, dann Einblendung: Du Looser! Gehe durch Tür 1 und die Serie ist zu Ende (Es gibt eine Gruppe von Flippeffekttriggern, die Texteinblendungen ermöglichen.)! Tür 1 wird geöffnet. Spieler hat 10-19 Secrets gefunden: Ganz gut, geht aber noch besser! Geh durch Tür 2 und du kannst ein Teil des Bonuslevels spielen.Tür 2 wird geöffnet.
Der Spieler hat mindestens 20 Secrets: Du bist ein Champion! Gehe durch Tür 3 und spiele das Bonuslevel! Tür 3 wird geöffnet.
Trigger A- Parametertrigger mit der Bedingung, dass Lara mindestens 10 Secrets hat
Trigger B- Parametertrigger mit der Bedingung, dass Lara mindestens 20 Secrets hat
Trigger C, D bzw. E für die Texteinblendungen 1,2 bzw, 3.
Trigger F,G bzw. H für die Öffnung der Türen 1,2 bzw. 3.
Dann sieht die Triggergruppe so aus (ohne Gewähr):
Triggergroup= 2,A1+TGroup_NOT, A2,A3,C1,C2,C3,F1,F2,F3, A1+TRGROUP_ELSE,A2,A3,B1+TRGROUP_NOT,B2,B3,D1,D2,D3,G1,G2,G3,B1+TRGROUP_ELSE,B2,B3,E1,E2,E3,H1,H2,H3
Wenn also der ELSE-Operator benutzt wird, sieht die Syntax ein bisschen anders aus. Jeder Else-Operator bezieht sich auf einen eigenen Triggerblock: also erster Triggerblock mit Bedingungen und auszuführenden Triggern, dann Bedingung mit dem Else-Operator und weiteren Bedingungen und auszuführenden Triggern usw..
Ich habe so etwas bis jetzt noch nicht ausgetestet, aber damit kann man offensichtlich großartige Sachen anstellen.


Beispiel Parameters
Parameters=PARAM_ROTATE_ITEM, 2,FROT_LOOP,103,ROTH_CLOCKWISE,IGNORE,$180,IGNORE,IGNORE,IGNORE,IGNORE,IGNORE
Sieht kompliziert aus, ist aber halb so wild! Zur Erinnerung: das Parameters-Kommando gibt Werte an verschiedene Flipeffekttrigger weiter (z.B. Move Moveable). Mit der Zuhilfenahme der Referenz entschlüsselt sich alles.
Die allgemeine Syntax des Kommandor ist: Parameters= Type of parameters (PARAM_...), IdParameterList, parameter array.
Den ersten Wert findet man bei den Mnemonic constants in der Referenz. Wir hätten da drei zur Verfügung, die die Art der Bewegung/Färbung festlegen: Param_Move_Item-geradlinige Bewegung, Param_Rotate_Item-Rotation des Objekts, Param_Color_Item-Färbung.
Der zweite Wert ist die ID des Parameterkommandos. Diese ID wird an entsprechender Stelle in den Flipeffekttrigger eingetragen.
An dritter Stelle kommt das Parameterarray, das je nach gewählten Parameterart aus verschiedenen Werten besteht. Die Details findet man wieder in der Referenz bei den Mnemonic Constants. Bei Param_Rotate_Item sieht das Parameterkommando dann folgendermaßen aus: Parameters=PARAM_ROTATE_ITEM, IdParamList, FlagsRotation (FROT_), ItemIndex, DirHRotation (ROTH_...), HRotationAngle, SpeedHRotation, DirVRotation (ROTV_..), VRotationAngle, SpeedVRotation, MovingSound, FinalSound
Im Parameterarry ab dritten Wert stehen dann also insgesamt 10 Werte. Im ersten dieser Werte steht ein sogenanntes Flag (Zeichen), das Grundeigenschaften der Bewegung festlegt. Unter FROT findet man die entsprechenden Möglichkeiten. In unserem Beispiel ist es FROT_LOOP. Die Bewegung erfolgt also in einer kontinuierlichen Schleife, d.h. das Objekt rotiert also so lange, bis es wieder antitriggert wird. Im nächsten Wert tragen wir den Indexwert des Objekts ein (Das ist die gelbe Zahl, wenn man im Editor mit der rechten Maustaste auf das Objekt klickt.) Mit dem nächsten Wert wird die Richtung der horizontalen Rotation festgelegt. im unseren Fall erfolgt sie im Uhrzeigersinn (clockwise). Dann wird der horizontale Rotationswinkel (angle) eingetragen. Bei einem Loop wird hier kein speziller wert eingetragen und sobald das an irgendeiner Stelle in einem Kommando so ist, muß man IGNORE hinschreiben. Soll nur eine einmalige Rotation erfolgen kann man die einzutragenden hexadezimalen Werte in der Referenz sehen. Im nächsten Feld wird dann die Rotationgeschwindigkeit. Wie bei allen Werten kann man den Wert dezimal oder hexadezimal eintragen, wobei die hexadezimale hin-und wieder recht vorteilhaft ist. Hexadezimale Werte müssen mit einem Dollarzeichen anfangen (wie z.B. bei uns $180). Komplexer wird die Sache, wenn wir keine Rotationsschleife haben, denn dann muss der Wert für den Winkel durch den Geschwindigkeitswert teilbar sein. In den nächsten drei Feldern folgen analog die Werte für die vertikale Rotation (bei uns gibt es dreimal IGNORE, weil wir keine vertikale Rotation haben wollen). In den beiden letzten Feldern werden der Bewegung Sounds zugewiesen. Im vorletzten Feld kommt die Sound SFX ID für einen Sound während der Rotation und im letzten Feld kommt die Sound SFX ID für einen Sound am Ende der Rotation. In unserem Beispiel verwenden wir keine Sounds.

Beispiel Animations
Animation= 456, KEY1_ACTION+KEY1_JUMP+KEY1_DOWN,IGNORE, FAN_SET_FREE_HANDS, ENV_CLIMB_WALL_IN_FRONT, IGNORE, IGNORE,-164; ladder to monkey
Die allgemeine Syntax des Kommandos ist: Animation=AnimIndex, KEY1_ , KEY2_ , FAN_ flags, ENV_ Environment, Distance for Env, Extra, StateId or AnimationId array (...).
Mit dem obenstehenden Animationskommando soll Lara in der Lage sein, von einer Leiter an eine Hangelstrecke zu springen.
In ersten Feld steht die Animationnummer, die Lara ausführen soll. Das ist bei mir die Animation 456. Ich benutze eine Animation, die von Jesse erstellt wurde und auf trsearch.org verfügbar ist. Bei dieser Animation springt Lara mit einer 180 Grad-Drehung.
In den folgenden beiden Feldern stehen die Tasten, die gedrückt werden müssen, damit diese animation ausgeführt wird. Die Actiontaste ist an der Leiter so und so gedrückt. Jump habe ich gewählt, weil das ein Sprung ist. Down habe ich gewählt, um noch weiter zu unterscheiden, weil ich in meinem Level verschiedene Sprünge an der Leiter habe. Da ist ja schon mal der Standardsprung, der im Spiel normalerweise mit Action und Jump funktioniert. Dann habe ich noch einen Aufwärtssprung, der mit Action+Jump+Up funtioniert. Inmienem Fall werden die Tasten alle im ersten von beiden Feldern festgelegt. IM zweiten Feld können noch bestimmte andere Tasten festgelgt werde, was bei mir nicht gebraucht wird. Im nächsten Feld können Flags gesetzt werden. Mit FAN_SET_FREE_HANDS bestimme iich, das Laras Hände fei sind und somit greifen können. das kann eben eine Hangelstrecke sein, die sich direkt über Lara befindet, aber in meinem Fall durchaus auch ein Jumpswitch oder eine Kante sein kann, die in bestimmter Höhe und Entfernung liegen müssen.
Im nächsten Feld werden bestimmte Umgebungsbedingungen festgelegt, die erfüllt sein müssen, damit diese Animation gestartet wird. Ich denke, dass ich die von mir verwendete Bedingung gar nicht setzen müsste, da Lara bei Ausführung der Animation so und so an einer Leiter hängt (siehe Erläuterung für das letzte Feld!) , aber sie hat jedenfalls auch nicht geschadet.
Das nächste Feld bezieht sich auf das vorhergehende. Hier wird die Distanz zu Lara festgelgt, in der die Umgebungsbedingung zutrifft. Für genaueres siehe bei ENV_ in der Mnemonic constants-Liste in der Referenz.
Man kann auch mehrere Umgebungsbedingungen bestimmen. Wenn bei keiner Bedingung etwas im Distanzefeld festgelegt werden muß, dann kann man diese einfach mit + verbinden.
Bsp.2: Animation= 421, KEY1_JUMP, IGNORE, FAN_SET_NEUTRAL_STATE_ID, ENV_POS_HORTOGONAL + ENV_HOLE_FLOOR_IN_FRONT + ENV_POS_STRIP_1, IGNORE, IGNORE, 80; crawlspace exit- Rolle aus dem Kriechgang heraus
Wenn man mehrere Bedingungen hat, die Werte im Distanzfeld erfordern, dann muss man dafür ein neues kommando MultEnvCond verwenden und im Animationskommando bei den Umgebungsbedingungen ENV_MULTI_CONDITIONS eintragen und im Distanzfeld die ID des MultiEnvCond-Kommandos.
Bsp.3: Animation=218, IGNORE, KEY2_DASH, FAN_KEEP_NEXT_STATEID, ENV_MULT_CONDITION, 3, IGNORE, -222, -353, -354 ;roll in crawlspace-Kriechgangrolle
MultEnvCondition= 3 ,ENV_NO_BLOCK_IN_FRONT, 256, IGNORE, ENV_NON_TRUE + ENV_HOLE_FLOOR_IN_FRONT, 512, IGNORE

Im vorletzten Feld können noch Werte in Verbindung mit bestimmten Fan-Flags bestimmt werden.
Im letzten Feld werden dann die Animationen eingetragen, von wo aus die Animation gestartet wirdoder die StateID, die Lara gerade haben muß. Vor die Animationsnummern muß ein Minuszeichen. Im ersten Beispiel startet die Animation von Animation 164. In zweiten feld von StateID 80 (Lara in Kriechposition auf den Knien). Im dritten Beispiel sind mehrere Animationen als Ausgangspunkt festgelegt. Übrigens kann man die Scriptkommandos für Beispiel zwei und drei einfach in jedes andere Script übernehmen, weil alle Animationen (in der Regel) in Lara´s Standardanimationen enthalten sind.

Wie man sieht, braucht man einiges Grundwissen zu Lara´s Animationen und StateID´s , sowie über die verfügbaren Umgebungsbedingungen and Fan-Flags. Außerdem gehört noch eine gehörige Portion Experimentierfreude dazu. Dann kann man eine ganze Menge verrückter Sachen mit Laras Animationen anstellen. Mit Hilfe des Animationskommandos haben Titak und ich es geschafft, auch alle TREP-Moves mit dem TRNG zu ermöglichen. In meinem Script habe ich außerdem Jesses Leiteranimationen mit einer viel übersichtlicheren Struktur von Tastenbelegungen versehen und sie außerdem noch viel spezifischer auf die gewünschte Umgebung festgelegt.

Diese drei Beispiele für Scriptkommandos sollten vermitteln, wie der Syntax von Scriptkommandos aufgebaut ist. Mit Hilfe der Referenz im NG_Center sollte die Syntax anderer Kommandos gut verstehbar sein.
Im letzten Kapitel möchte ich einen groben Überblick über die Vielzahl der Scriptkommandos und der damit verbundenen neuen Möglichkeiten geben.

This post has been edited 6 times, last edit by "Raymond" (Oct 8th 2008, 12:15pm)


7

Thursday, October 2nd 2008, 2:38pm

4.4 Eine Übersicht der neuen Scriptkommandos

Hier soll es eine grobe Übersicht über die verfügbaren Scriptkommandos geben, ohne dass ich in die Details der Syntax eingehe.Die meisten Kommandos sind für die Levelsektionen des Scripts, manche kommen in die Optionssektion. Diese werde ich entsprechend anmerken.

Addeffect: Das Kommando ermöglicht das Hinzufügen von Partikeleffekten (Flammen, Rauch, Nebelbälle, Blut) zu Moveables.
Animation: siehe vorhergehenden Abschnitt
AssignSlot: Hiermit wird einem Objekt aus einem anderen TR-Level ein bekannter tr4-slot zugewiesen. das macht die Verwendung des TR2 bzw.TR-3-Motorbootes möglich, was bislang aber die einzigen derartigen Objekte sind,für die das möglich ist.
ColorRGB: Hier werden RGB-Farben für andere Kommandos bereigestellt.
CRS: CrashResumeSystem, ist ein Kommando in der Optionssektion. Wenn das CRS nicht arbeitet (DISABLED), dann gibt es Crashreports, was für die Bau-und Testphase wichtig sein kan. Wenn es arbeitet (ENABLED), dann werden Abstürze der Gameengine sehr unwahrscheinlich. Diese Einstellung sollte man also für die Veröffentlichung wählen. Ist analog zum CRS des NGLE.
Costumize: Hier findet man viele Anpassungsmöglichkeiten ( z.B. für die Ammo, den Ammo Counter, die Waffen, die neue Soundengine (mehr dazu später) und viele andere kleine Anpassungen.)
Cutscene:Das Level wird wie ein Cutscene-Level behandelt (keine Beeinflussung durch Tastaturkommandos)
Damage:Hier kann man die Grundeinstellungen für Damagerooms seinen Bedürfnissen anpassen.
Detector: Das ist ein neues Objekt der TRNG. Man braucht dafür ein von Paolone auf der TRNG-Webseite bereitgestelltes Wadobjekt (ng.wad, ng2.wad). Mit dem Detektor kann Lara Ziele in Bezug zu ihrer Position ausmachen. Der Detektor hat zwei verschiedene Modes: pointer detector und radar detector. Dder Pointer Detector zeigt wie ein Kompass auf das nächtsliegende ausgewählte Objekt, bis es aufgehoben bzw. getötet ist. dann zeigt es zum nächsten ausgewählten Objekt usw. Der Radar Detector zeigt alle ausgewählten Objekte, die in seinem Erfassuingsradius liegen. Für den Detektor gibt es zur Erläuterng auch ein Beispielprojekt von Paolone.
Diagnostics: (Optionssektion), Sehr nützlich beim Levelbauen: Man bekommt im Spiel z.B. Lara gegenwärtige Animation und State-ID, abgespielte und vermisste Soundnummern usw. angezeigt.
Elevator: Damit macht man Oneblock/Twoblockplatforms zu Fahrstühlen. Es gibt eine Vielzahl von Einstellungsmöglichkeiten für Höhen, Stockwerkanzahl, Geschindigkeit, Haltedauern, Türöffnung, Steuerung durch Keypad usw). Man kann damit bis zu 20 verschiedene Fahrstühle im Level haben! Hierzu gibt es ebenfalls ein Beispielprojekt von Paolone.
Enemy:Hier passt man die Feinde an seine Bedürfnisse an.
Equipment: Hier kann man das gewünschte Inventory für den Start des Levels zusammenbasteln.
FMV: Die im Spiel genutzten Videosequenzen werden hier bestimmt.
FogRange: dient der Festlegung der Nebelbereiche (für Fogbulbs und Distant Fog
ForceBumpMapping:Optionssektion, erklärt sich von selbst
ForceVolumetricFX:ebenfalls selbst erklärend
GlobalTrigger:siehe vorhergehende Kapitel
ImportFile:Hat sich mir noch nicht so ganz erschlossen!
Itemgroup:Erlaubt Gruppen von Objekten festzulgen, die dann gemeinsam mit einem Flipeffekttrigger ItemGroup manipuliert werden können!
Keypad:Manipuliert die Standarts (Sounds;Lara`s Animationen) für das Keypad-Objekt (Kann man im ng.wad von Paolone finden!)
Levelfarview: Legt die Drawing Distance für das Level fest (bis 127 Sektoren).Siehe auch Worldfarview!
MirrorEffect: Spiegelräume können derzeit im Westen, an der Decke und am Boden gemacht werdem. Moveables können auch gespiegelt werden.
MultEnvCondition:siehe vorhergehende Kapitel
NewSoundEngine: Optionssektion, die Engine ist als Standard eingeschaltet.
Die Engine basiert auf dr bass.dll von Un4seen Developments. Sie ermöglicht das Abspielen auf zwei Kanälen mit samt vielfältiger Manipulierungen durch Flipeefekte( Abspielen als Loop, Lautstärke usw.). Mit dem Kommando Costumize kann man das Abspielen verschiedener Soundformate ermöglichen, wobei alles mit dem wav-Format möglich ist. Wav muß auch nicht im bisher üblichen Format sein. Außerdem lassen sich hier auch die FadeOuts einstellen. Es können auch verschiedene Soundformate in einem Level gemixt werde. Man kann also gleichzeitig wav, mp3 oder ogg in einem Level nutzen. Es sind 256 Sounds nutzbar! Alle können beliebig oft abgspielt werden und alle kann man auch als Loop abspielen!!!
Organizer:siehe vorhergehendes Kapitel
Parameters: dito
PreserveInventory: Wenn man ResetHUB machen mußte, wird hiermit das Inventar wiederhergestellt, so wie es am Ende des vorhergehenden Levels war!
Rain:Wenn man Regen in den gewünschten Räumen im Level haben möchte!
Settings:Optionsektion, Hier kann man bestimmte globale Einstellungen machen:z.B. Cheats oder die Manipulierung von Saves unmöglich machen, das Script verschlüsseln, Level von CD ausführen ermöglichen
ShowLaraInTitle: Lara im Title-Level sichtbar machen!
Snow:Lasst es im Level schneien! Tipp: Zusammen mit dem Organizer und der Vielfalt von Flippeffekten/Flipmaps kann man recht eindrucksvolle dynamische Wetterabläfe im Level simulieren! Siehe Paolones Beispielprojekt.
SoundSettings:Einstellung der Soundqualität und Laustärke von CD- und SFX-Sound
TextFormat:Grundeinstellung für die Formatierung von durch Flipeffekten eingeblendeten Text
TextureSequence: ermöglicht das vielfvältige Abspielen von Texturensequenzen
Triggergroup:siehe vorhergehendes Kapitel
Turbo: ermöglicht einige Tricks zur Beschleunigung der Gameengine, wenn die Framerate im Level zu langsam wird (Z.B. das dynamische Heruntersetzen der LevelfarView)
WorldFarView:Optionssektion, hier wird die maximale Sichtweite in allen Leveln eingstellt, die durch LevelFarView nicht überschritten werden darf

5. Neue OCB-Werte für Objekte - vielfältiger Einsatz von Pushables, Rollingballs, Keypads und Statics

Das Keypad

Das Keypad-Schalterobjekt ist im ng. wad im Slot switch_type1 zu finden.
Keypad-OCB:
allgmein:
einzutragender OCB= Zahlenwert ür den Code+16384
Wenn man also einen Code von 7153 zum öffnen einer Tür haben möchte, muß man 7153+16384=23537 in den OCB eintragen.
um einen bestimmten Stock mit dem Fahrstuhl anzusteuern: 10001-10010 als erster Summand angeben, wobei die letzten beiden Zahlen die Anzahl der möglichen Stockwerke angibt. 10007 sagt also, dass es sieben Stockwerke geben soll, die mit den Ziffern 1-7 ansteuerbar sind. Als OCB trägt man dann also 10007+16384=26391 ein. Unter dem Switchtrigger für das Keypad muß man dann den Flipeffekttrigger "Elevator. Move <#>elevator to floor number set in last keypad operation" legen. In Zukunft werden noch andere Flipeffekte mit dieser Methode nutzbar werden, um z.B. normale Türen im Level anzusteuern.

Pushable
Der OCB kann sich aus einer reihe von Bestandteilen (Summanden) zusammenfügen:
1. Summand: 0-31: gibt die Höhe des Pushables in Klicks an, die begehbar sein sollen, wenn er nicht begehbar sein soll, dann 0 eingeben!
2. Summand: 32 für Pushable, die man über Kanten stoßen kann. Achtung: Pushable rotiert beim herunterfallen. Das muss man unter Umständen beachten.
Beim Herunterfallen werden Shatter-Objekte zerstört und Gegner (außer Demigods) getötet, die sich auf dem entsprechenden Feld befinden.
3. Summand: 64 muß man eingeben, wenn man Pushables haben will, mit dem man eine der neuen TRNG-Möglichkeiten nutzen will.
folgende Summanden: 128 = kein Ziehen möglich
256 = kein Schieben möglich
512 = keine Ost-West-Bewegung möglich
1024 = dasselbe für Süd-Nord
2048 = Im Westen bekletterbar
4096 = im Norden
8192 = im Osten
16384 = im Süden
Beispiele:
einfacher 4-click hoher, aber begehbare Pushable: 4+64=68
Pushable, der 8 klick hoch ist, den man über Kanten schieben kann, der begehbar ist und im Norden bekletterbar sein soll:
8+32+64+4096=4200
Pushable, der nicht begehbar ist, über Kanten geschoben werden kann und nicht zu ziehen sein soll:
0+32+64+128= 224

Rollingball (RB)
Der OCB setzt sich hier ebenfalls aus mehreren Bestandteilen zusammen. Wenn man mehrere Eigenschaften haben will, muss man die entsprechenden OCB´s addieren.
1-kein Erdbeben und Sound
2-Feinde werden getötet
4-Der RB wird aktiviert (angeschoben), in dem Lara davorsteht und die Aktiontaste gedrückt wird. (Animation 316 wird gebraucht, ist z.B. im catacomb.wad vorhanden!)
8-Der RB kann wie ein Pushable über flache Flächen geschoben weren. (Animation 3316 erforderlich)
16-Shatter werden zerstört
32- ermöglicht spezielle Wassereigenschaften (Aufspritzen beim Auftreffen auf Wasseroberfläche, veränderte Beweglichkeit unter Wasser)
64-auch normale Trigger werden ausgelöst

Statics
Die Eigenschaften von Statics können auch durch OCB-Eintragungen verändert werden:
4-keine Kollision
8- Glastransparenz
16-Eistranzparenz
32- verletzt Lara (Stärke kann mit Costumize-Kommando verändert werden)
64-verbrennt Lara
128- jagt Lara in die Luft (erfordert Animaton 438, z.B. im newcity.wad)
256-vergiftet Lara (Intensität kann mit Custumize-Kommando verändert werden)
512-große Kollision (bei Statics größer als 6mal6 Felder)
1024- hartes Shatterobjekt
Die verschiedenen Eigenschaften addiert man die Werte. es ist nur ein Transparenzwert möglich. Die Einstellungen werden durch die Static-Flippeffekttrigger im Spiel modifiziert.

This post has been edited 13 times, last edit by "Raymond" (Oct 9th 2008, 1:46pm)


8

Monday, October 6th 2008, 6:38pm

6. Verfügbare Beispielprojekte von Paolone

Paolone hat auf seiner TRNG-Webseite im Abschnitt Source Sample Collection ein paar kleine Beispielprojekt bereitgestellt, um ein paar neue Möglichkeiten der TRNG zu erläutern. Die Beispielprojekte sind sehr instruktiv, weil ihn ihnen die prj-Datei und das verwendete Script enthalten ist. Außerdem kann man sich die neuen Sachen dann auch noch im Spiel ansehen, wobei an den entsprechenden Stellen im Spiel oft noch Texterläuterungen eingeblendet werden (Damit lernt man auch gleich wie Texteinblendungen funktionieren!). Zum Spielen müssen die Skriptdateien mit dem NG_Center konvertiert werden.

Sources for sample with Elevators and Detectors
Download
Das Zip enthält vier Projekte mit wads:
1. Fahrstuhl mit mehreren Etagen und Türen: Elevator_multi_door_closed.prj+ng.wad+catacomb.tga
2. Fahrstuhl mit Tür stop and go: Elevator_single_door_stopandgo.prj+ng2.wad+catacomb.tga
3. Detektor im Pointermodus: detector_pointer_cleopal.prj+cleopal.wad+cleopal.tga
4.Detektor im Radarmodus: radar_detector_karnak.prj+karnak.wad+karnaktga
Die tga´s sind nicht im Zip enthalten. man nimmt einfach die entsprechenden Standard-TGA´s (gilt auch für die anderen Projekte).

Sources for Boats
Download
Beispielprojekt mit TR2-und TR3-Boot
sample_boats.prj+ng2.wad (aus dem obigen Zip)+catacomb.tga
Die mitgelieferten Sounds müssen in den Samples_ordner und die sound.txt an die entsprechende Stelle.
Bei den Booten müssen alle fünf OCB-Schalter gedrückt sein und für ein Boot mit Licht muß man 1 eintragen.

Sources for Mirrors
Download
Beispielprojekt für den Spiegeleffekt (Westwand, Decke und Boden): mirrors.prj+ng2.wad+catacomb.tga

Sources for vertical triggers ...
Download
Beispielprojekt zur Anwendung vertikaler Trigger um eine Kletterwand zu erstellen, die nur in bestimmten Höhenabschnitten bekletterbar ist:
VertTriggersAndBreakClimb.prj+catacomb.wad (Original)+catacomb.tga
Mit enthalten ist auch ein Beispiel einer Triggergruppe. Diese Triggergruppe ermöglicht es Lara, dass sie die Strg-Taste drücken kann, wenn sie vom Boden aus an einen Leiterabschnitt springen will.

Miscallenous
Download
Beispieprojekt mit mehreren verschiedenen Anwendungen: Mixsample1.prj+mix1.wad+mix1.tga (alles im Download)
Das Projekt enthält global trigger zur Realisierung eines besonderen Savegamemanagemnts. Man kann hier nur sichern, wenn man ein bestimmtes Gem im Inventar aufruft, wobei dann ein Gem abgezogen wird. Man kann also nur so lange sichern, wie ´man gems im Inventar hat.
Im ersten Raum sieht man Möglichkeiten von Texturensequenzen (Rollband, ON/OFF usw.) und der Anwendung eines Lara(Physics-Flipeffekts zur Veränderung von Lras Bewegungseigenschaften.
Im zweiten größeren Raum sieht man, wie eine Objektgruppe (eine Stachelwand bestehend aus einzelnen Stachelsektoren) mit einem Moveflipeffekt bewgt wird.
Im dritten größeren Raum sieht man eine Anwendung fragmentierter Trigger.
Im offenen Gelände sieht man die Wirkungsweise eines Organizers, der mehrfache, dynamische Wetterveränderungen bewirkt und auch eine Textursequenz abspielt, die eine sich schließende Schneedecke bei Schneefall simuliert.

Sourcesforquicksandsample
Download
Dateien:quick_sand.prj+originales karnak.wad+mitgelieferte karnak.tga
Das Beispiel enthält zwei verschiedene Treibsandräume: einmal fließend, semitransparent und ein anderes mal ruhig, undurchsichtig. Außerdem gibt es einen globalen Trigger, der zeigt, wie man ein Level nach dem Aufnehmen einer bestimmten Zahl eines Pickups (hier 6 Canopic Jars) beendet.

Statics: ...
Download
Dateien: statics. prj+wad+tga (alles im Zip)
Beispiel für verschiedene Manipulierungen von Statics-Anwendung der Statics-Flipeffekte und neuer OCB-Werte für Statics: richtige Kollision für riesige Statics (größer als 6*6 Felder); harte Shatters, die nur mit Explosivammo, Motorrad, Jeep zerstört werden können; Statics, die Lara vergiften, explodieren lassen, verbrennen, Lebenskraft abziehen bzw. die selber explodieren; Statics, die sich bewegen, rotieren, die Farbe ändern;, Eis- und Glastransparenz an Statics
Die Effekte sind nach Räumen sortiert und mit Textbeschreibungen erläutert.
Besonders lustig: eine Rakete die Lara abschießt!

This post has been edited 3 times, last edit by "Raymond" (Oct 8th 2008, 12:28pm)


9

Saturday, December 27th 2008, 1:21pm

Ergänzung Wetterveränderungen

Die Gruppe der Wetterflipeffekte

Viele Wetterveränderungen werden mittels von entsprechend Im Level getriggerten Flipeffekten realisiert.
Man gehe im Triggermenü des NGLE zu den Flipeffekten (oberstes Feld). Im Feld darunter, wo man den Flipeffekt auswählt, geht man dann zum Ende zu der Gruppe der Weather-Flipeffekte.

Nebel
Die erste Untergruppe Weather. Fog beeinflußt den Nebel. Der erste Flipeffekt Weather. Fog. <&>Enable/Disable all fog (distance fog or fog bulbs) soll Distanznebel oder Nebelbälle aus- bzw. anschalten (funktioniert leider (noch) nicht). Man kann aber auch mit dem Flipeffekten VolumetricFX zwischen den beiden Nebelarten im Level umschalten ( Beide Nebelarten gleichzeitig geht nach wie vor nicht!). Die nächsten vier Flipeffekte manipulieren die Fogdistance für Distanznebel. Dieser Wert wird eigentlich im Script mit dem FogRange-Kommando eingestellt (erster Wert). Die Fogdistance gibt die Enfernung von Lara aus an, wo der Nebel beginnt zu erscheinen. Man kann hier die Distanz kontinuierlich linear über einen gewissen Zeitraum verändern, die Werte pulsiern lassen oder einfach einen neuen Wert setzen. Es sind übrigens auch negative Fogdistance-Werte möglich, d.h. der Nebel beginnt unmittelbar bei Lara und wird um so dichter, je kleiner der Wert wird. Leider gibt es hier noch kleine Probleme, denn leider werden die Inventarobjekte mit der Nebelfarbe eingefärbt und durchsichtige/strahlende Texturen im Level ebenfalls (je kleiner der Wert, um so stärker ist die Färbung. Das scheint auch abhängig von der Grafikkarte zu sein.)
Das Erscheinungsbild des Distanznebels ist übrigens auch von der gewählten Levelfarview (Drawing Distance) abhängig. Je größer die Levelfarview, desto dünner wird der Nebel. Da man die Levelfarview mit dem Flipeffekt Distance. Set level far view (max distance) to <&>number of sectors ebenfalls anpassen kann, kann man so ebenfalls das Erscheinungsbild des Distanznebels verändern.

Gewitter
Gewitter kann man mit dem nächsten Flipeffekt Weather. Lightning, <&>Enabled/Disable the Lightning ein- bzw. ausschalten.

Regen/Schnee
Mit den Flipeffekten Weather. Rain. Set <&>new state for Rain in current level und Weather. Snow. Set <&>new state for Snow in current level kann man den Status von Regen bzw. Schnee im Level verändern (für die einzelnen Zustände siehe auch Jörg´s Wettertutorial). Mit Weather. Set Rain/Snow intensity for <&>room with the new (E)intensity value kann man zwischen den vier Intensitätsstufen für Regen und Schnee hin-und herschalten. Man kann es übrigens auch gleichzeitig regnen und schneien lassen.

Himmel
Mit der Gruppe Weather. Sky kann man das Aussehen des Himmels manipulieren. Man kann die Farben der beiden Himmelschichten verändern (kontinuierlich bzw. einen neuen Wert setzen), die Schichten ein-bzw. ausschalten und die Geschwindigkeit der Wolkenbewegung verändern.


Komplexe Veränderungen

Um dynamische Wetterveränderungen zu erzeugen eignet sich das Organizer-Skriptkommando wunderbar (über die Verwendung des Kommandos siehe im Abschnitt über Scripting im TRNG), mit dem zeitliche Abfolgen von Triggern festlegen kann. Paolone hat das für Wettereffekte in seinem Tutorialprojekt Miscallenous1 im letzten Raum wunderbar gezeigt. Neben der Veränderung des Wetters zeigt er auch die Möglichkeiten von Texturenfolgen, um eine wachsende Bedeckungen mit Schnee zu simulieren.
Alles hat seine Grenzen. Die Veränderungen von Licht sind natürlich bis jetzt nur via Flipmaps möglich. Aber auch hier kann man jetzt mehr tricksen. Man kann relativ einfach einen Raum scheinbar mehrfach flippen. Dafür eignet sich der Flipeffekt Lara . (Move) Move Lara in LARA_START_POS with <&> OCB value in (E)way; (E) : Keep original sector displacement of Lara , mit dem Lara unmerklich in einen anderen Raum (der scheinbar derselbe ist) versetzt werden kann. Dazu plaziert man ein Lara-Starposition-Objekt im Zielraum auf demselben Sektor, wo Lara den Trigger im ursprünglichen Raum betritt, und gibt im Trigger denselben Wert ein, den man im OCB-Feld der Lara-Startpostion eingegeben hat.
Wenn man Statics ohne Flipmaps verändern will (z.B. um von normalen Tannen auf verschneite Tannen zu wechseln, muß man nur die Statics zuerst unsichtbar machen mit dem Flipeffekt Statics. Visibility. Set <&>static as invisible und die neuen Statics mit Statics Visibility. Render newly visibile <&>static erscheinen lassen. Mit einigem Geschick kann man also erstaunliche Wetterveränderungen und deren Folgen realisieren.