ModEnc is currently in Maintenance Mode: Changes could occur at any given moment, without advance warning.

Difference between revisions of "Triggers"

From ModEnc
Jump to: navigation, search
(Based on conclusive testing, trigger's persistence is obsolete in TS.)
 
(8 intermediate revisions by 4 users not shown)
Line 6: Line 6:
  
 
The internal hierarchy works like this:
 
The internal hierarchy works like this:
*A [[Maps/Celltags|CellTag]] points to a Tag, and tells the game to consider this trigger when processing events.
+
*A [[Maps/Celltags|CellTag]] points to a Tag, and tells the game to consider its Trigger when processing events.
 
*A [[Maps/Tags|Tag]] points to a Trigger.
 
*A [[Maps/Tags|Tag]] points to a Trigger.
 
*A Trigger points to an [[Maps/Events|Event]] and an [[Maps/Actions|Action]], and tells the game "If my Events happen, execute my Actions".
 
*A Trigger points to an [[Maps/Events|Event]] and an [[Maps/Actions|Action]], and tells the game "If my Events happen, execute my Actions".
 
*An [[Maps/Events|Event]] lists the condition(s) that invoke this trigger, e.g. "45 seconds have passed".
 
*An [[Maps/Events|Event]] lists the condition(s) that invoke this trigger, e.g. "45 seconds have passed".
*An [[Maps/Actions|Action]] lists the actions that should be performed by the game when this trigger fires. These are things like "Give the AI three nuclear silos", "Reveal the aforealludedto silos to the player" or "Paradrop these desolators as a reinforcement for the player".
+
*An [[Maps/Actions|Action]] lists the actions that should be performed by the game when this trigger fires. These are things like "Give the AI three nuclear silos", "Reveal the aforementioned silos to the player" or "Paradrop these desolators as a reinforcement for the player".
  
 
__TOC__
 
__TOC__
Line 20: Line 20:
 
The {{Tt|[Triggers]}} section in a map is a list of comma-separated strings that looks like this:
 
The {{Tt|[Triggers]}} section in a map is a list of comma-separated strings that looks like this:
  
<!-- Reverse engineered from CCMAP -->
+
<!-- Originally reverse engineered from CCMAP, further documentation according to source code -->
  
 
  [Triggers]
 
  [Triggers]
  ID=EVENT,ACTION,EVENT_PARAMETER,HOUSE,ASSOCIATED_TEAMTYPE,REPEATING
+
  ID=EventType,ActionType,EventParameter,House,Team,PersistantType
  ID1=EVENT,ACTION,EVENT_PARAMETER,HOUSE,ASSOCIATED_TEAMTYPE,REPEATING
+
  ID1=EventType,ActionType,EventParameter,House,Team,PersistantType
 
etc.
 
etc.
  
{| style="width: 90%" border=1 class="table_descrowdesccol"
+
{| style="width: 90%" border=1 class="wikitable table_descrowdesccol"
 
|+ Meanings of each string
 
|+ Meanings of each string
 
! style="width: 13em; " | String
 
! style="width: 13em; " | String
Line 35: Line 35:
 
| This trigger's ID.
 
| This trigger's ID.
 
|-
 
|-
! {{Anchor|EVENT|td}}
+
! {{Anchor|EventType|td}}
 
| This trigger's Event (See [[Maps/Events/TD|Events]]).
 
| This trigger's Event (See [[Maps/Events/TD|Events]]).
 
|-
 
|-
! {{Anchor|ACTION|td}}
+
! {{Anchor|ActionType|td}}
 
| This trigger's Action (See [[Maps/Actions/TD|Actions]]).
 
| This trigger's Action (See [[Maps/Actions/TD|Actions]]).
 
|-
 
|-
! {{Anchor|EVENT_PARAMETER|td}}
+
! {{Anchor|EventParameter|td}}
 
| The parameter for the Event.
 
| The parameter for the Event.
 
|-
 
|-
! {{Anchor|HOUSE|td}}
+
! {{Anchor|House|td}}
 
| The name of the [[Maps/Houses/TD|house]] associated with this trigger, or {{Tt|None}}. This house is used as a parameter by some Events and Actions.
 
| The name of the [[Maps/Houses/TD|house]] associated with this trigger, or {{Tt|None}}. This house is used as a parameter by some Events and Actions.
 
|-
 
|-
! {{Anchor|ASSOCIATED_TEAMTYPE|td}}
+
! {{Anchor|Team|td}}
 
| Associated teamtype ID, or {{Tt|None}}.  
 
| Associated teamtype ID, or {{Tt|None}}.  
 
|-
 
|-
! {{Anchor|REPEATING|td}}
+
! {{Anchor|PersistantType|td}}<sup style="font-weight: normal">[''sic'']</sup>
 
|  
 
|  
Specifies whether this trigger is repeating (see [[#The Repeating puzzle|The Repeating puzzle]] for more info).
+
Controls if and when the trigger should destroy itself after it goes off. Once destroyed, a trigger cannot be fired again.
  
{| style="margin-left: 50px;" border=1 class='table_descrowdesccol'
+
{| style="margin-left: 50px;" border=1 class='wikitable table_descrowdesccol'
 
|+ Possible values
 
|+ Possible values
 
! style="width: 50px; text-align: center; " | Value
 
! style="width: 50px; text-align: center; " | Value
Line 60: Line 60:
 
|-
 
|-
 
! style="font-family: monospace; width: 50px; text-align: center; " | 0  
 
! style="font-family: monospace; width: 50px; text-align: center; " | 0  
| single-shot
+
| volatile: the trigger destroys itself immediately after going off, and removes itself from all objects it's attached to
 
| Loop : no
 
| Loop : no
 
|-
 
|-
 
! style="font-family: monospace; width: 50px; text-align: center; " | 1
 
! style="font-family: monospace; width: 50px; text-align: center; " | 1
| repeating a (fire when all attached objects have fired)
+
| semi-persistent: the trigger maintains a count of all objects it's attached to, and only actually fires after its been triggered from all the objects; then, it removes itself.
 
| Loop : and (1)
 
| Loop : and (1)
 
|-
 
|-
 
! style="font-family: monospace; width: 50px; text-align: center; " | 2
 
! style="font-family: monospace; width: 50px; text-align: center; " | 2
| repeating b (fire when any attached object has fired)
+
| persistent: the trigger is never removed, and it continues to fire whenever its conditions are met.
 
| Loop : or (2)
 
| Loop : or (2)
 
|}
 
|}
Line 81: Line 81:
  
 
  [Trigs]
 
  [Trigs]
  name=R,H,C,A,E1,E1P1,E1P2,E2,E2P1,E2P2,A1,A1P1,A1P2,A1P3,A2,A2P1,A2P2,A2P3
+
  name=P,H,C,A,E1,E1P1,E1P2,E2,E2P1,E2P2,A1,A1P1,A1P2,A1P3,A2,A2P1,A2P2,A2P3
  name1=R,H,C,A,E1,E1P1,E1P2,E2,E2P1,E2P2,A1,A1P1,A1P2,A1P3,A2,A2P1,A2P2,A2P3
+
  name1=P,H,C,A,E1,E1P1,E1P2,E2,E2P1,E2P2,A1,A1P1,A1P2,A1P3,A2,A2P1,A2P2,A2P3
 
etc.
 
etc.
  
{| style="width: 90%" border=1 class="table_descrowdesccol"
+
{| style="width: 90%" border=1 class="wikitable table_descrowdesccol "
 
|+ Meanings of each string
 
|+ Meanings of each string
 
! style="width: 13em; " | String
 
! style="width: 13em; " | String
 
! Meaning
 
! Meaning
 
|-
 
|-
! {{Anchor|R|ra}}[''epeating'']  
+
! {{Anchor|P|ra}}[''ersistant'']  
| Specifies whether this trigger is repeating (see [[#The Repeating puzzle|The Repeating puzzle]] for more info).
+
| Specifies whether this trigger is persistent (see [[#td_PersistantType|PersistantType]] for more info).
  
{| style="margin-left: 50px;" border=1 class='table_descrowdesccol'
+
{| style="margin-left: 50px;" border=1 class='wikitable table_descrowdesccol'
 
|+ Possible values
 
|+ Possible values
 
! style="width: 50px; text-align: center; " | Value
 
! style="width: 50px; text-align: center; " | Value
Line 99: Line 99:
 
|-
 
|-
 
! style="font-family: monospace; width: 50px; text-align: center; " | 0  
 
! style="font-family: monospace; width: 50px; text-align: center; " | 0  
| single-shot a
+
| volatile
| temporary (any linked event => switch{{Fnl|1}}, destroy)
+
| temporary (any linked event => switch{{Fnl|2}}, destroy)
 
|-
 
|-
 
! style="font-family: monospace; width: 50px; text-align: center; " | 1
 
! style="font-family: monospace; width: 50px; text-align: center; " | 1
| single-shot b {{Fnl|1}} (fire when all attached objects have fired)
+
| semi-persistent
 
| semi-constant (all linked events => switch, destroy)
 
| semi-constant (all linked events => switch, destroy)
 
|-
 
|-
 
! style="font-family: monospace; width: 50px; text-align: center; " | 2
 
! style="font-family: monospace; width: 50px; text-align: center; " | 2
| repeating (fire when any attached object has fired)
+
| persistent
 
| constant (any linked event => switch)
 
| constant (any linked event => switch)
 
|}
 
|}
{{Fn|1|"switch" means ''activate this trigger''}}
+
{{Fn|2|"switch" means ''activate this trigger''}}
  
 
|-
 
|-
Line 122: Line 122:
 
These two flags define which event fires which action:
 
These two flags define which event fires which action:
  
{| style="margin-left: 50px;" border=1 class='table_descrowdesccol'
+
{| style="margin-left: 50px;" border=1 class='wikitable table_descrowdesccol'
 
|+ Possible values
 
|+ Possible values
 
! style="width: 50px; text-align: center; " | C
 
! style="width: 50px; text-align: center; " | C
Line 216: Line 216:
  
 
  [Triggers]
 
  [Triggers]
  ID=HOUSE,LINKED_TRIGGER,NAME,DISABLED,EASY,NORMAL,HARD,REPEATING
+
  ID=HOUSE,LINKED_TRIGGER,NAME,DISABLED,EASY,NORMAL,HARD,PERSISTENCE
  ID1=HOUSE,LINKED_TRIGGER,NAME,DISABLED,EASY,NORMAL,HARD,REPEATING
+
  ID1=HOUSE,LINKED_TRIGGER,NAME,DISABLED,EASY,NORMAL,HARD,PERSISTENCE
 
etc.
 
etc.
  
{| style="width: 90%" border=1 class="table_descrowdesccol"
+
{| style="width: 90%" border=1 class="wikitable table_descrowdesccol"
 
|+ Meanings of each string
 
|+ Meanings of each string
 
! style="width: 13em; " | String
 
! style="width: 13em; " | String
Line 232: Line 232:
 
|-
 
|-
 
! {{Anchor|LINKED_TRIGGER|ts}}
 
! {{Anchor|LINKED_TRIGGER|ts}}
| A trigger that is fired automatically when this trigger fires, or {{Tt|<none>}} if no additional triggers should fire.
+
| A trigger that uses the tag of this trigger, so you can add multiple triggers to a single object.
 
|-
 
|-
 
! {{Anchor|NAME|ts}}
 
! {{Anchor|NAME|ts}}
Line 249: Line 249:
 
| Can be set to {{Tt|0}} ('disabled') or {{Tt|1}} ('enabled'). Specifies whether this trigger is active in the Hard difficulty (It refers to the Campaign Difficulty slider or the Difficulty slider in the Options menu.)
 
| Can be set to {{Tt|0}} ('disabled') or {{Tt|1}} ('enabled'). Specifies whether this trigger is active in the Hard difficulty (It refers to the Campaign Difficulty slider or the Difficulty slider in the Options menu.)
 
|-
 
|-
! {{Anchor|REPEATING|ts}}
+
! {{Anchor|PERSISTENCE|ts}}
| Specifies whether this trigger is repeating (see [[#The Repeating puzzle|The Repeating puzzle]] for more info).
+
| {{obsolete|{{ts}} to {{yr}}|trigger's persistence}} Specifies whether this trigger is persistent (see [[#td_PersistantType|PersistantType]] for more info).
  
{| style="margin-left: 50px;" border=1 class='table_descrowdesccol'
+
{| style="margin-left: 50px;" border=1 class='wikitable table_descrowdesccol'
 
|+ Possible values
 
|+ Possible values
 
! style="width: 50px; text-align: center; " | Value
 
! style="width: 50px; text-align: center; " | Value
 
! Meaning
 
! Meaning
 
|-
 
|-
! style="width: 50px; text-align: center; " | 0  
+
! style="font-family: monospace; width: 50px; text-align: center; " | 0  
| single-shot
+
| volatile
 
|-
 
|-
! style="width: 50px; text-align: center; " | 1
+
! style="font-family: monospace; width: 50px; text-align: center; " | 1
| unknown
+
| persistent
|-
 
! style="width: 50px; text-align: center; " | 2
 
| repeating (fire when any attached object has fired)
 
 
|}
 
|}
 +
 +
This appears to have been superseded by the persistence control in [[tags]]: In TS to YR, a trigger is associated with a tag, either by itself or through another trigger. The game uses the persistence mode specified in the trigger's associated tag entry. Accordingly, [[Final Sun]] and [[Final Alert 2]] map editors set the tag's persistence mode when the persistence value is modified from either Trigger or Tag dialogs.
  
 
|}
 
|}
 
== Considerations ==
 
 
=== The Repeating puzzle ===
 
{{NeedsTesting}}
 
As you may have noticed, different games specify different values for the Repeating flag: TD says R=1 means the trigger will repeat, RA says it will not, and TS-YR don't document this at all. This needs more testing.
 
  
 
[[Category: Maps Sections|Triggers]]
 
[[Category: Maps Sections|Triggers]]

Latest revision as of 10:56, 31 January 2024

This page should correctly be named "[Triggers]"; it is wrong due to technical restrictions.


Map triggers are responsible for the special events happening in the map. For example, the singleplayer campaign maps have triggers to do things like "if unit x is destroyed, declare player the winner" or "if building y is still standing after twenty minutes, declare the player the loser". Without map triggers, scripting maps would be impossible.

The internal hierarchy works like this:

  • A CellTag points to a Tag, and tells the game to consider its Trigger when processing events.
  • A Tag points to a Trigger.
  • A Trigger points to an Event and an Action, and tells the game "If my Events happen, execute my Actions".
  • An Event lists the condition(s) that invoke this trigger, e.g. "45 seconds have passed".
  • An Action lists the actions that should be performed by the game when this trigger fires. These are things like "Give the AI three nuclear silos", "Reveal the aforementioned silos to the player" or "Paradrop these desolators as a reinforcement for the player".

Section

Tiberian Dawn

The [Triggers] section in a map is a list of comma-separated strings that looks like this:


[Triggers]
ID=EventType,ActionType,EventParameter,House,Team,PersistantType
ID1=EventType,ActionType,EventParameter,House,Team,PersistantType

etc.

Meanings of each string
String Meaning
ID This trigger's ID.
EventType This trigger's Event (See Events).
ActionType This trigger's Action (See Actions).
EventParameter The parameter for the Event.
House The name of the house associated with this trigger, or None. This house is used as a parameter by some Events and Actions.
Team Associated teamtype ID, or None.
PersistantType[sic]

Controls if and when the trigger should destroy itself after it goes off. Once destroyed, a trigger cannot be fired again.

Possible values
Value Meaning CCMAP description
0 volatile: the trigger destroys itself immediately after going off, and removes itself from all objects it's attached to Loop : no
1 semi-persistent: the trigger maintains a count of all objects it's attached to, and only actually fires after its been triggered from all the objects; then, it removes itself. Loop : and (1)
2 persistent: the trigger is never removed, and it continues to fire whenever its conditions are met. Loop : or (2)

Red Alert, Counterstrike, Aftermath

The section is called [Trigs] and again is a list of comma-separated strings that looks like this:


[Trigs]
name=P,H,C,A,E1,E1P1,E1P2,E2,E2P1,E2P2,A1,A1P1,A1P2,A1P3,A2,A2P1,A2P2,A2P3
name1=P,H,C,A,E1,E1P1,E1P2,E2,E2P1,E2P2,A1,A1P1,A1P2,A1P3,A2,A2P1,A2P2,A2P3

etc.

Meanings of each string
String Meaning
P[ersistant] Specifies whether this trigger is persistent (see PersistantType for more info).
Possible values
Value Meaning RAED description
0 volatile temporary (any linked event => switch2, destroy)
1 semi-persistent semi-constant (all linked events => switch, destroy)
2 persistent constant (any linked event => switch)

2 "switch" means activate this trigger

H[ouse] The index of the house associated with this trigger. This house is used as a parameter by some Events and Actions.
C[ondition]

Condition can be set to 0, 1, 2 or 3.
Activate can be set to 0 or 1 , and essentially says whether this trigger has or doesn't have a second action defined.
These two flags define which event fires which action:

Possible values
C A What happens RAED phrasing
0 0 (Event 1) fires Action 1 simple([event1 => action1 [+ action 2]])
0 1 (Event 1) fires Actions 1 and 2
1 0 (Event 1 and Event 2) fires Action 1 and([event1 && event2 => action1 [+action 2]])
1 1 (Event 1 and Event 2) fire Actions 1 and 2
2 0 (Event 1 or Event 2) fires Action 1 or([event1 | | event2 => action1 [+action 2]])
2 1 (Event 1 or Event 2) fire Actions 1 and 2
3 0 Event 1 fires Action 1 (?) complex ([event1 => action1; event 2 => action2])
3 1 Event 1 fires Action 1; Event 2 independently fires Action 2
A[ctivate]
E1 Event 1's index (see Events).
E1P1 Event 1's first parameter.
E1P2 Event 1's second parameter.
E2 Event 2's index.
E2P1 Event 2's first parameter.
E2P2 Event 2's second parameter.
A1 Action 1's index (see Actions).
A1P1 Action 1's first parameter.
A1P2 Action 1's second parameter.
A1P3 Action 1's third parameter.
A2 Action 2's index.
A2P1 Action 2's first parameter.
A2P2 Action 2's second parameter.
A2P3 Action 2's third parameter.

Tiberian Sun, Firestorm, Red Alert 2, Yuri's Revenge

The [Triggers] section in a map is a list of comma-separated strings that looks like this:

[Triggers]
ID=HOUSE,LINKED_TRIGGER,NAME,DISABLED,EASY,NORMAL,HARD,PERSISTENCE
ID1=HOUSE,LINKED_TRIGGER,NAME,DISABLED,EASY,NORMAL,HARD,PERSISTENCE

etc.

Meanings of each string
String Meaning
ID The Trigger's ID. The game assumes the Actions and Events with the same ID belong to this Trigger automatically.
HOUSE The House associated with this trigger. This house is used as a parameter by some Events and Actions.
LINKED_TRIGGER A trigger that uses the tag of this trigger, so you can add multiple triggers to a single object.
NAME A plain text string used as a name of this Trigger. Not used ingame, only in the map editor. Should not contain commas.
DISABLED Can be set to 0 ('not disabled') or 1 ('disabled') (Note the negation in this string). Specifies whether this trigger is disabled at the beginning of the game. If it is disabled, another trigger has to explicitly enable it via a special Action.
EASY Can be set to 0 ('disabled') or 1 ('enabled'). Specifies whether this trigger is active in the Easy difficulty (It refers to the Campaign Difficulty slider or the Difficulty slider in the Options menu.)
NORMAL Can be set to 0 ('disabled') or 1 ('enabled'). Specifies whether this trigger is active in the Normal difficulty (It refers to the Campaign Difficulty slider or the Difficulty slider in the Options menu.)
HARD Can be set to 0 ('disabled') or 1 ('enabled'). Specifies whether this trigger is active in the Hard difficulty (It refers to the Campaign Difficulty slider or the Difficulty slider in the Options menu.)
PERSISTENCE
Cc cnrdelete-all.png
Logic related to trigger's persistence, as a whole or in part, is obsolete in Tiberian Sun to Yuri's Revenge.

Specifies whether this trigger is persistent (see PersistantType for more info).
Possible values
Value Meaning
0 volatile
1 persistent

This appears to have been superseded by the persistence control in tags: In TS to YR, a trigger is associated with a tag, either by itself or through another trigger. The game uses the persistence mode specified in the trigger's associated tag entry. Accordingly, Final Sun and Final Alert 2 map editors set the tag's persistence mode when the persistence value is modified from either Trigger or Tag dialogs.