TriggerGroup= - Teil 3
+TGROUP_FLAGS
Wie im zweiten Teil schon angekündigt geht es beim dritten Teil über die "+TGROUP_FLAGS".
Mit den "+TGROUP_FLAGS" kann man Triggern noch weitere Operatoren geben und in Relationen zu anderen Triggern innerhalb der TriggerGroup bringen, um z.B. komplexe Rätsel erstellen zu können.
Man unterscheidet folgende Flags:
1 ONE SHOT FLAGS
Hat man einen Flipeffect for TriggerGroup auf mehreren Squares gesetzt, wird die TriggerGroup jedesmal ausgelöst, wenn wir eines dieser Squares betreten. Setzen wir ONE SHOT, wird die TriggerGroup zumindest einmal auf jedem dieser Squares ausgelöst. Hat man z.b. einen Trigger für eine TriggerGroup auf 10 Squares gesetzt, und möchte dass die TriggerGroup nur einmal ausgelöst wird, sobald man eines dieser 10 Squares betritt und bei den anderen 9 danach nicht mehr, kann man einen ONE_SHOT Flag in eine TriggerGroup setzen.
+TGROUP_SINGLE_SHOT
Den Flag setzt man beim ersten Trigger in der Gruppe.
Beispiel:
TriggerGroup=1, $2000+TGROUP_SINGLE_SHOT,160,$002D,$2000,63,$0002,$2000,96,$0000
+TGROUP_SINGLE_SHOT_RESUMED
Auch mit diesem Flag wird eine TriggerGroup nur einmal ausgelöst, der Unterschied zu TGROUP_SINGLE_SHOT besteht aber da drin, dass die TriggerGroup noch mal ausgelöst wird wenn eine der Trigger erneut falsch und dann wieder wahr wird.
TriggerGroup=1, $2000+TGROUP_SINGLE_SHOT_RESUMED,160,$002D,$2000,63,$0002,$2000,96,$0000
2 CONDITION FLAGS
Wie wir im ersten Teil gelernt haben, müssen bei gemischten Triggergroups in denen Bedingungen und ausführbare Trigger sind alle Bedingungen wahr sein, damit die ausführbaren Trigger zur Anwendung kommen.
Man könnte auch sagen hier besteht ein unsichtbarer "Und" Operator.
TriggerGroup = Wenn Bedingung 1 UND Bedingung 2 UND Bedingung usw. wahr sind, dann folgende Trigger ausführen.
Möchte man nun Condition Trigger mit anderen Operatoren wie "NICHT - NOT" , "ODER - OR", "SONST - ELSE" in Verbindung bringen, kann man auf folgende drei +TGROUP Flags zurückgreifen.
Der Flag wird hinter den ersten der 3 exportierten Trigger Werte gesetzt.
TriggerGroup= $8000+TGROUP_OR,0,$0005
TriggerGroup= $8000+TGROUP_NOT,0,$0005
TriggerGroup= $8000+TGROUP_ELSE,0,$0005
In den folgenden Beispielen werden Trigger wie abgekürzt:
CT = Condition Trigger
ET = Executable Trigger
+TGROUP_OR
Mit diesem Flag können wir eine "Oder" Relation herstellen. Wir erinnern uns, ohne Operatoren gilt immer "und" zwischen zwei oder mehreren Condition Triggern.
Beispiele:
TriggerGroup= 1, CT1+TGROUP_OR, CT2, ET1
Wenn CT1 oder CT2 wahr ist dann soll ET1 ausgeführt werden.
TriggerGroup=1, CT1+TGROUP_OR, CT2+TGROUP_OR, CT3, ET1, ET2
Wenn CT1 oder CT2 oder CT3 wahr sind, dann soll ET1 und ET2 ausgeführt werden.
TriggerGroup=1, CT1, CT2, CT3+TGROUP_OR,ET1, ET2, ET3
Wenn CT1 wahr ist oder CT2 und CT3 wahr sind, dann soll ET1 und ET2 und ET3 ausgeführt werden.
+TGROUP_NOT
Mit diesem Flag können wir eine Bedingung umkehren von "wahr nach falsch" oder von "falsch nach wahr".
Beispiele:
TriggerGroup= 1, CT1+TGROUP_NOT, ET1, ET2
Wenn CT1 nicht wahr ist, dann soll ET1 und ET2 ausgeführt werden.
TriggerGroup= 1, CT1, CT2+TGROUP_NOT, ET1, ET2, ET3
Wenn CT1 wahr ist und CT2 nicht wahr ist dann soll ET1, ET2 und ET3 ausgeführt werden.
TriggerGroup= 1, CT1+TGROUP_NOT, CT2+TGROUP_NOT, ET1, ET2
Wenn CT1 nicht wahr ist und CT2 nicht wahr ist dann soll ET1 und ET2 ausgeführt werden.
Man kann auch ein TGROUP_OR dazusetzen:
TriggerGroup= 1, CT1+TGROUP_OR, CT2+TGROUP_NOT, ET1, ET2, ET3
Wenn CT1 oder CT2 nicht wahr ist dann soll ET1, ET2 und ET3 ausgeführt werden.
+TGROUP_ELSE
Mit diesem Flag können wir eine "sonst" Relation zwischen Bedingungen herstellen. Wenn eine Bedingung "wahr" oder "unwahr" ist, dann.... sonst prüfe, ob die nächste Bedingung "wahr" oder "unwahr" ist und führe dann .... aus.
Beispiele:
TriggerGroup= 1, CT1, ET1, CT2+TGROUP_ELSE, ET2
Diese Triggergruppe prüft ob CT1 wahr ist und führt dann ET1 aus. Ist dies nicht der Fall wird geprüft, ob CT2 wahr ist und führt dann ET2 aus.
Komplexes Beispiel (von AkyV):
TriggerGroup= 1, CT1, CT2+TGROUP_OR, ET1, ET2, CT3+TGROUP_ELSE, ET3, >
CT4+TGROUP_ELSE, CT5+TGROUP_NOT, ET4, ET5, ET6
Die Triggergruppe prüft, ob CT1 oder CT2 wahr sind. Ist eine von beiden wahr wird ET1 und ET2 ausgeführt. Ist keiner der beiden wahr, wird geprüft ob CT3 wahr ist. Ist dies der Fall wird ET3 ausgeführt. Ist dies nicht der Fall wird geprüft ob CT4 wahr ist und CT5 nicht wahr ist. Ist dies der Fall wird ET4, ET5 und ET6 ausgeführt.
TriggerGroup= 1, CT1, ET1, ET2+TGROUP_ELSE, ET3
Wenn CT1 wahr ist, führe ET1 aus aber wenn CT1 nicht wahr ist, dann führe ET3 und ET3 aus.
3 INDEX FLAGS
Bei Index Flags kann man einen Trigger so verändern, dass er auf alle Objekte eines bestimmtes Slots Anwendung findet. Als z.B. soll etwas bei allen Animating1 Objekten passieren. Oder bei einem Gegner soll dieser Trigger auf alle Baddy1, Crocodile, Mummy usw. Anwendung finden.
Der Flag überschreibt quasi die einzelne ID eines Objektes in dem Trigger und wendet es auf alle Objekte an, die in diesem Slot sind.
Es gibt folgende Index Flags:
TGROUP_USE_....
+TGROUP_USE_EXECUTOR_ITEM_INDEX
Dieser Flag kann dazu verwendet werden, damit alle Gegner in einem bestimmten Slot, die auf bestimmte Squares laufen getötet werden.
Dazu setzt man einen Trigger für eine TriggerGroup auf bestimmte Squares und löst sie mit einem Heavy Trigger aus. (Wichtig ist hier, dass Single execution genommen wird)
Zunächst setzen wir einen Heavy Trigger für eine TriggerGroup, hier TriggerGroup=3
Heavy for FlipEffect
TriggerGroup. Perform <&>TriggerGroup from script.dat (Single execution to use when in TriggerGroup there are only commands) (F371)
<&> TriggerGroup=3
In diese TriggerGroup (hier im Beispiel TriggerGroup 3) setzen wir nun den Action Trigger (43), der einen Gegner (hier im Beispiel Baddy2 mit der ID 35) tötet.
Dadurch dass wir nun hinter der ersten Zahl den Flag TGROUP_USE_EXECUTOR_ITEM_INDEX setzen, gilt es nicht nur für den Baddy2 mit der ID 35, sondern für alle Baddy2, die die TriggerGroup 3 mit Heavy auslösen.
TriggerGroup=3, $5000+TGROUP_USE_EXECUTOR_ITEM_INDEX,35,$000E
; Trigger for ActionNg
; <#> (43) BADDY_2, Room = Block Party5, X = 5, Z = 7, Ocb = 0, ScriptId = 35
; <&> Enemy. Kill <#>object in (E) way (A14)
; <E> Default death animation (only for mortal creatures, removing vitality)
; Copy following values to your script:
; $5000,35,$000E
Dadurch sterben alle Baddy2, die auf die Squares laufen, auf denen der TriggerGroup Trigger F371 mit Heavy ausgelöst wird.
Anmerkung:
Damit der Baddy2 auch einen Heavy Trigger ohne AI Nullmesh-Objekte auslöst, setzen wir im Script Befehl "Enemy=" einen "NEF_EASY_HEAVY_ENABLING" Flag.
Enemy= BADDY_2, IGNORE, NEF_EASY_HEAVY_ENABLING, IGNORE, IGNORE, IGNORE, IGNORE, IGNORE; Baddy2 can trigger Heavy Trigger
+TGROUP_USE_FOUND_ITEM_INDEX
Dieser Flag kann dazu benutzt werden, um beispielsweise Action Trigger auf alle Slots eines Moveable Objecks anzuwenden. So muss man nicht für jedes Moveable Objekt einen neuen Trigger auslösen.
Beispiel:
Immer wenn Lara das Animating7 Objekt berührt, welches sich irgendwo im Level befindet, soll es sich um 4 Klicks nach oben bewegen.
Möglicher Aufbau:
GlobalTrigger=1, IGNORE, GT_COLLIDE_SLOT, Animating7,IGNORE,1,IGNORE
TriggerGroup=1, $5000+TGROUP_USE_FOUND_ITEM_INDEX,6,$031E
; Trigger for ActionNg
; <#> (439) ANIMATING7, Room = Block Party (Copy), X = 5, Z = 6, Ocb = 0, Script ID = 6
; <&> Move. Move up <#>animating for (E) clicks (A30)
; <E> 4 click
; Copy following values to your script:
; $5000,6,$031E
Durch den Global Trigger legen wir zunächst einen Index fest, indem wir sagen, immer wenn Lara das Animating7 Objekt berührt, soll etwas passieren.
In der "TriggerGroup=1" setzen wir eine Action Trigger, der festlegt, dass wenn Lara das Animating7 mit der ID6 berührt, sich dieses um 4Klicks erhöhen soll.
Damit dies nun bei jedem Animating7 welches wir im Level irgendwo platziert haben passiert, benutzen wir den "TRGROUP_USE_FOUND_ITEM_INDEX Flag. Dadurch wird jedes Animating7 im Level um 4Klicks erhöht, sobald Lara es berührt, egal welche ID es hat.
+TGROUP_USE_ITEM_USED_BY_LARA_INDEX
Dieser Flag kann dazu benutzt werden, dass immer wenn Lara mit einem bestimmten Objekttyp interagiert, etwas passieren soll. So muss man nicht für jedes Objekt einen neuen Trigger oder Script Befehl schreiben.
Beispiel:
Immer wenn Lara einen "pushable_Object" schiebt, soll bei diesem gelber Sprühnebel erscheinen.
Möglicher Aufbau:AddEffect=1, ADD_MIST, FADD_CONTINUE_EMIT,JOINT_SINGLE_MESH,0,0,0,0,0,24,1,MIST_COL_YELLOW,32
GlobalTrigger=1, IGNORE,GT_CONDITION_GROUP,IGNORE, 1,2,IGNORE
TriggerGroup=1, $8000,13,$0005
; ConditionNg for ParameterNg
; <#> Pushing block
; <&> Lara. (Status) Lara is performing <#>action is (E) (C5)
; <E> TRUE (Lara is performing #action)
; Copy following values to your script:
; $8000,13,$0005
TriggerGroup=2, $5000+TGROUP_USE_ITEM_USED_BY_LARA_INDEX,17,$0130
; Trigger for ActionNg
; <#> (156) PUSHABLE_OBJECT1, Room = Room 0 (copy 3), X = 3, Z = 7, Ocb = 0, Script ID = 17
; <&> Effect. Add to <#>Enemy the (E)AddEffect from script.txt (A48)
; <E> AddEffect=1
; Copy following values to your script:
; $5000,17,$0130
Wir legen einen AddEffect 1 fest, dem wir den gelben Sprünebel zuweisen.
Der GlobalTrigger sagt aus, dass immer wenn Lara einen "pushable Object" von sich wegschiebt, ein gelber Sprühnebel erscheinen soll. Hier haben wir ein "pushable_object1", der Effekt wird aber bei allen pushable_Objects angewendet, auch "pushable_object2" usw.
Laut Paolone gehen folgende Objekte, mit denen Lara interagieren kann:
Vehicles, rope, polerope, switch 1/2/3, pushable objects, rollingball (with pusing features), parallel bar, elevator, keypad.
Hier gilt allerdings die Devise, einfach mal ausprobieren, welche Objekte alle gehen.
+TGROUP_USE_OWNER_ANIM_ITEM_INDEX
Diesen Flag können wir verwenden, wenn wir z.B. eine TriggerGroup nach Wadmerger zu einer Animation bzw. Frame als Animcommand exportieren.
Als Beispiel mal die Baboon Affen von Rardraider.
Hier hat Rardraider folgende Basis Triggergruppe angelegt:
TriggerGroup=10, $9000,12,IGNORE $0236,>
$2000,89,$000D
; ConditionNg for ParameterNg
; <#> (67) BABOON_NORMAL, Room = Room 0 (copy 2), X = 2, Z = 4, Ocb = 0, Script ID = 12
; <&> Lara. Distance. Lara is distant by <#>Moveable less or even than (E)Clicks (C54)
; <E> Value=2
; Copy following values to your script:
; $9000,12,$0236
; Trigger for FlipEffect
; <#> Lara. (Health) Damage Lara, decreasing life by <&>percentage of full vitality in (E) way (F89)
; <&> 5 Percentage
; <E> Immediatly, one-shot
; Copy following values to your script:
; $2000,89,$000D
Die Triggergruppe sagt aus, dass jedesmal, wenn Lara sich innerhalb von 2 Clicks dem Baboon mit der ID 12 nähert, zieht dieser Lara 5% Energie ab.
Möchten wir nun, dass diese Triggergruppe immer ausgelöst wird, wenn jeder Baboon im Level die Angriffsanimation 23 bei Frame 7 ausführt, ändern wir die Triggergruppe folgendermaßen.
TriggerGroup=10, $9000+TGROUP_USE_OWNER_ANIM_ITEM_INDEX,IGNORE, $0236,$2000,89,$000D
Statt der ID 12 setzen wir hier IGNORE, da wir ja möchten, dass bei jedem Baboon_Normal, der im Level ausgelöst wird, die Triggergruppe 10 bei Animation 23 im Frame 7 ausgelöst wird.
Nun müssen wir den folgenden Auslöser für die Triggergruppe 10 in die Animation 23 des Baboon_Normal bekommen.
Set Trigger Type - FLIPEFFECT 118
;Exporting: TRIGGER(10:0) for FLIPEFFECT(118)
;<#> : TriggerGroup. Perform <&>TriggerGroup from script.dat in (E)way
;<&> : TriggerGroup= 10
;(E) : Mutiple performing (to use when in TriggerGroup there is some condition)
Dazu öffnen wir den TE oder NGLE und exportieren den Trigger als AnimCommand (siehe Bild hier mit dem Tomb Editor)
Hier müssen wir nun noch den Frame angeben, in unserem Beispiel 7, dann erscheint folgende Zahlenkombination:
diese setzen wir in Wadmerger mit "Edit AnimCommands" oder in WadTool mit "AnimCommands" in die entsprechende Animation 23 des Baboon_Normal.
+TGROUP_USE_TRIGGER_ITEM_INDEX
Dieser Flag ist laut AkyV nicht sinnvoll und braucht nicht verwendet zu werden.