ConditionNG bei Obelisk Rätsel

  • Ich habe das Obelisk Rätsel eingebaut bei dem man 3 Turn Switches mit den Obelisken drehen muss. Danach wird ein "invisible" Pulley getriggert (hardcoded in der Engine)

    damit Lara dieses ziehen kann.


    Was ich möchte, ist ein Trigger beim Drehen des Drehschalters / Obelisken in die richtige Position (Süd, Nord, Ost). Wie kann ich das mit der TRNG und ConditionNG Triggern herausfinden?

    Wie kann ich eine Bedingung schreiben, um zu überprüfen, ob der Spieler einen Obelisken in die richtige Position dreht?


    Schön wäre auch zu prüfen, ob das Pulley jetzt "aktiv" ist (wenn alle 3 Obelisken in der richtigen Position sind), vermute ich mal, dass die Engine dafür das "invisible" aus dem OCB des Pulleys entfernt.

    Allerdings finde ich dafür auch keine Bedingung im ConditionNG Menü.

    Kann man nicht überprüfen ob ein Moveable "visible" oder "invisble" ist?

  • Na du hast doch schon drüben bei trf angefragt. Was mich wundert ist, dass AkyV dir nicht seine Tutorials über die Memory Zones genannt hat. Er hat ja herausgefunden, wie man wohl den Turn Switch in der Item Memory Zone beeinflussen kann.

    Item Memory Zone Einführung:

    https://www.skribblerz.com/NGL…l/nglemanual/ngle38c.html

    1.43. Turn switch subject:


    https://www.skribblerz.com/NGL…l/nglemanual/ngle38g.html

  • so wie ich das verstehe bringen mir diese hidden trigger für die obeliske nicht so viel, da hier ja nur auf den "zweiten" Part eingegangen wird (nämlich wenn der Hammer den Käfig zertrümmert) - ich benötige aber eine Condition für "NACH DEM DREHEN DES OBELISKEN auf die richtige Position" bzw. "NACH DEM DREHEN ALLER OBELISKE auf die richtige Position / NACH AKITVIERUNG des Pulley, da mein Rätsel abgeschlossen ist, wenn der Pulley gezogen werden kann.


    Auf der Seite ist aber nur folgendes aufgeführt:


    Damit können ja nur Sachen abgefragt werden die im ZWEITEN Teil des Rätsel passieren, nicht aber nach dem Drehen der Obeliske auf deren entsprechende "richtige" Position, oder seh ich das falsch?


    Auf gut deutsch:

    Ich möchte gerne etwas triggern, wenn Lara ein Obelisk auf die richtige Position gedreht hat. (oder was auch OK ist: wenn Lara ALLE Obelisken auf die richtige Position gedreht hat und der Pulley aktiviert wird).

  • Ich sprach ja auch nicht von dem Obelisken sondern von dem Turn Switch.


    Da nennt AkyV, dass man die Werte in Variablen setzen kann, wenn man den Turn Switch entweder im Uhrzeigersinn oder gegen den Uhrzeigersinn gedreht hat. Ich müsste mir da selber überlegen wie ich das mache. Wahrscheinlich aber eine Variable , deren Wert bei jedem Drehen um 1 erhöht wird und dann eben etwas auslöst ,wenn die Variable z.B. den Wert 3 hat (der turn switch 3 mal in eine bestimmte Richtung gedreht wurde).

  • ja du hast recht, mein Fehler, ich hatte das nur mit dem Obelisken gesehen.

    Du hattest 1.43. Turn switch subject: geschrieben, hab ich nicht drauf geachtet ^^ .

    Nun, damit könnte man wohl was machen! Dann muss ich nur mal schauen, wie ich diese zusätzlichen Trigger einbauen kann.

    Ich finde zwar Tutorials was man alles machen kann, aber ich muss diese ja erst einmal in die TE integrieren, damit ich diese "exportieren" kann.

  • Mulf hat dir übrigens auf trf ein Link über ein Tutorial gegeben von Shakira Croft über den Turn Switch. Der hat das wohl mit Variablen usw. gelöst.


    Aber das gesamte Script ist der Wahnsinn, der hat wohl auch berücksichtigt, wenn der Spieler während dem Drehen speichert und wieder lädt, dass die Werte in der Variabel trotzdem bleiben.

    https://www.tombraiderforums.com/showthread.php?t=215095


    Anscheind wäre der PluginTrigger von AkyV da leichter zu benutzen, schreibt er:

    C215: Object generally. Moveable (including Lara) or Statics object has <#> orientation

  • ja... das hatte ich gesehen. Es ist sehr schade dass die TRNG generell zwar über dem TE möglich ist, aber keine Plugins bzw. Erweiterungen möglich sind.

    Da Paolone nicht mehr da ist, wäre dies eine gute Möglichkeit gewesen.

    Aber nun, sei es drum, ich werd dann entweder mich mit dem NGLE rumplagen und exportieren, oder aber die "aktuell möglichen Lösungen" des TE nutzen. Mal sehen. Danke dir!

  • Ich hab es einbauen können, aber es gibt ein kleines Problem.

    Shakira Croft schrieb in seinem Tutorial:

    „Wenn wir möchten, dass sich der Turn Switch nach dem Neuladen des Spiels in derselben Position befindet, müssen wir seine Position nach jedem Laden neu definieren.“


    Ich hatte das so gebaut wie er es beschrieben hat, aber nach dem Laden und Nachladen ist der Turnswitch an der ursprünglichen Position.


    Dies ist mein Skript (nur der relevante Teil zum Speichern und Wiederherstellen der Turnswitch Ausrichtung), vielleicht kann jemand verstehen, was hier das Problem sein könnte. Vielleicht habe ich hier etwas vergessen.


    Selbst wenn ich einen "Test"-Trigger (wie "Kill Lara in E way") zu TG 166 hinzufüge, funktioniert es nicht. Es scheint, dass der Global Trigger einen Fehler hat.

    Dies ist mein drittes Level nach der Title, daher denke ich, dass die "3" im GlobalTrigger nach GT_AFTER_RELOADING_VARIABLES hier richtig ist.

    Die Beschreibung sagt:


    GT_AFTER_RELOADING_VARIABLES

    Used in GlobalTrigger= command.

    This condition will be true when player has just loaded a savegame, or when lara enters in a new level using a finish trigger with no ResetHub command.

    If you had saved some critical memory in variables with GT_BEFORE_SAVING_VARIABLES global trigger, you can now restore them, when the variables has been just reloaded, to create newly the same situation previously of saving game.

    In Parameter field you type the level number after the reloading of game, about when perform this global trigger. So, if lara from level 1, touchs a finish trigger and she goes to level 2, you'll have to type the number "2" to reload from begin of this level.



    Also habe ich auch "1" getestet, weil ich mein drittes Level direkt aus dem Titelbildschirm auswähle, ich dachte, es könnte "1" sein, aber es funktioniert nicht.

    Der Turnswitch springt nach dem Laden meines Savegames in seine ursprüngliche Position zurück.


    Jemand eine Idee?

  • Ich kenne mich zwar mit dem Bauen nicht aus...

    Aber wäre das auch möglich das der Spieler in diesem Bereich einfach nicht abspeichern "Save" kann?

    Lara könnte ja zuvor schon eine Notiz finden...No Save! oder sowas eben


    ich kann mich erinnern das ich sowas schon in anderen Levels gesehen habe

  • Also ich habe dein Script ausprobiert, bei mir funktioniert es einwandfrei.


    Hast du noch andere Variablen definiert. Laut Paolone sollte man ja bei einer Short1 Variable keine Byte 1 und Byte 2 Variabel mehr mit dem selben Namen

    vergeben haben (siehe bild), weil das zu Komplikationen führen kann. (siehe Bild)


    https://streamable.com/lgo4rt


  • ich hab das kontrolliert, ich habe keine "Byte" (und auch keine "Long" Variablen im Level gesetzt, also daran kann es nicht liegen :-(.


    Ich gehe eher davon aus, dass dieses

    GT_AFTER_RELOADING_VARIABLES das Problem ist, denn wenn ich in der Triggergruppe ein "Kill Lara" mache, stirbt sie nach dem Speichern und Laden NICHT.

    Mache ich statt des

    GT_AFTER_RELOADING_VARIABLES ein

    GT_ALWAYS - stirbt Lara direkt nach dem Start. Dh. Ich gehe davon aus, dass die TriggerGruppe nicht getriggert wird (über den GT_ Effekt).


    Was mache ich denn falsch mit diesem Eintrag?


    GlobalTrigger=         11, IGNORE, GT_AFTER_RELOADING_VARIABLES, 3, IGNORE, 166, IGNORE


    Das Level ist das "dritte" im Script (nach der Title) .

    Ich wähle das Level direkt über dem Title Bildschirm aus, auch eine 1 statt der 3 geht nicht.


    Muss ich noch etwas anderes beachten?

  • Mir ist nicht so ganz klar, wie du diesen GT_... Flag mit einem "Kill Lara Trigger" testen willst?


    Soweit ich das verstanden habe, ist der Flag "GT_AFTER_RELOADING_VARIABLES" dazu da, den Wert einer Variable beizubehalten, auch wenn der Spieler gespeichert und wieder geladen hat.


    Der "GlobalTrigger=11" nimmt nach dem Laden wieder den Wert, der zuletzt in der Variabel "Global Short Delta1" gespeichert war und die TriggerGroup 166 setzt diesen Wert bei dem momentan ausgewählten Objekt (Item Index) in "Facing Horizontal (Short)", welches für die horizontale Position zuständig ist.


    Und da der "GlobalTrigger=10" ständig das Objekt mit der ID 658 als aktuell ausgewähltes Objekt nimmt, wird der Wert für "Facing Horizontal (Short)" auch wieder diesem Turn Switch mit der ID 658 zugewiesen.


    Soweit ich das sehe, ist in dem Tutorial nur von einem Turn Switch die Rede, du hast ja 3 oder? Wie hast du das denn gelöst? Vielleicht gibts da irgendwelche Komplikationen. Du müsstest ja quasi 3 verschiedene Variabeln definieren, für jeden Turn Switch eine Global Short.....

  • Der GT mit dem GT_AFTER_RELOADING_VARIABLES Flag sagt aus, dass die Bedingung erfüllt ist, wenn der Spieler ein neues Level betritt (durch einen Finish Trigger) ODER durchs Laden eines Savegames. Also im Gegensatz zu GT_ALWAYS wo die Bedingung IMMER erfüllt ist.


    Bei Parameters kann ich den Level angeben, für welches der GT relevant ist. Und als "PerformTriggerGroup" dann die TG die dann nachdem die obige Condition erfüllt ist, ausgeführt werden soll - in dem Fall bei mir die TG 166.

    Das mit den Variablen ist ersteinmal irrelevant, (so hab ich es zumindest aus der Reference verstanden) da dieses GT_ nur eine spezielle Condition ist.

    Und genau da hakt es bei mir, die Bedingung scheint nicht erfüllt zu sein, daher wird die TG 166 nicht ausgeführt, aber dazu später mehr.

    In der TG 166 kann ich ja "beliebige" exportierte Trigger einbauen, ich habe "testweise" Kill Lara in E Way eingebaut nur um zu sehen ob die Bedingung erfüllt ist oder nicht.


    Ich habe übrigens testweise in meinem ERSTEN level Eintrag folgendes eingebaut:


    Code
    ; Trigger for FlipEffect
    ; <#> Lara. (Health) Kill Lara in <&>way (F63)
    ; <&> Default death (vitality=0)
    ; Copy following values to your script:
    ; $2000,63,$0000
    TriggerGroup= 166, $2000,63,$0000
    GlobalTrigger= 11, IGNORE, GT_AFTER_RELOADING_VARIABLES, 1, IGNORE, 166, IGNORE

    Was soll ich sagen, es klappt. Sobald Lara das erste Level startet, speichert und neu lädt, stirbt sie.


    Wenn ich dasselbe in meinem dritten Level einbaue (und die 1 bei Parameters auf die 3 ändere), stirbt sie nicht - dh. die Condition scheint nicht erfüllt zu sein. Und ich vermute stark, dass es damit zusammen hängt, weil ich das dritte Level direkt auswähle.

    Evtl. ist das ein Bug - vielleicht kann ja jemand mal diese Einträge in einem Level einbauen welches NICHT das erste ist, sondern zb. wie bei mir, das dritte im Script Eintrag und schauen ob es an mir und iwelchen anderen Sachen liegt, oder aber tatsächlich daran liegt, dass ich das dritte Level direkt starte.


    Bzgl. mehrere Turn Switches - ja hab ich, genau - 3 Stück. Alles in seperaten Variablen.


    EDIT:

    Du hattest Recht mit deiner Vermutung. Kommentiere ich alle Script Einträge für die restlichen beiden Turn Switches aus, geht es.

    Mist. Dann muss ich nochmal schauen.

    Danke dir!

  • Bin gespannt auf deine Lösung, denn dieser GT_ALWAYS setzt ja immer nur einen Turn Switch als "Selected Item" für den Index. Wenn man dann mit dem nächsten GT_ALWAYS Trigger den nächsten Turn Switch als "Selected Item" nimmt, wird der andere wahrscheinlich nicht mehr berücksichtigt.


    Aber ich müsste da selber rumprobieren, oder sehen ob es da Tutorials dazu gibt.

  • So, dass Problem ist tatsächlich folgendes:


    Ich habe 3 Turn Switches, und ich speichere für jeden einzelnen Turn Switch den Index des Turn Switch als "Selected Item" ab.


    Beispielsweise:


    Code
    ; Exporting: TRIGGER(54:0) for ACTION(2703)
    ; <#> : TURN_SWITCH ID 2703 in sector (9,6) of Room132
    ; <&> : Variables. Set the index of <#>moveable as Selected Item
    ; (E) :
    ; Values to add in script command: $5000, 2703, $36


    Anschließend packe ich diesen Index in eine Variable.

    Zum Beispiel so:


    Code
    ; Exporting: TRIGGER(7444:0) for FLIPEFFECT(256)
    ; <#> : Variables. Memory. Copy to <&> Numeric Variable the (E)Selected Item Memory
    ; <&> : Global Short Delta1
    ; (E) : Facing Horizontal (Short)
    ; Values to add in script command: $2000, 256, $1D14


    In der TG sähe das dann so aus:


    Code
    TriggerGroup= 		165, $5000, 2703, $36, $2000, 256, $1D14


    Das ausführen der TG erfolgt über einen GT:


    Code
    GlobalTrigger= 		10, IGNORE, GT_ALWAYS, IGNORE, IGNORE, 165, IGNORE


    Dieses mache ich analog für ALLE 3 Turn Switches.


    Leider verhält sich die TRNG nun so, dass diese NUR den Index des im Script als letzten eingetragenen Turn Switch in den "Selected Item Memory" schreibt,

    folglich werden die ersten beiden Werte für den Turn Switch "überschrieben", obwohl ich diese in einzelne seperate Variablen schreiben möchte.


    Was ich damit meine:

    die TRNG überschreibt den Index erst, bevor es in einer Variablen gespeichert wird:

    So hätte ich es gerne:


    Speichere Index 1 in Selected Item Memory, speichere dies in Variable A.

    Speichere Index 2 in Selected Item Memory, speichere dies in Variable B.

    Speichere Index 3 in Selected Item Memory, speichere dies in Variable C.


    so arbeitet die TRNG die Befehle ab:


    Speichere Index 1 in Selected Item Memory

    Speichere Index 2 in Selected Item Memory

    Speichere Index 3 in Selected Item Memory

    Speichere in Variable A den Selected Memory (Index 3)

    Speichere in Variable B den Selected Memory (Index 3)

    Speichere in Variable C den Selected Memory (Index 3)


    Dh. in allen 3 Variablen ist der Index 3 gespeichert, demnach speichert die TRNG nach dem Laden eines Savegames nur den Index des Items, welches ich als "letztes" im Script in das Selected Item Memory abspeichere.


    Hat jemand eine Idee wie ich dieses Problem lösen kann?


    EDIT

    Gerade den Eintrag von Jörg gesehen. Ja, vermutlich ist dieses GT_ALWAYS das Problem, damit werden die Einträge "gleichzeitig" (Frame für Frame) in das Selected Item Memory geschrieben, bzw. demnach "überschrieben".

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!