In diesem Beispiel muss man 5 Goldmünzen (5x Puzzle Item 12) benutzen um einen Gegenstand (Quest Item 2) zu erhalten.
Der Ablauf ist folgendermaÃen:
Lara findet im Spiel einen Händler / NPC (No Player Character).
Lara drückt vor dem NPC (Animating3_mip) die Aktionstaste, wird dann richtig davor positioniert.
Wenn Lara weniger als 5 Münzen (5x Puzzle Item 12) im Inventar hat, wird für 5 Sekunden folgende Meldung ausgegeben:
"Merchant: You want some carrots? For only 5 Gold!"
Sobald Lara 5x Puzzle Item 12 im Inventar hat,
wieder zum Händler geht und die Aktionstaste (STRG) drückt, wird folgende Meldung ausgegeben:
"Do you want to pay 5 gold? YES (Action) / NO (ESC)"
Nun kann Lara sich entscheiden.
- Wenn sie ESC drückt, wird der Dialog geschlossen und erst wieder angezeigt wenn sie erneut vor dem Händler die Aktionstaste (STRG) drückt.
- Wenn sie STRG drückt, wird der Dialog geschlossen, 5x Puzzle Item aus dem Inventar entfernt, 1x Quest Item 2 hinzugefügt und eine Meldung erscheint:
"Merchant: Thank you! Here are some carrots."
Anmerkungen:
Das NPC Object ist ursprünglich von Sponge: http://laraslevelbase.org/stuff/stuff_dl.asp?id=2536
Ich habe den NPC in der Animation0 um 180 Grad gedreht, damit Lara sich via TestPosition richtig positionieren kann. Leider habe ich keine Möglichkeit gefunden
mit dem Original Objekt eine richtige Positionierung von Lara durchzuführen. Das veränderte Objekt habe ich hier angehängt (merchant.zip) . (Credits an Sponge!)
Wie ist das Scripting aufgebaut?
Das Scripting ist für fortgeschrittene Levelbauer gedacht, die sich schon ein wenig mit der TRNG auskennen, ansonsten könnte dies sehr verwirrend werden.
Im Grunde genommen gibt es eine neue Animation (am besten eine vorhandene in einen neuen Slot kopieren), die ausgeführt wird, wenn Lara sich an einer exakten Position befindet, dann wird geprüft ob diese Animation ausgeführt wird.
Wenn die Animation ausgeführt wird, wird geprüft ob Lara 5x Puzzle Item 12 hat, falls ja wird dann das Dialog Fenster angezeigt.
Dort wird geprüft ob STRG oder ESC gedrückt wird und dementsprechend reagiert.
Hört sich erst mal einfach an, es gibt allerdings eine Menge zu berücksichtigen, die man vorher so gar nicht auf dem Schirm hat.
Nun aber mal der Reihe nach. Hier ist das Script, und detaillierte Erklärungen dazu:
Vorbereitungen
Animation:
Die Animation die ich benutzt habe, ist die Animation 444 (BEETLE_PUT), da diese ein wenig so aussieht als würde Lara im Geldbeutel kramen und das Geld dann auf den Boden legen.
Man kann natürlich auch eine andere benutzen. In diesem Beispiel ist diese aber hier hochgeladen.
Am besten ist es wenn man im Wad Tool das Lara Objekte lädt und erstmal eine neue Anim erstellt. (mit dem Plus Zeichen).
Je nachdem welche Zahl eure Animation hat (bei mir ist es die 486!) müsst ihr das später im Script selbst anpassen!
Diese Animation wird zunächst als "Platzhalter" benötigt. Damit ist gemeint:
Sobald die TestPosition "wahr" wird, wird die Animation 486 vom Lara Objekt ausgeführt. AnschlieÃend wird sofort Animation 11 von Lara erzwungen (Still stehen), damit Lara die "Kaufen" Animation 486 nicht VORHER in Gänze ausführt).
Dies ist notwendig, da wir irgendetwas abfragen müssen worauf wir reagieren können, wenn Lara mit dem Händler spricht. Die ganze Animation wird aber nochmals in voller Länge getriggert und abgespielt wenn Lara das Item dann auch kauft.
Theoretisch klappt das mit jeder Animation, aber da dann auch die Bedingung wahr wird, wenn Lara diese Animation abspielt, sollte die Animation eben auf einen neuen Slot kopiert werden.
Beispiel: Wenn ihr zb. die "echte" 444 Animation benutzt und dies im Script angibt, dann wird auch alles ausgeführt, wenn Lara den kleinen Beetle benutzt und aufzieht (in TR4 wurden damit Stachelfallen entschärft). Daher am besten in den neuen Slot kopieren, und diese Animation nutzen!
TE
Das Animating3_mip wird im Level platziert und getriggert (oder Code Bits 1-5 werden aktiviert).
Das Puzzle Item 12 wird 5 x platziert, damit Lara den Kauf tätigen kann. Das wars. Ja, mehr nicht.
Texte / Dialoge
Für die Texte werden 2 unterschiedliche Formatierungen benutzt, einmal mit einem 5 Sekunden Timer (die zweite Zeile) und einmal OHNE Timer, dh. der Text wird solange angezeigt
bis das Script diesen wieder entfernt (via Flipeffekt).
; ################ Textfarben ################
Parameters= PARAM_PRINT_TEXT, 1, CL_WHITE,FT_CENTER_CENTER,IGNORE,IGNORE,IGNORE,IGNORE
Parameters= PARAM_PRINT_TEXT, 5, CL_WHITE,FT_CENTER_CENTER,IGNORE,5,IGNORE,IGNORE
In der English.txt werden unter ExtraNG neue Texte eingepflegt:
In diesem Beispiel sind es bei mir Texte mit der ID 0, 11 und 12.
Falls ihr die Texte an anderen ID's benutzt müsst ihr die entsprechenden Script Einträge etwas abändern.
ID 0:
Do you want to pay 5 gold? YES (Action) / NO (ESC)
ID 11:
Merchant: You want some carrots? For only 5 Gold!
ID 12:
Merchant: Thank you! Here are some carrots.
Bei mir sieht das so aus:
Ok. bis hierhin sagt ihr vermutlich - hey, ist doch alles easy peasy... Ja ist es auch.
Nun geht es ans eingemachte. Die Händler Interaktion.
Scripting für die Interaktion
Damit Lara sich positionieren wird brauchen wir einen TestPosition Eintrag, einen Animations Eintrag und eine MultEnvCondition die dazu nötig ist um 2 Dinge abzufragen:
Ist die TestPosition true und hat Lara noch kein Quest Item 2 (soll sie ja kaufen!)
Auf die TestPositions und Animations Einträge gehe ich jetzt nicht ein, hier gibt es ein Tutorial von Paolone:
Animations with TRNG
; ################ Haendler ################
; Test Position für den Händler
TestPosition= 20,IGNORE, ANIMATING3_MIP, 0-512, 0+512, 0-512, 0+512, -512-512,-512+512,-12000,12000, 0, 0, 0, 0
; Multiple Condition: TestPosition 20 und TriggerGroup 80
MultEnvCondition= 11,ENV_ITEM_TEST_POSITION,20,IGNORE,ENV_CONDITION_TRIGGER_GROUP,80,IGNORE
; Animation 486 wird abgespielt, wenn Multiple Condition 11 wahr ist
Animation= 486,KEY1_ACTION,IGNORE,FAN_ALIGN_TO_ENV_POS,ENV_MULT_CONDITION,11,IGNORE,2
; Condition TriggerGroup: Positioning wird nur durchgeführt, wenn Quest Item 2 nicht im Inventar ist
TriggerGroup= 80,$8000,253,$0001
Weiter gehts mit einem GlobalTrigger der abfragt ob die Animation 486 abgespielt wird:
(Falls ja, wird hier nun ein GlobalTrigger 16 aktiviert, falls nein, wird dieser wieder direkt deaktiviert).
GlobalTrigger 16 ist derjenige der überprüft ob Lara genug Goldmünzen besitzt!
; Wenn Anim 486 abgespielt wird, triggere TriggerGroup 82, wenn nicht, triggere TriggerGroup 83
GlobalTrigger= 15,IGNORE,GT_CONDITION_GROUP,IGNORE,81,82,83;
; Condition TriggerGroup: Laras Animation ist 486
TriggerGroup= 81,$8000,486,$001E
; Aktiviere GlobalTrigger 16, Spiele Anim 11 von Lara ab (Die Anim 486 wird nun unterbrochen, diese soll erst komplett abgespielt werden, wenn Lara den Kauf tätigt.)
TriggerGroup= 82,$2000,109,$1001, $2000,77,$000B
; Deaktivere GlobalTrigger 16
TriggerGroup= 83,$2000,109,$1000
Es geht weiter, nun wurde Anim 486 abgespielt, die Interaktion beginnt. Es wird abgefragt ob Lara die benötigten Goldmünzen hat oder nicht und es wird entsprechend darauf reagiert:
; GlobalTrigger 16 ist standardmäÃig NICHT aktiviert, erst wenn Anim 486 abgespielt wird:
; Wenn Anim 486 abgespielt wird und TriggerGroup 82 diesen GlobalTrigger 16 aktiviert gilt:
; Wenn im Inventar mindestens 5xPuzzle Item 12 vorhanden ist, wird TriggerGroup 85 getriggert, ansonsten TriggerGroup 86
GlobalTrigger= 16,FGT_DISABLED,GT_CONDITION_GROUP,IGNORE,84,85,86
; Wenn im Inventar mindestens 5xPuzzle Item 12 vorhanden ist
TriggerGroup= 84,$8000,186,$0503
; Ab hier erscheint das Bestätigungsfenster
; Diese TriggerGroup 85 wird aufgerufen, wenn Lara mit dem Händler interagiert, UND das / die benötigte Item(s) besitzt (Lara hat die nötigen Vorraussetzungen, die in der TriggerGroup 84 geprüft werden!)
; Zeige ExtraNG String 0 (Bestätigungsfenster) mit ParamPrintText 1, deaktiviere wieder GlobalTrigger 16, aktiviere Organizer 9, Deaktiviere Keyboard Commands
TriggerGroup= 85,$2000,203,$0100, $2000,109,$1000, $2000,127,$0009, >
$2000,51,$0006, $2000,51,$0002, $2000,51,$000A, $2000,51,$0005, $2000,51,$0008, $2000,51,$0003, $2000,51,$000C, $2000,51,$0004, >
$2000,51,$000D, $2000,51,$0014, $2000,51,$000F, $2000,51,$0010, $2000,51,$0001, $2000,51,$000B, $2000,51,$0007, $2000,51,$000E >
; Diese TriggerGroup wird aufgerufen, wenn Lara mit dem Händler interagiert, aber NICHT das / die benötigte Item(s) besitzt
; Blende jeden Text aus, Zeige ExtraNG String 11 mit ParamPrintText 5, aktiviere Organizer 8
TriggerGroup= 86,$2000,67,$0000, $2000,203,$050B, $2000,127,$0008
Alles anzeigen
Hier sind nun die Organizer, die aufgerufen werden, je nachdem ob Lara den Kauf durchführen KANN oder nicht:
; Organizer 8 wird aufgerufen, wenn Lara den Kauf NICHT tätigen kann. (Weniger als 5x Puzzle Item 12 im Inventar.. wird in GlobalTrigger 16 abgefragt!)
; Triggere nach 10 Mili Sekunden TriggerGroup 87
Organizer= 8,FO_TICK_TIME,IGNORE,10,87
; Aktiviere wieder alle Commands
TriggerGroup= 87,$2000,52,$0000
; Organizer 9 wird aufgerufen, wenn Lara den Kauf tätigen kann. (Gleich oder mehr als 5x Puzzle Item 12 im Inventar.. wird in GlobalTrigger 16 abgefragt!)
; Triggere nach 2 Sekunden TriggerGroup 87
Organizer= 9,FO_TICK_TIME,IGNORE,10,88
; Akivere GlobalTrigger 17 und 18, über diese GlobalTrigger wird dann ausgewertet ob YES oder NO gedrückt wird.
TriggerGroup= 88,$2000,109,$1101, $2000,109,$1201
Alles anzeigen
Wenn nun Organizer 9 aufgerufen wurde, werden dann diese beiden GlobalTrigger "scharf geschaltet" bzw. aktiviert. Diese überprüfen nun die Eingaben des Dialogs.
Entweder Lara möchte den Kauf durchführen, oder eben nicht:
; Global Trigger ist standardmäÃig deaktiviert und wird erst aktiviert wenn die nötigen Voraussetzungen getroffen sind (Triggergruppe 88)
; Wenn YES (Action) gedrückt wird (TriggerGroup 89 fragt das ab), wird TriggerGroup 90 ausgeführt
GlobalTrigger= 17,FGT_DISABLED,GT_CONDITION_GROUP,IGNORE,89,90,IGNORE
; Es wird YES (Action) gedrückt
TriggerGroup= 89,$8000,8,$010D
; Aktiviere Organizer 10, deaktivere GlobalTrigger 17 und GlobalTrigger 18, Blende jeden Text aus, Aktiviere wieder alle Keyboard Commands
TriggerGroup= 90,$2000,127,$000A, $2000,109,$1100, $2000,109,$1200, $2000,67,$0000, $2000,52,$0000
; Global Trigger ist standardmäÃig deaktiviert und wird erst aktiviert wenn die nötigen Voraussetzungen getroffen sind:
; Wenn NO (ESC) gedrückt wird, wird TriggerGroup 91 ausgeführt
GlobalTrigger= 18,FGT_DISABLED,GT_KEYBOARD_CODE,1,-1,91,IGNORE
; Wird ausgeführt wenn beim Bestätigungsfenster "NO" (ESC) gewählt wird
TriggerGroup= 91,$2000,109,$1100, $2000,109,$1200, > ;Deaktiviere GlobalTrigger 17 und GlobalTrigger 18
$2000,67,$0000, $2000,127,$0008; Blende jeden Text aus, Aktiviere Organizer 8
; Wenn beim Confirm Fenster "YES" (ACTION) gedrückt wurde, wird dieser Organizer abgespielt:
; Nach 0 Mili Sekunden, triggere TriggerGroup 92,
; Nach 85 Mili Sekunden, triggere TriggerGroup 93,
Organizer= 10,FO_TICK_TIME,IGNORE,0,92,85,93
Alles anzeigen
Wenn Lara den Kauf NICHT durchgeführt hat (ESC wurde gedrückt), wird wieder Organizer 8 abgespielt (ist weiter oben beschrieben), dh, der Ablauf wurde unterbrochen.
Wenn Lara den Kauf durchgeführt hat, kann nun die vollständige Animation 486 ausgeführt werden, die Goldstücke entfernt und das Quest Item 2 hinzugefügt werden.
Die globalen Trigger die prüfen ob ein Kauf durchgeführt werden kann, werden nun wieder deaktiviert, da Lara nur EINMAL kaufen kann.
; Deaktiviere GlobalTrigger 15 und GlobalTrigger 16, Spiele Animation 486 von Lara ab, deaktiviere Commands
TriggerGroup= 92,$2000,109,$0F00, $2000,109,$1000, $2000,80,$00E6, >
$2000,51,$000B, $2000,51,$0014, $2000,51,$000D, $2000,51,$0004, $2000,51,$0003, $2000,51,$000A
; Füge Quest Item 2 hinzu, Zeige ExtraNG String 12 mit ParamPrintText 5, Spiele Audio 142 auf Channel 2,
TriggerGroup= 93,$2000,48,$014D, $2000,203,$050C, $2000,129,$008E, >
$2000,49,$000B, $2000,49,$000B, $2000,49,$000B, $2000,49,$000B, $2000,49,$000B, > ; Entferne 5x Puzzle Item 12 aus dem Inventar,
$2000,52,$0000 ; Aktiviere wieder alle Commands
Und das wars. Ich hoffe es hat euch gefallen. Viel Erfolg beim ausprobieren.
Sollte etwas nicht funktionieren so gibt es hier noch ein paar Debug Befehle:
Wenn Lara nicht richtig positioniert wird, kann dies ins Script geschrieben werden:
Die 940 ist der Index von dem NPC Object (Animating3_mip).
Nun werden im Spiel Werte angezeigt die man für den TestPosition Command nutzen kann.
Diagnostic= ENABLED
DiagnosticType= DGX_LARA + DGX_ANIMATION, IGNORE
LogItem= FLI_SHOW_DIFFERENCES, 940
Wenn man prüfen will welche Animation abgespielt wird, kann man das hiermit überprüfen:
Diagnostic= ENABLED
DiagnosticType= DGX_LARA + DGX_ANIMATION, IGNORE ; Shows only information about Lara
Und immer daran denken:
Auch ich habe stundenlang damit verbracht zu debuggen, warum nun diese TriggerGroup nicht abgespielt wird, oder warum dieser GlobalTrigger nicht "aktiv" wird.
Es gehört leider dazu, hier viel Zeit mitzubringen und zu prüfen weshalb irgendwas nicht genauso funktioniert wie es da so steht.
Meistens ist es ein Tipp Fehler, dass z.B. eine falsche Zahl für eine TriggerGroup gesetzt wurde... usw.
Ihr schafft das schon.