PinballY Update History


07-16-2022 (1.1.0 Beta 6)

* This update is just to test an attempt at a fix for the sticky wheel
auto-repeat problem some people have encountered (issue #203 on
github).  The key handler now double-checks before each auto-repeat to
see if the repeating key is actually still being pressed, and stops
repeating if not.  I haven't been able to reproduce the problem, so
this is only a wild guess at what might be going on.


05-18-2021 (1.1.0 Beta 5)

* PinballY now has its own built-in SWF renderer for Instruction Card
media.  This replaces the obsolete Adobe Flash Player, which stopped
working on most systems after Adobe pushed an update to disable
existing installations.  PinballY formerly depended upon the Flash
Player ActiveX plugin to display SWF files, so Adobe's pushed update
made it impossible for PinballY to display SWF instruction cards.

To fix this, PinballY now has its own built-in SWF renderer that
doesn't require Flash Player or any other external software.

This is brand new code, and I've only tested with a subset of the
available Instruction Card media, so I'm sure there are some (perhaps
many) existing card files that won't display properly.  If you run
into any, please send me the SWF files so that I can take a look.  (If
you want to see the way a particular SWF file "should" look, you can
still download Flash Projector from the Adobe site.  Projector is a
standalone Flash Player app that will show you how the file looks
under the official Adobe renderer.)  Please note that I only intend to
make the built-in SWF renderer work with *Instruction Card* files from
the HyperPin Media Packs.  This isn't meant to be a general-purpose
Flash Player replacement.

With the new renderer in place, PinballY no longer uses Flash Player
at all, so you can delete it from your system if you've been keeping
it around just for the sake of PinballY.  If for some reason you want
to override the built-in renderer and keep using Flash Player for now,
you can edit Settings.txt and set UseInternalSWFRenderer=0.  I don't
recommend that, since it'll be an ongoing hassle to keep Flash Player
working when Adobe is trying so hard to kill it, but the option is
there for now.  (If you have a strong objection to my plan to
eventually remove that option and switch to the internal SWF renderer
only, let me know why, and I might reconsider.  I'd prefer to remove
the Flash Player support for the sake of code hygiene - code that no
one's using just complicates the program and creates more points of
potential failures.)

* A new option in the Audio/Video dialog lets you set the DMD "dots"
high score display to use a fixed 4:1 aspect ratio, rather than
stretching the dots display to fit the window.  This only affects the
video DMD window, obviously, not a physical DMD, and it only affects
the *generated* high score displays - images and videos are still
stretched to fill the window as usual.  This might be especially
useful if you're exposing the full height of the DMD monitor, rather
than masking it behind the more traditional WPC-era DMD cutout.  The
traditional DMD cutout is about 4:1, so with that, you'd normally set
the DMD window size to about 4:1 anyway, making the default setting to
stretch the dots display to fill the window better.  But if you're
using the full window height, stretching the dots display distorts it
considerably, so you might prefer to maintain the fixed 4:1 layout
instead.  The dots image will still be scaled to fill the window as
much as possible without geometric distortion.

