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: 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: 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 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 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 "'" entity format (as they were in the past). The "'" 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 "'" 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 <ipdbid>. * 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