version 3.0.1 - August 8, 2010
for Windows, Mac OS X, Linux, and anything else that'll work with Java
What is NSFS?
What's a scorinator?
What does "NSFS" stand for?
What's new in this edition?
What is NSFS?
In development and use since 2003, NSFS has been used to scorinate dozens upon dozens of NationStates sporting events in several sports, both international and domestic. It has been one of the most trusted scorinators in NationStates' longest continuously running competition series, the World Cup, having been used in various editions of that tournament for nearly six years.
Wait, what's a scorinator?
At its most basic level, a scorinator, given two or more competitors, generates the result of a simulated competition among those competitors.
What does the name "NSFS" stand for?
Officially nothing. Originally it stood for "NationStates Football Simulator", but this name is outdated and no longer used. It's still called NSFS, though, because brand recognition is still important.
I've been using NSFS2 for the last four years. What's new in this edition?
NSFS3 is both more powerful and much easier to use than its predecessor. Gone are the days of editing XML files and cursing when the program throws a fit because you accidentally left out an angle bracket somewhere in your 1093-line input file. All input is now done through NSFS3's graphical interface, which makes it much easier to see what you're doing and is also far less prone to errors. Don't worry, though, you don't have to start from scratch - NSFS3 has the capability to import your old NSFS2 input file, keeping pretty much everything intact.
Have you been wanting to create an MLS-style league with cross-divisional play? Well, now you can! For the first time, you have the option to allow teams in separate divisions (at the same league level) to play against each other.
Don't like goal difference as the first tiebreaker? Want to use number of wins or even head-to-head results instead? Now you can! NSFS3 finally allows you to customize the order of tiebreakers in use, and you have eight different tiebreaker options to choose from!
Prefer postseason "best-of" series instead of total goals scored? Yep, you can do that too. Unusual for football, you say? Maybe so, but...
NSFS3 now includes support for multiple sports out of the box! In addition to association football, try the built-in American football and baseball options! Looking for a sport other than these three? More sports will be continuously added to NSFS3 on a regular basis, and I'll gladly take suggestions for any sport that I may not have yet.
In order to use NSFS, you will need to have the Java Runtime Environment, version 5 or later, installed on your system. The JRE is available for most modern operating systems, and NSFS will function on any system with a JRE installed.
||8 August 2010
||nsfs301.zip (1.78 MB)
|source code (186 KB)
||9 April 2008
||nsfs207.zip (134 KB)
||21 May 2006
||nsfs124.zip (60.4 KB)
||Final "simple input" version, less powerful
v3.0.1 [build 362] (2010-08-08) – full changelog
- Knockout competition rules are now customizable for individual rounds instead of being applied to the whole tournament. This is a reintroduction of functionality that was present in NSFS2; I'm really not sure why I didn't include this in v3.0.0.
- Unfortunately, due to the major modifications that had to be made in order to accomplish this, v3.0.0 knockout competition files are incompatible with NSFS v3.0.1. While I plan to do my utmost to preserve backward compatibility whenever possible, it simply was not possible in this case.
- League files are not affected; v3.0.0 leagues are compatible with v3.0.1. Imported cups from NSFS2 will also work just fine.
- The bug that was causing resumed knockout tournaments to not output any results has been fixed.
- NSFS should now be able to remember which sport is associated with saved league and cup files instead of automatically defaulting to association football upon load. This may not work for already saved files, but will work for all new saved files.
- There are a few minor tweaks to the league creation screen. It should now be clearer that most of the options in the lower-left panel apply only to a single league rather than the whole system.
- There are a few major changes to the knockout competition creation screen. You will now directly add teams to the round in which they should enter the competition, as opposed to all the rounds drawing from a single list, which was less intuitive and caused some confusion.
v3.0.0 [NSFS3 build 323] (2010-06-20)
- Built NSFS3 almost completely from scratch apart from the actual scorination code and XML parser from NSFS2 (and even those were heavily modified).
- If you really want to see the gory details: Developer's build notes
- And of course I made a boneheaded move during that change and managed to muck up the output format of the match scores. It wasn't technically wrong or a bug, just less complete. The old way has now been restored.
- Correction: v2.0.5 was meant to be the last release of the NSFS 2 family...until it was realized that that bug wasn't quite entirely fixed after all. It truly is fixed now, and I've done the testing to prove it.
- Fixed a bug present since v2.0.1 that caused the program to hang and prevented resume files from being generated when using divisions with an odd number of teams (thanks Baz).
- ATTENTION! This will be the final release of the NSFS 2 family. From here onward, all development is being shifted to NSFS 3. As NSFS 3 is likely to be an almost complete rewrite of the program, it may take several months to complete.
- Attempting to use a team with a negative point-based rank resulted in:
Instead, the program will now give an error message if you attempt to do this.
- All of its matches ending in a 0-0 draw (with draws enabled)
- The program hanging (with draws disabled). Technically, a neverending penalty shootout was taking place.
- Fixed a bug that caused away teams to be unable to score in a penalty shootout when using point-based ranks.
- Fixed a bug that caused the program to hang when generating seasons for leagues with an odd number of teams.
- Apparently my migration to Java 6 broke Mac OS X support. A check of http://java.sun.com shows no indication that a Mac version of Java 6 exists at all. As a result, I have reverted to Java 5. Mac users rejoice!
- Fixed a bug that sometimes caused seasons to end prematurely when custom fixtures were used. Also, the <matches> parameter in the input file now works correctly with custom fixtures.
- Made an improvement to the way errors are reported; now for most parsing errors the program will be able to tell the user what line of the input file the parser choked on. This should save you a lot of frantic searching.
- Disabled the result probability option. It's still broken, and I still can't figure out what's wrong with it. That whole thing will need to either be completely rewritten from scratch or disposed of altogether.
- Fixed another penalty shootout bug that resulted in impossible 4-0 scorelines.
- I think there are a couple other changes too, but those were made several weeks ago and I can't remember what they are.
- Reinstated the ability to show match result probabilities (removed in beta 1). The option is via a checkbox on the main screen.
- Removed the no-longer-in-use progress bar from the main screen.
- Fixed a bug present since beta 1 that caused aggregate scores of multiple-match cup rounds to be calculated incorrectly.
- Reinstated the display of aggregate cup round scores (removed in beta 1).
- Implemented the ability to define the default directory where you would like to look for input files. This is done in formula.cfg on the first line, labeled defaultDirectory. Add one (1) space after that word, then place the full path of the folder you wish to begin in (do not enclose it in quotes; spaces are fine).
- For additional changes since v1.2.4, see the beta entries (particularly beta 1). Please note that the input file format has changed from v1.2.4!
v2.0.0 BETA (2006-05-26 through 2006-06-04)
v2.0.0 beta 5 (2006-06-06)
- The resume file wasn't outputting the correct custom fixtures, as they were being rearranged to fit the teams' order in the table instead of the actual order they were specified in. This has been fixed now.
v2.0.0 beta 4 (2006-06-04)
- Cups with point-based ranks weren't working at all thanks to about a dozen identical yet separate bugs that were fiendishly difficult to track down, but all is well now.
- There are just a few more minor things to take care of, then we'll be ready for the "real" 2.0 release.
v2.0.0 beta 3 (2006-05-27)
- Sometimes the resume file wasn't being output due to the output stream not being closed. This is fixed now.
- Corrected a slight error in the XML syntax of the resume file.
v2.0.0 beta 2 (2006-05-26)
- Corrected error with the "maxpoints" attribute being ignored for leagues, resulting in all matches to end with 0-0 scorelines when using point-based ranks.
- Added ability to make a team start the season with a number of points other than 0 (allowing for various league-mandated penalties, for instance).
v2.0.0 beta 1 (2006-05-26)
- Rewrote large sections of the program from scratch.
- The input file format has changed again, this time to XML. Much of the (now outdated) documentation has been removed from the readme file, but the format of the XML input file should be fairly self-explanatory. Comments are provided in sample_input.xml and sample_cup.xml to help with some of the less obvious stuff.
- League resumption files are now exactly the same format as regular league definition files, so you can now do anything with a partial season that you can with a full one (including things such as custom fixtures).
- It is now possible for cup rounds to consist of more than two matches.
- Cup rules are now done on a round-by-round basis. So, for instance, you can now generate a cup that uses home-and-away series for all rounds through the semifinals and then changes to a single match at a neutral venue for the final. You can also explicitly name each round.
- The interface has been trimmed down to the absolute basics - there are now just three buttons and the (not working yet in this build) progress bar. All the options that were available via the interface are now specified as part of the input file.
- Exceptions: The ability to show result probabilities and promotion/relegation cutoff lines is not present in this build. Expect these features to return for the full 2.0 release.
- Fixed a long-standing, yet obscure, bug that caused the wrong team to advance when the team that played its first match at home in a two-legged cup format won overall on penalties; the other team erroneously advanced instead.
- Added a feature to automatically print promotion/relegation dividing lines in final league tables - see section 2.C above for details.
- Apparently adding Unicode support broke something else, because results would only be output in 8-kilobyte blocks afterward, causing files to be cut off. After much blood, sweat, tears, and curses, that's finally been fixed and the program is usable once again!
- Made the Unicode implementation in v1.2.1 actually work.
- Produced more informative error messages so that if something goes wrong, you'll actually know what it is.
- Introduced better handling of user cancellation (e.g. if you click "cancel" in the load teams dialog box, the program won't try to keep going on to other stuff anyway).
- The exit button now works if you haven't generated a league, as the program no longer attempts to close output streams that haven't been opened.
- Implemented Unicode support for both input and output files.
- For one-legged cups in which draws are not enabled, when the match ends in a draw, extraneous extra time and penalties are no longer generated before the replay.
- All results are now output to a single file and all tables to another single file, regardless of how many divisions you are generating. Alas, still no interdivisional play yet, but this should be a major breakthrough in that direction.
- Fixed a bug causing seasons to end prematurely created by the bugfix in v1.1.2. Ah, debugging, it's a neverending cycle.
- Implemented result probabilities for cup matches.
- You can now optionally see the "shock factor" of the result of a generated match, that is how likely it was to happen. There's a check box on the main screen that'll do this.
- Fixed a bug that was causing issues with resuming unfinished seasons in leagues with an odd number of teams.
- The league resumption file format has been changed to be more compact, easier for the program to read, and to incorporate the style modifiers added back in 0.9.
- Skipping the 1.0.x series and going straight to 1.1 because we have a major new feature - the ability to handle multiple divisions in a single input file! It's quite easy; see sample_teams.txt for an example.
- After about two and a half years of development, NSFootySim has finally left beta! Much thanks to the people of #sport on irc.esper.net for helping me find bugs, giving me suggestions for program features, and just generally giving me the inspiration to keep going with it. It wouldn't be anywhere near here without you guys.
- So what's the big thing that pushed it to 1.0.0? Custom league fixtures! Yes, they're here, and they're pretty simple to do. Just look at sample_fixtures.txt for an example.
- Also, an important part of getting out of beta: improved error checking in the user interface. If the program crashes, it's not because of anything you did there. ;)
- More Cup stuff - now teams can enter at any stage of the competition. The Cup input file structure has changed just slightly to accommodate this; more info above.
- You now get some extra stats to go with your season results output files - the highest scoring game and largest home and away wins are now noted at the bottom of the file.
- Thanks to the wonders of threaded programming, I present a new addition to the interface: a progress bar, which will show you how far along the generation of a league season is.
- Alas, both of these features currently only work with leagues, not with cups. Cup support will be added later.
- The problem with partial season output/input just flat out not working has been fixed and all is well with the world again.
- You can now choose to randomize cup teams after every round if you like, rather than only being able to do so at the very beginning.
- Finally you can do cups with odd numbers of teams! It works very simply - if there is an odd number of teams in a round, the last team in the list receives a bye. When using an odd number of teams, it is recommended that you randomize them after every round, else one team may receive several consecutive byes.
- You can now do your Cups like the English do - draw the match? Replay it at the other ground! This only works for single-legged rounds, of course - setting "Allow Draws" to ON will let you do this.
- Now you can make your seasons as short or as long as you want. You can specify how many times each team plays each other team - 1, 2, 3, 5, 77, whatever you want.
- In a related change, the method for deciding whether or not to use neutral ground has been changed - if you want, you can play two matches against each team with both on neutral ground, or you can play one while keeping home advantage - whatever. This applies to cups as well as leagues.
- Finally, the default style modifier settings have been returned to the values from v0.9.1. They weren't that outrageous after all.
- Points awarded for wins, draws, and losses now default to 3, 1, and 0 respectively instead of 0 for each. They can also now only be set within the range 0-100.
- Randomization of the order of teams has now been extended to leagues as well as cups. The same checkbox is used for both.
- The default style modifiers' effects have been cut in half, as they seemed to be a bit too strong. As always, they can be adjusted to your taste.
- Apparently my testing procedures suck - v0.9.0 completely broke cups. That is now fixed.
- Having done a bit more testing, I'm starting to think I may have made the default style modifiers slightly too strong, but I can't say for sure. They remain unchanged for the moment, but could change at a later date.
- Rebuilt the GUI from scratch, reducing its size by about 40%.
- Changed the format of the input file (see above).
- Made a few minor changes to the formatting of the output.
- New major version, new major feature: style modifiers! You can now define in the input file how offensive or defensive each of your teams is. Or not, if you prefer. It works both ways. See above for details.
- This also gives you three new variables to help you further customize the effects of style modifiers.
- Maintenance release.
- Bugfix: The chance of a successful attack for the away team in extra time wasn't being calculated properly.
- Bugfix: The number of attacks per team in extra time was hard-coded at 3. This has now been changed to become one-third of the number of attacks in normal time.
- Made some very large alterations to the way matches are handled by the program. Matches are now objects in and of themselves, and so I can do a lot more with them now. Expect to see the fruits of this sometime before 1.0.
- Made the coding of the sorting algorithm much more intuitive, and as a result was able to extend it a bit. Now the full "standard" sorting method is available, using this order:
Unfortunately, sorting by head-to-head results is not currently available, and may not be for a while.
- Goal difference
- Goals scored
- Alphabetical order
- Fixed a few formatting errors in the output.
- Updated the program to use Java 5's new Scanner class for input, instead of relying on a separate bundled class for it.
- The program was outputting unnecessary blank lines to the console if it was run from there. Those are gone now.
- Added message boxes to tell when:
- Result generation is complete.
- The requested file does not exist.
- There is an error with the file you are attempting to use.
- Not an actual program update, simply a name and license finalization. This is the first "official" release of the program.
- I had apparently managed to break the system for resuming an existing league. This release fixes that.
- Fixed that pesky bug that caused the scorinator to produce impossible scorelines in penalty shootouts, most notably the infamous 6-4.
- Finally, finally, finally fixed all the formatting errors in the output files.
- Reverted the source code back to v0.8.0 style because the v0.8.0b style had ceased to function.
- Improved the cup competition function. You can now generate a knockout-style tournament with any even number of teams. Rounds will be generated until the remaining number of teams is odd (so for instance, if you have 20 teams, two rounds will be generated and you will be left with five teams).
- Removed the planned "Deluxe Mode" from v0.8.0a. What I plan to do with it is just too complex to be integrated successfully into the existing framework of the program. I'll be finding a different way to implement it instead.
- Maintenance release.
- Reorganized the source code a little bit to conform more strictly to the principles of object-oriented programming.
- Added an additional config file, footysim.cfg, which at present contains only the deluxeModeEnabled parameter. At present, this parameter does nothing. However, I currently have some really big plans, and this parameter will be integral to them.
- Fixed a significant bug that prevented home teams from scoring in extra time when using point-based rankings.
- Fixed a major bug that prevented any teams from scoring in normal time in a cup competition.
- Added two more variables related to penalty shootouts for use in customizing the formulae.
- Tweaked the default penalty shootout success thresholds a bit.
- Hopefully fixed the problem with weird characters appearing in the output files. I think (though I'm not totally sure) it depends on the operating system on which the program is compiled. When I was compiling on Windows ME (gag) I didn't have the problem, but I did when compiling on Windows XP. So I think it will work properly now, assuming you're using the precompiled version in the .jar file. If you're compiling it yourself and aren't using Windows XP, on the other hand, you may experience problems with the final character in team names getting cut off. Hopefully I can find a better solution to this problem.
- Reinstated the separate final table output file. As before, you choose the name and location.
- Turns out the problems with the default formulae were typoes after all. These are fixed now. Also an explanation of how to alter formulas has been placed in this readme file.
- There are some issues with the output file, namely the extra output of a couple weird characters that shouldn't be there. The problem is somewhere in the method Out.print and/or Out.println.
- Implemented the ability for the user of the program to customize the match generation formulae. To do this, open the included file formula.cfg and edit the numbers (ONLY the numbers, nothing else!) on each line. The defaults provided in the file are the formulae used by this program ever since v0.6.2. Or at least I think they are. The point-based ranking results are coming out quite a bit more random than they should be; I've checked for typoes and found none. Good news is, you can customize the formula to counteract it. ;)
- Fixed a major bug that caused the wrong formula to be used for away teams when using point-based ranks.
- Fixed a major bug with cup competitions that caused them to just flat-out not work (i.e. not prompt to save the results).
- This is pretty much a NSWC-specific update. If a nation ceases to exist during a World Cup, especially through DEATion, it often incurs an automatic 80-point penalty. You can now make this happen by appending a percent symbol (%) to the front of its name. The table will automatically have the 80 points deducted.
- The bug with sorting league tables in the results file has FINALLY been fixed! Therefore, it is now redundant to include the final league table in a separate file as well. As a result, I've gotten rid of that file.
- You can now make a team forfeit all its remaining matches by appending an asterisk (*) to the front of its name. A forfeited match is an automatic 3-0 win for the opponent, and the forfeiting team receives a point deduction equal to the number of points normally awarded for a win.
- Made the league resumption file slightly more straightforward to edit by not scaling the ranks used in point-based systems.
- Added support for point-based ranking systems in cup competitions, which I didn't even realize was not present!
- The automatic fixture generation routine has been improved. No longer will the first team listed play the entire first half of the season at home and the entire second half away. Instead a more realistic schedule is now used.
- The formula for generating results of matches when using point-based rankings has been adjusted to make higher-end teams less invincible.
- I have hopefully fixed problems with the program sometimes not being able to load.
- For this purpose, and also in order to make the distribution size smaller, I am now only putting the .jar file in the download. This means that a Java Runtime Environment (JRE) is again required.
- The file save dialog boxes sometimes displayed the wrong caption. This has been fixed.
- Team names are now printed out when cup matches go to extra time or penalty kicks, and also for aggregate scores. This should eliminate any confusion as to the winner of the match.
- The option to automatically generate the BPL leagues has been removed. I did this because I'm hoping to put an official release of the program out soon and this feature would most likely only be used by me.
- Changes have been made so that no more flags are needed in league definition files, making them now just a list of teams and ranks.
- There is a new text box on the form in which you type in the name of the competition. As such, it is no longer needed in the league definition file.
- You can now select with a radio button whether the ranks used are sequential or point-based, and what the maximum point value is if applicable. Therefore, the !rankPoints flag is no longer needed.
- There is also a text box where you can enter the final matchday to generate, or 0 to generate the full season. Therefore, the !finalMatchday flag is no longer needed. League resumption files work the same way as before.
- The user can now specify the location and names of all output files.
- Support has now been added for ranking systems based on points instead of sequential numbers (as in WC12 and WC17).
- To do this, use the flag !rankPoints followed by a space and the maximum possible number of points (or the point total of the highest-ranked team). This flag goes on its own line between the competition title and the name of the first team in the league definition file.
- The match formula used for the point-based ranking system is a replica of that used for World Cup XII, hosted by Kaze Progressa and Lemmitania.
- Single-leg cup competitions that go into extra time will now also show the score before extra time.
- Cup output files will now automatically show the labels "Quarterfinals", "Semifinals", and "Final" if there are 8, 4, and 2 teams remaining, respectively.
- Made a few changes to the interface:
- Changed "BFA Leagues" to "BPL Leagues".
- Converted the "Allow Draws" option into a check box rather than a pair of radio buttons.
- Added a check box to determine whether the teams for cup competitions should be randomized.
- Moved a few buttons and frames.
- The program now has the ability to generate a partial season and allow the user to pick up where he/she left off at a later time. For more information, see the "Creating a league definition file" and "Continuing a season" sections.
- Home/away support has been added to cup competitions. Note that "Allow Draws" will be automatically set to "on" in home/away cups; this cannot be changed.
- Bug fixing update.
- Leagues with odd numbers of teams are working again!
- Corrected a hard-to-find bug that caused teams in a league not to play the right matches. This may explain in part why the BPL league results have been so random. ;)
- Went back to the old sorting algorithm, which is simpler and works perfectly for end-of-season tables. Mid-season tables are still not being sorted properly for a reason I've been trying unsuccessfully to figure out for at least a month.
- The program will now work with negative rank values, and they no longer have to be integers.
- Unfortunately, leagues with odd numbers of teams are currently broken. Somehow the fixtures aren't being generated correctly.
- There are some issues with the sorting algorithm. I implemented a new one (stupid of me, as the old one was working fine, at least for end-of-season tables), and now there is one position that is always out of place.
- The Cup is back! You can now use any standard league definition file to generate a single-elimination tournament. Right now, the first round team matchups are randomized, though this is expected to be made optional later. Currently, only the "Neutral" league option works, but home/away support is expected to be added soon. Also note that the "Allow Draws" setting here is irrelevant; draws cannot be allowed. Please also note that cup tournament generation will only work if the number of teams in the league definition file is a power of two. If it isn't, nothing will happen.
- The program now outputs standings after every matchday in the same file as the match results. However, the post-matchday tables are for some reason not sorted properly, despite my using the EXACT SAME algorithm as is used in the final table. The final table is still in its own file and is still sorted properly.
- I have switched programming languages yet again, this time returning to Java.
- The interface is nearly identical to the Visual Basic version, but without the progress bar.
- The code has been streamlined a bit to allow everything to be done using just a few argument-taking methods.
- The output files now show the season and league at the top.
- Finally an executable file! Now it will run somewhere other than my computer!
- At long last, the BFA Scorinating Utility can handle odd numbers of teams in a league! You can now generate a league with any number of teams from 2 to (theoretically, untested) 32,767.
- The program now uses progress bars to keep the user informed of the progress of a generation job.
- You can now determine the number of points awarded to a team for a win, a draw, and a loss. This allows for modifications such as the Rejistanian point system (4/2/1 instead of 3/1/0). Wins, draws, and losses can all be set within the range 0-100, inclusive. Be sure not to go too high, though, because final team point totals of 1000 or higher will make the league table look weird.
- You can now choose whether to simulate each league with each team playing each other team once home and away, or with each team playing each other team once on neutral ground. The "neutral ground" has not truly been implemented yet, though; one team still has home team advantage. Neutrality will be implemented in the next update.
- You can now choose whether or not to allow draws in the league (particularly useful when simulating single cup matches).
- You may now choose from a dialog box which file to import a league definition from when working with a custom league. This also effectively brings back the ability to generate a single BFA division without having to generate the other divisions.
v0.4.1 (early June 2004)
- The ability to simulate a custom league is now available. Simply select the "Custom League" radio button and the program will generate a full league's worth of matches for the teams in the file "custom_teams.txt" in the Teams folder.
- The "Show Results" and "Clear" buttons have been removed. "Show Results" is no longer feasible due to the very high possibility of the custom league containing a very large number of teams, and the "Clear" button is no longer necessary because the program now automatically clears all variables before generating a new league or division.
v0.4.0 (early June 2004)
- Implemented the ability for the program to automatically determine league fixtures on the fly, eliminating the need for a separate function to generate the 20-team divisions and the 8-team Island Regional Division. Hopefully this will soon allow the ability to work with custom leagues with any number of teams.
- Program name changed from "BFA Result Generator" to "BFA Scorinating Utility" in order to keep with the parlance of the local community. ;)
v0.3.x (April-May 2004)
- Development of the BFA Result Generator in Visual Basic.
- Return of the graphical interface, and this time it's easier to use than in v0.2.x.
v0.2.5x (early 2004)
- Development of the BFA Result Generator in C.
- Graphical interface abandoned; program returns to text-only.
- In addition to the First Division, the program can now generate results for all the other BFA divisions, as well as the Bedistani Cup.
- The program has, however, given up the ability to generate a single match.
v0.2.x (late 2003)
- Development of the BFA Result Generator in Java.
- First attempt at creating a graphical interface for the program.
- While keeping the ability to generate a single match, the program now has the ability to generate a full season's worth of matches.
- One limitation: Only First Division teams can be used.
v0.1.x (mid-late 2003)
- Original development of a score generator used to generate a single match between two teams entered by the user. Programmed in C.