Facility Engineering

All of the configuration of vice is via JSON-formatted files. Extending vice to include more airports or additional scenarios is a matter of generating additional JSON that provides the necessary information.

In the following, the use of terms like "element", "object", "member", "array", etc., correspond to their use in the JSON specification. See this page for reference.

See the resources/scenarios/ directory in the vice source code for the scenarios that are currently available, the resources/configurations/ directory for facility configuration files (control positions, STARS config, and handoff topology), and the resources/videomaps/ directory for the video map definitions. Files in those directories with names ending with a "zst" suffix have been compressed using zstandard; in order to examine their contents, you'll want to install zstandard or another decompression program that supports that format.

Basics

When developing scenarios, you might make a copy of an existing scenario's JSON file and modify it in order to add more configurations, or you or might specify completely new scenario and video map files if you're working on support for a new TRACON. One way to try out your work is to open the "Settings" menu (shown by clicking the icon in the menu bar) and selecting "Scenario Files". There, you can specify the locations of additional scenario and/or video map files to load when vice is launched.


Alternatively, if you're comfortable with the command line, you can specify additional files with command-line arguments. On Windows, open up a command prompt and set the directory to the folder with the vice executable (generally, C:\Program Files (x86)\Vice. Then, run vice.exe -scenario path_to_scenario_file -videomap path_to_videomap_file. On MacOs, it's very similar: change the directory in the terminal to where Vice.app is located (often, /Applications/Vice.app, depending on where you installed it. Then, run ./Vice.app/Contents/MacOs/vice -scenario path_to_scenario_file -videomap path_to_videomap_file.

If you're editing an existing scenario, you may want to make a copy of it to a folder outside of resources/scenarios to edit it there. In that case, if the scenario given via the UI or command line has the same "name" value as an existing scenario, it will be used in place of the existing one.

When you're working on a new scenario, you may omit the "video_map_file" specifier in its JSON file. In this case, vice will automatically use the video map file you specified via -videomap or via the UI.

Facility Engineering FAQ

Question Answer
How do I get started? To get started creating a facility configuration file for vice, first read through the documentation provided below. (For starters, at least skim it to get the lay of the land.) Next you might look at a few existing scenarios: pick a scenario that you're familiar with as a user and look its scenario and facility code, cross referencing it with the documentation. As a first step, you could try making smaller changes to an existing scenario before you try developing a new scenario from scratch.
What's the difference between a scenario and a facility configuration? A scenario is a specific configuration of airports, active runways, and departure and arrival flows in a given facility (TRACON or ARTCC). Each scenario file may define one or more scenarios in a single facility and there may be multiple scenario files for a facility. (Especially for big and complex facilities, it is often useful to break all of their airports into multiple scenario files.) A facility configuration specifies information that applies to all airports in a facility and doesn't vary across scenarios (for example, the control positions, the assignments of controllers to departure and arrivals flows, etc.)
How do I see the installed scenarios and facility configuration files? First:
  • On Windows, open a file explorer and enter %APPDATA% for the folder to open. Then select Vice and then resources.
  • On Mac, go to the Finder and select "Go To Folder..." in the "Go" menu. Enter ~/Library/Application Support/Vice/resources.
  • On Linux, navigate to $HOME/.config/Vice.
Then, scenarios are found under scenarios and facility configurations under configurations.
Why am I getting an error like "The entry "departure_routes" is not an expected JSON object"? I see "departure_routes" in the documentation! Most likely, you have an error in the nesting of the { / } braces in your JSON file—in other words, you're missing a closing brace or have an extra closing brace somewhere such that the entry it's complaining about is inside a different object than it's supposed to be.
How can I submit one of my scenarios? The easiest way is to post it in the scenario-updates channel in the vice Discord. If you're comfortable with GitHub, you're welcome to fork the vice repository and make a pull request. Don't forget to include any updates to facility configuration files or video maps!
How can I get the lat/long coordinates of a point on a map? Pressing [Control][Shift] and clicking a point on the map will copy the coordinates of where you clicked into the clipboard. Alternatively, you can enter .DRAWROUTE[Enter] in STARS and click a series of points. All of the points in the route will be copied to the clipboard. If you make a mistake, pressing [Backspace] will delete the last point in the route. Press [Escape] to exit this mode.

Specifying Locations

Throughout the vice configuration files, it's often necessary to specify various locations on the Earth. vice has a built-in database of all of the airports, VORs, NDBs, and fixes in the United States (courtesy of the FAA), which allows using these directly for specifying locations. The locations of runway thresholds are available via the syntax KJFK-22L where the airport name and runway specifier are separated by a hyphen.

Locations can also be specified via latitude-longitude positions, given as strings. For convenience, multiple latitude-longitude formats are supported.

Encoding Description Example
Name of VOR/NDB/fix A string giving the name of an airport, VOR, NDB, or fix in the United States. "JFK"
Decimal value pair A pair of decimal numbers where the first specifies the latitude and the second specifies the longitude. "40.6328888,-73.771385"
Degrees minutes Latitude encoded with 4 digits representing degrees and minutes (sixtieths of a degree), followed by "N" or "S", followed by a slash and then 5 digits representing degrees and minutes longitude, followed by "E" or "W". "4037N/07346W"
Degrees, minutes, seconds A pair of values with position specified in degrees, minutes, and seconds, separated by periods. "N" and "S" are used to distinguish North and South latitudes and similarly for "E" and "W" with longitudes. "N40.37.58.400,W073.46.17.000"
ISO6790 Annex H A more compact degrees/minutes/seconds representation; see the Wikipedia page for details. "+403758.400-0734617.000"

(In all of the examples above, the location specified is the same—the JFK VOR.)

In vice, if you hold down the control and shift keys and click on a point on the video map, the corresponding latitude-longitude position is copied to the clipboard—this can be very useful when developing new scenarios!

Running a Server Locally

If you're working on multi-controller support for a scenario, you may want to run a vice server locally to debug it. A few command-line options are useful:

  • -runserver launches a vice server on your local system
  • -server specifies the IP address and (optionally), the port of a vice server to connect to. Specifying localhost will connect to a local server launched via -runserver.
  • -port allows specifying a custom port number for the server to listen to. If this is used, then the address supplied to -server should be of the form hostname:port.

Windows Example: Running a Local Multi-Controller Server

Here's a step-by-step guide for testing multi-controller scenarios on Windows:

  1. Launch Command Prompt: Press the Windows key, type "cmd" in the search box, and press Enter.
  2. Navigate to the vice directory: Enter cd "c:\Program Files (x86)\Vice"
    Note: The quotes are essential if the path contains spaces.
  3. Start the multi-controller server: Enter enter vice.exe -runserver
    If there are errors in your scenario configuration, they will be displayed here. Otherwise, the server launches and will be running in the background.
  4. Launch the first controller instance: Enter vice.exe -server localhost
    This launches vice connected to your local server. In the "New Simulation" window, you'll see the option to "Create multi-controller" simulation.
  5. Launch additional controller instances: For each additional controller position, open another Command Prompt and enter: vice.exe -server localhost
    Each new instance can connect to the simulation created by the first controller. You'll be able to perform handoffs and coordinate between the different controller positions by switching between the vice windows.

Restarting after scenario changes: If you modify your scenario files, you must restart the server to load the changes:

  1. Close all vice client windows
  2. Press Ctrl+Shift+Esc to open the Task Manager
  3. Click the "Details" tab and look for "vice.exe" in the list to find the server
  4. Select it and click "End task"
  5. Return to step 2 above to restart the server with your updated scenario

Routes

When an aircraft's route is given, vice allows airways to be used to describe the route, which simplifies the route specification when an aircraft is in fact flying along an airway. Airways are given as part of the route; for example "WHITE V1 DPK" has the aircraft join V1 departing WHITE and follow V1 until DPK. (The alternative, "WHITE DIXIE MOVFA JFK DPK", is more typing and more error-prone to enter.)

vice uses a custom syntax for specifying the routes of aircraft that allows giving additional information that is used in the simulation. In addition to the lateral positions along the route, it is possibly to specify speed and altitude restrictions, handoff points, and headings to fly.

Here is an example route from a JFK departure. The first two fixes along the departure runway are automatically provided by vice so the route starts with the specified fixes in the departure procedure. The "/h223" after "RNGRR" specifies that the aircraft should fly a 223 heading as departing RNGRR. It will maintain that heading until it is further vectored by the controller. If there are further fixes after such a heading, the aircraft may be sent direct to one of those fixes by the controller.

                "SKORR METSS RNGRR/h223"
              

A variety of such things can be specified along with a fix:

  • /arestriction: for IFR routes, cross the fix with the specified altitude restriction (with altitudes specified in 100s of feet). For VFR, aircraft will be at a random altitude within a given altitude range. The following options are available for specifying altitude restrictions:
    • low-high: cross at an altitude between low and high.
    • alt-: cross at or below alt.
    • alt+: cross at or above alt.
    • alt: cross at alt.
  • /delete: the aircraft will be deleted when it reaches the fix
  • /hheading: depart the fix at specified heading
  • /lheading: turn left to the specified heading at the fix
  • /rheading: turn right to the specified heading at the fix
  • /iaf: indicates that the fix is an IAF (initial approach fix)
  • /if: indicates that the fix is the IF (intermediate fix)
  • /faf: indicates that the fix is the FAF (final approach fix). This must be specified for one fix in each approach.
  • /flyover: indicates that the fix is a flyover fix (as opposed to the default, fly-by). Aircraft must pass directly over flyover fixes before turning to the next fix, while they may turn early with fly-by fixes.
  • /ph: fly present heading (rounded to the nearest 5 degree increment) departing the fix.
  • /sspeed: cross the fix at the given speed
  • /caltitude: climb to the specified altitude (in 100s of feet, between 0 and 600) when passing the waypoint, as if the controller issued that instruction. Cannot be combined with /d at the same waypoint.
  • /daltitude: descend to the specified altitude (in 100s of feet, between 0 and 600) when passing the waypoint, as if the controller issued that instruction. Cannot be combined with /c at the same waypoint.

A number of specifiers are intended for ambient traffic that's not under the control for a human:

  • /clearapp: the aircraft will be cleared for the assigned approach passing the fix.
  • /ho: the aircraft should be handed off from the virtual controller when it passes the fix. A TCP may be specified after /ho, in which case the aircraft is handed off to the corresponding virtual controller. If no TCP is specified, the aircraft is handed off to the appropriate human controller.
  • /tc: "transfer comms": after passing a /ho fix, normally aircraft call in a few seconds after the human controller accepts the handoff. However, if /tc is specified at a later fix in the route, they won't contact the controller until reaching that fix. Additionally, this can be used in departure routes to signify a specific fix at which aircraft should contact the departure controller.
  • /poTCP id: when the aircraft passes the fix and if it is under the control of a virtual controller, issue a point out to the controller identified by the given TCP id (i.e., the controller ID that would be used when doing a point out in STARS.)
  • /radiusnum: rather than flying precisely to the fix, the aircraft will fly to a random point within num miles of the fix.
  • /shiftnum: rather than flying precisely to the fix, the aircraft will fly along the route to the fix but will turn for the next fix at a random distance before or after the fix, up to num/2 nautical miles in each direction.
  • /spspscratchpad: sets the aircraft's primary scratchpad to the given value.
  • /ssspscratchpad: sets the aircraft's secondary scratchpad to the given value.
  • /cpsp: clears the aircraft's primary scratchpad
  • /cssp: clears the aircraft's secondary scratchpad

In addition to /radius and /shift, which are also useful for randomizing VFR routes, there's an additional specifier that can be used with VFR aircraft routes:

  • /airwork: the aircraft should perform airwork centered around the fix. An altitude restriction must be specified using /a to give an altitude range for the airwork. By default, they will do so for 15 minutes and remain within 7nm of the fix; alternatively, the time or distance may be specified via /airworkradiusnm and/or /airworkminutesm. For example: /airwork30m10nm specifies 30 minutes of airwork within a 10nm radius of the fix.

If the aircraft should follow an arc leaving a fix, /arc can be given after the fix. It can be used in two ways:

  • Both a radius in nautical miles as well as the fix at the center of the arc's circle can be specified. For example, HANAV/arc16OMN specifies a 16nm radius arc centered at OMN.
  • Alternatively, just the length of the arc may be given. For example, WUPMA/arc7.5 ALABE has aircraft fly along the 7.5nm long arc between WUPMA and ALABE.

For both uses, the direction of the arc is automatically determined based on the position of the following fix.

For approach fixes that have procedure turns, a number of additional items can be specified:

  • /hilpt: there is a hold in lieu of procedure turn (i.e., a racetrack procedure turn) associated with the fix. The default is right turns and a 1 minute limit for ILS/VOR/LOC approaches and a 4 nm limit for RNAV approaches. Different limits can be specified directly; for example /hilpt6nm gives a procedure turn with a 6 nm limit and /hilpt2min specifies a 2 minute limit. For left turns, add a l after the slash, like /lhilpt.
  • /pt45: specifies that there is a standard 45 degree procedure turn at the fix. (This has the same defaults— right turns, 1 minute (ILS/VOR/LOC) / 4 nm (RNAV)—as HILPTs. Alternative values are specified the same way.)
  • /ptaaltitude: if the aircraft should descend during the procedure turn, this can be used to specify the final altitude it should have at the end of the turn. (The altitude should be given in 100s of feet.)
  • /nopt180: specifies that aircraft approaching the fix in the 180 degree semicircle of directions aligned with the final approach course should not perform the procedure turn. (As an example, see the KJAX RNAV Z 8 approach; this applies for aircraft between heading 346 and 166 arriving at UDAQI.)
  • /nopt: when specified at a fix prior to one with a procedure turn, indicates that aircraft that pass that fix should not fly the procedure turn.

Airlines and Aircraft

Departures, arrivals, and overflights all need to know about which airlines fly their routes and which aircraft they use for them. Airlines are specified via objects with the following members: for the database of possible airlines. In that file, each airline may have one or more aircraft fleets specified, in its "fleets" member.

Element Type Description
"fleet" String (Optional) If specified, gives the fleet of the airline's aircraft that are used for this overflight.
"icao" String The ICAO code of the airline (which must be present in vice's openscope-airlines.json file.)
"types" Array of strings (Optional) If specified, gives one or more aircraft types to use. It is not allowed to specify both "fleet" and "types".

If neither "fleet" nor "types" is specified, vice randomly chooses an aircraft type from the "default" fleet, but if a particular fleet's aircraft is a better match to a route, you may want to use it or to specify aircraft types directly. For example, AAL's "long" fleet would be a good choice for trans-Atlantic flights.

For reference, the available types of aircraft and their performance characteristics are available in the openscope-aircraft.json file.

As is probably obvious, both of these databases are by way of openScope, which kindly made them available under the MIT license.

Emergencies

Emergency aircraft can be configured to randomly occur during simulation sessions. The file resources/emergencies.json is used to store information about the possible emergencies, including what phase of flight they apply to, what radio transmissions pilots will make over the course of them, and what they will ask of ATC. That file contains an array of emergency specifications, each with the following members:

Field Type Description
applicable_to String Which phase(s) of flight the emergency applies to, should be one or more of "departure", "arrival", "external", or "approach" (comma-separated for multiple).
  • "departure": Departures within 15nm of departure airport
  • "arrival": Arrivals that have not been cleared for the approach
  • "approach": Arrivals that have been cleared for the approach
  • "external": Inbound arrivals that are handed off from an external facility (and presumed to have already declared an emergency).
name String Human-readable name of the emergency, must be unique across other emergencies.
stages Array of objects Defines how the emergency unfolds over time.
weight Number (Optional) Relative probability of this emergency occurring (default: 1.0). Higher values make the emergency happen more often.

The emergency stages array in "stages" contains objects that define stages of the emergency. For example, this allows aircraft to ask for vectors to troubleshoot before either resolving a situation or going ahead and declaring an emergency. The objects have this structure:

Field Type Description
checklists Boolean (Optional) If true, the transmission will include a statement that the pilots will need some time to run through checklists.
declare_emergency Boolean (Optional) If true, the aircraft goes ahead and declares an emergency.
duration_minutes Array of 2 integers Range [min, max] for how long to remain in this stage before advancing to next stage. Required except for the final stage, since there is no next stage.
request_delay_vectors Boolean (Optional) If true, a request for delay vectors will be added to the aircraft's transmission.
request_equipment Boolean (Optional) If true, the aircraft will request emergency equipment to be standing by when they arrive.
request_return Boolean (Optional) If true, the aircraft will request at this stage to return to their departure airport. An automatically-generated return request will be added at the end of any transmission specified for them.
stop_climb Boolean (Optional) If true and aircraft is climbing, adds a transmission notifying the controller that the aircraft will be stopping its climb. (The altitude used will be the next higher altitude that's a multiple of 1,000 feet.)
transmission String Radio transmission text. Multiple phraseology alternatives can be specified using bracket notation: [option1|option2|option3]; if this is used, one of the alternatives will be randomly selected when the transmission is made. For example: "[we have a|we've got a] gear unsafe indication" will randomly say either "we have a gear unsafe indication" or "we've got a gear unsafe indication". The transmission field may be omitted if "request_return" is true, in which case the transmission will consist only of the return-to-field request.

Here is an example of an emergency with two stages: a departing aircraft will level off and ask for delay vectors. After 5-10 minutes, it will request to return to the departure airport.

{
    "name": "Landing Gear Retraction Failure",
    "applicable_to": "departure",
    "stages": [
        {
        "transmission": "we have a gear unsafe indication, requesting delay vectors to troubleshoot",
            "stop_climb": true,
            "duration_minutes": [5, 10]
        },
        {
            "transmission": "gear situation unresolved",
            "request_return": true
        }
    ]
}

Here is an example of an emergency that applies to multiple phases of flight:

{
    "name": "Medical Emergency",
    "applicable_to": "arrival,departure,approach",
    "stages": [
        {
            "transmission": "medical emergency, request EMTs at the gate",
            "request_return": true
        }
    ]
}

Speech

vice includes JSON files that map aviation terms to spoken pronunciations. These mappings are used for both speech-to-text recognition (understanding what a controller says) and text-to-speech synthesis (generating spoken responses from pilots). The files are stored in the resources/ directory.

File Key Type Value Type
sayairport.json ICAO airport codes Array of strings (multiple alternatives)
sayairline.json Airline names String
sayactype.json Aircraft type codes Array of strings
sayfix.json Fix/navaid names String
saysid.json SID names String
saystar.json STAR names String

Files with array values (airports, aircraft types) allow random selection among variants for more natural-sounding speech. Files with single string values have one canonical pronunciation.

Facility Configuration

Facility Configuration

Facility-wide settings are defined in separate JSON files, stored in the resources/configurations/ directory. They're organized by ARTCC and facility name (e.g., resources/configurations/ZNY/N90.json). When a scenario is loaded, vice automatically loads the corresponding facility configuration based on the scenario's "tracon" field.

Each facility configuration file may contain the following top-level elements:

Element Type Description
"facility_adaptations" Object Defines settings and configurations for the facility. See the Common, ERAM, and STARS subsections for documentation about the items stored in this object.
"control_positions" Object

Information about all of the controllers at the facility. Each member specifies a controller for the named position/sector; the sector id of the control position is the key of the object. For each position, the following members should be specified:

"control_positions" members
ElementTypeDescription
"area" String (Optional) The area for this controller. For TRACON controllers, this is auto-derived from the first digit of the position id. For ERAM controllers, it must be specified manually.
"callsign" String (Optional) A human-readable callsign for the position (e.g., "PHL_NA_APP").
"facility" String (Optional) The STARS facility identifier for the controller.
"frequency" Number The controller's radio frequency, expressed as an integer (e.g., 125325 for 125.325).
"radio_name" String The name of the control position, used in radio readbacks (e.g., "Philadelphia approach").
"scope_char" String (Optional) A single character for the STARS position symbol for tracks owned by this position (e.g., "C"). If unset, the position symbol is generated automatically: for local positions, the last character of the TCP id ("4P" gets "P"); for positions at external facilities, the numeric "facility_id"; for enroute controllers (in ARTCC configs), the first character of their sector id ("N56" gets "N"). An error is issued if the given "scope_char" is the same as vice would have automatically selected.
"fix_pairs" Array of objects

Defines fix pair rules for fine-grained aircraft routing assignments. Each object specifies an entry/exit fix combination with optional constraints.

"fix_pairs" members
ElementTypeDescription
"altitude_range" Array of two numbers (Optional) Altitude range [floor, ceiling] in feet. If omitted or [0,0], no altitude constraint.
"entry_fix" String The entry fix name. Empty string matches any entry fix.
"exit_fix" String The exit fix name. Empty string matches any exit fix.
"flight_type" String (Optional) "A" for arrivals, "P" for departures, "E" for overflights. If omitted, matches any type.
"priority" Number The match priority; lower numbers are higher priority. Must be unique per configuration.
"handoff_ids" Array

An array of objects identifying neighboring facilities and mapping them to short position identifiers used in handoff route specifications (e.g., /ho1Z). Controllers from each listed facility are loaded and may participate in handoffs.

"handoff_ids" members
Element Type Description
"field_e_format" String Specifies the Field E format for identifying a TRACON neighbor from an ARTCC. Must be one of: "OneLetterAndSubset", "OneLetterAndStarsIdOnly", "TwoLetters", "TwoLettersAndSubset", or "FullStarsIdOnly".
"field_e_letter" String A single character used in Field E identification for the facility.
"id" String The facility code of the neighbor (e.g., "MKE", "ZAU"). Required.
"prefix" String A short prefix for the facility, used when referencing ARTCC sectors or TRACON sectors as a TRACON. For ARTCC neighbors this is a letter (e.g., "G" for ZAU); for TRACON neighbors this is a digit (e.g., "1"). Cannot be used in conjunction with "stars_id", "single_char_stars_id", or "two_char_stars_id".
"single_char_stars_id" String A one-character STARS identifier for the facility (e.g., "A"). Used when referencing a TRACON from an ARTCC. Cannot be used in conjunction with "prefix".
"stars_id" String The full STARS identifier for the facility (e.g., "N90"). Used when referencing a TRACON from an ARTCC. Cannot be used in conjunction with "prefix".
"two_char_stars_id" String A two-character STARS identifier. Used when referencing a TRACON from an ARTCC. Cannot be used in conjunction with "prefix".

Common

The following settings in the "facility_adaptations" object of the facility configuration file apply to all scope types:

Element Type Description
"areas" Object

Defines per-area configuration for TRACON areas. Each key is the area number (e.g., "1", "2", "3") corresponding to the first digit of the control positions assigned to that area. The following properties may be specified for each area:

"areas" members
ElementTypeDescription
"airspace" Object Maps controller identifiers to arrays of airspace volumes. Used to define controller-specific airspace boundaries for the area.
"beacon_code_blocks" String Comma-separated beacon code banks or discrete codes to monitor by default for controllers in this area.
"center" String The initial center of the STARS scope for controllers in this area. This is overridden by any center specified in "controllers" and overrides the top-level "center" in the facility configuration.
"coordination_lists" Array of objects Coordination list objects for this area, following the same format as the top-level "coordination" lists.
"default_airport" String The CRDA default airport for this area.
"default_maps" Array of strings Specifies which of the video maps should be initially displayed.
"video_map_file" String Overrides the facility-level "video_map_file" for controllers in this area. When specified, video maps for this area are loaded from the given file instead of the facility-level video map library.
"flight_following_airspace" Array of objects Airspace volumes for flight following in this area.
"range" Number The initial range for the scope in nautical miles. This is overridden by any range specified in "controllers" and overrides the top-level "range" in the facility configuration.
"scratchpads" Map of strings to strings Per-area scratchpad assignments, overriding the facility-level "scratchpads" for controllers in this area. Same format as the top-level scratchpads map.
"airspace_awareness" Array of objects Per-area airspace awareness rules that take priority over the facility-level "airspace_awareness" for controllers in this area. Same format as the top-level airspace awareness array. Area entries are checked first; facility-level entries are used as fallback for fixes not matched by area entries.
"video_maps" Array of strings The available video maps shown in the STARS DCB for controllers in this area. The first 6 are shown in the main DCB and all are available under the "MAPS" sub-menu. An empty string, "", may be given to specify an empty map button in the DCB. No more than 38 maps may be specified. Run vice.exe -listmaps [path-to-XXX-videomaps.gob.zst] to list the available maps for an ARTCC.
"center" String Default radar scope center (as a latitude-longitude position.)
"configurations" Object Defines facility configurations that can be referenced by scenarios. Each key is a short identifier (maximum 3 characters) for the configuration, and the value is an object with the following members: These configurations allow multiple scenarios to share the same assignment definitions, reducing duplication when only the consolidation hierarchy differs between scenarios. The TCPs referenced in assignments must exist in "control_positions" in the facility configuration. It is acceptable for a configuration to include assignments for flows or departures that a particular scenario doesn't use; only the assignments needed by the scenario's active arrivals and departures are required.
"configurations" members
ElementTypeDescription
"default_consolidation" Object Defines the consolidation hierarchy. Each key is a parent TCP, and its value is an array of TCPs that are consolidated into it. For example: {"1A": ["1B", "1C"], "1C": ["1D"]} means 1B and 1C are consolidated into 1A, and 1D is consolidated into 1C (and transitively into 1A). All positions that are covered by humans must be present exactly once in the consolidation hierarchy. All positions must eventually consolidate into a single root position; this is the primary controller for the scenario.
"departure_assignments" Object Maps from strings denoting departures to the TCP responsible for them. Each string can be an airport name ("KJFK"), a slash-separated airport name and runway ("KJFK/22R"), or a slash-separated airport name and SID ("KJFK/SKORR5"). It is not allowed to specify runway and SID departure selections at an airport, however the airport name alone may be given as a catch-all for any unspecified runways/SIDs if that method is used.
"fix_pair_assignments" Array of objects (Optional) Maps fix pair rules to controllers. Each object has "tcp" (the controller to assign) and "priority" (matching priority; lower is higher). These reference the fix pair definitions from the top-level "fix_pairs" in the facility config.
"go_around_assignments" Object (Optional) Maps airports or airport/runway combinations to the TCP that should handle go-arounds. Keys can be airport name ("KJFK") or airport/runway ("KJFK/22L") for per-runway specification. If not specified for an airport/runway, the departure controller for that airport is used.
"inbound_assignments" Object Maps inbound flow names to the TCP that handles them. This determines where handoffs of inbound aircraft go.
"scratchpad_leader_line_directions" Map of strings to strings (Optional) Maps primary scratchpad values to leader line directions. Keys are scratchpad strings (subject to standard scratchpad validation rules) and values are cardinal/ordinal direction strings: "N", "NE", "E", "SE", "S", "SW", "W", or "NW". When an aircraft has a matching primary scratchpad, the specified direction is used for the leader line. This takes effect after per-aircraft and FDAM direction overrides but before controller default directions.
"controllers" Object

Each entry specifies controller-specific configuration properties. The applicable control positions are specified via members given as a TCP position (e.g., "2G"). The following properties may be specified for each one:

"controllers" members
ElementTypeDescription
"beacon_code_blocks" String A comma-separated list of beacon code banks (two digits) or discrete beacon codes (four digits) that should be monitored by default.
"center" String The initial center of the controller's STARS scope. This takes highest priority, overriding "areas" center and the top-level center.
"default_maps" Array of strings Specifies which maps in "video_maps" should be initially displayed.
"flight_following_airspace" Array of objects Regions of airspace (both lateral and vertical) following the form that is used for defining filter regions. (In this case, "id" and "description" are optional.) Only VFR aircraft within the specified region will call the controller for flight following.
"range" Number The initial range for the controller's scope in nautical miles. This takes highest priority, overriding "areas" range and the top-level range.
"video_maps" Array of strings Specifies which video maps should be displayed in the DCB for the controller. If specified, these override the area-level "video_maps" in "areas".
"max_distance" Number Maximum distance in nautical miles from center before aircraft are deleted. If unspecified, the default is 125 nautical miles for STARS facilities and 400 nautical miles for ERAM facilities.
"range" Number Default radar scope center range in nautical miles. If unspecified, a 50 mile range is the default.
"video_map_file" String Filename of the video map file from which the video maps are found (e.g., "videomaps/ZNY-videomaps.gob.zst")

ERAM

The following setting in the "facility_adaptations" object is specific to the ERAM radar scope:

Element Type Description
"airport_codes" Map of strings to strings Assigns a letter to an airport to display in an ERAM datablock.

STARS

The following settings in the "facility_adaptations" object are specific to the STARS radar scope:

Element Type Description
"airspace_awareness" Array of objects

Each of these objects specifies an airspace awareness rule for a TRACON. Each object has the following members:

"airspace_awareness" members
ElementTypeDescription
"aircraft_type" Array of strings (Optional) Allowed aircraft types for the rule: "P" for props, "T" for turboprops/turboshafts, and "J" for jets.
"altitude_range" Array of two numbers (Optional) The cruising altitude range an aircraft must have for this rule to apply.
"fixes" Array of strings The fixes an aircraft could be filed on for this rule to apply. If "ALL" is given, all fixes match.
"receiving_controller" String The sector ID of the controller that will receive aircraft matching this rule.
"coordination_fixes" Object

Each member maps a fix name to an array of coordination fix definitions.

"coordination_fixes" members
ElementTypeDescription
"altitude" Array of two numbers The altitude range [floor, ceiling] in feet.
"from" String The controller initiating the handoff.
"to" String The controller receiving the handoff.
"type" String The type of coordination (e.g., "route", "radar").
"datablocks" Object Configures datablock display behavior.
"datablocks" members

The "datablocks" object configures how full, partial, and limited datablocks are displayed. It contains the following sub-objects:

ElementTypeDescription
"allow_long_scratchpad" Boolean This indicates whether aircraft scratchpads may be four characters long (rather than the default of three).
"custom_spcs" Array of strings Custom special purpose codes for the facility. When assigned to an aircraft, these are displayed in yellow at the top of the datablock (e.g., "PJ" is used at some facilities for parachute jumps.)
"display_rnav_symbol" Boolean (Optional) If true, the "is_rnav" setting in departure routes, arrivals, and overflights will cause the RNAV flag to be set in aircraft flight plans when they spawn.
"fdb"ObjectFull Datablock
"fdb" members
ElementTypeDescription
"accept_flash_duration" Number The number of seconds that the datablock flashes after a handoff is accepted. Default: 5.
"display_facility_only" Boolean If true, the sector id of external facilities is not shown in the datablock for inbound and outbound handoffs. Default: false.
"display_requested_altitude" Boolean If true, the requested altitudes of aircraft that have them in their flight plans are shown in the datablock (multiplexed with aircraft type and groundspeed). Default: false.
"scratchpad2_on_line3" Boolean If true, when scratchpad 2 is set, it is displayed in the third line of the datablock (and timeshares with assigned altitude, if set) rather than timesharing with altitude and the first scratchpad in the second line. Default: false.
"sector_display_duration" Number If non-zero, gives the number of seconds that the sector id for a handoff to/from an external facility is shown in the datablock after the handoff has been accepted.
"force_ql_self" Boolean Indicates whether controllers may enter **[SLEW] to make a track appear yellow on their own scope.
"ldb"ObjectLimited Datablock
"ldb" members
ElementTypeDescription
"full_seconds" Number If non-zero, gives the number of seconds that a full datablock is displayed after being expanded from a limited datablock (via [MULTIFUNC]L) before reverting to the limited datablock.
"keep_after_slew" Boolean If true, limited datablocks are retained for tracks that have been given the limited datablock display rather than reverting to the partial datablock. Default: false.
"pdb"ObjectPartial Datablock
"pdb" members
ElementTypeDescription
"display_custom_spcs" Boolean If true, custom SPCs (defined via "custom_spcs") are shown in partial datablocks. Default: false.
"hide_gs" Boolean If true, groundspeed is not shown in the PDB. Default: false.
"show_aircraft_type" Boolean If true, the aircraft type is shown, time-shared with the groundspeed. Default: false.
"show_scratchpad2" Boolean If true, the contents of scratchpad 2 are shown, time-shared with altitude and the first scratchpad. Default: false.
"split_gs_and_cwt" Boolean If true, groundspeed and the flight rules / CWT category are shown separately, timesliced, rather than together. Default: false.
"scratchpad1"ObjectScratchpad 1 Display
"scratchpad1" members
ElementTypeDescription
"display_alternate_exit_gate" Boolean If true, the datablock displays the requested altitude followed by a single-character identifier for the exit gate. All other details follow "display_exit_gate". Default: false.
"display_exit_fix" Boolean If true, the datablock displays a three-character identifier for the exit fix where the identifier is found from the "short_name" entry for the fix in "significant_points". Default: false.
"display_exit_fix_1" Boolean If true, the datablock displays a one-character identifier for the exit fix where the identifier is found from the "abbreviation" entry for the fix in "significant_points". Default: false.
"display_exit_gate" Boolean If true, the datablock displays a single-character identifier for the exit gate and then two digits giving the requested altitude in thousands of feet. The exit gate should be listed in "significant_points"; its "abbreviation" value is used for the identifier. If four-character scratchpads are adapted, three digits giving the altitude in hundreds of feet are displayed. Default: false.
"filters" Objects Each member of this object defines a filter region inside which STARS applies special rules to aircraft.
"filters" members
ElementDescription
"arrival_drop" When an arrival enters one of the specified filters, their flight plan disassociates from the aircraft and is deleted. A default volume of 2nm radius up to 500' AGL around each arrival airport is generated if no filters are specified.
"auto_acquisition" When an aircraft enters this filter region, its flight plan associates (if available), even if it is still controlled by an external controller and a handoff hasn't been initiated.
"departure" If a departing flight in a departure filter is squawking a code other than 1200 and there is no flight plan for that squawk code, "WHO" is displayed in its datablock. The default volumes are 3nm circles from ground level to 500' AGL around the airport.
"fdam" Flight Data Auto-Modify regions. When an associated track enters an enabled FDAM region and matches its qualifying attributes, adapted entry actions are automatically applied (scratchpad changes, leader direction changes, handoff initiation, ownership transfer, or force quicklook). When the track exits, selected changes can be reverted. See the FDAM section below for the full list of fields.
"inhibit_ca" Collision alerts are disabled for aircraft within the filter's volume. These are especially useful around airports so that alerts aren't issued for aircraft arriving/departing on parallel runways, for example. If not specified, a default volume of a circle with a 5nm radius going up to 3,000' AGL around each airport is used.
"inhibit_msaw" Minimum safe altitude warnings (MSAW) are disabled for aircraft within the filter's volume. Like "inhibit_ca", this is also useful around airports and a volume of a 5nm radius circle going up to 3,000' AGL around each airport is used if none are specified.
"quicklook" The full datablock of any tracks owned by another controller is displayed rather than the partial datablock for tracks in the filter region.
"secondary_drop" If an associated track exits a secondary drop filter region, is controlled by a controller outside of the TRACON, and was previously controlled by a controller inside the current TRACON, its flight plan disassociates and is deleted. (Note that the test is that it exits the region, unlike the others that check for being inside the region. Secondary drop regions are thus often specified along the boundary of a TRACON.) There are no default "secondary_drop" filters.
"surface_tracking" Defines a region of airspace off the ground at airports where radar tracks are not shown. By default, up to 250' AGL 1.5nm around each airport.
"vfr_inhibit" Random VFR routes will not be generated through this filter's airspace.

STARS uses filter regions to manage a number of behaviors that are enabled or disabled depending on whether an aircraft's track is within particular volumes of space. These regions are defined under "filters" in the config object. As an example, the "inhibit_ca" filter is used to disable collision alerts close to airports so that spurious alerts aren't issued between departing and arriving aircraft. The lateral extent of filter volumes volumes can be defined either with a polygon or a circle and their vertical extent is given by a single range of altitudes. The following volume object is used to specify them.

The following members are used for all filter region types:

ElementTypeDescription
"ceiling" Number The maximum altitude of the volume.
"center" Location (Circle only) The location of the center of the volume.
"cwt_category" String (Quicklook/FDAM only) A single letter from "A" through "I" matching the aircraft's CWT category, where "A" is the heaviest (e.g. A380) and "I" is the lightest (small aircraft).
"description" String A longer string used to identify the volume in system lists.
"entry_fix" String (Quicklook/FDAM only) Comma-delimited list of fix names. The aircraft's entry fix must be one of them (aircraft with no entry fix set are not excluded).
"exit_fix" String (Quicklook/FDAM only) Comma-delimited list of fix names. The aircraft's exit fix must be one of them (aircraft with no exit fix set are not excluded).
"flight_rules" String (Quicklook/FDAM only) "V" for VFR only, "I" for IFR only, or "B" (or empty) for both.
"flight_type" String (Quicklook/FDAM only) One of "arrival", "departure", or "overflight". If set, only aircraft of that flight type match.
"floor" Number The minimum altitude of the volume.
"holes" Array of arrays of locations (Polygon only) (Optional) Each inner array defines a hole (exclusion zone) within the polygon volume.
"id" String A short string (no more than 7 characters) used to identify the volume. IDs must be provided for all filter regions and must be unique among the filter regions of the same type.
"owning_tcp" String (Quicklook/FDAM only) Comma-delimited list of TCP identifiers. The aircraft's tracking controller must be one of them.
"radius" Number (Circle only) The radius of the volume, in nautical miles.
"requested_altitude" String (Quicklook/FDAM only) Comma-delimited list of altitudes or ranges, in hundreds of feet. Each element is either a single value (e.g. "40" for 4,000') or a range ("100-180" for FL100–FL180). The aircraft's requested altitude must fall in one of the specified values or ranges.
"scratchpad" String (Quicklook/FDAM only) Comma-delimited list of scratchpad values. The aircraft's scratchpad must match one of them.
"secondary_scratchpad" String (Quicklook/FDAM only) Comma-delimited list of secondary scratchpad values. The aircraft's secondary scratchpad must match one of them.
"ssr_codes" String (Quicklook/FDAM only) Comma-delimited list of SSR codes or ranges. Each element is either a single four-digit octal code (e.g. "1200") or a range ("1300-1377"). The aircraft's assigned squawk must fall in one of the specified codes or ranges.
"tcps" String (Quicklook/FDAM only) Comma-delimited list of TCP identifiers (local positions only), or "ALL" for all local positions. The filter only applies if the user is signed in to one of the listed positions.
"type" String Either "circle" or "polygon".
"vertices" Array of locations (Polygon only) Polygon vertex locations specifying the outline of the volume.

For polygonal filter volumes, the last vertex and the first vertex will automatically be connected; it's not necessary to close the polygon yourself.

"fdam" members
ElementTypeDescription
"allow_scratchpad_1_override" Boolean (Entry) If true, the adapted scratchpad replaces any existing value. If false (the default), the scratchpad is only set if the track's current scratchpad is empty.
"allow_scratchpad_2_override" Boolean (Entry) Same override behavior as above, for the secondary scratchpad.
"handoff_initiate_transfer" String (Entry) One of "I" (initiate handoff), "T" (transfer ownership immediately), or "N"/"" (no action). Used together with "new_owner_tcp".
"immediate_pointout" Boolean (Entry) If true, a force quicklook (immediate pointout) is sent to each TCP listed in "pointout_tcps" when the track enters the region.
"new_owner_leader_direction" String (Entry) Cardinal or ordinal direction for the owning controller's leader line (e.g. "N", "NE", "S", "SW"). The direction is set on entry for all TCWs displaying the track.
"new_owner_tcp" String (Entry) TCP identifier. When "handoff_initiate_transfer" is "I", a handoff is initiated to this TCP. When it is "T", ownership is transferred directly.
"new_scratchpad_1" String (Entry) String to assign to the track's primary scratchpad on entry. Use "-" to clear an existing scratchpad.
"new_scratchpad_2" String (Entry) String to assign to the track's secondary scratchpad on entry. Use "-" to clear.
"new_tcp_specific_leader_direction" String (Entry) Leader line direction to set for the TCPs listed in "pointout_tcps".
"pointout_tcps" String (Entry) Comma-delimited list of TCP identifiers that receive force quicklook events and/or TCP-specific leader direction changes on entry.
"retain_owner_leader_direction" Boolean (Exit) If false (the default), the owning controller's leader line direction reverts to its pre-entry value when the track exits. If true, the direction set on entry is kept.
"retain_tcp_specific_leader_direction" Boolean (Exit) Same retain/revert behavior for the TCP-specific leader directions set via "pointout_tcps".
"flight_plan" Object

Allows specifying various adapted configurations for STARS flight plans. The following members are available:

"flight_plan" members
ElementTypeDescription
"acid_expansions" Map of strings to strings Maps single-character abbreviations to ACID prefixes. When an aircraft ACID starts with one of the specified characters, the character is expanded to the full prefix. Valid abbreviation characters are A-Z, 0-9, +, ., *, ^, or /.
"modify_after_display" Boolean If set, then after a flight plan is displayed with the [MULTIFUNC]D command, an element in the flight plan can be immediately modified, as if [MULTIFUNC]M had been entered.
"quick_acid" String The up-to-3 character callsign that is used when a quick flight plan is generated for an aircraft by entering "Y" and slewing it. A unique integer identifier is added to this ACID. If unset, "VCE" is used by default.
"lists" Object Configures system lists (coordination, VFR, TAB, tower, etc.).
"lists" members

See List Formatting for the format specifiers available for customizing list entry formats.

ElementTypeDescription
"coast_suspend"ObjectFormat: "[INDEX] [ACID] S [BEACON] [ALT]"
"coordination"Array of objectsAn array of objects, each specifying a coordination list used for releasing departures from one or more airports.
"coordination" members
ElementTypeDescription
"airports" Array of strings The airports managed by the list. Any airport with "hold_for_release" set to "true" must be in exactly one coordination list.
"format" String (Optional) The format of each entry. See List Formatting for details. If not specified, a default format is used.
"id" String The list's identifier (1–3 alphanumeric characters; cannot be "1", "2", or "3"). Used to identify the list when entering STARS commands.
"name" String The list name, shown at the top of the list when it is visible in the STARS window.
"yellow_entries" Boolean (Optional) If true, entries in the list are drawn in yellow rather than green.
"mci_suppression"ObjectFormat: "[ACID] [BEACON] [SUPP_BEACON]"
"ssa"ObjectSystem Status Area configuration.
"ssa" members
ElementTypeDescription
"altimeters" Array of strings If specified, lists the airports whose altimeters are displayed in the SSA list; no more than 6 airports can be given. The first altimeter value is also shown at the top of the list. If "altimeters" is not specified and if there are more than 6 airports in a scenario, only altimeters for the first 6 in alphabetical order will be shown and the first one will be shown at the top of the list.
"tab"ObjectFormat: "[INDEX] [ACID_MSAWCA][DUPE_BEACON] [BEACON] [DEP_EXIT_FIX]"
"tower"ObjectFormat: "[ACID] [ACTYPE]"
"vfr"ObjectFormat: "[INDEX] [ACID_MSAWCA][BEACON]"
List Formatting

STARS system lists display information about aircraft in various contexts. The format of entries in these lists can be customized using the "format" field for the corresponding list in "lists". The format string consists of literal text and format specifiers enclosed in square brackets.

The following format specifiers are available for all system lists:

  • [ACID]: The aircraft identifier (7 characters, left-justified)
  • [ACID_MSAWCA]: The aircraft identifier followed by one of the following MSAW/CA status indicators or a space if none applies (8 characters, left-justified):
    • "+" suffix: both minimum safe altitude and collision alerts are disabled
    • "*" suffix: only minimum safe altitude alerts are disabled
    • "∆" suffix: only collision alerts are disabled
  • [ACTYPE]: The aircraft type (4 characters)
  • [BEACON]: The assigned transponder squawk code. For VFR flights, initially shows "VFR " for a few seconds until a beacon code is returned from ERAM.
  • [CWT]: The consolidated wake turbulence category
  • [DEP_EXIT_FIX]: The exit fix, if the aircraft is a departure (3 characters, using short names if available)
  • [ENTRY_FIX]: The entry fix (3 characters, using short names if available)
  • [EXIT_FIX]: The exit fix (3 characters, using short names if available)
  • [EXIT_GATE]: The exit fix followed by the requested altitude (formatted as either 2 or 3 digits in thousands or hundreds of feet, respectively, depending on the "allow_long_scratchpad" setting)
  • [INDEX]: The flight plan list index (2 digits)
  • [NUMAC]: The number of aircraft (typically 1, more for formation flights)
  • [OWNER]: The tracking controller (3 characters)
  • [REQ_ALT]: The requested altitude in hundreds of feet (3 digits)

Characters outside of square brackets are copied literally to the output.

Some types of lists support additional format specifiers or have slightly different behavior for the above specifiers:

  • Coast/suspend list:
    • [ALT]: Shows the current mode-C altitude (in hundreds of feet) if available; otherwise the pilot-reported altitude is shown. If neither of those is available, "RDR" is shown.
    • [INDEX]: The coast/suspend list index is shown.
  • Coordination list:
    • [ACKED]: Shows "+" if the departure has been acknowledged/released, or a space otherwise
  • MCI suppression list:
    • [SUPP_BEACON]: The suppressed beacon code associated with the aircraft
  • Flight plan (TAB) list:
    • [DUPE_BEACON]: Shows "/" when if the aircraft's beacon code is also being used by another aircraft and a single space otherwise
"map_labels" Map of strings to strings Allows overriding the labels used for video maps in the STARS DCB. Each entry is the name of a video map (as would be specified in "video_maps" within "areas") and its value is the label that should be assigned to it.
"monitor" String Specifies the type of monitor to simulate, which in turn determines the STARS color scheme used. Options are: "legacy" (the default), "mdm3", and "mdm4".
"radar_sites" Array of objects (Optional)

Specification of all of the radar sites. (If not specified, then STARS Fused mode is the only radar mode available.) Each object member describes a radar site; the member's name gives the site's identifier.

"radar_sites" members
ElementTypeDescription
"char" String A single character identifier for the radar.
"elevation" Number The radar site's elevation in feet. (Not required if the position is specified using an airport ICAO code.)
"position" String The radar's lateral position.
"primary_range" Number The range in nautical miles at which the radar can pick up a primary track (typically, 60).
"secondary_range" Number The range in nautical miles at which the radar can pick up a secondary track (typically, 120).
"silence_angle" Number The spread angle in degrees of the radar's "cone of silence"—the volume above it where aircraft cannot be tracked (typically, 30).
"slope_angle" Number The angle in degrees with respect to the ground that the base of radar coverage increases as a function of distance from the radar site (typically, 0.175).
"restriction_areas" Array of objects Defines restriction areas that controllers may display in the STARS window.
"restriction_areas" members

The "restriction_areas" array specifies restriction areas that controllers may display in the STARS window. There are three types: text-only, circular, and polygonal.

ElementTypeDescription
"blinking_text" Boolean (Optional) If true, the text flashes when displayed.
"circle_center" Location (Circular only) The location of the center of the circle. If "text_position" is not specified, "circle_center" is used for it.
"circle_radius" Number (Circular only) The radius of the circular region in nautical miles.
"closed" Boolean (Polygonal only) (Optional) If true, the last vertex is connected to the first.
"color" Number (Optional) The color index for the restriction area display.
"hide_id" Boolean (Optional) If true, the numeric restriction area id is not displayed before the text.
"shade_region" Boolean (Polygonal only) (Optional) If true, the region's interior is shaded. Only available for closed regions.
"text" Array of two strings (Optional) Each string defines a line of text displayed with the restriction area.
"text_position" Location (Optional for circular and polygonal) The center point of the text, specified using one of the encodings in Specifying Locations.
"title" String The restriction area title displayed in the "GEO RESTRICTIONS" list.
"vertices" String (Polygonal only) The locations of the vertices of the polygon. At least two locations must be given for open regions and three for closed regions.

The following fields are available for all restriction area types:

If "text_position" is not specified for a polygonal region, the center point of all of its vertices is used.

"scratchpads" Map of strings to strings Each member specifies a scratchpad entry that is assigned when a departing aircraft has a given exit fix. Example: "MERIT": "MER"
"significant_points" Object

Each entry specifies information about a fix that is used in the scenario—for example, as an exit fix or as an airport. The following values may be specified as the object's members, though all are optional:

"significant_points" members
ElementTypeDescription
"abbreviation" String A single-character abbreviation used to refer to the fix. If unspecified, the first character of "short_name" is used.
"description" String A brief text description of the fix.
"location" String The latitude-longitude location of the fix. This is normally set automatically based on the fix's name.
"short_name" String A three-letter abbreviation for the fix that is used when it is shown as the scratchpad in datablocks. If not specified, then if the fix's name has four letters and starts with a "K" (i.e., it's an airport), the last three letters are used. Otherwise the first three letters of the fix's name are used. No two fixes may have the same "short_name". (May only be specified for fixes with more than three characters in their name.)
"single_char_aids" Map of strings to strings Maps single-character identifiers to airport ICAO codes. These are used as shorthand when referencing airports in STARS commands.
"ssr_codes" Object

This defines Secondary Surveillance Radar (SSR) codes for the facility; these are various ranges of beacon codes that are assigned to local aircraft or have other special meanings. Its members are:

"ssr_codes" members
ElementTypeDescription
"auto_assignable_codes" Object

Specifies beacon codes available for local VFR and IFR flight plans. It has the members "vfr" and "ifr", which are used for VFR and IFR flight plans, respectively, and "1", "2", "3", and "4", which specify beacon code banks that can be assigned with syntax like /1 when specifying a flight plan.

  • "ranges": array of strings, each specifying a single beacon code or a range of beacon codes (inclusive). Example: ["1200", "0301-0377", "5501-5577"]. This allows specifying multiple non-contiguous ranges for a single pool.
  • "flight_rules": string, either "v" or "i", indicating VFR or IFR, respectively. This may only be specified for the numbered pools; it is predetermined for the "vfr" and "ifr" pools.
  • "backup_pool_list": (Optional) String giving one or more backup pools to use if the initial pool tried has no more remaining codes. Only numbered pools may be given. Example: "234".
"beacon_code_table" Object Has a single member, "vfr_codes", which is an array of strings specifying beacon codes or beacon code ranges used for VFR aircraft without STARS flight plans. Codes in these ranges cannot be manually assigned to flight plans. Default: 1200-1277.
"untracked_position_symbol_overrides" Object

Allows customizing the position symbol displayed for unassociated tracks based on their transponder beacon codes. If this is not set, untracked aircraft display standard symbols: "*" for Mode C, "+" for Mode A, or a diamond for standby.

"untracked_position_symbol_overrides" members
ElementTypeDescription
"beacon_codes" String Comma-separated beacon codes and ranges (e.g., "1200,1300-1377"). Ranges are inclusive.
"symbol" String A single character to display as the position symbol for aircraft with matching beacon codes (e.g., "=").
"use_legacy_font" Boolean If "true", causes the legacy STARS font to be used in the STARS display.

Video Maps

Video maps are specified separately from the rest of the configuration since they require fairly large files and are not generally edited by hand. Two utilities are available to generate maps for vice from other formats:

crc2vice

crc2vice extracts video maps from installed CRC ARTCCs and converts them to vice's internal format.

Usage:

  • Open a command prompt and go to your %AppData%\Local\CRC directory.
  • Run crc2vice and give it the name of an installed ARTCC (e.g., crc2vice ZNY). You can see which ARTCCs are installed by examining the ARTCCs folder there.
  • Two files will be written, one containing the video map details (e.g., ZNY-videomaps.gob) and one with information about the individual maps (e.g., ZNY-manifest.gob). You can then either copy both files to the resources/videomaps folder in your %AppData/Local/Vice directory, or can use the -videomap command-line option to vice; if you use -videomap, only provide it with the path to the ZXX-videomaps.gob file. It will look for the ZXX-manifest.gob file in the same folder.

dat2vice

dat2vice extracts video maps from the FAA DAT video map file format and converts them to vice's internal format.

dat2vice takes a manifest file that specifies the filenames of the DAT files to convert as well as additional information about each one:

  • "filename" is a string giving the path to the DAT file
  • "brightness" (optional, 0 by default): should be either 0 or 1, with 0 signifying map group A, and 1 signifying map brightness group B.
  • "label" gives the label that should be used for the map on the STARS DCB
  • "title" gives the full name of the map, as is used in vice scenario definition files.
  • "number" gives the integer map number associated with the map.
  • "color" (optional): gives which map color to use (1-8).
  • "category" (optional): number from -1 to 9 giving the map category. 0 is the default if not specified.
    • -1: no category
    • 0: Geographic maps
    • 1: Controlled airspace
    • 2: Runway extensions
    • 3: Danger areas
    • 4: Aerodromes
    • 5: General aviation
    • 6: SIDs/STARs
    • 7: Military
    • 8: Geographic points
    • 9: Processing areas
  • "radius" (optional) if specified, gives a radius in nautical miles beyond which extra data in the map is culled.

For brightness group 0, the map colors are:

1 2 3 4 5 6 7 8

For brightness group 1, the map colors are:

1 2 3 4 5 6 7 8

Here is an example manifest file:

[
    {
        "filename": "xyz001sgp.dat",
        "brightness": 0,
        "label": "XYZ RNAV",
        "title": "XYZ RNAV APPROACHES",
        "number": 1
    },
    {
        "filename": "xyz012smvagp.dat",
        "brightness": 1,
        "label": "XYZ MVA",
        "title": "XYZ AREA MVAS",
        "color": 3,
        "number": 12,
        "radius": 60
    }
]

Given a manifest file, run dat2vice like this, giving it the filename for the manifest file and the facility identifier for the maps:

> dat2vice manifest.json ZXX

You can also specify a culling radius via the -radius command-line option:

> dat2vice -radius 40 manifest.json ZXX

If -radius is given and per-map "radius" values are present, the per-map value takes precedence.

If successful, dat2vice will generate two files in the current directory, ZXX-manifest.gob and ZXX-videomaps.gob.zst. These can then be used in vice scenarios.

Scenarios

Scenarios

vice offers users a variety of ATC scenarios, where a scenario consists of one or more airports being controlled, a control position (departure, approach, etc.), and airport configurations—the runways that are active at each airport. Scenarios are organized in scenario groups, which generally collect multiple control scenarios at a single airport. Each scenario group is specified by its own JSON file; see the resources/scenarios/ directory in the vice source code distribution for examples. The facility-wide settings (control positions, STARS configuration) are stored separately in facility configuration files.

These are the elements of a scenario group:

Element Type Description
"airports" Object Defines all of the airports that are included in the scenarios. See the airports section for details.
"airspace" Object Defines the extent of controllers' airspace; see airspace for details.
"allow_fix_redefinitions" Boolean (Optional) When set to true, disables the validation check that verifies fixes defined in "fixes" are close to their locations in the FAA database. This is useful for fictional scenarios where fixes are intentionally placed at different locations than their real-world counterparts. Default is false.
"area" String (ERAM only) Name of the area within the ARTCC for the scenario group.
"artcc" String (ERAM only) Name of the ARTCC that the scenario group is associated with.
"default_scenario" String A default to use for the initial scenario when the scenario group is chosen. Must match one of the members in "scenarios".
"fixes" Object

Each member associates a name with a latitude-longitude location. These names can be used when specifying routes for departures and arrivals. (Note that they cannot be used when specifying other locations in the scenario group configuration.) For example, this associates a useful name with the point at the end of runway 22R at JFK: "_JFK_22R": "N040.39.00.362,W073.45.49.053".

Fixes may be specified in relation to previously-specified fixes (or standard fixes from the FAA database) using the syntax FIX@HDG/DIST, where FIX is the name of a fix, HDG is a heading leaving it, and DIST is a distance along that heading given in nautical miles.

"inbound_flows" Object Defines the routes for arrivals and overflights; see Arrivals and Overflights.
"magnetic_adjustment" Number Number of degrees to add to the magnetic variation computed using the built-in magnetic model. (Sometimes when video maps are a few years old, they may be out of sync with the actual magnetic variation.)
"name" String The name for the scenario group. This name cannot be the same as the name for any of the other scenario groups.
"primary_airport" String The main airport for the scenario. This is used to determine which airport's altimeter and winds to include at the top of the SSA list in the STARS radar scope.
"reporting_points" Array of strings Each entry specifies a fix that aircraft may use at initial contact when reporting their position ("AAL411, 5 miles Northeast of LENDY...").
"scenarios" Object This defines all of the ATC scenarios that are available in the scenario group. See the scenarios section for details.
"tracon" String Name of the ATCT/TRACON that the scenario group is associated with. This is used to show all scenarios for a given ATCT/TRACON together in the UI.
"vfr_reporting_points" Array of objects

Each object specifies a VFR reporting point. VFR aircraft that call for flight following will report their position referencing one of these points, a nearby airport, or a nearby VOR. Each object has two members:

"vfr_reporting_points" members
ElementTypeDescription
"description" String The location aircraft reference when they report their position.
"location" String The location of the reference point.

Airports

The airports in a scenario group are specified via the "airports" member of the scenario group. Each airports is a separate member, named according to the airport's ICAO code (e.g., "KJFK"). The airport object then has the following member variables:

Element Type Description
"approaches" Object

Defines all of the approaches to the airport that may be used by aircraft. See below for documentation about how approaches are specified.

"atpa_volumes" Object

Each member is a string with a runway name and an associated object that specifies the region of space where the STARS automated terminal proximity alert (ATPA) feature is active for the runway. (If not specified, a default volume is generated along the runway's extended centerline.)

"atpa_volumes" members
ElementTypeDescription
"2.5nm_distance" Number Distance from runway threshold at which 2.5nm separation is allowed, if "enable_2.5nm" is true.
"ceiling" Number Top altitude of the volume, in feet.
"enable_2.5nm" Boolean Indicates whether reduced 2.5nm separation is allowed on final approach.
"excluded_scratchpads" Array of strings Aircraft scratchpads that do not participate at all in ATPA for this runway. This should include scratchpads of aircraft arriving on parallel runways, for example.
"filtered_scratchpads" Array of strings Aircraft scratchpads that do not receive ATPA warnings/alerts but that do still participate in ATPA calculations for other aircraft. (Thus, this should include for example aircraft cleared for visual approaches that should not themselves receive alerts but where other non-visual aircraft must still be separated from them.)
"floor" Number Bottom altitude of the volume, in feet.
"heading" Number Runway heading or orientation of the volume.
"id" String (Optional) Name of the volume. If not specified, the runway is used.
"left_width" Number Width the volume extends to the left of the extended centerline, where "left" is with respect to an aircraft flying the approach.
"length" Number Length of the volume, from "runway_threshold" in direction "heading", given in nautical miles.
"max_heading_deviation" Number Maximum deviation between an aircraft's heading and the ATPA volume heading allowed for an aircraft to be included in ATPA.
"right_width" Number Width the volume extends to the right of the extended centerline.
"runway_threshold" String Position of the runway threshold or point to use for the start of the volume.
"crda_pairs" Array of objects

Each object specifies a pair of converging CRDA regions that will be included in the STARS CRDA list. Each object has the following members:

"crda_pairs" members
ElementTypeDescription
"crda_regions" Array of two strings References two regions defined in "crda_regions".
"leader_directions" Array of two strings Compass directions ("N", "NE", "E", ...) used for leader lines for ghost aircraft from the two respective regions.
"stagger_symbol" String A single character for ghost aircraft when CRDA "stagger" mode is used.
"tie_offset" Number Offset in nautical miles to add to ghost aircraft's distance from the convergence point when "tie" mode is used.
"tie_symbol" String A single character for ghost aircraft when CRDA "tie" mode is used.
"crda_regions" Object Each member defines a CRDA region—a volume of space associated with an approach path used for CRDA ghost generation. Region names (the object keys) can be any short identifier: a runway name like "22L", procedure name like "PUCKY1", or any other descriptive name.
"crda_regions" members

The approach path can be defined in one of two ways (mutually exclusive):

Straight-line reference fields

For simple runway-aligned paths:

ElementTypeDescription
"reference_heading" Number Heading that is opposite to the approach heading.
"reference_length" Number Length in nm of the reference line.
"reference_point" String Position with respect to which the lateral and vertical extents are defined. (Often, the threshold of the runway.)
Route-based reference fields

For curved approaches, converging fixes, etc.:

ElementTypeDescription
"reference_route" String The path as a series of fix names (or lat-long positions), optionally with /arc qualifiers for curved segments. Unlike approach/departure routes, only fix names and /arc are supported; other waypoint qualifiers (altitude restrictions, speed, handoff, etc.) are not allowed. Example: "MERIT ROSLY/arc5.0JFK CATOD". When this is specified, "reference_point", "reference_heading", and "reference_length" must not be given.
Lateral qualification fields

The following members apply to both path types and specify the lateral qualification region—the volume an aircraft must be inside for a ghost to be generated:

ElementTypeDescription
"far_half_width" Number Half of the width of the region at the far distance.
"heading_tolerance" Number Maximum difference between an aircraft's heading and the local path heading for a ghost aircraft to be displayed.
"near_distance" Number Distance along the path from the start where the lateral volume begins.
"near_half_width" Number Half of the width of the region at the near distance.
"region_length" Number Length of the lateral volume along the path, starting from the near distance. Must not be specified with "reference_route" (the route length is used automatically).
Altitude qualification fields

These members specify the vertical qualification region—the altitude envelope an aircraft must be inside for a ghost to be generated. There are two modes:

Fixed altitude range (no descent profile): set "descent_distance" to 0 (or omit it). The vertical qualification region is a flat band over the entire region, centered on "descent_altitude" with "above_altitude_tolerance" and "below_altitude_tolerance" defining the upper and lower bounds. For example, to qualify aircraft between 1000 and 5000 feet:

                            "descent_distance": 0,
                            "descent_altitude": 3000,
                            "above_altitude_tolerance": 2000,
                            "below_altitude_tolerance": 2000

Descent profile (for approach paths with a glideslope): set "descent_distance" to a nonzero value. The expected altitude slopes linearly from "reference_altitude" at the path origin (the near end) to "descent_altitude" at "descent_distance" along the path, then remains flat at "descent_altitude" beyond that point. The tolerances define a band around this sloping profile.

ElementTypeDescription
"above_altitude_tolerance" Number Maximum feet above the expected altitude at any point along the path for an aircraft to still qualify.
"below_altitude_tolerance" Number Maximum feet below the expected altitude at any point along the path for an aircraft to still qualify.
"descent_altitude" Number Expected altitude at the descent distance (or the center of the fixed band when "descent_distance" is 0).
"descent_distance" Number Distance along the path where the descent profile levels off. Set to 0 for a fixed altitude range.
"reference_altitude" Number Expected altitude at the path origin. Only used when "descent_distance" is nonzero.
Scratchpad filter
ElementTypeDescription
"scratchpad_patterns" Array of strings Optional. If present, only aircraft whose scratchpad contains one of the given patterns will generate ghosts.
"departure_controller" String If specified, gives the virtual controller initially controlling the aircraft.
"departure_routes" Object Each member is an object that defines routes for the specified a departure runway. These routes are followed by aircraft departing that runway, organized by exit fix. See below for documentation of the per-runway departure route object.
"departure_runways_as_one" Array of strings Each string contains a comma-separated list of runways that should be treated as a single unit for departure sequencing purposes. When an aircraft departs from any runway in a group, the last departure time is updated for all runways in that group. This is particularly useful for maintaining separation between departures from parallel runways.
"departures" Array of objects Each object in the array defines a departure to a destination, including one or more airlines that fly that departure, the type of aircraft flown, and information about the aircraft's path. See below for details of the departure object.
"exit_categories" Object Each member corresponds to a fix used as an exit for departures in the scenario group and allows associating a string category name with each exit. (These categories are used so that users can control the mix of exits used in a scenario.) Example: "ARD": "Southwest"
"hold_for_release" Boolean (Optional) If true, departures from the airport must be released by a controller. If the airport is listed in "coordination_lists" in "facility_adaptations", then the release will be managed using STARS coordination lists; otherwise it will appear in the Launch Control window.
"omit_arrival_scratchpad" Boolean (Optional) If true, the arrival airport is not shown alternating with the altitude in full datablocks when the scratchpad is unset.
"tower_list" Number Gives the airport's priority for tower list assignments. 1 is the highest priority, then 2, etc. If "tower_list" is unspecified, the airport has the lowest priority. The 3 tower lists in the STARS scope are then assigned using this priority, with ties broken by airport name sorted alphabetically.
"vfr" Object Allows specifying VFR departures from the airport. See VFR Aircraft for details about the members of this object and for further discussion of VFR in Vice.)

Approaches

The member names in the airport "approaches" object give the abbreviated name of each approach, as used in vice's ATC commands.

Approaches may be specified using data automatically loaded from the FAA CIFP or manually. To use CIFP data, run vice from the command-line and give it the argument -route KXYZ, where KXYZ is the ICAO code for the airport. vice will print identifiers for the available approaches and their associated fixs. For example:

                > ..\vice.exe -routes KMIA
                [...]  
                Approaches:
                I12  : DHP GLRIA/a3000+/lhilpt1.0min/pta3000/iaf PIANA/a3000+ VEPCO/a2000+
                [...]
                RY12 : WORPP/iaf GLRIA/a3000/if PIANA/a3000+ VEPCO/a2000+
                FOGSO/s210/iaf GLRIA/a3000/if PIANA/a3000+ VEPCO/a2000+
                [...]
              

Approach ids encode the type of approach—for example, I12 is an ILS approach to runway 27 and RY12 is an RNAV Y runway 12 approach. Given the id, the approach can be specified with:

Element Type Description
"cifp_id" String A string giving the identifier of the approach in the CIFP (e.g., "RZ14"). When this is specified, the full name of the approach and the corresponding runway are determined automatically from the string.

Support for loading routes from the CIFP is new so please confirm that routes are correct and report any bugs you find. Note that not all approaches are included in the CIFP.

Alternatively, approaches can be defined manually using the following members:

Element Type Description
"full_name" String (Optional) A string giving the full name of the approach (e.g., "RNAV Z Runway 13L"). If not specified and the approach is not a visual approach, the approach's name is generated automatically using "runway" and "type".
"runway" String A string describing the runway the approach ends at (e.g., "13L"). Note that single-digit runways should not be specified with a leading 0 (i.e., "1L, not "01L".)
"type" String The type of the approach; it must be "ILS", "Localizer", "RNAV", "Visual", or "VOR".
"waypoints" Array of strings Each given string specifies an approach route. Multiple strings can be provided for "waypoints" for approaches with multiple IAFs (e.g. an RNAV "T" configuration). vice automatically adds a final waypoint at the arrival runway threshold; aircraft are deleted from the simulation when they reach that point.

Departures

There are two pieces for specifying departures: their initial route leaving the airport, which depends on the active departure runway, and their subsequent route out of the TRACON, which does not. These two parts are specified separately.

The "departure_routes" object in the airport definition gives the initial routing for departures, based both on the runway they are departing as well as their exit fix. Here is an excerpt from the KJFK departure routes:

                "departure_routes": {
                "13R": {
                "ARD,DIXIE,RBV,WHITE": {
                "cleared_altitude": 5000,
                "sid": "JFK5",
                "waypoints": "KJFK-31L/h185"
                },
                ...
              

The members of "departure_routes" are strings identifying the departure runway; each departure runway's routes are then represented by an object with one or more members that specify comma-separated lists of exit fixes. (Thus, the specification above applies to departures with exit ARD, DIXIE, RBV, or WHITE, departing runway 13R.)

The exit fix specifiers may include additional text after a period to allow specifying situation-dependent exits. For example, we might specify one route for "RBV.PISTONS", another for "RBV.TURBOPROPS", and a third for "RBV.JETS". vice treats all of these as going to the "RBV" exit. When departures are defined in "departures", they can then refer to the appropriate exit in their "exit" specifier.

The departure route specification includes the following members:

Element Type Description
"assigned_altitude" Number The initial altitude that aircraft climb to. Aircraft given "assigned_altitude" do not obey any altitude restrictions in the departure route. (This option is mostly useful for hybrid SIDs that start with radar vectors and later have a pilot nav component; aircraft will not climb beyond this altitude until the "climb via SID" instruction is given to them.)
"cleared_altitude" Number the initial altitude that aircraft are cleared to. Aircraft given "cleared_altitude" are implicitly given "climb via SID": they will obey altitude restrictions in the departure route and climb no higher than the altitude given.
"departure_controller" String (Optional) A string indicating which controller should initially control the aircraft. Controller must be a virtual controller.
"description" String (Optional) A description that is shown in the UI for choosing routes to draw on the radar scope.
"handoff_controller" String (Optional) A string indicating which controller should receive the handoff if one of the fixes in the route has the /ho qualifier for a handoff. This is useful if a virtual controller has initial control, e.g., for a departure from a nearby airport.
"hold_for_release" Boolean (Optional) If true, departures on this route must be released by a controller. If the airport is listed in "coordination_lists" in "facility_adaptations", then the release will be managed using STARS coordination lists; otherwise it will appear in the Launch Control window.
"is_rnav" Boolean (Optional) If true, aircraft departing on this route will have the RNAV flag set in their flight plan.
"sid" String (Optional) A string naming the SID that the aircraft is flying.
"speed_restriction" Number (Optional) If present, gives a speed restriction in knots which aircraft will maintain until told otherwise by the controller.
"waypoints" String The initial series of waypoints that the aircraft follows. vice automatically sets the route's first waypoints to be the specified runway's threshold and then a point 3/4 of the way down the runway. The waypoints in "waypoints" are then appended to those. Therefore, for the example above, the aircraft continues to the end of the runway and then flies the heading 185.

Either "assigned_altitude" or "cleared_altitude" must be specified.

The other part of specifying departures is the array of objects stored in "departures". Each one describes a departure to a particular destination. Here is a JFK departure to Paris Charles de Gaulle:

                {
                "airlines": [
                {
                "fleet": "long",
                "icao": "AFR"
                }
                ],
                "destination": "LPFG",
                "exit": "HAPIE",
                "route": "HAPIE YAHOO WHALE N251A JOOPY NATZ MALOT NATZ GISTI LESLU M142 LND N160 NAKID M25 ANNET UM25 UVSUV UM25 INGOR UM25 LUKIP LUKIP9E",
                "scratchpad": "HAP",
                },
                ...
              

A few additional things must be specified with each departure:

Element Type Description
"airlines" Array of objects Each object specifies an airline and the types of aircraft it flies on the route. See Airlines and Aircraft for the form of the airline objects.
"description" String (Optional) A description of the departure.
"destination" String The ICAO airport code for the destination. This is only used in flight strips and for the aircraft's datablock on the radar scope; it does not affect its routing.
"exit" String The exit fix for the departure. In conjunction with the departure runway, this is used to determine the aircraft's route leaving the airport using "departure_routes".
"route" String The aircraft's route to the destination. This is mostly used so that flight strips have plausible routes, though vice does its best to have the aircraft follow the given route after it reaches the exit fix.
"scratchpad" String (Optional) If specified, this gives the aircraft's initial scratchpad. Otherwise, the scratchpad is set based on the exit, either using the "scratchpads" dictionary in the facility configuration or via "display_exit_gate" or "display_alternate_exit_gate" in "facility_adaptations".
"secondary_scratchpad" String (Optional) If specified, this gives the aircraft's initial secondary scratchpad.

It is optional to specify the final altitude for departures.

Element Type Description
"altitude" Number or array of numbers (Optional) The final altitude for the flight. If multiple altitudes are given, one is chosen at random. If none are chosen, a reasonable final altitude is chosen based on the distance between the departure and arrival airports and the aircraft's capabilities.

Arrivals and Overflights

Note: until recently, overflights were not supported and arrivals were specified using the "arrival_groups" variable, which is no longer available.

Arrivals and overflights are specified via the "inbound_flows" variable, which allows specifying the ways that aircraft from adjacent facilities enter the TRACON. "inbound_flows" has two members, "arrivals" and "overflights", each of which is an array of arrival and overflight specifiers, respectively.

vice allows specifying multiple arrival and overflight procedures together so that it can sequence them as a group. Thus, if an overflight route corresponds to a STAR, at least at the beginning, both should be specified together in the same "inbound_flow". Similarly, if multiple STARs have the same initial route, they should be together as well.

Arrivals

Each object stored in the "arrivals" array corresponds to a STAR. These objects have the following members:

Element Type Description
"airlines" Object Destination airports and airlines for the arrivals. These objects include both the members "icao", "fleet", and "types" members of the airline object documented in Airlines and Aircraft as well as some additional fields. See the example below.
"assigned_altitude" Number (Optional) If specified, the aircraft will be descending to the given altitude which it will then maintain until given further directions. If the aircraft should be descending via a STAR that includes altitude restrictions, leave this unspecified.
"coordination_fix" String (Optional) If specified, gives the name of the coordination fix for the arrival.
"cruise_altitude" Number The aircraft's final cruise altitude. (This is only used in the aircraft's flight strip.) If unspecified, vice tries to choose a reasonable cruise altitude based on the distance and direction of flight.
"description" String (Optional) If provided, this string is shown in the UI for drawing approaches on the radar scope to give further information about what the route is used for.
"expect_approach" String or Object (Optional) This makes it possible to specify an approach that the aircraft has already been told to expect by a previous controller. (And so, it is not necessary to issue an "expect approach" command before clearing an aircraft for an approach.). A single string identifying the approach may be given if the STAR only serves one airport. Otherwise, a dictionary from airport names to approaches may be provided—for example, "expect_approach": { "KFLL": "I0L", "KOPF": "I12" }. This setting is especially useful in "finals" scenarios.
"initial_altitude" Number The aircraft's altitude when first spawned.
"initial_controller" String The callsign of the controller who is initially tracking the aircraft.
"initial_speed" Number The aircraft's initial speed when first spawned.
"is_rnav" Boolean (Optional) If true, aircraft on this arrival will have the RNAV flag set in their flight plan.
"route" String (Optional) The aircraft's remaining route. (This is only used for displaying the aircraft's flight plan, e.g. in flight strips.)
"scratchpad" String (Optional) If provided, the aircraft's scratchpad is set to this value.
"secondary_scratchpad" String (Optional) If provided, the aircraft's secondary scratchpad is set to this value.
"speed_restriction" Number If present, gives a speed restriction in knots
"star" (Optional) String Name of the STAR that the aircraft is flying.

STARs are sometimes able to deliver aircraft to multiple airports. Therefore, the "airlines" member is an object with airport names as members. Each of the airports is associated with an array of objects that specify departure airports, airlines, and (optionally) airline fleets. Here is an excerpt from the CAMRN4 arrival group at KJFK:

                "airlines": {
                "KFRG": [
                {
                "airport": "KDCA",
                "icao": "EJA"
                },
                ...
                ],
                "KJFK": [
                {
                "airport": "MMMY",
                "fleet": "long",
                "icao": "AMX"
                },
                ...
                ]
                }
              

We can see that CAMRN4 applies to both the KFRG and KJFK airports, though with different airlines and different departure airports for the arrivals. The specified departure airports (here, KDCA and MMMY) are only used so that flight strips and data blocks on the scope are realistic, but the specified airlines are used to select the type of aircraft from their fleets. As elsewhere, a value for "fleet" may be specified to limit which types of aircraft may be chosen.

There are two ways to specify a STAR's waypoints: automatically using data loaded from the FAA CIFP or manually. To use CIFP data, ensure that the STAR is available by running vice from the command-line and providing the -routes KXYZ argument, where KXYZ is the name of the airport. vice will print the available STARS with their transitions. For example,

                > ..\vice.exe -routes KLGA
                STARs:
                APPLE3.SHLBK: SHLBK LOUIE/a13000 BACKY ODESA DQO RUUTH WNDYL BRAND/a8000 KORRY DEPDY TYKES MINKS JERZY RENUE APPLE PROUD/flyover/h45
                APPLE3.SWANN: SWANN GATBY KERNO ODESA DQO RUUTH WNDYL BRAND/a8000 KORRY DEPDY TYKES MINKS JERZY RENUE APPLE PROUD/flyover/h45
                APPLE3.ALL  : RUUTH WNDYL BRAND/a8000 KORRY DEPDY TYKES MINKS JERZY RENUE APPLE PROUD/flyover/h45
                [...]
              

If the STAR specified in the "star" parameter is present, vice will automatically use the available routes to define the STAR's transitions and runway-specific waypoints. In that case, one additional parameter must be specified:

Element Type Description
"spawn" String The name of the waypoint in the STAR at which new arrivals should start. A point between two waypoints in the STAR can be specified using an "@" symbol and a number between 0 and 1 that represents the fraction of distance between the waypoint and the next. For example, "[email protected]" specifies that aircraft should spawn 0.6 of the way between STW and the following waypoint. Aircraft will then be handed off from the center controller halfway between the first two waypoints of the route.

Alternatively, the waypoints may be specified manually using one required and one optional member.

Element Type Description
"runway_waypoints" Object (Optional) This specifies runway-specific waypoints for each airport, if there are any. After an approach is assigned to an aircraft, the corresponding runway waypoints are added to its route. Note that the first waypoint in each entry in "runway_waypoints" must match the last waypoint in "waypoints". (See the example below.)
"waypoints" String The series of waypoints that aircraft should fly. New aircraft are spawned at the first waypoint. These waypoints should include a "/ho" directive at the point where the aircraft should be handed off from the virtual controller to the user.

The "runway_waypoints" member can be used for STARs that have different routes depending on the arrival airport and runway. When the user instructs the aircraft to expect a particular approach then the corresponding waypoints are added to its route. As an example, the specification of the KPHL JIIMS4 arrival starts with the following string for "waypoints": "HEKMN N039.27.43.645,W074.56.38.400/ho JIIMS/a8000". (The second point is used to set the handoff point to be between HEKMN and JIIMS.) It then has the following "runway_waypoints", corresponding to the runway-specific routes into KPHL, the only active airport in the scenario. Note that all start with JIIMS, the same fix at the end of "waypoints".

                "runway_waypoints": {
                "KPHL": {
                "27L": "JIIMS/a8000 ZMRMN CHPMN PSOUT MKORD/h087",
                "27R": "JIIMS/a8000 ZMRMN CHPMN PSOUT MKORD/h087",
                "17": "JIIMS/a8000 SNEDE/h312",
                "35": "JIIMS/a8000 SNEDE/h312",
                "9L": "JIIMS/a8000 WUDRR WEVVE ERNYY/h268",
                "9R": "JIIMS/a8000 WUDRR WEVVE ERNYY/h268"
                }
                },
              

Overflights

An overflight is an aircraft that enters the TRACON already airborne, and flies through it without landing. Overflights are also specified in "inbound_flows" in the "overflights" member, which is an array of overflight specifiers. Each specifier may have the following members.

Element Type Description
"airlines" Array of objects Specification of the airlines flying the overflight and their departure/arrival airports. See the example below.
"assigned_altitude" Number (Optional) If specified, gives a controller-assigned altitude for the aircraft.
"assigned_speed" Number (Optional) If specified, gives a controller-assigned speed for the aircraft.
"cruise_altitude" Number (Optional) The aircraft's final altitude in its flight plan. If unspecified, a reasonable guess will be made based on direction of flight and the aircraft's departure and arrival airports.
"description" String (Optional) A description of the overflight for use in vice's user interface.
"initial_altitude" Number or array of numbers The altitude aircraft will have when they are spawned at the initial fix. If multiple altitudes are specified, one is chosen at random.
"initial_controller" String The identifier of the virtual controller who initially has the aircraft's track. No controller may be specified if "unassociated" is true.
"initial_speed" Number The speed aircraft will have when they are initially spawned.
"is_rnav" Boolean (Optional) If true, aircraft on this overflight will have the RNAV flag set in their flight plan.
"scratchpad" String (Optional) If specified, gives the primary scratchpad aircraft will have.
"secondary_scratchpad" String (Optional) If specified, gives the secondary scratchpad aircraft will have.
"speed_restriction" Number (Optional) If specified, gives a speed restriction to the aircraft (e.g., as would happen after passing a waypoint on a route with a speed restriction.)
"waypoints" String The route flown by overflights in this flow. Aircraft are spawned at the initial waypoint. If one of the waypoints on the route includes the "/ho" directive, aircraft are handed off to the controller at that waypoint. (Otherwise, they are kept by the virtual controller for their entire overflight; this can be useful for adding "ambient" traffic that the controller doesn't have to work themselves.)

Each overflight specification includes one or more "airlines" in an array of objects that specify the airlines and aircraft that should be included in the overflight. In addition to the "icao", "fleet", and "types" members documented in Airlines and Aircraft, the following members may be specified:

Element Type Description
"arrival_airport" String Airport to show as the aircraft's arrival airport.
"departure_airport" String Airport to show as the aircraft's departure airport.

VFR Aircraft

vice allows the specification of VFR "distractor" aircraft in scenarios; this provides realistic extra clutter in the scope and sometimes aircraft that need to be accounted for when vectoring IFR aircraft. If "vfr_reporting_points" are specified in the Scenario Group, then VFR aircraft will periodically call asking for flight following. For now, vice ensures that VFR aircraft remain clear of B and C class airspace.

VFR aircraft are specified using the "vfr" field in an airport's specification object in a scenario JSON file. They can either be specified with a specific route to fly, or it is possible to specify that they should fly a random route that ends up at one of the other airports that has VFR departures. In practice, it works well to have VFR departures both from class D and uncontrolled airports inside a TRACON but also from such airports up to 30-50 miles outside the TRACON; this gives good variety of both flights within the TRACON but also overflights, departures that land outside the TRACON, and arrivals that land within it. The following values can be specified in an airport's "vfr" object:

Element Type Description
"random_routes" Object

Specifies that the airport should have VFR departures that fly to one of the other VFR airports (or possibly, back to the originating airport). Routes between the airports are randomized so that different aircraft follow slightly different routes, even if they are going to the same destination airport.

"random_routes" members
ElementTypeDescription
"fleet" String (Optional) Which general aviation aircraft fleet to use. Current options are: "default", "GAsinglepiston", "GAjet", "GAmultipiston", "GAturbine", "cessna", "lightGA", and "fastGA". See the section for "General Aviation USA" in the openscope-airlines.json file in the vice distribution for which aircraft types are in each of these fleets.
"rate" Number The average number of VFR departures per hour.
"routes" Array of objects

Each entry specifies a VFR flow to a specific destination airport with a specified route. This offers more control than "random_routes" but requires a bit more work.

"routes" members
ElementTypeDescription
"description" String (Optional) Description of the entry. Not used by vice but useful to remind yourself what a series of lat-longs represents.
"destination" String Destination airport.
"fleet" String Which GA aircraft fleet to use; see "fleet" above for the current options.
"name" String A brief description of the route.
"rate" Number The average number of departures along this route per hour.
"waypoints" String Waypoints that describe the route that should be flown between the current airport and the destination airport.

As discussed in Routes, there are additional specifiers that can be included with VFR routes that are useful with the "routes" option; adding /radius to fixes along routes is an easy way to add randomness to VFR routes. /airwork can also be used to have aircraft go out and do practice airwork from an airport.

Altitude restrictions in VFR routes are also handled specially: if a range of altitudes is specified using /a at a waypoint, VFR aircraft will select a random altitude within that range.

When defining VFR routes, it's a good idea to be mindful of class B/C airspace. When vice wants to create a VFR departure, it generates a random route, either fully on its own if "random_routes" is used, or using the route given in "waypoints" if "routes" is used. It then simulates the aircraft's flight and checks to see if it enters B/C airspace. If it does, it discards the route and generates a new one. It keeps doing this until it finds a valid route, but eventually it will give up if it's not being successful. Thus, feel free to define routes that are close to the boundaries of such airspace, but give vice some space to work with via /radius and altitude ranges so that it has a chance of finding a valid route.

Two other useful tools when working on VFR: in the STARS scope, if you type .VFR and press enter, vice will show all of the VFR departure airports by drawing a circle around their location and displaying their name. Entering .VFR again hides them.


Second, if you enter .DRAWROUTE in the STARS scope, you can click on a series of points to define a route. After each click, the clipboard is updated to have the lat-long coordinates of the entire route. Pressing [Backspace] removes the last point from the route. Here is an example of specifying a route along the south shore of Long Island and then North along the Hudson River for a N90 scenario.


Controller Airspace

Airspace volumes representing areas that particular controllers are responsible for may optionally be specified using the "airspace" object in the scenario group. If specified, vice will show an alert when aircraft owned by a controller are outside of their airspace.

The airspace object has two members:

Element Type Description
"boundaries" Object Defines lateral boundaries of airspace with arrays of location specifiers.
"volumes" Object Defines a volume of space using one or more boundary specifiers and a range of altitudes.

Each member in "boundaries" names a polyline of one or more line segments. Polylines are specified by arrays of locations. The first and second points specify the first line, the second and third points specify the second line, and so forth. Here is an example from the KPHL airspace:

                "PHL_DQO27_33": [
                "N039.21.58.949,W075.28.55.977",
                "N039.25.56.240,W075.29.47.255",
                "N039.26.20.204,W075.27.28.196",
                "N039.22.24.699,W075.26.48.535",
                "N039.21.58.949,W075.28.55.977"
                ]
              

Note that the first point and the last point are at the same location and thus, "PHL_DQO27_33" is a closed polygon. Airspace boundaries do not have to be polygons like this; because boundaries are generally shared between different volumes of airspace, it's often useful to define boundaries just as polylines and to assemble multiple boundaries to define the lateral extent of a volume of airspace.

Given the boundaries, "volumes" specifies full 3D volumes of airspace. Airspace volumes have the following members:

Element Type Description
"boundaries" Array of strings The names of one or more lateral airspace boundaries defined in the "airspace" "boundaries" object specifiers.
"label" String (Optional) The label to draw on the map for the volume when it is displayed. If not specified, the altitude range (in hundreds of feet) is shown.
"label_position" String (Optional) If specified, this gives the position at which to draw the label. If not specified, the center point of the boundary polygons is used.
"lower" Number Lower altitude of the volume's vertical extent, in feet.
"upper" Number Upper altitude of the volume's vertical extent, in feet.

Here is an example from KPHL that uses the boundary defined above:

                "PHL_DU_APP27": [
                {
                "boundaries": [
                "PHL_DQO27_33"
                ],
                "lower": 5000,
                "upper": 6000
                }
              

Scenarios

Scenarios pull together components from the definitions in scenario groups in order to present specific control scenarios to the user. The scenarios object's members are the names of the scenarios.

Element Type Description
"airspace" Object Each member in the object defines the airspace associated with a control position. The object key is a controller id and the value is an array of strings, each of which corresponds to an airspace volume defined in the "airspace" section of the scenario group.
"arrival_runways" Array of objects

Each object specifies an airport, one of its runways, and an optional go-around procedure. The specified airport must be present in the "airports" member of the scenario group, and the specified runway must be one of its runways.

"arrival_runways" members
ElementTypeDescription
"airport" String An airport name.
"go_around" Object (Optional) Defines the go-around procedure for this runway.
"go_around" members
ElementTypeDescription
"altitude" Number Altitude in feet (e.g., 2000, 3000).
"handoff_controller" String (Optional) TCP that should handle the go-around aircraft.
"heading" Number Heading in degrees (1-360). If omitted or 0, runway heading is used.
"hold_departures" Array of strings (Optional) Runways on which departures should be held for one minute after a go-around.
"runway" String A runway at the given airport.
"center" String (Optional) If specified, this gives the initial radar scope center (as a latitude-longitude position.)
"configuration" String A short identifier (maximum 3 characters) that references a configuration defined in "configurations" under "facility_adaptations". The referenced configuration provides the inbound and departure assignments and the default consolidation hierarchy for this scenario. The selected configuration must have assignments for all of the scenario's active arrivals and departures.
"default_map_group" String (ERAM only, Optional) The name of the default video map group to display when this scenario is selected.
"default_maps" Array of strings The names of the initial video maps that should be displayed when this scenario is selected. Note that "default_maps" may not be used if "video_maps" is specified in "controllers" or "areas"; in that case controller- or area-specific default maps can be specified there.
"departure_runways" Array of objects Each object specifies information about departures at a runway at an airport in the scenario.
"departure_runways" members
ElementTypeDescription
"airport" String The airport's name.
"category" String (Optional) Exit category. If present, only departures with an exit associated with the category will be launched from this runway.
"rate" Number Number of departures per hour.
"runway" String One of the airport's runways.
"inbound_rates" Object Each member specifies an inbound flow group and is an object that is a map specifying default rates for corresponding flows. Each entry should either be the name of an airport, in which case it specifies the rate of arrivals to that airport along arrivals in the flow, or the string "overflights", in which it gives the rate of overflights. It can be useful to specify a rate of zero—in this case, the inbound flow will still be included in the UI shown to the user, which allows the user to enable it.
"range" Number (Optional) If specified, gives the initial radar scope center range in nautical miles. This overrides the range given in the scenario group.
"vfr_rate_scale" Number Scale factor to adjust the rate of distractor VFR launches in the scenario. Set to 0 for none.
"wind" Object Specifies constraints for selecting wind conditions for the scenario. When a scenario is loaded, vice will randomly select historical weather data that matches the specified wind. If no wind specifier is provided, vice will automatically select weather compatible with the scenario's runway configuration.

The wind can be visualized in STARS by typing ".WIND" and pressing [Enter]. The wind direction and speed are shown using arrows. "WIND" and an altitude will be shown in the preview area; the altitude can be stepped up and down using the up and down arrow keys. Pressing [Escape] clears the wind display.


"wind" members
ElementTypeDescription
"direction" String (Optional) Wind direction range in degrees. Ranges must be less than 180 degrees wide and can wrap through north (e.g., "340-20" for a 40-degree range).
"flight_rules" String (Optional) "VMC" for Visual Meteorological Conditions or "IMC" for Instrument Meteorological Conditions.
"speed" String (Optional) Wind speed constraint in knots. Formats: "N+" for greater than N knots (e.g., "5+"), "N-" for less than N knots (e.g., "10-"), "N-M" for between N and M knots (e.g., "5-15").