diff --git a/DialogBlocks/mpg.pjd b/DialogBlocks/mpg.pjd
index 0d600a7..f96cc1a 100644
--- a/DialogBlocks/mpg.pjd
+++ b/DialogBlocks/mpg.pjd
@@ -12,7 +12,7 @@
- 175
+ 177mpg.xrcFALSEFALSE
@@ -78,7 +78,7 @@
MinGW Release
- 15212976
+ 146369520data-document
@@ -89,14 +89,14 @@
0Configurations
- 15169112
+ 146407512config-data-document010
- 15212976
+ 1463695200TRUE
@@ -142,14 +142,14 @@
%AUTO%MinGW Debug
- 15160424
+ 146434880mingw-config-data-document010
- 15169112
+ 1464075120MinGWTRUE
@@ -196,14 +196,14 @@
MinGW Release
- 15417424
+ 146434280mingw-config-data-document010
- 15169112
+ 1464075120MinGWTRUE
@@ -252,7 +252,7 @@
Projects
- 15125880
+ 146402968root-documentproject
@@ -263,25 +263,25 @@
0Windows
- 15211424
+ 146517720html-documentdialogsfolder110
- 15125880
+ 1464029681MpgApp
- 15149424
+ 146528504dialog-documentapp010
- 15211424
+ 146517720021/8/2005wbAppProxy
@@ -298,14 +298,14 @@
Metroid Password Generator
- 32386096
+ 146530304dialog-documentframe010
- 15211424
+ 146517720021/8/2005wbFrameProxy
@@ -367,14 +367,14 @@
wxMenuBar: IDM_MPG
- 15352056
+ 146546600dialog-control-documentmenubar010
- 32386096
+ 146530304021/8/2005wbMenuBarProxy
@@ -382,14 +382,14 @@
<Any platform>File
- 15219904
+ 146548864dialog-control-documentmenu010
- 15352056
+ 146546600021/8/2005wbMenuProxy
@@ -397,14 +397,14 @@
<Any platform>E&xit: wxID_EXIT
- 15257104
+ 146551752dialog-control-documentmenuitem010
- 15219904
+ 146548864021/8/2005wbMenuItemProxy
@@ -421,14 +421,14 @@
Password
- 15231560
+ 146555992dialog-control-documentmenu010
- 15352056
+ 146546600025/8/2005wbMenuProxy
@@ -436,14 +436,14 @@
<Any platform>&Perfect Game\tCtrl-P: IDM_PASSWORD_PERFECTGAME
- 15200912
+ 146557960dialog-control-documentmenuitem010
- 15231560
+ 146555992025/8/2005wbMenuItemProxy
@@ -459,14 +459,14 @@
&Debug Password: IDM_PASSWORD_DEBUGPASSWORD
- 15567272
+ 146561968dialog-control-documentmenuitem010
- 15231560
+ 146555992027/8/2005wbMenuItemProxy
@@ -482,14 +482,14 @@
------------
- 15169672
+ 146551096dialog-control-documentmenuitem010
- 15231560
+ 146555992027/8/2005wbMenuSeparatorProxy
@@ -497,14 +497,14 @@
&Reset\tCtrl-R: IDM_PASSWORD_RESET
- 15192120
+ 146445200dialog-control-documentmenuitem010
- 15231560
+ 146555992027/8/2005wbMenuItemProxy
@@ -520,14 +520,14 @@
------------
- 32566160
+ 146449184dialog-control-documentmenuitem010
- 15231560
+ 146555992027/8/2005wbMenuSeparatorProxy
@@ -535,14 +535,14 @@
Ending: IDM_PASSWORD_ENDINGS
- 32522776
+ 146450872dialog-control-documentmenu010
- 15231560
+ 146555992025/8/2005wbSubmenuProxy
@@ -554,14 +554,14 @@
<Any platform>Best (Samus in Bikini)\tCtrl-F1: IDM_PASSWORD_ENDING1
- 15188200
+ 146454600dialog-control-documentmenuitem010
- 32522776
+ 146450872025/8/2005wbMenuItemProxy
@@ -577,14 +577,14 @@
2nd Best (Samus in Swimsuit)\tCtrl-F2: IDM_PASSWORD_ENDING2
- 15254712
+ 146458728dialog-control-documentmenuitem010
- 32522776
+ 146450872025/8/2005wbMenuItemProxy
@@ -600,14 +600,14 @@
3rd Best (Samus without Helmet)\tCtrl-F3: IDM_PASSWORD_ENDING3
- 15250552
+ 146462744dialog-control-documentmenuitem010
- 32522776
+ 146450872025/8/2005wbMenuItemProxy
@@ -623,14 +623,14 @@
4th Best (Samus Victory Pose)\tCtrl-F4: IDM_PASSWORD_ENDING4
- 15246384
+ 146466760dialog-control-documentmenuitem010
- 32522776
+ 146450872025/8/2005wbMenuItemProxy
@@ -646,14 +646,14 @@
Worst (Samus Shame Pose)\tCtrl-F5: IDM_PASSWORD_ENDING5
- 15242224
+ 146470776dialog-control-documentmenuitem010
- 32522776
+ 146450872025/8/2005wbMenuItemProxy
@@ -670,14 +670,14 @@
Give: IDM_PASSWORD_GIVE
- 15190264
+ 146474688dialog-control-documentmenu010
- 15231560
+ 146555992025/8/2005wbSubmenuProxy
@@ -689,14 +689,14 @@
<Any platform>All Items\tF1: IDM_PASSWORD_GIVE_ITEMS
- 15236072
+ 146477520dialog-control-documentmenuitem010
- 15190264
+ 146474688025/8/2005wbMenuItemProxy
@@ -712,14 +712,14 @@
All Missile Containers\tF2: IDM_PASSWORD_GIVE_MC
- 15502872
+ 146481728dialog-control-documentmenuitem010
- 15190264
+ 146474688025/8/2005wbMenuItemProxy
@@ -735,14 +735,14 @@
All Energy Tanks\tF3: IDM_PASSWORD_GIVE_ET
- 15261064
+ 146485744dialog-control-documentmenuitem010
- 15190264
+ 146474688025/8/2005wbMenuItemProxy
@@ -758,14 +758,14 @@
All Red && Yellow Doors\tF4: IDM_PASSWORD_GIVE_DOORS
- 15198232
+ 146489760dialog-control-documentmenuitem010
- 15190264
+ 146474688025/8/2005wbMenuItemProxy
@@ -781,14 +781,14 @@
All Statues\tF5: IDM_PASSWORD_GIVE_STATUES
- 32560016
+ 146493776dialog-control-documentmenuitem010
- 15190264
+ 146474688025/8/2005wbMenuItemProxy
@@ -804,14 +804,14 @@
All Zebetites\tF6: IDM_PASSWORD_GIVE_ZEBETITES
- 32674032
+ 146497792dialog-control-documentmenuitem010
- 15190264
+ 146474688025/8/2005wbMenuItemProxy
@@ -827,14 +827,14 @@
All Bosses\tF7: IDM_PASSWORD_GIVE_BOSSES
- 15226592
+ 146501776dialog-control-documentmenuitem010
- 15190264
+ 146474688025/8/2005wbMenuItemProxy
@@ -850,14 +850,14 @@
Full Missile Count\tF8: IDM_PASSWORD_GIVE_MISSILES
- 15381208
+ 146505760dialog-control-documentmenuitem010
- 15190264
+ 146474688025/8/2005wbMenuItemProxy
@@ -874,14 +874,14 @@
------------
- 15355488
+ 146509640dialog-control-documentmenuitem010
- 15231560
+ 146555992029/8/2005wbMenuSeparatorProxy
@@ -889,14 +889,14 @@
Checksum Shift: IDM_PASSWORD_SHIFT
- 15218016
+ 146511296dialog-control-documentmenu010
- 15231560
+ 146555992029/8/2005wbSubmenuProxy
@@ -908,14 +908,14 @@
<Any platform>One\tCtrl-0: IDM_PASSWORD_SHIFT1
- 15594944
+ 147127896dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -931,14 +931,14 @@
Two\tCtrl-1: IDM_PASSWORD_SHIFT2
- 32452312
+ 147131936dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -954,14 +954,14 @@
Three\tCtrl-2: IDM_PASSWORD_SHIFT3
- 15422240
+ 147135976dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -977,14 +977,14 @@
Four\tCtrl-3: IDM_PASSWORD_SHIFT4
- 15302096
+ 147139960dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -1000,14 +1000,14 @@
Five\tCtrl-4: IDM_PASSWORD_SHIFT5
- 15271400
+ 147144000dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -1023,14 +1023,14 @@
Six\tCtrl-5: IDM_PASSWORD_SHIFT6
- 15396984
+ 147147992dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -1046,14 +1046,14 @@
Seven\tCtrl-6: IDM_PASSWORD_SHIFT7
- 15418304
+ 147152008dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -1069,14 +1069,14 @@
Eight\tCtrl-7: IDM_PASSWORD_SHIFT8
- 32543400
+ 147156096dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -1092,14 +1092,14 @@
Nine\tCtrl-8: IDM_PASSWORD_SHIFT9
- 15328280
+ 147160200dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -1115,14 +1115,14 @@
Ten\tCtrl-9: IDM_PASSWORD_SHIFT10
- 15377272
+ 147164216dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -1138,14 +1138,14 @@
Eleven\tCtrl-A: IDM_PASSWORD_SHIFT11
- 15618824
+ 147168232dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -1161,14 +1161,14 @@
Twelve\tCtrl-B: IDM_PASSWORD_SHIFT12
- 15290976
+ 147172248dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -1184,14 +1184,14 @@
Thirteen\tCtrl-C: IDM_PASSWORD_SHIFT13
- 32461280
+ 147176232dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -1207,14 +1207,14 @@
Fourteen\tCtrl-D: IDM_PASSWORD_SHIFT14
- 15659448
+ 147180216dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -1230,14 +1230,14 @@
Fifteen\tCtrl-E: IDM_PASSWORD_SHIFT15
- 32575872
+ 147184232dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -1253,14 +1253,14 @@
Sixteen\tCtrl-F: IDM_PASSWORD_SHIFT16
- 32406896
+ 147188216dialog-control-documentmenuitem010
- 15218016
+ 146511296029/8/2005wbMenuItemProxy
@@ -1278,14 +1278,14 @@
Game
- 32410952
+ 147192096dialog-control-documentmenu010
- 15352056
+ 146546600028/8/2005wbMenuProxy
@@ -1293,14 +1293,14 @@
<Any platform>&NTSC (US Version)\tCtrl-N: IDM_GAME_NTSC
- 32677528
+ 147193952dialog-control-documentmenuitem010
- 32410952
+ 147192096028/8/2005wbMenuItemProxy
@@ -1316,14 +1316,14 @@
&PAL (European Version)\tCtrl-L: IDM_GAME_PAL
- 15402656
+ 147197896dialog-control-documentmenuitem010
- 32410952
+ 147192096028/8/2005wbMenuItemProxy
@@ -1340,14 +1340,14 @@
Help
- 15406216
+ 147201712dialog-control-documentmenu010
- 15352056
+ 146546600021/8/2005wbMenuProxy
@@ -1355,14 +1355,14 @@
<Any platform>About: wxID_ABOUT
- 15397872
+ 147203592dialog-control-documentmenuitem010
- 15406216
+ 147201712021/8/2005wbMenuItemProxy
@@ -1380,14 +1380,14 @@
wxBoxSizer V
- 15401608
+ 147207720dialog-control-documentsizer010
- 32386096
+ 146530304021/8/2005wbBoxSizerProxy
@@ -1399,14 +1399,14 @@
<Any platform>wxNotebook: IDN_MPG
- 15409296
+ 147214944dialog-control-documentnotebook010
- 15401608
+ 147207720021/8/2005wbNotebookProxy
@@ -1462,14 +1462,14 @@
wxPanel: IDP_ITEMS
- 15442488
+ 146779136dialog-control-documentpanel010
- 15409296
+ 147214944021/8/2005wbPanelProxy
@@ -1524,14 +1524,14 @@
wxBoxSizer V
- 15440096
+ 146797888dialog-control-documentsizer010
- 15442488
+ 146779136021/8/2005wbBoxSizerProxy
@@ -1551,14 +1551,14 @@
<Any platform>wxBoxSizer H
- 15297432
+ 146805464dialog-control-documentsizer010
- 15440096
+ 146797888021/8/2005wbBoxSizerProxy
@@ -1578,14 +1578,14 @@
<Any platform>wxStaticText: wxID_STATIC
- 15284736
+ 146814592dialog-control-documentstatictext010
- 15297432
+ 146805464021/8/2005wbStaticTextProxy
@@ -1635,21 +1635,91 @@
- wxSpinCtrl: IDSC_ITEMS_MISSILES
- 32572968
+ wxTextCtrl: IDT_ITEMS_MISSILES
+ 146830976
+ dialog-control-document
+
+ textctrl
+ 0
+ 1
+ 0
+ 146805464
+ 0
+ 1/9/2005
+ wbTextCtrlProxy
+ IDT_ITEMS_MISSILES
+ 10118
+ wxTextCtrl
+
+ 0
+ 0
+
+
+
+
+
+ FALSE
+ TRUE
+ <Any platform>
+
+
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+
+ -1
+ -1
+ -1
+ -1
+ Centre
+ Centre
+ 0
+ 5
+ TRUE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+
+
+
+
+ wxSpinButton: IDSB_ITEMS_MISSILES
+ 146851840dialog-control-documentspinctrl010
- 15297432
+ 1468054640
- 21/8/2005
- wbSpinCtrlProxy
- IDSC_ITEMS_MISSILES
- 10043
- wxSpinCtrl
+ 1/9/2005
+ wbSpinButtonProxy
+ IDSB_ITEMS_MISSILES
+ 10096
+ wxSpinButton0255
@@ -1664,7 +1734,9 @@
<Any platform>
- TRUE
+ FALSE
+ TRUE
+ FALSEFALSEFALSEFALSE
@@ -1681,9 +1753,9 @@
CentreCentre0
- 5
+ 2TRUE
- TRUE
+ FALSEFALSEFALSEFALSE
@@ -1693,16 +1765,16 @@
-
+ wxStaticBoxSizer V
- 15356240
+ 146868192dialog-control-documentsizer010
- 15440096
+ 146797888021/8/2005wbStaticBoxSizerProxy
@@ -1728,16 +1800,16 @@
FALSEFALSE<Any platform>
-
+ wxFlexGridSizer
- 15364664
+ 146876768dialog-control-documentsizer010
- 15356240
+ 146868192021/8/2005wbFlexGridSizerProxy
@@ -1760,16 +1832,16 @@
FALSEFALSEFALSE
-
+ wxCheckBox: IDC_ITEMS_MARUMARI
- 15374856
+ 146885704dialog-control-documentcheckbox010
- 15364664
+ 146876768021/8/2005wbCheckBoxProxy
@@ -1813,16 +1885,16 @@
-
+ wxCheckBox: IDC_ITEMS_LONGBEAM
- 15462560
+ 146900440dialog-control-documentcheckbox010
- 15364664
+ 146876768021/8/2005wbCheckBoxProxy
@@ -1866,16 +1938,16 @@
-
+ wxCheckBox: IDC_ITEMS_WAVEBEAM
- 15476192
+ 146914776dialog-control-documentcheckbox010
- 15364664
+ 146876768024/8/2005wbCheckBoxProxy
@@ -1919,16 +1991,16 @@
-
+ wxCheckBox: IDC_ITEMS_ICEBEAM
- 15489872
+ 146954104dialog-control-documentcheckbox010
- 15364664
+ 146876768021/8/2005wbCheckBoxProxy
@@ -1972,16 +2044,16 @@
-
+ wxCheckBox: IDC_ITEMS_BOMBS
- 15507664
+ 146967872dialog-control-documentcheckbox010
- 15364664
+ 146876768021/8/2005wbCheckBoxProxy
@@ -2025,16 +2097,16 @@
-
+ wxCheckBox: IDC_ITEMS_HIGHJUMPBOOTS
- 15521376
+ 146982144dialog-control-documentcheckbox010
- 15364664
+ 146876768021/8/2005wbCheckBoxProxy
@@ -2078,16 +2150,16 @@
-
+ wxCheckBox: IDC_ITEMS_SCREWATTACK
- 15535096
+ 146996400dialog-control-documentcheckbox010
- 15364664
+ 146876768021/8/2005wbCheckBoxProxy
@@ -2131,16 +2203,16 @@
-
+ wxCheckBox: IDC_ITEMS_VARIA
- 15548784
+ 147010656dialog-control-documentcheckbox010
- 15364664
+ 146876768021/8/2005wbCheckBoxProxy
@@ -2186,16 +2258,16 @@
-
+ wxStaticBoxSizer H
- 15296056
+ 146876496dialog-control-documentsizer010
- 15440096
+ 146797888021/8/2005wbStaticBoxSizerProxy
@@ -2221,16 +2293,16 @@
FALSEFALSE<Any platform>
-
+ wxStaticBoxSizer V
- 15573328
+ 147031496dialog-control-documentsizer010
- 15296056
+ 146876496021/8/2005wbStaticBoxSizerProxy
@@ -2256,16 +2328,16 @@
FALSEFALSE<Any platform>
-
+ wxCheckBox: IDC_ITEMS_MC_BS1
- 15584312
+ 147042624dialog-control-documentcheckbox010
- 15573328
+ 147031496021/8/2005wbCheckBoxProxy
@@ -2309,16 +2381,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_BS2
- 15602296
+ 147057520dialog-control-documentcheckbox010
- 15573328
+ 147031496021/8/2005wbCheckBoxProxy
@@ -2363,16 +2435,16 @@
-
+ wxStaticBoxSizer V
- 15615856
+ 147071320dialog-control-documentsizer010
- 15296056
+ 146876496021/8/2005wbStaticBoxSizerProxy
@@ -2398,16 +2470,16 @@
FALSEFALSE<Any platform>
-
+ wxCheckBox: IDC_ITEMS_MC_KL1
- 15657472
+ 147080488dialog-control-documentcheckbox010
- 15615856
+ 147071320021/8/2005wbCheckBoxProxy
@@ -2451,16 +2523,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_KL2
- 32420424
+ 147095200dialog-control-documentcheckbox010
- 15615856
+ 147071320021/8/2005wbCheckBoxProxy
@@ -2504,16 +2576,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_KL3
- 32434960
+ 147109536dialog-control-documentcheckbox010
- 15615856
+ 147071320021/8/2005wbCheckBoxProxy
@@ -2557,16 +2629,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_KL4
- 32453576
+ 147042392dialog-control-documentcheckbox010
- 15615856
+ 147071320021/8/2005wbCheckBoxProxy
@@ -2611,16 +2683,16 @@
-
+ wxStaticBoxSizer V
- 32472112
+ 147030976dialog-control-documentsizer010
- 15296056
+ 146876496021/8/2005wbStaticBoxSizerProxy
@@ -2646,16 +2718,16 @@
FALSEFALSE<Any platform>
-
+ wxFlexGridSizer
- 32480608
+ 146586264dialog-control-documentsizer010
- 32472112
+ 147030976021/8/2005wbFlexGridSizerProxy
@@ -2678,16 +2750,16 @@
FALSEFALSEFALSE
-
+ wxCheckBox: IDC_ITEMS_MC_NF1
- 32490440
+ 146596136dialog-control-documentcheckbox010
- 32480608
+ 146586264021/8/2005wbCheckBoxProxy
@@ -2731,16 +2803,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_NF4
- 32504968
+ 146610560dialog-control-documentcheckbox010
- 32480608
+ 146586264021/8/2005wbCheckBoxProxy
@@ -2784,16 +2856,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_NF7
- 32519344
+ 146624816dialog-control-documentcheckbox010
- 32480608
+ 146586264021/8/2005wbCheckBoxProxy
@@ -2837,16 +2909,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_NF10
- 32537856
+ 146639072dialog-control-documentcheckbox010
- 32480608
+ 146586264021/8/2005wbCheckBoxProxy
@@ -2890,16 +2962,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_NF2
- 32556344
+ 146653368dialog-control-documentcheckbox010
- 32480608
+ 146586264021/8/2005wbCheckBoxProxy
@@ -2943,16 +3015,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_NF5
- 32595344
+ 146667616dialog-control-documentcheckbox010
- 32480608
+ 146586264021/8/2005wbCheckBoxProxy
@@ -2996,16 +3068,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_NF8
- 32609720
+ 146681912dialog-control-documentcheckbox010
- 32480608
+ 146586264021/8/2005wbCheckBoxProxy
@@ -3049,16 +3121,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_NF11
- 32624136
+ 146696176dialog-control-documentcheckbox010
- 32480608
+ 146586264021/8/2005wbCheckBoxProxy
@@ -3102,16 +3174,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_NF3
- 32638560
+ 146710952dialog-control-documentcheckbox010
- 32480608
+ 146586264021/8/2005wbCheckBoxProxy
@@ -3155,16 +3227,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_NF6
- 32652992
+ 146725288dialog-control-documentcheckbox010
- 32480608
+ 146586264021/8/2005wbCheckBoxProxy
@@ -3208,16 +3280,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_NF9
- 32667384
+ 146739584dialog-control-documentcheckbox010
- 32480608
+ 146586264021/8/2005wbCheckBoxProxy
@@ -3261,16 +3333,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_NF12
- 36319016
+ 146753928dialog-control-documentcheckbox010
- 32480608
+ 146586264021/8/2005wbCheckBoxProxy
@@ -3316,16 +3388,16 @@
-
+ wxStaticBoxSizer V
- 36333488
+ 146595856dialog-control-documentsizer010
- 15296056
+ 146876496021/8/2005wbStaticBoxSizerProxy
@@ -3351,16 +3423,16 @@
FALSEFALSE<Any platform>
-
+ wxCheckBox: IDC_ITEMS_MC_RL1
- 36341752
+ 156122896dialog-control-documentcheckbox010
- 36333488
+ 146595856021/8/2005wbCheckBoxProxy
@@ -3404,16 +3476,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_RL2
- 36355352
+ 156137232dialog-control-documentcheckbox010
- 36333488
+ 146595856021/8/2005wbCheckBoxProxy
@@ -3457,16 +3529,16 @@
-
+ wxCheckBox: IDC_ITEMS_MC_RL3
- 36369824
+ 156151528dialog-control-documentcheckbox010
- 36333488
+ 146595856021/8/2005wbCheckBoxProxy
@@ -3512,16 +3584,16 @@
-
+ wxStaticBoxSizer V
- 36384360
+ 156165768dialog-control-documentsizer010
- 15440096
+ 146797888021/8/2005wbStaticBoxSizerProxy
@@ -3547,16 +3619,16 @@
FALSEFALSE<Any platform>
-
+ wxFlexGridSizer
- 36392624
+ 156174336dialog-control-documentsizer010
- 36384360
+ 156165768021/8/2005wbFlexGridSizerProxy
@@ -3579,16 +3651,16 @@
FALSEFALSEFALSE
-
+ wxCheckBox: IDC_ITEMS_ET_BS1
- 36400680
+ 156182552dialog-control-documentcheckbox010
- 36392624
+ 156174336021/8/2005wbCheckBoxProxy
@@ -3632,16 +3704,16 @@
-
+ wxCheckBox: IDC_ITEMS_ET_BS2
- 36415360
+ 156197296dialog-control-documentcheckbox010
- 36392624
+ 156174336021/8/2005wbCheckBoxProxy
@@ -3685,16 +3757,16 @@
-
+ wxCheckBox: IDC_ITEMS_ET_BS3
- 36429896
+ 156211616dialog-control-documentcheckbox010
- 36392624
+ 156174336021/8/2005wbCheckBoxProxy
@@ -3738,16 +3810,16 @@
-
+ wxCheckBox: IDC_ITEMS_ET_NF
- 36444400
+ 156225968dialog-control-documentcheckbox010
- 36392624
+ 156174336021/8/2005wbCheckBoxProxy
@@ -3791,16 +3863,16 @@
-
+ wxCheckBox: IDC_ITEMS_ET_KL
- 36458896
+ 156239360dialog-control-documentcheckbox010
- 36392624
+ 156174336021/8/2005wbCheckBoxProxy
@@ -3844,16 +3916,16 @@
-
+ wxCheckBox: IDC_ITEMS_ET_KL_KRAID
- 36473392
+ 156253672dialog-control-documentcheckbox010
- 36392624
+ 156174336021/8/2005wbCheckBoxProxy
@@ -3897,16 +3969,16 @@
-
+ wxCheckBox: IDC_ITEMS_ET_RL
- 36487888
+ 156268168dialog-control-documentcheckbox010
- 36392624
+ 156174336021/8/2005wbCheckBoxProxy
@@ -3950,16 +4022,16 @@
-
+ wxCheckBox: IDC_ITEMS_ET_RL_RIDLEY
- 36502400
+ 156282544dialog-control-documentcheckbox010
- 36392624
+ 156174336021/8/2005wbCheckBoxProxy
@@ -4007,16 +4079,16 @@
-
+ wxPanel: IDP_MISC
- 15439024
+ 156122152dialog-control-documentpanel010
- 15409296
+ 147214944021/8/2005wbPanelProxy
@@ -4069,16 +4141,16 @@
-
+ wxBoxSizer V
- 36528960
+ 156310992dialog-control-documentsizer010
- 15439024
+ 156122152021/8/2005wbBoxSizerProxy
@@ -4096,16 +4168,16 @@
FALSEFALSE<Any platform>
-
+ wxBoxSizer H
- 36536376
+ 156317632dialog-control-documentsizer010
- 36528960
+ 156310992021/8/2005wbBoxSizerProxy
@@ -4123,16 +4195,16 @@
FALSEFALSE<Any platform>
-
+ wxStaticText: wxID_STATIC
- 36545768
+ 156325760dialog-control-documentstatictext010
- 36536376
+ 156317632021/8/2005wbStaticTextProxy
@@ -4181,16 +4253,16 @@
-
+ wxTextCtrl: IDT_MISC_GAMETIME
- 36562824
+ 156342536dialog-control-documenttextctrl010
- 36536376
+ 156317632021/8/2005wbTextCtrlProxy
@@ -4251,16 +4323,16 @@
-
+ wxStaticText: IDST_MISC_GAMETIME
- 36583552
+ 156362912dialog-control-documentstatictext010
- 36536376
+ 156317632028/8/2005wbStaticTextProxy
@@ -4310,16 +4382,16 @@
-
+ wxStaticBoxSizer H
- 36599704
+ 156378680dialog-control-documentsizer010
- 36528960
+ 156310992021/8/2005wbStaticBoxSizerProxy
@@ -4345,16 +4417,16 @@
FALSEFALSE<Any platform>
-
+ wxStaticBoxSizer V
- 36608296
+ 156387376dialog-control-documentsizer010
- 36599704
+ 156378680021/8/2005wbStaticBoxSizerProxy
@@ -4380,16 +4452,16 @@
FALSEFALSE<Any platform>
-
+ wxCheckBox: IDC_MISC_DOORS_BS_LONGBEAM
- 36619960
+ 156397928dialog-control-documentcheckbox010
- 36608296
+ 156387376021/8/2005wbCheckBoxProxy
@@ -4433,16 +4505,16 @@
-
+ wxCheckBox: IDC_MISC_DOORS_BS_TOURIANBRIDGE
- 36634680
+ 156412208dialog-control-documentcheckbox010
- 36608296
+ 156387376021/8/2005wbCheckBoxProxy
@@ -4486,16 +4558,16 @@
-
+ wxCheckBox: IDC_MISC_DOORS_BS_BOMBS
- 36649216
+ 156426504dialog-control-documentcheckbox010
- 36608296
+ 156387376021/8/2005wbCheckBoxProxy
@@ -4539,16 +4611,16 @@
-
+ wxCheckBox: IDC_MISC_DOORS_BS_ICEBEAM
- 36663720
+ 156441216dialog-control-documentcheckbox010
- 36608296
+ 156387376021/8/2005wbCheckBoxProxy
@@ -4592,16 +4664,16 @@
-
+ wxCheckBox: IDC_MISC_DOORS_BS_VARIA
- 36678216
+ 156455640dialog-control-documentcheckbox010
- 36608296
+ 156387376021/8/2005wbCheckBoxProxy
@@ -4646,16 +4718,16 @@
-
+ wxStaticBoxSizer V
- 36692704
+ 156469464dialog-control-documentsizer010
- 36599704
+ 156378680021/8/2005wbStaticBoxSizerProxy
@@ -4681,16 +4753,16 @@
FALSEFALSE<Any platform>
-
+ wxCheckBox: IDC_MISC_DOORS_KL1
- 36701696
+ 156478480dialog-control-documentcheckbox010
- 36692704
+ 156469464021/8/2005wbCheckBoxProxy
@@ -4734,16 +4806,16 @@
-
+ wxCheckBox: IDC_MISC_DOORS_KL2
- 36716368
+ 156493176dialog-control-documentcheckbox010
- 36692704
+ 156469464021/8/2005wbCheckBoxProxy
@@ -4787,16 +4859,16 @@
-
+ wxCheckBox: IDC_MISC_DOORS_KL3
- 36730864
+ 156507000dialog-control-documentcheckbox010
- 36692704
+ 156469464021/8/2005wbCheckBoxProxy
@@ -4840,16 +4912,16 @@
-
+ wxCheckBox: IDC_MISC_DOORS_KL4
- 36745376
+ 156521320dialog-control-documentcheckbox010
- 36692704
+ 156469464021/8/2005wbCheckBoxProxy
@@ -4893,16 +4965,16 @@
-
+ wxCheckBox: IDC_MISC_DOORS_KL_KRAID
- 36759912
+ 156535728dialog-control-documentcheckbox010
- 36692704
+ 156469464021/8/2005wbCheckBoxProxy
@@ -4947,16 +5019,16 @@
-
+ wxStaticBoxSizer V
- 36774360
+ 156341856dialog-control-documentsizer010
- 36599704
+ 156378680021/8/2005wbStaticBoxSizerProxy
@@ -4982,16 +5054,16 @@
FALSEFALSE<Any platform>
-
+ wxCheckBox: IDC_MISC_DOORS_NF_HIGHJUMPBOOTS
- 36783352
+ 156558704dialog-control-documentcheckbox010
- 36774360
+ 156341856021/8/2005wbCheckBoxProxy
@@ -5035,16 +5107,16 @@
-
+ wxCheckBox: IDC_MISC_DOORS_NF_SCREWATTACK
- 36798064
+ 156573440dialog-control-documentcheckbox010
- 36774360
+ 156341856021/8/2005wbCheckBoxProxy
@@ -5088,16 +5160,16 @@
-
+ wxCheckBox: IDC_MISC_DOORS_NF_WAVEBEAM
- 36812560
+ 156587760dialog-control-documentcheckbox010
- 36774360
+ 156341856021/8/2005wbCheckBoxProxy
@@ -5141,16 +5213,16 @@
-
+ wxCheckBox: IDC_MISC_DOORS_NF_ICEBEAM
- 36827120
+ 156602080dialog-control-documentcheckbox010
- 36774360
+ 156341856021/8/2005wbCheckBoxProxy
@@ -5195,16 +5267,16 @@
-
+ wxStaticBoxSizer V
- 36841576
+ 156615904dialog-control-documentsizer010
- 36599704
+ 156378680021/8/2005wbStaticBoxSizerProxy
@@ -5230,16 +5302,16 @@
FALSEFALSE<Any platform>
-
+ wxCheckBox: IDC_MISC_DOORS_RL
- 36850560
+ 156625160dialog-control-documentcheckbox010
- 36841576
+ 156615904021/8/2005wbCheckBoxProxy
@@ -5283,16 +5355,16 @@
-
+ wxCheckBox: IDC_MISC_DOORS_RL_RIDLEY
- 36865240
+ 156639000dialog-control-documentcheckbox010
- 36841576
+ 156615904021/8/2005wbCheckBoxProxy
@@ -5337,16 +5409,16 @@
-
+ wxStaticBoxSizer V
- 36879696
+ 156624600dialog-control-documentsizer010
- 36599704
+ 156378680021/8/2005wbStaticBoxSizerProxy
@@ -5372,16 +5444,16 @@
FALSEFALSE<Any platform>
-
+ wxCheckBox: IDC_MISC_DOORS_T1
- 36888688
+ 156662184dialog-control-documentcheckbox010
- 36879696
+ 156624600021/8/2005wbCheckBoxProxy
@@ -5425,16 +5497,16 @@
-
+ wxCheckBox: IDC_MISC_DOORS_T2
- 36903464
+ 156676456dialog-control-documentcheckbox010
- 36879696
+ 156624600021/8/2005wbCheckBoxProxy
@@ -5478,16 +5550,16 @@
-
+ wxCheckBox: IDC_MISC_DOORS_T3
- 36918176
+ 156690656dialog-control-documentcheckbox010
- 36879696
+ 156624600021/8/2005wbCheckBoxProxy
@@ -5533,16 +5605,16 @@
-
+ wxBoxSizer H
- 36932856
+ 156704896dialog-control-documentsizer010
- 36528960
+ 156310992021/8/2005wbBoxSizerProxy
@@ -5560,16 +5632,16 @@
FALSEFALSE<Any platform>
-
+ wxRadioBox: IDRB_MISC_START
- 36938816
+ 156711312dialog-control-documentradiobox010
- 36932856
+ 156704896021/8/2005wbRadioBoxProxy
@@ -5612,16 +5684,16 @@
-
+ wxStaticBoxSizer V
- 36952336
+ 156725080dialog-control-documentsizer010
- 36932856
+ 156704896021/8/2005wbStaticBoxSizerProxy
@@ -5647,16 +5719,16 @@
FALSEFALSE<Any platform>
-
+ wxCheckBox: IDC_MISC_STATUE_KRAID
- 36962360
+ 156734608dialog-control-documentcheckbox010
- 36952336
+ 156725080021/8/2005wbCheckBoxProxy
@@ -5700,16 +5772,16 @@
-
+ wxCheckBox: IDC_MISC_STATUE_RIDLEY
- 36977032
+ 156749320dialog-control-documentcheckbox010
- 36952336
+ 156725080021/8/2005wbCheckBoxProxy
@@ -5754,16 +5826,16 @@
-
+ wxRadioBox: IDRB_MISC_ARMOR
- 36991624
+ 156763368dialog-control-documentradiobox010
- 36932856
+ 156704896021/8/2005wbRadioBoxProxy
@@ -5806,16 +5878,16 @@
-
+ wxStaticBoxSizer V
- 37004968
+ 156661912dialog-control-documentsizer010
- 36932856
+ 156704896021/8/2005wbStaticBoxSizerProxy
@@ -5841,16 +5913,16 @@
FALSEFALSE<Any platform>
-
+ wxCheckBox: IDC_MISC_ZEBETITE1
- 37015040
+ 156785480dialog-control-documentcheckbox010
- 37004968
+ 156661912021/8/2005wbCheckBoxProxy
@@ -5894,16 +5966,16 @@
-
+ wxCheckBox: IDC_MISC_ZEBETITE2
- 37029960
+ 156799800dialog-control-documentcheckbox010
- 37004968
+ 156661912021/8/2005wbCheckBoxProxy
@@ -5947,16 +6019,16 @@
-
+ wxCheckBox: IDC_MISC_ZEBETITE3
- 37044664
+ 156814080dialog-control-documentcheckbox010
- 37004968
+ 156661912021/8/2005wbCheckBoxProxy
@@ -6000,16 +6072,16 @@
-
+ wxCheckBox: IDC_MISC_ZEBETITE4
- 37059408
+ 156828344dialog-control-documentcheckbox010
- 37004968
+ 156661912021/8/2005wbCheckBoxProxy
@@ -6053,16 +6125,16 @@
-
+ wxCheckBox: IDC_MISC_ZEBETITE5
- 37074112
+ 156843096dialog-control-documentcheckbox010
- 37004968
+ 156661912021/8/2005wbCheckBoxProxy
@@ -6107,16 +6179,16 @@
-
+ wxStaticBoxSizer V
- 37088672
+ 156856992dialog-control-documentsizer010
- 36932856
+ 156704896021/8/2005wbStaticBoxSizerProxy
@@ -6142,16 +6214,16 @@
FALSEFALSE<Any platform>
-
+ wxCheckBox: IDC_MISC_BOSS_KRAID
- 37097704
+ 156866400dialog-control-documentcheckbox010
- 37088672
+ 156856992021/8/2005wbCheckBoxProxy
@@ -6195,16 +6267,16 @@
-
+ wxCheckBox: IDC_MISC_BOSS_RIDLEY
- 37112624
+ 156881112dialog-control-documentcheckbox010
- 37088672
+ 156856992021/8/2005wbCheckBoxProxy
@@ -6248,16 +6320,16 @@
-
+ wxCheckBox: IDC_MISC_BOSS_MOTHERBRAIN
- 37127336
+ 156895464dialog-control-documentcheckbox010
- 37088672
+ 156856992021/8/2005wbCheckBoxProxy
@@ -6305,16 +6377,16 @@
-
+ wxPanel: IDP_RAW
- 15281008
+ 146778784dialog-control-documentpanel010
- 15409296
+ 147214944021/8/2005wbPanelProxy
@@ -6367,16 +6439,16 @@
-
+ wxBoxSizer V
- 37156080
+ 156923600dialog-control-documentsizer010
- 15281008
+ 146778784021/8/2005wbBoxSizerProxy
@@ -6394,16 +6466,16 @@
FALSEFALSE<Any platform>
-
+ wxBoxSizer H
- 37162432
+ 156930320dialog-control-documentsizer010
- 37156080
+ 156923600026/8/2005wbBoxSizerProxy
@@ -6421,16 +6493,16 @@
FALSEFALSE<Any platform>
-
+ wxStaticText: wxID_STATIC
- 37171000
+ 156938208dialog-control-documentstatictext010
- 37162432
+ 156930320026/8/2005wbStaticTextProxy
@@ -6479,22 +6551,92 @@
-
- wxSpinCtrl: IDSC_RAW_SHIFT
- 37187472
+
+ wxTextCtrl: IDT_RAW_SHIFT
+ 156954936
+ dialog-control-document
+
+ textctrl
+ 0
+ 1
+ 0
+ 156930320
+ 0
+ 1/9/2005
+ wbTextCtrlProxy
+ IDT_RAW_SHIFT
+ 10119
+ wxTextCtrl
+
+ 0
+ 0
+
+
+
+
+
+ FALSE
+ TRUE
+ <Any platform>
+
+
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+
+ -1
+ -1
+ -1
+ -1
+ Centre
+ Centre
+ 0
+ 5
+ TRUE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+ FALSE
+
+
+
+
+ wxSpinButton: IDSB_RAW_SHIFT
+ 156975200dialog-control-documentspinctrl010
- 37162432
+ 1569303200
- 26/8/2005
- wbSpinCtrlProxy
- IDSC_RAW_SHIFT
- 10096
- wxSpinCtrl
+ 1/9/2005
+ wbSpinButtonProxy
+ IDSB_RAW_SHIFT
+ 10120
+ wxSpinButton0255
@@ -6509,7 +6651,9 @@
<Any platform>
- TRUE
+ FALSE
+ TRUE
+ FALSEFALSEFALSEFALSE
@@ -6526,9 +6670,9 @@
CentreCentre0
- 5
+ 2TRUE
- TRUE
+ FALSEFALSEFALSEFALSE
@@ -6538,16 +6682,16 @@
-
+ wxBoxSizer V
- 37203464
+ 156991568dialog-control-documentsizer010
- 37156080
+ 156923600026/8/2005wbBoxSizerProxy
@@ -6565,16 +6709,16 @@
FALSEFALSE<Any platform>
-
+ wxStaticText: wxID_STATIC
- 37210136
+ 156997720dialog-control-documentstatictext010
- 37203464
+ 156991568026/8/2005wbStaticTextProxy
@@ -6623,16 +6767,16 @@
-
+ wxCheckListBox: IDCLB_RAW_BITS
- 37226800
+ 157014328dialog-control-documentlistbox010
- 37203464
+ 156991568026/8/2005wbCheckListBoxProxy
@@ -6688,16 +6832,16 @@
-
+ wxBoxSizer H
- 36535208
+ 156865632dialog-control-documentsizer010
- 15401608
+ 147207720021/8/2005wbBoxSizerProxy
@@ -6706,25 +6850,25 @@
CentreCentre0
- 0
- TRUE
- TRUE
- TRUE
+ 2
+ FALSE
+ FALSE
+ FALSETRUEFALSEFALSEFALSE<Any platform>
-
+ wxStaticText: wxID_STATIC
- 37247376
+ 157036864dialog-control-documentstatictext010
- 36535208
+ 156865632021/8/2005wbStaticTextProxy
@@ -6773,16 +6917,16 @@
-
+ wxBoxSizer V
- 37262608
+ 157050376dialog-control-documentsizer010
- 36535208
+ 156865632021/8/2005wbBoxSizerProxy
@@ -6800,16 +6944,16 @@
FALSEFALSE<Any platform>
-
+ wxPanel: IDP_PASSWORD
- 37268880
+ 157056560dialog-control-documentpanel010
- 37262608
+ 157050376027/8/2005wbPanelProxy
@@ -6861,16 +7005,16 @@
-
+ wxBoxSizer H
- 37284872
+ 157073904dialog-control-documentsizer010
- 37262608
+ 157050376027/8/2005wbBoxSizerProxy
@@ -6888,16 +7032,16 @@
FALSEFALSE<Any platform>
-
+ wxTextCtrl: IDT_PASSWORD
- 37293032
+ 157081592dialog-control-documenttextctrl010
- 37284872
+ 157073904027/8/2005wbTextCtrlProxy
@@ -6911,7 +7055,7 @@
- 10, wxMODERN, wxNORMAL, wxNORMAL
+ 11, wxMODERN, wxNORMAL, wxNORMALFALSETRUE<Any platform>
@@ -6958,16 +7102,16 @@
-
+ wxButton: IDB_CHECKSUM
- 37313664
+ 157102528dialog-control-documentdialogcontrol010
- 37284872
+ 157073904027/8/2005wbButtonProxy
@@ -7015,16 +7159,16 @@
-
+ wxStatusBar: IDS_MPG
- 32449240
+ 157116208dialog-control-documentstatusbar010
- 32386096
+ 146530304025/8/2005wbStatusBarProxy
@@ -7073,42 +7217,42 @@
-
+ Sources
- 15174856
+ 157116040html-documentsourcesfolder110
- 15125880
+ 1464029681
-
+ mpg.rc
- 15156416
+ 146530712source-editor-documentmpg.rcsource-editor001
- 15174856
+ 157116040021/8/2005
-
+ Images
- 15208048
+ 157129024html-documentbitmapsfolder110
- 15125880
+ 1464029681
diff --git a/Doxyfile b/Doxyfile
index fed8ca8..9e09020 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -4,7 +4,7 @@
# Project related configuration options
#---------------------------------------------------------------------------
PROJECT_NAME = "Metroid Password Generator"
-PROJECT_NUMBER = 0.92
+PROJECT_NUMBER = 0.93
OUTPUT_DIRECTORY = apidocs
CREATE_SUBDIRS = NO
OUTPUT_LANGUAGE = English
diff --git a/Info.plist b/Info.plist
index 922dd79..c7bd569 100644
--- a/Info.plist
+++ b/Info.plist
@@ -24,16 +24,16 @@
????CFBundleVersion
- 0.92
+ 0.93CFBundleShortVersionString
- 0.92
+ 0.93CFBundleGetInfoString
- mpg 0.92, (C) 2005 John Ratliff
+ mpg 0.93, (C) 2005 John RatliffCFBundleLongVersionString
- 0.92, (C) 2005 John Ratliff
+ 0.93, (C) 2005 John RatliffNSHumanReadableCopyrightCopyright 2005 John Ratliff
diff --git a/configure b/configure
index d5a20dc..3f5cf83 100644
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59 for mpg 0.92.
+# Generated by GNU Autoconf 2.59 for mpg 0.93.
#
# Report bugs to .
#
@@ -269,8 +269,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package.
PACKAGE_NAME='mpg'
PACKAGE_TARNAME='mpg'
-PACKAGE_VERSION='0.92'
-PACKAGE_STRING='mpg 0.92'
+PACKAGE_VERSION='0.93'
+PACKAGE_STRING='mpg 0.93'
PACKAGE_BUGREPORT='webmaster@technoplaza.net'
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar build build_cpu build_vendor build_os host host_cpu host_vendor host_os WINDOWS_TRUE WINDOWS_FALSE CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE WX_CONFIG_PATH WX_CPPFLAGS WX_CFLAGS WX_CXXFLAGS WX_CFLAGS_ONLY WX_CXXFLAGS_ONLY WX_LIBS WX_LIBS_STATIC WX_VERSION WX_INCLUDES LIBOBJS LTLIBOBJS'
@@ -738,7 +738,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures mpg 0.92 to adapt to many kinds of systems.
+\`configure' configures mpg 0.93 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -804,7 +804,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of mpg 0.92:";;
+ short | recursive ) echo "Configuration of mpg 0.93:";;
esac
cat <<\_ACEOF
@@ -930,7 +930,7 @@ fi
test -n "$ac_init_help" && exit 0
if $ac_init_version; then
cat <<\_ACEOF
-mpg configure 0.92
+mpg configure 0.93
generated by GNU Autoconf 2.59
Copyright (C) 2003 Free Software Foundation, Inc.
@@ -944,7 +944,7 @@ cat >&5 <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by mpg $as_me 0.92, which was
+It was created by mpg $as_me 0.93, which was
generated by GNU Autoconf 2.59. Invocation command line was
$ $0 $@
@@ -1593,7 +1593,7 @@ fi
# Define the identity of the package.
PACKAGE='mpg'
- VERSION='0.92'
+ VERSION='0.93'
cat >>confdefs.h <<_ACEOF
@@ -3262,7 +3262,7 @@ _ASBOX
} >&5
cat >&5 <<_CSEOF
-This file was extended by mpg $as_me 0.92, which was
+This file was extended by mpg $as_me 0.93, which was
generated by GNU Autoconf 2.59. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -3325,7 +3325,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF
ac_cs_version="\\
-mpg config.status 0.92
+mpg config.status 0.93
configured by $0, generated by GNU Autoconf 2.59,
with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
diff --git a/configure.ac b/configure.ac
index 9886ae1..a91ec60 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,5 +1,5 @@
dnl Initialize autoconf
-AC_INIT([mpg], [0.92], [webmaster@technoplaza.net])
+AC_INIT([mpg], [0.93], [webmaster@technoplaza.net])
dnl require autoconf >= 2.59
AC_PREREQ([2.59])
diff --git a/docs/mpg.txt b/docs/mpg.txt
index df5b93f..be7f65a 100644
--- a/docs/mpg.txt
+++ b/docs/mpg.txt
@@ -1,5 +1,5 @@
--------------------------------------------------------------------------------
-| Metroid Password Generator 0.92
+| Metroid Password Generator 0.93
| Copyright (C) 2005 emuWorks http://games.technoplaza.net/
| by John Ratliff [ webmaster AT technoplaza DOT net ]
--------------------------------------------------------------------------------
@@ -36,81 +36,78 @@
--------------------------------------------------------------------------------
Welcome to Metroid Password Generator. As you may have guessed, this program
- will help generate passwords for Metroid, the first game in the Metroid series
+ 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 its disk).
+ the FDS and saved progress on disk).
- But we do so much more than just generate passwords. We can also decode
+ 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 all kinds of other fun.
+ 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
+ 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 my program does.
+ programs that work on Windows, Linux, and Mac OS X, which mpg does.
- Second, neither of their programs has what I would consider a great GUI
+ 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 the listbox to find which bits to change to get the password you
+ 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, even though he has a customized text control to add spaces
- between password segments. I will praise him for his custom text control
- though, as it's the one thing I want that I don't have. It's on my TODO list,
- but I didn't get around to it, and I felt like releasing the program without
- it. Finally, even though you can edit the raw password data, you can't change
- the shift byte.
-
- metpass is a little nicer for what it does. It has an interface that looks
- like Metroid. This inspired me to put in the custom password panel which
- displays the password 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. Second, 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.
- Finally, the most damning 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, so I did.
-
- Third, SnoBro's list 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 -- Thanks
- SnoBro). I have figured out what 116 of the 128 bits mean, borrowing three
- bits from SnoBro's list (the reset bit, mother brain's death, and samus
- without her swimsuit). By constract, SnoBro has 72/128 bits defined.
-
- Finally, I do something that neither program does. Organization of the GUI.
+ 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 each specific thing, but it's hard to specify which
- energy tank or missile container or red door you're talking about without a
- good point of refernece, and there aren't any public maps I could find that
- list information like that. I have been as specific as I could be.
+ 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 who I could never have done the work
- I did. I am not putting them down, rather, I am standing on the shoulders of
- giants. The fact that I think my program is better (and maybe you won't think
- so, but if it is) is a testament to their pioneering efforts.
+ 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
--------------------------------------------------------------------------------
If you are not using a binary distribution (Binaries are provided for Windows,
- Linux GTK+ 2.0, and Mac OS X), then you will need to compile the source. Or
- maybe you just want to. In either case, it should be fairly simple. First,
+ Linux GTK+, and Mac OS X), then you will need to compile the source. Or maybe
+ you just want to. In either case, it should be fairly simple. First, here are
the prerequisites:
- An ISO compliant C++ compiler. I use g++ 3.4.2.
- wxWidgets >= 2.6.1. I use wxWidgets 2.6.2. http://www.wxwidgets.org
+ An ISO compliant C++ compiler. I use g++ (3.3 or higher is recommended).
+ wxWidgets >= 2.6. I use wxWidgets 2.6.2. http://www.wxwidgets.org
I use the GNU autoconf tools to handle Makefiles, so if you have these things,
you can probably do
@@ -118,7 +115,7 @@
./configure && make
In Windows, you can use mingw and msys to obtain a unix development
- environment. This is how I built the windows version.
+ environment. This is how I built the windows binary.
--------------------------------------------------------------------------------
| 3.0 Using The Program
@@ -132,32 +129,33 @@
--------------------------------------------------------------------------------
When you start the program, it will bring up a window full of check boxes and
- text controls and other fun widgets.
+ 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
+ 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 count.
+ 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. Because text controls are hard to validate this way, it is possible to
- enter invalid input. Invalid input will never be used, but it can be entered.
- I tried hard to prevent this, but in the end was unsuccessful. Just remember
- that the missile count ranges from 0 to 255. 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.
-
- The second tab, labelled 'Misc' contains all the other settings in Metroid.
- This includes the game time, which doors are open (red and yellow doors, that
- is), 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.
+ 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
@@ -176,13 +174,13 @@
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 is always triggered as the
- final scanline is written. If that made sense to you, good; if not, then
- forget it and read the next paragraph instead.
+ 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 version, there are two
+ 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
- 60Hz, or 60 frames per second, because the US television signal runs at that
+ 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 =
@@ -191,6 +189,9 @@
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.
--------------------------------------------------------------------------------
@@ -198,11 +199,10 @@
--------------------------------------------------------------------------------
To decode a password, simply enter it in the text control at the bottom
- under the Metroid password representation. You will need to separate the the
- four segments with spaces, as is done in the default 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.
+ 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
@@ -213,39 +213,40 @@
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 the Ice Beam) in the inventory is one such password. It also has
- a missile inventory greater than its carrying capacity.
+ 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 in 3.5 Checksum Fixing.
+ 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
+ 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.
+ 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
+ aren't stricly valid in Metroid (having items without removing them for
instance).
- You can also change the shift byte value here. It's purpose will be discussed
- in the 3.4 The Shift Byte.
+ 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. I
- guess they wanted to encrypt the passwords. But they didn't do a very good
- job, because SnoBro figured it out, and through him, now I understand it, too.
+ 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 value will alter the password significantly.
+ 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,
@@ -256,7 +257,7 @@
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 value to get an encoded password.
+ byte to get an encoded password.
--------------------------------------------------------------------------------
| 3.5 Checksum Fixing
@@ -266,11 +267,11 @@
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, er, I mean testing my code.
+ 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 (which odds are it won't be),
+ 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.
@@ -280,48 +281,51 @@
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
+ 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.
+ "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
- other letters. If you want spaces, blanks can be used instead. Blanks are
- where there is no character between two other characters. Metroid treats
- blanks as zeroes, but spaces are much different. You cannot put a blank in 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.
+ 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 bit is
+ 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 value. Since there are four
- bits, it gives 16 possible values.
+ 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 value onto an existing password which is what happens when you
- change the shift byte in this program, it decodes the password you gave it
- using each of the 16 possible shift values, and that becomes your data.
- Because metpass changes the shift value and decodes a new password every time,
- you get different data depending upon the shift value.
+ 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 value yourself. This
+ 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.
+ 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
+ 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 fixed checksum, it becomes "ThisIs MyRock inPass wordHT".
The 22 character's low four bits are the high four bits of the shift byte.
- There are too many possibilities to list here, so if you want to use more than
- the 'simple 16', you'll have to figure it out yourself.
+ 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
@@ -337,15 +341,15 @@
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 without using user-created passwords), all the missile containers and 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.
+ 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 spacesuit 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
+ (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
@@ -354,18 +358,19 @@
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 go 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.
+ 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 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.
+ 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
@@ -373,7 +378,7 @@
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
+ 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
@@ -381,9 +386,9 @@
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.
+ 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
@@ -406,13 +411,13 @@
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.
+ 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 byte 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 use the password.
+ 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
@@ -434,7 +439,7 @@
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.
+ 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
@@ -446,15 +451,15 @@
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.
+ 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)
+ 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 shame (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.
@@ -471,8 +476,8 @@
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 put all ten including the swimsuit endings since most
- people think there are only five endings anyway.
+ 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
@@ -509,12 +514,12 @@
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 value.
+ 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 value to see if you get a
- valid password with the new shift value.
+ 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.
@@ -539,7 +544,7 @@
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 equivalent functionality.
+ 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,
@@ -553,35 +558,42 @@
| 4.0 Known Bugs and Issues
--------------------------------------------------------------------------------
- There are no known bugs at this time. :-)
+ 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 two
- affected controls are the game time, and the password text.
+ 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 using wxGTK, the display takes up significantly more space than it
- does on Windows. 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 Windows and Linux GTK under 800x600, but GTK just
- takes up too much space.
+ 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, the Spin Control text boxes are a bit annoying. If you delete all
- the text, it goes back to being 0. If you put a value higher than 255, it will
- put 255 in the box. Sorry, but I think there is a bug in wxGTK, and until I
- can fix it properly, this is the only solution I could find.
+ 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 0.93 - Saturday, October 2, 2005
+ - Added Metroid Password Format Guide to docs
+ - 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
+ - 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
@@ -589,7 +601,7 @@
- Added game menu for NTSC/PAL time conversion
Version 0.90 - Wednesday, September 28, 2005
- - First Public Release
+ - First public release
--------------------------------------------------------------------------------
| 6.0 Contacting the Author
@@ -607,7 +619,7 @@
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
+ 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.
@@ -619,13 +631,13 @@
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 (although I love Java, no one else seems to).
+ 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 even this scale.
- I'm sure he would be horrified to know I've turned to the dark side (C++) and
+ 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. :-)
--------------------------------------------------------------------------------
@@ -634,8 +646,8 @@
This program is Copyright (C) 2005 emuWorks http://games.technoplaza.net/.
It is licensed under the GNU General Public License, which is included with
- this program in the docs section in the file license.txt.
+ this program in the docs directory in the file license.txt.
- For more information, please consult the GNU website at http://www.gnu.org/,
- or the Free Software Foundation http://www.fsf.org/.
+ For more information, please consult GNU at http://www.gnu.org/, or the Free
+ Software Foundation at http://www.fsf.org/.
diff --git a/docs/password.txt b/docs/password.txt
new file mode 100644
index 0000000..b0a3f13
--- /dev/null
+++ b/docs/password.txt
@@ -0,0 +1,678 @@
+-------------------------------------------------------------------------------
+| Metroid Password Format Guide
+| by John David Ratliff
+|
+| The most recent version of this guide can always be found at
+| http://games.technoplaza.net/mpg/password.txt
+|
+| Copyright (C) 2005 emuWorks (http://games.technoplaza.net/)
+| Permission is granted to copy, distribute and/or modify this document
+| under the terms of the GNU Free Documentation License, Version 1.2
+| or any later version published by the Free Software Foundation;
+| with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+| Texts. A copy of the license can be found at
+| http://www.gnu.org/licenses/fdl.html
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+| Table of Contents
+-------------------------------------------------------------------------------
+
+ 1.0 Introduction
+ 2.0 Copyright Notice
+ 3.0 Revision History
+ 4.0 Password Data
+ 4.1 Basics
+ 4.2 The Metroid Alphabet
+ 4.3 The Checksum
+ 4.4 The Shift Byte
+ 4.5 Known Password Bits
+ 4.6 Encoding
+ 4.7 Decoding
+ 4.8 The Debug Password
+ 5.0 mpg - The Metroid Password Generator
+ 6.0 Credits & Acknowledgments
+ 7.0 Contact Information
+
+-------------------------------------------------------------------------------
+| 1.0 Introduction
+-------------------------------------------------------------------------------
+
+ This document is a guide to the password system used by Metroid for the NES.
+ It applies to the original Metroid 1 released in the US and Europe. I believe
+ the information is also accurate for the hidden Metroid 1 game that can be
+ unlocked in Metroid Prime, and for Metroid Zero Mission for Game Boy
+ Advance. I have only tested the information with the original Metroid for
+ the US version of Metroid. Please contact me if you find anything to be
+ inaccurate, either as it applies to the Metroid 1 for the NES or any of the
+ others mentioned.
+
+ This guide is not a walkthrough for Metroid, and will probably not really
+ help you create passwords. This guide is a document describing the password
+ format for anyone who may be interested in it. I'm writing it because there
+ doesn't seem to be any document to describe the password format in and of
+ itself. The only thing close is the documentation contained with SnoBro's
+ metroid password generator (MetCode) and its source code.
+
+ If you just want to create passwords, I suggest using a password generator.
+ There are several choices, but because I have written one, it's the one I'm
+ going to recommend. You can find my program, mpg (Metroid Password
+ Generator), on emuWorks at http://games.technoplaza.net/mpg/. I wrote the
+ program to help me learn about the password format so that I could write this
+ document.
+
+-------------------------------------------------------------------------------
+| 2.0 Copyright Notice
+-------------------------------------------------------------------------------
+
+ This document is Copyright (C) 2005 emuWorks (http://games.technoplaza.net/)
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license can be found at
+ http://www.gnu.org/licenses/fdl.html
+
+ Basically, it is free documentation in much the same way software under the
+ GNU General Public License is free software. You can modify it, redistribute
+ it, sell it, publish it, etc.
+
+-------------------------------------------------------------------------------
+| 3.0 Revision History
+-------------------------------------------------------------------------------
+
+ Version 1.0 - Friday, September 30, 2005
+ - First Public Release
+
+-------------------------------------------------------------------------------
+| 4.0 Password Data
+-------------------------------------------------------------------------------
+
+ This is the important section. It covers the details of the Metroid password
+ format.
+
+-------------------------------------------------------------------------------
+| 4.1 Basics
+-------------------------------------------------------------------------------
+
+ The Metroid Password is a string of 24 characters in the Metroid Alphabet.
+ The password string is an encoded 144-bit data field, with 128 bits reserved
+ for game data, 8 bits for the checksum, and 8 bits for the shift byte.
+
+ Each character in the password represents 6 bits of the password (24 * 6 bits
+ = 144 bits). To obtain the contiguous 144-bits, you will need to string the
+ character bits together. After this has been done, you can perform operations
+ on the comprising 18 individual bytes.
+
+ There are 12 bits of the password data whose function is currently unknown.
+ It is probable that some of the bits are unused. I have seen one in use, but
+ have yet to discover it's function. If you learn the function of any of the
+ bits marked Unknown in the document, I would very much appreciate an email.
+
+ The remaining 116 bits are used to store data about the game. This data
+ includes how many missiles Samus is carrying, what equipment Samus has in her
+ inventory (Long Beam, Maru Mari, etc), which missile containers Samus has
+ picked up, which energy tanks Samus has collected, how long the game has been
+ played, which red and yellow doors have been opened, Samus' starting
+ location, which statues have been raised, if Samus is wearing her space suit
+ or her swimsuit, which zebetites have been destroyed, and finally which
+ bosses have been killed.
+
+ The password can be encrypted using a shift value, which is not part of the
+ 128-bit password data. It comprises the 8-bits just following the password
+ data. More about the shift byte will be said in 4.4 The Shift Byte.
+
+ The final 8 bits are the checksum, which is the first 136-bits added
+ together. This provides Metroid a way to ensure that a valid password is
+ being entered.
+
+ Because the checksum is the same for every unique combination of the first
+ 136 bits, there are 2^136 valid Metroid passwords, which is approximately
+ 8.7112285931760246646623899502533e+40 passwords. Many of them are
+ functionally equivalent.
+
+-------------------------------------------------------------------------------
+| 4.2 The Metroid Alphabet
+-------------------------------------------------------------------------------
+
+ Passwords, as well as all text in the game are comprised from an alphabet
+ of 65 characters, which include the entire alphabet A-Z (both upper and lower
+ case), the numbers 0-9, and the characters dash (-), question mark (?), and
+ space ( ).
+
+ Each character has a distinct value in a Metroid password, and they are
+ ordered as follows:
+ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz?-
+
+ The space character, which is at the end carries a special value of 255. The
+ remaining characters are all numbered from 0-63. In other words, the Metroid
+ character 'C' has a value of 13.
+
+ These values are used to decode the password into raw bit values. Because
+ (with the exception of space), they can all be expressed in 6-bits. You may
+ think that this means a space has the same value as the dash, but this is not
+ entirely true. Because of the way the data is converted from 6-bit values to
+ 8-bit values (it is not simply strung together), the space can introduce it's
+ high 2 bits over the lower order bits of the character which preceeded it.
+ This means the space has the potential to alter the character which came
+ before it. This will be discussed more in 4.7 Decoding.
+
+-------------------------------------------------------------------------------
+| 4.3 The Checksum
+-------------------------------------------------------------------------------
+
+ Metroid passwords use a simple checksum to confirm their authenticity as a
+ valid Metroid password. The last 8-bits (1 byte) comprises the checksum.
+
+ To calculate the checksum for a password, add the first 136 bits (17 bytes)
+ together. Take the result bit-wise ANDed with 255 and you have your checksum.
+
+ The checksum is not a perfect means of validation. It can only do a glib
+ test stating that the data is likely to be what you meant to enter.
+
+-------------------------------------------------------------------------------
+| 4.4 The Shift Byte
+-------------------------------------------------------------------------------
+
+ The 17th byte (bits 128-135) comprise the shift byte. It is used to encrypt
+ the password.
+
+ Basically, when the password is encoded, bits are rotated from one byte to
+ the next and the bit rotated off the last byte goes onto the first byte.
+
+ The shift byte determines how many times this bit rotation occurs. So, a
+ value of 0 means the password is not encrypted at all.
+
+ The method for bit rotation will be covered in 4.6 Encoding and 4.7 Decoding.
+
+-------------------------------------------------------------------------------
+| 4.5 Known Password Bits
+-------------------------------------------------------------------------------
+
+ This section lists all the bits in the 128-bit password data that are known.
+ I with I could be more specific about the locations of missile containers,
+ energy tanks, and certain red doors, but without a good point of refernece
+ (like a public map), this is difficult to do.
+
+ There is another password generator written in Flash that contains a map and
+ does a great job of telling you exactly where things are and which bit
+ corresponds with what item. It is available at
+ http://www.geocities.com/passgens/pages/metroid/metflash.htm. If you have
+ Flash, and want to know specifics, I suggest you check it out.
+
+ I'm going to list them in the order they exist in the password.
+
+ Bit 0: Maru Mari Taken
+ Bit 1: Missile Container (Brinstar)
+ Bit 2: Red Door (Long Beam)
+ Bit 3: Red Door (Tourian Bridge)
+ Bit 4: Energy Tank (Brinstar)
+ Bit 5: Red Door (Bombs)
+ Bit 6: Bombs Taken
+ Bit 7: Red Door (Ice Beam Brinstar)
+
+ Bit 8: Missile Container (Brinstar)
+ Bit 9: Energy Tank (Brinstar)
+ Bit 10: Red Door (Varia)
+ Bit 11: Varia Taken
+ Bit 12: Energy Tank (Brinstar)
+ Bit 13: Missile Container (Norfair)
+ Bit 14: Missile Container (Norfair)
+ Bit 15: Red Door (Ice Beam Norfair)
+
+ Bit 16: Missile Container (Norfair)
+ Bit 17: Missile Container (Norfair)
+ Bit 18: Missile Container (Norfair)
+ Bit 19: Missile Container (Norfair)
+ Bit 20: Missile Container (Norfair)
+ Bit 21: Missile Container (Norfair)
+ Bit 22: Missile Container (Norfair)
+ Bit 23: Red Door (High Jump Boots)
+
+ Bit 24: High Jump Boots Taken
+ Bit 25: Red Door (Screw Attack)
+ Bit 26: Screw Attack Taken
+ Bit 27: Missile Container (Norfair)
+ Bit 28: Missile Container (Norfair)
+ Bit 29: Red Door (Wave Beam)
+ Bit 30: Energy Tank (Norfair)
+ Bit 31: Missile Container (Norfair)
+
+ Bit 32: Red Door (Kraid's Lair)
+ Bit 33: Missile Container (Kraid's Lair)
+ Bit 34: Missile Container (Kraid's Lair)
+ Bit 35: Red Door (Kraid's Lair)
+ Bit 36: Energy Tank (Kraid's Lair)
+ Bit 37: Red Door (Kraid's Lair)
+ Bit 38: Red Door (Kraid's Lair)
+ Bit 39: Missile Container (Kraid's Lair)
+
+ Bit 40: Missile Container (Kraid's Lair)
+ Bit 41: Red Door (Kraid's Room)
+ Bit 42: Energy Tank (Kraid's Room)
+ Bit 43: Missile Container (Ridley's Lair)
+ Bit 44: Red Door (Ridley's Lair)
+ Bit 45: Energy Tank (Ridley's Lair)
+ Bit 46: Missile Container (Ridley's Lair)
+ Bit 47: Yellow Door (in Ridley's Room)
+
+ Bit 48: Energy Tank (Room Behind Ridley)
+ Bit 49: Missile Container (Ridley's Lair)
+ Bit 50: Yellow Door (Tourian)
+ Bit 51: Red Door (Tourian)
+ Bit 52: Red Door (Tourian)
+ Bit 53: Zebetite 1 Killed
+ Bit 54: Zebetite 2 Killed
+ Bit 55: Zebetite 3 Killed
+
+ Bit 56: Zebetite 4 Killed
+ Bit 57: Zebetite 5 Killed
+ Bit 58: Mother Brain Killed
+ Bit 59: Unknown
+ Bit 60: Unknown
+ Bit 61: Unknown
+ Bit 62: Unknown
+ Bit 63: Unknown
+
+ Bit 64: Start in Norfair
+ Bit 65: Start in Kraid's Lair
+ Bit 66: Start in Ridley's Lair
+ Bit 67: Reset
+ Bit 68: Unknown
+ Bit 69: Unknown
+ Bit 70: Unknown
+ Bit 71: Samus in Swimsuit
+
+ Bit 72: Samus Has Bombs
+ Bit 73: Samus Has High Jump Boots
+ Bit 74: Samus Has Long Beam
+ Bit 75: Samus Has Screw Attack
+ Bit 76: Samus Has Maru Mari
+ Bit 77: Samus Has Varia
+ Bit 78: Samus Has Wave Beam
+ Bit 79: Samus Has Ice Beam
+
+ Bit 80: Missile Count (+1 Missile)
+ Bit 81: Missile Count (+2 Missiles)
+ Bit 82: Missile Count (+4 Missiles)
+ Bit 83: Missile Count (+8 Missiles)
+ Bit 84: Missile Count (+16 Missiles)
+ Bit 85: Missile Count (+32 Missiles)
+ Bit 86: Missile Count (+64 Missiles)
+ Bit 87: Missile Count (+128 Missiles)
+
+ Bit 88: Game Age (32-bit Value -- Low Bit)
+ Bit 89: ...
+ Bit 90: ...
+ Bit 91: ...
+ Bit 92: ...
+ Bit 93: ...
+ Bit 94: ...
+ Bit 95: ...
+
+ Bit 96: ...
+ Bit 97: ...
+ Bit 98: ...
+ Bit 99: ...
+ Bit 100: ...
+ Bit 101: ...
+ Bit 102: ...
+ Bit 103: ...
+
+ Bit 104: ...
+ Bit 105: ...
+ Bit 106: ...
+ Bit 107: ...
+ Bit 108: ...
+ Bit 109: ...
+ Bit 110: ...
+ Bit 111: ...
+
+ Bit 112: ...
+ Bit 113: ...
+ Bit 114: ...
+ Bit 115: ...
+ Bit 116: ...
+ Bit 117: ...
+ Bit 118: ...
+ Bit 119: Game Age (32-bit Value -- High Bit)
+
+ Bit 120: Unknown
+ Bit 121: Unknown
+ Bit 122: Unknown
+ Bit 123: Unknown
+ Bit 124: Ridley Killed
+ Bit 125: Ridley Statue Raised
+ Bit 126: Kraid Killed
+ Bit 127: Kraid Statue Raised
+
+ Most of these are obvious, but some require some additional explanation.
+
+ The bits that say "XXX Taken", such as Maru Mari Taken, are used to determine
+ whether the item will appear in the place it is supposed to be. If Samus
+ doesn't have the Maru Mari (Bit 76), but Maru Mari is Taken (Bit 0), then
+ Samus can never get the Maru Mari. All the beams (Long, Ice, and Wave) are
+ always there.
+
+ The game will not let you pick up the Ice Beam and Wave Beam simultaneously.
+ If you pick up one, the other will deactivate. If you activate both bits
+ yourself, you get a weird cross between the two beams. It doesn't seem to
+ hurt the game.
+
+ There are five valid start locations. They are specified using bits 64-66.
+ To start in Brinstar, all the bits should be off. Norfair, Kraid's Lair, and
+ Ridley's Lair can be specified by turning their bit on and leaving the others
+ off. Tourian is specified by turning on Norfair and Kraid's Lair
+ simultaneously. Any other combination of these three bits is invalid and will
+ cause Metroid to reset.
+
+ The reset bit is part of the start location. There are 16 possible values,
+ but only 5 valid ones. Turning on the reset bit will produce and invalid
+ start location and cause Metroid to reset. This is why it is called it is
+ called the reset bit, because it guarantees an invalid password.
+
+ If Mother Brain is dead, the door will already be there when you get to the
+ end of Tourian. The bomb timer will not activate, and you will be able to
+ spend as much time as you like escaping Tourian.
+
+ The missile count is an 8-bit (1 byte) value ranging from 0-255. Just convert
+ the number you want to binary and turn on the appropriate bits.
+
+ The game age is a complicated number. It is a 32-bit value, though in
+ reality, it only has a range of 2^24 * 208 because the least significant byte
+ overflows at 208. This means there are 3,489,661,135 distinct values in the
+ range 0 - 4,294,967,295.
+
+ The game age is in what I will call 'game ticks'. The exact value of a tick
+ depends upon whether you have an NTSC NES (the US Nintendo) or a PAL NES
+ (the European Nintendo). If you have an NTSC NES, then 1 game tick = (256 /
+ 60) seconds or approximately 4.2666666666666666666666666666667 seconds. For a
+ PAL NES, 1 game tick = (256 / 50) seconds or 5.12 seconds. Where did these
+ values come from? 1 game tick is actually the amount of time it takes to
+ draw 256 frames. Because the NTSC NES draws 60 frames per second, you get
+ (256 / 60). The PAL NES draws 50 frames per second, so you get (256 / 50).
+ The difference is related to television signal differences between North
+ American (NTSC) and Europe (PAL).
+
+-------------------------------------------------------------------------------
+| 4.6 Encoding
+-------------------------------------------------------------------------------
+
+ Here comes the good part; taking the password data from its raw format and
+ creating a Metroid password from it.
+
+ The encode is a fairly simple process, although it involves a lot of tedious
+ math. If you actually want to encode raw data, I highly recommend using a
+ password generator, such as mpg (http://games.technoplaza.net/mpg/).
+
+ The encoding process involves four steps.
+ 1. Calculate the checksum
+ 2. Encode the password data using the shift byte
+ 3. Convert the 18 8-bit blocks to 24 6-bit blocks
+ 4. Translate the 6-bit blocks into a readable password
+
+ Step 1 - Calculate the Checksum
+
+ Calculating the checksum is a fairly simple process. Take the first 136
+ bits and add them together. Take the result and bit-wise and it with 255.
+ The result if the checksum.
+
+ The checksum should be stored in the last byte (bits 136-143).
+
+ Step 2 - Encode the Password Data Using the Shift Byte
+
+ This is the part where the password gets encrypted using bit rotation. Here
+ is how it works.
+
+ You need two variables, which I will call carry (1 bit) and copy (8 bits).
+
+ As many times as the shift byte indicates, do the following
+ Save the first byte of the password data in copy.
+
+ For each byte of the password data (0-15 starting at 0) do the following
+ Rotate the password byte right one bit.
+ The least significant bit of the password byte should become the new
+ carry value.
+ The most significant bit of the password byte should be the old carry
+ value.
+
+ Rotate the copy byte right one bit.
+ The least significant bit of copy should become the new carry value.
+ The most significant bit of copy should be the old carry value.
+ Overwrite the first byte of the password data with the copy byte.
+
+ Very simply, we are rotating bits down the password data from byte to byte.
+ The copy is needed because the last byte's rotated bit has to become the
+ high bit of the first byte. I use the name carry because there is an
+ instruction in x86 assembly which can perform this task using the carry
+ flag internally. If you take a look at SnoBro's password generator MetCode,
+ his x86 assembly source is much more compact than my C++ source for mpg.
+
+ Step 3 - Convert the 18 8-bit Blocks to 24 6-bit Blocks
+
+ Now that we have our password encoded using the shift byte, we can
+ translate to the Metroid alphabet.
+
+ Because each letter of the Metroid alphabet can be represented in 6-bits,
+ the encoding process will never produce a password with spaces. You can
+ read more about spaces in 4.7 Decoding.
+
+ To convert from 8-bit blocks to 6-bit blocks, all we need to do is take
+ every 6 bits in order. So just take your 144-bit string and separate it
+ into 24 6-bit segments.
+
+ Step 4 - Translate the 6-bit Blocks into a Readable Password
+
+ Since each letter can be represented in 6-bits, converting between the
+ 6-bit blocks and the western alphabet is trivial. Convert each 6-bit
+ value to a decimal number, and take that as the offset from 0 in the
+ Metroid alphabet.
+
+ In other words, 000000 binary = 0 decimal = '0'
+ 111111 binary = 63 decimal = '-'
+
+ You can fill in the rest from 4.2 The Metroid Alphabet.
+
+ That's all there is to it. The math is rote, but hard to do by hand. I highly
+ recommend using a password generator if you want to actually encode Metroid
+ passwords.
+
+-------------------------------------------------------------------------------
+| 4.7 Decoding
+-------------------------------------------------------------------------------
+
+ Decoding is nearly a mirror image of encoding, but there are a couple of
+ minor differences that are important to note.
+
+ Decoding, like encoding, is a four step process. Just like encoding, I
+ recommend using a password generator if you really want to decode Metroid
+ passwords.
+
+ 1. Convert the password to the Metroid alphabet
+ 2. Convert the 24 characters to 18 8-bit blocks
+ 3. Decode the password data using the shift byte
+ 4. Verify the checksum
+
+ Step 1 - Convert the Password to the Metroid Alphabet
+
+ This is basically the same as step 4 in the original, but we have to be
+ careful, because we are not dealing with 6-bit blocks here. Although 64 of
+ the 65 characters in the Metroid alphabet can be represented in 6-bits,
+ the final character (space) cannot. Therefore, we must use 24 8-bit blocks,
+ rather than 6-bit blocks.
+
+ All the characters use their same values except for space which uses 255.
+ In a minute, we will see how this causes spaces in passwords to sometimes
+ affect the character that came before it.
+
+ Step 2 - Convert the 24 characters to 18 8-bit blocks.
+
+ Although we have 8-bit blocks now, we need to have 18 contiguous 8-bit
+ blocks, and since most of the characters (if any) won't be spaces, we will
+ have the upper two bits of every character off.
+
+ If you have no spaces in the password, then you can just remove the leading
+ two bits from each character and create a 144-bit string.
+
+ If you have spaces, it gets more complicated. The character that preceeds
+ the space must be altered to have its lowest two bits turned on. After
+ that, you can treat the space like a dash.
+
+ If you take a look at the source code for mpg, you can glean a more
+ mathematical reason for why you have to do this with spaces, but for this
+ document, I'm just doing to tell you that it has to be done.
+
+ Step 3 - Decode the Password Data Using the Shift Byte
+
+ This is the same process we did for encoding, but in reverse. Instead of
+ rotating right, we rotate left, and we swap least significant bit and
+ most significant bit. Here is the whole process.
+
+ As many times as the shift byte indicates, do the following
+ Save the last byte of the password data (byte 15) in copy.
+
+ For each byte of the password data (15-0 starting at 15) do the following
+ Rotate the password byte left one bit.
+ The most significant bit of the password byte should become the new
+ carry value.
+ The least significant bit of the password byte should be the old
+ carry value.
+
+ Rotate the copy byte left one bit.
+ The most significant bit of copy should become the new carry value.
+ The least significant bit of copy should be the old carry value.
+ Overwrite the last byte of the password data with the copy byte.
+
+ Step 4 - Verify the Checksum
+
+ Finally, we have our password data. Now we need to verify the checksum.
+
+ All we have to do is calculate the checksum on the data we have, and make
+ sure it's equal to byte 18 (bits 137-144). If not, then the password is
+ not valid and will be rejected by Metroid.
+
+ That's all there is to decoding.
+
+-------------------------------------------------------------------------------
+| 4.8 The Debug Password
+-------------------------------------------------------------------------------
+
+ One password, which I will call the debug password, and is also known as the
+ NAR PASSWORD, is a special password which does not use the shift byte or the
+ checksum. This is because it is hard coded into Metroid and the password data
+ has no meaning. It simply triggers a debugging mode in Metroid that was used
+ to help test the US version of the game.
+
+ The NAR PASSWORD, which if written completely is
+
+ NARPAS SWORD0
+ 0000
+
+ The last 8 characters can be anything and are not checked at all. This is
+ because 16 * 6 = 96 bits = 12 bytes = 3 quads. I don't know if this is
+ specifically why you need the last 5 zeros, but it is my theory.
+
+ Why 3 quads? I don't know, but it's a nice number from a computer science
+ point of view. If not 3 quads, then 12 characters which would be 12 * 6 =
+ 72 bits = 9 bytes would have been pretty easy to check in 6502 assembly.
+
+ It is also possible they simply wanted to restrict the number of passwords
+ that would trigger debug mode, and requiring 5 zeros at the end is one way it
+ could have been done. However, if that is the reason, why not require they
+ all be zeros? Why have any wildcard characters at all?
+
+ Blanks are interpreted as 0's in the Metroid password screen, so you never
+ need to enter more than NARPAS SWORD anyways. (That's blank, meaning no
+ character present, not space, which looks identical to, but is interpreted
+ very differently from a blank).
+
+ What does NAR mean? There are a few theories, but no one knows for sure. The
+ three most popular are as follows:
+
+ 1. NAR = North American Release
+ The Japanese version did not have passwords and used the FDS (Famicom
+ Disk System) to store Metroid save games.
+
+ 2. NAR = Not a Real (as in Not a Real Password)
+
+ 3. NAR = Tohru Narihito
+ Tohru Narihito designed and implemented the password system in Metroid.
+ Maybe he named the debug password after himself.
+
+-------------------------------------------------------------------------------
+| 5.0 mpg - The Metroid Password Generator
+-------------------------------------------------------------------------------
+
+ As I have mentioned many times, it is inconvenient to use the methods
+ described here by hand. This document wasn't written so people would try to
+ do this by hand. Rather it was written to further the understanding of the
+ Metroid password format.
+
+ I wrote a program called mpg (The Metroid Password Generator) as a
+ replacement for a program I had seen called MetCode (the first Metroid
+ password creation tool written by SnoBro). SnoBro only updated it within
+ his MetEdit (Metroid Editor) program, and the program itself leaves quite a
+ lot to be desired. SnoBro did not have complete information on the password
+ format, so many bits in the password that I learned about were blank in his
+ program. It was also Windows only and has what I consider to be a less than
+ optimal interface.
+
+ mpg is a replacement for SnoBro's MetCode. It takes the basic idea and turns
+ it into a nicer program. It runs on Windows, Linux, and Mac OS X for sure,
+ but should also run on any unix supporting the GTK+ toolkit.
+
+ mpg also takes inspiration from a program called metpass by tapper, which was
+ written to aid in the creation of Metroid passwords as strings of words. If
+ you want to spell words in Metroid Passwords, you could use metpass to fix
+ the checksum so the password would work in Metroid. I thought the two ideas
+ should be combined, so I added the features of metpass into mpg.
+
+ I have spent a lot of time refining the interface, and although there are at
+ least 5 other programs that create metroid passwords, I truly feel that mine
+ is better than all of them. The one thing that it doesn't have that one of
+ the others does is a reference map for where each item, red door, energy
+ tank, and missile container is. It is written in Flash and will run in a
+ web browser if you have the Flash plugin. You can find it at
+ http://www.geocities.com/passgens/pages/metroid/metflash.htm. Despite his
+ nice map, I still feel I have a better overall program.
+
+ If you would like to use mpg, it is available for download at
+ http://games.technoplaza.net/mpg/. It is free software under the GNU General
+ Public License, comes with full source, and runs on nearly every platform.
+
+-------------------------------------------------------------------------------
+| 6.0 Credits & Acknowledgments
+-------------------------------------------------------------------------------
+
+ While I have learned a great deal on my own about the password format used in
+ Metroid, much of my information comes originally from others. I will try to
+ acknowledge everyone who has lead to the creation of this document here.
+
+ SnoBro (aka Kent Hansen)
+ Creator of SnoBro's Metroid Password Generator (MetCode) and MetEdit, an
+ editor for Metroid ROMs. He did the original work on Metroid and learned
+ the checksum and shift byte meanings, along with decoding the Metroid
+ alphabet. I'm 99% positive that every Metroid password generator owes its
+ existence to SnoBro and the original data he shared in his readme and
+ source code. This include mpg. Thanks SnoBro!
+
+ tapper (aka Sebastian Pettersson)
+ Creator of metpass, a checksum generation utility that helps turn strings
+ of words into valid Metroid passwords. His program inspired me to improve
+ mpg beyond what I had originally envisioned and his readme contained
+ information that helped me learn more about the password format.
+
+ Xodnizel
+ Creator of FCEU, an NES emulator with a debugger. I was able to confirm
+ many of my theories about the password data using the debugger in FCEU.
+
+-------------------------------------------------------------------------------
+| 7.0 Contact Information
+-------------------------------------------------------------------------------
+
+ The author (John Ratliff) can be contacted at
+ webmaster [AT] technoplaza [DOT] net. Replace as necessary.
+
+ I can also be reached via an online feedback form at
+ http://www.technoplaza.net/feedback.php
+
diff --git a/source/res/mpg.xrc b/source/res/mpg.xrc
index 2286bad..3646b05 100644
--- a/source/res/mpg.xrc
+++ b/source/res/mpg.xrc
@@ -208,10 +208,17 @@