* Fixed a bug that appeared in 1.1 Beta 2 with shift key handling
in dialog boxes.  (Issue #175 on github.)


05-08-2021 (1.1.0 Beta 4)

* APNG (Animated PNG) files are now supported, and can be used
anywhere a static PNG image can be used.  APNG is an unofficial, but
widely adopted, extension of the PNG standard that allows embedding a
series of timed animation frames in a PNG file.  It's similar to the
animated GIF format, but has the same improvements over GIF that
standard PNG offers, particularly its support for alpha transparency
and 24-bit color.  In a PinballY context, the alpha transparency makes
APNG especially interesting for wheel icons, system icons, and any
other similar component graphics layered over the main window
backgrounds.

For the file suffix, you can use .png or .apng interchangeably.
PinballY recognizes animated PNGs from their contents, even for files
with the plain .png suffix.

This is new code that hasn't been extensively tested yet.  If you
run into any problems with particular APNG files, send me a sample
so I can try it out.

(Issue #174 on github.)


05-02-2021 (1.1.0 Beta 3)

* A new "Media Capture - FFMPEG" page has been added to the settings
dialog, splitting off the options previously on the Media Capture page
that relate directly to FFMPEG settings.  This is to make room for the
new FFMPEG options added in this version.

* A new option in the Media Capture - Ffmpeg page of the settings lets
you select the folder to use for temporary files created during a
video capture.  This is used for the video captured on the first pass
of a two-pass capture.  By default, temporary files go in the same
folder as the target media.  It might be desirable to set a different
temp folder if you have a drive that's especially fast or that has
lots of free space, for example.  (Issue #143 on github.)

* A new option in the Media Capture - Ffmpeg page of the settings lets
you specify the ffmpeg video codec options for the first pass of a
two-pass recording.  The default settings if you leave this blank use
little or no compression, which minimizes CPU usage during the live
capture phase.  This runs fast as far as CPU usage, but it creates
such large files that the disk transfer time can become a separate
bottleneck.  The new option lets you experiment with different
compression levels if you want to find optimal settings for your
system.  (Issue #142 on github.)

* Custom game filters created through Javascript can now control the
sorting order of the games in the wheel when they're in effect.  See
the new compareForSort and pageGroup properties in the descriptor
object for gameList.createFilter(), described in the help at
Javascript scripting > System Classes > FilterInfo.

* Changed the default wheel auto-repeat rate to use a minimum delay
time equal to the old default rate; if your keyboard rate is slower
than that, it'll still use that instead.  In the previous version
where the new wheel auto-repeat speed option was added, the default
was simply set to the keyboard rate, which is faster than most people
would want.  This change makes the default wheel repeat speed match
older versions.  (As pointed out in issue #173 on github.)

* Fixed a bug introduced in 1.1 Beta 2 that made the Shift keys
trigger PinballY commands even when PinballY was in the background.
If you had them assigned as Next/Previous keys, for example, they'd
spin the game wheel even when a game was in the foreground.  (If you
were using the same keys as flipper buttons in the game, you'd spin
the wheel every time you operated a flipper - probably not what you
wanted!)  (Issue #172 on github.)

* Fixed a bug in the settings dialog that sometimes prevented the
Apply button from becoming enabled after making a change to the
button/key mapping list.

* Fixed a problem in Javascript where gameList.setCurFilter() didn't
always activate a category filter properly.


04-28-2021 (1.1.0 Beta 2)

* This release is probably even more "Beta" than the previous one,
because it has some internal changes in the way the wheel navigation
buttons are handled that could be destabilizing.  On the other hand,
wheel navigation is such a core function that any problems should be
immediately obvious.  If you do run into any problems, file an issue
on github with the details (your key/button mappings might be
particularly important), and as always, you can go back to an earlier
version of the program if necessary.

* You can now specify an alternative location for the settings file
(Settings.txt) when launching the program, via a command-line
parameter.  Add the option /Settings:<folder> to the command line to
specify the folder location.  Use a fully-qualified file path starting
with a drive letter: /Settings:D:\MyFiles.  Specify the folder path
only, without the filename - this is the *location* where PinballY
looks for the file, not the name of the file.  (Issue #149 on github.)

* You can also specify an alternative location for GameStats.csv,
which is the file where PinballY stores metadata that applies to both
configured and unconfigured games.  This file is normally stored in
the PinballY program folder, but you might want to store it in a
different location, for the same reasons that you might want to store
Settings.txt elsewhere.  To specify the GameStats folder location, add
the option /GameStats:<folder> to the command line, using a full path
with drive letter.  (Issue #149 on github.)

* A new option setting lets you change the auto-repeat rate when you
press and hold one of the main wheel navigation buttons (Next,
Previous, Next Page, Previous Page).  In the past, the repeat rate was
the same as the Windows keyboard repeat rate, and this is still the
default, but you can now control the wheel rate separately.  Not only
that, but you can also set up a custom speed "ramp" that adjusts the
rate (faster or slower) the longer you hold down the button, in as
many steps as you'd like.  The new option is in the Game Wheel page of
the settings dialog; see the corresponding help page for an
explanation of how to set up a custom speed ramp.  (Issue #140 on
github.)

* A new option lets you control whether or not the Game Info Box is
displayed during Attract Mode.  The new option is on the Attract Mode
page of the settings dialog.  In the past, the Info Box was always
hidden, since it's such a static graphic that it could defeat the
screen-saver purpose of Attract Mode if displayed.  But if you prefer
to see the Info Box anyway, you can now turn it back on via the
option. (Issue #145 on github.)

* The layout of the game wheel in the main window can now be
customized via some new parameters in the settings file
(Settings.txt).  See the help under Customizing > Wheel Layout.
(Thanks to Stephen Houser for implementing this enhancement.)

* A new "Paging Mode" option in the Game Wheel page of the settings
dialog lets you control how the Next Page and Previous Page commands
(which navigate through the wheel by letter group) treat games with
non-alphabetic titles, such as 2001 or 8 Ball.  See the help under
Option Settings > Game Wheel.  (Addresses issue #139 on github.)

* .mov is now recognized as a video file suffix.  (The video layer,
libvlc, has long supported .mov files, so this is just a matter of
including .mov suffixes in PinballY's media searches.  The only reason
it wasn't included in the past was that I wasn't sure how well libvlc
supports .mov files, but they appear to work just fine.)

* Javascript now has more access to joysticks.  You can get a list of
attached joysticks, and information on a particular joystick, via the
new method mainWindow.getJoystickInfo().  That method returns
JoystickInfo objects, which provide extensive details on the joystick
device, and also let you read the live button status and control axis
values at any time.  The new JoystickAxisEvent class also lets you set
up event handlers for axis value changes.  Refer to these help
sections for more:

  Javascript scripting > System Objects > Window Objects > mainWindow
    mainWindow.enableJoystickAxisEvents()
    mainWindow.getJoystickInfo()
  Javascript scripting > System Classes > JoystickInfo
  Javascript scripting > Events > Event Types > JoystickAxisEvent

There's also a new worked example, "Joystick Game Switcher", showing
how to use these facilities to implement game switching using the
joystick (which address issue #133 on github).

* Javascript can override the wheel spin repeat rate for particular
events.  See mainWindow.setWheelAutoRepeatRate() in the help.

* In Javascript, optionSettings.set() now accepts 'undefined' to mean
"erase this setting" (it was already documented this way, but it
didn't work properly before).


03-27-2021 (1.1.0 Beta 1)

* I'm calling this release a Beta, since it has some significant new
features that could use some field testing, but mostly just in case
any of the code changes for the new features happen to accidentally
create any problems with existing functionality.  If you run into any
serious problems, you can always switch back to the 1.0 release until
they're fixed.

* The generated high-score display now uses all of the VPinMAME color
option settings stored in the registry when generating dot-style high
score messages in the video DMD window.  In the past, the basic
VPinMAME dot color setting was used, but the colorization options and
brightness ramp settings were ignored.  All of these options are now
taken into account, using the same algorithm that VPinMAME uses to
figure the colors.  This should make PinballY's generated high score
displays match the live VPinMAME displays (i.e., when a table is
actually being played) more consistently.  (The VPinMAME options we're
talking about are set through VPinMAME, not PinballY; to access the
VPinMAME options, launch the game with Visual Pinball and bring up the
VPinMAME options dialog by pressing F6.)  (Issue #161 on github.)

* A new worked example in the help ("Custom game launch options for
media capture") shows how to edit the game system's command line
specifically for a media capture operation.  This is useful in
particular for VPX users who normally run in Exclusive Full-Screen
Mode, since exclusive mode by its nature prevents media capture from
working.  The example shows how you can automatically disable VPX's
Exclusive mode just for the duration of a media capture launch, so
that you don't have to manually toggle it on and off when performing
captures.  (Issue #146 on github.)

* You can now drag and drop images and videos directly from most Web
browser windows into a PinballY window to install media.  In the past,
this worked when dragging from the Windows desktop, but not
necessarily from other programs such as Web browsers.  (Support in a
particular Web browser depends upon the browser implementing the
Windows drag/drop system using one of the common interchange formats,
which most modern browsers should do as a matter of course.)

* When a game system needs to run in Administrator Mode, PinballY now
offers an option to trust that particular program permanently when it
asks for your approval to perform the Administrator Mode launch.  The
menu asking for approval now gives you separate options to approve the
Admin Mode launch just for this session, or "always".  There's also an
option to cancel, of course.  If you select the "always" option, the
game program will be marked as trusted in the settings file, and
PinballY won't ask again in future sessions for this particular
program.  (Issue #138 on github.)

(In the past, there was no "always" option, so it was only possible to
approve the launch for the duration of the current PinballY session.
I deliberately didn't provide an "always" option because Windows
doesn't have a secure way to mark a program as trusted; in order to
accomplish this, I had to rely on PinballY's own insecure settings
file.  So I was concerned about the possibility that a malicious
program could manipulate the settings file to bypass the warnings.
However, after further consideration, I decided that this isn't a
meaningful risk, in that a malicious program with that kind of access
to your hard disk could already just as well overwrite PinballY itself
with a fake version; there's nothing they could do via the settings
file that they couldn't already do more easily by other means.  So I
don't think this creates any new vulnerabilities.  As always, the real
solution to the potential security risks here is to avoid using Admin
Mode AT ALL for any pinball-related software - there's almost never a
good reason to do so, and it inherently opens security holes.)

* Fixed a few rough edges in the UI with launching and exiting games
that run in Admin Mode.  (E.g., the "Paused Game" menu sometimes
popped up unnecessarily when you terminated an Admin Mode game with
the Exit Game button.)

* Javascript code can now create its own custom windows, which operate
just like the built-in "secondary" windows (the backglass window and
so on).  The new mainWindow.createMediaWindow() method creates these
windows, and the new gamelist.createMediaType() lets you define your
own new media types.  Combining a custom window with a custom media
type makes it pretty easy to define your own extensions to the
standard set of windows, that operate almost as though they were built
in.  Custom windows can also be controlled through scripting code to
provide more complex behavior than just the standard background media
display.  The new methods just mentioned are documented in the help
under the respective objects (mainWindow, gameList).  You can find a
number of examples of how to use custom windows and custom media types
in Worked Examples > Custom Media Window.

* The new Javascript classes HtmlLayout and Styled Text make it easier
to draw complex text layouts that use mixed font styles and layout
effects.  HtmlLayout accepts a fairly full-featured subset of HTML/CSS
to specify the layout, and provides methods to measure the resulting
layout and draw it into a Drawing Layer or any other Custom Drawing
context.  StyledText also provides mixed-style rendering, but uses a
simple programming interface to build the text stream (instead of
using a markup language).  You can use any of the normal graphics
primitives alongside HtmlLayout and StyledText objects in the same
drawing context, so you can use these objects to create composite
graphics from multiple elements.  See the help under Javascript >
System Classes > HtmlLayout and Javascript > System Classes >
StyledText.

* Javascript custom Drawing Layers can now be layered behind the main
background layer in a window that the system uses to draw the window's
primary media (e.g., the backglass video).  Use a negative Z index
when creating the layer to place it behind the main system background
layer.  This isn't useful in most of the standard windows, since the
main media background usually is opaque and fills the entire window
(so if you create a layer behind that, you'll never see it, since the
main media will always completely occlude it).  But it could be useful
in custom media windows where the main background media might be
partially transparent, such as Wheel Image PNG files.

* New Javascript event set: Media Sync Events, which let script code
coordinate actions with changes of background media in the various
windows.

* New Javascript method: gameList.setWheelGame(), for directly
changing the game selection in the wheel UI.  See the Javascript
section in the help for details.

* Javascript code can now use HANDLE and HWND types as "out"
parameters, for Windows APIs that return handle values in pointer
variables.  This means that handle variables act the same way as other
native types when used as pointer parameters in Windows APIs where a
handle is returned via the pointer param.  Simply pass a variable
containing a HANDLE or HWND object as an argument where a HANDLE* or
HWND* parameter is specified in the API parameter list, and the
variable will contain the returned handle after the API returns.

* Fixed a problem in the Javascript interpreter that prevented
creating handle objects via "new HANDLE()" with Int64 or UInt64
arguments.  The interpreter didn't convert the value correctly; it
simply returned a valid HANDLE object containing a null handle value.
This is now fixed.

* Fixed an error in the Javascript system classes that caused a
runtime error on attempting to use "new HANDLE()" or "new HWND()" to
explicitly create a handle object.


07-23-2020 (1.0.0 Release)

* This is the first official "Release" version of PinballY!  The last
several Beta releases have had only small changes other than bug
fixes, plus the most recent Beta has been in circulation for a couple
of months, so I felt this is a good point to declare a stable release.

This being an open-source project, the distinction between Beta and
Official Release is purely symbolic; it ultimately makes no tangible
difference to anyone what we call it.  (Unlike a commercial product,
where it often determines who has access and what level of support
they get.)  But even so, it's a useful bit of symbolism, in that it
lets users know how stable and complete the developers believe the
project to be.

* Slight tweak to the "typewriter" high score font settings: you can
now specify a point size for the font in the options.  In the past,
the font size was always scaled automatically so that about 8 lines of
text would fit into the background image; that created the look I was
after for the default "index card" background, but wasn't necessarily
the right look for arbitrary custom backgrounds.  So now you can set a
specific point size instead of letting the system scale the font
automatically.  If you leave the point size as default ("*") in the
options, the auto-scaling will still apply, but you can also select a
specific point size instead if you prefer.

* Fixed a problem in the Javascript system scripts for HttpRequest.
(Specifically, the script code needed to be updated to match a change
in Beta 19 to how OLE Automation object properties were accessed; this
caused scripting errors when sending requests using the object.)

* In the past, the status line text messages were loaded from the
settings file twice during the initial program startup, due to a fluke
in the initialization procedures.  This had no visible effect in the
UI, but it complicated things for Javascript code that wanted to stuff
messages into the status rotation during startup, because the second
system initialization step had the effect of erasing any messages
Javascript startup code had added up to that point.  The unnecessary
second initialization step has been removed, so Javascript can safely
add status messages during startup and expect them to be visible, at
least until the next explicit user action that reloads settings (such
as making changes in the Settings dialog).


05-31-2020 (1.0.0 Beta 24)

* You can now provide a custom background image or video that's
displayed in the playfield window during the game launch process.
Normally, the system covers the playfield window with a simple dark
gray background.  You can override this by placing an image file
called "Game Launch Background.png" (or .jpg or .gif) in the Media >
Images subfolder (under the main PinballY install folder), OR a video
file in Media > Videos called "Game Launch Background.mp4" (or any of
the other supported video format extensions - .avi, .f4v, etc).  Much
more extensive customizations are possible via Javascript, but this
new feature is easier when you only want to replace the background.

Tip: if you merely want to keep the game's background video or image
showing during launch, for a "seamless" launch effect, all you have to
do is provide a transparent PNG file for the launch background.  For
your convenience, a suitable file called "Transparent.png" is included
in the Media file.  Simply copy this file into the Media > Images
folder and rename it to "Game Launch Background.png".

* A new font option lets you set the display style for launch status
messages, as well as the color of the default background displayed
during launches.

* A new option in the media capture settings lets you limit the
resolution of captured videos to HD (1920x1080).  By default, the
media capture function creates videos with exactly the same pixel size
as the screen area being captured.  If you have a 4K or similar large
monitor, though, the resulting videos might be too taxing for your
system to play back smoothly, especially if you have an older or
lower-end system.  The new option lets you reduce the resolution of
the captured videos to HD.  The new setting is accessed via a checkbox
on the Media Capture page of the settings dialog, "Limit captured
videos to HD resolution".

The resolution limit option applies to the capture process, so it
doesn't have any effect on existing videos.  Existing videos files
will continue to play back at whatever resolution they were captured
at - 4K videos will continue to play at 4K, for example.  If you want
to reduce the resolution on an existing video file, you'll have to
replace the old video file with a new capture, after enabling the
resolution limit option.

* A new option in the Folders section of the options dialog lets you
tell PinballY to sort the contents of the XML database files (in order
of table title, alphabetically) whenever saving changes.  By default,
PinballY preserves the original ordering of the file when saving
changes, in case you intentionally ordered the entries in a particular
way.  If you prefer, you can set this option to make PinballY re-sort
the file alphabetically by table title on each update.  This might be
preferable if you need to hand-edit the files outside of PinballY.

* It's now easier to customize the display style for the "tt"
(typewriter) style of high score display used for electromechanical
(EM) games.  First, you can provide your own custom background image,
to override the default "index card" background, by placing an image
file named "TT High Score Background.png" (or .jpg, etc) in the Media
> Images folder.  Second, a new item in the Fonts page in the settings
dialog lets you specify the font and color for the text.

* PinballY can now read high scores from an ad hoc text file, for
games that don't work with the PINemHi program.  This can be used to
supply live high score information for re-creations of EM-era tables
in VP, for example, since those don't use VPinMAME ROMs and thus
aren't compatible with PINemHi.  See "High Scores" in the help for
details.

* PinballY can now store a title for each game in the XML database
independently of the media name.  In the past, the <description> tag
served both purposes, via the convention that the media name is
formatted as "Title (Manufacturer Year)".  This was for the sake of
full compatibility with the original HyperPin/PinballX XML schema, but
it was problematic in some cases, given that PinballY internally
treats the title and media name as independent, and lets you change
them independently.  If you explicitly changed the title and/or media
name in such a way that the media name no longer matched the "Title
(Manufacturer Name)" format, PinballY had no way to store both changes
in the XML, so the updated title was lost the next time you restarted
the program.  To address this, PinballY now adds the new tag <title>
to the XML whenever the media name doesn't match the standard
convention.  This lets it keep track of the title and media names
separately when they don't match.  <title> isn't part of the original
HP/PBX schema, so those programs will ignore it if present.  To
minimize the risk of any compatibility issues in case you want to use
the resulting XML with HP or PBX, PinballY only generates the new
<title> tags when necessary.

* Fixed a problem with high-score displays using the alphanumeric
style, which caused the image to be displayed at the wrong position
(not properly centered) in the DMD window if the window didn't have a
4:1 aspect ratio.  The positioning was further off-center the further
your window layout was away from a 4:1 ratio.  This has been fixed;
the image should be properly centered now regardless of the window
layout.

* Fixed two problems with searching for era-specific manufacturer logo
files (e.g., "Bally (1970-1975).png").  The first problem prevented
era-specific logo files from being displayed at all if they contained
a space between the manufacturer name and the parentheses enclosing
the year range; spaces (one or more) are now accepted.  The second
problem was a caching issue that caused the year-range file displayed
for the first visited game from a given manufacturer to be displayed
for all subsequently visited games from the same manufacturer,
ignoring the release year of the other games.  Both of these bugs
should now be fixed.  (See "Manufacturer logos" in the help section
for Settings > Info Box Options.)



04-22-2020 (1.0.0 Beta 23)

* On game launch, any table audio and video tracks playing are now
muted immediately.  In the past, they kept playing until the videos
were stopped - which, starting in Beta 17, doesn't happen until a few
seconds after the game process has started, to give the game a chance
to draw its initial graphics before the PinballY videos stop.  The
overlap was intended for a more seamless graphics display during game
launch, but the continuing video playback also meant continuing audio
playback, which sometimes caused unwanted overlap between the PinballY
audio and the game's audio.  With this change, videos continue playing
as before, but all background audio is now muted immediately on
launch.

* When you renamed a game and opted to rename existing media files to
match the new name, the system didn't include the real DMD media files
and launch audio files in the files to be renamed.  This has been
fixed.  (Issue #123 on github.)

* When you switch PinballY back to the foreground after using other
programs, any table files you deleted from the file system will now be
automatically removed from the on-screen wheel.  (With one exception:
if you enter a game's details via the Game Details dialog or by
manually editing the XML database files, the game will remain in wheel
UI even if you delete its underlying table file.  This is so that
database records can exist independently of table files, and so that
the same details can be re-used for a different table file later.)

(PinballY has always scanned for *new* table files whenever you switch
the program back into the foreground, so the idea of keeping the wheel
display in sync with the live file system isn't new.  The new part
here is the check for files that were just deleted.)

* The program now accepts the "Yes", "Y", "True", "T", and "1" as
affirmative values for <enabled> item in the XML database files.  In
the past, only "True" was accepted.  This is to improve compatibility
with hand-edited XML files or files manipulated by other programs,
since there appears to be some variation in the format that different
people and different programs use for this tag.


03-19-2020 (1.0.0 Beta 22)

* Fixed (again) muting of real DMD videos muting in Attract Mode; this
time the problem was that they wouldn't stay muted when the automatic
game switching occurred.  The same thing happened with table audio
tracks, which has been fixed as well.  (Issue #120 on github.)

* Fixed a problem with the audio/video playback where the audio volume
and mute settings were forgotten at the end of each playback loop and
reset to unmuted full volume.  The volume and mute status should
remain the same across looped playback cycles now.  (The problem was
due to an apparent bug in libvlc, and unfortunately the bug occurs in
a background thread, so the timing is unpredictable.  The workaround I
added is therefore itself time-dependent.  That makes it hard to know
if it will be 100% reliable on every machine or with every video
track.  It seems reliable in my testing, but the timing might need to
be adjusted to make it reliable universally.  So let me know if you
see any recurrence.)


02-25-2020 (1.0.0 Beta 21)

* In the past, the real DMD video wasn't included among the videos
that were muted when entering Attract Mode (assuming the options were
so configured), so its audio track incorrectly continued to play.  The
real DMD video is now muted along with the others.  (Issue #118 on
github.)

* MP3 playback is now handled through libvlc (the same codec layer
that we use for video playback), rather than DirectShow (as it was in
the past).  The main reason for this change is that libvlc has better
MP3 support than DirectShow does; DirectShow can't play some types of
valid MP3 files due to limitations in its codecs.  Since we're already
incorporating libvlc for video playback anyway, this change has the
beneficial side effect of reducing our external dependencies, and the
dependency we're eliminating in this case is an especially good one to
eliminate, as DirectShow is an older technology that Microsoft is no
longer developing.  (Addresses issue #116 in github, and should fix
playback for any other MP3 files that weren't playing in past
versions.)


01-31-2020 (1.0.0 Beta 20)

* When PinballY is in "Paused Game" mode, meaning that you've used the
Pause Game command to suspend a game and bring PinballY to the
foreground, the main menu is now automatically displayed any time
there's nothing else going on (that is, when no other menu or popup is
being displayed).  In the past, the menu came up automatically when
you first paused the game, but it didn't reappear on its own after
that.  For example, if you brought up the game's flyer, and then
dismissed it, you'd just see the blank "Game Running" screen, and
you'd have to press the Start button to bring up the menu again.  This
change is meant to make the Pause mode a little more convenient and
intuitive.  Some people weren't sure what they were supposed to do
with the blank "Running" screen, and there's really nothing else you
can do there apart from bringing the menu back up, so the system might
as well do that for you automatically.

* Added a new DOF event that fires when PinballY starts up:
PBYProgramStartup.  You can use this in the DOF Config Tool to trigger
DOF effects each time you run the program.  (There's no corresponding
"program exit" event, because DOF automatically resets all devices
when the host program terminates, which would make a "program exit"
event useless.  Any effects such an event triggered would be canceled
as soon as the DOF reset occurs.)

* Javascript code can now fire DOF events, via mainWindow.DOFPulse()
and mainWindow.DOFSet().  See the help under Javascript scripting >
System Objects > Window Objects > mainWindow.

* Javascript code can now receive notifications of DOF events, via
the new "dofevent" event.  See the help under 

* Javascript code can now pause and resume videos playing in custom
drawing layers, via the new methods pause() and play(), can set the
volume via the new "volume" property, can set muting via the new
"mute" property, and can load a video initially paused via the new
"play" property in the loadVideo() options argument.  See the help
under Javascript Scripting > Drawing Layers for details.

* A new Javascript event, videoend, fires at the end of a video
playing in a Drawing Layer.  See Javascript scripting > Events > Event
Types > VideoEvent in the help.

* Fixed a problem that sporadically caused the program to "freeze"
(stop responding to input) after returning from a launched game
session or a media capture session.  The problem only affected
releases Beta 18 and Beta 19.  (Issue #111 on github.)

* The Manual Capture Start/Stop button options weren't being respected
properly when using the "PinballY Admin Mode" version of the program.
That version always assumed you were using the default setting of
"press both flipper buttons".  It now respects the actual option
setting.



01-21-2020 (1.0.0 Beta 19)

* Made some further tweaks to the way windows are rearranged when
switching between PinballY and a launched game (that is, when starting
a game, pausing, resuming, and terminating), to try to make focus and
window layering more reliable when switching between the game and
PinballY.  This is an attempt to fix some remaining cases where either
the game or PinballY didn't always come to the foreground when
desired.  (This sort of focus/activation processing is always fragile
in Windows, so it's possible that these changes will create new focus
problems that didn't exist before as well as solving some prior ones,
but hopefully this will at least be a net improvement.)

* When resuming a game after pausing, PinballY automatically restores
the game window if it's minimized.  This is for the sake of games
running in "exclusive full-screen" mode, a special graphics mode that
some game programs use to take over a whole monitor at the hardware
level.  When a game is running in "exclusive" mode, Windows has to
minimize the exclusive window when switching to another application,
because such a window by design can't share screen space with other
programs.  So when PinballY suspends an "exclusive" game with the
Pause Game command, the exclusive window will be minimized as long as
PinballY is in control.  That means we have to restore the window in
order to switch back to the game.  This change should make Pause/
Resume transitions work better for games running in "exclusive" mode.

* Added a new option to force the playfield window to the foreground
during the game launch process.  To enable this, go to the Windows
section of the options dialog and check the box for "Keep the
playfield window in front of other applications during launch".  This
is intended as a workaround if you have any problems with other
application windows coming to the foreground during game launches.
I'd only enable it if you actually have this sort of problem in
practice, since attempts at explicit window layering can turn into an
arms race with other programs; it's best not to get started down that
road if you can avoid it.

* Fixed a problem with saving the last media type selections when
performing a media capture operation.  (Issue #98 on github.)

* Fixed a bug that didn't display any text for a game title in the
wheel (for games without wheel images) when the "Wheel" font in the
options was set to a point size smaller than 40 points.  (Issue #109
on github.)

* Fixed a bug that cut off the last character of some titles in the
game wheel when displayed as text (for games without wheel images),
depending on the font selected for the "Wheel" font in the options.
(Issue #109 on github.)

* When writing XML files for table databases, apostrophes in game
titles are now left as literal apostrophes in the XML text, rather
than being converted to the XML "&apos;" entity format (as they were
in the past).  The "&apos;" format is valid XML, but PinballX doesn't
parse it properly, which caused a couple of problems if you tried to
share files with PinballX or the PBX Game Manager.  The "&apos;"
conversion isn't technically required for XML purposes, so this change
won't affect the validity of the XML, and will let PinballX read the
files more easily. (Issue #108 on github.)

* In Javascript, it wasn't possible to write to read/write properties
of OLE Automation (scripting) objects.  This has been fixed.  (Issue
#110 on github.)  

* Javascript support has been added for read/write access to OLE
Automation object properties that require index argument.  The Visual
Basic array-variable-like syntax used to assign to such properties
doesn't translate to Javascript, so we have to use the C++ convention
of adding a method called put_PROPNAME() to assign values to such
properties.  For example, for the standard Windows scripting object
Scripting.Dictionary, the "Item" property requires a "key" argument
when reading or writing.  To read an Item property, use the same
notation as in Visual Basic, "object.Item(key)".  To assign a value to
an Item property, however, we have to use the C++ "put_" convention:
"object.put_Item(key, value)".  See "Properties" in the the Javascript
> OLE Automation section in the help.

* In Javascript, "By Reference" parameters are now supported when
calling methods in OLE Automation (scripting) objects.



01-01-2020 (1.0.0 Beta 18)

* Added a new option to keep the DMD window in front of the backglass
window at all times.  This might be handy if you have a single-monitor
or two-monitor setup, and you want to keep the backglass and DMD
windows on the same monitor.  The new option is under the Windows page
in the options dialog.  (Note that the option only applies to
PinballY's own DMD window.  It doesn't affect any of the other DMD
windows in other programs, such as the "virtual DMD" window that
Freezy's dmd-extensions system shows, or the VPinMAME DMD window.
Those are controlled by separate programs, so PinballY can't set their
layering.  Freezy's dmd-extensions has its own config file where you
can set its virtual DMD window to "always in front mode"; I don't
think there's any such option for the VPinMAME window.)

* Fixed a problem in the Real DMD handling that made PinballY stay
attached to the DMD device while the game was running, even if you
didn't have the "Keep using real DMD" option set for that game.  When
this happened, it prevented the game from accessing the DMD device.

* If PinballY ever gets stuck behind another window or loses keyboard
focus, you should now be able to make PinballY active again by
pressing and holding the Exit Game button for a few seconds.  (Exit
Game is usually mapped to the Escape key.)  Ideally, you'd never run
into such a situation in the first place, since PinballY goes to some
trouble to keep itself in the foreground automatically whenever it's
appropriate for it to be there.  But focus on Windows can be hard to
control, since other applications (and Windows itself) sometimes want
to fight over it.  So this new press-and-hold gesture is meant as a
last resort.  Hopefully it'll serve as a more convenient way to get
focus back if such a situation does arise (more convenient than, say,
reaching for the mouse).  (Issue #101 on github.)

* Fixed a couple of special cases on Windows 7 where the Windows
desktop could force itself to the foreground and steal keyboard focus
if you launched a game and then immediately tried to close it, before
the game had finished launching.  (Related to issue #79 on github.)

* In the past, if the launched game had a dialog box open, pressing
the Exit Game button sometimes caused PinballY to get stuck until you
manually closed the game's dialog box.  This is because PinballY
normally tries to close a game "gently", by closing its windows rather
than asking Windows to forcibly terminating it, since abrupt process
termination can prevent the game from saving any settings updates
properly before it exits, and can sometimes even cause instability
across the whole system, since it can leave device drivers in
indeterminate states.  The problem is that "gently" closing a program
by closing its windows might not work if one of those windows is a
dialog box, because dialog boxes tend to disable the normal close
commands, in order to force you to acknowledge them by clicking one of
their buttons.  So PinballY now tries to send a CANCEL DIALOG command
along with the CLOSE command.  This isn't fool-proof either, but it
works for most dialogs in most programs, so it should be more reliable
than the CLOSE command alone.  In addition, PinballY no longer gets
stuck in these situations in any case; whereas it used to wait
indefinitely for the program to acknowledge these commands, it now
only gives the programs a brief interval to respond, so PinballY
should quickly become responsive again even if the game program itself
is stuck.

* The installer now remembers the folder location where you installed
the program, so that it can use it as the default location the next
time you update.  In the past, the installer always just started with
the default path C:\PinballY, so you had to re-select the correct
folder on each update if you placed it in some other folder.  This
comes at the expense of dramatically DOUBLING the program's number of
registry keys (from one to two!), but it's pretty benign as Windows
registry use goes, as it's not used for any other purpose and will
have no effect on normal program operation (of PinballY or anything
else).  And note that the automatic default unfortunately WON'T work
on THIS update, since the last version you installed didn't save the
information for this update to restore.  But after you install this
version, future updates should reap the benefits by saving you that
extra step during the install process.

* In the Edit Game Details dialog, if the game's table type was set to
something besides one of the standard table type codes defined by IPDB
(EM for electro-mechanical, ME for pure mechanical, or SS for solid
state), the Table Type box was shown as empty when you brought up the
dialog.  The box now shows the custom code.  The same thing applies to
the high score style.



12-28-2019 (1.0.0 Beta 17)

* You can now customize the text colors for most of the text displays,
via color buttons alongside the font selections in the Fonts & Colors
section of the options dialog.

* You can now tell PinballY to continue showing PinballY media on the
real DMD device while a game is running.  This works the same as the
existing "Keep windows open when running" options for the regular
windows, so you can enable or disable it globally, for all games using
a given system, and for individual games.  To set the global defaults,
use the Game Launch page in the settings dialog; to set the default
for each system, use the system's settings page; and for individual
games, use the Edit Game Details dialog.  In each of these dialogs,
you'll see a new "Real DMD" checkbox alongside the existing checkboxes
for the backglass window, instruction card window, and so on.

Note that a real DMD device can only be accessed by one program at a
time, so if you tell PinballY to continue showing its media on the
real DMD while the game is running, the game won't be able to show
anything on the DMD, since PinballY's continued use of the device will
lock out the other program.  That makes the option best for games that
don't use the real DMD themselves.

* Animated GIF files are now supported anywhere images can be used.
Note that GIFs always count as *images*, not videos, even when
animated.  This can be important when choosing media folders for
installing files - always put GIFs in the media folders intended for
regular images, never in video folders.  (I know this might seem a
little weird given that an animation is more like a video than like a
still images, but it does have the virtue of being simple and
consistent: GIF = image, period.  The technical reason is that libvlc
doesn't support GIF animation properly, so we couldn't treat them as
videos even if we wanted to.)

* A new checkbox option in the Game Wheel section of the settings
dialog lets you enable or disable the underlay display.  (Disabling
this doesn't prevent Javascript from displaying underlays; it only
disables the system's built-in underlay display feature.)

* Javascript now has access to the overlay graphics displayed when a
game is launched, allowing for complex customizations.  See the help
sections for the new LaunchOverlayEvent group and the new
mainWindow.launchOverlay property.  Also see the "Worked Examples"
section in the help to see how you can use this to create a
"seamless loading" experience, where the playfield in the main window
continues to be visible through the loading process until the launched
game takes over the screen.

* A new "custom drawing layers" feature in Javascript lets you display
your own custom graphics in any of PinballY's windows, layering your
graphics on top of or interleaved with the system's standard graphics.
This can be used to create your own additions to the UI.  Drawing
layers can display image or video files, and can also be used with the
custom drawing API to create complex graphics.  See Javascript
Scripting > Drawing Layers in the help for more on this.

* Alpha channel information in videos is now supported.  Alpha refers
to per-pixel partial transparency, for superimposing one video on top
of another.  PinballY will now use alpha channel information whenever
it's part of a video, but it's not particularly interesting for
background videos (such as the playfield or backglass video), since
there's nothing "behind" these videos to show through the transparent
areas - just a black background.  The only current built-in feature
where alpha is useful is the "launch overlay", since this is layered
on top of the playfield background.  In addition, they might be useful
in conjunction with the new Javascript "custom drawing layers"
feature, since that lets you overlay your own graphics onto any
window.

In order to take advantage of the video transparency feature, you have
to create your video with an alpha channel embedded in the video
itself.  This is only possible with a few formats, including FLV, MOV,
and AVI; most of the other formats (including MP4, MPG, and H.264)
have to way to store alpha in the video.  It also requires a video
editor that supports transparency, so that you can designate
transparent areas in your videos and save them to an alpha-capable
format.  Higher-end video tools like Adobe After Effects are generally
capable of creating videos in this sort of format.  See "Transparent
Videos" in the help for more details on this.

* The "Resume Game" command will now do a better job of restoring
focus to the original game window after a "Pause" command.  In the
past, when you resumed a game that was paused, the system looked for
an open top-level window owned by the game process, and gave focus to
that window.  This usually worked, but in game systems that display
multiple windows (such as VP when using a backglass and/or DMD
window), focus sometimes went to one of the secondary game windows
instead of the game itself.  With the new approach, PinballY notes the
specific game window that's active at the time of the Pause command,
and returns focus to that same window on Resume Game.  This usually
puts focus back in the right window, since presumably focus was in the
right window before the Pause.  At the very least, it restores the
same focus condition as before the Pause.

* When launching a game, the system now waits for the game to open a
visible and non-minimized window before it considers the game to be
fully loaded.  In the past, it was enough for the child process to
have started up.  This is meant to make the UI transition between
PinballY and a launched game a little smoother by leaving the PinballY
displays on the screen until the game actually displays something,
which for many game systems takes several seconds.

* In the "Custom Drawing" API used in the Popup mechanism to draw
custom popup box graphics, you can now specify alpha channel
(transparency) information in all of the drawing context methods that
accept color parameters.  Specifically, this affects the fillRect(),
frameRect(), and setTextColor() methods.  The alpha component of the
color is specified in the high-order 8 bits of the 32-bit color
value: for example, 0x80FFFFFF is 50% transparent white.

For convenience, as well as compatibility with existing code, the
drawing context has a default alpha value that's applied to any color
parameter passed with an alpha component equal to zero.  This is
initially set to 0xFF, equivalent to fully opaque, so any color that
doesn't specify a non-zero alpha will automatically be set to fully
opaque.  You can override this in any color parameter simply by
including a non-zero alpha value.  You can also change the default
alpha via the new defaultAlpha property.  If you want to be able to
draw fully transparent areas, you must set defaultAlpha to zero, since
that causes a zero alpha in a color parameter to be kept with a zero
value, since applying the default of zero leaves it as zero.

* Font selections in the option settings can now specify Italic
styles.  In the Fonts page of the options dialog, the "Style" drop
list now offers Italic and Bold Italic options.  (This drop list
formerly only offered weight settings, for normal or bold.)

* When loading a font, the system now tries italic and bold style
variations if the "regular" style can't be loaded.  This should allow
using certain TrueType fonts that didn't load properly on Windows 7.
In particular, it should help with fonts that contain only an "italic"
or "bold" variation in the font file.  Most TrueType fonts provide
either just a "regular" style, or a full set of regular, bold, and
italic styles.  But some font files omit the regular style and only
include bold or italic variations.  Apparently, Windows 7 will act
like a font doesn't exist if you ask for "regular" and the font only
has "italic".  Since PinballY previously only tried the "regular"
variation, fonts that didn't have a "regular" style didn't load on
Windows 7.  This wasn't problem on Windows 8 and later, as Microsoft
apparently fixed this at the OS level in Win 8.  (Issue #93 on
github.)

* The Javascript drawing context method setFont() has a new parameter
letting you specify italic style.  In addition, the new method
setFontFromPrefs() lets you set the drawing font to one of the fonts
defined in the settings.  See "Custom Drawing" in the help.

* Fixed a Javascript type conversion error that occurred when calling
certain system methods with an argument value of zero in certain
argument slots.

* Added recognition of USB game pad devices when detecting joysticks.
(This is currently experimental.  It just adds the recognition, and
uses the existing joystick input parsing code, so I'm not sure it'll
actually work with every game pad.  Joysticks and game pads are quite
similar at the USB protocol level apart from the device code, but
there might be some differences that the current PinballY joystick
code won't handle correctly.  It'll at least recognize them, so that
people with game pads can try them out to see how they work.)

* Still images are now loaded in a background thread, which should
reduce visible pauses in the video display when large images are being
loaded.  This should make the UI a little smoother when switching
between games, for example.

* The rendering for the alphanumeric display style for high scores on
the video DMD has been revamped to look a little nicer, using a new
algorithm based on Freezy's approach in his dmd-extensions system.
The old algorithm used a set of pre-rendered images that came from
photos of a real display, which were at least photo-realistic (being
based on actual photos!).  But the photos weren't all that great, and
I thought Freezy's synthetic rendering approach looked a lot nicer.
The photographic source approach also limited the number of colors
that could be used.  The new code renders the individual lighted
display segments using vector graphics and a glow effect, so it's
infinitely flexible on color and scales well to any size.



11-29-2019 (1.0.0 Beta 16)

* Underlays weren't loaded if Javascript wasn't active.  This has been
fixed.

* Fixed a crash at load if the new "full screen restore method"
variable wasn't defined in the settings files.


11-28-2019 (1.0.0 Beta 15)

* "Underlay" graphics have been added.  The underlay is an image layer
displayed at the bottom of the screen, in the area where the "wheel"
icons appear.  It's just there as a little extra decoration.  If you
think about the images as layers, the underlay is on top of the
playfield background image, and under the game icons on the wheel
(thus the name).  PinballY comes with a default underlay image, but
you can substitute your own.  You can also supply a different underlay
image for each game system, to provide more visual cuing about the
nature of the selected game in the wheel.  See the section on the
underlay in the help files for more details.

* Several new settings controlling the layout of the underlay graphics
have been added to the Game Wheel section of the options dialog.

* The underlay is accessible from Javascript.  When the underlay is
about to change, the system fires the new "underlaychange" event,
which you can intercept to prevent the change or substitute a
different image file.  You can also change the underlay yourself at
any time via the new method mainWindow.setUnderlay().  See the
relevant Javascript sections in the help for more details.

* A new option in the Startup section of the options dialog lets you
tell PinballY to (try to) force keyboard focus into its window at
program startup, after an optional delay.  Enable this if desired via
new checkbox "Force keyboard focus to PinballY at startup".  You can
also specify the delay time for the focus change.  If this is enabled,
PinballY simulates a mouse click in its main window shortly after
program startup (and after the specified delay), to try to force the
window to the foreground and force it to take keyboard focus.  Windows
doesn't always give focus to auto-launched programs at system startup,
particularly on Windows 10, so you can use this to force a focus
change without having to use the mouse manually.

* You can now select the method that PinballY uses to restore the
saved positions of full-screen windows.  In the Startup section of the
options dialog, there's a new option, "Restore full-screen window
positions based on:", with two radio-button options:

  - Nearest monitor to saved position
  - Exact saved pixel coordinates of full-screen window

The "Nearest Monitor" method is the default, and it's the method that
was always used in the past.  This method uses the original position
of the window BEFORE it was switched to full-screen mode to find the
nearest containing monitor, positioning the window to exactly fill
that nearest monitor.  The new "Pixel Coordinates" method is more
literal: it simply restores the full-screen window to the same pixel
coordinates the window used in full-screen mode in the last session.
This is less flexible than "Nearest Monitor", because it doesn't adapt
to any changes to the desktop layout or screen resolution that you
might have made since the last session.  However, by the same token,
it might be better NOT to adapt in cases where you routinely make
temporary changes to the screen layout, since the "Nearest Monitor"
method might undesirably move your windows around (because it's
"adapting") every time you change modes.  If you have problems with
full-screen window positions not sticking properly across sessions,
and you're doing something that frequently changes the desktop layout,
the "Pixel Coordinates" method might fix it for you.

* A new option in the Status Lines section of the options dialog lets
you disable all status line displays.  Un-check the "Enable status
line display" box to prevent status line displays.

* Some new status line substitution variables have been added:

  - [Game.Rating] for the star rating ("1 star", etc)
  - [Game.TypeCode] for the IPDB table type code (SS, EM, ME)
  - [Game.TypeName] for the full table type name (Solid State, etc)
  - [Game.PlayCount] for the number of plays
  - [Game.PlayTime] for the play time ("15 minutes", "1:23 hours", etc)
  - [Game.LastPlayed] for the last play date
  - [Game.TableFileName] for the game's table file name

(Issue #75 on github.)

* You can now provide default videos and images for the secondary
windows on a per-system basis.  When you navigate to a table in the
wheel UI, and the table doesn't have any media files of its own in one
of the secondary windows (backglass, DMD, instruction card, topper),
PinballY now looks for default media in a default folder in the game's
system media path.  For example, a Visual Pinball game will look for
default media in the Visual Pinball media folder.  To specify
per-system default media, create folders within the system's media
folder called Default Videos and Default Images, then place any of the
following files there: No Back Glass, No DMD, No Instruction Card, No
Topper.  In all cases, the files use the standard sets of extensions
for images and videos.  So, for example a default video for Visual
Pinball games in the backglass window might be called <your PinballY
media folder>\Visual Pinball\Default Videos\No Back Glass.mp4.
(Pull request #81 on github.)

* A new option in the Audio/Video section of the settings lets you
change the way images and videos are loaded into the various windows
when you switch games.  By default, the program "staggers" the
process, changing to the new image/video in one window at a time.
This is designed to make the load process smoother by spreading out
the work of loading the new media rather than doing it all at once.
But some people don't like the visual effect of the windows updating
one at a time.  The new option lets you get rid of the delay and load
all windows at the same time.  To activate this, go to the Audio/Video
settings, and check the box "When a new game is selected, update all
windows simultaneously".

* Another new option in the Audio/Video section lets you change the
crossfade time when loading new images and videos.  The crossfade
effect is used to transition between media in each window when a new
game is selected.  The default crossfade time is 120ms, but you can
now change it to a different duration of your choosing via the new
option.

* Another new option in the Audio/Video section lets you control how
button sound effects are played for auto-repeated button presses.  By
default, when you hold down a button, the sound effect for the button
is played repeatedly as long as you keep pressing the button.  The new
option, "Mute button sounds when auto-repeating", changes this so that
the sound effect is played once when you first press a button and then
once again when it starts repeating, but stops after that.
(Addresses pull request #82 on github.)

* Another new option in the Audio/Video section lets you set muting
for table audio tracks separately from table video tracks.  Note that
this also changes the way "Mute videos" works slightly, in that the
"Mute videos" setting no longer applies to table audio tracks.  To
mute all audio/video playback for table media, check both muting
boxes.  (Addresses pull request #83 on github.)

* The most recently used capture settings for the various media types
are now saved in the settings file, so that they'll be remembered
across sessions.  (Capture with Audio, Capture Silent, Skip, etc.)
These were previously only saved for the duration of the current
session, and reset to defaults each time you launched the program.
Saving them makes it a little more convenient if you tend to use the
same capture options all the time, since it lets you immediately click
through the step where you select the dispositions for the various
types.  You still get the chance to review and change the selections
each time, but it makes it quicker when you want to reuse the same
settings, since the defaults will be set according to the most recent
capture, even if the most recent capture was in a prior program
session.

* Logging has been added for:

  - High score retrieval
  - Initial window layout setup

As always, the additional logging is designed to help troubleshoot
problems in those area.  The new logging can be enabled via the
Log File page in the options dialog.

* Some image file formats can specify a "color space", which
determines how the colors in the file are meant to be interpreted into
an on-screen display.  Some graphics programs use this to store images
in a color space known as sRGB.  In the past, PinballY didn't pay any
attention to this metadata when present, so image files saved in sRGB
color space were displayed with inaccurate colors on-screen.  This
made them look a little off - in particular, the rendered colors were
usually too dark, and sometimes looked tinted.  This has been
corrected.  (Related to issue #67 on github.)

* When PinballY updates the settings file (Settings.txt), it now
writes the updates to a temporary file rather than directly
overwriting the old settings file.  The temp file then replaces the
original file only on successful completion.  This ensures that the
original settings file is left intact if the PinballY process is
abruptly terminated in the middle of the update, which can happen if
PinballY crashes due to a bug, or if Windows forces the process to
terminate as part of system shutdown, or if you simply cut power to
the PC.  In the past, it was possible for the settings file to be
partially overwritten in these abrupt shutdown situations, which
aren't entirely uncommon, since some pin cab builders use "hard" power
switching that cuts power to the PC at the outlet when shutting down.
The new approach ensures that the settings updates are "all or
nothing": if an update is interrupted, the old settings are left
intact.  

To further protect the settings file, PinballY now automatically saves
a backup copy of the old settings file on update rather than outright
replacing it.  This is limited to one backup copy per day, to avoid
creating an excessive number of extra files.  The backup files include
the date in the name ("Settings backup 2019-11-02.txt", etc) to help
keep track of the versions.

* Fixed a bug that prevented the Pause Game command from taking
control properly.  (Issue #92 on github.)

* Updated libvlc to 3.0.8 (thanks to byancey).

* When selecting a new filter, the program will now always preserve
the current game selection if the game is still included by the new
filter.  In the past, there were some situations where the game
selection could be changed to another game with the same title, even
if the old selection was still included by the new filter.  (Addresses
pull request #87 on github.)

* Fixed a problem in the audio player that caused crashes under
certain obscure conditions.  (Addresses issue #86 on github.)

* The Javascript events for key presses and joystick button presses
now provide information on the "repeat count" for the key press.  In
the "keydown", "keybgdown", "joystickbuttondown", and
"joystickbuttonbgdown" events, the new repeatCount member of the event
object is set to 0 for the initial key/button press, 1 for the first
auto-repeat event, 2 for the second auto-repeat event, and so on.

* The Javascript mainWindow.doButtonCommand() method now takes an
integer repeat count argument in place of the boolean repeat-or-not
argument in past versions.  This corresponds to the addition of the
repeat count information to the keydown event and related events.  You
can still pass a true/false value for the repeat count argument, in
which case it'll be interpreted as 0 for false or 1 for true; this
represents almost the same information about the repetition (just with
a little less detail), so existing code should continue to work as
before.  New code should of course use the new format.  The repeat
count information is used internally by the system to make certain
subtle decisions about how to handle the simulated keystroke, so
providing an appropriate value gives you more control over the
handling.  For example, the system uses the repeat count to decide
whether or not to play button sound effects on auto-repeated keys,
according to the option setting for "mute auto-repeat buttons".

* The Javascript systemInfo object has new properties programDir (the
file system path for the program install folder) and programExe (the
full file system path of the PinballY executable).

* The Javascript gameList object has new methods: getMediaDir(),
resolveMedia(). See the gameList object's section in the help for
details.

* Pressing the EXIT button to terminate a game should work better if
you happen to press it while the game is still starting up.  In the
past, PinballY didn't always close the game application properly if
you hit the EXIT button while Windows was still in middle of launching
the new application.  Keyboard focus also sometimes ended up in the
wrong window in these cases.  PinballY is now a little smarter about
handling the EXIT button during the early stages of a game launch, so
it should work more consistently now.  (Issue #79 on github.)



05-31-2019 (1.0.0 Beta 14)

* Added a new optional button sound for launching a game.  The
default is silence, so it won't change your existing setup, but
this lets you add a custom sound of your choosing by adding a WAV
file called Launch.wav to the Media\Button Sounds folder within
your PinballY install folder.  This is played in addition to any
table-specific Launch Audio track.

* A new option lets you tell PinballY *not* to reposition windows
at startup to force them into the visible desktop area.  When
PinballY starts up, it tries to restore the same window layout that
was in effect at the end of the last session, with the same set of
windows open at the same locations on the screen.  By default, as
part of this restoration process, PinballY checks each window to
make sure the location is still valid - meaning that it's still
within the display area of a physical monitor.  Any window that's
not in a valid area is automatically repositioned to bring it back
within the viewable area.  

The new option lets you disable that automatic repositioning, so
that windows are restored to their exact locations from the last
session, even if that would leave them out of the bounds of the
current desktop area.  To disable the automatic repositioning, go
to the Startup page in the settings dialog, and un-check the box
for "Make sure all windows are positioned within the visible
desktop area".  

Why does PinballY do this repositioning in the first place?  It's
for situations where you've changed your desktop layout (for
example, by adding a new monitor, or rearranging the monitor
geometry in the Windows display settings).  The saved window
positions are relative to the coordinate system of the Windows
desktop, so if the new desktop layout isn't the same as the last
time you ran, the old coordinates can be screwy, placing windows
off in the boonies outside of the current visible display area.
The automatic repositioning senses this situation and tries to
compensate by moving any misplaced windows back into the viewable
area.  It's a convenience to make sure that you can reach all of
the open windows with the mouse.

Why wouldn't you want this?  It might be a problem if you routinely
change your desktop layout when running different programs.  In
particular, if you use an external tool to set a different desktop
layout for each program, the new layout when starting PinballY
might not go into effect until after PinballY has already decided
that it needs to rearrange your windows.  That can make PinballY
unnecessarily rearrange your windows - even though the saved
locations would have been fine if PinballY had waited a few moments
for the new desktop layout to come into effect.  In these
situations, you can disable the automatic repositioning to ensure
that your window layout is preserved.  (Issue #73 on github.)


05-26-2019 (1.0.0 Beta 13)

* Fixed a problem saving customized media file names in the XML
database.  (The system was still setting the media name back to the
default "Title (Manufacturer Year)" pattern in some cases when
making updates.)


05-23-2019 (1.0.0 Beta 12)

* A new option in the Media Capture settings lets you select which
buttons you use to start and stop a manual capture.  ("Manual mode"
is a separate option that you can select for each media type, also
via the Media Capture settings.)  In the past, the flipper buttons
(pressing both at the same time) were always used to trigger a
manual start or stop.  That's still the default, but you can now
select other buttons instead.  The new options are: pressing both
Magna Save buttons together; or pressing the Launch button, the
Information button, or the Instructions button by itself.  The
flipper buttons were originally chosen (and are still the default)
because they don't usually have any effect on a table that's in
"game over"/"attract" mode, which is what most people want to
capture for a table video.  But if you prefer to capture videos of
a game in progress, you might want to use the flipper buttons to
play the game during the capture, in which case you wouldn't want
the flippers as the manual start/stop trigger.  This new option
lets you move the trigger to another button or buttons.  (Addresses
issue #59 on github.)

Note that by "flipper buttons", we really mean the keys you've
assigned to the Next and Previous commands.  We casually refer to
these as the "flipper buttons", because those are the buttons you'd
normally map to these commands on a full pin cab, but you might be
using other key assignments if you're on a desktop machine.
Similarly, the "Magna Save buttons" are really the keys assigned to
the Next Page and Previous Page buttons.

* You can now override the default media naming pattern ("Title
(Manufacturer Year)") that the Edit Game Details dialog normally
applies.  The dialog has a new edit box for the Media Name, where
you can enter a custom media name if you wish.  Each time you open
the dialog, this field will show "[Default]" if the game's current
media name in the game database matches the default naming pattern,
or the actual media name if not.  When you click OK, if the Media
Name box contains "[Default]" or is empty, the dialog will
automatically update the media name in the database to match the
"Title (Manufacturer Year)" pattern.  Otherwise the dialog will
retain the exact text entered in the Media Name box.  Note that the
media name must be a valid filename, and must not contain any path
portion.

* The Javascript GameInfo.update() method no longer changes the
media name automatically based on changes to the game's title,
manufacturer, and/or year.  Instead, you can explicitly set the
media name using the new mediaName property of the 'desc' object
parameter.  By default, the method simply leaves the media name
unchanged, regardless of what else is updated.  If you wish to
change the media name as part of the update, set desc.mediaName to
a string giving the new name.  The special value "" (an empty
string) can be used to explicitly set the media name to the default
pattern, "Title (Manufacturer Year)", which is the same pattern
that the method unconditionally used in the past to form a new
media name any time any of the constituent elements were changed.
See the help section on the GameInfo class.

* You can now set the "keep windows open while playing" options on
a global and per-system basis, in addition to per-game.  Up until
now, the Game Details dialog was the only place you could select
windows to keep open during play, so you had to set this up for
each game individually.  In some cases, you might want to specify
the same setting at a system level ("keep the topper window open
for all FX2 games", say), or simply for all games across the board.
For example, since none of the existing player systems feature a
dedicated instruction card window, you might want to always keep
the PinballY instruction card window showing.  Similarly, if one of
your player systems never shows anything in the backglass window,
you might want to keep the PinballY backglass window active for all
of that system's games.

The new options can be found in three places:

 * First, the Game Launch page of the Options dialog lets you 
   select a "global" setting for each window.  The global setting
   applies to all games and all systems.  If you check the 
   Instruction Card box here, for example, the instruction card
   window will be kept active for all games.  These settings can
   be overridden by each system and game, as we'll see next.

 * Second, each player system page in the Options dialog has a
   similar set of checkboxes, which control the window status for
   all games launched with that system.  Each checkbox here has 
   three possible settings: a green checkmark means that the 
   window is kept active for this system; a red slashed circle 
   means that the window is disabled for this system, EVEN IF the
   window is set to active in the global settings; and an empty
   box means that the system uses the current global setting for 
   that window

 * Finally, the Game Details dialog for each game continues to
   provide its own set of these checkboxes, where you can set
   each window's status on a game-by-game basis.  As with the
   system-specific controls, these checkboxes have three options:
   a green checkmark means that the window is kept active for 
   this game, even if it's disabled globally or in the game's
   system's settings; a red slashed circle means that the window
   is disabled for this game, even if the window is marked as
   active in the system settings or global settings; and an
   empty box means that the game "inherits" the system or global
   settings.

* Console-mode games should now work better.  The relevant changes
shouldn't affect Windows GUI programs, but should make older
console-mode programs work better with PinballY.  (Technical
details: First, when PinballY calls CreateProcess(), it passes a
single combined command line string rather than passing the .exe
name separately; some console-mode programs built with older
compilers depend upon this format to parse their parameters
correctly.  Second, when PinballY detects that the launched process
uses console mode, it no longer waits for the process's event loop
to start up, since that's not meaningful with a console program.
Third, when "Resume Game" is used to switch back to a paused game,
PinballY can now find and switch back to the game's console window
if it uses one as its sole UI; in the past, these windows didn't
show up in the window search technique that was being used.)

* When a game is running, and PinballY is in the background,
PinballY now completely freezes video updates to any windows that
aren't set to continue showing media during the game session.  In
the past, windows were still updated, just at a slower rate.  The
complete freeze is designed to minimize any impact on game
performance (particularly video performance) while PinballY is
running in the background.  

In addition, for any windows that *are* set to continue showing
media while the game is running, videos they contain are now
updated at full speed.  In the past, the program slowed down the
frame update rate even in windows showing videos.  This was
intended to reduce performance impact, but took it a step too far
when video content was involved, since the slow update rate made
videos look jumpy.  The program now assumes that if you're
intentionally showing videos during game play, you want them to
play back normally, and you're willing to accept any impact on the
running game's performance.

* Fixed a problem with rendering still images (PNG/JPEG) on real
DMD devices that caused incorrect scaling if the image wasn't
already 128x32 pixels, and incorrect color rendition for RGB
images.  This has been corrected.  (Issues #62 and #65 on github.)

* When changing the auto-launch setting in the Startup options
dialog, the program will now try elevating the operation (that is,
performing it in Admin mode) if Windows so requires.  In most
cases, this is only required when selecting the "Launch in Admin
Mode" option, but it appears that Windows requires elevation for
all task scheduler updates for some user configurations.  In the
past, if you had such a configuration, you would have seen an
"access denied" error on making any change to the startup setting.
You should now instead see a UAC dialog asking for permission to
perform the operation in Admin mode.  (This of course requires that
your user account has Admin access to start with and that UAC is
enabled in your Windows settings.  The UAC dialog will only appear
if Windows actually requires the elevation, so nothing will change
if you haven't had a problem with task scheduler access errors in
the past.)

* In Javascript menuopen events for system menus, any "page up" and
"page down" commands in the menu item list will have titles
"\u2191" (Unicode up arrow) and "\2193" (Unicode down arrow),
respectively.  In the past, these commands used empty strings as
titles.  This made it a little more work to distinguish these from
separator bars, which can be identified by their empty title
strings and command ID -1.  With this change, separator bars are
now the only things in a system menu with an empty title string.

* A new "metafilter" feature allows Javascript to add more layers
of custom filtering when selecting games to show in the wheel.  See
the help section on Metafilters for details.

* New Javascript convenience functions: MenuEvent.addMenuItem(),
MenuEvent.deleteMenuItem(), MenuEvent.tidyMenu().  See MenuEvent in
the help for details.

* Javascript errors that occurred within events weren't always
logged to the log file; many were just silently ignored, making it
harder to track down script errors.  Event errors are more reliably
logged now.

* Two new pre-defined IDs, command.UserFilterGroupFirst and
command.UserFilterGroupLast, have been added to the list of
built-in command IDs.  These identify the range of IDs assigned to
custom filter groups created through Javascript code.  This doesn't
change anything about the way custom filter groups work or are
identified; the system already had an internal range that it used
for this purpose.  It was just an oversight that the limits of the
range weren't exposed via command constants.

* In the Startup section of the Settings dialog, if you made a
change to the startup delay time without also changing the startup
mode selection, the delay time change wasn't saved when you clicked
OK or Apply.  This has been fixed; changes to just the delay time
should now be properly saved.


04-08-2019 (1.0.0 Beta 11)

* The Beta 10 release had a bug that disabled the main buttons
(Start, Next, Previous, Exit) if no startup video was played.
This has been fixed.


04-06-2019 (1.0.0 Beta 10)

* In the Game Details dialog, the title box now lets you search for
matching titles, simply by typing into the box.  The drop list will
show suggested matches to what you've typed so far, refining its
guesses as you type.  This makes it easier to find matches when the
initial filename search fails to find the right table, which can
easily happen when the filename is too short or too cryptic.  To use
the new search feature, simply click on the title box, and start
typing the title.  Usually, the right title will appear after you've
typed the first few characters.  Once the right title appears, just
click on it, or use the cursor arrow keys and Enter to select it.  As
usual, that will populate the rest of the dialog fields with the IPDB
details for the selected title.

* You can now cancel the startup video by pressing any of the main
buttons (Start, Exit, Next, Previous, Launch).  (Issue #52 on
github.)

* A couple of new substitution variables have been added for use in
game system command lines, to give you more precise control over
the construction of game launch commands:

  * [TABLEFILEORIG] is the original table file name, exactly as it
    appears in the table database.  This is similar to the existing
    [TABLEFILE] variable, but [TABLEFILE] is slightly different, in
    that [TABLEFILE] might have the system's default extension tacked
    on to the end, if that's necessary to form the name of an existing
    file.  For example, Visual Pinball X's default extension is .vpx,
    so if the database refers to "MedMad_v1" as the table file,
    [TABLEFILE] might be set to "MedMad_v1.vpx", whereas
    [TABLEFILEORIG] will be set to the original "MedMad_v1".

  * [TABLEFILEBASE] is the same as [TABLEFILE], but with any extension
    removed.  This differs from [TABLEFILEORIG] in that the extension
    is stripped off in all cases, whether or not it was in the original
    filename in the table database.  [TABLEFILEORIG] reflects exactly
    what's in the database file.  In some cases, it might be desirable
    to include the extension in the database entry but omit it in the
    table launch command line, so this variable lets you do that.

* In the default configuration settings, and in the help section on
system settings, the command lines for Pinball FX2 and FX3 now use
the new [TABLEFILEBASE] variable (instead of [TABLEFILE], as they
did in the past).  Apparently, recent updates to FX2/FX3 changed
the command line syntax in such a way that tables won't launch if
the full filename with .pxp suffix is supplied.  (Addresses issue
#51 on github.)

* The new DOF event $PBYLaunchGame is fired when a game is
launched.  This fires at the very start of the launch process.
Note that any device effects you associated with this event via the
DOF config might only fire briefly, because PinballY has to
disconnect from DOF shortly after firing this event to allow the
launched game to take control of the feedback devices.  (Issue #54
on github.)


03-23-2019 (1.0.0 Beta 9)

* A new option lets you set separate volume levels for videos and for
button sound effects.  The volume levels can be adjusted in the
options dialog under the Audio/Video section.  The video volume level
applies to background videos (tables, backglasses, etc), table audio
tracks, startup audio, and launch audio.

* In the Game Details dialog, a new button lets you populate the form
based on the IPDB ID number.  This is meant as a time-saver for cases
where PinballY fails at its attempts to guess the game's title based
the filename.  Those guesses are themselves meant as a time-saver, but
they're not always successful, as filenames can be cryptic.  In such
cases, it might be easier for you to look up the game on IPDB and
enter the IPDB ID.  Then you can click the new button, "Fill in form
from this IPDB ID", and the program will populate the other fields
(title, manufacturer, year, and table type) from its built-in list of
IPDB tables.

* A new option lets you change the way PinballY hides the mouse
cursor.  PinballY hides the mouse cursor at program startup, and again
each time you press a key/button, as part of its effort to create a
more arcade-like (and less Windows PC-like) experience.  Normally,
PinballY accomplishes this vanishing act using a standard Windows
system call that makes the mouse cursor invisible.  But this system
call doesn't seem to work on some machines, for reasons unknown.  To
address this, a new option lets you tell PinballY to hide the cursor
by simply moving it out of the way rather than trying to make it
invisible.  To use this new option, open the settings dialog, go to
the Mouse tab, and check the box for "Hide mouse by moving it".  Now
select the screen location where the mouse will be moved in lieu of
hiding it: click the "Drag here" button, hold the mouse button down
while moving the mouse to the desired parking location, and then
release the mouse button.  You'll probably want to choose a position
near the right edge of the display area where the cursor will be
entirely or mostly off-screen.  (Addresses issue #45 on github.)

* When capturing media, the program now remembers your media type
selections and carries them forward to the next capture command as the
default settings.  This makes it a little quicker and more convenient
when you're capturing media for several games in a row, since you
don't have to keep entering the same options over and over.  For
example, suppose you run a capture for Medieval Madness, recording the
table video in silent mode and skipping all of the other items, then
after that finishes, you start a new capture for Medusa.  The media
item menu will be displayed as usual, but this time it'll be
initialized with the same selections as last time, with the table
video set to "capture silent" and everything else set to "skip".

* On launching a game, any startup audio track that's still playing is
automatically faded out and removed, so that it doesn't keep playing
into the game session.

* A new option lets you set a "gamma" correction factor for grayscale
video playback on real DMD devices.  This is primarily for people with
monochrome devices such as PinDMD v1 or v2, where uncorrected video
playback can look too bright and washed out.  Gamma correction is a
method of adjusting the luminance (brightness) curve of video playback
to compensate for differences between the way a particular physical
display device renders light and the way your eye perceives it.
"Gamma" is a number that determines the shape of this compensation
curve.  There's no perfect gamma value in general, because the effect
is a function of the physical display you're using and of your visual
perception, which is inherently subjective.  It can also be affected
(slightly) by things like ambient light.  This new setting lets you
adjust the gamma as needed to make your display look right to your
eye.  The new setting is in the options dialog, under the Real DMD
tab.

* A new option lets you disable Shockwave Flash (SWF) files for
instruction card images.  You'll find this option in the settings
dialog under Instruction Cards.  By default, SWF files are included
when searching for instruction card images, since many of the HyperPin
Media Pack files available for download on the virtual pinball sites
use SWF format for the instruction card images.  However, SWF files
can only be displayed if you have the Adobe Flash Player ActiveX
control (also known as the Flash plug-in for IE) installed, and some
people don't want to install that extra software.  This new option
lets you tell PinballY to ignore SWF files entirely, so that you won't
see any error messages saying that Flash is missing.

* During startup videos, the new DOF state $PBYStartupVideo is set.
This makes it possible to program DOF effects when the startup video
is playing.  See the help section on DOF Events for more on setting up
custom DOF effects.

* In past versions, the real DMD code treated freezy's dmd-extensions
1.7.2 as having a couple of bugs that were actually fixed in that
release, and turned off a couple of small features in order to work
around the DLL issues.  The code now properly recognizes the 1.7.2
version coding on the DLL, which allows full functionality with 1.7.2.
(My patched 1.7.1+mjr versions were always recognized as having the
fix - this change only affects the official freezy version.  My
patches: https://github.com/mjrgh/dmd-extensions/releases)

* Fixed some bugs in high score presentation on real DMD devices,
which sometimes prevented high scores from displaying, or prevented
the video/high score loop from continuing past a certain point.


03-09-2019 (1.0.0 Beta 8)

* A new message appears at the start of the capture process explaining
how the PinballY window layout determines the screen area to be
recorded during the capture.  The message has an option to skip it on
future captures.  (Issue #48 on github.)

* A new option lets you adjust the background media audio volume for
each game individually.  This can be useful to equalize the audio
levels for captured videos and audio tracks from game to game.  To
adjust a game's audio level, open the Game Setup menu (via the
Operator menu, normally assigned to the digit "0" (zero) key) and
select Adjust Audio Volume.  This brings up a dialog that lets you set
the relative volume level for the game's media, from 0% to 100%.  The
default initial setting for all games is 100%, which plays back the
audio at its recorded volume level.  (Issue #9 on github.)

* New Javascript features: high score request events; setting custom
high scores; new GameInfo property audioVolume.  See the help files
for details.

* A new Attract Mode option setting lets you hide wheel images when
attract mode is running.  The option is enabled by default.  Part of
the purpose of attract mode is to act as a screen saver, which means
that we want to frequently change the on-screen graphics over the
whole screen area, to prevent the burn-in effect that some monitors
can suffer from when static graphics are displayed for long periods.
Attract mode tries to accomplish this by switching games every few
seconds, but the wheel images can be too static even when the selected
game changes frequently.  The problem is that some people use wheel
images with uniform background areas, such as circles or squares.  So
even though the individual wheel images keep changing, the circular or
square background area is always more or less the same, and is always
displayed at the same location.  (Issue #49 on github.)

* When running a game where the PinballY video DMD window is
configured to continue displaying media during the game (using the
"Show when running" options in the Game Setup dialog), the automatic
high score display is disabled for the duration of the game session.
This is mostly to reduce visual distraction during play.  The normal
high score display resumes when you exit the game.

* The new substitution variable [PINBALLY] can be used in the system
options for command line parameters and Run Before and Run After
command strings.  [PINBALLY] in any of these fields is replaced with 
the full absolute path of the PinballY install folder.

* During program startup, code in .js modules imported from main.js
are now run immediately after main.js is finished running.  In the
past, the timing wasn't as well defined: the initial imports were
treated as equivalent to other program events generated during
startup, so other events were sometimes processed before imports were
resolved.  This was technically correct, in that Javascript imports
are inherently asynchronous, but it was inconvenient and potentially
confusing for some important cases.  For example, if an import module
added an event listener for an event related to game selection, that
listener wasn't necessarily notified of the *initial* game selection
event, since that event might have been processed before the module
import was resolved, which is where the listener was actually set up.
To make startup event delivery more predictable, imports from main.js
are now resolved immediately after main.js returns, and imports from
those imports are resolved after those initial imports finish; this is
repreated as many times as necessary to ensure that the full cascade
of direct and indirect imports is fully resolved before regular
program event processing begins.  Note that this doesn't preclude
events generated from Javascript itself (such as timeouts, intervals,
and promises) from being processed; these will be interleaved with
import resolution as they become ready to run.

* A couple of internal changes were made to the GameStats.csv file
reader/writer to make it more robust: fixed a problem with the way the
reader handles column ordering in the file that caused potential
problems under certain obscure circumstances, including crashing the
program; when saving, the original file is preserved until the write
has completed successfully, to ensure that there's no data loss if
something goes wrong during the write.

* The embedded libvlc video software has been updated to version
3.0.6.



02-21-2019 (1.0.0 Beta 7)

* A new Startup dialog option lets you more precisely control the
timing of auto-launch at system startup.  In the Startup options,
you'll find a new setting, "After logon, pause before starting
PinballY".  Enter a delay time in seconds here.  Windows will wait
this long after you log on to Windows before launching PinballY.  This
can be useful if you're having conflicts with other programs that also
launch automatically, such as keyboard focus problems or performance
problems due to too many programs trying to run at once.  

* Another new Startup dialog option lets you add some extra delay time
after waiting for monitors to come on-line.  Some people have
encountered video cards with quirky behavior that makes a monitor
appear to come on-line briefly when an attached TV is powered up, only
to disappear briefly while the HDMI connection is established.  This
new option tells PinballY to wait for a fixed interval after all
monitors are recognized, to ensure that the video setup has
stabilized.  (Issue #47 on Github.)

* The mouse cursor is now hidden before the startup video plays.  In
the past, it wasn't initially hidden until after the video finished,
so it might have remained visible during the video.  It's now hidden
before the startup video start playing.  In addition, the method used
to hide the cursor has changed slightly to use an explicitly invisible
cursor rather than setting no cursor.  (Issue #45 on github.)
 
* PinballY now saves all of its window positions before launching each
game, and restores the saved position when the game exits.  Some games
change the display configuration in such a way that the size of the
virtual desktop changes, which can force Windows to reposition or
resize some of PinballY's windows to keep them within the valid area.
In some cases, this left PinballY's windows with the wrong positions
or sizes when the game exited.  The program now tries to restore the
original layout after each game run.  (Issue #43 on Github.)

* In Beta 6, the ZIP file distribution was missing some of the files
in the "assets" folder.  This is the folder where most of the default
media items are kept, such as default playfield and backglass
background images and the button sound effects.  This didn't affect
the Windows Setup .MSI version, just the ZIP version.  The ZIP should
have all of the needed files now.

* Fixed a problem that caused error messages in some cases when
setting non-default font sizes in the options dialog.

* In the past, passing null or undefined to a DllImport function as a
string pointer argument didn't correctly pass a null pointer to the
native code.  It does now.

* Fixed a problem in Javascript DllImport that caused incorrect size
calculations for native struct types containing members of separately
defined struct types.  This affected dllImport.create() and
dllImport.sizeof().


02-13-2019 (1.0.0 Beta 6)

* IMPORTANT CHANGE NOTE: The startup video folder location has been
changed.  The program now looks for startup videos in the following
folders, in this order:

    <PinballY folder>\Media\Startup Videos
    <base media folder>\Startup Videos

This allows you to share startup videos with an existing PinballX
installation.  The filenames are the same as before, but you'll have
to move the files to the "Startup Videos" subfolder.

The startup audio folder location has been changed along the same
lines:

    <PinballY folder>\Media\Startup Sounds
    <base media folder>\Startup Sounds

* A startup video can now be played on the real DMD, in addition to
the startup videos in the regular windows.  Place it in the same
location as the other startup videos (Media\Startup Videos), and name
it "Startup Video (realdmd)" for gray-scale playback, or "Startup
Video (realdmd color)" for full-color playback.  As with other real
DMD videos, full-color playback is only possible if you have a color
DMD device. (Issue #37 on github.)

* It's now easier to customize button sound effects.  See the new
help section Customizing > Button Sounds for details.

* It's now easier to customize the background images shown in the
various windows when the currently selected table doesn't have its own
background media.  See the new help section Customizing > Custom
Backgrounds for details.

* You can now provide your own default background video to show in
each window when the currently selected game doesn't have its own
image or video.  These work like the default background images always
have, but let you use video instead of static pictures.  See the
new help section Customizing > Default Backgrounds for details.

* Audio playback on real DMD videos is now enabled.  In the past it
was muted, on the assumption that you wouldn't want it to interfere
with the table's audio track or the main playfield video's soundtrack.
But at least one user reports wanting to use the real DMD video as the
source of the table's audio, so that assumption was evidently wrong.
To simplify things and give you more control, the program now just
plays the audio for all videos, so you can arrange the soundtracks any
way you please by editing the videos.  (Issue #38 on github.)

* The media search order for the real DMD has changed slightly.  In
the past, the search order was as follows: full-color video first,
then monochrome video, then a full-color still image, then a
monochrome image.  That remains unchanged IF your DMD device is
capable of full-color display.  If you have a monochrome DMD device,
though, the monochrome video and images take precedence over the color
source media.  The reasoning is that the the monochrome source files
are optimized for grayscale display, so they'll look better on a
monochrome display than the full-color versions would, hence they
should be used instead of the color versions.

* The real DMD device now respects the global option to disable all
videos.

* Fixed a problem with scaling for real DMD video playback using
monochrome source material.

* Added /minimized to the command parameters for the default VP 10
settings.  (This WON'T be applied to your settings if you're updating
from a prior version, as all of your existing settings will be kept
instead.  You might want to add /minimized at the start of the
"parameters" line for VP 10 in the settings dialog, especially if
you've had problems with VP 10 showing its designer window when you
launch a VP 10 game from PinballY.)

* Fixed a problem that sometimes prevented installing a wheel image
via drag-and-drop with the mouse.  When the problem occurred, the
"Drop here to install wheel image" box in the UI failed to recognize
when the mouse was within its bounds, so the drop would always wind up
as the playfield image instead.  The "install wheel image" box should
now work correctly.

* If you had the "Hide unconfigured games in the main list" option
enabled (in the Game Wheel settings page), there was a snag in game
visibility when setting up a new game.  If you enabled the "Show
unconfigured games" filter in the Operator Menu, then entered the
game's details, then un-selected "Show unconfigured games" to switch
back to the normal game list, the newly configured game didn't appear
in the normal list.  It *should* have appeared, but it was still being
treated as unconfigured for the purposes of the filter.  This has been
corrected; the game now immediately appears in the regular wheel list
as soon as you switch back to it.  (Issue #42 on github.)

* "Run at startup" and "run before exit" commands are now launched
with their working directories set to the folder containing the
program .EXE to be launched.  In the past, these commands were started
with the PinballY folder as the working directory, which caused
problems for some programs.


02-07-2019 (1.0.0 Beta 5)

* Fixed a bug added in beta 4 that caused a crash trying to open the
Game Details dialog in some cases, particularly for previously
unconfigured tables.


02-05-2019 (1.0.0 Beta 4)

* In beta 3, the Game Details dialog didn't show checks in the boxes
for the "Show when running" windows as saved in the settings (that is,
all of the checkboxes were un-checked every time the dialog opened).
This has been fixed; the boxes are now check-marked to match the saved
settings properly.  (Issue #36 on github.)

* The changes in beta 3 for rescaling the playfield background image
(with options to maintain the original source material's aspect ratio,
or stretch it to fit the window) didn't work properly for media
created with a "landscape" aspect ratio (that is, wider than it is
tall).  In fact, it didn't even quite work properly with material in
"portrait" mode with aspect ratios other than exactly 9:16, but it was
less visually obvious than with landscape material, and portrait-mode
playfield backgrounds are almost always exactly 9:16 anyway.  This has
been fixed: both the "stretch" and default modes should now work for
any source material aspect ratio.  (Issue #15 on github, revisited.)

* The XML database loader can now handle titles that contain
parentheses, such as "Mustang (Limited Edition)".  In the past, the
loader couldn't read such titles properly, because it interpreted the
first open parenthesis in a game list XML <description> element as
introducing the "(Manufacturer Year)" suffix.  The game list parser is
now more careful: it looks for the *last* parenthesized section,
instead of the first open parenthesis.  It also recognizes nested
parenthetical clauses within the suffix, in case the manufacturer name
includes parentheses.  (There are several such manufacturer names in
the IPDB list, such as "Universal Industries, Inc. (Chicago)".)

* In beta 3, if you played startup videos in some combination of
windows *not* including the main playfield window, PinballY failed to
show its normal wheel UI after the videos ended, because it only paid
attention to the end of the playfield video when deciding when to show
the UI.  This also meant that it could show the UI before all of the
videos finished playing, if the videos in secondary windows had longer
playback times than the one in the playfield window.  Both problems
are now fixed, as the program now takes into account all windows
playing startup videos when deciding when to show the UI.


02-02-2019 (1.0.0 Beta 3)

* Startup videos can now be displayed in any or all of the windows.
As with the playfield window startup video, each window's startup
video goes in the Media folder within the main PinballY folder, and
uses a special name that identifies it as a startup video for one
of the windows:

   Playfield:  Startup Video.mpg       (or .mp4, etc)
   Backglass:  Startup Video (bg).mpg
   DMD:        Startup Video (dmd).mpg
   Topper:     Startup Video (topper).mpg
   Inst Card:  Starutp Video (instcard).mpg

The startup videos are loaded and started simultaneously (or as close
to simultaneously as possible).  You can therefore synchronize effects
across windows simply by editing the videos to place simultaneous
events at the same point in time in each video.

(Addresses issue #33 on github.)

* There are now two options for how the playfield background image or
video is displayed.  By default, the original aspect ratio of the
image or video is maintained, and the image is made as large as
possible such that it fits entirely within the window.  Alternatively,
you can "stretch" the image or video so that it exactly fills the
window.  This might be preferable if you're using a desktop setup
rather than a pin cab, and might even be preferable on a pin cab if
you have a mix of background videos captured with slightly different
aspect ratios.  The new option can be found in the Audio/Video section
in the settings dialog.  (Addresses issue #15 on github.)

* You can now continue to show PinballY's backglass, DMD, topper, and
instruction card windows while a game is running.  By default, these
windows are all blanked out to a plain black background when a game is
launched, which is how it always worked in the past.  But now you can
make any of these windows continue to show its image or video for the
running game.

This is controlled individually for each window AND each game.  For
example, you can make the VP version of Aladdin's Castle show just the
PinballY DMD graphics while the game is running, while the FP version
of the same game shows both the PinballY backglass and DMD graphics.

To select which windows should continue to show graphics during a
game, use the Game Details dialog, which you can reach from the Game
Setup menu.  (The Game Setup menu, in turn, can be reached from the
Operator menu: with the default key mappings, press "0", the digit
zero, to bring up the Operator Menu.)  Look for the "Show when
running" checkboxes.

When a window is designated to keep showing its graphics during the
game, PinballY also makes it a "topmost" window, which helps ensure
that it's not covered up by a window that the game program opens.
This lets you use the feature not only to fill in for display elements
that a game lacks entirely, but also to replace display elements that
the game displays but which you don't like.  For example, some game
systems can only display static backglass images, which you might
prefer to cover with the PinballY video display instead.  This feature
naturally does that by ensuring (or at least trying to ensure) that
the PinballY window stays in front of any window the game system opens
in the same area of the display.

(This address issue #26 on github.)

* The Topper window and main playfield windows now have "Show window
borders" options in their right-click context menus.  This allows
hiding the caption bar and sizing borders on these windows if desired.
(This is the same borderless option that was already available for the
DMD, instruction card, and backglass windows.  You can move a
borderless window by dragging it with the mouse anywhere within the
window, and you can resize by dragging near any edge or corner of the
window with the mouse, as though the normal sizing borders were still
there, even though you can't see them.)

* You can now disable DOF effects, via a checkbox on the new DOF page
of the settings dialog.  (Issue #27 on github.)

* The ID for each game in the GameStats.csv file has been changed to
include the manufacturer and year of the game, if known.  In the past,
the ID consisted only of the game's title and system name, which was
problematic because there are a number of real pinball machines that
share titles with other, unrelated machines (e.g., IPDB lists 9
different machines named "Circus").  Using only the title made it
impossible to distinguish the GameStats records for different tables
sharing the same name, so the system couldn't store separate star
ratings, play times, etc for each like-named game.  

The change should be transparent, because the program looks for a
record using the old "Title.System" ID format whenever it can't find
an entry under the new format, and then immediately updates the record
to the new format.  So your GameStats.csv file should be automatically
updated to the new format the first time you run the new version, and
all of your existing records should be carried forward.

(Issue #35 on github.)

* Javascript additions: status line events (StatusLineEvent);
StatusLine objects; a new optional "overrides" parameter to
mainWindow.playGame().  See the Javascript section in the help files
for details.

* The configID property of a GameInfo object returns the "new" config
ID, which uses the format "Title (Manufacturer Year).System".  (The
manufacturer and/or year are omitted if they're not configured in the
game's database entry; the System is "Unconfigured" if that hasn't
been set for the game.)  If you created any external files that used
the old config ID that was based only on the title and system, they'll
no longer match the entries, so you'll have to fix up your files by
hand.

* Fixed a couple of problems in the 64-bit ZIP distribution (these
didn't affect the MSI): 7z.dll was missing; the folder containing the
ffmpeg files was incorrectly named ffmpeg64.


01-22-2019 (1.0.0 Beta 2)

* The system now features a built-in Javascript engine, offering
extensive new customization capabilities.  Scripts can intercept many
UI events to change or augment the normal handling of buttons and
commands; create custom menus; create custom filters; send HTML
requests to integrate with Web applications; and more.  See
"Javascript Scripting" in the help for details.

* You can now set up a custom startup video.  Place a video file
called "Startup Video.mp4" in the PinballY\Media folder.  (You can use
.mp4 or any of the other supported video extensions: .mpg, .f4v, .mkv,
.wmv, .m4v, .avi.)  If this file exists, the video will be played in
the main playfield window immediately after the program loads, and
then the initially selected game will be shown as normal.  If there's
no such file, the program goes straight to the normal UI. 

* You can also set up a custom startup audio track.  Place an audio
file called "Startup Audio.mp3" in the PinballY\Media folder.  (You
can also use .wav or .ogg format.)  If this file exists, it will be
played immediately after the program loads.  If a startup video file
is also present, the video and the audio track will be played
concurrently, so you'll probably prefer to use a silent video in this
case.

* You can now select custom fonts for most of the on-screen displays.
The Fonts page in the options dialog lets you select a font for each
display function.

* The game metadata now accepts the IPDB ID of each game.  In the
game information editor dialog, the IPDB ID is automatically
filled in when you select a known game from the list of suggested
matches.  The IPDB ID is stored in the XML table list file under
the tag &lt;ipdbid&gt;.

* A new "lock video refresh rate" option lets you throttle the
graphics rendering rate in each window to match the physical refresh
rate of the monitor displaying the window.  In the past (and if this
option is not selected, which is the default), graphics frames are
rendered as quickly as your machine's hardware can render them.  If
you have video card, this can waste system resources by rendering more
internal frames than are actually needed for the physical display.
This can in turn place a higher than necessary load on your CPU and/or
GPU (video card), which can cause unpleasant side effects such as
making your GPU fan run continuously.  The "lock refresh rate" option
helps avoid this by making the renderer pace itself in step with the
monitor refresh cycle.  If you have a fast machine, enabling this
option should reduce CPU/GPU load without any degradation in graphics
quality.  (Issue #13 on github.)

* You can now manually select an audio input device to use for media
capture operations.  By default, as in the past, the system searches
your audio recording device list for a device with the words "Stereo
Mix" in its name.  But the actual device name doesn't always match
this pattern, especially on systems with non-English localizations,
where the device name may be translated to the local language.  So the
program now lets you select a suitable device yourself.  You'll find
the new "Audio Capture Device" option in the settings dialog, in the
Media Capture section.  That offers a list of available devices for
you to choose from.  (Issue #16 on github.)

* PinballY Admin Mode.exe now passes through any command line
arguments to the child PinballY.exe process.

* The default "Window Mode" setting for game systems (the window
display style used for the first window opened when launching a game)
is now "Show Minimized" instead of "Show".  Before this option was
added (in Alpha 21), the effect was always "Show Minimized", so that
should have been maintained as the default when the option was added
in the first place.  This version fixes that and restores "Show
Minimized" as the default.  That's the proper default because it's the
right setting for the most common systems, VP and FP.  The reason the
option was added at all is that some of the commercial games work
better with other "show" modes, so it's best if this setting can be
customized per system.

* The Filter by System and Filter by Manufacturer menus are now
paginated and scrollable if necessary (that is, if there are too many
items to fit the available display space).  (Issue #17 on github.)

* On some systems, menu graphic arrows weren't drawing properly.  This
is because the font "Wingdings 3" was being used for the arrows, and
this font isn't available on all Windows systems.  The more universal
Webdings is now used as a fallback, since that font contains similar
looking arrows, so the arrows should draw properly everywhere now.

* The options dialog now checks for uniqueness when changing the
display name of a player system via the dialog.  The display name is
used internally to identify the system in some cases, so it's best for
each system to have a unique name to avoid any ambiguity.  It's also
just confusing at the UI level for multiple systems to have exactly
the same name.

* In Beta 1, the cumulative playing time for wasn't being updated
after playing a game.  This has been fixed.

* DOF re-setup after finishing a game session is now performed in a
background thread, for improved responsiveness.

* A new Media Drop logging category has been added, which logs the
details of media file drag-and-drop operations.  This is mostly to
help troubleshoot problems with these operations that aren't
adequately explained by the on-screen error messages.

* In past versions, media drop operations with archive files (ZIP,
RAR, etc) didn't work properly in the 64-bit version of the program
because the release distribution incorrectly included the 32-bit
version of the 7-Zip DLL.  The 64-bit distribution now includes the
correct version of the DLL.  (Issue #14 on github.)

* In past versions, mp3 audio clips were sometimes cut off near the
end, so that the last fraction of a second was never played back.
This was particularly noticeable for the sort of short clips typically
used for Launch Audio sound effects.  This has been fixed; clips
should always play back in their entirety now.  (Issue #18 on github.)


10-13-2018 (1.0.0 Beta 1)

* The "Pause" menu (displayed when a game is running) now includes
commands to view the instruction card, flyer, game information,
and high scores.  In addition, this menu now appears automatically
any time you switch back to the PinballY window while a game is
running (there's no need for an additional button press to bring
it up).

* You can now specify how PinballY terminates a running game program
when you press the Exit Game button.  This can be set in the options
dialog for each system, via the "Terminate by:" item, and can also be
set in the config file via SystemN.TerminateBy.  The config variable
options are:

  - CloseWindow.  This is the default, and is also how this worked
  before the option was added.  This simply tries to close all of
  the program's open windows, as though the user manually closed
  them with the mouse.  This is considered the best way to
  terminate a program, since it's the way most programs expect to be
  terminated under normal conditions, and because it allows the 
  program to perform an orderly shutdown, releasing any system
  resources it's using before it exits.

  - KillProcess.  This asks Windows to terminate the process
  directly.  This is the same thing that happens when you use Task
  Manager to terminate a program.  This is a more forceful way to
  stop a program, because it doesn't require any cooperation from
  the program itself.  However, it's considered risky in terms of
  system stability, specifically because it doesn't give the subject
  program a chance to cooperate even if it wanted to, meaning the
  program can't do any cleanup work it would normally do on exit.
  This can, in some cases, leave system resources (like files or
  devices) locked or in other dubious states.  This option is
  sometimes necessary, though, because some programs won't cooperate
  properly with the more polite CloseWindow approach.  Use this as
  a last resort when the CloseWindow option doesn't work reliably.

* Fixed a crash bug that occurred if you tried to capture video
with audio (or just audio) when no "Stereo Mix" is available.  The
program *should* have displayed an error message explaining that
the capture device isn't present, and returned you to the wheel
UI, but there was a flaw in the error checking that caused the
crash.


09-28-2018 (1.0.0 Alpha 22)

* The image loader now recognizes and respects "orientation" metadata
embedded in JPEG images.  The orientation marker is stored by some
cameras to indicate which direction is "up" when a photo is taken with
the camera held sideways, and some image editor programs use the
marker in lieu of re-writing the actual JPEG pixels when you manually
rotate an image.  The Windows 10 Photos app works this way.  Earlier
versions of PinballY ignored the orientation mark, which was confusing
if you tried to rotate a source image using a photo app that only
updated the marker - PinballY would strangely show the original
orientation even though your photo editor claimed the image was
rotated.  PinballY now uses the orientation marker to determine the
image rotation when displayed.  This only applies to JPEG images, not
to PNGs or any video formats.

* The Table Path variable in a game system's settings can now contain
additional substitution variables: [SteamDir] for the Steam program
folder, if present; [lb] and [rb] for left and right square brackets;
and [PinballX] for the PinballX install folder.

* When PinballY switches to the foreground after being in the
background, it explicitly repositions each full-screen window.  This
works around some Windows quirks handling full-screen windows, such as
taskbar hiding on secondary monitors.

* When you show a hidden window while a game is running (e.g., select
"Show Backglass" on the playfield window's right-click menu), the
program formerly loaded media (images, videos) into that window, even
though media are normally disabled when a game is running.  The window
now stays blank.  (The windows are all kept blank during play mode to
minimize memory and CPU usage while a game is running, so that the
game can run as smoothly as possible.)

* PinballY Admin Mode.exe displays a more helpful error message in the
event that you set "Run as Administrator" mode in PinballY.exe's file
properties.  You shouldn't do this, as it prevents PinballY Admin
Mode.exe from functioning.  The new error message explains this and
suggests corrective actions.  There's also a new "Administrator Mode"
section in the help files with more details on how PinballY handles
games that need Admin mode permissions to run and how the PinballY
Admin Mode.exe program is meant to be used.


09-19-2018 (1.0.0 Alpha 21)

* If you installed an earlier version, and you were using the default
"Auto" option for the main Media or Table Database folder, you might
see a dialog the first time you run the new version asking you to
select a new option.  This is because the "Auto" option has been
removed, and replaced with more specific options; see below.

* Pinball Arcade DX11 can now be launched directly.  See the System
Options help file for the correct settings.  You can also use these
settings to launch the cabinet mode version; just substitute
PinballArcadeCabinet.exe for PinballArcade11.exe.

* The "Auto" option for the Media and Table Database paths has been
removed, and replaced with two new, more specific options: "Use the
PinballY Folder" and "Use the PinballX Folder".  

In the past, "Auto" meant "use the PinballX folder if present,
otherwise use the PinballY folder".  This was meant to make folder
selection easier by making it automatic, but it proved to be *too*
automatic and thus too confusing.  The big problem with "Auto" was
that, because PinballY checked for a PinballX path every time it ran,
newly installing PinballX on your system would make PinballY suddenly
change its folder paths (by using the new PinballX path).  This could
make your previously working table lists and media lists stop working.

The new options let you choose specifically whether you want to use
the PinballX folder path, the PinballY folder path, or some other
folder path.  There will no longer be any surprise changes due to
newly installing PinballX.  Of course, if you explicitly select the
PinballX folder, and then uninstall PinballX, an error will occur the
next time you run PinballY because of the now-missing PinballX folder
path.  But that case shouldn't be as surprising or confusing, since
you now have to explicitly choose up-front to share the PinballX files
and thus should expect that to stop working if you later uninstall
PinballX.

* Two new game system settings have been added:

  - Environment.  This lets you enter a list of environment
  variables to pass to the game program.  The "environment" is an
  internal Windows feature that lets a program store a
  program-defined list of NAME=VALUE pairs in memory.  These
  variables can be passed to child programs when one program
  launches another, so they serve a function similar to command line
  parameters.  In fact, some programs depend upon receiving
  information from their parent process via these variables rather
  than via the regular command parameters.  This is why this has
  been added to PinballY: it's another way of passing information to
  the launched game that's needed for certain game programs.  To
  specify a list of variables, specify a series of NAME=VALUE pairs,
  separated by semicolons (;).  The NAME portion must be a string of
  alphanumeric characters; a few punctuation marks (underscores,
  dashes) are allowed, but most others aren't, and spaces shouldn't
  be used.  The VALUE portion can contain any character.  If you
  want to use a literal semicolon character within the VALUE
  portion, double it: to set a value of "A;B", write "A;;B".

  - Window Mode.  This specifies how the game program's window will
  be shown when it's first created.  Some programs, such as Visual
  Pinball, work best when the initial window is created in
  "Minimized" mode, while others need to be shown normally.  In past
  versions, PinballY always used "Minimized" mode, because that
  worked best for all versions of VP and FP.  However, some Pinball
  Arcade versions will crash if launched minimized, so it was
  important to allow you to set the right initial window mode for
  each system.

* The new substitution variable [STEAMDIR] can be used within a
system's EXE file name to refer to the Steam install folder.  This
is useful for directly launching Steam games without going through
the main Steam executable.

* The options dialog page for setting up a system has been tweaked to
clarify that the Media and Table Database folder settings are always
subfolders of their respective global folders as set in the Folders
page of the options.  Past versions allowed entering full absolute
paths here, which was misleading; the dialog now warns if you try to
enter path separator characters.  Past versions also used a regular
folder browser to select the folder, which suggested (incorrectly)
that arbitrary folders could be selected.  The dialog now uses a more
restricted folder browser that only allows selecting a suitable
subfolder of the main global container folder for the item type.

* The backglass window can now be made "borderless", removing the
title bar and sizing borders so that the entire window area is filled
with the backglass graphics, just like the DMD and instruction card
windows.  Switch between regular and borderless mode using the "Show
Window Borders" command, which is on the context menu that pops up
when you right-click in the backglass window.

* Added the new option flag [ADMIN] for game system Run Before/After
commands.  This launches the target program in Administrator mode.
This feature is only available when running the "PinballY Admin
Mode.exe" version of the program.

* A few minor upgrades to the Run Before/After option prefix flag
parser:

  - The option flags can now be specified in mixed case  

  - The flag parser provides more helpful diagnostics when invalid
  flag syntax is used

  - The parser now accepts a completely empty flag set, [].  The
  empty flag set can be used to explicitly say "there aren't any
  flags here!", which might be useful in the (unlikely but possible)
  case that you want to specify a command line that literally starts
  with '['.

* PinballY 64-bit now tries to detect when an older DOF version is
installed, and displays an explanation of the need for an update and
where to find it, rather than showing an inscrutably technical Windows
error code.  (PinballY 64-bit has supported DOF since Alpha 19, but
only if you have a very recent DOF update, R3++ 2018-09-04 or later.
With an older DOF, trying to load in 64-bit mode causes some weird and
not very informative COM errors, which earlier PinballY versions were
just passing along in an error box.  The program now tries to be more
helpful in this situation by explaining the probable cause of the
errors and how to fix them rather than leaving it for you to puzzle
out what the COM error codes mean.)

* The program now responds to window-level DPI change notifications
from Windows by resizing affected windows.

* In the event that a required font isn't installed, the program now
tries to fall back on suitable default fonts.  This really shouldn't
ever be necessary, as the program only uses standard Windows fonts
that should be installed on all Windows systems, so this is just in
case we run into a weird situation (e.g., the user has intentionally
deleted a standard font for some reason).



09-13-2018 (1.0.0 Alpha 20)

* Upgrade notice: the Settings.txt file variables for video capture
times have changed from "Capture.<type>Time" to "Capture.<type>.Time".
The change is the insertion of the '.' before Time.

 Capture.PlayfieldVideoTime  ->  Capture.PlayfieldVideo.Time.
 Capture.BackglassVideoTime  ->  Capture.BackglassVideo.Time.
 Capture.DMDVideoTime        ->  Capture.DMDVideo.Time.
 Capture.TopperVideoTime     ->  Capture.TopperVideo.Time.

You can either hand-edit Settings.txt to update the variable names, or
you re-enter settings in the Media Capture section of the options
dialog.  This change was to make the names more readable and more
consistent with the new related settings for manual start/stop modes.


* Batch capture!  This works a lot like the regular capture process
for a single game, but lets you apply the operation to more than one
game at a time.  Batch capture is great for setting up a new machine
with relatively little manual intervention.  You can also use it from
time to time to automatically back-fill missing media for games you've
added recently, since one of the options is to capture only missing
items.

  - On the Operator Menu, use the Batch Capture command to initiate
  a batch capture.

  - The Batch Capture command walks you through a multi-step
  process to select what to capture:

    - Which games to include in the batch  All Games, Games Marked
      for Capture (see below), and games from the currently active 
      filter, as set in the main menu (e.g., 70s Tables, Williams 
      Tables, Favorites, a category filter).

    - Which media types to capture in this batch.  This uses the
      same selection list as in a regular single game capture.

    - What to do about games with existing media of the selected
      types: keep existing media (that is, only capture that media
      item for games that don't already have it) or replace any
      existing items with a new capture.

  - Once you've selected all of the capture criteria, you'll
  have a chance to review the items to be captured, and then
  start (or cancel) the batch operation.

  - On the Game Setup menu, the "Mark for Batch Capture" command
  flags an individual game for inclusion in a future batch capture.
  This lets you pick a specific set of games for capture without
  doing the capture right away.  This is intended to let you flag
  games that need additional media items as you encounter them
  during a regular gaming session, without having to interrupt the
  gaming session to do the capture immediately and without having
  to scribble down a note somewhere.  Just flag games as you come
  across them, and then at a convenient later time, fire off a
  Batch Capture command with the "Games Marked for Capture" subset
  selection.  

  - After any successful capture operation (batch OR single), the 
  Mark for Capture flag is automatically removed from the game
  that was involved in the successful capture.

* All of the capture media types can now be set to manual start and/or
stop mode, via the Media Capture page in the settings. 

  - "Manual Start" means that the capture process will stop and
  prompt you to press a button before it starts capturing that
  particular item.  If Manual Start isn't selected for an item, the
  capture process simply starts capturing that item immediately as
  soon as it's that item's turn in the capture sequence.  Manual
  start is useful if you want to capture at a particular point in
  the game's attract mode sequence.  This might be especially useful
  for DMD videos, since most newer machines display a cycle of
  messages on the DMD between games; you could use this to start the
  capture at the beginning of a cycle.

  - "Manual Stop" means that a video or audio capture will continue
  until you manually stop it by pressing a button, rather than using
  a fixed timer.  The status window will prompt you for this while
  the capture is taking place, to remind you that you have to
  intervene when you want the capture to end.  Manual Stop is useful
  if you want to time a video to end on a good boundary for looping.
  This is might be especially useful for DMD videos, so that you can
  capture exactly one attract mode message cycle.

* Added a Pause Game command.  This can be mapped to any keyboard key
or joystick button, using the normal Buttons page in the options
dialog.  

When a game is running, PinballY monitors the Pause Game button, just
like it monitors the Exit Game button.  When you press the assigned
button, PinballY interrupts the game temporarily by bringing the main
PinballY window to the foreground.  You can use menu commands to
switch back to the game when you're ready to resume, or terminate the
game or exit PinballY.

This is an experimental feature at the moment: it works with VP but
hasn't been tested with other systems yet.  All it actually does is
bring PinballY to the foreground.  This happens to work nicely with
VP, because VP freezes its physics whenever it's in the background.
If every other system works the same way, great.  If not, we'll have
to look at adding system setup options to do whatever's needed in
other systems to effect similar physics freezes.

* For two-stage game launches (where the initial process that PinballY
launches is actually just a launcher that starts a third process where
the actual game resides, a la anything Steam-based, or FP + BAM),
PinballY now waits for the final game process to terminate when you
press the Exit Game button.  In the past, if you used the Exit Game
command in the middle of the first stage of the launch, when the
initial launcher was still working on loading the final game program,
PinballY would leave the game program running because it only bothered
to wait for the initial launcher stage to exit.  PinballY now tries to
wait for the final game to exit, even if you press the Exit Game
button early on before the actual game process has even started.

* For Alphanumeric style high scores in the video DMD window, limit
the display to 2 lines at a time, to better match the original style
of the generation of games that used these displays.

* Fixed drawing problem with message boxes in the main playfield
window on high-resolution monitors.


09-04-2018 (1.0.0 Alpha 19)

* Added DOF support to the 64-bit version.  Note that this requires
installing the latest experimental version of DOF R3++, dated
2018-09-04 or later.  You can find that here:

  http://mjrnet.org/pinscape/dll-updates.html

* Added a setting to turn logging for DOF-related messages on and off,
and added logging for DOF setup events.

* Added [ROTATE(window,angle)] commands for Run Before and Run After
commands for game launches.  These allow rotating UI windows during
the launch to compensate for system monitor layout changes made by the
commands.

* Ensure that the Run Before and Run After commands are always paired,
to allow the After commands to clean up any system-wide settings
changes made in the Before commands.  In particular:

  - Run After (2) will always run if Run Before (1) is executed
  - Run After (1) will always run if Run Before (2) is executed

* Added substitution variable expansion to the Table Folder in the
system settings.  Currently, there's just one defined variable:

  - [PinballY] expands to the PinballY install folder, as a full
    absolute filename path

* Added a [PinballY]\Farsight folder containing ".pinballArcade" files
for all of the games in the current edition of The Pinball Arcade by
Farsight Studios.  These are just empty files that are there for the
sake of their names.  If you own Pinball Arcade, you can use these to
populate the game wheel with all of the Farsight tables by updating
the system settings for Pinball Arcade in your options as follows
(enter the text [PinballY] literally):

  - Table Folder:  [PinballY]\Farsight
  - Default extension: .pinballArcade

PinballY will use that information to scan the Farsight folder, just
like it scans the Visual Pinball and Future Pinball table folders for
their games, which will allow it to discover the list of Farsight
tables.  This will create standard "unconfigured" entries in the game
wheel, which you can configure as usual with the Game Setup menu.  You
can use the "Hide Game" command in the Game Setup menu to hide any of
the games that you don't own. 


08-31-2018 (1.0.0 Alpha 18)

* Improve the drag-and-drop UI for dropping individual media files:

  - Add visual drop areas for different media types when a file 
    could be used in different ways.  For example, when dragging a
    PNG file onto the playfield window, it could be used as the 
    table background image or as a wheel logo image.  The new
    on-screen display lets you specify which to use by dropping 
    the file onto the appropriate area.

  - Audio files can now be dropped onto the playfield window to
    add table audio and launch audio to a table.

  - Skip menu prompts when dropping a media file into a role
    where there isn't any existing file; just add the file.  Only
    prompt when an existing media file would be replaced, and then
    use a simple confirmation prompt (rather than the more complex
    menu shown for media packs, which are necessarily more elaborate
    because they have to deal with multiple files).

  - Automatically remove the result message after a few seconds
    when the drop succeeds (rather than forcing the user to dismiss
    it manually), since it's usually obvious enough that the drop
    succeeded in that the dropped item(s) will appear in the UI
    immediately.

* In cases where there are two or more files for a given media type of
different formats (e.g., two table background images for the same
table, one JPG and one PNG), the one with the latest timestamp is
used.  When installing files via drag-and-drop, files are always
updated with the current time when installed, so this ensures that the
most recently installed file is displayed when there are multiple
matching files.

* Add a second phase to the Run Before and Run After commands, to
allow for finer control over visual effects while the commands are
processed.  Each system now has two, labeled (1) and (2), for the Run
Before and Run After commands.  Run Before (1) is executed with a
plain blank screen showing in the main playfield window, which makes
for smoother visual transitions if the command needs to make any
global changes to the monitor layout.  Run Before (2) is executed with
the "Loading game" message displayed in the main window, so it
shouldn't make any display adjustments, but it can carry out
longer-running tasks more comfortably given that the user can see some
visual feedback that the launch is in progress.  Run After (1) and (2)
essentially reverse this process: Run After (1) is run while the
"Exiting game" message is still on the screen, then the main window is
cleared to all black, and finally the Run After (2) command is
executed.  As with Run Before (1), Run After (2) can make display
layout changes more smoothly thanks to the blank black screen.

* Add [HIDE] and [MINIMIZE] flag options to the Run Before and Run
After commands, to control the window appearance of the launched
command.  These are useful to make the visual transitions smoother
when launching certain types of commands.  [HIDE] launches the program
with its window hidden; this is useful for CMD scripts, for example,
to prevent the DOS box from popping briefly into view.  [MINIMIZE]
launches it with its window initially minimized, which is useful for
background tasks that you want to leave running during the game
without seeing their UI.  (You can also use [HIDE], but you might
prefer [MINIMIZE] for a background task so that you can switch to it
with the Windows desktop if it becomes necessary to intervene manually
for some reason.)

* Fix libvlc video/audio media loading for filenames that contain
non-ASCII characters (by converting filename strings passed to libvlc
to UTF-8).

* Improve the way that DmdDevice.dll is found and loaded when using
the 64-bit version of PinballY:

  - If a 32-bit version of VPinMAME is installed, PinballY will still
    be able to find it, even when running in 64-bit mode.  In the
    past, 64-bit PinballY could only find 64-bit VPinMAME, which is
    rarely installed.

  - You can now install 32-bit and 64-bit versions of DmdDevice.dll
    side by side, for compatibility with 32-bit and 64-bit clients.
    Most people use the 32-bit version of Visual Pinball and VPinMAME,
    which require the 32-bit version of the DLL, because Windows
    doesn't allow mixing 32- and 64-bit code - the DLL and EXE type
    always have to match.  That created a problem if you wanted to
    use 64-bit PinballY, for the same reason.  The solution is that
    you can now install BOTH the 32- and 64-bit version of the DMD
    DLL, and you can install them side by side in the VPinMAME folder.
    Simply install the original 32-bit version as usual, and then 
    ALSO copy the 64-bit version of DmdDevice.dll into the same
    folder, RENAMING IT to DmdDevice64.dll.  

    64-bit PinballY will always look for DmdDevice64.dll first, and
    use that file if it exists.  If not, it looks for DmdDevice.dll
    as usual.  So if you're already using 64-bit VPinMAME, there's
    no need to rename anything or create extra copies of the DLL.
    The extra DmdDevice64.dll is only needed if you need BOTH the
    32-bit and 64-bit versions to be installed simultaneously.

* Make capture work properly for Windows 8.1 and 10 systems with
multiple monitors that use different DPI settings and/or display scale
settings by marking FFMPEG as "DPI aware".  In the past, FFMPEG
sometimes reported errors or grabbed the wrong screen area when
capturing in such setups.  The problem was that the standard build of
FFMPEG isn't marked as being compatible with the newer "high DPI"
features in Windows 8.1 and 10 that allow more user control over the
display layout.  With the compatibility flag missing, Windows was
forced to "lie" to FFMPEG about the monitor layout, which resulted in
the errors and mismatched pixel areas when capturing from PinballY.
The solution was to add the flag to the FFMPEG executable, to allow
FFMPEG to see the true monitor layout.  The reason Windows has this
flag in the first place is that older GUI programs that aren't
programmed for the newer display features sometimes get the UI layout
wrong, so Windows by default virtualizes the pixel layout for old
programs to protect them from such anomalies.  But FFMPEG doesn't have
a GUI, so the virtualization did no good for it and caused us lots of
problems with capture.  (I personally think the official FFMPEG
distribution ought to add this same flag, but there might be
complications for more general FFMPEG use cases that I'm unaware of.
For our limited purposes of using FFMPEG as a capture tool, I'm pretty
sure it's a completely safe change, given that FFMPEG doesn't use or
affect display layout in any other way for this use case.)

* Fix a weird problem with caption bar drawing in the playfield and
backglass windows that occurred when one of these windows was
initially created in full-screen (based on the saved settings from the
last session) and then later switched back to windowed mode.


08-27-2018 (1.0.0 Alpha 17)

* Try to fix problem releasing real DMD device while a game is running
(so that the game can take it over)

* Stop including an empty category name in the category selection list
in the game setup menu


08-25-2018 (1.0.0 Alpha 16)

* Try fixing font scaling for high-DPI monitors

* Recognize the temporary mjr test build of dmd-extensions as
containing fixes

* Fix slight UI pause during game switching when real DMD is in use

* Use actual monitor aspect ratio for playfield background videos and
images when in full-screen portrait mode.  (A fixed 16:9 aspect ratio
is still used in other cases.)  Some computer monitors have slightly
different aspect ratios (e.g., 16:10) from the HD standard; using the
live monitor's actual aspect ratio fills the screen, which is usually
preferable to letterboxing or windowboxing the image when the monitor
is close to but not exactly 16:9.  (This probably won't affect many
people, because 16:9 is practically universal as far as pin cab
monitors go.  But if there actually is anyone out there with a
non-16:9 pin cab monitor, and you think this makes it look worse, this
could easily be turned into an option.)


08-23-2018 (1.0.0 Alpha 15)

* For testing: Mark program as DPI-aware, for (hopefully) better
behavior on 4K monitors and other high-DPI monitors.

* Fixed line wrapping of very long manufacturer names in the popup
game info box.


08-22-2018 (1.0.0 Alpha 14)

* Speed up VP X exit times.  (In the past, VP X exit was really slow
due to a workaround we were using for a VP 9 problem that made VP 9
crash if we closed it while it was showing a dialog.  The workaround
had to do with the order of closing the child app's windows.  The new
approach is safe against the VP 9 crash problem but lets VP X exit
quickly.)

* Explicitly terminate ffmpeg capture when the game exits prematurely
or the user cancels the operation.  (In the past, we didn't try to
terminate ffmpeg separately, so it could sometimes keep recording the
screen even though the game wasn't running any more.)

* Include blank lines between sections in the high scores box.

* Reduce the high score box font size as needed to make it fit a
reasonable window height for games with unusually long high score
lists (I'm looking at you, Medieval Madness).

* Clean up some anomalies with on-the-fly changes to the real DMD
enable/disable status when dmd-extensions is in use.


08-21-2018 (1.0.0 Alpha 13)

* Add "Delete Game Details" command to the game setup menu, to delete
the bibliographic database entry for the selected game.

* Add "Info Box" options page, with options for what to show in the
auto popup info box (and whether to show it at all).  Most details can
now be separately enabled or disabled.  Also added options for showing
the game wheel logo in place of the plain text title; showing the
table file name; showing the table type (solid state, etc), in full or
abbreviated; and for whether or not to use graphical logos for the
manufacturer and system type.

* Take the mirror/flip display transformations into account during
video capture.

* Reverse the 90- and 270- degree rotation senses for the capture.
These were backwards in past versions.

* Mirror/flip the capture status box to match the settings of the
window it's over.

* When deleting media from the "Show Media Files" list, stop video
playback to ensure that we don't create our own sharing conflict with
the file by holding it open for video playback.

* Try to work around a dmd-extensions problem (dmd-ext issue #125,
crash if no game name set: workaround is to set a dummy game name
after startup, taking care not to do this more than once to avoid
the separate dmd-ext issue #123).

* Log FFmpeg results to log file whenever FFmpeg fails, even if Media
Capture logging is disabled in the options.  You'll probably want to
see any FFmpeg errors even if you don't normally need any capture
logging information, to help diagnose whatever went wrong.


08-18-2018 (1.0.0 Alpha 12)

* Tweaked ffmpeg parameters per STV's findings to try to get 4K
capture working

* Fix error message logging and process exit code recognition in ffmpeg launch

* Switch to 64-bit ffmpeg in 64-bit release bundle

* Update libvlc 32-bit to 3.0.3

* Clear media on real DMD during game play (restores previous behavior
broken in alpha 11)


08-17-2018 (1.0.0 Alpha 11)

* If a real DMD is active, close our connection to it whenever we
launch a game, to avoid contention with the game for access to the
device.  (Exception: we don't do this when using dmd-extensions in
virtual mode, due to a problem in the DLL that crashes the process in
this situation.)

08-16-2018 (1.0.0 Alpha 10)

* Changed the Auto Launch feature to use Windows Task Scheduler logon
tasks instead of the Run registry key.  The registry key didn't work
with Admin mode launches, and didn't seem reliable on some machines
even for regular user mode launches, especially with the 64-bit
version.  Task Scheduler is the more officially supported way to do
these sorts of launches, so it should be reliable for all cases.


08-13-2018 (1.0.0 Alpha 9)

* Added the table type (Solid State, Electromechanical, Mechanical) to
the "Information" display box

* Added support for manufacturer and system logos.  Place PNG logo
files in <media path>\Company Logos and <media path>\System Logos.
For the manufacturers, the files are matched based on the company
name in the game database, but you can also create different logos
for different eras by using this format for the file names:
Gottlieb (1971-1982).png.  For games where the release year is
known, PinballY will try to match a logo for the era containing
that year.  For systems, the system name as defined in the options
is matched.  Systems will also be matched by prefix when there's
no exact match, so the file "Visual Pinball.png" will match 
systems "Visual Pinball 9.2", "Visual Pinball X", etc.  This
lets you create different logos for different system versions
if you like, but also lets you use a common logo for all
versions, as long as you follow the naming convention of placing
the version at the end of the system name.


08-11-2018 (1.0.0 Alpha 8)

* Change the minimum video card "shader model" required to shader
model 4 (from 4.1), for compatibility with older video cards.  (The
shader model is basically a Microsoft-defined API that has to be
implemented in the video card hardware and/or device drivers, so
higher shader models generally require newer or more powerful video
cards.  My goal is to be compatible with anything that can run Windows
7 SP1 and Direct3D 11, but it's not quite that simple because the
shader model is an additional dimension of system requirements that
depends entirely on the video card, regardless of how up-to-date your
Windows and D3D software are.)

* Use the correct auto-launching registry key for 64-bit builds.
32- and 64-bit programs are auto-launched with different registry keys:
64-bit: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
32-bit: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

08-10-2018 (1.0.0 Alpha 7)

* Added several new logging options, to get (lots) more detail about
various operations.  See the new Log File page in the options dialog.
Some of the new options add a lot of extra information to the log
file, so it's best to keep them disabled unless you're trying to
debug something in that particular area.

* Look for dmddevice.dll in the PinballY program folder first, then in
the VPinMAME folder.  This allows using a specific version of the DLL
with PinballY, without affecting what VPM uses, simply by copying the
desired DLL into the PinballY install folder.

* Detect the dmd-extensions version of dmdevice.dll, and check if its
"virtual" device (the fake on-screen DMD window) is enabled.  If so,
suppress loading the DLL unless the config setting for RealDMD is
explicitly ON; skip it on AUTO.

* Detect the dmd-extensions version of dmddevice.dll and work around
a crash bug in the DLL if we identify it.  (I found the problem in
the DLL and sent a pull request to freezy with the fix, but that will
take a while to propagate around, so for the time being we have to
deal with the existing buggy version of the DLL.)  If you ran into
a problem in the past where PinballY (a) showed a second DMD window 
on the screen that was stuck on top, and (b) tended to crash the
first time you switched to a different game in the wheel UI, this
should fix it.


08-07-2018 (1.0.0 Alpha 6)

* Added media file viewer: select via the Game Setup menu; shows
all media folders for the game and all matching files; commands to
open folders in Windows Explorer and delete individual media files

* Added Table Audio media type support, including capture

* Remember dialog window positions, and set the initial default
position so that it's over a non-rotated window
 
* Add media file name template to game info box

* Add option to suppress splash screen at startup

* Fix extra separator bar in "last played" filter menu

* Added a "watchdog" process that restores the desktop taskbar to
visibility, if PinballY happens to crash or otherwise exit abnormally
while the taskbar was hidden for a game launch

08-03-2018 (1.0.0 Alpha 5)

64-bit build, to better support 4K video (libvlc needs about 600MB to
play back one 4K video); change memory management for video player to
ensure D3D11 resources are always allocated and released on the main
UI thread.

08-02-2018 (1.0.0 Alpha 4)

Fix slight UI pause when generating alphanumeric high score images;
ensure video player D3D11 resources are released on main thread, to
avoid any driver-dependent threading issues with resource deletion;
create game database folders automatically as needed.

07-31-2018 (1.0.0 Alpha 3)

Added alternative high score display formats: alphanumeric 16-segment
display style (for 1980s solid-state machines with segmented
displays); typewriter style (for EM machines).

07-27-2018a (1.0.0 Alpha 2)

Bug fix: the program could get stuck on startup searching for
PinballX, if PinballX wasn't installed.

07-27-2018 (1.0.0 Alpha 1)

Inaugural release
