From 4b1f983cd12af9de5a6c7991c98b4c6166dc94bf Mon Sep 17 00:00:00 2001 From: sup39 Date: Fri, 9 Feb 2024 16:12:17 +0900 Subject: [PATCH] feat: add InstantLevelSelectExtra --- .img/levelselect.png | Bin 0 -> 41288 bytes InstantLevelSelect/README.md | 2 +- InstantLevelSelectExtra/@code.xml | 388 +++++++++++++++++++++++++++++ InstantLevelSelectExtra/README.md | 30 +++ InstantLevelSelectExtra/info.xml | 68 +++++ InstantLevelSelectExtra/make.py | 13 + InstantLevelSelectExtra/src/main.s | 310 +++++++++++++++++++++++ 7 files changed, 810 insertions(+), 1 deletion(-) create mode 100644 .img/levelselect.png create mode 100644 InstantLevelSelectExtra/@code.xml create mode 100644 InstantLevelSelectExtra/README.md create mode 100644 InstantLevelSelectExtra/info.xml create mode 100644 InstantLevelSelectExtra/make.py create mode 100644 InstantLevelSelectExtra/src/main.s diff --git a/.img/levelselect.png b/.img/levelselect.png new file mode 100644 index 0000000000000000000000000000000000000000..4b4de51ed92e77b6d8d186e90008f3d042ab6d73 GIT binary patch literal 41288 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�ScEKbBg*Q`gSFLX#u3U8*5!eMd# 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 + misc + Instant Level Select Extra + レベル選択EX + sup39(サポミク) + 1.0 + Feb 09, 2024 + + ::: warning + Do not use this code when opening/closing Z menu, or the game may crash! + ::: + + #### Instant Restart + - Press `D-Pad Up` to **restart the current area** + - The **respawn position** will be the same. It can be used to practice Honey Skip or stage movement in Delfino Plaza + + #### Reset to Shine Select + - Press `D-Pad Down` to **reset to shine select of current stage** + - Pressing `D-Pad Down` in Plaza has no effect + + #### Level Select + Press `{the following button combination} + D-Pad Up` to warp to other area instantly: + ![Level Select Combinations](/img/levelselect.png) + + - For `Z + D-Pad Up`, the current area will be restarted, but the **respawn position will be reset**. It is like `D-Pad Up`, but the respawn position will be the default position instead of the previous one + - For `Y + D-Pad Up`, it will restart from the **previous selected area**. For example, if you select SB4 with this code, and enter hotel/casino then press `Y+D-Pad Up`, it will restart from SB4 beach (instead of hotel/casino if you use `D-Pad Up` or `Z+D-Pad Up`) + + #### Area Lock + - Press `R + D-Pad Left/Right` to enable/disable **Area Lock** + - With Area Lock, warps will restart the current area instead of sending Mario to other areas, which can be used to practice specific area (e.g. outside of BH2 wildmill, secret stage entering) + - Restarting acts like `D-Pad Up`, and therefore can be used to practice Honey Skip, etc. + + #### Example of Usage: Practising Honey Skip + 1. Press `R + D-Pad Left` to enable Area Lock + 2. Press `C-Stick LeftDown + D-Pad Up` to go to Pianta Village + 3. Press `C-Stick RightDown + Y + D-Pad Up` to go to Pinna unlock plaza + 4. Practice Honey Skip as much as you want! It will restart automatically when you are going to leave the area so you don't need to reset manually. You can also restart with `D-Pad Up` if you want. + + + ::: warning + Zメニューを開く・閉じる最中にこのコードを使うとクラッシュする可能性があります + ::: + + #### ポーズせずにやり直し + - `十字キー上`で**現在のエリアをやり直す** + - ドルピックタウンでは同じ開始位置からやり直すので、ハニスキといったステージ移動の練習も可能 + + #### シャイン選択画面からやり直し + - `十字キー下`で**現在のステージのシャイン選択画面からやり直す** + + #### レベル選択 + `{次のボタン}+十字キー上`でレベル選択 + + ![レベル選択](/img/levelselect.png) + + - `Z+十字キー上`は**現在のエリアをやり直す**が、ドルピックタウンでの**開始位置がリセット**され、デフォルトの開始位置からとなる(`十字キー上`の場合はリセットされない) + - `Y+十字キー上`は**前回選択したレベル**からやり直す(例えばSB4を選択し、ホテル・カジノに入って`Y+十字キー`を押すと、ホテル外からやり直すことになる) + #### エリアロック + `R+十字キー左/右`でエリアロック/ロック解除 + - エリアロックするとステージ移動がやり直しに置き換え、ヒミツINといった特定のエリアの練習が可能 + - やり直しの仕様は`十字キー上`と同じなので、ハニスキなどの練習にも使える + #### 使用例:ハニスキの練習 + 1. `R + 十字キー左`でエリアロック + 2. `Cスティック左下 + 十字キー上`でモンテの村に移動 + 3. `Cスティック右下 + Y + 十字キー上`でピンナ解放のドルピックタウンに移動 + 4. これで好きなだけハニスキを練習できます。他のエリアに入ろうとする時に自動的にやり直すので、手動でやり直す必要がありません。必要であれば`十字キー上`でやり直すこともできます。 + + + C20F9B74 0000004D + 3C80817F 816D97D0 + 3D808040 80AC0D80 + 20050022 540A043D + 41820008 8804002B + 540007FF 9804002B + 28830001 4C451102 + 40A2000C 38A00008 + 90AC0D80 7C7D1B79 + 41820220 70A00004 + 41A20034 881F000E + 3D40803B 394A40E8 + 7CEA00AE 2C070001 + 40810200 38070001 + 5400EFFE 7CE70214 + 54E7403E 60E700FF + 480000F8 70A00008 + 41A201E0 4800003D + 00141516 0017181D + 34000090 2F2E3020 + 32293328 2A1FBA3C + 371E213A 0E2C3900 + 00010507 08090200 + 123457D0 24567000 + 12234070 23467001 + 7D2802A6 54A6CF38 + 50A6F77A 50A6E7BC + 50A6D7FE 54A0C738 + 50A0B77C 7CC60378 + 54A3873F 41820054 + 2C030009 41820098 + 3C00C84A 6000C004 + 1C630003 5C031F7E + 5465103A 2C06000C + 408000BC 2C06000A + 408000D4 2C060008 + 40800090 3C005689 + 60000234 546C103A + 5C0C652E 7CC76378 + 54C8077E 480000C4 + A0FF000E 2C060000 + 41820028 2C060004 + 41820028 2C06000A + 41820028 7C0930AE + 540744AE 5408CFFE + 1D080007 48000094 + A01F000A B01F000E + 890B00DF 4800008C + A0E40028 8904002A + 48000078 3989000C + 7C0C30AE 540744AE + 5007CFFE 3C00AC1A + 60005CA2 1D860003 + 5C08677E 48000054 + 39890018 7C0C18AE + 540744AE 3C001373 + 60002301 5C082F7E + 48000038 3989FFF8 + 54C016B8 7C0C006E + 5C072F7E 5007252E + 800C0004 5C082F7E + 48000018 3C001578 + 60009200 5C072F3E + 60E70100 39000000 + B0E40028 9904002A + 38000001 980400B3 + 990B00DF 38000000 + 900B00D8 A00B00CC + 60004000 54000524 + B00B00CC B0FF0012 + 54E0C63E 819F0020 + 2C000007 2C80000E + 4C423382 3800003B + 41820008 38000000 + B00C00E4 A00C00E2 + 540007FA B00C00E2 + 54FDD7BE 3BBD0005 + 60000000 00000000 + + + C22A6170 0000004D + 3C80817F 816D9FA0 + 3D808040 80AC4484 + 20050022 540A043D + 41820008 8804002B + 540007FF 9804002B + 28830001 4C451102 + 40A2000C 38A00008 + 90AC4484 7C7D1B79 + 41820220 70A00004 + 41A20034 881F000E + 3D40803E 394AF498 + 7CEA00AE 2C070001 + 40810200 38070001 + 5400EFFE 7CE70214 + 54E7403E 60E700FF + 480000F8 70A00008 + 41A201E0 4800003D + 00141516 0017181D + 34000090 2F2E3020 + 32293328 2A1FBA3C + 371E213A 0E2C3900 + 00010507 08090200 + 123457D0 24567000 + 12234070 23467001 + 7D2802A6 54A6CF38 + 50A6F77A 50A6E7BC + 50A6D7FE 54A0C738 + 50A0B77C 7CC60378 + 54A3873F 41820054 + 2C030009 41820098 + 3C00C84A 6000C004 + 1C630003 5C031F7E + 5465103A 2C06000C + 408000BC 2C06000A + 408000D4 2C060008 + 40800090 3C005689 + 60000234 546C103A + 5C0C652E 7CC76378 + 54C8077E 480000C4 + A0FF000E 2C060000 + 41820028 2C060004 + 41820028 2C06000A + 41820028 7C0930AE + 540744AE 5408CFFE + 1D080007 48000094 + A01F000A B01F000E + 890B00DF 4800008C + A0E40028 8904002A + 48000078 3989000C + 7C0C30AE 540744AE + 5007CFFE 3C00AC1A + 60005CA2 1D860003 + 5C08677E 48000054 + 39890018 7C0C18AE + 540744AE 3C001373 + 60002301 5C082F7E + 48000038 3989FFF8 + 54C016B8 7C0C006E + 5C072F7E 5007252E + 800C0004 5C082F7E + 48000018 3C001578 + 60009200 5C072F3E + 60E70100 39000000 + B0E40028 9904002A + 38000001 980400B3 + 990B00DF 38000000 + 900B00D8 A00B00CC + 60004000 54000524 + B00B00CC B0FF0012 + 54E0C63E 819F0020 + 2C000007 2C80000E + 4C423382 3800003B + 41820008 38000000 + B00C00E4 A00C00E2 + 540007FA B00C00E2 + 54FDD7BE 3BBD0005 + 60000000 00000000 + + + C229E080 0000004D + 3C80817F 816D9EC8 + 3D808040 80ACBC24 + 20050022 540A043D + 41820008 8804002B + 540007FF 9804002B + 28830001 4C451102 + 40A2000C 38A00008 + 90ACBC24 7C7D1B79 + 41820220 70A00004 + 41A20034 881F000E + 3D40803D 394A6DB0 + 7CEA00AE 2C070001 + 40810200 38070001 + 5400EFFE 7CE70214 + 54E7403E 60E700FF + 480000F8 70A00008 + 41A201E0 4800003D + 00141516 0017181D + 34000090 2F2E3020 + 32293328 2A1FBA3C + 371E213A 0E2C3900 + 00010507 08090200 + 123457D0 24567000 + 12234070 23467001 + 7D2802A6 54A6CF38 + 50A6F77A 50A6E7BC + 50A6D7FE 54A0C738 + 50A0B77C 7CC60378 + 54A3873F 41820054 + 2C030009 41820098 + 3C00C84A 6000C004 + 1C630003 5C031F7E + 5465103A 2C06000C + 408000BC 2C06000A + 408000D4 2C060008 + 40800090 3C005689 + 60000234 546C103A + 5C0C652E 7CC76378 + 54C8077E 480000C4 + A0FF000E 2C060000 + 41820028 2C060004 + 41820028 2C06000A + 41820028 7C0930AE + 540744AE 5408CFFE + 1D080007 48000094 + A01F000A B01F000E + 890B00DF 4800008C + A0E40028 8904002A + 48000078 3989000C + 7C0C30AE 540744AE + 5007CFFE 3C00AC1A + 60005CA2 1D860003 + 5C08677E 48000054 + 39890018 7C0C18AE + 540744AE 3C001373 + 60002301 5C082F7E + 48000038 3989FFF8 + 54C016B8 7C0C006E + 5C072F7E 5007252E + 800C0004 5C082F7E + 48000018 3C001578 + 60009200 5C072F3E + 60E70100 39000000 + B0E40028 9904002A + 38000001 980400B3 + 990B00DF 38000000 + 900B00D8 A00B00CC + 60004000 54000524 + B00B00CC B0FF0012 + 54E0C63E 819F0020 + 2C000007 2C80000E + 4C423382 3800003B + 41820008 38000000 + B00C00E4 A00C00E2 + 540007FA B00C00E2 + 54FDD7BE 3BBD0005 + 60000000 00000000 + + + C2285FCC 0000004D + 3C80817F 816D9E60 + 3D80803F 80AC5458 + 20050022 540A043D + 41820008 8804002B + 540007FF 9804002B + 28830001 4C451102 + 40A2000C 38A00008 + 90AC5458 7C7D1B79 + 41820220 70A00004 + 41A20034 881F000E + 3D40803D 394AF9B8 + 7CEA00AE 2C070001 + 40810200 38070001 + 5400EFFE 7CE70214 + 54E7403E 60E700FF + 480000F8 70A00008 + 41A201E0 4800003D + 00141516 0017181D + 34000090 2F2E3020 + 32293328 2A1FBA3C + 371E213A 0E2C3900 + 00010507 08090200 + 123457D0 24567000 + 12234070 23467001 + 7D2802A6 54A6CF38 + 50A6F77A 50A6E7BC + 50A6D7FE 54A0C738 + 50A0B77C 7CC60378 + 54A3873F 41820054 + 2C030009 41820098 + 3C00C84A 6000C004 + 1C630003 5C031F7E + 5465103A 2C06000C + 408000BC 2C06000A + 408000D4 2C060008 + 40800090 3C005689 + 60000234 546C103A + 5C0C652E 7CC76378 + 54C8077E 480000C4 + A0FF000E 2C060000 + 41820028 2C060004 + 41820028 2C06000A + 41820028 7C0930AE + 540744AE 5408CFFE + 1D080007 48000094 + A01F000A B01F000E + 890B00DF 4800008C + A0E40028 8904002A + 48000078 3989000C + 7C0C30AE 540744AE + 5007CFFE 3C00AC1A + 60005CA2 1D860003 + 5C08677E 48000054 + 39890018 7C0C18AE + 540744AE 3C001373 + 60002301 5C082F7E + 48000038 3989FFF8 + 54C016B8 7C0C006E + 5C072F7E 5007252E + 800C0004 5C082F7E + 48000018 3C001578 + 60009200 5C072F3E + 60E70100 39000000 + B0E40028 9904002A + 38000001 980400B3 + 990B00DF 38000000 + 900B00D8 A00B00CC + 60004000 54000524 + B00B00CC B0FF0012 + 54E0C63E 819F0020 + 2C000007 2C80000E + 4C423382 3800003B + 41820008 38000000 + B00C00E4 A00C00E2 + 540007FA B00C00E2 + 54FDD7BE 3BBD0005 + 60000000 00000000 + + diff --git a/InstantLevelSelectExtra/README.md b/InstantLevelSelectExtra/README.md new file mode 100644 index 0000000..a5845f0 --- /dev/null +++ b/InstantLevelSelectExtra/README.md @@ -0,0 +1,30 @@ +# Instant Level Select Extra + +## Caveats +- Do not use this code when opening/closing Z menu, or the game may crash! +## Usage +### Instant Restart +- Press `D-Pad Up` to **restart the current area** + - The **respawn position** will be the same. It can be used to practice Honey Skip or stage movement in Delfino Plaza + +### Reset to Shine Select +- Press `D-Pad Down` to **reset to shine select of current stage** + - Pressing `D-Pad Down` in Plaza has no effect + +### Level Select +Press `{the following button combination} + D-Pad Up` to warp to other area instantly: +![Level Select Combinations](../.img/levelselect.png) + +- For `Z + D-Pad Up`, the current area will be restarted, but the **respawn position will be reset**. It is like `D-Pad Up`, but the respawn position will be the default position instead of the previous one +- For `Y + D-Pad Up`, it will restart from the **previous selected area**. For example, if you select SB4 with this code, and enter hotel/casino then press `Y+D-Pad Up`, it will restart from SB4 beach (instead of hotel/casino if you use `D-Pad Up` or `Z+D-Pad Up`) + +### Area Lock +- Press `R + D-Pad Left/Right` to enable/disable **Area Lock** + - With Area Lock, warps will restart the current area instead of sending Mario to other areas, which can be used to practice specific area (e.g. outside of BH2 wildmill, secret stage entering) + - Restarting acts like `D-Pad Up`, and therefore can be used to practice Honey Skip, etc. + +### Example of Usage: Practising Honey Skip +1. Press `R + D-Pad Left` to enable Area Lock +2. Press `C-Stick LeftDown + D-Pad Up` to go to Pianta Village +3. Press `C-Stick RightDown + Y + D-Pad Up` to go to Pinna unlock plaza +4. Practice Honey Skip as much as you want! It will restart automatically when you are going to leave the area so you don't need to reset manually. You can also restart with `D-Pad Up` if you want. diff --git a/InstantLevelSelectExtra/info.xml b/InstantLevelSelectExtra/info.xml new file mode 100644 index 0000000..0127113 --- /dev/null +++ b/InstantLevelSelectExtra/info.xml @@ -0,0 +1,68 @@ + + misc + Instant Level Select Extra + レベル選択EX + sup39(サポミク) + 1.0 + Feb 09, 2024 + + ::: warning + Do not use this code when opening/closing Z menu, or the game may crash! + ::: + + #### Instant Restart + - Press `D-Pad Up` to **restart the current area** + - The **respawn position** will be the same. It can be used to practice Honey Skip or stage movement in Delfino Plaza + + #### Reset to Shine Select + - Press `D-Pad Down` to **reset to shine select of current stage** + - Pressing `D-Pad Down` in Plaza has no effect + + #### Level Select + Press `{the following button combination} + D-Pad Up` to warp to other area instantly: + ![Level Select Combinations](/img/levelselect.png) + + - For `Z + D-Pad Up`, the current area will be restarted, but the **respawn position will be reset**. It is like `D-Pad Up`, but the respawn position will be the default position instead of the previous one + - For `Y + D-Pad Up`, it will restart from the **previous selected area**. For example, if you select SB4 with this code, and enter hotel/casino then press `Y+D-Pad Up`, it will restart from SB4 beach (instead of hotel/casino if you use `D-Pad Up` or `Z+D-Pad Up`) + + #### Area Lock + - Press `R + D-Pad Left/Right` to enable/disable **Area Lock** + - With Area Lock, warps will restart the current area instead of sending Mario to other areas, which can be used to practice specific area (e.g. outside of BH2 wildmill, secret stage entering) + - Restarting acts like `D-Pad Up`, and therefore can be used to practice Honey Skip, etc. + + #### Example of Usage: Practising Honey Skip + 1. Press `R + D-Pad Left` to enable Area Lock + 2. Press `C-Stick LeftDown + D-Pad Up` to go to Pianta Village + 3. Press `C-Stick RightDown + Y + D-Pad Up` to go to Pinna unlock plaza + 4. Practice Honey Skip as much as you want! It will restart automatically when you are going to leave the area so you don't need to reset manually. You can also restart with `D-Pad Up` if you want. + + + ::: warning + Zメニューを開く・閉じる最中にこのコードを使うとクラッシュする可能性があります + ::: + + #### ポーズせずにやり直し + - `十字キー上`で**現在のエリアをやり直す** + - ドルピックタウンでは同じ開始位置からやり直すので、ハニスキといったステージ移動の練習も可能 + + #### シャイン選択画面からやり直し + - `十字キー下`で**現在のステージのシャイン選択画面からやり直す** + + #### レベル選択 + `{次のボタン}+十字キー上`でレベル選択 + + ![レベル選択](/img/levelselect.png) + + - `Z+十字キー上`は**現在のエリアをやり直す**が、ドルピックタウンでの**開始位置がリセット**され、デフォルトの開始位置からとなる(`十字キー上`の場合はリセットされない) + - `Y+十字キー上`は**前回選択したレベル**からやり直す(例えばSB4を選択し、ホテル・カジノに入って`Y+十字キー`を押すと、ホテル外からやり直すことになる) + #### エリアロック + `R+十字キー左/右`でエリアロック/ロック解除 + - エリアロックするとステージ移動がやり直しに置き換え、ヒミツINといった特定のエリアの練習が可能 + - やり直しの仕様は`十字キー上`と同じなので、ハニスキなどの練習にも使える + #### 使用例:ハニスキの練習 + 1. `R + 十字キー左`でエリアロック + 2. `Cスティック左下 + 十字キー上`でモンテの村に移動 + 3. `Cスティック右下 + Y + 十字キー上`でピンナ解放のドルピックタウンに移動 + 4. これで好きなだけハニスキを練習できます。他のエリアに入ろうとする時に自動的にやり直すので、手動でやり直す必要がありません。必要であれば`十字キー上`でやり直すこともできます。 + + diff --git a/InstantLevelSelectExtra/make.py b/InstantLevelSelectExtra/make.py new file mode 100644 index 0000000..e743e4b --- /dev/null +++ b/InstantLevelSelectExtra/make.py @@ -0,0 +1,13 @@ +from supSMSGecko import make_xml, symbols + +def main(g, ver): + S = symbols[ver] + + # Instant Level Select main function + g.C2(0x220 + S['TApplication_gameLoop'], 'src/main.s', extra_as_input=[ + '.set $LevelSelect.area, 0x817F0028', + '.set $LevelSelect.epFlag, 0x817F002A', + '.set $LevelSelect.AreaLock, 0x817F002B', + ]); + +make_xml(main) diff --git a/InstantLevelSelectExtra/src/main.s b/InstantLevelSelectExtra/src/main.s new file mode 100644 index 0000000..45bad35 --- /dev/null +++ b/InstantLevelSelectExtra/src/main.s @@ -0,0 +1,310 @@ +.set rC, 3 # SHOULD NOT BE USE UNTIL checkAreaLock ENDS +.set r817F, 4 +.set rBtn, 5 +.set rC4, 5 +.set rIdx, 6 +.set rAns, 7 +.set rAnsEp, 8 +.set rD, 9 # BL trick +.set rFM, 11 # FlagManager +.set rTmp, 10 +.set rApp, 31 # gpApplication +.set rNextGameMode, 29 +.set crAreaLock, 7 +.set $btnLevelSelect, 0x8 # D_UP +.set $btnShineSelect, 0x4 # D_DOWN + +.L.prepare: +## prepare registers + lis r817F, 0x817F + lwz rFM, TFlagManager_smInstance$r13(r13) + +## read button input: [M]*1 [C]*1 [btn]*2 + lis r12, JUTGamePad_mPadButton@ha + lwz rBtn, JUTGamePad_mPadButton@l(r12) + +/** NOTE: DO NOT CHANGE r12 UNTIL checkAreaLock ENDS */ +.L.checkAreaLock: +## r0 = 0x22 - btn + subfic r0, rBtn, 0x22 +### (lower 16 bit of r0 & ~1) == 0 => use r0&1 as AreaLock enable state + rlwinm. rTmp, r0, 0, 0x10, 0x1E + beq .L.checkAreaLock.1 +### else, load r0 = current state from RAM + lbz r0, $LevelSelect.AreaLock@l(r817F) +.L.checkAreaLock.1: +## !cr0.eq: AreaLock enabled + rlwinm. r0, r0, 0, 0x1 +## write current enable state to RAM + stb r0, $LevelSelect.AreaLock@l(r817F) + +## activate AreaLock only if director finished (rNextGameMode > 1) + cmplwi cr1, r3, 1 + crandc eq, 4*cr1+gt, eq + bne+ .L.checkAreaLock.done + +## set button input to (handleRestartN) if AreaLock enabled + li rBtn, $btnLevelSelect + stw rBtn, JUTGamePad_mPadButton@l(r12) + +.L.checkAreaLock.done: +## orig + mr. rNextGameMode, r3 +## return now if still setting up + beq .L.done + + +## check button (Shine Select) +.L.checkButton.ShineSelect: + andi. r0, rBtn, $btnShineSelect + beq+ .L.checkButton.ShineSelect.done +.ShineSelect: +## rAns = shineStageTable[curArea] + lbz r0, 0xE(rApp) # current area + lis rTmp, shineStageTable@ha + la rTmp, shineStageTable@l(rTmp) + lbzx rAns, rTmp, r0 +## ignore Plaza (rAns <= 1) + cmpwi rAns, 1 + ble .L.done +## map 7~8 to 8~9 + addi r0, rAns, 1 + rlwinm r0, r0, 32-3, 0x1 + add rAns, rAns, r0 +## rAns = rAns << 8 | 0xff + rlwinm rAns, rAns, 8, 0, 31 + ori rAns, rAns, 0xFF +## TODO handle invalid shine stage (0, 1, 0xFF) + b handleRestartZ +.L.checkButton.ShineSelect.done: + + +### check button (Level Select) +.L.checkButton.LevelSelect: + andi. r0, rBtn, $btnLevelSelect + beq+ .L.done + +## Level Select + bl .L.LevelSelect +.D: +.D.Special: + # 8 bit/entry: [1bit] epFlag==7 | [7bit] area + .long 0x00141516 + .long 0x0017181D + .long 0x34000090 # Red coin fish@NB8: 0x80|0x10 +.D.Secrets: + # 8 bit/entry: [1bit] ep==1 | [7bit] area + .long 0x2F2E3020 + .long 0x32293328 + .long 0x2A1FBA3C +.D.Sublevels: + # 8 bit/entry + .long 0x371E213A + .long 0x0E2C3900 +.D.Plaza: + .long 0x00010507 + .long 0x08090200 +.D.Extra: +.D.PinnaPark: +## ep: 0,1,2,3,4,5,7 | area=D +## epFlag: 0,2,4,5,6,7,0 + .long 0x123457D0 + .long 0x24567000 +.D.SirenaHotel: +## ep: 0,1,2,2,3,4 | area=7 +## episo: 1,2,3,4,6,7 + .long 0x12234070 + .long 0x23467001 + +.L.LevelSelect: + mflr rD + +.L.main: +## calc index +## btn: S YXZA -LRZ ---- +## XZRL=8,4,2,1 + rlwinm rIdx, rBtn, 32-7, 0x8 # X=8 + rlwimi rIdx, rBtn, 32-2, 0x4 # Z=4 + rlwimi rIdx, rBtn, 32-4, 0x2 # R=2 + rlwimi rIdx, rBtn, 32-6, 0x1 # L=1 +## YSY=8,4,2 + rlwinm r0, rBtn, 32- 8, 0x8 # Y=+8 + rlwimi r0, rBtn, 32-10, 0x6 # S,Y=4,+2 +## merge XZRL and YSY- + or rIdx, rIdx, r0 +# TODO? handle rIdx>=12 + +## check C==0(Special) or 9(Secrets) + rlwinm. rC, rBtn, 32-16, 0xF + beq handleSpecial + cmpwi rC, 9 + beq handleSecrets + +## calc C index +### [(*), 6, 2, (*); 4, 5, 3, (*); 0, (*), 1] +### 110 0/10 00/0 100/ 101 0|11 00/0 000/ 000 0/01 00 +.set CIdxMagic, 06204530001<<(32-3*10) +### CIdx = magic <<(3*C) &7 + lis r0, CIdxMagic@h + ori r0, r0, CIdxMagic@l + mulli rC, rC, 3 + rlwnm rC, r0, rC, 0x7 +## prepare CIdx<<2 (destroy rBtn) + slwi rC4, rC, 2 + +## Y+Z(14) -> SirenaHotel +## X+Z(12) -> PinnaPark + cmpwi rIdx, 12 + bge handleExtra + +## Y(10) -> Plaza + cmpwi rIdx, 10 + bge handlePlaza +## X(8) -> Sublevels + cmpwi rIdx, 8 + bge handleSublevels + +## stage +### area: [2, 3, 4, 5, 6, 8, 9, (*)] +### magic = 0x34568902 rotl sizeof(0xFF) +### ans = idx | (magic<<(Cidx<<2)) &0x0F00 +### ep = idx + lis r0, 0x5689 + ori r0, r0, 0x0234 + slwi r12, rC, 2 + rlwnm r12, r0, r12, 0x0F00 + or rAns, rIdx, r12 + rlwinm rAnsEp, rIdx, 0, 0x7 + b .L.loadStage + +handleSpecial: + lhz rAns, 0xE(rApp) # backup for handleRestartN +## neutral + cmpwi rIdx, 0 + beq handleRestartN +## Z restart + cmpwi rIdx, 4 + beq handleRestartZ +## Y restart + cmpwi rIdx, 10 + beq handleRestartY +## Special + # rD = .D.Special + lbzx r0, rD, rIdx # offset = idx + rlwinm rAns, r0, 8, 0x3F00 + rlwinm rAnsEp, r0, 32-7, 0x1 + mulli rAnsEp, rAnsEp, 7 + b .L.loadStage + +handleRestartN: +## set prevMap = curMap + lhz r0, 0xA(rApp) + sth r0, 0xE(rApp) +handleRestartZ: +## load curMap, ep + lbz rAnsEp, 0xDF(rFM) + b .L.loadStageWithoutBackup +handleRestartY: # load 817F0000 + lhz rAns, $LevelSelect.area@l(r817F) + lbz rAnsEp, $LevelSelect.epFlag@l(r817F) + b .L.loadStage + +handleSecrets: + la r12, .D.Secrets-.D(rD) + lbzx r0, r12, rIdx + rlwinm rAns, r0, 8, 0x3F00 + rlwimi rAns, r0, 32-7, 0x0001 + # ep: 2,5,3,0,1,5,1,3,4,5,0,* + .set SecretEpMagic, 05301513450<<2 | 02 + lis r0, SecretEpMagic@h + ori r0, r0, SecretEpMagic@l + mulli r12, rIdx, 3 + rlwnm rAnsEp, r0, r12, 0x7 + b .L.loadStage + +handleSublevels: + la r12, .D.Sublevels-.D(rD) + lbzx r0, r12, rC # Cidx as index + rlwinm rAns, r0, 8, 0x3F00 + # ep: 1,1,3,7,3,2,3 + .set SublevelEpMagic, 0x13732301 + lis r0, SublevelEpMagic@h + ori r0, r0, SublevelEpMagic@l + rlwnm rAnsEp, r0, rC4, 0x7 + b .L.loadStage + +handleExtra: + la r12, .D.Extra-.D-12*4(rD) + rlwinm r0, rIdx, 2, 0x38 # offset: {12,14}<<2 + lwzux r0, r12, r0 + rlwnm rAns, r0, rC4, 0x7 # ep + rlwimi rAns, r0, 4, 0x0F00 # a0 => aEE + lwz r0, 4(r12) + rlwnm rAnsEp, r0, rC4, 0x7 + b .L.loadStage + +handlePlaza: +## [0, 1, 5, 7; 8, 9, 2, (*)] +## 15789200 +## ans == 0x0100 | (magic << (arr:=CIdx<<2) &0xF) + .set PlazaEpMagic, 0x15789200 + lis r0, PlazaEpMagic@h + ori r0, r0, PlazaEpMagic@l + rlwnm rAns, r0, rC4, 0xF + ori rAns, rAns, 0x0100 + li rAnsEp, 0 + +.L.loadStage: +### backup to 817F0000 (for Y) + sth rAns, $LevelSelect.area@l(r817F) + stb rAnsEp, $LevelSelect.epFlag@l(r817F) + +/* rAns, rAnsEp, rFM, rApp, r817F */ +.L.loadStageWithoutBackup: +## reset QFT + li r0, 1 + stb r0, 0xB3(r817F) +## FlagManager +### epFlag(40003) + stb rAnsEp, 0xDF(rFM) +### reset coin counter(40002) + li r0, 0 + stw r0, 0xD8(rFM) +##### set SGT Stop Stopwatch Flag = 0 +# stw r0, 0x10C(r817F) +### set flag + lhz r0, 0xCC(rFM) +#### Got a Shine in previous stage (30006) + ori r0, r0, 0x4000 +#### clear watched Pinna kidnap FMV flag (prevent spawn in PP unlocked position) + rlwinm r0, r0, 0, 0x14, 0x12 + sth r0, 0xCC(rFM) +## rApp = gpApplication +### write nextArea + sth rAns, 0x12(rApp) + +.set rMGP, 12 +# SirenaHotel(0x07) or Casino(0x0E) ? 59 : 0 + rlwinm r0, rAns, 32-8, 0xFF # area + lwz rMGP, 0x20(rApp) # TMarioGamePad* + cmpwi r0, 0x07 # SirenaHotel + cmpwi cr1, r0, 0x0E # Casino + cror eq, eq, 4*cr1+eq + li r0, 59 + beq- .L.handleStickCD + li r0, 0 +.L.handleStickCD: + sth r0, 0xe4(rMGP) + +.L.handleStickFlag: +## clear 0x2 bit of 0xe2 flag + lhz r0, 0xe2(rMGP) + rlwinm r0, r0, 0, 31, 29 + sth r0, 0xe2(rMGP) + +## nextGameMode = nextArea == (shine select) ? 8 : 5 + ## ep==0xFF ? 3 : 0 (Note: all valid ep id < 0x40) + rlwinm rNextGameMode, rAns, 32-6, 0x3 + addi rNextGameMode, rNextGameMode, 5 + +.L.done: