# Status Line Options

The "status line" is the area at the bottom of the main playfield window where text messages are displayed. This dialog lets you customize what's displayed there.

There are actually two lines of text shown in the status area, an "upper" and "lower" status line. You can program separate custom messages into each line.

## Message text

Enter the messages to display in the text boxes. Enter multiple messages by writing one message per line (press the Return key to start a new line). Messages are shown in a loop in the order they're entered in the text box.

### Substitution variables

Within the text of each message, you can use a number of "substitution variables". These are special tags that are replaced at run-time with current information, such as information about the current selected game or the game filter that's currently in use.

[Game.Title] | The title of the currently selected game
[Game.Manuf] | The current game's manufacturer (Williams, Gottlieb, etc)
[Game.Year] | Year of release of the original arcade version current game
[Game.System] | Name of the current game's player system (Visual Pinball, etc)
[Game.Rating] | Star rating of the game (No Rating, 3, 4½, etc)
[Game.TypeCode] | The game's IPDB type code (SS, EM, ME)
[Game.TypeName] | The game's IPDB type, spelled out (Solid State, Electromechanical, Pure Mechanical)
[Game.PlayCount] | The number of times the game has been played
[Game.PlayCount:A:B:C] | Displays "A" if the play count is 1, "B" is it's greater than 1, or "C" if it's zero
[Game.PlayTime] | The total play time for the game (15 minutes, 1:23 hours, etc)
[Game.LastPlayed] | The date the game was last played, in the default local date format, or "Never"
[Game.LastPlayed:xxxx] | The date the game was last played, in a custom format (see below)
[Game.TableFileName] | The name of the game's table file (e.g., for a VP 10 game, its .vpx file)
[Filter.Title] | Name of the current game filter (All Tables, 70s Tables, etc)
[Filter.Count] | Number of games matching the current filter
[Filter.Count:A:B:C] | Displays "A" if the filter count is 1, "B" if it's greater than 1, or "C" if it's zero
[Credits] | Current number of credits from inserted coins
[Credits:A:B:C] | Displays "A" if the credit count is 1, "B" if it's greater than 1, or "C" if it's zero
[lb] | A literal left square bracket ("[")
[rb] | A literal right square bracket ("]")

#### Singular/plural formats

The special "xxx:A:B:C" formats can be used to construct singular or plural forms to match one of the counters. For example:

        [Filter.Count] [Filter.Count:Game:Games] Selected

The second element translates to "Game" or "Games" as needed to match the count, so the overall messages would translate to "1 Game Selected", "2 Games Selected", and so on. This lets you get the wording right to match singular and plural words to the live number, to avoid sloppy phrasing like "1 Games Selected" or the standard lazy-programmer hedge "1 Game(s) Selected".

You can specify either two or three ":" alternatives. The third alternative, if present, is a special case for 0 (zero). If you only provide two alternatives, the second (plural) form is used for zero by default. That's because English usually uses the plural for for zero, as in "0 Games Selected". If you want to specify a different form for zero, or you just want to make it explicit, you can add a third ":" case:

        [Filter.Count] [Filter.Count:Game:Games:Games] Selected

#### Date/time formats

For date variables ([Game.LastPlayed]), you can specify a custom format for the display by adding a format string following a ":". The format string uses the C strftime() codes, where elements of the date and time are represented by % codes in the string. The codes are listed in the table below. Any other text (apart from the % codes) is left unchanged, so you can mix in punctuation (such as commas or slashes) or other fixed text without any special codes. You can find full details on strftime() in the Microsoft Visual C++ reference materials online.

For example, [Game.LastPlayed:%A, %B %#e, %Y] might translate to "Thursday, May 2, 2019".

Note that if you want to use a vertical bar or right square bracket in the format string, you must write it "%/" (for a bar) or "%)" (for a right square bracket), because otherwise PinballY will interpret it as the end of the format string.

In addition to the date format string, you can specify custom text to display when the variable doesn't have a stored value, such as when using [Game.LastPlayed] with a game that's never been played. Specify this using a vertical bar, "|", followed by the custom text. The only special format codes in this section are %) for a right square bracket and %% for a single percent sign; otherwise, the text is displayed exactly as written. To extend our example above to add the custom text "Never Played" for a game with no "last played" date, we could write [Game.LastPlayed:%A, %B %#e, %Y|Never Played]. If you omit this extra custom text, the system provides a suitable default ("Never").

Code | Description | Example
--- | --- | ---
%a | Abbreviated weekday name | Thu
%A | Full weekday name | Thursday
%b | Abbreviated month name | Aug
%B | Full month name | August
%c | Full date and time representation, in locale-specific format | Thu Aug 23 14:55:02 2001
%#c | Long date and time representation, in locale-specific format | Thursday, August 23, 2001, 14:55:02
%C | Year divided by 100 and truncated to integer (00-99) | 20
%d | Day of the month, zero-padded (01-31) | 23
%D | Short MM/DD/YY date, equivalent to %m/%d/%y | 08/23/01
%e | Day of the month, space-padded ( 1-31) | 23
%F | Short YYYY-MM-DD date, equivalent to %Y-%m-%d | 2001-08-23
%g | Week-based year, last two digits (00-99) | 01
%G | Week-based year | 2001
%h | Abbreviated month name (same as %b) | Aug
%H | Hour in 24h format (00-23) | 14
%I | Hour in 12h format (01-12) | 02
%j | Day of the year (001-366) | 235
%m | Month as a decimal number (01-12) | 08
%M | Minute (00-59) | 55
%n | New-line character ('\n') |
%p | AM or PM designation | PM
%r | 12-hour clock time | 02:55:02 pm
%R | 24-hour HH:MM time, equivalent to %H:%M | 14:55
%S | Second (00-61) | 02
%t | Horizontal-tab character ('\t') |
%T | ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S | 14:55:02
%u | ISO 8601 weekday as number with Monday as 1 (1-7) | 4
%U | Week number with the first Sunday as the first day of week one (00-53) | 33
%V | ISO 8601 week number (01-53) | 34
%w | Weekday as a decimal number with Sunday as 0 (0-6) | 4
%W | Week number with the first Monday as the first day of week one (00-53) | 34
%x | The default short-form local date representation | 08/23/01
%#x | The default long-form local date representation | August 23, 2001
%X | The default local time representation | 14:55:02
%y | Year, last two digits (00-99) | 01
%Y | Year | 2001
%z | ISO 8601 offset from UTC in timezone (1 minute=1, 1 hour=100) If timezone cannot be determined, no characters | +100
%Z | The local timezone name or abbreviation | Central Daylight Time
%% | A percent sign | %
%( | A left square bracket | [
%) | A right square bracket | ]
%! | A vertical bar | |

Removing leading spaces or zeroes: you can add a # character between the % and the format character to remove any leading space or zero character, if present. For example, %#e yields the day of the month with no leading space if it's a single-digit day.

## Message switch time

The switching time sets the length of time each individual message is displayed before switching to the next message. This is given in milliseconds. A millisecond is 1/1000 of a second; 1000 milliseconds equals one second.