-------------------------------------------------------------------------------- | Metroid Password Generator 1.0a | Copyright (C) 2005,2007-2008 emuWorks http://games.technoplaza.net/ | by John Ratliff [ webmaster AT technoplaza DOT net ] -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- | Table of Contents -------------------------------------------------------------------------------- - 1.0 Introduction - 2.0 Compilation and Installation - 3.0 Using the Program - 3.1 Encoding Basics - 3.2 Decoding Basics - 3.3 Raw Encoding - 3.4 The Shift Byte - 3.5 Checksum Fixing - 3.6 The Password Menu - 3.6.1 Perfect Game - 3.6.2 Debug Password - 3.6.3 Reset - 3.6.4 The Ending Submenu - 3.6.5 The Give Submenu - 3.6.6 The Checksum Submenu - 3.7 The Game Menu - 3.8 The Custom Password Text Control - 4.0 Known Bugs and Issues - 5.0 Release History - 6.0 Contacting the Author - 7.0 Thank Yous and Acknowledgments - 8.0 Legal Information -------------------------------------------------------------------------------- | 1.0 - Introduction -------------------------------------------------------------------------------- Welcome to Metroid Password Generator. As you may have guessed, this program will help create passwords for Metroid, the first game in the Metroid series for the original NES (US and European versions only. The Japanese version used the FDS and saved progress on disk). But mpg does so much more than just generate passwords. It can also decode passwords, edit your game progress, fix checksums so you can spell words in your passwords, and much more. Why did I make this program when SnoBro and tapper have already created a Password Generator (MetCode - The Metroid Password Creator) and a Checksum Generator (metpass - Metroid Password Checksum Generator), respectively? First, neither of their programs work on anything but Windows, and I like programs that work on Windows, Linux, and Mac OS X, which mpg does. Second, neither of their programs have what I would consider a great GUI layout. SnoBro never released any refinements to his GUI, so you have to hunt all over a listbox to find which bits to change to get the password you want. It also never tells you if your password is invalid, such as when you select an invalid start location or activate the reset bit. It doesn't feature automatic decode either. Finally, even though you can edit the raw password data, you can't change the shift byte manually. metpass has a nicer interface; it looks like Metroid. This inspired me to put in the custom password panel which displays passwords in the Metroid font. I wish I could have got the graphics to work so you could edit it like he does too, but I could never make it work right, so I gave up. The Metroid font is hard to read sometimes though, especially those lowercase q's and g's, so I like having it in a more readable font, too. You can change the shift byte in his, but you don't know you're doing it. He also only lets you use 16 of the possible 255 shift values. I understand his reasoning, but I don't like limitations where they can be avoided. Finally, the most annonying thing is that you don't know what the password does unless you decode it with another password generator. He suggests using SnoBro's to find out what the password does. I thought the two should be combined. This is where mpg shines. Third, SnoBro's MetCode doesn't know what all the password bits do. He did a lot of research, and learned a few things I didn't (which I borrowed for mpg). I have figured out what 116 of the 128 bits mean, borrowing three bits from MetCode (the reset bit, mother brain's death, and Samus without her space suit). Finally, I do something that neither program does; organization of the GUI. Instead of one big checkbox list, we have the different controls compiling the things which you would expect to be together, but aren't in the raw password data. There are 11 categories (missile count, items, missile containers, energy tanks, red/yellow doors, start location, statues, armor, zebetites, and bosses) of controls. I was hoping to be able to be specific about which bit maps to what specific item, but it's difficult to specify which energy tank or missile container or red door you're talking about without a point of refernece, and there aren't any public maps I could find that list information like that. I try to be as specific as possible while working under this limitation. Please, please don't think I'm putting down either SnoBro or tapper. They are both pioneers and heroes to me, without whom I could never have done the work I did. I stand on the shoulders of giants. The fact that mpg surpasses their work (IMO) is a testament to their efforts. -------------------------------------------------------------------------------- | 2.0 Compilation and Installation -------------------------------------------------------------------------------- Binaries are available for Windows (2000 and later), Linux (requires GTK+ >= 2.0), and Mac OS X (Tiger or later). The source is also available if you want to compile it yourself. To compile, you will need a modern C++ compiler and wxWidgets 2.8 or later. On most platforms, compiling is as easy as opening a terminal and running ./configure && make. That should work on Linux, Mac OS X, and Windows with mingw/msys. There are also Visual Studio project files in the vstudio directory. For more complete compilation instructions, consult our compiling HOWTO at http://games.technoplaza.net/compile.php. -------------------------------------------------------------------------------- | 3.0 Using The Program -------------------------------------------------------------------------------- To start the program, simply double click the mpg (or mpg.exe on Windows) executable. You can also start it from a terminal if you like. -------------------------------------------------------------------------------- | 3.1 Encoding Basics -------------------------------------------------------------------------------- When you start the program, it will bring up a window full of check boxes and text controls and other miscellaneous widgets. To change the password, simply click on the various checkboxes or change the text controls in the notebook (the tabbed window). The first tab, labelled 'Items', contains controls for editing the basic equipment in Metroid. Your items (maru mari, bombs, etc), energy tanks, missile containers and missile count. The missile count is special because it is a spin control. This means you can use the up/down buttons beside it or enter the number directly into the text area. It is difficult to validate text input that is supposed to be in a certain numeric range. This means it is possible to enter invalid values. Do not be alarmed though, because invalid input will never be used. If you enter a number outside the range 0 - 255, 255 will be used instead. Keep in mind that if you have missiles but no missile containers, the game will not show your missile display. Also, you can only have as many missiles as you have missile containers (and 75 for each boss Kraid and Ridley you have killed). This means if you have 255 missiles, but have 1 missile container and no bosses killed, then the next time you collect a missile, your inventory will drop to 5 missiles. The second tab, labelled 'Misc', contains all the other things in Metroid. This includes the game time, which red and yellow doors are open, your start location, which boss statues have been raised, if Samus is wearing her space suit or not, which zebetites have been destroyed, and which bosses are dead. For some reason, when you raise the Kraid statue, the game deactivates the Kraid killed bit. I have found no downside to having them both enabled, and I'm not entirely sure it's not a bug in the game. Just keep in mind that you can have the statues raised or the bosses killed or both, and it all works the same way (except of course for the Tourian Bridge). The game time is special for much the same reason the missile count was special. Instead of being an 8-bit value here, though, it is a limited range 32-bit value. The upper 24-bits have the full range, but the lowest 8 bits overflow at 208 (0xD0 hex). This means there are 3,489,660,720 distinct values in the range 0 - (4,294,967,296 - 1). Because the least significant byte with overflow at any value >= 208, we treat the value as if it were truly 32-bit, though the game doesn't distinguish values where the lowest byte is in the range 208 - 255. 208 + 1 = 0 for the lowest byte. The game time is special for another reason. It is specified in what I will call 'game ticks'. A tick is equal to 256 frames, where 1 frame occurs each time an NMI (non-maskable interrupt) occurs, which occurs after the final scanline is written. If that made sense to you, good; if not, then forget it and read the next paragraph instead. Since television signals differ from Europe to the US, there are two conversions for turning game ticks into seconds. The NTSC (US) Nintendo ran at 60 Hz, or 60 frames per second, because the US television signal runs at that speed. This means for Metroid run on a NTSC (US) Nintendo, 1 game tick = (256 frames / 60 frames per second) = approx 4.2666666666666666666666666666667 seconds. For Metroid run on a PAL (European) Nintendo, 1 game tick = (256 frames / 50 frames per second) = 5.12 seconds. NTSC Metroid: 1 game tick = ~4 seconds PAL Metroid: 1 game tick = ~5 seconds The approximate time will be shown next to the game tick control, and you can switch the conversion from NTSC to PAL using the Game menu. The third panel, labelled 'Raw' will be covered in 3.3 Raw Encoding. -------------------------------------------------------------------------------- | 3.2 Decoding Basics -------------------------------------------------------------------------------- To decode a password, simply enter it in the text control at the bottom under the Metroid password. Once you have entered the password, it is checked, and if authentic is automatically decoded. You will know this happens because the Metroid password display will only change when a valid password is entered. If you want to try it out, just enter JUSTIN BAILEY ------ ------ and see what happens. Then you can edit this password as described in 3.1 Encoding Basics or 3.3 Raw Encoding. Keep in mind that some passwords have selections that are not actually valid in the game itself. This means when you decode a password, it may not look correct in the first tab. This is because the first two tabs try as much as possible to ensure valid data. So you cannot have the Maru Mari if it has not been taken from the pedestal. The JUSTIN BAILEY password, which has all items (save for the Ice Beam) in the inventory is one such password. It also has a missile inventory greater than Samus' carrying capacity. If you enter a password with an invalid checksum, the fix checksum button will become enabled. This is useful when you want to make passwords from random words. This will be discussed more in 3.5 Checksum Fixing. -------------------------------------------------------------------------------- | 3.3 Raw Encoding -------------------------------------------------------------------------------- The third tab, labelled 'Raw', is for raw password data editing. Instead of editing only the known values to produce a password, you can change it bit by bit, just like in SnoBro's MetCode. I find this approach useful only when decoding user-made passwords that aren't stricly valid in Metroid (having items without removing them for instance). You can also change the shift byte here. It's purpose will be discussed in 3.4 The Shift Byte. -------------------------------------------------------------------------------- | 3.4 The Shift Byte -------------------------------------------------------------------------------- The shift byte is a value in the Metroid password used to encode the data. It is used to encrypt the password. I won't talk about how it works here, because it's complex and ultimately irrelevant to password generation. Just know here that changing the shift byte will alter the password significantly. If you want to know how it works, or about how the password works in general, consult my Metroid Password Guide document (in the docs directory in password.txt). The shift byte means there are trillions upon trillions of passwords that do the same thing. Since there are 128 bits in the password and 256 shift values, this gives the possibility of 8.7112285931760246646623899502533e+40 passwords. The JUSTIN BAILEY password uses a shift value of 255. By default, the program uses a shift value of 0, which means the passwords aren't encoded at all. The NAR PASSWORD has a defacto shift value of 0, even though it isn't used. This means it is conceivable through raw editing that you could stumble upon the NAR PASSWORD and ruin your editing. If this happens, simply change the shift byte to get an encoded password. -------------------------------------------------------------------------------- | 3.5 Checksum Fixing -------------------------------------------------------------------------------- Now we get to the fun part, checksum fixing. This enables you to create word passwords that actually work in Metroid. I don't know if anyone will want this, but it's fun sometimes. I spent a good twenty minutes playing with it, err, I mean testing my code. To make it work, simply enter a password. Because the checksum is encoded in the last two characters, you cannot use these as part of your message, but the rest are fair game. If it's not a valid password (and odds are it won't be), the fix checksum button will become enabled and you can click it to fix the checksum. At this point, the checksum will be changed and your password will be entered. Note that because you are supplying random data, your password may not be valid. The program will warn you if it knows your password is invalid. The two possibilities for invalid password are the reset bit (look in the raw password data) and an invalid start location. For instance, I wanted to use "ThisIs MyRock inPass word00". But this has both the reset bit set and an invalid start location. So I changed it to "ThisIs Myr0ck inPass word00". Then hit fix checksum and it becomes the valid password "ThisIs Myr0ck inPass word16". A note about spaces. It's best not to use spaces, because they can alter the letter that comes before it. If you want spaces, blanks can be used instead. Blanks are where there is no character between two characters. Metroid treats blanks as zeroes, but spaces are different. You cannot put a blank in the program, but you can put a 0, and change it to a blank when you enter it in the game. Metroid cannot enter blanks, but you can go backwards until you hit the character after the one you are at to get a blank. After a space is put into a password in Metroid, it cannot be a blank again until you reset. Finally, about the decoded meanings. If you have used metpass, you may have noticed it seems to be able to generate different values for the generated passwords. This is because it limits itself to the 16 possible shift values that can be used with the first 22 password characters. The shift byte is encoded in the 22 and 23 character of the password. The high four bits of the 23rd character are the bottom half of the shift byte. Since there are four bits, this gives 16 possible values. Why does this let it give different passwords? It doesn't by itself. The reason it can generate 16 different sets of data is that instead of encoding a new shift byte onto an existing password which is what happens when you change the shift byte in mpg, it decodes the password you gave it using each of the 16 possible shift values, and that becomes your password data. Because metpass changes the shift byte and decodes a new password every time you hit NEXT, you get different data depending upon the shift byte. To constrast, our program allows you to handle the shift byte yourself. This means you can use all 256 possible shift values, if you know the right letters to use. To use the 16 possible shift values for any 22 character password, make the 23rd character one of the following: 0, 4, 8, C, G, K, O, S, W, a, e, i, m, q, u, or y. These values can be used automatically from password menu's checksum submenu. Now, getting back to my original password: "ThisIs MyRock inPass word00". If I change that first 0 to a G, I get a valid password without any editing. With the fixed checksum, it becomes "ThisIs MyRock inPass wordHT". The 22 character's low four bits are the high four bits of the shift byte. If you can't find a valid password with any of the 16 values, then you will have to change the 22 character. Once you change this character, you will have a new set of 16 shift values to try. -------------------------------------------------------------------------------- | 3.6 The Password Menu -------------------------------------------------------------------------------- Editing the bits by hand is a lot to take care of it you just want certain things. The Password Menu has many useful options to make password editing easier. -------------------------------------------------------------------------------- | 3.6.1 Perfect Game -------------------------------------------------------------------------------- The first item on the Password menu is the Perfect Game, or at least my idea of one. You get all the items (except the wave beam because you can't use them both legitimately), all the missile containers with a full missile count, all the energy tanks (even though you can only use 6), all the red and yellow doors open, kraid and ridley dead with their statues raised, all the zebetites dead, starting in Tourian with a game time of 0 and Samus in her swimsuit. This password is "------ ---mE3 l-y000 00y00j". Basically, it's what would happen if you went through the entire game twice (once with the space suit getting a good enough ending to play again without it, and once with the swimsuit), but with a forged game time of 0 and a full missile count (assuming you didn't have one when you got to Tourian). I guess you would also have to die the second time around to account for the 30 energy and the fact that all the red and yellow doors in Tourian are open and the zebetites are dead. In other words, this is the password to just go kill Mother Brain with a minimum of complications (save for the fact you only start with 30 energy). If you want to be a little more fair, you might revive the zebetites and close the red and yellow doors in Tourian. Then it would be as if you just arrived in Tourian, but died once to account for the 30 energy. This password would be "------ --0m23 l-y000 00y00k". A better and fairer password if you want full energy would be to take away Brinstar Energy Tank Three, close the red door to the Tourian Bridge in Brinstar, close all red and yellow doors in Tourian, change the start location to Brinstar, lower the statues, and finally revive the zebetites. This way, you can collect the Energy Tank on the way to Tourian (it's the one in the ceiling just past the shaft to Kraid's Lair). It will be as if you were just going to Tourian for the first time. This password would be "z?---- --0m20 l-y000 00K01p". -------------------------------------------------------------------------------- | 3.6.2 Debug Password -------------------------------------------------------------------------------- The second item on the Password menu is Debug Password. The debug password, aka the NAR PASSWORD, is NARPAS SWORD0 0000. The last 8 characters can be anything because the password is hard coded into the game, and the game only checks the first 16 characters. I think this has something to do with the fact that 16 password characters = 12 bytes which is 3 quads, a multiple of 4 bytes. I don't have any research to back it up, but it's a nice data size to work with, and if it were simply a matter of bytes, they could have stopped at 12, which would be 9 bytes. Due to blanks and zeros being treated the same way, you can also enter simply NARPAS SWORD and it will work. What does 'hard coded' mean? It means the checksum isn't checked, nor the shift byte used. It also means you cannot edit the password traits because it's not a real password. There are several theories behind the name. NAR could mean 'Not a Password', or it could mean 'North American Release' since the Japanese version used the FDS (Famicom Disk System) to store its data, or it could be a shortened form of the name Tohru Narihiro, the man who created the password system for the US and European version of Metroid. Whatever it means, the password is what it is. What does the debug password do? It turns on many interesting debugging effects that can be used to test the game with. Samus is invincible (she cannot be hurt or killed, except if the timer runs out when escaping from Zebes after killing Mother Brain). Samus has all the equipment (The Wave Beam and Ice Beam simultaneously, for a weird looking beam), and unlimited missile capacity, even when the missile display is not present. She has no missile containers or energy tanks, and neither Ridley nor Kraid is dead. Because the password is hard coded, you cannot save the effects. Some people think you can because when you start the game, you go back to your last position. But do not confuse this with actually entering the password the game gives you. If you reset the NES and try the new password, you will see that you have lost your debug effects. The Debug Password menu item simply brings up a dialog with the NAR PASSWORD and tells you it is hard coded and cannot be edited. It is possible to stumble upon the NAR PASSWORD by editing individual bits when using a shift value of 0. If this happens, or you try to enter the NAR PASSWORD into the text box, the program will warn you. If you stumble upon it by accident, simply change your shift value in the raw tab and you will be able to keep editing. -------------------------------------------------------------------------------- | 3.6.3 Reset -------------------------------------------------------------------------------- This third item on the password menu is the reset option. You can use this to reset the password to a blank one (all zero's), which would be the equivalent of choosing Start instead of Continue from the Metroid intro. If you choose this option, it will ask you to confirm before it erases your old data. -------------------------------------------------------------------------------- | 3.6.4 The Ending Submenu -------------------------------------------------------------------------------- There are 10 possible endings in the game. The data I have seen says there are five, but they are wrong. I don't know where this information came from originally, but it doesn't square with my copy of Metroid. The ending you get is based on two factors. a) The time it took you to finish the game, and b) whether Samus is wearing a space suit or a swimsuit. I'll do b first because it's simpler. The only change with b is that if she's wearing her swimsuit, you will see her in it when the ending screen starts after taking the elevator off Zebes. Otherwise, she starts out in her space suit. Now, there are 5 endings that depend on a. So, you get one of two things for b, and 5 for a, giving us a total of 10 endings. There may be more than 10 endings. I have done research to find out the exact times, but this is still based on what I have read in tutorials; that endings are based on the two factors (time and swimsuit). So, there are five changes based on time. 1) Samus changes into a bikini at the end (Space Suit Off) 2) Samus changes into a swimsuit at the end (Space Suit Off) 3) Samus removes her helmet (Space Suit On) 4) Samus raises her fist in a 'victory pose' (Space Suit On) 5) Samus turns around covering her eyes in a 'shame pose' (Space Suit On) If the Space Suit is off, then for the last three endings, she puts it back on. I have done tests to find out the precise numbers (in game ticks) that cause the 5 time endings. 1) Game Time < 1024 ticks (approx 0 hr 59 min NTSC or 1 hr 11 min PAL) 2) Game Time < 2560 ticks (approx 2 hr 28 min NTSC or 2 hr 57 min PAL) 3) Game Time < 5632 ticks (approx 5 hr 25 min NTSC or 6 hr 30 min PAL) 4) Game Time < 31232 ticks (approx 30 hr 5 min NTSC or 36 hr 5 min PAL) 5) Game Time >= 31232 ticks Now, as for the Endings submenu. The purpose of this menu is to change the game time to yield one of the ending results based on time. It will change your time to 0, 1024, 2560, 5632, or 31232 depending upon the ending you select. I decided not to include swimsuit changes in the menu as I assume people would either want Samus in her swimsuit or not. -------------------------------------------------------------------------------- | 3.6.5 The Give Submenu -------------------------------------------------------------------------------- The next piece of the Password menu is another submenu. The Give submenu is here to give you all of something in a certain category. The categories are items, missile containers, energy tanks, red & yellow doors, statues, zebetites, bosses, and missile count. Items: Gives All Items Missile Containers: All Missile Containers (105 possible missiles with these) Energy Tanks: All 8 Energy Tanks Red & Yellow Doors: All 19 Red & Yellow Doors Open Statues: Kraid & Ridley's Statue Raised Zebetites: All 5 Zebetites Dead Bosses: All 3 Bosses (Kraid, Ridley & Mother Brain) Dead Full Missile Count is special in that instead of giving you 255, it gives you whatever your carrying capacity is. If you have all missile containers and both bosses are dead, then you can have 255. Kraid and Ridley are worth 75 a piece. Each missile container is another 5, of which there are 21 containers. -------------------------------------------------------------------------------- | 3.6.6 The Checksum Submenu -------------------------------------------------------------------------------- If you have read the section 3.5 Checksum Fixing, you know that the last two characters are generally all that you need to leave alone to get a working password. You also know that the second to last (or 23rd if counting forward) character can be adjusted to give 16 possible shift values. Rather than memorizing these, you can use the checksum submenu to adjust the password for you. Each item on the Checksum submenu will take a value from the list of 16, change the 23rd character to it, and then decode the password with the new shift byte. Why is this handy? Because many passwords you form from strings of words will be invalid. They could have the reset bit set, or an invalid start location. This menu makes it easy to switch to a new shift byte to see if you get a valid password with the new value. If none of the 16 are valid though, you'll have to change the 22nd character. -------------------------------------------------------------------------------- | 3.7 The Game Menu -------------------------------------------------------------------------------- The Game menu is used to select between NTSC and PAL versions of Metroid, for the US and European Nintendos, respectively. The only thing it affects is the calculation of the approximate time next to the game ticks control. The selection defaults to NTSC since it is what I use. If you have a PAL version of Metroid, you can change it using the menu to see what real times correspond to what game ticks. -------------------------------------------------------------------------------- | 3.8 The Custom Password Text Control -------------------------------------------------------------------------------- If you have used SnoBro's password generator MetCode, you have probably used his password text control. It is very nice because it keeps spaces between the segments of the password to make things more readable. Starting in version 0.92, mpg has this now, too. It's not the same as SnoBro's, but it has more or less equivalent functionality. When you enter password values now, the control will skip over the separating spaces. It also works with the left and right arrows, delete and backspace, and pasting. You can paste passwords (or parts of passwords) into the control by selecting the position you want to paste at and pressing Ctrl-V on Windows and Linux, and Command-V on Mac OS X. -------------------------------------------------------------------------------- | 4.0 Known Bugs and Issues -------------------------------------------------------------------------------- There are no KNOWN bugs at this time. :-) There are a few issues to be aware of. In Mac OS X, the text boxes seem to be scrolled past the end of the text. This can make them look like they aren't responding to input or even that they have any. Just click on the text control and press HOME or drag the mouse or use the left arrow till you reach the beginning. The text is there. The affected controls are the missile count, game time, shift byte, and password text. In Linux (GTK+), the debug password warning will show up twice if you enter a debug password that also passes checksum verification. I don't know if there is a solution to this as the problem is a side-effect of how text controls work under GTK+. In Linux using wxGTK, the display takes up more space than on Windows or Mac. It will fit on an 800x600 display if you hide any top and bottom panels you may have. Otherwise, you'll need a higher resolution. I tried to make it fit both all platforms under 800x600, but GTK just takes up too much space. -------------------------------------------------------------------------------- | 5.0 Release History -------------------------------------------------------------------------------- Version 1.0a - Tuesday, December 16, 2008 - Updated code to compile under wxWidgets 2.8. - Updated Visual Studio project files for Visual Studio 2008. - Added upx compression to mac version. - Added icons for the mac version. - Updated compilation instructions. Version 1.0 - Tuesday, February 20, 2007 - Added Visual C++ 2005 project files. Version 0.94 - Monday, October 3, 2005 - Removed restriction on Wave Beam + Ice Beam. Version 0.93 - Sunday, October 2, 2005 - Added Metroid Password Format Guide to docs. - Changed password text size to 11 point. - Fixed crashing bug in Linux GTK+ 2.0 if the shift byte was changed to 0. - Replaced spin controls with text control + spin button. - Updated the readme to correct many misc. things. - Stopped fix checksum button from flickering. - Fixed repeating debug password warning (mostly). Version 0.92 - Friday, September 30, 2005 - Added custom password control. - Added checksum shift submenu to password menu. - Changed menu accelerators to accomodate new checksum shift submenu. Version 0.91 - Thursday, September 29, 2005 - Fixed readme regarding invalid game tick conversions. - Added real time label next to game ticks. - Added game menu for NTSC/PAL time conversion. Version 0.90 - Wednesday, September 28, 2005 - First public release. -------------------------------------------------------------------------------- | 6.0 Contacting the Author -------------------------------------------------------------------------------- I can be contacted via email (webmaster [AT] technoplaza [DOT] net). Replace that as appropriate. I also have an online feedback form at http://www.technoplaza.net/feedback.php -------------------------------------------------------------------------------- | 7.0 Thank Yous and Acknowledgments -------------------------------------------------------------------------------- There are so many people who contributed to this program, and it would be criminal not to list them. First, SnoBro (aka Kent Hansen). My shining light in the dark corridoors of Zebes. SnoBro was the person who deciphered the Metroid password checksum and created the first password generator. Without his work, this program simply would not exist. Second, tapper (aka Sebastian Pettersson). His checksum calculator inspired me to add many things to this program that otherwise would not be there. He also helped me confirm my thoughts on the NAR PASSWORD which was plaguing me for a time. Third, Vadim Zeitlin, Robert Roebling, Stefan Csomer, Julian Smart, Ryan Norton, and any member of the wxWidgets team I have overlooked. Their wxWidgets library has saved me time and again from an impossible choice between Windows-only and Java. Last but never least, and probably most important of all, my mentor Gregory Rawlins who taught me all about design and design patterns. I am a million times better programmer than I ever was before I met him. Without his teaching, I would never have been able to tackle a program of this scale. I'm sure he would be horrified to know I've turned to the dark side (C++) and abandoned the light (Java). Sorry Gregory. :-) -------------------------------------------------------------------------------- | 8.0 Legal Information -------------------------------------------------------------------------------- This program is Copyright (C) 2005,2007-2008 emuWorks http://games.technoplaza.net/. It is licensed under the GNU General Public License, which is included with this program in the docs directory in the file license.txt. For more information, please consult GNU at http://www.gnu.org/, or the Free Software Foundation at http://www.fsf.org/.