How Detection of Flight State Works
This is a snapshot of v0.9.7 transitions, so it might evolve. It should answer most questions on ‘what fires when’.
Flight State Transition Table
| File to Play | Things to Check | Timing Logic |
|---|---|---|
| BoardingWelcome | GSX Mode: IsOnGround=True AND IsGSXBoardingInProgress=True AND IsBeaconOn=False Traditional Mode: IsOnGround=True AND IsLogoLightOn=True AND IsBeaconOn=False |
Play once when GSX boarding starts OR logo light first turns on, then repeat every X minutes (configurable, default 5) until BoardingComplete |
| BoardingWelcomePilot | Settings: BoardingWelcomePilot enabled AND BoardingWelcome played AND IsOnGround=True AND IsBeaconOn=False |
Play once after the initial BoardingWelcome during boarding (off by default) |
| BoardingMusic | BoardingWelcome played AND BoardingComplete not played |
Loop continuously until BoardingComplete or next BoardingWelcome |
| DepartureDelayed | SimBrief scheduled pushback overdue by ≥ configured minutes AND BoardingWelcome played AND BoardingComplete not played |
Interrupts BoardingMusic immediately; plays once per boarding session; respects global spacing; BoardingMusic resumes (from offset if resume is enabled) |
| BoardingComplete | IsBeaconOn=True AND IsOnGround=True OR GSX Boarding complete (when GSX enabled) |
Play once when beacon first turned on OR GSX boarding completed (whichever happens first) |
| ArmDoors | IsOnGround=True AND (IsEngineRunning=True OR GroundSpeed > 1) OR Auto ArmDoors tweak enabled AND BoardingComplete played |
Play once when engines start or aircraft begins moving, or automatically soon after BoardingComplete if Auto ArmDoors tweak is enabled |
| PreSafetyBriefing | ArmDoors played AND IsEngineRunning=True |
Wait for ArmDoors to finish playing |
| SafetyBriefing | PreSafetyBriefing played |
Wait for PreSafetyBriefing to finish playing |
| CabinDimTakeoff | SafetyBriefing played AND IsDaylight=False |
Wait for SafetyBriefing to finish playing + 10 seconds |
| CrewSeatsTakeoff | IsOnGround=True AND (IsLandingLightOn=True OR IsStrobeLightOn=True) AND IsEngineRunning=True |
When landing lights (default) or strobe lights are turned on (takeoff imminent) |
| CallCabinSecureTakeoff | CrewSeatsTakeoff played AND IsOnGround=True |
Wait for CrewSeatsTakeoff to finish playing + 5 seconds |
| AfterTakeoff | AltitudeAGL > TakeoffDetectionAltitudeAGL (3,000 ft) AND IsOnGround=False |
Wait 2 minutes after takeoff detected (independent timing), configurable altitude |
| TopOfClimbPilot | Settings: TopOfClimbPilot enabled AND Altitude within ±1000 ft of SimBrief initial altitude AND IsOnGround=False AND VerticalSpeed > 0 |
Wait 20 seconds after conditions met (disabled by default) |
| FastenSeatbelt | Climb/Cruise Phase AND AfterTakeoff played AND Seatbelt Sign OFF→ON transition (CABIN SEATBELTS ALERT SWITCH or ANNUNCIATOR SWITCH binding) |
2 Minute Cooldown (Repeatable) |
| TopOfDescentPilot | Settings: TopOfDescentPilot enabled AND Altitude within ±1000 ft cruise band AND 2 minutes at cruise AND Descend ≥500 ft at ≤-500 fpm AND >50% cruise elapsed |
Play once when all conditions met (disabled by default) |
| Cruise | Climb/Cruise/Descent Phases AND only plays the once per file |
Use the file naming convention of ‘CruiseElapsedXXPercent’ where XX represents the number % through the flight e.g. CruiseElapsed33Percent is 1/3rd through the flight time |
| DescentSeatbelts | (AltitudeAGL < DescentDetectionAGL (10,000 ft) AND VerticalSpeed < -500) OR LandingLightJustTurnedOn=True |
When descending below configurable altitude OR when landing lights just turned on |
| CrewSeatsLanding | AltitudeAGL < CrewSeatsLandingAGL (3,000 ft) AND VerticalSpeed < -300 AND IsLandingLightOn=True |
During final approach phase with landing lights on (configurable altitude threshold) |
| CallCabinSecureLanding | CrewSeatsLanding played AND AltitudeAGL < CrewSeatsLandingAGL + 2000 (5,000 ft) |
Wait for CrewSeatsLanding to finish playing + 10 seconds (uses CrewSeatsLandingAGL + 2000ft) |
| AfterLanding | IsOnGround=True AND (SpoilersDeployed=False OR GroundSpeed < 15) AND (previous phase was descent/approach OR descent announcements played) |
After landing and spoilers retracted OR ground speed below 15 knots |
| AfterLandingMusic | AfterLanding completed AND DisembarkStarted not yet played. |
Loops continuously after AfterLanding completes. May be interrupted by DisarmDoors and then resumes (from offset if resume enabled). Stops when DisembarkStarted plays. |
| DisarmDoors | AreEnginesOff=True AND IsParkingBrakeOn=True AND AfterLanding played |
Wait for AfterLanding to finish playing |
| DisembarkStarted | DisarmDoors played AND (IsBeaconOn=False OR IsGSXDeboardingInProgress=True) |
Wait for DisarmDoors to finish playing. When GSX Deboarding completes (State 6), automatically resets flight state for next flight |
Airline Detection
Airline folder selection is determined using a priority order so the most reliable source wins, with graceful fallbacks:
1) SimBrief (preferred)
- If SimBrief data is available, we first use
<general><icao_airline>(e.g.,UAL,ACA,DAL). - If a callsign-derived ICAO prefix from
<atc><callsign>exists and differs from<icao_airline>, we prefer the callsign-derived value.
2) Tail number in MSFS
- If SimBrief is unavailable, we try the simulator’s Tail number and look for an ICAO airline code e.g. UAL123 would give us UAL to use.
Folder selection
- The resolved airline code selects the corresponding folder under your announcements root (e.g.,
UAL/,ACA/). - If a matching file is not found and “Use Default folder announcements if airline-specific files are missing” is enabled in Settings, the
Default/folder is used as fallback.
Sound Files and Tagging
The system supports various tagging options using square brackets in filenames:
Aircraft-Specific Tags
SafetyBriefing[737].ogg- Specific to Boeing 737 aircraftSafetyBriefing[A320].ogg- Specific to Airbus A320 aircraftBoardingWelcome[A321].ogg- Specific to Airbus A321 aircraft
The system uses the ATC MODEL simvar (e.g., “737”, “A320”) for enhanced aircraft detection. If this simvar is not available, it falls back to parsing the aircraft title from the TITLE simvar.
Time-Based Tags
BoardingWelcome[Morning].ogg- For morning flights (6 AM - 12 PM)BoardingWelcome[Afternoon].ogg- For afternoon flights (12 PM - 6 PM)BoardingWelcome[Evening].ogg- For evening flights (6 PM - 12 AM)BoardingWelcome[Night].ogg- For night flights (12 AM - 6 AM)
Situational Tags
BoardingWelcome[Refueling].ogg- Played when aircraft is on ground with engines off
Special Tags
[mute]- Selects the file normally but skips playback. Counts as played for state tracking and applies to all announcement types.- Preference: When multiple candidates tie on score, non-muted files are preferred. If only muted files match, the muted one is selected but not played.
- Works with other tags: e.g.,
AfterLanding[WSSS][mute].oggmutes only at WSSS, andAfterLanding[mute].oggmutes globally for that airline or inDefault. - TTS override: If a matching airline file with
[mute]exists, Text-to-Speech is not generated and the muted file is selected to intentionally skip audio.
Location (ICAO) Tags
- You can target a specific origin or destination airport by ICAO code. The
state machine automatically applies origin tags for pre-departure phases and
destination tags for arrival/post-flight phases.
- Examples:
BoardingWelcome[KSFO].ogg→ used when the SimBrief origin is KSFOAfterLanding[KSAN].ogg→ used when the SimBrief destination is KSAN
- Origin-based announcements (up to and including
AfterTakeoff) use origin ICAO tags - All later announcements use destination ICAO tags
- Examples:
Arrival and Departure Tags ([ARR] and [DEP])
- You can explicitly specify whether an ICAO code refers to the departure or arrival airport using
[ARR]or[DEP]tags. - This allows you to use arrival-specific announcements during departure phases, or vice versa.
- Examples:
BoardingWelcome[CYVR][ARR].ogg→ plays when CYVR is your destination, even though BoardingWelcome normally uses origin tagsBoardingWelcome[KSEA][ARR].ogg→ plays when KSEA is your destination (e.g., “This is our flight to Seattle, hello”)AfterLanding[KSEA].ogg→ automatically uses destination context (no tag needed)AfterLanding[KSEA][ARR].ogg→ explicitly marks as arrival context (same behavior as above)
- When
[ARR]or[DEP]is specified, it overrides the automatic origin/destination detection for that file - Useful when you want announcements that mention the destination airport during boarding, or departure airport during arrival
- Examples:
Numbered Variants
You can create multiple versions of the same announcement:
BoardingWelcome[1].oggBoardingWelcome[2].oggBoardingWelcome[3].ogg
The system will randomly select one variant per flight and maintain consistency throughout the flight.
Tag Priority and Matching
- Multiple tags may be combined on the same file, e.g.,
SafetyBriefing[A320][Morning][KSFO].oggorBoardingWelcome[CYVR][ARR][1].ogg - Matching priority (highest → lowest):
- Situational tags (e.g.,
Refueling) when active – required to match when present - Aircraft-specific tags (exact type match, e.g.,
A320,B738,CRJ900) - Location ICAO tags with explicit
[ARR]or[DEP]context (overrides automatic origin/destination detection) - Location ICAO tags (origin/destination as automatically determined by flight phase)
- Time-of-day tags (
Morning,Afternoon,Evening,Night) - Numbered variants (
[1],[2], …)
- Situational tags (e.g.,
- If multiple candidates tie, a deterministic selection is made; numbered variants maintain consistency per flight.
PMDG SDK Integration
Some PMDG aircraft, such as the MSFS 2024 777 family don’t export light values correctly, in that the logo, beacon and landing lights all show ‘ON’ regardless of their switch positions. Note: the MSFS2020 PMDG 777’s are fine, this is just the MSFS 2024 version. This is reported to PMDG but it possible won’t be changed for a while.
To get around this the app uses the PMDG SDK data broadcast feature to read the internal values. Unfortunately this mean this data access has to be manually turned on. Here’s how I did it for the 77l, and hopefully is applicable for others in the family:
- Locate the file
777_Options.inihere:
Store version:
%localappdata%\Packages\Microsoft.Limitless_8wekyb3d8bbwe\LocalState\WASM\MSFS2024\pmdg-aircraft-77l\work
Steam version:
%AppData%\Microsoft Flight Simulator 2024\WASM\MSFS2024\pmdg-aircraft-77l\work
(with the ‘l’ being the 200ER etc, as that changes per variant, so do each one you have)
- Add the following lines into the existing file (include an empty line as the last line if adding at end)
[SDK]
EnableDataBroadcast=1
- In the app Settings \ Tweaks tab enable the option
Enable PMDG SDK Data.
If these signals get updated to use the general simconnect values like other aircraft then hopefully we don’t have to keep doing this.
App Custom light override L:Vars
These optional L:Vars let external programs explicitly force specific exterior lights ON. When set to 1, they override default SimVars and PMDG data, and also bypass IgnoreIncompatibleAircraftLights. If they’re 0 or not present, they are ignored and normal detection applies.
Note: It is recommended you also use the Settings / Tweak Ignore incompatible aircraft lights on with these custom lvars.
| L:Var | Type | Value meaning |
|---|---|---|
L:UNI_ANNOUNCER_LIGHT_LOGO |
Bool (0/1) | 1 = force Logo light ON |
L:UNI_ANNOUNCER_LIGHT_BEACON |
Bool (0/1) | 1 = force Beacon light ON |
L:UNI_ANNOUNCER_LIGHT_LANDING |
Bool (0/1) | 1 = force Landing light ON |
L:UNI_ANNOUNCER_LIGHT_STROBE |
Bool (0/1) | 1 = force Strobe light ON |
One possible use of these LVARs is in reading internal WASM/IPC values with MobiFlight or FSUIPC (e.g. ProSim A320 etc) that don’t currently export all simconnect values and then set these accordingly. So you’d script inputs/outputs in the external tool to set these values to bypass any restriction of external light data.
GSX Integration
The Universal Announcer now supports GSX (Ground Services eXtended) integration for more realistic boarding announcements. This feature must be enabled in the Settings → Integrations tab.
GSX SimVar Integration
When GSX integration is enabled, the system monitors three GSX simvars:
GSX Boarding State - L:FSDT_GSX_BOARDING_STATE:
- State 1: Service can be called
- State 2: Service is not available
- State 3: Service has been bypassed
- State 4: Service has been requested
- State 5: Service is being performed ⭐ ACTIVE BOARDING
- State 6: Service has been completed ⭐ BOARDING COMPLETE
GSX Refueling State - L:FSDT_GSX_REFUELING_STATE:
- State 1: Service can be called
- State 2: Service is not available
- State 3: Service has been bypassed
- State 4: Service has been requested ⭐ REFUELING REQUESTED
- State 5: Service is being performed ⭐ ACTIVE REFUELING
- State 6: Service has been completed
GSX Deboarding State - L:FSDT_GSX_DEBOARDING_STATE:
- State 1: Service can be called
- State 2: Service is not available
- State 3: Service has been bypassed
- State 4: Service has been requested ⭐ DEBOARDING REQUESTED
- State 5: Service is being performed ⭐ ACTIVE DEBOARDING
- State 6: Service has been completed
GSX Boarding Logic
When GSX integration is enabled:
- BoardingWelcome is triggered when
L:FSDT_GSX_BOARDING_STATE = 5(service being performed) - BoardingComplete is triggered when either:
- Beacon light turns on (traditional trigger)
L:FSDT_GSX_BOARDING_STATE = 6(service completed)- Whichever happens first provides the most realistic timing
- Automatic Fallback: If GSX is not available (not installed or not running), the system automatically falls back to logo light trigger
- Smart Detection: Uses
IsGSXAvailableto determine if GSX data is actually being received - Refueling variants: When
L:FSDT_GSX_REFUELING_STATE = 4 or 5(requested or being performed), sound files with [Refueling] tags are preferred over standard variants - Deboarding trigger: When
L:FSDT_GSX_DEBOARDING_STATE = 4 or 5(requested or being performed), DisembarkStarted announcement is triggered (supplements beacon light off trigger) - Automatic flight reset: When
L:FSDT_GSX_DEBOARDING_STATE = 6(deboarding completed), the flight state automatically resets for the next flight (no manual reset needed) - Provides more realistic timing aligned with actual ground service operations
When GSX integration is disabled:
- Traditional logo light trigger is used (
IsLogoLightOn=True) - [Refueling] sound variants are not selected
- Behavior remains unchanged from previous versions
- No dependency on GSX being installed or active
Manual Flight State Override Menu
The Universal Announcer provides a comprehensive manual flight state override system accessible via the system tray menu. This allows users to jump to any flight phase and get appropriate announcements for that stage of flight.
Menu Access
Right-click the system tray icon → Flight State submenu
Control Options
| Menu Option | Description | State Set |
|---|---|---|
| Resume | Resume all announcements (only shown when stopped) | Resumes automatic detection |
| Stop | Stop all announcements (only shown when running) | Pauses all announcements |
| Auto | Return to automatic flight state detection | null (automatic detection) |
| Restart | Reset state machine to beginning of flight sequence | Clears all played announcements |
Flight Phase Options
| Menu Option | Flight State | Announcements Marked as Played | What You’ll Get Next |
|---|---|---|---|
| Preflight | Preflight |
None | BoardingWelcome when logo light turns on |
| Taxi | Taxi |
BoardingWelcome, BoardingMusic, BoardingComplete | ArmDoors when engines start or aircraft moves |
| Takeoff | Takeoff |
BoardingWelcome, BoardingMusic, BoardingComplete, ArmDoors, PreSafetyBriefing, SafetyBriefing, CabinDimTakeoff | CrewSeatsTakeoff when landing/strobe lights turn on |
| Climb | Climb |
BoardingWelcome, BoardingMusic, BoardingComplete, ArmDoors, PreSafetyBriefing, SafetyBriefing, CabinDimTakeoff, CrewSeatsTakeoff, CallCabinSecureTakeoff | AfterTakeoff after 2 minutes at altitude > TakeoffDetectionAltitudeAGL (3,000 ft) |
| Cruise | Cruise |
All pre-cruise announcements (boarding through AfterTakeoff) | FastenSeatbelt when seatbelt sign turns on, DescentSeatbelts when descending |
| Descent | Descent |
All pre-descent announcements (boarding through AfterTakeoff) | DescentSeatbelts when below DescentDetectionAGL (10,000 ft) OR when landing lights just turned on |
| Approach | Approach |
All pre-approach announcements (boarding through AfterTakeoff) | CrewSeatsLanding when below CrewSeatsLandingAGL (3,000 ft) with landing lights |
| Landing | Landing |
All pre-landing announcements (boarding through CallCabinSecureLanding) | AfterLanding when on ground with spoilers retracted |
| Done | Done |
All announcements | No further announcements (flight complete) |
Landing Cabin Reactions
The system can automatically play cabin reaction sounds based on landing quality. This feature monitors landing parameters (vertical speed and G-force) and plays appropriate sounds:
- Great Landings: Smooth landings (≤200 fpm vertical speed, ≤1.2g) trigger applause sounds
- Terrible Landings: Hard landings (≥700 fpm vertical speed or ≥1.5g) trigger reaction sounds
Supported Sound Files:
LandingGreat.ogg- Played for smooth, well-executed landingsLandingTerrible.ogg- Played for hard or rough landings
These files support the same tagging system as other announcements:
- Aircraft-specific:
LandingGreat[A320].ogg,LandingTerrible[737].ogg - Numbered variants:
LandingGreat[1].ogg,LandingGreat[2].ogg - Location tags:
LandingGreat[KSFO].ogg,LandingTerrible[KJFK].ogg - Combined tags:
LandingGreat[A320][1].ogg
Files are searched in airline-specific folders first, then the Default folder. If no custom file is found, embedded default sounds are used.
Note: This feature can be enabled/disabled in Settings → Tweaks tab.