Interaktion mit NPC / Händler Kauf

  • Hier wird beschrieben, wie man mit der TRNG eine Interaktion mit einem Händler machen kann.

    Lara soll einen Gegenstand mit Münzen erwerben. Sobald sie die Münzen hat, öffnet sich ein Dialog wo man den Kauf bestätigen, oder ablehnen kann.

    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).

    Code
    ; ################ 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.


    Code
    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:


    Code
    ; ################ 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!

    Code
    ; 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:



    Hier sind nun die Organizer, die aufgerufen werden, je nachdem ob Lara den Kauf durchführen KANN oder nicht:



    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:



    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.


    Code
    ; 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.

    Code
    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:


    Code
    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. ;)

Share