Angenommen wir haben 3 Schalter (normaler Switch den Lara hoch oder runterziehen kann).
Diese Schalter dürfen nur in einer bestimmten Reihenfolge gezogen werden, ansonsten bleibt eine Trapdoor geschlossen.
Erst wenn alle Schalter in der richtigen Reihenfolge gezogen wurden, geht diese Trapdoor auf.
Für dieses Tutorial nennen wir unsere 3 Schalter nun wie folgt:
- Ost Schalter
- Nord Schalter
- Süd Schalter
Wenn die Schalter in der Reihenfolge Ost, Nord, Süd gezogen werden, geht die Trapdoor auf.
Andernfalls nicht.
Also zum Beispiel:
Lara zieht folgende Reihenfolgen:
- Ost - Süd - Nord - Trapdoor bleibt zu
- Süd - Nord - Ost - Trapdoor bleibt zu
- Nord - Süd - Ost - Trapdoor bleibt zu
usw.
erst bei der Reihenfolge Ost - Nord - Süd - geht die Trapdoor auf.
Wichtig:
Wir müssen unter jedem Switch einen "Switch for Switch Type X)" setzen, damit Lara den Schalter auch normal wieder hochziehen kann.
Als Trigger darunter können wir einfach ein "Dummy" AnimatingX triggern welches nicht spielrelevant ist. Die Logik selbst erfolgt im Script, nicht im Editor.
Die Logik einmal kurz erklärt:
Jeder Schalter repräsentiert ein "Bit" einer zuvor definierten Variablen. In diesem Beispiel nutzen wir die Variable "Local Byte Delta4".
Es kann auch jede andere beliebige sein, ich empfehle aber eine Byte Variable - bitte einmal die Referenz zu Variablen durchgehen, falls dies nicht verstanden wird wieso.
Beim Ziehen eines Schalters wird ein spezielles Bit dieser Variablen gesetzt:
- Schalter Ost -> Bit 0
- Schalter Nord -> Bit 1
- Schalter Süd -> Bit 2
Erst wenn alle 3 Bits (Bits 0 - 2) gesetzt sind, geht die Trapdoor auf.
Um die Reihenfolge zu erhalten, müssen wir vorher prüfen, ob die anderen vorangegangen Bits gesetzt sind, ERST DANN kann der entsprechende Schalter sein Bit setzen.
Somit ergeben sich folgende Bedingungen:
Dh. Schalter Ost hat keine Bedingungen, da dies der erste Schalter ist.
Schalter Nord hat die Bedingung dass Schalter Ost (Bit 0) gezogen wurde.
Schalter Süd hat die Bedingung dass Schalter Ost (Bit 0) und Schalter Nord (Bit 1) gezogen wurde.
Als Beispiel:
Lara zieht als erstes Schalter Ost, (richtige Reihenfolge, da kein vorheriger Schalter nötig ist) , somit wird Bit 0 gesetzt.
Nun hat Lara 2 Optionen:
- Lara zieht dann Schalter Süd, (falsche Reihenfolge, da der Schalter nach Ost Nord und nicht Süd wäre), somit wird in der Bedingung von Schalter Süd geprüft ob Bit 0 und Bit 1 gesetzt sind. Da Lara nur Schalter Ost (Bit 0) gezogen hat fehlt hier die Bedingung das Bit 0 UND Bit 1 gezogen werden muss um das Bit 2 zu setzen (Bit 2 steht ja für Süd!) - somit wird alles "gelöscht".
- Lara zieht den Schalter Nord, (richtige Reihenfolge, da der Schalter nach Ost dann Nord ist.) Somit wird in der Bedingung von Schalter Nord geprüft ob Bit 0 gesetzt ist. Somit würde nun Bit 1 gesetzt werden (von Schalter Nord).
Die Abfolge / Logik sollte nun ab hier verstanden sein.
Wir benötigen für jeden Schalter eine Triggergruppe die prüft ob Lara sich am Schalter befindet UND
ob sie den Schalter herunterzieht (Anim 63), oder heraufzieht (Anim 64), UND ob die entsprechenden Bits gesetzt sind.
Für den ersten Schalter benötigen wir also folgendes:
(Achtung bei allen Triggern muss natürlich die richtige ID benutzt werden, ich habe hier nur beispielsweise ID's genommen, wie zb. 1069 für den Switch Type 1 -> siehe TriggerGroup 90)
Das müsst ihr natürlich entsprechend alles für euch anpassen, dass ihr eure ScriptID / ObjektID's nutzt!)
; Schalter Ost
; ConditionNg for ParameterNg
; <#>
; <&> Lara perform Anim 63
; Copy following values to your script:
; $8000,63,$001E
; ConditionNg for ParameterNg
; <#> (306) SWITCH_TYPE1, Room = Room 153 (digged above), X = 4, Z = 4, Ocb = 0, ScriptId = 1069
; <&> Lara. Distance. Lara is distant by <#>Moveable less or even than (E)Clicks (C54)
; <E> Value=2
; Copy following values to your script:
; $9000,1069,$0236
TriggerGroup= 90, $8000,63,$001E, $9000,1069,$0236
Display More
Triggergruppe 90 enthält die Bedingungen (Lara steht am Schalter Ost und fährt diesen runter) - wir benötigen hier keine Abfrage nach Bits, da Schalter Ost der erste ist.
; Trigger for FlipEffect
; <#> : Variables. Numeric. Set in <&>Variable the (E)bit
; <&> Local Byte Delta4
; <E> 0
; Copy following values to your script:
; $2000,234,$004B
; setze Bit 0
Triggergroup= 91, $2000,234,$004B
Triggergruppe 91 setzt das Bit 0.
Nun prüfen wir das "heraufziehen" des Switches (Und ob Lara sich am Schalter befindet) - und löschen das Bit 0 (UND Alle weiteren Bits, da dieser Schalter der erste ist - denn wenn dieser Schalter NICHT aktiviert ist, MUSS die Reihenfolge ja wieder von 0 starten!)
; ConditionNg for ParameterNg
; <#>
; <&> Lara perform Anim 64
; Copy following values to your script:
; $8000,64,$001E
; ConditionNg for ParameterNg
; <#> (306) SWITCH_TYPE1, Room = Room 153 (digged above), X = 4, Z = 4, Ocb = 0, ScriptId = 1069
; <&> Lara. Distance. Lara is distant by <#>Moveable less or even than (E)Clicks (C54)
; <E> Value=2
; Copy following values to your script:
; $9000,1069,$0236
; Trigger for FlipEffect
; <#> : Variables. Numeric. Clear in <&>Variable the (E)bit
; <&> Local Byte Delta4
; <E> 0
; Copy following values to your script:
; $2000,235,$004B
; Trigger for FlipEffect
; <#> : Variables. Numeric. Clear in <&>Variable the (E)bit
; <&> Local Byte Delta4
; <E> 1
; Copy following values to your script:
; $2000,235,$014B
; Trigger for FlipEffect
; <#> : Variables. Numeric. Clear in <&>Variable the (E)bit
; <&> Local Byte Delta4
; <E> Bit 2 ($00000004 ; 4)
; Copy following values to your script:
; $2000,235,$024B
; wenn Lara am Schalter Anim 64 ausführt lösche Bit 0 & Bit 1 & Bit 2
TriggerGroup= 92, $8000,64,$001E, $9000,1069,$0236, $2000,235,$004B, $2000,235,$014B,$2000,235,$024B
Display More
Nun brauchen wir für den Schalter Nord analog folgendes:
; Schalter Nord
; ConditionNg for ParameterNg
; <#>
; <&> Lara perform Anim 63
; Copy following values to your script:
; $8000,63,$001E
; ConditionNg for ParameterNg
; <#> Local Byte Delta4
; <&> : Variables. The <#>Numeric Variable has the (E)Bit set
; <E> 0
; Copy following values to your script:
; $8000,75,$002C
; wenn Bit 0 gezogen ist
; ConditionNg for ParameterNg
; <#> (306) SWITCH_TYPE1, Room = Room 153 (digged above), X = 5, Z = 5, Ocb = 0, ScriptId = 1070
; <&> Lara. Distance. Lara is distant by <#>Moveable less or even than (E)Clicks (C54)
; <E> 2
; Copy following values to your script:
; $9000,1070,$0236
TriggerGroup= 94, $8000,63,$001E, $8000,75,$002C, $9000,1070,$0236
Display More
Triggergruppe 94 enthält die Bedingungen (Lara steht am Schalter Ost und fährt diesen runter) UND zusätzlich ob auch Schalter Ost (Bit 0) gezogen wurde
; Trigger for FlipEffect
; <#> : Variables. Numeric. Set in <&>Variable the (E)bit
; <&> Local Byte Delta4
; <E> 1
; Copy following values to your script:
; $2000,234,$014B
; setze Bit 1
TriggerGroup= 95, $2000,234,$014B
Triggergruppe 95 setzt das Bit 1.
Nun prüfen wir das "heraufziehen" des Switches (Und ob Lara sich am Schalter befindet) - und löschen das Bit 1 (UND Alle weiteren Bits - in dem Fall nur noch das vom Schalter Süd (Bit 2).
Bit 1 wird gelöscht, weil dieses Bit ja zum Schalter Nord gehört. Bit 0 wird nicht gelöscht, weil die Reihenfolge bis dahin ja korrekt war. Bit 2 wird allerdings gelöscht, damit die Ausgangssituation entsteht (Schalter Ost wurde gezogen) - Schalter Nord und Süd sind dann noch offen.
; ConditionNg for ParameterNg
; <#>
; <&> Lara perform Anim 64
; Copy following values to your script:
; $8000,64,$001E
; ConditionNg for ParameterNg
; <#> (306) SWITCH_TYPE1, Room = Room 153 (digged above), X = 5, Z = 5, Ocb = 0, ScriptId = 1070
; <&> Lara. Distance. Lara is distant by <#>Moveable less or even than (E)Clicks (C54)
; <E> 2
; Copy following values to your script:
; $9000,1070,$0236
; Trigger for FlipEffect
; <#> : Variables. Numeric. Clear in <&>Variable the (E)bit
; <&> Local Byte Delta4
; <E> 1
; Copy following values to your script:
; $2000,235,$014B
; Trigger for FlipEffect
; <#> : Variables. Numeric. Clear in <&>Variable the (E)bit
; <&> Local Byte Delta4
; <E> Bit 2 ($00000004 ; 4)
; Copy following values to your script:
; $2000,235,$024B
; wenn Lara am Schalter Anim 64 ausführt lösche Bit 1 & Bit 2
Triggergroup= 96, $8000,64,$001E, $9000,1070,$0236, $2000,235,$014B, $2000,235,$024B
Display More
Und zum Schluss noch die Logik für Schalter Süd:
; Schalter Süd
; ConditionNg for ParameterNg
; <#>
; <&> Lara perform Anim 63
; Copy following values to your script:
; $8000,63,$001E
; ConditionNg for ParameterNg
; <#> Local Byte Delta4
; <&> : Variables. The <#>Numeric Variable has the (E)Bit set
; <E> 0
; Copy following values to your script:
; $8000,75,$002C
; ConditionNg for ParameterNg
; <#> Local Byte Delta4
; <&> : Variables. The <#>Numeric Variable has the (E)Bit set
; <E> Bit 1 ($00000002 ; 2)
; Copy following values to your script:
; $8000,75,$012C
; ConditionNg for ParameterNg
; <#> (306) SWITCH_TYPE1, Room = Room 153 (digged above), X = 3, Z = 5, Ocb = 0, ScriptId = 1071
; <&> Lara. Distance. Lara is distant by <#>Moveable less or even than (E)Clicks (C54)
; <E> 2
; Copy following values to your script:
; $9000,1071,$0236
TriggerGroup= 98, $8000,63,$001E, $8000,75,$002C, $8000,75,$012C, $9000,1071,$0236
Display More
Triggergruppe 98 enthält die Bedingungen (Lara steht am Schalter Ost und fährt diesen runter) UND zusätzlich ob auch Schalter Ost (Bit 0) und Schalter Nord (Bit 1) gezogen wurde
; Trigger for FlipEffect
; <#> : Variables. Numeric. Set in <&>Variable the (E)bit
; <&> Local Byte Delta4
; <E> 2
; Copy following values to your script:
; $2000,234,$024B
; setze Bit 2
TriggerGroup= 99, $2000,234,$024B
Triggergruppe 99 setzt das Bit 2.
Nun prüfen wir das "heraufziehen" des Switches (Und ob Lara sich am Schalter befindet) - und löschen das Bit 2 . Weitere müssen wir nicht löschen, da Bit 2 ja schon quasi das letzte in der Logik ist.
; ConditionNg for ParameterNg
; <#>
; <&> Lara perform Anim 64
; Copy following values to your script:
; $8000,64,$001E
; ConditionNg for ParameterNg
; <#> (306) SWITCH_TYPE1, Room = Room 153 (digged above), X = 3, Z = 5, Ocb = 0, ScriptId = 1071
; <&> Lara. Distance. Lara is distant by <#>Moveable less or even than (E)Clicks (C54)
; <E> 2
; Copy following values to your script:
; $9000,1071,$0236
; Trigger for FlipEffect
; <#> : Variables. Numeric. Clear in <&>Variable the (E)bit
; <&> Local Byte Delta4
; <E> 2
; Copy following values to your script:
; $2000,235,$024B
; wenn Lara am Schalter Anim 64 ausführt lösche Bit 2
Triggergroup= 100, $8000,64,$001E, $9000,1071,$0236, $2000,235,$024B
Display More
Um die Triggergruppen nun auszuführen benötigen wir pro Switch einen globalen Trigger.
Der erste prüft ob die Bedingungen für Schalter Ost gesetzt sind (Triggergruppe 90 prüft Laras Switch Anim und ob sie am Schalter steht) und falls ja wird Triggergruppe 91 getriggert (setze Bit 0). Ansonsten Triggergruppe 92 (Schalter wird hochgezogen, lösche Bits).
Analog dazu für Schalter Nord und Süd:
Globaltrigger= 35,IGNORE, GT_CONDITION_GROUP,IGNORE, 90,91,92
Globaltrigger= 36,IGNORE, GT_CONDITION_GROUP,IGNORE, 94,95,96
Globaltrigger= 37,IGNORE, GT_CONDITION_GROUP,IGNORE, 98,99,100
Zum Schluss wenn alle Schalter Logiken gebaut sind, brauchen wir noch die Prüfung ob das Rätsel gelöst wurde - oder eben nicht.
Wir prüfen dazu ob alle 3 Bits gesetzt worden sind und öffnen die Türe, oder schließen diese:
Die beiden Triggergruppen beinhalten die Conditions und zum Schluss den "Effekt" - Open oder Close Trapdoor.
; Prüfen ob alle 3 Bits gesetzt sind (0, 1 und 2)
; ConditionNg for ParameterNg
; <#> Local Byte Delta4
; <&> : Variables. The <#>Numeric Variable has the (E)Bit set
; <E> 0
; Copy following values to your script:
; $8000,75,$002C
; ConditionNg for ParameterNg
; <#> Local Byte Delta4
; <&> : Variables. The <#>Numeric Variable has the (E)Bit set
; <E> Bit 1 ($00000002 ; 2)
; Copy following values to your script:
; $8000,75,$012C
; ConditionNg for ParameterNg
; <#> Local Byte Delta4
; <&> : Variables. The <#>Numeric Variable has the (E)Bit set
; <E> Bit 2 ($00000004 ; 4)
; Copy following values to your script:
; $8000,75,$022C
; Trigger for ActionNg
; <#> (122) TRAPDOOR1, Room = Room53, X = 4, Z = 5, Ocb = 0, ScriptId = 1062
; <&> 26
; <E> Open the door
; Copy following values to your script:
; $5000,1062,$011A
Triggergroup= 112,$8000,75,$002C, $8000,75,$012C, $8000,75,$022C, $5000,1062,$011A
; Prüfen ob alle 3 Bits nicht gesetzt sind (cleared) (0, 1 und 2)
; ConditionNg for ParameterNg
; <#> 75
; <&> Variables. The <#>Numeric Variable has the (E)Bit clear (C45)
; <E> 0
; Copy following values to your script:
; $8000,75,$002D
; ConditionNg for ParameterNg
; <#> 75
; <&> Variables. The <#>Numeric Variable has the (E)Bit clear (C45)
; <E> Bit 1 ($00000002 ; 2)
; Copy following values to your script:
; $8000,75,$012D
; ConditionNg for ParameterNg
; <#> 75
; <&> Variables. The <#>Numeric Variable has the (E)Bit clear (C45)
; <E> Bit 2 ($00000004 ; 4)
; Copy following values to your script:
; $8000,75,$022D
; Trigger for ActionNg
; <#> (286) TRAPDOOR1, Room = Room53, X = 4, Z = 5, Ocb = 0, ScriptId = 1062
; <&> 26
; <E> Close the door
; Copy following values to your script:
; $5000,1062,$001A
Triggergroup= 113,$8000,75,$002D, $8000+TGROUP_OR,75,$012D, $8000+TGROUP_OR,75,$022D, $5000,1062,$001A
Display More
Die globalen Trigger schalten die Triggergruppen die gesamte Zeit "scharf".
Dh. im Spiel wird immer geprüft ob die Bedingungen in den Triggergruppen "erfüllt" sind. Erst dann werden die Effekt Trigger in den Triggergruppen ausgeführt.
; Öffne die Trapdoor
GlobalTrigger= 39, IGNORE, GT_ALWAYS, IGNORE, IGNORE, 112, IGNORE
; Schließe die Trapdoor
GlobalTrigger= 38, IGNORE, GT_ALWAYS, IGNORE, IGNORE, 113, IGNORE
Viel Spaß beim ausprobieren! ![]()