FoosOBSPlus is a tool to enhance your foosball streaming experience. It is a flexible foosball score keeper and statistics program that will send the match information to your OBS Studio (Version 28 or higher) streaming software. It also plays well with Elagto's Stream Deck products so updating the score, switching sides, calling times out can all be done with simple button presses.
FoosOBSPlus sends your Foosball game data (Players, scores, game counts, time outs, etc.) to OBS Studio using OBS Studio's web sockets protocol. Almost every field displayed in FoosOBSPlus can be sent to OBS Studio and displayed to your live stream. FoosOBSPlus can also connect to an auto scoring system using a Raspberry Pico W and some lasers (see <https://github.com/hsgarn/FoosScore for more information>). Also a Stream Deck can be used in combination with Auto Hot Keys to control most functions in FoosOBSPlus.
OBS Studio scene utilizing FoosOBSPlus to display various data:
FoosOBSPlus is a java program. You can download the executable jar file from the Releases section. You will need to have at least Java 1.8 loaded and windows set up to associate jar files with java. There are many resources on the web for how to load java and set windows up to run the jar file. (see https://www.howtogeek.com/812583/how-to-open-jar-files-windows/ for example. The executable jar file will run in the directory you placed it. )
This opens up a window for you to select a stats file to import. A stats file is a simple text file with one code per line. The file will be read in and the stats will be displayed in the Statistics Display Panel. The idea is that you can just write the codes in a text editor as a game is being played and then later import them into FoosOBSPlus for it to generate the stats.
This option writes the current codes in the Statistics Entry Panel History window to a file of your choosing so that they can be imported later. Not sure what the practicality of this is, but the option is here if you ever need it. :)
This option can be used to exit the program. A confirmation window will ask if you really want to exit the application. Just click OK to exit or Cancel to return to the program.
If running FoosOBSPlus for the first time, it will create a set of properties files with the default properties in the folder in which the program is running. These property files contain the settings for the operating parameters, sources, filters, hot keys and more. Below are the options under Settings:
FoosOBSPlus tries to make keeping track of a foosball match's progress as simple as possible. To that end, there is a settings screen that contains parameters that affect how FoosOBSPlus will behave. Click Edit then Settings then Parameters to get to the Parameter Settings screen.
This is the number of points required to win a game. This is only used if the Auto Increment Game checkbox is checked and the Rack Mode check box is unchecked. Once a team's score reaches this number, it will reset the scores to zero and increase the game counter for the team. If the Announce Winner check box is set and the team has reached the number set in the Games to Win parameter, then the Team's name will be sent to the Match Winner OBS source along with the text specified in the Winner Prefix and Winner Suffix parameters. Points to Win is also utilized to determine if it is meatball (both teams 1 point away from winning score in final game).
The Max Win parameter is only used when the Win By parameter is greater than 1. If a team has to win by more than 1 point, then Max Win is the maximum score a team can get and at that point it does not matter if they won by more than 1 point.
The Win By parameter is used to force a team to win by a specified number of points. Default is 1 which means that a team only has to win by 1 point (normal game behavior). Setting the parameter to 2 would require that a team win by two points. If a team reaches the Points to Win value without being ahead by the Win By value, then the game continues until either a team wins by the Win By margin, or the Max Win value is reached. Note: If Win By in Final Game Only is checked, then the Win By points are only considered in the last game of the match (prior games are win by 1).
The Games to Win parameter is used to determine when a match is won. Specify the number of games required to win the match. Default is 2 for a 2 out of 3 match. Use 3 for a 3 out of 5 match. etc. 6 is the maximum value supported at this time.
The Max Time Outs parameter is used to set how many time outs each team has. The default is 2.
This is the color of the player figures for Team 1. Default is Yellow. This is used to help recognize which side of the table Team 1 is on.
This is the color of the player figures for Team 2. Default is Black. This is used to help recognize which side of the table Team 2 is on.
This is the number of balls in the table when using a coin op table. This is used in Rack Mode. In Rack Mode, the winner is determined by whoever has the most points after the number of balls in the Balls in Rack field have been scored. The default is 9.
When checked, Rack Mode is on. A game is completed in Rack Mode when the number of balls in the Balls in Rack field have been scored. Whoever scored the most, wins. So if Balls in Rack is 9, then the game ends when 9 points have been scored (the score could be 8 to 1, or 5 to 4 or 3 to 6, etc). This mode is typically played on pay tables with pick up games as people play the full rack before starting a new game. When unchecked, Rack Mode is off and a game is completed after a team scores the number of points required to win a game. This is the typical mode used for tournaments and is the default.
This is the time allowed to shoot the ball from the forward 3 rod or the goalie area in seconds. The default is 15 seconds.
This is the time allowed to pass the ball from the 5 row to the 3 row in seconds. The default is 10 seconds.
This is the time allowed for a time out in seconds. The default is 30 seconds.
This is the time allowed between games in seconds. The default is 90 seconds.
This is the number of minutes a player may be on recall before forfeiting the match. The default is 10 minutes.
This parameter defines the text that will be sent to the Last Scored OBS source when Team 1 scores. The default value is "<--- Last Scored".
This parameter defines the text that will be sent to the Last Scored OBS source when Team 2 scores. The default value is "Last Scored --->".
This parameter defines the text that will be sent to the Last Scored OBS source when neither team has scored (after the Reset All button is clicked or a score is reduced by the - button).
When checked, the game count for the team that just scored will be automatically incremented when their score is incremented and reaches the number of points required to win a game.
When checked, the Match Winner OBS source will be populated with the winning team name (prefixed by the Winner Prefix parameter and suffixed by the Winner Suffix parameter) when the game count for a team reaches the Games to Win parameter value. Use the Start Match, Reset Scores or Reset All buttons to clear the Match Winner for the next match. Team names will be used if they are populated, otherwise the Forward and Goalie names display. If team name, forward and goalie fields are all empty, then the match winner will not be displayed.
Text to be displayed in front of the winning teams name when the match is won. The default is Match Winner:.
Text to be displayed after the winning teams name when the match is won. The default is !!!.
When checked, the Meatball OBS source will be populated with the text in the Announce Meatball parameter when both teams' scores are one point away from winning. Once the score changes, the text in the Meatball OBS source will be automatically cleared.
When checked, the program will put the number of time outs used for each team in the Time Out OBS sources. When unchecked, the program will put the number of time outs remaining for each team in the Time Out OBS sources.
When checked, the program will automatically capitalize the first letter of each team's player's names. If not checked, the team names are left as entered.
When checked, a team must win by the margin in Win By parameter in the final game of the match only. The prior games will be win by 1 point. When unchecked, a team must always win by the margin in the Win By field in every game.
When checked, the program will activate the OBS filter defined in the OBS Connect dialogue box when a team wins a game without the opposing team scoring a single point in the game.
When checked, the program activates CutThroat Mode to support the game of CutThroat. In CutThroat, three people play against each other. One player starts on the scoring side (Team 1) while the other players play on Team 2. The player on the scoring side always serves the ball and when scores, gets a point. If the players on other side score, then everybody rotates so that Team 2 Forward moves to the scoring side. Team 2 Goalie moves to the Team 1 Forward position. And the player who was on the scoring side moves to the Team 2 Goalie position. The scores in this mode are appended to the players names.
Click the Apply button to save any parameter changes made and keep the window open.
Click the Apply and Close button to save any parameter changes made and close the window.
Click the cancel button to discard any parameter changes made.
Click the Restore Defaults button to restore the default parameters.
FoosOBSPlus sends most of its data to sources in OBS Studio so it can be displayed in a live stream. The names of these sources are configurable if the default names do not suit you. The vast majority of these sources should be Text (GDI+) sources with the Read from file checkbox unchecked. Exceptions to this will be specifically noted below. There are enough sources that they were split into two windows. The sources window is described below and the statistics sources window will be described in the following section. To get to the sources configuration, click on Edit, then Settings, then Sources:
Below are the sources that can be configured:
A source can be entered for each team's name. The default source is teamXname where X is the team number (1, 2 or 3).
A source can be entered for each team's forward. The default source is teamXforward where X is the team number (1, 2 or 3).
A source can be entered for each team's goalie. The default source is teamXgoalie where X is the team number (1, 2 or 3).
The score source for each team can be set. The default source is teamXscore where X is the team number (1, 2 or 3).
The game count source for each team can be set. The default source is teamXgamecount where X is the team number (1, 2 or 3).
The match count source for each team can be set. The default source is teamXmatchcount where X is the team number (1, 2 or 3).
The time out count source for each team can be set. The default source is teamXtimeout where X is the team number (1, 2 or 3).
The reset source for each team can be set. The default source is teamXreset where X is the team number (1, 2 or 3).
The warn source for each team can be set. The default source is teamXwarn where X is the team number (1, 2 or 3).
The king seat source for each team can be set. The default source is teamXkingseat where X is the team number (1, 2 or 3).
This is the source that will be made visible when team X wins their first game. This source can be any source type as long as it has the visible property (i.e. Text GUI+, Image, etc.). The default source is teamXgame1 where X is the team number (1, 2 or 3).
This is the source that will be made visible when team X wins their second game. Game 1's source will remain visible. This source can be any source type as long as it has the visible property (i.e. Text GUI+, Image, etc.). The default source is teamXgame2 where X is the team number (1, 2 or 3).
This is the source that will be made visible when team X wins their third game. Game 1 and 2 sources will remain visible. This source can be any source type as long as it has the visible property (i.e. Text GUI+, Image, etc.). The default source is teamXgame3 where X is the team number (1, 2 or 3).
This is the source that is controlled by the Show Score check box in the OBS Panel on the main screen. This is intended to be a named group of sources within within OBS or a scene with OBS that contains all the scoring fields and their associated labels. This group or scene can then be included in your main streaming scene. When you want to keep score, check the Show Score check box on the main screen. When no one is keeping the score, uncheck the Show Scores button which will turn the scene/group in the Show Scores: source box off. The following sources would typically be contained in this scene or group: Last Scored, Time Out (Teams 1 & 2), Match Count 1 (Teams 1 & 2), Game Count (Teams 1 & 2), Score (Teams 1 & 2), King Seat (Teams 1 & 2). Not team 3 sources are controlled by Show Cutthroat discussed later. Also include any labels that would look out of place without the above fields.
This is the source that shows the time remaining. This should be a Window Capture source in OBS. The window should be setup as follows:
This is the source that is controlled by the Show Cutthroat check box in the OBS Panel on the main screen. This is intended to be a named group of sources within within OBS or a scene with OBS that contains all the scoring fields and their associated labels for team 3. This group or scene can then be included in your main streaming scene. When you want to show team 3's information, check the Show Cutthroat check box on the main screen. When no one is keeping the score, uncheck the Show Scores button which will turn the scene/group in the Show Scores: source box off. The following sources would typically be contained in this scene or group: Time Out (Team 3), Match Count (Team 3), Game Count (Team 3), Score (Team 3), King Seat (Team 3).
This is the source of a freeform text field that can be used for the name of the tournament or venue. Default source is tournament.
This is the source of a freeform text field that can be used for the name of the event being played (i.e. DYP, Open Singles, etc). Default source is event.
This is the source for the table name. Default source is tablename.
This is the source that holds the name of the current timer that is running (Shot, Pass, Game, Timeout, Recall). Default source is timerinuse.
This is the source for the Time Remaining on the current timer. Default source is timeremaining. An alternative and arguably better method to show time remaining is to use a Window Capture source in OBS. This will show the background color of the timer which is a nice touch since it starts green and goes red when time runs out.
This is the source for the game clock time. Default source is gametime.
This is the source for the match time. Default source is matchtime.
This is the source for the stream time. Default source is streamtime.
This is the source that holds the indicator for which team scored last. Default source is lastscored.
This is the source that holds the Winner Prefix, Team's Name and Winner Suffix of the team that won the match. Default source is matchwinner.
This is the source that holds the Meatball text when a game is tied just prior to the final point. Default source is meatball.
This is the source that holds the results of all the games played since the program was started or the Start Event button was pressed. It is intended to be a Text (GDI+) source with a scrolling filter applied. Every time a game is won, the current time, team 1 forward & goalie names, team 1 score, team 2 forward & goalie names, team 2 score, and the game time length is added to the text on a new line. Default source is gameresults.
Click the Apply button to save any source changes made and keep the window open.
Click the Apply and Close button to save any source changes made and close the window.
Click the cancel button to discard any source changes made.
Click the Restore Defaults button to restore the default sources.
The statistics fields in FoosOBSPlus can be sent to OBS Studio so it can be displayed in a live stream. The names of these sources are configurable if the default names do not suit you. The vast majority of these sources should be Text (GDI+) sources with the Read from file checkbox unchecked. Exceptions to this will be specifically noted below. To get to the Statistics Sources configuration, click on Edit, then Settings, then Statistics Sources:
Statistics Sources Settings Page:
Below are the sources that can be configured: (Note: Although Team 3 sources can be defined, currently no statistics are actually captured for Team 3.) Each field below has a source for Team 1, Team 2 and Team 3. For the defaults, replace the actual team number for the X.
This is the source that holds the number of pass attempts for a team. Default source is teamXpassattempts.
This is the source that holds the number of pass completions for a team. Default source is teamXpasscompletes.
This is the source that holds the successful passing percentage for a team. Default source is teamXpasspercent.
This is the source that holds the number of shot attempts for a team. Default source is teamXshotattempts.
This is the source that holds the number of shots made for a team. Default source is teamXshotcompletes.
This is the source that holds the successful shot percentage for a team. Default source is teamXshotpercent.
This is the source that holds the number of clearing attempts for a team. Default source is teamXclearattempts.
This is the source that holds the number of successful clears for a team from the goalie area to the 5 bar or beyond. Default source is teamXclearcompletes.
This is the source that holds the successful clear percentage for a team. Default source is teamXclearpercent.
This is the source that holds the number of pass attempts for a team from the 2-bar to the 5-bar or 3-bar. Default source is teamXtwobarpassattempts.
This is the source that holds the number of successful pass completions for a team from the 2-bar to the 5-bar or 3-bar. Default source is teamXtwobarpasscompletes.
This is the source that holds the successful 2-bar to the 5-bar or 3-bar passing percentage for a team. Default source is teamXtwobarpasspercent.
This is the source that holds the number of aces for a team. Default source is teamXaces.
This is the source that holds the number of stuffs for a team. Default source is teamXstuffs.
This is the source that holds the number of breaks for a team. Default source is teamXbreaks.
This is the source that holds the number of scores for a team. Default source is teamXscoring.
This is the source that holds the number of scores from the 3-bar for a team. Default source is teamXthreebarscoring.
This is the source that holds the number of scores from the 5-bar for a team. Default source is teamXfivebarscoring.
This is the source that holds the number of scores from the 2-bar for a team. Default source is teamXtwobarscoring.
This is the source that holds the number of shots on goal for a team. Default source is teamXshotsongoal.
Click the Apply button to save any statistics source changes made.
Click the Apply and Close button to save any statistics source changes made and close the window.
Click the cancel button to discard any statistics source changes made.
Click the Restore Defaults button to restore the default statistics sources.
FoosOBSPlus uses buttons to do various functions such as increase or decrease scores, switch sides, reset game counts, start timers, etc. Each button can have a Hot Key assigned to it. Pressing ALT plus the assigned Hot Key for the button will function just like pressing the actual button. Unfortunately, there are more buttons than available hot keys so you can not assign a hot key to every button. The hot keys can be used in Stream Deck commands to make operating FoosOBSPlus a simple push button affair. TouchPortal is another program that can be used to activate the buttons in FoosOBSPlus. These will require that AutoHotKey be installed. (See https://www.autohotkey.com/docs/Tutorial.htm). FoosOBSPlus will generate the AutoHotKey scripts for any hot keys defined (see the Generate AutoHotKey Scripts button below).
Below are the Hot Keys that can be configured and their default values:
Assigns the hot key to Switch Team 1's forward and goalie names. Default hot key is t.
Assigns the hot key to Switch Team 2's forward and goalie names. Default hot key is m.
Assigns the hot key to Switch Team 3's forward and goalie names. Default hot key is m.
Assigns the hot key for the + (increment score) button for Team 1. Default hot key is 1.
Assigns the hot key for the + (increment score) button for Team 2. Default hot key is 2.
Assigns the hot key for the + (increment score) button for Team 3. Default hot key is unassigned.
Assigns the hot key for the - (decrement score) button for Team 1. Default hot key is 4.
Assigns the hot key for the - (decrement score) button for Team 2. Default hot key is 8.
Assigns the hot key for the - (decrement score) button for Team 3. Default hot key is unassigned.
Assigns the hot key for the + (increment game count) button to increase Team 1's game count. Default hot key is 5.
Assigns the hot key for the + (increment game count) button to increase Team 2's game count. Default hot key is 6.
Assigns the hot key for the + (increment game count) button to increase Team 3's game count. Default hot key is unassigned.
Assigns the hot key for the - (decrement game count) button for Team 1's score. Default hot key is j.
Assigns the hot key for the - (decrement game count) button for Team 2's score. Default hot key is i.
Assigns the hot key for the - (decrement game count) button for Team 3's score. Default hot key is unassigned.
Assigns the hot key for the + (increment match) button for Team 1. Default hot key is unassigned.
Assigns the hot key for the + (increment match) button for Team 2. Default hot key is unassigned2.
Assigns the hot key for the + (increment match) button for Team 3. Default hot key is unassigned.
Assigns the hot key for the - (decrement match) button for Team 1. Default hot key is unassigned.
Assigns the hot key for the - (decrement match) button for Team 2. Default hot key is unassigned.
Assigns the hot key for the - (decrement match) button for Team 3. Default hot key is unassigned.
Assigns the hot key to use a time out for Team 1. Default hot key is 9.
Assigns the hot key to use a time out for Team 2. Default hot key is 0.
Assigns the hot key to use a time out for Team 3. Default hot key is unassigned.
Assigns the hot key to return a time out to Team 1's available pool of timeouts or used pool of time outs depending on how the Show Time Outs Used setting is set. Default hot key is n.
Assigns the hot key to return a time out to Team 2's available pool of timeouts or used pool of time outs depending on how the Show Time Outs Used setting is set. Default hot key is q.
Assigns the hot key to return a time out to Team 3's available pool of timeouts or used pool of time outs depending on how the Show Time Outs Used setting is set. Default hot key is unassigned.
Assigns the hot key for the Reset button for Team 1. Default hot key is unassigned.
Assigns the hot key for the Reset button for Team 2. Default hot key is unassigned.
Assigns the hot key for the Reset button for Team 3. Default hot key is unassigned.
Assigns the hot key for the Warn button for Team 1. Default hot key is unassigned.
Assigns the hot key for the Warn button for Team 2. Default hot key is unassigned.
Assigns the hot key for the Warn button for Team 3. Default hot key is unassigned.
Assigns the hot key for the King Seat check box for Team 1. Default hot key is unassigned.
Assigns the hot key for the King Seat check box for Team 2. Default hot key is unassigned.
Assigns the hot key for the King Seat check box for Team 3. Default hot key is unassigned.
Assigns the hot key for the Start Match button. Default hot key is b.
Assigns the hot key for the Pause Match button. Default hot key is ,.
Assigns the hot key for the End Match button. Default hot key is unassigned.
Assigns the hot key for the Start Game button. Default hot key is ..
Assigns the hot key to start the Shot timer. Default hot key is s.
Assigns the hot key to start the Pass timer. Default hot key is p.
Assigns the hot key to start the Time Out timer. Default hot key is o.
Assigns the hot key to start the Game timer. Default hot key is g.
Assigns the hot key to start the Recall timer. Default hot key is c.
Assigns the hot key to reset the timer to 0 regardless of what it is currently timing. Default hot key is r.
Assigns the hot key for the Clear All button in the Switch Panel. Default hot key is unassigned.
Assigns the hot key for the Undo button. Default hot key is u.
Assigns the hot key for the Redo button. Default hot key is d.
Assigns the hot key for the Show Skunk button. Default hot key is k.
Assigns the hot key for the Start Stream button. Default hot key is z.
Assigns the hot key for the Clear button for the Tournament Information panel. Default hot key is unassigned.
Assigns the hot key for the Switch Match Counts button. Default hot key is unassigned.
Assigns the hot key to swap all Team 1's data with Team 2's data. Use this when the teams switch sides. Default hot key is w.
Assigns the hot key to swap Team 1's and Team 2's names (Team, Forward & Goalie) with each other. Default hot key is e.
Assigns the hot key to Switch Team 1 and Team 2's scores. Default hot key is unassigned.
Assigns the hot key to switch the game counts. Team 1's game count will be swapped with Team 2's game count. Default hot key is unassigned.
Assigns the hot key to switch the time out counts. Team 1's time out count will be swapped with Team 2's time out count. Default hot key is [.
Assigns the hot key to swap the Reset and Warn flags for Team 1 with Team 2. Default hot key is unassigned.
Assigns the hot key for switching only the names of the Forwards of Team 1 and Team 2. Default hot key is ;.
Assigns the hot key for switching only the names of the Goalies of Team 1 and Team 2. Default hot key is x.
Assigns the hot key for the Reset Names button in the Reset Panel. Default hot key is unassigned.
Assigns the hot key for the Reset Scores button in the Reset Panel. Default hot key is 3.
Assigns the hot key to reset Team 1's, Team 2's and Team 3's game counts to 0. Default hot key is 7.
Assigns the hot key to reset Team 1's, Team 2's and Team 3's time outs to 0 or the max time outs depending on how the Show Time Outs Used setting is set. Default hot key is -.
Assigns the hot key to clear the Reset and Warn flags for both Team 1 and Team 2. Default hot key is unassigned.
Assigns the hot key to clear the game counts, scores, time outs, reset flags and warn flags for both Team 1 and Team 2. Default hot key is a.
Assigns the hot key to reset Team 1's, Team 2's and Team 3's match counts to 0. Default hot key is 7.
This is the path to where the AutoHotKey scripts will be generated. The default is C:\FoosOBSPlusScripts.
This button will generate an AutoHotKey script for each defined hot key. The basic idea of the scripts is to bring the FoosOBSPlus window into focus and then press the hot key for the associated hot key for the action desired. It then moves the FoosOBSPlus window to the bottom of the screen so that your OBS program can stay the main focus. The scripts will be placed into the directory specified in the AutoHotKey Script Path field.
The Select Path allows you to choose the directory in which the AutoHotKey scripts will be created. Optionally you can just type the path in the box to the right of the Select Path button.
Click the Apply button to save any hot key changes made.
Click the Apply and Close button to save any hot key changes made and close the window.
Click the cancel button to discard any hot key changes made.
Click the Restore Defaults button to restore the default hot keys.
FoosOBSPlus can trigger OBS Filters when certain events occur. For instance, when a time out occurs for team 1, a filter can be triggered to show a ref calling time out. The filter is responsible for turning itself off. To get to the filters configuration, click on Edit, then Settings, then Filters:
Below are the filters that can be configured:
This is the name of the filter activated when Team 1 scores.
This is the name of the filter activated when Team 2 scores.
This is the name of the filter activated when Team 1 wins a game.
This is the name of the filter activated when Team 2 wins a game.
This is the name of the filter activated when Team 1 wins a match.
This is the name of the filter activated when Team 2 wins a match.
This is the name of the filter activated when Team 1 calls a time out.
This is the name of the filter activated when Team 2 calls a time out.
This is the name of the filter activated when the Team 1 Reset button is pressed.
This is the name of the filter activated when the Team 2 Reset button is pressed.
This is the name of the filter activated when the Team 1 Warn button is pressed.
This is the name of the filter activated when the Team 2 Warn button is pressed.
This is the name of the filter activated when the Team 1 Switch Positions button is pressed.
This is the name of the filter activated when the Team 2 Switch Positions button is pressed.
This is the name of the filter activated when Team 1 skunks Team 2.
This is the name of the filter activated when Team 2 skunks Team 1.
This is the name of the filter activated when the Start Match button is pressed.
This is the name of the filter activated when the Start Game button is pressed.
This is the name of the filter activated when the Switch Sides button is pressed.
This is the name of the filter activated when both teams are tied and next ball wins the match.
Click the Apply button to save any filter changes made.
Click the Apply and Close button to save any filter changes made and close the window.
Click the cancel button to discard any filter changes made.
Click the Restore Defaults button to restore the default filters.
FoosOBSPlus can read player names from files. For example, we have an Access program called Partner Program and when a match is called in this program, it writes the players' names to 4 files. The directory and filenames can be set in the Partner Program Settings window.
Partner Program Settings Page:
The Select Path allows you to choose the directory that will contain the files of the players' names. Optionally you can just type the path in the box to the right of the Select Path button.
This is the name of the file containing the name of Team 1's forward. Default is Player1.txt.
This is the name of the file containing the name of Team 1's goalie. Default is Player2.txt.
This is the name of the file containing the name of Team 2's forward. Default is Player3.txt.
This is the name of the file containing the name of Team 2's goalie. Default is Player4.txt.
Click the Apply button to save any changes made.
Click the Apply and Close button to save any changes made and close the window.
Click the cancel button to discard any changes made.
Click the Restore Defaults button to restore the default file names.
This is the menu item for OBS Studio related activity. A green solid circle will show before OBS to indicate that a connection has been established. A red solid circle indicates that OBS Studio is currently disconnected.
This opens the OBS Connect window. Here you can set the connection details for your OBS instance along with a few options.
This is the host name or ip address of the computer running OBS Studio. FoosOBSPlus must be running on the same network as OBS Studio. If they are running on the same computer, then you can use localhost as the host name. OBS Studio will provide the connection details by going to Tools -> WebSocket Server Settings -> Show Connect Info.
This is the port that OBS Studio is listening too for connections. OBS Studio will provide the connection details by going to Tools -> WebSocket Server Settings -> Show Connect Info.
This is the password for OBS Studio. OBS Studio will provide the connection details by going to Tools -> WebSocket Server Settings -> Show Connect Info.
This is the name of the scene in OBS Studio that FoosOBSPlus will be sending it's data to. You can type the scene name in, or you can choose it from the Scene drop down box and press the Set Main Scene button.
Press the Set Main Scene button to grab the current scene shown in the Scene drop down box. If there is nothing showing in the Scene drop down box, then the button is ignored.
This is a list of the monitors on the computer that OBS can project a scene to. The monitor selected in the box will be the one that the scene will project to.
This will retrieve the list of available monitors. Generally this is not needed as the list will be populated when OBS first connects. But if you are actively adding monitors to your system, you can use this button to update the list of monitors.
Press this button to project the Scene specified in the Scene drop down box to the monitor specified in the Monitor drop down box. This is the same as right clicking on a scene in OBS and clicking the Fullscreen Projector (Scene) entry.
This is a list of the scenes in OBS Studio. The scene displayed in this field will be the scene that the Set Main Scene button, the Project button and the Activate Scene button will use to perform their functions.
This will retrieve the list of available scenes in OBS Studio. Select the scene that you wish to perform the Set Main Scene, or Project or Activate Scene actions on.
This button will make the current entry in the Scene drop down box display in OBS Studio.
Press the Set Main Scene button to get OBS Studio to show the scene in the Scene box.
Check this box if you want FoosOBSPlus to save the password when it exits. Otherwise, you will have to enter each time you run FoosOBSPlus and wnat to connect to OBS Studio.
If this box is checked, then when FoosOBSPlus first starts, it will try to connect to OBS Studio using the details saved in the OBS Connect window.
If this box is checked, then the OBS Connect window will close when FoosOBSPlus successfully connects to OBS Studio.
If this box is checked, then when FoosOBSPlus connects to OBS Studio, it will immediately send the current data in FoosOBSPlus to OBS Studio. Otherwise, data will only be sent when fields change in FoosOBSPlus.
This button attempts to connect FoosOBSPlus to OBS Studio. The Host, Port and Password fields must be set correctly and OBS Studio must be running on the same network for a successful connection. The button will be grayed out if already FoosOBSPlus is already connected to OBS Studio.
This button will disconnect FoosOBSPlus from OBS Studio. This button will be grayed out if FoosOBSPlus is already disconnected from OBS Studio.
This button will save the current settings in the OBS Connect window. New settings will not take affect until this button or the Apply and Close button is pressed.
This button will save the current settings in the OBS Connect window. New settings will not take affect until this button or the Apply button is pressed.
This button will close the OBS Connect window without permanently saving any changes. If you reopen the window, you may see your changes still there, but they will not be permanently stored until the Apply button or the Apply and Close button is pressed.
This button will restore the OBS Connect defaults. The Apply or Apply and Close buttons must be pressed to make these changes permanent.
This window will show any messages relevant to communicating with OBS Studio.
Click this menu item to disconnect FoosOBSPlus from OBS Studio.
This is the menu item for FoosScore AutoScore related activity. A green solid circle will show before AutoScore to indicate that a connection has been established to the FoosScore AutoScore system. A red solid circle indicates that FoosScore AutoScore is currently disconnected.
This is the IP Address of the FoosScore AutoScore server. The AutoScore server will need to be on the same network as FoosOBSPlus in order to successfully communicate with FoosOBSPlus.
This is the port number that the FoosScore AutoScore server is listening to.
When checked, FoosOBSPlus will attempt to automatically connect to the FoosScore AutoScore system when FoosOBSPlus if first started. The Server Address and Server Port fields should be populated for Auto Connect to work. If unchecked, you must manually connect using the Connect button.
When checked, details sent from the FoosScore AutoScore system can be seen in the Message window.
This button will connect to the FoosScore AutoScore system at the given Server Address and Server Port.
This button will disconnect the current active FoosScore AutoScore session.
This box shows communication and information for the FoosScore AutoScore system.
Click the Apply button to save any changes made.
This button will save the current settings in the AutoScore Settings window. New settings will not take affect until this button or the Apply button is pressed.
This button will close the AutoScore Settings window without permanently saving any changes. If you reopen the window, you may see your changes still there, but they will not be permanently stored until the Apply button or the Apply and Close button is pressed.
This button will restore the AutoScore Settings defaults. The Apply button or the Apply and Close button must be pressed to make these changes permanent.
This window is where you can edit the FoosScore AutoScore configuration. Typically you would press the Read Configuration to see the current configuration. Then make any changes desired. THen press the Validate Configuration button to verify changes are acceptable. Then press Write Configuration to send the changes to the FoosScore AutoScore system (Raspberry Pico). Lastly, press Reset Pico for the changes to take affect. You will have to reconnect after the Pico resets.
These are the following parameters that can be changed:
PORT: This is the port that the FoosScore AutoScore system will communicate on.
SENSOR1: This is the Pico GPIO Pin number for sensor 1. Note, this should only be changed if the sensor is physically moved to another pin.
SENSOR2: This is the Pico GPIO Pin number for sensor 2. Note, this should only be changed if the sensor is physically moved to another pin.
SENSOR3: This is the Pico GPIO Pin number for sensor 3. Note, this should only be changed if the sensor is physically moved to another pin.
LED1: This is the Pico GPIO Pin number for LED 1. Note, this should only be changed if the LED is physically moved to another pin.
LED2: This is the Pico GPIO Pin number for LED 2. Note, this should only be changed if the LED is physically moved to another pin.
DELAY_TIME: This is the amount of time in milliseconds that the FoosScore AutoScore will ignore the sensors after a sensor has been triggered. If this time is too short, the ball could bounce around and hit the sensors again causing an extra point to be sent. If this time is too long, then two quick points back to back may only count once. 5000 milliseconds (5 seconds) has served us well so far.
This button retrieves the current FoosScore AutoScore configuration from the Raspberry Pico device and displays it in the AutoScore Configuration window.
This button will clear the AutoScore Configuration window.
This button will check each line of the configuration in the AutoScore Configuration window. Any errors will be reported and will prevent you from saving the bad configuration.
This button will first validate the configuration. If validated successfully, then it will send the configuration data to the FoosScore AutoScore system. The new configuration will take affect the next time the FoosScore AutoScore system is restarted. (This can be done by the Reset Pico button or by turning the Pico off and back on again.)
This will cause the FoosScore AutoScore system to restart allowing any configuration changes to take affect.
When checked, the main FoosOBSPlus program window will stay on top of other programs.
When checked, the main timer window is displayed. This is a window that can be used in OBS to display the time of the current timer running (shot, pass, time out, game, recall). In OBS create a Window Capture source and set Window to "[javaw.exe]:FoosOBSPlus Timer Window", Capture Method to Automatic and WIndow Match Priority to "Window title must match".
When checked, the Team 1 Last Scored Timer Window will display. This shows how long it has been since Team 1 has scored. To show in OBS, create a Window Capture source and set Window to "[javaw.exe]:FoosOBSPlus Team 1 Last Scored Timer Window", Capture Method to Automatic and WIndow Match Priority to "Window title must match".w
When checked, the Team 2 Last Scored Timer Window will display. This shows how long it has been since Team 2 has scored. To show in OBS, create a Window Capture source and set Window to "[javaw.exe]:FoosOBSPlus Team 2 Last Scored Timer Window", Capture Method to Automatic and Window Match Priority to "Window title must match".
When checked, the Team 3 Last Scored Timer Window will display. This shows how long it has been since Team 3 has scored. To show in OBS, create a Window Capture source and set Window to "[javaw.exe]:FoosOBSPlus Team 3 Last Scored Timer Window", Capture Method to Automatic and Window Match Priority to "Window title must match".
When checked, the Game Table Window will display. This shows the games for the current match being played. To show in OBS, create a Window Capture source and set Window to "[javaw.exe]:FoosOBSPlus Game Table Window", Capture Method to Automatic and Window Match Priority to "Window title must match".
When checked, the Game Results Window will display showing all the game results since the program started. The contents of the Game Results window are pushed to a Text (GDI+) source designated in Source Settings under Game Results.
Each game result has a check box before it that will control whether that line will be pushed or not. The Clear button will uncheck all the games and will clear the source in OBS. The Update button will send any checked games to OBS.
When checked, all the above windows will display. Unchecking the box will close all the above windows.
Clicking this entry will take you to the FoosOBSPlus Github page containing this README.md file.
When checked, more detailed data is shown in some cases. This is mainly for debugging and since logging has been added, this may go away in the future.
Shows details about the current version of the program.
The FoosOBSPlus Main Screen is divided into 11 panels. Each panel has its own controls and purpose. Below is a description of each panel.
This panel contains information pertaining to the particular tournament being played. Tournament name, event name and table name can be displayed.
This field will be sent to the source specified in the Tournament field in Sources Settings. Use this to display the name of the tournament or maybe the host venue's name.
This field will be sent to the source specified in the Event field in Sources Settings. Use this to display the event currently being played (i.e. DYP, Singles, etc.).
This field will be sent to the source specified in the Table Name field in Sources Settings. Use this to display the table name (or number) that is currently being streamed.
This button will clear all the fields in the Table Information panel.
This panel provides a way to manage a match and shows a game table grid of the current match being played.
This button drops a Start Event marker in the streamindex.txt file if Start Stream is activated. It will also reset the Game Results variable used to send the Game Results to OBS Studio through the Game Results source.
This button will reset all scores, game counts, time outs, reset/warns and times. It also records the current time as the Start Time and will drop a Start Match marker in the streamindex.txt file if Start Stream is activated.
This button will pause the match time shown in the Elapsed Time field as well as the Game Time and Last Score Timers. Once pressed, it will change to Unpause Match and pressing again will resume the timers. This could be useful if something interrupts the event. But frankly, I have never used it.
This button stops the match, game, and last score timers. It will also drop an End Match marker in the streamindex.txt file if Start Stream is activated.
This button will reset the Game Time and will unpause the Elapsed Time if the Pause Match button was pressed. It will also drop a Start Game marker in the streamindex.txt file if Start Stream is activated. It does not reset the last scored timers which could be a bug or a feature.
This displays the time when the Start Match button was pressed.
This displays the running time for the current match. It starts when the Start Match button is pressed and can be paused by the Pause Match button. The End Match button will stop the elapsed time as well. It will also automatically stop when the program detects that a match has been won by one team or the other.
This display the running time of the current game. The Pause Match button will pause/unpause the Game Time. Reaching the points for winning a game will restart the game timer for the next game. If the last game of the match is over, then the game timer will stop and have to be restarted by the Start Match or Start Game buttons.
The Game Table shows the scores and time elapsed for each game. Game winning score is highlighted in blue and match winning team is highlighted in Green. The current game number is highlighted in gray. The game table will only display up to 11 games and anything over 5 games won't look pretty.
These panels manage the information specific to Team 1, Team 2 and Team 3 for the current match.
This field will be sent to the source specified in the Team 1 Name field in Sources Settings. Use this to display the team name for Team 1.
This field will be sent to the source specified in the Team 1 Forward Name field in Sources Settings. Use this to display the name of the forward for Team 1.
This field will be sent to the source specified in the Team 1 Goalie Name field in Sources Settings. Use this to display the name of the goalie for Team 1.
The Switch Positions button will swap the Forward's and Goalie's names. Use this when Team 1 switches positions.
This field is an editable field that will allow you to change the score for Team 1. The score is sent to the source specified in the Team 1 Score field in Sources Settings.
This button will decrement Team 1's score by 1. It can be assigned a hot key in Hot Keys Settings.
This button will increment Team 1's score by 1. It can be assigned a hot key in Hot Keys Settings.
This field is an editable field that will allow you to change the game count for Team 1. The game count is sent to the source specified in the Team 1 Game Count field in Sources Settings.
This button will decrement Team 1's game count by 1. It can be assigned a hot key in Hot Keys Settings.
This button will increment Team 1's game count by 1. It can be assigned a hot key in Hot Keys Settings.
This field is an editable field that will allow you to change the match count for Team 1. The match count is sent to the source specified in the Team 1 Match Count field in Sources Settings.
This button will decrement Team 1's match count by 1. It can be assigned a hot key in Hot Keys Settings.
This button will increment Team 1's match count by 1. It can be assigned a hot key in Hot Keys Settings.
This field is an editable field that will allow you to change the time outs for Team 1. The time out count is sent to the source specified in the Team 1 Time Out field in Sources Settings. This field can behave in two different ways depending on whether the Show Time Outs Used checkbox is checked or not in Parameters Settings. If checked, then the number in the Time Out Count field shows the number of time outs used. Otherwise, it shows the number of time outs remaining.
This button will return a time out to Team 1. This will either increment or decrement the Time Out Count depending on how the Show Time Outs Used checkbox in Parameters Settings is set. It can be assigned a hot key in Hot Keys Settings.
This button will charge a time out to Team 1. This will either increment or decrement the Time Out Count depending on how the Show Time Outs Used checkbox in Parameters Settings is set. It can be assigned a hot key in Hot Keys Settings.
This button will send the word RESET to the source specified in the Team 1 Reset field in Sources Settings. It is a toggle button so when pressed once, it displays RESET. When pressed again, it clears the text. A hot key can be assigned to this button in Hot Keys Settings.
This button will send the word WARNING to the source specified in the Team 1 Warn field in Sources Settings. It is a toggle button so when pressed once, it displays WARNING. When pressed again, it clears the text. A hot key can be assigned to this button in Hot Keys Settings.
This is the time elapsed since Team 1 scored a goal. It is reset by the Start Match button or when Team 1 scores a point.
This checkbox is used to flag the team as currently being in the King Seat (top of the winners bracket). When checked, a crown (♔) will be displayed. Since only 1 team can be designated as in the King Seat, the other teams' King Seat checkboxes will be cleared. Clearing the checkbox will clear the text.
This panel is identical to Team 1 Information panel but is for tracking Team 2's information.
This panel is identical to Team 1 Information panel but is for tracking Team 3's information.
The Timer Panel gives the ability to start and reset various timers. Only one time is active at a time
The first line in the Timer Window displays which timer is currently active. This will be one of the following:
Timer Reset - shows when no timer is currently active.
Shot Timer
Pass Timer
Time Out Timer
Game Timer
Recall Timer
This button starts the Shot Timer. The amount of time allowed for a shot is defined in the Shot Time field in Parameters Settings. A hot key can be assigned to this button in Hot Keys Settings.
This button starts the Pass Timer. The amount of time allowed for a pass is defined in the Pass Time field in Parameters Settings. A hot key can be assigned to this button in Hot Keys Settings.
This button starts the Time Out Timer. The amount of time allowed for a time out is defined in the Time Out Time field in Parameters Settings. A hot key can be assigned to this button in Hot Keys Settings.
This button starts the Game Timer. The amount of time allowed between games is defined in the Game Time field in Parameters Settings. A hot key can be assigned to this button in Hot Keys Settings.
This button starts the Recall Timer. The amount of time allowed for a recall is defined in the Recall Time field in Parameters Settings. A hot key can be assigned to this button in Hot Keys Settings.
This button will reset the timer. This is useful when the ball jumps off the table. A hot key can be assigned to this button in Hot Keys Settings.
The OBS Panel provides some controls to manage OBS. OBS must be configured in the Connect item in the OBS menu for any of the OBS Panel buttons to work.
This button will connect FoosOBSPlus to OBS. Once connected, data will automatically be sent to OBS when changed in FoosOBSPlus.
This button will send the current data in FoosOBSPlus to OBS. This can be useful if you have to restart OBS and reconnect.
This checkbox will send a command to OBS to show or hide the source identified in the Show Scores field in Sources Settings depending on if the box is checked (show) or not (hide). It is useful to hide the scores in OBS when no one is keeping score and to show them again when someone is available or AutoScore is working.
This checkbox will send a command to OBS to show or hide the source identified in the Show Timer field in Sources Settings depending on if the box is checked (show) or not (hide). It is useful to hide the timer window in OBS when no one is available to run the timers.
This button will disconnect OBS.
This button will read the data in OBS and show it in FoosOBSPlus.
This checkbox will enable activating the Skunk filters identified in Team 1 Skunks and Team 2 Skunks in Filters Settings. The Skunk filters will only be activated when the Enable Skunk checkbox is checked.
This button will start a stream timer and create a file called streamindex.txt. Markers can be dropped in this file to show the time stamps when certain events happen. This can be useful for indexing the stream videos. Once the Start Stream Timer button is pressed, it will toggle to Stop Stream Timer button. This will then stop the stream timer. The next press will reset the time and start it again.
The time to the right of the Start Stream Timer/Stop Stream Timer button shows the running stream time when the Start Stream Timer button has been pressed.
The AutoScore Panel controls the interaction with the AutoScore system. This is a home grown system using lasers and a Raspberry Pico to detect when the ball is scored in one goal or the other. When a score is detected, it sends data to FoosOBSPlus to increment the scoring team's score by one point.
This button will connect to the AutoScore system. The AutoScore system must already be configured in the AutoScore Settings for the connection to work.
This button will bring up the AutoScore Settings window where the Server Address and Port can be configured.
This button will disconnect from the AutoScore system.
Check this box if there is a need to temporarily ignore the input from the AutoScore system. Uncheck it to resume letting the AutoScore system update the scores.
The Switch Panel is used to swap the information between Team 1 and Team 2.
The Switch Sides button is used when the teams switch sides. The team names, player names, scores, time outs, game counts, match counts, reset/warns, king seat and last scored times will all be swapped. A hot key can be assigned to this button in Hot Keys Settings.
This button will swap the Team Name, Forward Name and Goalie Name of Team 1 and Team 2. A hot key can be assigned to this button in Hot Keys Settings.
This button will only swap Forward Names of Team 1 with Team 2. A hot key can be assigned to this button in Hot Keys Settings.
This button will only swap Goalie Names of Team 1 with Team 2. A hot key can be assigned to this button in Hot Keys Settings.
This button will swap the scores of Team 1 with Team 2. A hot key can be assigned to this button in Hot Keys Settings.
This button will swap the game counts of Team 1 with Team 2. A hot key can be assigned to this button in Hot Keys Settings.
This button will swap the match counts of Team 1 with Team 2. A hot key can be assigned to this button in Hot Keys Settings.
This button will swap the Time Out Counts of Team 1 with Team 2. A hot key can be assigned to this button in Hot Keys Settings.
This button will swap the Reset and Warn states of Team 1 with Team 2. A hot key can be assigned to this button in Hot Keys Settings.
This button will clear all of Team 1 and Team 2's information.
This is a display only field that shows which team scored last. An arrow will point to which team scored last. If no arrow, then no team has scored yet.
The Reset Panel is useful for reseting information in the Team 1 and Team 2 Information panels.
This button will reset the Team Name, Forward Name and Goalie Name for all teams. A hot key can be assigned to this button in Hot Keys Settings.
This button will set the Scores for all teams to 0. A hot key can be assigned to this button in Hot Keys Settings.
This button will set the Game Counts for all teams to 0. A hot key can be assigned to this button in Hot Keys Settings.
This button will set the Match Counts for all teams to 0. A hot key can be assigned to this button in Hot Keys Settings.
This button will reset the Time Out Counts for all teams. A hot key can be assigned to this button in Hot Keys Settings.
This button will clear the Reset and Warn buttons for all teams. A hot key can be assigned to this button in Hot Keys Settings.
This button will clear the Scores, Game Counts, Match Counts, Time Out Counts, Resets and Warns and King Seat for all teams. Note that the Name fields are not reset. A hot key can be assigned to this button in Hot Keys Settings.
The Statistics Entry Panel is intended to be used for entering codes to track statistics during the foosball match.
Enter codes here. Most of the buttons on FoosOBSPlus main screen have codes that can be entered that act the same as pressing the button itself. These are actually commands and are preceeded with an X. Other codes can be entered to track the ball in the foosball match. These codes are then converted into stats that will be shown in the Statistics Display Panel. The commands and codes are explained in the Codes and Commands section.
All commands and codes entered are shown in the History area. The last command/code entered is shown at the top of the box. Clicking inside the History box and pressing Control-A followed by Control-C will allow you to copy all the current commands in the History area. It will not show highlighted, but it will copy them to the clipboard.
This button will clear the History area.
This button will undo the last command or code entered.
This button will redo the last command or code that was undone.
The Statistics Display Panel displays any statistics generated for the current match. The Team Names (if any) are shown at the top of the panel. Followed by the Forward and Goalie names for Teams 1 and 2. Statistics for team 1 are shown on the left and statistics for team 2 are shown on the right. A description of each statistic is in the middle. Double clicking with the left mouse button anywhere in the Statistics Display Panel will copy the current statistics to the clipboard.
For Passing, Shooting, Clearing and 2-Bar Passing, there are 6 numbers. 3 for each team. The 3 numbers on the left are for team 1 and the 3 numbers on right are for team 2. On the left the order is success, attempts, percentage. On the right, the order is percentage, success, attempts.
The first value is the number of successful passes (5 man to 3 man). The second number is the number of pass attempts. The third number is the pass success percentage.
The first value is the number of successful shots. The second number is the number of shot attempts. The third number is the shot success percentage.
The first value is the number of successful clears. The second number is the number of clear attempts. The third number is the clearing success percentage.
The first value is the number of successful passes (2 man to 3 man). The second number is the number of pass attempts. The third number is the pass success percentage.
This is the number of shots on goalie from the goalie position.
This is the total number of scores.
This is the number of scores made from the 3 bar.
This is the number of scores made from the 5 bar.
This is the number of scores made from the goalie position.
This is the number of breaks.
This is the number of stuffs.
This is the number of aces.
The following code scheme will allow you to record every possession in a game by just learning what each position in the code designates and learning only a handful of codes. Using these codes, the score and timers can be automatically maintained throughout the match. Each position in the code has from 2 to 10 possible mostly intuitive values. Below is the breakdown of the code.
1st position - team: which team has the ball.
y - yellow team
b - black team
x - command trigger (see below for list of commands)
2nd position - rod: where is the ball:
2 - 2 bar or 3 bar goalie rod. These rods are treated as one rod.
3 - 3 bar forward rod.
5 - 5 bar forward rod.
g - goal (someone scored)
o - off table
d - dead ball
3rd position - action: how did the ball get here:
a - ace (used when either 5 bar shot in goal from serve, or passed to the 3 from serve and shot from the 3 without any opponent intervention and without missing both the pass and the shot)
c - clear (from goalie 2 or 3 rod to past the same team's 5 row)
p - pass
s - shot
d - drop (serving ball after a score or being knocked off the table or after time out called)
t - time out
r - reset
w - reset warning
x - penalty (see 4th position for penalty modifiers)
y - ball placement after a technical foul shot has been taken
e - error (turnover)
4th position - detail: provides more detail for the action if needed.
b - break - used with pass or shot to designate that the attempt was successful, but only because of a lucky break
f - stuff - used with shot or pass to indicate shot/pass was stuffed into shooters/passers goal (y3p, ygsf)
w - 3 walls 5 bar violation - used with 3rd position set to x
s - spin violation - used with 3rd position set to x
j - jarring violation - used with 3rd position set to x
d - distraction - used with 3rd position set to x
t - too many time outs - used with 3rd position set to x
p - illegal pass - used with 3rd position set to x
x - technical foul - used with 3rd position set to x
r - ready protocol violation - used with 3rd position set to x
o - other violation - future rules or ones just overlooked - used with 3rd position set to
y5d - ball is on the 5 bar of the yellow team who "has the drop" either due to winning the coin toss, ball off the table, or oppenent scored. y5d or b5d will always be how a new point, game, and match start out. y3p - ball is passed to the 3 bar bgs - ball shot into black team's goal (score y=1, b=0) b5d - now black team has ball on the 5 from the drop. y5xw - ball on yellow 5 man because black team hit 3 walls on their 5 bar possession. y3p - ball successfully passed from 5 bar to 3 bar. y2s - ball was shot, but missed and landed on yellow 2 bar. y5p - ball passed to yellow 5 bar successfully. ygp - yellow tried to pass to 3 but was blocked into their own goal (score y=1, b=1) y5d - yellow has ball on 5 bar after black scored. y5t - yellow called time out, ball still on the 5 bar y5d - yellow starts play again from 5 bar y3p - pass to 3 bar successful y3r - black blocking agressively and reset is called bgs - ball shot into black goal (score y=2, b=1)
- xu - push undo button
- xr - push redo button
- xpsm - push Start Match button
- xppm - push Pause Match button
- xpsg - push Start Game button
- xsst - start shot timer
- xspt - start pass timer
- xsgt - start game timer
- xstt - start timeout timer
- xsrt - start recall timer
- xprt - push reset timer
- xist1 - increase score team 1
- xist2 - increase score team 2
- xist32 - increase score team 3
- xdst1 - decrease score team 1
- xdst2 - decrease score team 2
- xdst3 - decrease score team 3
- xigt1 - increase game count team 1
- xigt2 - increase game count team 2
- xigt3 - increase game count team 3
- xdgt1 - decrease game count team 1
- xdgt2 - decrease game count team 2
- xdgt3 - decrease game count team 3
- ximt1 - increase match count team 1
- ximt2 - increase match count team 2
- ximt3 - increase match count team 3
- xdmt1 - decrease match count team 1
- xdmt2 - decrease match count team 2
- xdmt3 - decrease match count team 3
- xutt1 - use timeout for team 1
- xutt2 - use timeout for team 2
- xutt3 - use timeout for team 3
- xrtt1 - return timeout for team 1
- xrtt2 - return timeout for team 2
- xrtt3 - return timeout for team 3
- xprt1 - push reset button for team 1
- xprt2 - push reset button for team 2
- xprt3 - push reset button for team 3
- xpwt1 - push warn button for team 1
- xpwt2 - push warn button for team 2
- xpwt3 - push warn button for team 3
- xxpt1 - switch positions team 1
- xxpt2 - switch positions team 2
- xxpt3 - switch positions team 3
- xpss - push switch sides button
- xpst - switch teams
- xxp1 - switch player 1 (forward)
- xxp2 - switch player 2 (goalie)
- xpssc - switch scores
- xpsgc - switch game counts
- xpsto - switch time outs
- xpsr - switch reset/warns
- xpca - clear all (switch)
- xprn - push reset names
- xprs - push reset scores
- xprg - push reset game counts
- xprto - push reset time outs
- xprr - push reset reset/warns
- xpra - push reset all
- xpso - push sync obs button
- xpnb - push 9 ball button
- xpsa - push show all button
- xpha - push hide all button
- xptca - push tournament clear all button
- xpkt1 - push king seat team 1
- xpkt2 - push king seat team 2
- xpkt3 - push king seat team 3
As you can see by the revision history below, I have spent many hours working on this software. It has grown from a simple score keeper application to a fairly sophisticated application able to interface with an Auto Scoring system and OBS Streaming software. I have licensed the software so it is free to use and modify as you see fit. The source code is freely available. However, if you find the software helpful in any way and would like to buy me a refreshing beverage or a foosball, please feel free to make a donation here:
v2.056 03/09/2024
Update team game sources when pulling/pushing OBS from OBS Panel.
v2.055 03/03/2024
Refactor per netbeans suggetions Main classes - phase 4 of 4.
v2.054 03/03/2024
Refactor per netbeans suggestions Model classes - phase 3.
v2.053 03/03/2024
Refactor per netbeans suggestions Command & Controller classes - phase 2.
v2.052 03/03/2024
Refactor per netbeans suggestions View classes - phase 1.5.
v2.051 03/02/2024
Refactor per netbeans suggestions - phase 1.
v2.050 02/18/2024
Removed gameType option from Messages getString method and all the calls to it.
Went through and updated all the View classes with Externalized Strings.
Removed unnecessary whitespace from controller classes.
v2.049 02/17/2024
Add AutoScoreSettingsPanel strings to message.properties.
Increase size of Message box in OBSConnectPanel.
Refactor OBSConnectPanel.
Add Scene combo box, Apply and Close button, Cancel button and Restore Defaults button.
Change SetScene to SetMainScene. Button now pulls scene selected from the Scene combo box and puts it in Main Scene text box.
Added Activate Scene button that will activate scene from scene Combo box.
Update ReadMe.md file.
v2.048 02/14/2024
Add MonitorComboBox logic.
Add Fetch Monitors and Project buttons and implement.
v2.047 02/13/2024
Add OBSConnectPanel strings to message.properties.
Rough in Monitor Combo Box in OBSConnectPanel.
v2.046 02/04/2024
Add cutthroat output for Game Results Window.
Refactor Stats class.
Show game start time and duration in Game Results Window.
v2.045 02/04/2024
Add JavaDoc to Command classes.
Make Main more Static and stop passing Main where can be used statically.
Refactor FoosOGBSPlusApp.
Increase match count in cutthroat mode when match won.
v2.044 01/27/2024
Add Apply button and fix Apply and Close button in AutoScoreSettings window.
Add Game Results Window and allow control over displaying each line.
v2.043 01/16/2024
Add link to ITSF Rules in Help menu.
Change Save buttons to Apply and Close globally.
Add Apply button to Parameters, HotKey, Source, Stats Source, Filters & Partner Program Panels.
Cancel button now returns settings displayed to last saved stated.
Fix bugs in HotKeyPanel resulting from typos in refactoring.
Fix bug where Enable Skunk and StartStream hotkeys would not register change until program restarted.
Fix HotKeyPanel path bug.
Add Available HotKeys field to HotKeysPanel.
v2.042 01/14/2024
More Settings refactoring.
v2.041 01/13/2024
Add Meatball Filter to enable filter when match is tied and next point wins.
Refactor getDefaultFilters in Settings.
v2.040 01/07/2024
Modify Copyright to include the fancy copyright symbol ©.
Make default properties final in Settings.
Handle IOException in Settings.
Added LICENSE.txt file on previous commit (but after v2.039 commit).
v2.039 01/07/2024
Inserted and then commented out code to getSceneItemList and getGroupSceneItemList in the main OnReady method.
Add donation section to README.md and make proper hyperlinks for the HTTPS references.
Allow sources to contain scenename,sourcename to override currently set scene. This allows nested scenes to work for showSource() method.
Create a CurrentProgramSceneChanged event listener. Set OBS.currentScene.
Refactor checkItemEnableStageChange() in main to reduce duplicated code.
Use OBS.getCurrentScene instead of calling scene from OBS.
Made Settings class final static.
Refactored Settings methods to static.
Refactored OBS methods to static.
v2.038 01/01/2024
Add some logging to showSource and setSourceFilterVisiblity in main and writeData in OBSInterface.
v2.037 01/01/2024
Fix Reset All and Clear All buttons not clearing the new Team Game Show sources in OBS.
v2.036 12/29/2023
Check for null when reading from auto score in Main createAutoScoreWorker().
Resize AutoScoreConfigFrame and improve AutoScoreConfigPanel layout.
v2.035 12/29/2023
Add Team X Game X Show sources and make source visible when team X Game X is won. This allows showing an image for each game won instead of just displaying a number.
More Logger refactoring.
v2.034 12/28/2023
Added Labels to Statistics Display Panel.
Default Team Names to Team 1,2,3.
Reset Teams resets Team Names back to default.
v2.033 12/28/2023
Refactor Frame classes and remove unnecessary LookAndFeel logic.
Add backup LookAndFeel in Main if Nimbus not loaded.
Add AppConfig class.
v2.032 12/27/2023
Check for null state to prevent null pointer exception in AutoScoreWorkerStateChangeListener in Main.
Refactor OBSInterface, StreamIndexer, CodeCommand, Memento.
Refactor Command classes to use final.
v2.031 12/26/2023
Enhance Team Forward/Goalie names logic to only show slash if both names present in statistics display panel and in game table window.
v2.030 12/26/2023
Removed unneeded variable declaration in getString(String, String) method in Messages.
Improve Game Table Window sizing.
Refactor setFocusOnCode() in Main and other minor refactors in Main.
Double clicking anywhere in the Statistics Display Panel will now copy all the stats to the clipboard.
v2.029 12/26/2023
Correct typo in README.md.
Add king seat indicators to Game Windows.
Pull king seat indicator from message.properties.
v2.028 12/24/2023
Reduce redundant code.
Update teamPanel3 Mnemonics when hotkeys saved.
Add more calls to statsEntryPanel.setFocusOnCode for better code entry/hot key usage.
Add ability to copy with double click a single item or control A/control C for entire list from the History stats box. Still doesn't show as selected though.
Remove weight for labels in Tournament Information Panel to let text boxes get more room.
Bold column headers in statsSourcesPanel and filtersPanel.
Update images for README file.
Update documentation in README file.
v2.027 12/24/2023
Reduce code in Match.
v2.026 12/24/2023
Refactor WindowListeners to WindowAdapter to reduce code in MainController and Main.
Delete Game class.
Add End Match Hot Key logic.
Move match.getMatchWon() check so it applies to cutthroat and regular modes.
Add gameResults source and supporting logic.
v2.025 12/23/2023
Rearranged some methods in TeamController and MatchController.
Remove Statistics settings screen.
v2.024 12/17/2023
Refactor Team to reduce code duplication in set methods.
Fix bug with MatchCount logic not updating when directly changed in text box.
Add property change listeners to Team for score, gamecount, matchcount, timeoutcount.
Refactor TeamController to use TeamsMap and TeamPanelsMap instead of teams[], teampanels[].
v2.023 12/15/2023
Work on match count logic.
Added missing Team 3 to stream log for cutthroat mode.
v2.022 12/14/2023
Add Match Count to Team Panel.
Add Match Count to Hot Keys and Sources.
Remove obsolete forward/goalie scores methods.
v2.021 12/14/2023
Rework HotKeys Panel for Team 3.
v2.020 12/12/2023
Update copyright to 2024.
Add King Seat logic.
Removed Show Scores from OBS Menu Bar.
Fix Cutthroat Streaming Log.
v2.019 12/08/2023
Play with panel sizes.
Limit stats to team 1 and 2 only.
v2.018 12/08/2023
Implement Show Cutthroat checkbox logic.
Change Show Score, Enable Skunk, Show Timer to check boxes and rearrange order.
v2.017 12/06/2023
More refactoring of source/statssource variables/methods.
Fix stats source and source reset default bugs.
Start on adding Show Cutthroat in OBS Panel.
v2.016 12/05/2023
Add stats source window.
Add Show Cutthroat source.
Resize Sources window.
v2.015 12/05/2023
Fix team 2 hotkeys being assigned to team 3.
Refactor team hotkeys methods to paramaterize team number.
v2.014 12/04/2023
Separate stat sources from other sources.
Redesign Sources Panel.
v2.013 12/03/2023
Add team3 info to sources in settings.
Fix tournament source that was incorrectly defaulting to tablename.
v2.012 12/03/2023
Remove display hack for cutthroat.
Refactor cutthroat rotate logic.
Refactor team commands to pass team number.
v2.011 11/27/2023
Add 3rd Team object and show in MainFrame.
Add supporting Commands for 3rd Team.
Simplify config Property setters in Settings.
Add getMaxGameNumber method to Settings.
Refactored a lot of "Team 1" if statements to allow for a "Team 3" and reduce code.
Update a lot of copyright dates.
Probably some other stuff I forgot I did. Did way too much in this release.
v2.010 10/29/2023
Initialize Tournament, Event and set cursor in Code input on start up.
v2.009 09/19/2023
Add test buttons to Filter settings screen.
v2.008 08/13/2023
Start new match if match won is set and file watch worker sees a new name.
v2.007 06/30/2023
Clear button in Tournament panel now clears related fields in OBS.
v2.006 04/05/2023
Add more INFO logging for AutoScore disconnects.
Add auto reconnect AutoScore logic.
v2.005 03/12/2023
Allow timeouts to exceed limits.
v2.004 03/04/2023
Fix TimeOut filter not being called from Auto FoosScore
Rework checkFilters so it is called from processCode
v2.003 02/04/2023
Allow Score, Game/Match, Skunk filters to be shown simultaneously.
Auto switch team 2 players after game won in cutthroat.
v2.002 02/04/2023
Add logic to handle Time Out commands from Auto Score.
Update the Auto Score configuration validation for new settings.
v2.001 01/22/2023
Don't send empty/null source to OBS.
Correct GameClock log class.
Correct GameTime,MatchTime,StreamTime sources in Settings.
v2.000 01/01/2023
Caution: Must use AutoScore v2.0 or above starting with this version of FoosOBSPlus.
Send config to AutoScore when Send Config button pressed.
Rework AutoScore interface and AutoScore Config screen.
Send/Receive AutoScore config.
Validate AutoScore config.
Set connect false when auto score connection drops from auto score end.
v1.121 12/28/2022
Remove Team Clear buttons.
Fix bug in MaxPossibleGamesToWin when Games To Win changes.
Refactor SettingsSaveListener to ParametersSaveListener.
v1.120 12/27/2022
Update README.md.
Make Reset Scores button update game table properly.
v1.119 12/24/2022
Put log4j2.properties in src folder and set path to ./ so logs are created in same directory as program runs.
Fix HotKeysBaseScript default script in messages.properties.
v1.118 12/23/2022
Add logging using log4j2 and rollingfile appender.
Update copyright on all files.
v1.117 12/18/2022
Timers now use System.currentTimeMillis() for better accuracy.
Add Stream Time source to Sources.
v1.116 12/17/2022
Use System user.dir property to get current path of program and use that in the autohotkey scripts.
Force autohotkey script path to end in .
Check directories exist before created autohotkey scripts.
Remove Select Path from Filters Panel.
v1.115 12/13/2022
Drop Load and Set buttons in Tournament Panel.
Rename TableController and Table classes to TournamentController and Tournament respectively.
Remove table name and file path logic from OBSInterface.
v1.114 12/13/2022
Make Start Stream button toggle with Stop Stream and show Stream Timer.
Update documentation.
v1.113 12/10/2022
Make base hotkey script a parameter instead of file.
Change TablePanel to TournamentPanel.
Add HotKey Script Path to HotKeys settings.
v1.112 12/09/2022
Fix Rack Mode scoring logic bug when winning points were less than required amount for non Rack Mode.
Update ReadME.md file with more documentation.
v1.111 12/04/2022
Add Balls In Rack and Rack Mode to Parameters.
Add Rack Mode scoring logic.
Update README.md.
Setup the base Statistics Parameters window.
v1.109 11/27/2022
Change Show Skunk in OBS Panel to Enable Skunk.
Sync OBS Panel Enable Skunk with Parameters Enable Skunk.
Remove Skunk Filter from OBS Connect panel and Settings.
Show Score & Show Timer now toggle button text.
Query OBS for state of Timer Source when connected and
update Show Timer button on OBS Panel.
Closing Timer Window will deactive Timer Source in OBS.
v1.108 11/25/2022
Add ability to set filters for a variety of events (score, game/match win, time out, etc)
Add game count for cutthroat mode
v1.107 11/25/2022
Always rebuild OBS Controller prior to connecting
Add auto capitalize names logic
v1.106
Remove more filename support.
Add error checking for obs connection parameters and auto login on start.
v1.105 11/18/2022
Remove support for using filenames with OBS
v1.104 11/18/2022
Remove Billiards
v1.103 11/15/2022
Convert to obs-websockets-java v2.0.0
Cleanup some java warnings
v1.102 11/04/2022
Check for duplicate hot keys and warn
Add Generate AutoHotKey Scripts button and logic
v1.101 11/02/2022
Add hotkey for Start Stream button.
Change default hotkeys.
v1.100 10/24/2022
Add Start Event Button and tweak some panel layouts.
v1.099 10/23/2022
Add Partner Program Settings screen.
v1.098 10/11/2022
Split Start Match button into Start Match and End Match buttons.
Add Start Stream button to start a stream timer.
Make Start Match/Game buttons write stream time and players to file.
Write players and scores to file when game/match is won.
v1.097 09/24/2022
Fix bug in file whatcher logic when less than 4 players
v1.096 09/20/2022
Autoscore now receives Pin number in addition to Team number for easier debugging.
v1.095 09/03/2022
Hack in CutThroat Mode scoring
v1.094 08/30/2022
Switch Positions, Forwards, Goalies, Teams will reset scores/timeouts/resetwarns if match has been won
v1.093 08/28/2022
Add ShowSkunk setting
Add ShowSkunk button
Parameterize Scene, Score, Timer sources and Skunk filter
Add CutThroat Mode to rotate player names
v1.092 08/27/2022
Add Skunk detection and action.
v1.091 08/21/2022
Forward/Goalie/Team name change will reset scores/timeouts/resetwarns if match has been won
v1.090 08/20/2022
Change auto scoring debug messages slightly
Fix Increase Game Count buttons not working
Reset scores on game wins but not match win
Pass/Shot Start Timer buttons will reset scores/timeouts/resetwarns if match has been won
Only show AutoScore green connection icon if we actually get connected.
v1.089 07/04/2022
Add ignore sensors button.
Fix timer bug.
v1.088 07/02/2022
Scan folder for player name changes
Keep score at end of each game and match until next point is scored.
Known issue: timer bug - timer does not move to next game when it should.
v1.087 06/27/2022
Add Auto Score Config window
Add AutoConnect, DetailLog to AutoScore Settings
v1.086 06/24/2022
Get cancel autoscore working
Refocus after score shows timer window
Add release date to about
Add autoscoremainpanel
Automatically reset and start match on point after match has been won
v1.085 06/19/2022
Fix load autoscore properties on startup
Save valid data in autoscore.properties
v1.084 06/19/2022
Add AutoScore window
Add auto score logic to update scores when score server sends team scored
v1.083 06/05/2022
Add OBSPanel and buttons
v1.082 05/22/2022
Fix LastScored display bug
v1.081 05/22/2022
Fix connect error when obs not running
Fix nullpointerexception if OBS not running and autoconnect on
Fix README some more
Fix bug in currentModifier where it was not getting reset once set
Bump gson to version 2.8.9 for security vulnerability remediation
Change clear definition to from 2 bar to past same team's 5 bar.
v1.080 05/17/2022
Add Aces to stats
Add table name to sources/filenames so it can be used in OBS.
Only save password if save password checked
Add option to Update on Connect (needs more work)
v1.079 09/10/2021
DeDupe LastScoredClock, LastScoredWindowPanel, LastScoredWindowFrame classes
v1.078 09/10/2021
Add display of WebSocket Version on OBS connect
Update Team data from OBS Screen data using WebSocket
v1.077 08/17/2021
Make start/reset timer commands/buttons show timer window.
v1.076 08/15/2021
Add OBSScene property
Add Set Scene button on OBS Connect Panel
Add custom tab traversal for Team panels
Split OBS parameters into own properties object/file
Always show Connect... menu item enabled
v1.075 08/01/2021
Remove FileName from the filename properties so they would be same as source properties.
Write data to file or web socket in Team, Table, Match models.
Removed more unnecessary configProp settings in save logic.
Stopped passing settings in method when settings already in class.
Fix handling for missing config files
v1.074 07/31/2021
Split config.properties into control.properties, filename.properties, hotkey.properties.
Add source.properties
Clean up writes in all the Model classes.
Remove all the unnecessary config variables and just use the properties maps.
v1.073 07/28/2021
Added setTextGDIPlus to obs-websocket-java v1.3. Supports source, text, readfromfile parameters.
Add ability for writeScores to use websocket or file.
v1.072 07/18/2021
Issue #18 Reset All, Reset Game Counts, Clear All buttons should reset currentGameNumber and repaint game tables.
v1.071 07/13/2021
Fix SwitchPlayer1Hotkey and SwitchPlayer2Hotkey so defaults will load if not found in config.properties
Fix errors in some OBS calls.
ShowParse now also shows some OBS Commands in the connect window.
v1.070 07/11/2021
Add Show Scores option to turn scores on/off in OBS
Clean up Main (remove code that was commented out)
Define obsSceneName and obsShowScoresSource
Add Switch Player1/Switch Player2 buttons
Add Close on Connect checkbox
v1.069
Switch out mainFrame when gameType changes
Auto hide connection window on successful connection
Append text to connect window text box instead of overwriting and add time stamp
Extract some code to methods in Main
v1.068 02/06/2021
Show Connected/Disconnect icon in menu bar
v1.067 02/02/2021
Add disconnect menu item
Only call obs commands when connected
Add CurrentScene to OBS model
v1.066 01/31/2021
Add Sync OBS, 9 Ball, Show All, Hide All buttons for Ball Panel.
Add associated XPSO, XPNB, XPSA, XPHA commands for above buttons respectively.
v1.065 01/29/2021
Add ball panel and logic to show/hide balls in obs
v1.064 01/28/2021
Build OBS Connect screen GUI
Implement OBS Connect functionality
Enable/Disable connect/disconnect based on OBS Connection
v1.063 01/22/2021
Add OBS Menu option with Connect sub item
Add OBSConnectFrame and OBSConnectPanel base classes
GameType prompt added in v1.062 release to switch external string context
v1.062 12/31/2020
Externalize Strings in LastScored1WindowFrame, LastScored2WindowFrame, ParametersFrame, ParametersPanel, TimerWindowFrame
Consolidate Error and Global strings
v1.061 12/31/2020
Externalize Strings in MainFrame, FileNamesFrame, FileNamesPanel, GameTableWindowFrame, HotKeysFrame, HotKeysPanel
v1.060 12/30/2020
Add Game Type
Externalize Strings in Table, Timer, Stats Entry, Stats Display, Match, Team, Switch, Reset, About panels
Set Max Win points to Points to Win if Points to Win exceeds Max Win points.
v1.059 12/26/2020
Add revision history to help page
Issue #17 Set help page to specifically start at #FoosOBSPlus
v1.058 12/26/2020
Issue #17 Change help to call foosOBSPlus repository page instead of foosOBS repository page
Update announce match winner on help page.
v1.057 12/26/2020
Issue #12 Changing Games To Win parameter should reload Match Panel and GameTableWindowPanel
Cap "Games to Win" at 6.
Fix bug if no names set and announce match winner triggered.
v1.056 12/25/2020
Issue #13 If gamecounts loaded from file are too high, program errors.
Issue #16 Add Win by Final Game Only parameter and logic
Issue #15 For showing Match Winner, show Team Name if populated, otherwise, show player names.
v1.055 12/24/2020
Issue #14 Add hotkeys for undo and redo buttons
v1.054 9/27/2020
Change colors game table panel and window
Allow closing of view windows and keep view menu selection checkmarks in sync
Open independent windows side by side instead of on top of each other.
v1.053 9/27/2020
Issue #11 Limit game table window to number of possible games based on parameters
Change highlight colors for match panel to see if new colors grow on me
v1.052 9/13/2020
Toggle start match button label between Start Match and End Match.
v1.051 9/13/2020
Added Import Stats and Export Stats options to the File Menu.
Implement isOffTable flag and add isDeadBall flag
v1.050 9/12/2020
Refactored SettingsFrame and SettingsPanel to ParametersFrame and ParametersPanel for naming consistency.
v1.050 9/9/2020
Use try with resources in settings and OBSInterface
Refactor to use java.nio.file in place of java.io.file
v1.049 9/7/2020
Add team name to Stats Display Window
Update stats display window when team name or player names change
v1.048 9/7/2020
Issue #9 Start Match needs to clear match winner & meatball
v1.047
Start game button should unpause match
Timer and Game Table windows no longer always on top
Increase/decrease game counts should update game table
Sync game table currentgamenumber with team game counts.
Main.autoProcessCodes created to parse codes in a string array.
MatchWon needs to Stop match and game timers
Game timer in game table window is briefly getting set to 0 when score increased.
Add ViewAllWindows checkbox menu item
v1.046
A shot that goes in own team's goal should increase shot attempts for that team and not change stats for other team except scoring
Add names to statsdisplaypanel
v1.045
Add fwd,goalie names to Game Table Window Panel
Update game tables when name or score related data changes
v1.044
Decrease score needs to update game table panel
Refactored team1/team2 to teams[] in teamController
Undo needs to repaint gametables
v1.043
Get Game Table Window displaying properly
Update Game Table times realtime
focus back to Code after any button pressed and when window activated
v1.042
Start on Game Table Window
Redo for Start Match bug - Run program. Press Start Match button. Push Undo then press redo. Throws exception.
Undo for Start Match bug - Run program. Incrase score team1. Press Start Match button. Push Undo. Push Undo again. Throws exception.
Add ShowParsed to menu bar
Fix bug in stats.parseCode
v1.041
Issue #1 Show Invalid stat code in red
Issue #4 Better Stat History Window (last command always shows)
v1.040
gametable now is told when games and match are won
Refactored team1Scored->teamScored[], team1TimeOut->teamTimeOut[]
Start Game button restarts game timer and advances current game number
Issue #8 Pause Match button ignores first press after Start Match Button bug
v1.039
Set alignment and background colors on game table
v1.038
Game Tracking 5-2,5-3,4-5,3-5,8-7
Add Start Game button
Add startGame to hotkeys screen
Add pauseMatch to hotkeys screen
v1.037
Issue #5 Switch Sides messes up clear buttons
Issue #6 Switch Panel clear all button needs to clear reset/warns
v1.036
Fix xpundo/xpredo - made it xu and xr.
v1.035
Issue #7 Pause button alternates between Pause/Unpaused Match
Animate Last Scored Timer Windows
Start Match now clears history but leaves itself there.
Switch Sides now switches last scored times
Add copyright message to Command objects
v1.034
Issue #7 Match Time Pause/Restart button (Partial. need to fix timers getting out of sync if score increased while paused)
v1.033
Issue #3 Increase Tournament, Event, Table Name field widths
v1.032
Issue #2 Handle start up without config file present
v1.03 & v1.031
Time since last score - each team:
a. Create Timers (Done)
b. Display times and start/reset on score (Done)
c. Write times to files - not wanting to do this - concerns of speed/io issues - but can let filename control whether writes or not (empty - do not write)
d. Add filesnames in files settings screen
e. Add window for each timer??? (Done)
Handle Invalid Stat command
Fix clear stats entry - will error if undo after clear
Write Time Remaining??? Could be used in place of the timer window but would be very slow. Leaning towards no on this one. (And yet I did it - but can blank out time remaining file name to prevent writing)
Closing the timer window needs to uncheck the menuitem TimerWindow or force do nothing on close which is the option I took.