From 898ea733ac74a7e08692e1b627428d874be646b3 Mon Sep 17 00:00:00 2001 From: sup39 Date: Sun, 29 Jan 2023 04:39:18 +0900 Subject: [PATCH 01/20] Rewrote drawText and related codes - Reduced parameters to struct pointer + format string + varargs - Rewrote QFT, Pattern Selector, Customized Display with the new drawText function - Added PAL font (TODO: NTSC-U) - Merged P/A/S Display and Speed Display to Customized Display - Provided background options to Pattern Selector and Customized Display --- Codes.xml | 1189 +++++---------- Readme.md | 4 +- Removed-Codes.xml | 420 +++++ changelog.md | 9 + site/.vuepress/components/Generator.vue | 7 +- site/.vuepress/components/Preview.vue | 73 +- site/.vuepress/components/PreviewString.vue | 94 +- .../codes/CustomizedDisplay/codegen.js | 167 +- .../codes/CustomizedDisplay/config.vue | 46 +- .../codes/CustomizedDisplay/configDB.js | 58 + .../codes/CustomizedDisplay/labels.json | 18 +- .../codes/InstantRestart/config.vue | 8 +- .../codes/PatternSelector/code/GMSE01.js | 46 + .../codes/PatternSelector/code/GMSJ01.js | 57 +- .../codes/PatternSelector/code/GMSJ0A.js | 56 +- .../codes/PatternSelector/code/GMSP01.js | 46 + .../codes/PatternSelector/codegen.js | 150 +- .../codes/PatternSelector/config.vue | 13 +- .../.vuepress/components/codes/TextConfig.vue | 20 +- site/.vuepress/components/codes/addrs.js | 28 + site/.vuepress/components/codes/asm.js | 66 +- site/.vuepress/components/codes/labels.json | 26 +- .../.vuepress/components/codes/qft/codegen.js | 42 +- .../.vuepress/components/codes/qft/config.vue | 58 +- .../components/codes/qft/labels.json | 24 - site/.vuepress/components/codes/text.js | 57 + site/.vuepress/components/codes/utils.js | 54 +- site/.vuepress/data/charInfo-EU.json | 1346 +++++++++++++++++ .../data/{font-jp.json => charInfo-JP.json} | 814 +++++----- site/.vuepress/public/img/preview/font-EU.png | Bin 0 -> 31076 bytes site/.vuepress/public/img/preview/font-JP.png | Bin 0 -> 74465 bytes site/.vuepress/public/img/preview/font-jp.png | Bin 39075 -> 0 bytes 32 files changed, 3347 insertions(+), 1649 deletions(-) create mode 100644 site/.vuepress/components/codes/CustomizedDisplay/configDB.js create mode 100644 site/.vuepress/components/codes/PatternSelector/code/GMSE01.js create mode 100644 site/.vuepress/components/codes/PatternSelector/code/GMSP01.js create mode 100644 site/.vuepress/components/codes/addrs.js create mode 100644 site/.vuepress/components/codes/text.js create mode 100644 site/.vuepress/data/charInfo-EU.json rename site/.vuepress/data/{font-jp.json => charInfo-JP.json} (79%) create mode 100644 site/.vuepress/public/img/preview/font-EU.png create mode 100644 site/.vuepress/public/img/preview/font-JP.png delete mode 100644 site/.vuepress/public/img/preview/font-jp.png diff --git a/Codes.xml b/Codes.xml index 0a323a9..c1a6c8d 100644 --- a/Codes.xml +++ b/Codes.xml @@ -1237,12 +1237,9 @@ Quarterframe Timer QFタイマー Noki Doki, sup39(サポミク) - 1.4 - Dec 16, 2022 - drawText - drawText - drawText - drawText + 1.5 + Jan 28, 2023 + drawText Adds an in-game timer to every level, starting on the last black frame of the loading screen and ending as soon as the 'Shine Get' animation starts @@ -1260,8 +1257,8 @@ 41820010 B00700B2 3800FFFC 900700B4 60000000 00000000 - C2206738 0000001F - 3C60817F 6064011C + C22069E0 0000001B + 3C60817F 60640120 38630094 3D808020 398C1EA8 7D8803A6 4E800021 3C60817F @@ -1277,20 +1274,16 @@ 40A00010 7CE83B78 98E300B2 90E300B4 1D0803E9 38000078 - 7D080396 9421FFF0 - 380003E8 7CE80396 - 7C0701D6 7D004050 - 91010008 3800003C - 7D270396 7C0901D6 - 7D403850 80E30118 - 390300A4 80C30114 - 3D80817F 80A30110 - 618C0238 808300A0 - 7D8803A6 80630094 - 4E800021 38210010 - 38610E90 3D808003 - 398C5228 7D8803A6 - 4E800021 881F0046 + 7D080396 380003E8 + 7D280396 7C0901D6 + 7CE04050 3800003C + 7CA90396 7C0501D6 + 7CC04850 3D80817F + 618C0238 7D8803A6 + 388300A4 38630110 + 4E800021 38610E90 + 3D808003 398C5228 + 7D8803A6 4E800021 60000000 00000000 C20EFA30 00000005 3CA0817F A00500B2 @@ -1337,8 +1330,8 @@ 41820010 B00700B2 3800FFFC 900700B4 60000000 00000000 - C2143F18 0000001F - 3C60817F 6064011C + C21441C0 0000001B + 3C60817F 60640120 38630094 3D808014 398C0390 7D8803A6 4E800021 3C60817F @@ -1354,20 +1347,16 @@ 40A00010 7CE83B78 98E300B2 90E300B4 1D0803E9 38000078 - 7D080396 9421FFF0 - 380003E8 7CE80396 - 7C0701D6 7D004050 - 91010008 3800003C - 7D270396 7C0901D6 - 7D403850 80E30118 - 390300A4 80C30114 - 3D80817F 80A30110 - 618C0238 808300A0 - 7D8803A6 80630094 - 4E800021 38210010 - 38610BD0 3D80802F - 398CB6BC 7D8803A6 - 4E800021 881F0046 + 7D080396 380003E8 + 7D280396 7C0901D6 + 7CE04050 3800003C + 7CA90396 7C0501D6 + 7CC04850 3D80817F + 618C0238 7D8803A6 + 388300A4 38630110 + 4E800021 38610BD0 + 3D80802F 398CB6BC + 7D8803A6 4E800021 60000000 00000000 C229C520 00000005 3CA0817F A00500B2 @@ -1414,8 +1403,8 @@ 41820010 B00700B2 3800FFFC 900700B4 60000000 00000000 - C2138B54 0000001F - 3C60817F 6064011C + C2138DFC 0000001B + 3C60817F 60640120 38630094 3D808013 398C4F0C 7D8803A6 4E800021 3C60817F @@ -1431,20 +1420,16 @@ 40A00010 7CE83B78 98E300B2 90E300B4 1D0803E9 38000078 - 7D080396 9421FFF0 - 380003E8 7CE80396 - 7C0701D6 7D004050 - 91010008 3800003C - 7D270396 7C0901D6 - 7D403850 80E30118 - 390300A4 80C30114 - 3D80817F 80A30110 - 618C0238 808300A0 - 7D8803A6 80630094 - 4E800021 38210010 - 38610BE4 3D80802E - 398C3864 7D8803A6 - 4E800021 881F0046 + 7D080396 380003E8 + 7D280396 7C0901D6 + 7CE04050 3800003C + 7CA90396 7C0501D6 + 7CC04850 3D80817F + 618C0238 7D8803A6 + 388300A4 38630110 + 4E800021 38610BE4 + 3D80802E 398C3864 + 7D8803A6 4E800021 60000000 00000000 C22943FC 00000005 3CA0817F A00500B2 @@ -1491,8 +1476,8 @@ 41820010 B00700B2 3800FFFC 900700B4 60000000 00000000 - C21252A4 0000001F - 3C60817F 6064011C + C212554C 0000001B + 3C60817F 60640120 38630094 3D808012 398C1660 7D8803A6 4E800021 3C60817F @@ -1508,20 +1493,16 @@ 40A00010 7CE83B78 98E300B2 90E300B4 1D0803E9 38000078 - 7D080396 9421FFF0 - 380003E8 7CE80396 - 7C0701D6 7D004050 - 91010008 3800003C - 7D270396 7C0901D6 - 7D403850 80E30118 - 390300A4 80C30114 - 3D80817F 80A30110 - 618C0238 808300A0 - 7D8803A6 80630094 - 4E800021 38210010 - 38610BEC 3D80802D - 398CAECC 7D8803A6 - 4E800021 881F0046 + 7D080396 380003E8 + 7D280396 7C0901D6 + 7CE04050 3800003C + 7CA90396 7C0501D6 + 7CC04850 3D80817F + 618C0238 7D8803A6 + 388300A4 38630110 + 4E800021 38610BEC + 3D80802D 398CAECC + 7D8803A6 4E800021 60000000 00000000 C227C214 00000005 3CA0817F A00500B2 @@ -2793,447 +2774,18 @@ 60000000 00000000 - - metadata - PASDisplay - Position/angle/speed display - Position/Winkel/Geschw. Display - Affichage de position/angle/vitesse - 位置/角度/速度表示 - Noki Doki, sup39(サポミク) - 1.4 - Mar 24, 2022 - drawText - drawText - - Shows Mario's position, angle and speed at any given time. - - ::: warning - This code is not compatible with the Speed Display code. - ::: - - - Zeigt Mario's Position, Winkel und Geschwindigkeit jederzeit auf dem Bildschirm an. - - ::: warning - Dieser Code ist nicht kompatibel mit dem Geschwindigkeits-Display Code - ::: - - Affiche la position, l'angle et la vitesse de Mario à tout moment. - 常に「マリオの位置」「マリオの角度」「マリオの速度」を表示します。 - - 062A6160 00000010 - 49553F19 60000000 - 60000000 60000000 - 042998B8 49560749 - 04143F14 496B6209 - 077FA000 000001E8 - 9421FFE0 7C0802A6 - 90010024 93E1001C - 4AABD6E5 38E00200 - 38C00320 38A0FFD8 - 3880000A 38610008 - 4AAD01B9 814D9FC8 - 3FE08180 3BFFA1EC - 39200000 39000002 - 3CE08180 38E7A164 - 80CA0048 38A10008 - 38800000 7FE3FB78 - 4AAD67F1 39200001 - 913F01B0 80010024 - 7C0803A6 83E1001C - 38210020 4E800020 - 9421FFE8 7C0802A6 - 9001001C 93A1000C - 93C10010 93E10014 - 7C7F1B78 81230000 - 83A90064 3D208180 - 8129A39C 2F890000 - 409E002C 7FE3FB78 - 7FA903A6 4E800421 - 8001001C 7C0803A6 - 83A1000C 83C10010 - 83E10014 38210018 - 4E800020 3D208040 - 6129E0E8 83C90000 - 3C608180 3863A1EC - 4AAD6B79 C0BE00A8 - C09E00B0 A0DE0096 - C07E0018 C05E0014 - C03E0010 3CA08180 - 38A5A164 38800080 - 4CC63242 4AB3F691 - 4BFFFF94 9421FFF0 - 7C0802A6 90010014 - 93E1000C 7C7F1B78 - 4AAF158D 38E00081 - 7FE6FB78 38A00000 - 38800000 3C608180 - 3863A1EC 4AAD5C5D - 80010014 7C0803A6 - 83E1000C 38210010 - 4E800020 5820506F - 7320252E 30660A59 - 20506F73 20252E30 - 660A5A20 506F7320 - 252E3066 0A416E67 - 6C652025 68750A48 - 20537064 20252E32 - 660A5620 53706420 - 252E3266 20202020 - 20202020 20202020 - 20202020 20202020 - 20202020 20202020 - 20202020 20202020 - 20202020 20202020 - 20202020 20202020 - 20202020 20202020 - 20202000 00000000 - C22A66F4 00000003 - 38600000 3D808180 - 906CA39C 807F0040 - 60000000 00000000 - - - 04206734 495F38CD - 077FA000 000000B5 - 9421FFF0 7C0802A6 - 90010014 93E1000C - 7C7F1B78 4A83B215 - 3D208041 8149A378 - 3D008180 38600010 - 3908A074 C0AA00A8 - 38E0FFFF C08A00B0 - 38C0FFFF A12A0096 - 38A00014 C06A0018 - 388000C8 C04A0014 - C02A0010 4CC63242 - 4BFF61E1 80010014 - 7FE3FB78 83E1000C - 7C0803A6 38210010 - 4A83B1B8 5820506F - 7320252E 30660A59 - 20506F73 20252E30 - 660A5A20 506F7320 - 252E3066 0A416E67 - 6C652025 68750A48 - 20537064 20252E32 - 660A5620 53706420 - 252E3266 00000000 - - - 041252A0 496D4D61 - 077FA000 000000B5 - 9421FFF0 7C0802A6 - 90010014 93E1000C - 7C7F1B78 4AAD0EB9 - 3D208040 8149EF88 - 3D008180 38600010 - 3908A074 C0AA00A8 - 38E0FFFF C08A00B0 - 38C0FFFF A12A0096 - 38A00014 C06A0018 - 388000C8 C04A0014 - C02A0010 4CC63242 - 4BFF61E1 80010014 - 7FE3FB78 83E1000C - 7C0803A6 38210010 - 4AAD0E5C 5820506F - 7320252E 30660A59 - 20506F73 20252E30 - 660A5A20 506F7320 - 252E3066 0A416E67 - 6C652025 68750A48 - 20537064 20252E32 - 660A5620 53706420 - 252E326600000000 - - - 0629E070 00000010 - 4955C009 60000000 - 60000000 60000000 - 04291750 495688B1 - 04138B50 496C15CD - 077FA000 000001E8 - 9421FFE0 7C0802A6 - 90010024 93E1001C - 4AAB56B5 38E00200 - 38C00320 38A0FFD8 - 3880000A 38610008 - 4AAC824D 814D9EF0 - 3FE08180 3BFFA1EC - 39200000 39000002 - 3CE08180 38E7A164 - 80CA0048 38A10008 - 38800000 7FE3FB78 - 4AACE999 39200001 - 913F01B0 80010024 - 7C0803A6 83E1001C - 38210020 4E800020 - 9421FFE8 7C0802A6 - 9001001C 93A1000C - 93C10010 93E10014 - 7C7F1B78 81230000 - 83A90064 3D208180 - 8129A39C 2F890000 - 409E002C 7FE3FB78 - 7FA903A6 4E800421 - 8001001C 7C0803A6 - 83A1000C 83C10010 - 83E10014 38210018 - 4E800020 3D208040 - 612957B0 83C90000 - 3C608180 3863A1EC - 4AACED21 C0BE00A8 - C09E00B0 A0DE0096 - C07E0018 C05E0014 - C03E0010 3CA08180 - 38A5A164 38800080 - 4CC63242 4AB37811 - 4BFFFF94 9421FFF0 - 7C0802A6 90010014 - 93E1000C 7C7F1B78 - 4AAE9735 38E00081 - 7FE6FB78 38A00000 - 38800000 3C608180 - 3863A1EC 4AACDE05 - 80010014 7C0803A6 - 83E1000C 38210010 - 4E800020 5820506F - 7320252E 30660A59 - 20506F73 20252E30 - 660A5A20 506F7320 - 252E3066 0A416E67 - 6C652025 68750A48 - 20537064 20252E32 - 660A5620 53706420 - 252E3266 20202020 - 20202020 20202020 - 20202020 20202020 - 20202020 20202020 - 20202020 20202020 - 20202020 20202020 - 20202020 20202020 - 20202020 20202020 - 20202000 00000000 - C229E64C 00000003 - 38600000 3D808180 - 906CA39C 807F0040 - 60000000 00000000 - - - - metadata - SpeedDisplay - Speed display - Geschwindigkeits-Display - Affichage de vitesse - 速度表示 - Noki Doki, sup39(サポミク) - 1.5 - Mar 24, 2022 - drawText - drawText - - Shows Mario's speed at any given time. - - ::: warning - This code is not compatible with the Position/Angle/Speed Display code. - ::: - - - Zeigt Mario's Geschwindigkeit jederzeit auf dem Bildschirm an. - - ::: warning - Dieser Code ist nicht kompatibel mit dem Position/Winkel/Gewschw. Display Code - ::: - - Affiche la vitesse de Mario à tout moment. - 常に「マリオの速度」を表示します。 - - 062A6160 00000010 - 49553F19 60000000 - 60000000 60000000 - 042998B8 49560749 - 04143F14 496B61F9 - 077FA000 00000188 - 9421FFE0 7C0802A6 - 90010024 93E1001C - 4AABD6E5 38E00200 - 38C00320 38A0FFD8 - 3880000A 38610008 - 4AAD01B9 814D9FC8 - 3FE08180 3BFFA214 - 39200000 39000002 - 3CE08180 38E7A154 - 80CA0048 38A10008 - 38800000 7FE3FB78 - 4AAD67F1 39200001 - 913F01B0 80010024 - 7C0803A6 83E1001C - 38210020 4E800020 - 9421FFE8 7C0802A6 - 9001001C 93C10010 - 93E10014 7C7F1B78 - 81230000 83C90064 - 3D208180 8129A3C4 - 2C090000 40820028 - 7FE3FB78 7FC903A6 - 4E800421 8001001C - 7C0803A6 83C10010 - 83E10014 38210018 - 4E800020 93A1000C - 3D208040 6129E0E8 - 83A90000 3C608180 - 3863A214 4AAD6B7D - C05D00A8 C03D00B0 - 3CA08180 38A5A154 - 38800030 4CC63242 - 4AB3F6A5 83A1000C - 4BFFFFA0 9421FFF0 - 7C0802A6 90010014 - 93E1000C 7C7F1B78 - 4AAF159D 38E00081 - 7FE6FB78 38A00000 - 38800000 3C608180 - 3863A214 4AAD5C6D - 80010014 7C0803A6 - 83E1000C 38210010 - 4E800020 48205370 - 6420252E 32660A56 - 20537064 20252E32 - 66202020 20202020 - 20202020 20202020 - 20202020 20202020 - 20202000 00000000 - C22A66F4 00000003 - 38600000 3D808180 - 906CA3C4 807F0040 - 60000000 00000000 - - - 04206734 495F38CD - 077FA000 0000007A - 9421FFF0 7C0802A6 - 90010014 93E1000C - 7C7F1B78 4A83B215 - 3D208041 8129A378 - 3D008180 38600010 - 3908A064 C04900A8 - 38E0FFFF C02900B0 - 38C0FFFF 38A00014 - 388000F0 4CC63242 - 4BFF61F1 80010014 - 7FE3FB78 83E1000C - 7C0803A6 38210010 - 4A83B1C8 48205370 - 6420252E 32660A56 - 20537064 20252E32 - 66000000 00000000 - - - 041252A0 496D4D61 - 077FA000 0000007A - 9421FFF0 7C0802A6 - 90010014 93E1000C - 7C7F1B78 4AAD0EB9 - 3D208040 8129EF88 - 3D008180 38600010 - 3908A064 C04900A8 - 38E0FFFF C02900B0 - 38C0FFFF 38A00014 - 388000F0 4CC63242 - 4BFF61F1 80010014 - 7FE3FB78 83E1000C - 7C0803A6 38210010 - 4AAD0E6C 48205370 - 6420252E 32660A56 - 20537064 20252E32 - 66000000 00000000 - - - 0629E070 00000010 - 4955C009 60000000 - 60000000 60000000 - 04291750 495688B1 - 04138B50 496C15BD - 077FA000 00000188 - 9421FFE0 7C0802A6 - 90010024 93E1001C - 4AAB56B5 38E00200 - 38C00320 38A0FFD8 - 3880000A 38610008 - 4AAC824D 814D9EF0 - 3FE08180 3BFFA214 - 39200000 39000002 - 3CE08180 38E7A154 - 80CA0048 38A10008 - 38800000 7FE3FB78 - 4AACE999 39200001 - 913F01B0 80010024 - 7C0803A6 83E1001C - 38210020 4E800020 - 9421FFE8 7C0802A6 - 9001001C 93C10010 - 93E10014 7C7F1B78 - 81230000 83C90064 - 3D208180 8129A3C4 - 2C090000 40820028 - 7FE3FB78 7FC903A6 - 4E800421 8001001C - 7C0803A6 83C10010 - 83E10014 38210018 - 4E800020 93A1000C - 3D208040 612957B0 - 83A90000 3C608180 - 3863A214 4AACED25 - C05D00A8 C03D00B0 - 3CA08180 38A5A154 - 38800030 4CC63242 - 4AB37825 83A1000C - 4BFFFFA0 9421FFF0 - 7C0802A6 90010014 - 93E1000C 7C7F1B78 - 4AAE9745 38E00081 - 7FE6FB78 38A00000 - 38800000 3C608180 - 3863A214 4AACDE15 - 80010014 7C0803A6 - 83E1000C 38210010 - 4E800020 48205370 - 6420252E 32660A56 - 20537064 20252E32 - 66202020 20202020 - 20202020 20202020 - 20202020 20202020 - 20202000 00000000 - C229E64C 00000003 - 38600000 3D808180 - 906CA3C4 807F0040 - 60000000 00000000 - - metadata CustomizedDisplay - Customized display + Customized Display カスタマイズ表示 sup39(サポミク) 0.3 - Oct 30, 2022 + Jan 28, 2023 drawText Shows metadata at any given time. - ::: warning - This code is not compatible with other Display codes. - ::: - - ::: warning - The preview is based on NTSC-J's font data, and may be inaccurate for NTSC-U and PAL. - In addition, some characters may not shown properly. - ::: - #### Format Use `< ID-of-the-data | format | value-shown-in-preview >` to display a metadata. @@ -3252,8 +2804,12 @@ For float data, you can set the *format* to `.{digit}` to specify how many digits to show. %details[ - %summary[All printable characters (for NTSC-J)] - ![Printable charaters](/img/preview/font-jp.png){style="background:black"} + %summary[All printable characters (in NTSC-J)] + ![Printable charaters](/img/preview/font-JP.png){style="background:black"} + ] + %details[ + %summary[All printable characters (in PAL)] + ![Printable charaters](/img/preview/font-EU.png){style="background:black"} ] #### Preview @@ -3281,8 +2837,12 @@ また、全てのひらがなとカタカナ及び一部の漢字の表示も可能です。 %details[ - %summary[表示可能な文字一覧:] - ![表示可能な文字一覧](/img/preview/font-jp.png){style="background:black"} + %summary[表示可能な文字一覧(初期版・後期版)] + ![表示可能な文字一覧(初期版・後期版)](/img/preview/font-JP.png){style="background:black;padding:8px"} + ] + %details[ + %summary[表示可能な文字一覧(欧州版)] + ![表示可能な文字一覧(欧州版)](/img/preview/font-EU.png){style="background:black;padding:8px"} ] #### プレビュー @@ -3771,7 +3331,7 @@ パターン選択 sup39(サポミク) 0.3 - Oct 30, 2022 + Jan 28, 2023 drawText Ⓑ is the cursor to select the pattern, @@ -3852,122 +3412,228 @@ %object[]{data="/img/PatternSelector/PV1-3.svg"} - 0424F32C 495A9CD5 - 042069DC 495F26B8 - 077F9000 000001AF - 801F0000 3D00817F - 61089167 3D40817F - 614A0024 3D80803D - 618CA9C0 7C006040 - 41820048 3D80803D - 618C87C0 7C006040 - 40820034 819F0004 - 898C0013 508C442E - 39280031 88080007 - 7CEA00AE A0080005 - 7C006040 41820024 - 39080007 7C084840 - 4180FFE4 4AA671C0 - 2C05FFFF 4082FFF8 - 88EA0000 39080031 - 7CE73B79 4182FFE8 - 7C0838AE 280000FF - 4182FFDC 7C030378 - 4E800020 38610E90 - 4A83C191 3C808040 - A4040D82 3C60817F - 84A30024 70000040 - 41A20050 88840019 - 548007FE 7CA02850 - 5480FFFE 7CA50214 - 54A507BE 5480F7BF - 41A20030 28050003 - 41A00008 38A00000 - 5480EFFE 5080077A - 7D8328AE 7D8C0214 - 280C0005 41A00008 - 398CFFFB 7D8329AE - 98A30003 3821FFF0 - 3D00817F 6108919D - 3C002020 60002023 - 54AC183E 5C00603E - 98080008 540CC63E - 9988000B 540C863E - 9988000E 89230000 - 89430001 89630002 - 91610008 38600010 - 38800140 38A00014 - 38C0FFFF 38E0FFFF - 4CC63182 4BFF70DD - 38210010 4AA0D87C - 452020FF 213200FF - 621CFF1D 32005025 - 25252630 01FF4520 - 20213001 FFFF621C - 1D300151 0707FF08 - 3102FF36 01FF0231 - 021E6E20 FF506174 - 7465726E 203E2558 - 3E25583E 25580000 + 0424F32C 495A9CD5 + 042069DC 495F26B8 + 077F9000 00000192 + 801F0000 3D00817F + 61089147 3D40817F + 614A0024 3D80803D + 618CA9C0 7C006040 + 41820048 3D80803D + 618C87C0 7C006040 + 40820034 819F0004 + 898C0013 508C442E + 39280031 88080007 + 7CEA00AE A0080005 + 7C006040 41820024 + 39080007 7C084840 + 4180FFE4 4AA671C0 + 2C05FFFF 4082FFF8 + 88EA0000 39080031 + 7CE73B79 4182FFE8 + 7C0838AE 280000FF + 4182FFDC 7C030378 + 4E800020 3C808040 + A4040D82 3C60817F + 85630024 70000040 + 41A20050 88840019 + 548007FE 7D605850 + 5480FFFE 7D6B0214 + 556B07BE 5480F7BF + 41A20030 280B0003 + 41A00008 39600000 + 5480EFFE 5080077A + 7D8358AE 7D8C0214 + 280C0005 41A00008 + 398CFFFB 7D8359AE + 99630003 3C002020 + 60002023 556C183E + 5C00603E 5405063E + 5407C63E 5409863E + 88C30000 89030001 + 89430002 3C60817F + 60639138 38830045 + 4BFF7109 4AA0D8AC + 00100140 00000014 + FFFFFFFF FFFFFFFF + 452020FF 213200FF + 621CFF1D 32005025 + 25252630 01FF4520 + 20213001 FFFF621C + 1D300151 0707FF08 + 3102FF36 01FF0231 + 021E6E20 FF506174 + 7465726E 20256325 + 58256325 58256325 + 58000000 00000000 - 04027900 497D1701 - 04125548 496D3B4C - 077F9000 000001AF - 801F0000 3D00817F - 61089167 3D40817F - 614A0024 3D80803A - 618C6D70 7C006040 - 41820048 3D80803A - 618C4B80 7C006040 - 40820034 819F0004 - 898C0013 508C442E - 39280031 88080007 - 7CEA00AE A0080005 - 7C006040 41820024 - 39080007 7C084840 - 4180FFE4 4A83F620 - 2C05FFFF 4082FFF8 - 88EA0000 39080031 - 7CE73B79 4182FFE8 - 7C0838AE 280000FF - 4182FFDC 7C030378 - 4E800020 38610E90 - 4AAD1E35 3C80803F - A404545A 3C60817F - 84A30024 70000040 - 41A20050 88840019 - 548007FE 7CA02850 - 5480FFFE 7CA50214 - 54A507BE 5480F7BF - 41A20030 28050003 - 41A00008 38A00000 - 5480EFFE 5080077A - 7D8328AE 7D8C0214 - 280C0005 41A00008 - 398CFFFB 7D8329AE - 98A30003 3821FFF0 - 3D00817F 6108919D - 3C002020 60002023 - 54AC183E 5C00603E - 98080008 540CC63E - 9988000B 540C863E - 9988000E 89230000 - 89430001 89630002 - 91610008 38600010 - 38800140 38A00014 - 38C0FFFF 38E0FFFF - 4CC63182 4BFF70DD - 38210010 4A92C3E8 - 452020FF 213200FF - 621CFF1D 32005025 - 25252630 01FF4520 - 20213001 FFFF621C - 1D300151 0707FF08 - 3102FF36 01FF0231 - 021E6E20 FF506174 - 7465726E 203E2558 - 3E25583E 25580000 + 04027900 497D1701 + 04125548 496D3B4C + 077F9000 00000192 + 801F0000 3D00817F + 61089147 3D40817F + 614A0024 3D80803A + 618C6D70 7C006040 + 41820048 3D80803A + 618C4B80 7C006040 + 40820034 819F0004 + 898C0013 508C442E + 39280031 88080007 + 7CEA00AE A0080005 + 7C006040 41820024 + 39080007 7C084840 + 4180FFE4 4A83F620 + 2C05FFFF 4082FFF8 + 88EA0000 39080031 + 7CE73B79 4182FFE8 + 7C0838AE 280000FF + 4182FFDC 7C030378 + 4E800020 3C80803F + A404545A 3C60817F + 85630024 70000040 + 41A20050 88840019 + 548007FE 7D605850 + 5480FFFE 7D6B0214 + 556B07BE 5480F7BF + 41A20030 280B0003 + 41A00008 39600000 + 5480EFFE 5080077A + 7D8358AE 7D8C0214 + 280C0005 41A00008 + 398CFFFB 7D8359AE + 99630003 3C002020 + 60002023 556C183E + 5C00603E 5405063E + 5407C63E 5409863E + 88C30000 89030001 + 89430002 3C60817F + 60639138 38830045 + 4BFF7109 4A92C418 + 00100140 00000014 + FFFFFFFF FFFFFFFF + 452020FF 213200FF + 621CFF1D 32005025 + 25252630 01FF4520 + 20213001 FFFF621C + 1D300151 0707FF08 + 3102FF36 01FF0231 + 021E6E20 FF506174 + 7465726E 20256325 + 58256325 58256325 + 58000000 00000000 + + + 0403B54C 497BDAB5 + 04138DF8 496C029C + 077F9000 00000192 + 801F0000 3D00817F + 61089147 3D40817F + 614A0024 3D80803A + 618CDF98 7C006040 + 41820048 3D80803A + 618CBDA8 7C006040 + 40820034 819F0004 + 898C0013 508C442E + 39280031 88080007 + 7CEA00AE A0080005 + 7C006040 41820024 + 39080007 7C084840 + 4180FFE4 4A8531C4 + 2C05FFFF 4082FFF8 + 88EA0000 39080031 + 7CE73B79 4182FFE8 + 7C0838AE 280000FF + 4182FFDC 7C030378 + 4E800020 3C808040 + A404BC26 3C60817F + 85630024 70000040 + 41A20050 88840019 + 548007FE 7D605850 + 5480FFFE 7D6B0214 + 556B07BE 5480F7BF + 41A20030 280B0003 + 41A00008 39600000 + 5480EFFE 5080077A + 7D8358AE 7D8C0214 + 280C0005 41A00008 + 398CFFFB 7D8359AE + 99630003 3C002020 + 60002023 556C183E + 5C00603E 5405063E + 5407C63E 5409863E + 88C30000 89030001 + 89430002 3C60817F + 60639138 38830045 + 4BFF7109 4A93FCC8 + 00100140 00000014 + FFFFFFFF FFFFFFFF + 452020FF 213200FF + 621CFF1D 32005025 + 25252630 01FF4520 + 20213001 FFFF621C + 1D300151 0707FF08 + 3102FF36 01FF0231 + 021E6E20 FF506174 + 7465726E 20256325 + 58256325 58256325 + 58000000 00000000 + + + 0403B6FC 497BD905 + 041441BC 496B4ED8 + 077F9000 00000192 + 801F0000 3D00817F + 61089147 3D40817F + 614A0024 3D80803B + 618C6178 7C006040 + 41820048 3D80803B + 618C3F88 7C006040 + 40820034 819F0004 + 898C0013 508C442E + 39280031 88080007 + 7CEA00AE A0080005 + 7C006040 41820024 + 39080007 7C084840 + 4180FFE4 4A854070 + 2C05FFFF 4082FFF8 + 88EA0000 39080031 + 7CE73B79 4182FFE8 + 7C0838AE 280000FF + 4182FFDC 7C030378 + 4E800020 3C808040 + A4044486 3C60817F + 85630024 70000040 + 41A20050 88840019 + 548007FE 7D605850 + 5480FFFE 7D6B0214 + 556B07BE 5480F7BF + 41A20030 280B0003 + 41A00008 39600000 + 5480EFFE 5080077A + 7D8358AE 7D8C0214 + 280C0005 41A00008 + 398CFFFB 7D8359AE + 99630003 3C002020 + 60002023 556C183E + 5C00603E 5405063E + 5407C63E 5409863E + 88C30000 89030001 + 89430002 3C60817F + 60639138 38830045 + 4BFF7109 4A94B08C + 00100140 00000014 + FFFFFFFF FFFFFFFF + 452020FF 213200FF + 621CFF1D 32005025 + 25252630 01FF4520 + 20213001 FFFF621C + 1D300151 0707FF08 + 3102FF36 01FF0231 + 021E6E20 FF506174 + 7465726E 20256325 + 58256325 58256325 + 58000000 00000000 @@ -3997,161 +3663,140 @@ lib drawText sup39(サポミク) - 0.2.0 - Mar 25, 2022 + 0.3 + Jan 02, 2023 - ```c - void drawText(int x, int y, int fontSize, uint32_t colorTop, uint32_t colorBot, const char *fmt, ...); - ``` + ```c + typedef struct { + int16_t x; + int16_t y; + uint32_t fontSize; + uint32_t colorTop; + uint32_t colorBot; + } DrawTextOpt; + void drawText(DrawTextOpt *opt, const char *fmt, ...); + ``` - 077F0238 00000110 - 9421FED8 7C0802A6 - BF810118 7C7F1B78 - 9001012C 7C9E2378 - 90C100B8 7CBD2B78 - 90E100BC 7D1C4378 - 912100C0 914100C4 - 40860024 D82100C8 - D84100D0 D86100D8 - D88100E0 D8A100E8 - D8C100F0 D8E100F8 - D9010100 39200600 - 390100BC B12100A0 - 39210130 912100A4 - 392100A8 912100A8 - 808D97F8 38E100B8 - 7FA6EB78 38A00000 - 38610008 6FDE8000 - 4A826AF5 3D204330 - 91210108 3D40817F - 93C1010C 6FFF8000 - C00A0344 38610070 - C9810108 91210110 - 3D20817F 93E10114 - FC4C0028 C0690340 - C9810110 93A10064 - FC2C0028 93A10060 - 4A8A43E9 38800000 - 38610070 4A8BD419 - 38C100A0 7F85E378 - 388000FF 38610008 - 4A826951 BB810118 - 38210128 80010004 - 7C0803A6 4E800020 - 00000000 59800004 - - - 077F0238 00000110 - 9421FED8 7C0802A6 - BF810118 7C7F1B78 - 9001012C 7C9E2378 - 90C100B8 7CBD2B78 - 90E100BC 7D1C4378 - 912100C0 914100C4 - 40860024 D82100C8 - D84100D0 D86100D8 - D88100E0 D8A100E8 - D8C100F0 D8E100F8 - D9010100 39200600 - 390100BC B12100A0 - 39210130 912100A4 - 392100A8 912100A8 - 808D9E88 38E100B8 - 7FA6EB78 38A00000 - 38610008 6FDE8000 - 4AABD249 3D204330 - 91210108 3D40817F - 93C1010C 6FFF8000 - C00A0344 38610070 - C9810108 91210110 - 3D20817F 93E10114 - FC4C0028 C0690340 - C9810110 93A10064 - FC2C0028 93A10060 - 4AB393C9 38800000 - 38610070 4AB523F9 - 38C100A0 7F85E378 - 388000FF 38610008 - 4AABD0A5 BB810118 - 38210128 80010004 - 7C0803A6 4E800020 - 00000000 59800004 - - - 077F0238 00000110 - 9421FED8 7C0802A6 - BF810118 7C7F1B78 - 9001012C 7C9E2378 - 90C100B8 7CBD2B78 - 90E100BC 7D1C4378 - 912100C0 914100C4 - 40860024 D82100C8 - D84100D0 D86100D8 - D88100E0 D8A100E8 - D8C100F0 D8E100F8 - D9010100 39200600 - 390100BC B12100A0 - 39210130 912100A4 - 392100A8 912100A8 - 808D9FC8 38E100B8 - 7FA6EB78 38A00000 - 38610008 6FDE8000 - 4AADDA39 3D204330 - 91210108 3D40817F - 93C1010C 6FFF8000 - C00A0344 38610070 - C9810108 91210110 - 3D20817F 93E10114 - FC4C0028 C0690340 - C9810110 93A10064 - FC2C0028 93A10060 - 4AB59AC9 38800000 - 38610070 4AB72AF9 - 38C100A0 7F85E378 - 388000FF 38610008 - 4AADD895 BB810118 - 38210128 80010004 - 7C0803A6 4E800020 - 00000000 59800004 - - - 077F0238 00000110 - 9421FED8 7C0802A6 - BF810118 7C7F1B78 - 9001012C 7C9E2378 - 90C100B8 7CBD2B78 - 90E100BC 7D1C4378 - 912100C0 914100C4 - 40860024 D82100C8 - D84100D0 D86100D8 - D88100E0 D8A100E8 - D8C100F0 D8E100F8 - D9010100 39200600 - 390100BC B12100A0 - 39210130 912100A4 - 392100A8 912100A8 - 808D9EF0 38E100B8 - 7FA6EB78 38A00000 - 38610008 6FDE8000 - 4AAD5ACD 3D204330 - 91210108 3D40817F - 93C1010C 6FFF8000 - C00A0344 38610070 - C9810108 91210110 - 3D20817F 93E10114 - FC4C0028 C0690340 - C9810110 93A10064 - FC2C0028 93A10060 - 4AB51D25 38800000 - 38610070 4AB6AD19 - 38C100A0 7F85E378 - 388000FF 38610008 - 4AAD5929 BB810118 - 38210128 80010004 - 7C0803A6 4E800020 - 00000000 59800004 - + 077F0238 000000D4 + 9421FF08 7C0802A6 + BFC100F0 7C7F1B78 + 900100FC 7C9E2378 + 90A10088 90C1008C + 90E10090 91010094 + 91210098 9141009C + D82100A0 D84100A8 + D86100B0 D88100B8 + D8A100C0 D8C100C8 + D8E100D0 D90100D8 + 39200200 80DF0004 + B1210070 39200000 + 39210100 91210074 + 39210080 91210078 + 808D97F8 391F000C + 38FF0008 38A00000 + 38610008 4A826AF9 + 813F0004 38610008 + 91210064 91210060 + A95F0000 388000FF + 91410024 7FC5F378 + E01F5000 38C10070 + F001002C 38000000 + 90010034 4A826985 + BBC100F0 382100F8 + 80010004 7C0803A6 + 4E800020 00000000 + + + 077F0238 000000D4 + 9421FF08 7C0802A6 + BFC100F0 7C7F1B78 + 900100FC 7C9E2378 + 90A10088 90C1008C + 90E10090 91010094 + 91210098 9141009C + D82100A0 D84100A8 + D86100B0 D88100B8 + D8A100C0 D8C100C8 + D8E100D0 D90100D8 + 39200200 80DF0004 + B1210070 39200000 + 39210100 91210074 + 39210080 91210078 + 808D9E88 391F000C + 38FF0008 38A00000 + 38610008 4AABD24D + 813F0004 38610008 + 91210064 91210060 + A95F0000 388000FF + 91410024 7FC5F378 + E01F5000 38C10070 + F001002C 38000000 + 90010034 4AABD0D9 + BBC100F0 382100F8 + 80010004 7C0803A6 + 4E800020 00000000 + + + 077F0238 000000D4 + 9421FF08 7C0802A6 + BFC100F0 7C7F1B78 + 900100FC 7C9E2378 + 90A10088 90C1008C + 90E10090 91010094 + 91210098 9141009C + D82100A0 D84100A8 + D86100B0 D88100B8 + D8A100C0 D8C100C8 + D8E100D0 D90100D8 + 39200200 80DF0004 + B1210070 39200000 + 39210100 91210074 + 39210080 91210078 + 808D9FC8 391F000C + 38FF0008 38A00000 + 38610008 4AADDA3D + 813F0004 38610008 + 91210064 91210060 + A95F0000 388000FF + 91410024 7FC5F378 + E01F5000 38C10070 + F001002C 38000000 + 90010034 4AADD8C9 + BBC100F0 382100F8 + 80010004 7C0803A6 + 4E800020 00000000 + + + 077F0238 000000D4 + 9421FF08 7C0802A6 + BFC100F0 7C7F1B78 + 900100FC 7C9E2378 + 90A10088 90C1008C + 90E10090 91010094 + 91210098 9141009C + D82100A0 D84100A8 + D86100B0 D88100B8 + D8A100C0 D8C100C8 + D8E100D0 D90100D8 + 39200200 80DF0004 + B1210070 39200000 + 39210100 91210074 + 39210080 91210078 + 808D9EF0 391F000C + 38FF0008 38A00000 + 38610008 4AAD5AD1 + 813F0004 38610008 + 91210064 91210060 + A95F0000 388000FF + 91410024 7FC5F378 + E01F5000 38C10070 + F001002C 38000000 + 90010034 4AAD595D + BBC100F0 382100F8 + 80010004 7C0803A6 + 4E800020 00000000 + InstantRestart diff --git a/Readme.md b/Readme.md index f6ec0b0..fa9e1d9 100644 --- a/Readme.md +++ b/Readme.md @@ -47,7 +47,9 @@ Some codes store some states in the games memory starting from address 0x817F000 | ![](./docs/reserved.svg) | `0x14` | `0x15` | DPad Functions: Stored Angle (Mario) | | ![](./docs/reserved.svg) | `0x16` | `0x1B` | DPad Functions: Stored Position (Camera) | | ![](./docs/reserved.svg) | `0x20` | `0x23` | Coin Count Savestate: Coin Count | -| ![](./docs/unallocated.svg) | `0x24` | `0x93` | Not Allocated | +| ![](./docs/reserved.svg) | `0x24` | `0x26` | Pattern Selector: Selected Pattern Numbers | +| ![](./docs/reserved.svg) | `0x27` | `0x27` | Pattern Selector: Cursor Position | +| ![](./docs/unallocated.svg) | `0x28` | `0x93` | Not Allocated | | ![](./docs/reserved.svg) | `0x94` | `0xA3` | QF Timer: Coordinates of the Text box (LTRB) | | ![](./docs/reserved.svg) | `0xA4` | `0xB0` | QF Timer: Timer Format String | | ![](./docs/reserved.svg) | `0xB0` | `0xB1` | QF Timer: (Unused) | diff --git a/Removed-Codes.xml b/Removed-Codes.xml index a753450..b673557 100644 --- a/Removed-Codes.xml +++ b/Removed-Codes.xml @@ -533,4 +533,424 @@ 60000000 00000000 + + metadata + PASDisplay + Position/angle/speed display + Position/Winkel/Geschw. Display + Affichage de position/angle/vitesse + 位置/角度/速度表示 + Noki Doki, sup39(サポミク) + 1.4 + Mar 24, 2022 + drawText + drawText + + Shows Mario's position, angle and speed at any given time. + + ::: warning + This code is not compatible with the Speed Display code. + ::: + + + Zeigt Mario's Position, Winkel und Geschwindigkeit jederzeit auf dem Bildschirm an. + + ::: warning + Dieser Code ist nicht kompatibel mit dem Geschwindigkeits-Display Code + ::: + + Affiche la position, l'angle et la vitesse de Mario à tout moment. + 常に「マリオの位置」「マリオの角度」「マリオの速度」を表示します。 + + 062A6160 00000010 + 49553F19 60000000 + 60000000 60000000 + 042998B8 49560749 + 04143F14 496B6209 + 077FA000 000001E8 + 9421FFE0 7C0802A6 + 90010024 93E1001C + 4AABD6E5 38E00200 + 38C00320 38A0FFD8 + 3880000A 38610008 + 4AAD01B9 814D9FC8 + 3FE08180 3BFFA1EC + 39200000 39000002 + 3CE08180 38E7A164 + 80CA0048 38A10008 + 38800000 7FE3FB78 + 4AAD67F1 39200001 + 913F01B0 80010024 + 7C0803A6 83E1001C + 38210020 4E800020 + 9421FFE8 7C0802A6 + 9001001C 93A1000C + 93C10010 93E10014 + 7C7F1B78 81230000 + 83A90064 3D208180 + 8129A39C 2F890000 + 409E002C 7FE3FB78 + 7FA903A6 4E800421 + 8001001C 7C0803A6 + 83A1000C 83C10010 + 83E10014 38210018 + 4E800020 3D208040 + 6129E0E8 83C90000 + 3C608180 3863A1EC + 4AAD6B79 C0BE00A8 + C09E00B0 A0DE0096 + C07E0018 C05E0014 + C03E0010 3CA08180 + 38A5A164 38800080 + 4CC63242 4AB3F691 + 4BFFFF94 9421FFF0 + 7C0802A6 90010014 + 93E1000C 7C7F1B78 + 4AAF158D 38E00081 + 7FE6FB78 38A00000 + 38800000 3C608180 + 3863A1EC 4AAD5C5D + 80010014 7C0803A6 + 83E1000C 38210010 + 4E800020 5820506F + 7320252E 30660A59 + 20506F73 20252E30 + 660A5A20 506F7320 + 252E3066 0A416E67 + 6C652025 68750A48 + 20537064 20252E32 + 660A5620 53706420 + 252E3266 20202020 + 20202020 20202020 + 20202020 20202020 + 20202020 20202020 + 20202020 20202020 + 20202020 20202020 + 20202020 20202020 + 20202020 20202020 + 20202000 00000000 + C22A66F4 00000003 + 38600000 3D808180 + 906CA39C 807F0040 + 60000000 00000000 + + + 04206734 495F38CD + 077FA000 000000B5 + 9421FFF0 7C0802A6 + 90010014 93E1000C + 7C7F1B78 4A83B215 + 3D208041 8149A378 + 3D008180 38600010 + 3908A074 C0AA00A8 + 38E0FFFF C08A00B0 + 38C0FFFF A12A0096 + 38A00014 C06A0018 + 388000C8 C04A0014 + C02A0010 4CC63242 + 4BFF61E1 80010014 + 7FE3FB78 83E1000C + 7C0803A6 38210010 + 4A83B1B8 5820506F + 7320252E 30660A59 + 20506F73 20252E30 + 660A5A20 506F7320 + 252E3066 0A416E67 + 6C652025 68750A48 + 20537064 20252E32 + 660A5620 53706420 + 252E3266 00000000 + + + 041252A0 496D4D61 + 077FA000 000000B5 + 9421FFF0 7C0802A6 + 90010014 93E1000C + 7C7F1B78 4AAD0EB9 + 3D208040 8149EF88 + 3D008180 38600010 + 3908A074 C0AA00A8 + 38E0FFFF C08A00B0 + 38C0FFFF A12A0096 + 38A00014 C06A0018 + 388000C8 C04A0014 + C02A0010 4CC63242 + 4BFF61E1 80010014 + 7FE3FB78 83E1000C + 7C0803A6 38210010 + 4AAD0E5C 5820506F + 7320252E 30660A59 + 20506F73 20252E30 + 660A5A20 506F7320 + 252E3066 0A416E67 + 6C652025 68750A48 + 20537064 20252E32 + 660A5620 53706420 + 252E326600000000 + + + 0629E070 00000010 + 4955C009 60000000 + 60000000 60000000 + 04291750 495688B1 + 04138B50 496C15CD + 077FA000 000001E8 + 9421FFE0 7C0802A6 + 90010024 93E1001C + 4AAB56B5 38E00200 + 38C00320 38A0FFD8 + 3880000A 38610008 + 4AAC824D 814D9EF0 + 3FE08180 3BFFA1EC + 39200000 39000002 + 3CE08180 38E7A164 + 80CA0048 38A10008 + 38800000 7FE3FB78 + 4AACE999 39200001 + 913F01B0 80010024 + 7C0803A6 83E1001C + 38210020 4E800020 + 9421FFE8 7C0802A6 + 9001001C 93A1000C + 93C10010 93E10014 + 7C7F1B78 81230000 + 83A90064 3D208180 + 8129A39C 2F890000 + 409E002C 7FE3FB78 + 7FA903A6 4E800421 + 8001001C 7C0803A6 + 83A1000C 83C10010 + 83E10014 38210018 + 4E800020 3D208040 + 612957B0 83C90000 + 3C608180 3863A1EC + 4AACED21 C0BE00A8 + C09E00B0 A0DE0096 + C07E0018 C05E0014 + C03E0010 3CA08180 + 38A5A164 38800080 + 4CC63242 4AB37811 + 4BFFFF94 9421FFF0 + 7C0802A6 90010014 + 93E1000C 7C7F1B78 + 4AAE9735 38E00081 + 7FE6FB78 38A00000 + 38800000 3C608180 + 3863A1EC 4AACDE05 + 80010014 7C0803A6 + 83E1000C 38210010 + 4E800020 5820506F + 7320252E 30660A59 + 20506F73 20252E30 + 660A5A20 506F7320 + 252E3066 0A416E67 + 6C652025 68750A48 + 20537064 20252E32 + 660A5620 53706420 + 252E3266 20202020 + 20202020 20202020 + 20202020 20202020 + 20202020 20202020 + 20202020 20202020 + 20202020 20202020 + 20202020 20202020 + 20202020 20202020 + 20202000 00000000 + C229E64C 00000003 + 38600000 3D808180 + 906CA39C 807F0040 + 60000000 00000000 + + + + metadata + SpeedDisplay + Speed display + Geschwindigkeits-Display + Affichage de vitesse + 速度表示 + Noki Doki, sup39(サポミク) + 1.5 + Mar 24, 2022 + drawText + drawText + + Shows Mario's speed at any given time. + + ::: warning + This code is not compatible with the Position/Angle/Speed Display code. + ::: + + + Zeigt Mario's Geschwindigkeit jederzeit auf dem Bildschirm an. + + ::: warning + Dieser Code ist nicht kompatibel mit dem Position/Winkel/Gewschw. Display Code + ::: + + Affiche la vitesse de Mario à tout moment. + 常に「マリオの速度」を表示します。 + + 062A6160 00000010 + 49553F19 60000000 + 60000000 60000000 + 042998B8 49560749 + 04143F14 496B61F9 + 077FA000 00000188 + 9421FFE0 7C0802A6 + 90010024 93E1001C + 4AABD6E5 38E00200 + 38C00320 38A0FFD8 + 3880000A 38610008 + 4AAD01B9 814D9FC8 + 3FE08180 3BFFA214 + 39200000 39000002 + 3CE08180 38E7A154 + 80CA0048 38A10008 + 38800000 7FE3FB78 + 4AAD67F1 39200001 + 913F01B0 80010024 + 7C0803A6 83E1001C + 38210020 4E800020 + 9421FFE8 7C0802A6 + 9001001C 93C10010 + 93E10014 7C7F1B78 + 81230000 83C90064 + 3D208180 8129A3C4 + 2C090000 40820028 + 7FE3FB78 7FC903A6 + 4E800421 8001001C + 7C0803A6 83C10010 + 83E10014 38210018 + 4E800020 93A1000C + 3D208040 6129E0E8 + 83A90000 3C608180 + 3863A214 4AAD6B7D + C05D00A8 C03D00B0 + 3CA08180 38A5A154 + 38800030 4CC63242 + 4AB3F6A5 83A1000C + 4BFFFFA0 9421FFF0 + 7C0802A6 90010014 + 93E1000C 7C7F1B78 + 4AAF159D 38E00081 + 7FE6FB78 38A00000 + 38800000 3C608180 + 3863A214 4AAD5C6D + 80010014 7C0803A6 + 83E1000C 38210010 + 4E800020 48205370 + 6420252E 32660A56 + 20537064 20252E32 + 66202020 20202020 + 20202020 20202020 + 20202020 20202020 + 20202000 00000000 + C22A66F4 00000003 + 38600000 3D808180 + 906CA3C4 807F0040 + 60000000 00000000 + + + 04206734 495F38CD + 077FA000 0000007A + 9421FFF0 7C0802A6 + 90010014 93E1000C + 7C7F1B78 4A83B215 + 3D208041 8129A378 + 3D008180 38600010 + 3908A064 C04900A8 + 38E0FFFF C02900B0 + 38C0FFFF 38A00014 + 388000F0 4CC63242 + 4BFF61F1 80010014 + 7FE3FB78 83E1000C + 7C0803A6 38210010 + 4A83B1C8 48205370 + 6420252E 32660A56 + 20537064 20252E32 + 66000000 00000000 + + + 041252A0 496D4D61 + 077FA000 0000007A + 9421FFF0 7C0802A6 + 90010014 93E1000C + 7C7F1B78 4AAD0EB9 + 3D208040 8129EF88 + 3D008180 38600010 + 3908A064 C04900A8 + 38E0FFFF C02900B0 + 38C0FFFF 38A00014 + 388000F0 4CC63242 + 4BFF61F1 80010014 + 7FE3FB78 83E1000C + 7C0803A6 38210010 + 4AAD0E6C 48205370 + 6420252E 32660A56 + 20537064 20252E32 + 66000000 00000000 + + + 0629E070 00000010 + 4955C009 60000000 + 60000000 60000000 + 04291750 495688B1 + 04138B50 496C15BD + 077FA000 00000188 + 9421FFE0 7C0802A6 + 90010024 93E1001C + 4AAB56B5 38E00200 + 38C00320 38A0FFD8 + 3880000A 38610008 + 4AAC824D 814D9EF0 + 3FE08180 3BFFA214 + 39200000 39000002 + 3CE08180 38E7A154 + 80CA0048 38A10008 + 38800000 7FE3FB78 + 4AACE999 39200001 + 913F01B0 80010024 + 7C0803A6 83E1001C + 38210020 4E800020 + 9421FFE8 7C0802A6 + 9001001C 93C10010 + 93E10014 7C7F1B78 + 81230000 83C90064 + 3D208180 8129A3C4 + 2C090000 40820028 + 7FE3FB78 7FC903A6 + 4E800421 8001001C + 7C0803A6 83C10010 + 83E10014 38210018 + 4E800020 93A1000C + 3D208040 612957B0 + 83A90000 3C608180 + 3863A214 4AACED25 + C05D00A8 C03D00B0 + 3CA08180 38A5A154 + 38800030 4CC63242 + 4AB37825 83A1000C + 4BFFFFA0 9421FFF0 + 7C0802A6 90010014 + 93E1000C 7C7F1B78 + 4AAE9745 38E00081 + 7FE6FB78 38A00000 + 38800000 3C608180 + 3863A214 4AACDE15 + 80010014 7C0803A6 + 83E1000C 38210010 + 4E800020 48205370 + 6420252E 32660A56 + 20537064 20252E32 + 66202020 20202020 + 20202020 20202020 + 20202020 20202020 + 20202000 00000000 + C229E64C 00000003 + 38600000 3D808180 + 906CA3C4 807F0040 + 60000000 00000000 + + diff --git a/changelog.md b/changelog.md index 10f9223..d68968b 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,13 @@ # Changelog +## Jan 28, 2023 +### Rewrote 'drawText' +- Reduced parameters to struct pointer + format string + varargs +- Rewrote QFT, Pattern Selector, Customized Display with the new drawText function +### Improved Preview +- Added PAL font (TODO: NTSC-U) +- Merged P/A/S Display and Speed Display to Customized Display +- Provided background options to Pattern Selector and Customized Display + ## Jan 10, 2023 ### Updated 'Quarterframe Timer' Added the following options to freeze QFT: diff --git a/site/.vuepress/components/Generator.vue b/site/.vuepress/components/Generator.vue index 8de2526..d55e4d6 100644 --- a/site/.vuepress/components/Generator.vue +++ b/site/.vuepress/components/Generator.vue @@ -136,8 +136,6 @@ export default { this.codeConfigs = { qft: getConfigQFT(), PatternSelector: getConfigPS(), - SpeedDisplay: {}, - PASDisplay: {}, CustomizedDisplay: getConfigCD(this.version), }; }, @@ -222,7 +220,10 @@ export default { .filter(code => !(code.category === category && exclusive)) .map(code => code.id)); ids.add(id); - return Object.fromEntries(Object.entries(this.codeConfigs).filter(([id]) => ids.has(id))); + return { + ...Object.fromEntries(Object.entries(this.codeConfigs).filter(([id]) => ids.has(id))), + _version: this.selectedVersion, + }; }, }, }; diff --git a/site/.vuepress/components/Preview.vue b/site/.vuepress/components/Preview.vue index 8a52383..282f5e5 100644 --- a/site/.vuepress/components/Preview.vue +++ b/site/.vuepress/components/Preview.vue @@ -1,82 +1,30 @@ diff --git a/site/.vuepress/components/PreviewString.vue b/site/.vuepress/components/PreviewString.vue index e1a7370..ef11ea4 100644 --- a/site/.vuepress/components/PreviewString.vue +++ b/site/.vuepress/components/PreviewString.vue @@ -1,47 +1,34 @@ diff --git a/site/.vuepress/components/codes/CustomizedDisplay/codegen.js b/site/.vuepress/components/codes/CustomizedDisplay/codegen.js index e34297e..ccae03c 100644 --- a/site/.vuepress/components/codes/CustomizedDisplay/codegen.js +++ b/site/.vuepress/components/codes/CustomizedDisplay/codegen.js @@ -1,31 +1,25 @@ import { parseJSON } from '../codegen.js'; -import { ASM, makeInst, liDX, str2inst, makeProgram, inst2gecko } from '../asm.js'; +import { + ASM, + makeInst, + liDX, + str2inst, + makeProgram, + inst2gecko, + getFillRectParams, +} from '../asm.js'; +import { measureText } from '../text.js'; export const lskey = 'config/CustomizedDisplay'; -export const defaultConfig = [ - { - x: 16, - y: 192, - fontSize: 18, - fgRGB: 0xffffff, - fgA: 0xff, - fgRGB2: null, - fgA2: null, - fmt: `X -Y -Z -A -H -V -QF `, - }, -]; +import configDB from './configDB.js'; +export const defaultConfig = [configDB.PAS]; /** @param {GameVersion} version */ export function getConfig(version) { /** @type {typeof defaultConfig} */ const config = typeof localStorage !== 'undefined' && parseJSON(localStorage.getItem(lskey)); return (config instanceof Array ? config : defaultConfig).map(({ fmt, ...o }) => ({ + ...defaultConfig[0], ...o, fmt, text: format2previewText(fmt, version), @@ -142,14 +136,22 @@ const load = { }; /** - * @param {number} x - * @param {number} y - * @param {number} fontSize - * @param {number} colorTop - * @param {number} colorBot + * @param {string} version + * @param {{ + * x: number + * y: number + * fontSize: number + * fgRGB: number + * fgA: number + * fgRGB2: number | null + * fgA2: number | null + * }} drawTextOpt */ -export function prepareDrawText(x, y, fontSize, colorTop, colorBot) { - let gpr = 9; +export function prepareDrawText(version, { x, y, fontSize, fgRGB, fgA, fgRGB2, fgA2 }) { + const colorTop = (fgRGB << 8) | fgA; + const colorBot = fgRGB2 == null || fgA2 == null ? colorTop : (fgRGB2 << 8) | fgA; + + let gpr = 5; let fpr = 1; let sp = 8; let fmt = ''; @@ -219,8 +221,8 @@ export function prepareDrawText(x, y, fontSize, colorTop, colorBot) { const rBase = 3; insts.push(pre(rBase)); // load all params - const rField = 5; - const fField = 9; + const rField = 11; // tmp GPR + const fField = 9; // tmp FPR for (const { info: { offset: srcoff, dtype, post }, dst, @@ -258,32 +260,21 @@ export function prepareDrawText(x, y, fontSize, colorTop, colorBot) { } } } - // r8 = fmt - const fmtbuf = str2inst(fmt); + // r3 = opt // sizeof(opt) = 0x10 + // r4 = fmt + const fmtbuf = str2inst(fmt, version); insts.push( - // bl 4+len4(fmt) - ASM.b(4 + (fmtbuf.length << 2), true), + // bl 4+sizeof(opt)+len4(fmt) + ASM.b(0x14 + (fmtbuf.length << 2), true), + // opt + [((x & 0xffff) << 16) | (y & 0xffff), fontSize, colorTop, colorBot], // .string fmt fmtbuf, - // mflr r8 - ASM.mflr(8), + // mflr r3 + ASM.mflr(3), + // addi r4, r3, sizeof(opt) + ASM.addi(4, 3, 0x10), ); - /* - * r3 = x - * r4 = y - * r5 = fontSize - * r6 = colorTop - * r7 = colorBot - */ - insts.push( - liDX(3, x), - liDX(4, y), - liDX(5, fontSize), - liDX(6, colorTop), - colorTop === colorBot ? ASM.mr(7, 6) : liDX(7, colorBot), - ); - // cr{set|clr} 6 - insts.push((hasFloat ? ASM.crset : ASM.crclr)(6)); // DONE return { code: insts.flatMap((e) => e), spNeed: spAdd }; }, @@ -369,58 +360,72 @@ export function format2previewText(input, version, f = null) { return preview; } -const addrsOrig = { - GMSJ01: 0x80206a00 - 0x2c, - GMSJ0A: 0x8012556c - 0x2c, - GMSE01: 0x801441e0 - 0x2c, - GMSP01: 0x80138e1c - 0x2c, -}; -const addrsSetup2D = { - GMSJ01: 0x80035228, - GMSJ0A: 0x802caecc, - GMSE01: 0x802eb6bc, - GMSP01: 0x802e3864, -}; -const addrDrawText = 0x817f0238; +import addrs from '../addrs.js'; +const addrOrigOff = -0x2c; // drawWater - [-0x30, -0x18] const addrDst = 0x817fa000; /** * @param {GameVersion} version */ export default function codegen(version) { - const config = getConfig(version); + const configs = getConfig(version); let spOff = 0; const fcodes = /** @type {Inst[]} */ ([]); + const bcodes = /** @type {Inst[]} */ ([]); - for (const { x, y, fontSize, fgRGB, fgA, fgRGB2, fgA2, fmt } of config) { - // color - const colorTop = (fgRGB << 8) | fgA; - const colorBot = fgRGB2 == null || fgA2 == null ? colorTop : (fgRGB2 << 8) | fgA; + for (const config of configs) { + const { fontSize, fmt, bgA } = config; // prepare drawText - const f = prepareDrawText(x, y, fontSize, colorTop, colorBot); - format2previewText(fmt, version, f); - // update code and sp - const { code, spNeed } = f.makeCode(); - spOff = Math.max(spOff, spNeed); - fcodes.push(code); + const f = prepareDrawText(version, config); + const text = format2previewText(fmt, version, f); + // text code + if (fmt.trim()) { + // update code and sp + const { code, spNeed } = f.makeCode(); + spOff = Math.max(spOff, spNeed); + fcodes.push(code); + } + // background code + if (bgA) { + const { width, height } = measureText(text, version); + const w = Math.ceil((width * fontSize) / 20); + const h = Math.ceil((height * fontSize) / 20); + bcodes.push( + [ + // bl 4+sizeof(rect)+sizeof(color) + ASM.b(0x18, true), + // fill_rect params + ...getFillRectParams(config, measureText(text, version)), + // mflr r3 + ASM.mflr(3), + // addi r4, r3, sizeof(rect) + ASM.addi(4, 3, 0x10), + ].flatMap((e) => e), + ); + } } - const addrOrig = addrsOrig[version]; - const addrSetup2D = addrsSetup2D[version]; + const addrOrig = addrs.drawWater[version] + addrOrigOff; + const addrFillRect = addrs.fillRect[version]; // program const program = makeProgram(addrDst); - // addi r3, r1, 0xE90 - program.push(ASM.addi(3, 1, 0xe90)); + // la r3, ctx(r1) + // program.push(ASM.addi(3, 1, addrs.ctxSpOff[version])); // addi r1, r1, -spOff if (spOff) program.push(ASM.addi(1, 1, -spOff)); - // bl setup - program.bl(addrSetup2D); + // bl J2DGrafContext::setup2D + // program.bl(addrs.setup2D[version]); + // (fill_rect) + for (const code of bcodes) { + program.push(code); + program.bl(addrFillRect); + } // (drawText) for (const code of fcodes) { program.push(code); - program.bl(addrDrawText); + program.bl(addrs.drawText); } // addi r1, r1, spOff if (spOff) program.push(ASM.addi(1, 1, spOff)); diff --git a/site/.vuepress/components/codes/CustomizedDisplay/config.vue b/site/.vuepress/components/codes/CustomizedDisplay/config.vue index 19a095b..99becb1 100644 --- a/site/.vuepress/components/codes/CustomizedDisplay/config.vue +++ b/site/.vuepress/components/codes/CustomizedDisplay/config.vue @@ -2,19 +2,26 @@
- +
-
- +
+ + + +
From 2f0be0bf687de2a503f195bf655e454839ba357c Mon Sep 17 00:00:00 2001 From: sup39 Date: Wed, 1 Feb 2023 02:49:55 +0900 Subject: [PATCH 05/20] Created 'Quarterframe Section Timer' --- Codes.xml | 152 ++++++++++++++++++ changelog.md | 3 + site/.vuepress/components/CodeInfo.vue | 3 +- site/.vuepress/components/Generator.vue | 2 + site/.vuepress/components/Preview.vue | 3 +- site/.vuepress/components/codes/codegen.js | 2 + site/.vuepress/components/codes/labels.json | 6 + .../components/codes/qfst/codegen.js | 66 ++++++++ .../components/codes/qfst/config.vue | 69 ++++++++ .../.vuepress/components/codes/qft/config.vue | 15 +- site/.vuepress/components/codes/ui.js | 2 + 11 files changed, 306 insertions(+), 17 deletions(-) create mode 100644 site/.vuepress/components/codes/qfst/codegen.js create mode 100644 site/.vuepress/components/codes/qfst/config.vue diff --git a/Codes.xml b/Codes.xml index 3a48e50..2d9644a 100644 --- a/Codes.xml +++ b/Codes.xml @@ -4221,4 +4221,156 @@ 040eb024 60000000 + + qfst + misc + Quarterframe Section Timer + QFセクションタイマー + sup39(サポミク) + 0.1 + Jan 31, 2023 + drawText + + Calculate and display section times whenever Quarterframe Timer freezes. + + + QFタイマーが一時停止する度にセクションタイムを計算して表示します。 + + + C20F9DD0 00000003 + 3C60817F 3BA00004 + 93A303CC 3BA00000 + B3A303CA 00000000 + C22069E4 0000001B + 3821FFD0 BF210008 + 3F20817F AB9903B2 + 3BF903D0 A3D903CA + 7F9DE378 835903B4 + 80D900BC 28060000 + 41A2002C 809900B8 + 80B903CC 7C042800 + 40A1001C 7C052050 + 57CC16BA 7C1F612E + 909903CC 3BDE0001 + B3D903CA 3879039C + 389903AC 3D808020 + 398C1EA8 7D8803A6 + 4E800021 57DBE13F + 41820008 3B7EFFF0 + 7C1BF040 4080004C + 576316BA 7C1F182E + 1D6003E9 38000078 + 7D6B0396 380003E8 + 7CAB0396 1C0503E8 + 7CC05850 387903B0 + 389903C0 39990238 + 7D8803A6 4E800021 + 7FBDD214 3B7B0001 + B3B903B2 4BFFFFB4 + B39903B2 BB210008 + 38210030 00000000 + + + C2286228 00000003 + 3C60817F 3BA00004 + 93A303CC 3BA00000 + B3A303CA 00000000 + C2125550 0000001B + 3821FFD0 BF210008 + 3F20817F AB9903B2 + 3BF903D0 A3D903CA + 7F9DE378 835903B4 + 80D900BC 28060000 + 41A2002C 809900B8 + 80B903CC 7C042800 + 40A1001C 7C052050 + 57CC16BA 7C1F612E + 909903CC 3BDE0001 + B3D903CA 3879039C + 389903AC 3D808012 + 398C1660 7D8803A6 + 4E800021 57DBE13F + 41820008 3B7EFFF0 + 7C1BF040 4080004C + 576316BA 7C1F182E + 1D6003E9 38000078 + 7D6B0396 380003E8 + 7CAB0396 1C0503E8 + 7CC05850 387903B0 + 389903C0 39990238 + 7D8803A6 4E800021 + 7FBDD214 3B7B0001 + B3B903B2 4BFFFFB4 + B39903B2 BB210008 + 38210030 00000000 + + + C229E2DC 00000003 + 3C60817F 3BA00004 + 93A303CC 3BA00000 + B3A303CA 00000000 + C2138E00 0000001B + 3821FFD0 BF210008 + 3F20817F AB9903B2 + 3BF903D0 A3D903CA + 7F9DE378 835903B4 + 80D900BC 28060000 + 41A2002C 809900B8 + 80B903CC 7C042800 + 40A1001C 7C052050 + 57CC16BA 7C1F612E + 909903CC 3BDE0001 + B3D903CA 3879039C + 389903AC 3D808013 + 398C4F0C 7D8803A6 + 4E800021 57DBE13F + 41820008 3B7EFFF0 + 7C1BF040 4080004C + 576316BA 7C1F182E + 1D6003E9 38000078 + 7D6B0396 380003E8 + 7CAB0396 1C0503E8 + 7CC05850 387903B0 + 389903C0 39990238 + 7D8803A6 4E800021 + 7FBDD214 3B7B0001 + B3B903B2 4BFFFFB4 + B39903B2 BB210008 + 38210030 00000000 + + + C22A63CC 00000003 + 3C60817F 3BA00004 + 93A303CC 3BA00000 + B3A303CA 00000000 + C21441C4 0000001B + 3821FFD0 BF210008 + 3F20817F AB9903B2 + 3BF903D0 A3D903CA + 7F9DE378 835903B4 + 80D900BC 28060000 + 41A2002C 809900B8 + 80B903CC 7C042800 + 40A1001C 7C052050 + 57CC16BA 7C1F612E + 909903CC 3BDE0001 + B3D903CA 3879039C + 389903AC 3D808014 + 398C0390 7D8803A6 + 4E800021 57DBE13F + 41820008 3B7EFFF0 + 7C1BF040 4080004C + 576316BA 7C1F182E + 1D6003E9 38000078 + 7D6B0396 380003E8 + 7CAB0396 1C0503E8 + 7CC05850 387903B0 + 389903C0 39990238 + 7D8803A6 4E800021 + 7FBDD214 3B7B0001 + B3B903B2 4BFFFFB4 + B39903B2 BB210008 + 38210030 00000000 + + diff --git a/changelog.md b/changelog.md index c535885..efc9433 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,8 @@ # Changelog ## Jan 31, 2023 +### Created 'Quarterframe Section Timer' +Calculate and display section times whenever Quarterframe Timer freezes + ### Updated 'Pattern Selector' - Rewrote with C2 + separated config 06 - Remove label option diff --git a/site/.vuepress/components/CodeInfo.vue b/site/.vuepress/components/CodeInfo.vue index 756d505..00c5124 100644 --- a/site/.vuepress/components/CodeInfo.vue +++ b/site/.vuepress/components/CodeInfo.vue @@ -38,10 +38,9 @@ export default { showPreview() { return [ 'PatternSelector', - 'PASDisplay', - 'SpeedDisplay', 'CustomizedDisplay', 'qft', + 'qfst', ].includes(this.code.id); // TODO }, }, diff --git a/site/.vuepress/components/Generator.vue b/site/.vuepress/components/Generator.vue index 29d5553..b695bea 100644 --- a/site/.vuepress/components/Generator.vue +++ b/site/.vuepress/components/Generator.vue @@ -113,6 +113,7 @@ import { translate } from '../i18n/localeHelper'; // Code Configs import {getConfig as getConfigQFT} from './codes/qft/codegen'; +import {getConfig as getConfigQFST} from './codes/qfst/codegen'; import {getConfig as getConfigCD} from './codes/CustomizedDisplay/codegen'; import {getConfig as getConfigPS} from './codes/PatternSelector/codegen'; @@ -163,6 +164,7 @@ export default { // update config for preview this.codeConfigs = { qft: getConfigQFT(), + qfst: getConfigQFST(), PatternSelector: getConfigPS(), CustomizedDisplay: getConfigCD(e), }; diff --git a/site/.vuepress/components/Preview.vue b/site/.vuepress/components/Preview.vue index 282f5e5..ecb800f 100644 --- a/site/.vuepress/components/Preview.vue +++ b/site/.vuepress/components/Preview.vue @@ -1,10 +1,11 @@ diff --git a/site/.vuepress/components/codes/codegen.js b/site/.vuepress/components/codes/codegen.js index f98a2e0..6f7fef6 100644 --- a/site/.vuepress/components/codes/codegen.js +++ b/site/.vuepress/components/codes/codegen.js @@ -1,11 +1,13 @@ import InstantRestart from './InstantRestart/codegen.js'; import qft from './qft/codegen.js'; +import qfst from './qfst/codegen.js'; import CustomizedDisplay from './CustomizedDisplay/codegen.js'; import PatternSelector from './PatternSelector/codegen.js'; export default { InstantRestart, qft, + qfst, CustomizedDisplay, PatternSelector, }; diff --git a/site/.vuepress/components/codes/labels.json b/site/.vuepress/components/codes/labels.json index 458b625..d76356d 100644 --- a/site/.vuepress/components/codes/labels.json +++ b/site/.vuepress/components/codes/labels.json @@ -1,5 +1,8 @@ { "ja-JP": { + "h3": { + "appearance": "見た目" + }, "location": "位置:", "fontSize": "文字サイズ:", "fgColor": "文字色:", @@ -15,6 +18,9 @@ "bottom": "下" }, "en-US": { + "h3": { + "appearance": "Appearance" + }, "location": "Location: ", "fontSize": "Font size: ", "fgColor": "Font color: ", diff --git a/site/.vuepress/components/codes/qfst/codegen.js b/site/.vuepress/components/codes/qfst/codegen.js new file mode 100644 index 0000000..4526a83 --- /dev/null +++ b/site/.vuepress/components/codes/qfst/codegen.js @@ -0,0 +1,66 @@ +import { parseJSON } from '../codegen.js'; +import { insts2hex, getDrawTextOpt, getFillRectParams } from '../asm'; +import { measureText } from '../text.js'; +export const lskey = 'config/qfst'; + +export const defaultConfig = { + x: 533, + y: 150, + fontSize: 13, + fgRGB: 0xffffff, + fgA: 0xff, + fgRGB2: null, + fgA2: null, + bgRGB: 0x000000, + bgA: 0x40, + bgLeft: 4, + bgRight: 3, + bgTop: 4, + bgBot: 2, +}; + +export const getPreviewText = () => ` 0.426 + 0.427 + 0.428 + 1.515 + 3.117 +39.000 + 9.999 +11.111 +22.222 +33.333 +44.444 +55.555 +66.666 +77.777 +88.888 +99.999`; + +/** @returns {typeof defaultConfig} */ +export function getConfig() { + const config = + (typeof localStorage !== 'undefined' && parseJSON(localStorage.getItem(lskey))) || {}; + return { + ...defaultConfig, + ...config, + text: getPreviewText(), + }; +} + +/** + * @param {keyof typeof import('../addrs.js').ctxSpOff} version + * @param {string=} baseCode + */ +export default function codegen(version, baseCode) { + if (!baseCode) return ''; + + const config = getConfig(); + + let code = baseCode; + code += '077F039C 0000002C'; + code += insts2hex(getFillRectParams(config, measureText(getPreviewText(), version))); + code += insts2hex(getDrawTextOpt(config)); + code += '2532642E 25303364 00000000'; // fmt = "%2d.%03d" + + return code.replace(/\s/g, ''); +} diff --git a/site/.vuepress/components/codes/qfst/config.vue b/site/.vuepress/components/codes/qfst/config.vue new file mode 100644 index 0000000..56d3d65 --- /dev/null +++ b/site/.vuepress/components/codes/qfst/config.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/site/.vuepress/components/codes/qft/config.vue b/site/.vuepress/components/codes/qft/config.vue index b1017c0..1c224bf 100644 --- a/site/.vuepress/components/codes/qft/config.vue +++ b/site/.vuepress/components/codes/qft/config.vue @@ -26,7 +26,7 @@ diff --git a/site/.vuepress/components/codes/AttemptCounter/codegen.js b/site/.vuepress/components/codes/AttemptCounter/codegen.js new file mode 100644 index 0000000..b141dfd --- /dev/null +++ b/site/.vuepress/components/codes/AttemptCounter/codegen.js @@ -0,0 +1,55 @@ +import { parseJSON } from '../codegen.js'; +import { insts2hex, getDrawTextOpt, getFillRectParams } from '../asm'; +import { measureText } from '../text.js'; +import { int2hex } from '../utils.js'; +export const lskey = 'config/AttemptCounter'; + +export const defaultConfig = { + x: 152, + y: 125, + fontSize: 32, + fgRGB: 0xffff99, + fgA: 0xff, + fgRGB2: null, + fgA2: null, + bgRGB: 0x000000, + bgA: 0x40, + bgLeft: 4, + bgRight: 6, + bgTop: 4, + bgBot: 3, + duration: 60, +}; + +export const getPreviewText = () => '88\n99'; + +/** @returns {typeof defaultConfig} */ +export function getConfig() { + const config = + (typeof localStorage !== 'undefined' && parseJSON(localStorage.getItem(lskey))) || {}; + return { + ...defaultConfig, + ...config, + text: getPreviewText(), + }; +} + +/** + * @param {keyof typeof import('../addrs.js').ctxSpOff} version + * @param {string=} baseCode + */ +export default function codegen(version, baseCode) { + if (!baseCode) return ''; + + const config = getConfig(); + + let code = baseCode; + code += '077F0479 0000002B'; + code += int2hex(config.duration, 1); + code += '25640A256400'; // fmt = "%d\n%d" + code += insts2hex(getDrawTextOpt(config)); + code += insts2hex(getFillRectParams(config, measureText(getPreviewText(), version))); + code += '0000000000'; // padding + + return code.replace(/\s/g, ''); +} diff --git a/site/.vuepress/components/codes/AttemptCounter/config.vue b/site/.vuepress/components/codes/AttemptCounter/config.vue new file mode 100644 index 0000000..da8add2 --- /dev/null +++ b/site/.vuepress/components/codes/AttemptCounter/config.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/site/.vuepress/components/codes/CustomizedDisplay/config.vue b/site/.vuepress/components/codes/CustomizedDisplay/config.vue index 99becb1..c07a125 100644 --- a/site/.vuepress/components/codes/CustomizedDisplay/config.vue +++ b/site/.vuepress/components/codes/CustomizedDisplay/config.vue @@ -1,15 +1,15 @@ @@ -49,7 +49,8 @@ export default { text: format2previewText(defaultConfig[0].fmt, version), ...defaultConfig[0], }; - return {config, defaultConfigCell}; + const keys = config.map((e, i) => i); + return {config, defaultConfigCell, keys, nextKey: keys.length}; }, watch: { config: makeUpdateConfig(lskey, defaultConfig), @@ -60,6 +61,10 @@ export default { // if (window.confirm(this.l('deletionConfirm'))) { this.config.splice(i, 1); }, + /** @param {any} c */ + append(c) { + this.config.push({...c, key: this.nextKey++}); + }, }, } diff --git a/site/.vuepress/components/codes/codegen.js b/site/.vuepress/components/codes/codegen.js index 6f7fef6..9a0247a 100644 --- a/site/.vuepress/components/codes/codegen.js +++ b/site/.vuepress/components/codes/codegen.js @@ -3,6 +3,7 @@ import qft from './qft/codegen.js'; import qfst from './qfst/codegen.js'; import CustomizedDisplay from './CustomizedDisplay/codegen.js'; import PatternSelector from './PatternSelector/codegen.js'; +import AttemptCounter from './AttemptCounter/codegen.js'; export default { InstantRestart, @@ -10,6 +11,7 @@ export default { qfst, CustomizedDisplay, PatternSelector, + AttemptCounter, }; /** diff --git a/site/.vuepress/components/codes/labels.json b/site/.vuepress/components/codes/labels.json index d76356d..9fa231e 100644 --- a/site/.vuepress/components/codes/labels.json +++ b/site/.vuepress/components/codes/labels.json @@ -15,7 +15,12 @@ "left": "左", "right": "右", "top": "上", - "bottom": "下" + "bottom": "下", + "display": { + "duration": "表示時間:", + "frame": "(フレーム)", + "sec": "(秒)" + } }, "en-US": { "h3": { @@ -33,7 +38,12 @@ "left": "Left", "right": "Right", "top": "Top", - "bottom": "Bottom" + "bottom": "Bottom", + "display": { + "duration": "Display duration: ", + "frame": "(frame)", + "sec": "(sec)" + } }, "fr-FR": { "location": "Position : ", diff --git a/site/.vuepress/components/codes/preview.js b/site/.vuepress/components/codes/preview.js new file mode 100644 index 0000000..fdf3381 --- /dev/null +++ b/site/.vuepress/components/codes/preview.js @@ -0,0 +1,22 @@ +import * as qft from './qft/codegen.js'; +import * as qfst from './qfst/codegen.js'; +import * as CustomizedDisplay from './CustomizedDisplay/codegen.js'; +import * as PatternSelector from './PatternSelector/codegen.js'; +import * as AttemptCounter from './AttemptCounter/codegen.js'; + +export const previewIds = ['CustomizedDisplay', 'AttemptCounter', 'PatternSelector', 'qft', 'qfst']; + +/** + * Get code configs for preview + * @param {keyof typeof import('./addrs.js').ctxSpOff} version + */ +export const getConfigs = (version) => + Object.fromEntries( + Object.entries({ + qft, + qfst, + CustomizedDisplay, + PatternSelector, + AttemptCounter, + }).map(([k, v]) => [k, v.getConfig(version)]), + ); diff --git a/site/.vuepress/components/codes/ui.js b/site/.vuepress/components/codes/ui.js index d2a3676..c8f861b 100644 --- a/site/.vuepress/components/codes/ui.js +++ b/site/.vuepress/components/codes/ui.js @@ -3,6 +3,7 @@ import CustomizedDisplay from './CustomizedDisplay/config.vue'; import PatternSelector from './PatternSelector/config.vue'; import qft from './qft/config.vue'; import qfst from './qfst/config.vue'; +import AttemptCounter from './AttemptCounter/config.vue'; export default { InstantRestart, @@ -10,4 +11,5 @@ export default { PatternSelector, qft, qfst, + AttemptCounter, }; From 3c1fd9c1a2a6024aaaa9354b54a45c0d9b802064 Mon Sep 17 00:00:00 2001 From: sup39 Date: Mon, 6 Feb 2023 04:35:42 +0900 Subject: [PATCH 08/20] Created 'Controller Input Display' --- Codes.xml | 311 ++++++++++++++++++ changelog.md | 2 + site/.vuepress/components/Preview.vue | 16 +- site/.vuepress/components/codes/codegen.js | 2 + .../components/codes/controller/codegen.js | 106 ++++++ .../components/codes/controller/config.vue | 81 +++++ .../components/codes/controller/hidden.js | 66 ++++ .../components/codes/controller/preview.vue | 107 ++++++ .../components/codes/controller/utils.js | 37 +++ site/.vuepress/components/codes/labels.json | 2 + site/.vuepress/components/codes/preview.js | 11 +- site/.vuepress/components/codes/ui.js | 2 + site/.vuepress/components/codes/utils.js | 19 +- site/.vuepress/data/codeCategories.json | 2 +- 14 files changed, 754 insertions(+), 10 deletions(-) create mode 100644 site/.vuepress/components/codes/controller/codegen.js create mode 100644 site/.vuepress/components/codes/controller/config.vue create mode 100644 site/.vuepress/components/codes/controller/hidden.js create mode 100644 site/.vuepress/components/codes/controller/preview.vue create mode 100644 site/.vuepress/components/codes/controller/utils.js diff --git a/Codes.xml b/Codes.xml index 75fc64d..0899928 100644 --- a/Codes.xml +++ b/Codes.xml @@ -4764,4 +4764,315 @@ 4E800021 00000000 + + controller + metadata + Controller Input Display + コントローラ入力表示 + sup39(サポミク) + 0.1 + Feb 05, 2023 + + Display controller input. + + + コントローラ入力を表示します。 + + + C20F9CCC 00000047 + 4E800021 9421FEB0 + BE610008 3C003A04 + 7C17E3A6 3F00817F + 3B1804C3 83AD8DF0 + 7FBDEB79 41820208 + 838D8DF4 480000B0 + 38800000 3D80800B + 398C88A8 7D8903A6 + 4E800420 7F2803A6 + 4E800020 3BE5FFFF + 7F2802A6 7CBE0034 + 3BDEFFEF 4BFFFFD5 + E0577000 E077F002 + 82770004 5FE0F4BA + 7C1C042E 7C3D042E + 10000C20 100010DC + F01B3000 B35B0000 + 927B0000 37FFFFFF + 4080FFDC 3AF70008 + 4BFFFFAC 3BE50000 + 7F2802A6 4BFFFF8D + 57E007BC 1017078C + F01BB000 37FFFFFF + 57E007BC 60000001 + 1017078C F01BB000 + B35B0000 927B0000 + 4181FFD8 3AF70004 + 4BFFFF6C 38610050 + 7EC4B378 3D808003 + 398C6B38 4BFFFF51 + 88180000 98030038 + 80180001 90030084 + 90030098 E0185005 + 102004A0 F0038090 + F02380A0 3D808003 + 398C6CEC 4BFFFF21 + 3860FFFF 38800001 + 3D808024 398C2F80 + 4BFFFF0D 3B400000 + 3F60CC00 637B8000 + 3EA08040 A6950D50 + 3AF80015 386000A0 + 38A00004 8277FFF4 + 4BFFFF45 3AD70030 + 88970003 5E8427FF + 41A20014 386000A0 + 38A00020 4BFFFED9 + 3AF7FFF8 386000B0 + 38A00021 4BFFFEC9 + 7C17B040 4180FFD4 + 3AD70014 3AB5003C + 88970004 5E8427FF + E017A008 C4350004 + 40820010 E017A000 + E057C005 EC0100BA + F017A002 386000A0 + 38A00004 8278000D + 4BFFFED5 3AF70002 + 386000B0 38A00005 + 82780011 4BFFFEC1 + 7C17B040 4180FFB4 + 3AD70020 3AB5006C + E0172008 E4350040 + 10400850 10211460 + E057A003 1001009C + F0172000 386000A0 + 38A00020 4BFFFE39 + 386000B0 38A00009 + 4BFFFE2D 7C17B040 + 4180FFC8 BA610008 + 38210150 00000000 + + + C2286124 00000047 + 4E800021 9421FEB0 + BE610008 3C003A04 + 7C17E3A6 3F00817F + 3B1804C3 83ADA018 + 7FBDEB79 41820208 + 838DA01C 480000B0 + 38800000 3D808034 + 398CD888 7D8903A6 + 4E800420 7F2803A6 + 4E800020 3BE5FFFF + 7F2802A6 7CBE0034 + 3BDEFFEF 4BFFFFD5 + E0577000 E077F002 + 82770004 5FE0F4BA + 7C1C042E 7C3D042E + 10000C20 100010DC + F01B3000 B35B0000 + 927B0000 37FFFFFF + 4080FFDC 3AF70008 + 4BFFFFAC 3BE50000 + 7F2802A6 4BFFFF8D + 57E007BC 1017078C + F01BB000 37FFFFFF + 57E007BC 60000001 + 1017078C F01BB000 + B35B0000 927B0000 + 4181FFD8 3AF70004 + 4BFFFF6C 38610050 + 7EC4B378 3D80802D + 398CC7DC 4BFFFF51 + 88180000 98030038 + 80180001 90030084 + 90030098 E0185005 + 102004A0 F0038090 + F02380A0 3D80802D + 398CC990 4BFFFF21 + 3860FFFF 38800001 + 3D808016 398C3F7C + 4BFFFF0D 3B400000 + 3F60CC00 637B8000 + 3EA0803F A6955428 + 3AF80015 386000A0 + 38A00004 8277FFF4 + 4BFFFF45 3AD70030 + 88970003 5E8427FF + 41A20014 386000A0 + 38A00020 4BFFFED9 + 3AF7FFF8 386000B0 + 38A00021 4BFFFEC9 + 7C17B040 4180FFD4 + 3AD70014 3AB5003C + 88970004 5E8427FF + E017A008 C4350004 + 40820010 E017A000 + E057C005 EC0100BA + F017A002 386000A0 + 38A00004 8278000D + 4BFFFED5 3AF70002 + 386000B0 38A00005 + 82780011 4BFFFEC1 + 7C17B040 4180FFB4 + 3AD70020 3AB5006C + E0172008 E4350040 + 10400850 10211460 + E057A003 1001009C + F0172000 386000A0 + 38A00020 4BFFFE39 + 386000B0 38A00009 + 4BFFFE2D 7C17B040 + 4180FFC8 BA610008 + 38210150 00000000 + + + C229E1D8 00000047 + 4E800021 9421FEB0 + BE610008 3C003A04 + 7C17E3A6 3F00817F + 3B1804C3 83ADA090 + 7FBDEB79 41820208 + 838DA094 480000B0 + 38800000 3D808035 + 398C61A8 7D8903A6 + 4E800420 7F2803A6 + 4E800020 3BE5FFFF + 7F2802A6 7CBE0034 + 3BDEFFEF 4BFFFFD5 + E0577000 E077F002 + 82770004 5FE0F4BA + 7C1C042E 7C3D042E + 10000C20 100010DC + F01B3000 B35B0000 + 927B0000 37FFFFFF + 4080FFDC 3AF70008 + 4BFFFFAC 3BE50000 + 7F2802A6 4BFFFF8D + 57E007BC 1017078C + F01BB000 37FFFFFF + 57E007BC 60000001 + 1017078C F01BB000 + B35B0000 927B0000 + 4181FFD8 3AF70004 + 4BFFFF6C 38610050 + 7EC4B378 3D80802E + 398C5174 4BFFFF51 + 88180000 98030038 + 80180001 90030084 + 90030098 E0185005 + 102004A0 F0038090 + F02380A0 3D80802E + 398C5328 4BFFFF21 + 3860FFFF 38800001 + 3D808018 398C91DC + 4BFFFF0D 3B400000 + 3F60CC00 637B8000 + 3EA08040 A695BBF4 + 3AF80015 386000A0 + 38A00004 8277FFF4 + 4BFFFF45 3AD70030 + 88970003 5E8427FF + 41A20014 386000A0 + 38A00020 4BFFFED9 + 3AF7FFF8 386000B0 + 38A00021 4BFFFEC9 + 7C17B040 4180FFD4 + 3AD70014 3AB5003C + 88970004 5E8427FF + E017A008 C4350004 + 40820010 E017A000 + E057C005 EC0100BA + F017A002 386000A0 + 38A00004 8278000D + 4BFFFED5 3AF70002 + 386000B0 38A00005 + 82780011 4BFFFEC1 + 7C17B040 4180FFB4 + 3AD70020 3AB5006C + E0172008 E4350040 + 10400850 10211460 + E057A003 1001009C + F0172000 386000A0 + 38A00020 4BFFFE39 + 386000B0 38A00009 + 4BFFFE2D 7C17B040 + 4180FFC8 BA610008 + 38210150 00000000 + + + C22A62C8 00000047 + 4E800021 9421FEB0 + BE610008 3C003A04 + 7C17E3A6 3F00817F + 3B1804C3 83ADA158 + 7FBDEB79 41820208 + 838DA15C 480000B0 + 38800000 3D808036 + 398CDF88 7D8903A6 + 4E800420 7F2803A6 + 4E800020 3BE5FFFF + 7F2802A6 7CBE0034 + 3BDEFFEF 4BFFFFD5 + E0577000 E077F002 + 82770004 5FE0F4BA + 7C1C042E 7C3D042E + 10000C20 100010DC + F01B3000 B35B0000 + 927B0000 37FFFFFF + 4080FFDC 3AF70008 + 4BFFFFAC 3BE50000 + 7F2802A6 4BFFFF8D + 57E007BC 1017078C + F01BB000 37FFFFFF + 57E007BC 60000001 + 1017078C F01BB000 + B35B0000 927B0000 + 4181FFD8 3AF70004 + 4BFFFF6C 38610050 + 7EC4B378 3D80802F + 398CCFCC 4BFFFF51 + 88180000 98030038 + 80180001 90030084 + 90030098 E0185005 + 102004A0 F0038090 + F02380A0 3D80802F + 398CD180 4BFFFF21 + 3860FFFF 38800001 + 3D808018 398C2BF8 + 4BFFFF0D 3B400000 + 3F60CC00 637B8000 + 3EA08040 A6954454 + 3AF80015 386000A0 + 38A00004 8277FFF4 + 4BFFFF45 3AD70030 + 88970003 5E8427FF + 41A20014 386000A0 + 38A00020 4BFFFED9 + 3AF7FFF8 386000B0 + 38A00021 4BFFFEC9 + 7C17B040 4180FFD4 + 3AD70014 3AB5003C + 88970004 5E8427FF + E017A008 C4350004 + 40820010 E017A000 + E057C005 EC0100BA + F017A002 386000A0 + 38A00004 8278000D + 4BFFFED5 3AF70002 + 386000B0 38A00005 + 82780011 4BFFFEC1 + 7C17B040 4180FFB4 + 3AD70020 3AB5006C + E0172008 E4350040 + 10400850 10211460 + E057A003 1001009C + F0172000 386000A0 + 38A00020 4BFFFE39 + 386000B0 38A00009 + 4BFFFE2D 7C17B040 + 4180FFC8 BA610008 + 38210150 00000000 + + diff --git a/changelog.md b/changelog.md index 3e6845c..fb070c3 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,7 @@ # Changelog ## Feb 05, 2023 +### Created 'Controller Input Display' +Display controller input ### Created 'Attempt Counter' Display attempt count and success count of current area ### Updated 'Instant Level Select' diff --git a/site/.vuepress/components/Preview.vue b/site/.vuepress/components/Preview.vue index 8e65974..b9a357a 100644 --- a/site/.vuepress/components/Preview.vue +++ b/site/.vuepress/components/Preview.vue @@ -3,13 +3,21 @@
+ +
+ + diff --git a/site/.vuepress/components/codes/controller/hidden.js b/site/.vuepress/components/codes/controller/hidden.js new file mode 100644 index 0000000..812ad2f --- /dev/null +++ b/site/.vuepress/components/codes/controller/hidden.js @@ -0,0 +1,66 @@ +export const buttons = [ + { x: 138, y: 66, r: 18, id: 'A', c: 0x2ee5b8bf }, + { x: 113, y: 89, r: 9, id: 'B', c: 0xff1a1abf }, + { x: 164, y: 50, r: 8, id: 'X', c: 0xeeeeeebf }, + { x: 119, y: 41, r: 8, id: 'Y', c: 0xeeeeeebf }, + { x: 144, y: 34, r: 6, id: 'Z', c: 0x9494ffbf }, + { x: 91, y: 64, r: 5, id: 'S', c: 0xeeeeeebf }, +]; + +export const sticks = [ + { + id: 'M', + x: 32, + y: 52, + rMove: 14, + rS: 19, + cS: 0xeeeeeeef, + rF: 12, + cF: 0xeeeeeeef, + }, + { + id: 'C', + x: 64, + y: 92, + rMove: 14, + rS: 19, + cS: 0xffd300ef, + rF: 12, + cF: 0xffd300ef, + }, +]; + +export const triggers = [ + { + id: 'L', + x: 12, + y0: 10, + y1: 18, + w: 64, + wa: 56, + }, + { + id: 'R', + x: 170, + y0: 10, + y1: 18, + w: -64, + wa: -56, + }, +]; + +export default { + // background + bgLeft: 0, + bgRight: 182, + bgTop: 0, + bgBot: 120, + // trigger fill + cTF: 0xdfdfdfbf, + // trigger stroke + cTS: 0xeeeeeebf, + // input + buttons, + triggers, + sticks, +}; diff --git a/site/.vuepress/components/codes/controller/preview.vue b/site/.vuepress/components/codes/controller/preview.vue new file mode 100644 index 0000000..cf9ec68 --- /dev/null +++ b/site/.vuepress/components/codes/controller/preview.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/site/.vuepress/components/codes/controller/utils.js b/site/.vuepress/components/codes/controller/utils.js new file mode 100644 index 0000000..1fb4c99 --- /dev/null +++ b/site/.vuepress/components/codes/controller/utils.js @@ -0,0 +1,37 @@ +import { int2hex } from '../utils.js'; + +/** @type {Record} */ +export const SHIFTS = { + Z: 32 - 4, + R: 32 - 5, + L: 32 - 6, + A: 32 - 8, + B: 32 - 9, + X: 32 - 10, + Y: 32 - 11, + S: 32 - 12, +}; + +/** + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + */ +export const makeRect = (x0, y0, x1, y1) => [x0, y0, x1, y1].map((x) => int2hex(x, 1)).join(''); + +/** + * @param {number} x + * @param {number} y + * @param {number} r + * @param {number} s + * @param {number} color + */ +export const makeNgon = (x, y, r, s, color) => + [x, y, r, s].map((x) => int2hex(x, 1)).join('') + int2hex(color, 4); + +/** + * @param {number} shift + * @param {number} WA + */ +export const makeTriggerInfo = (shift, WA) => [shift, WA].map((x) => int2hex(x, 1)).join(''); diff --git a/site/.vuepress/components/codes/labels.json b/site/.vuepress/components/codes/labels.json index 9fa231e..80dc8ed 100644 --- a/site/.vuepress/components/codes/labels.json +++ b/site/.vuepress/components/codes/labels.json @@ -12,6 +12,7 @@ "alpha": "不透明度=", "bgColor": "背景色:", "bgOffset": "背景位置:", + "size": "サイズ:", "left": "左", "right": "右", "top": "上", @@ -35,6 +36,7 @@ "alpha": "Alpha=", "bgColor": "Background color: ", "bgOffset": "Background offset: ", + "size": "Size: ", "left": "Left", "right": "Right", "top": "Top", diff --git a/site/.vuepress/components/codes/preview.js b/site/.vuepress/components/codes/preview.js index fdf3381..5ffa598 100644 --- a/site/.vuepress/components/codes/preview.js +++ b/site/.vuepress/components/codes/preview.js @@ -3,8 +3,16 @@ import * as qfst from './qfst/codegen.js'; import * as CustomizedDisplay from './CustomizedDisplay/codegen.js'; import * as PatternSelector from './PatternSelector/codegen.js'; import * as AttemptCounter from './AttemptCounter/codegen.js'; +import * as controller from './controller/codegen.js'; -export const previewIds = ['CustomizedDisplay', 'AttemptCounter', 'PatternSelector', 'qft', 'qfst']; +export const previewIds = [ + 'CustomizedDisplay', + 'AttemptCounter', + 'PatternSelector', + 'qft', + 'qfst', + 'controller', +]; /** * Get code configs for preview @@ -18,5 +26,6 @@ export const getConfigs = (version) => CustomizedDisplay, PatternSelector, AttemptCounter, + controller, }).map(([k, v]) => [k, v.getConfig(version)]), ); diff --git a/site/.vuepress/components/codes/ui.js b/site/.vuepress/components/codes/ui.js index c8f861b..b89c396 100644 --- a/site/.vuepress/components/codes/ui.js +++ b/site/.vuepress/components/codes/ui.js @@ -4,6 +4,7 @@ import PatternSelector from './PatternSelector/config.vue'; import qft from './qft/config.vue'; import qfst from './qfst/config.vue'; import AttemptCounter from './AttemptCounter/config.vue'; +import controller from './controller/config.vue'; export default { InstantRestart, @@ -12,4 +13,5 @@ export default { qft, qfst, AttemptCounter, + controller, }; diff --git a/site/.vuepress/components/codes/utils.js b/site/.vuepress/components/codes/utils.js index c89b774..397dfac 100644 --- a/site/.vuepress/components/codes/utils.js +++ b/site/.vuepress/components/codes/utils.js @@ -2,9 +2,10 @@ * @template T extends {Record|Record[]} * @param {string} lskey * @param {T} defaultConfig - * @param {(config: T)=>string} [makeText] + * @param {((config: T)=>string)|null} [makeText] + * @param {any} [hiddenConfig] */ -export function makeUpdateConfig(lskey, defaultConfig, makeText) { +export function makeUpdateConfig(lskey, defaultConfig, makeText, hiddenConfig = {}) { const configKeys = Object.keys(defaultConfig); /** @type {(o: any)=>T} */ const makeConfig = @@ -18,7 +19,8 @@ export function makeUpdateConfig(lskey, defaultConfig, makeText) { const config = makeConfig(this); localStorage.setItem(lskey, JSON.stringify(config)); // emit `config` event to parent - this.$emit('config', makeText ? { ...config, text: makeText(config) } : config); + const configEmit = { ...hiddenConfig, ...config }; + this.$emit('config', makeText ? { ...configEmit, text: makeText(config) } : configEmit); }; } @@ -33,6 +35,15 @@ export const int2hex = (x, size) => .padStart(size << 1, '0') .slice(-(size << 1)); +/** + * @param {number} x -- number to convert + */ +export function float2hex(x) { + const dv = new DataView(new ArrayBuffer(4)); + dv.setFloat32(0, x); + return int2hex(dv.getUint32(0), 4); +} + /** @param {number} rgb */ export const rgbI2S = (rgb) => '#' + rgb.toString(16).padStart(6, '0'); /** @param {string} s */ @@ -43,6 +54,8 @@ export const rgbS2I = (s) => parseInt(s.slice(1), 16); */ export const rgbaI2S = (rgb, a) => '#' + rgb.toString(16).padStart(6, '0') + a.toString(16).padStart(2, '0'); +/** @param {number} rgba */ +export const cI2S = (rgba) => '#' + (rgba >>> 0).toString(16).padStart(8, '0'); /** @type {(labels: Record, locale: string, fallbackLocale?: string) => (key: string) => string} */ export const makeGetLabel = diff --git a/site/.vuepress/data/codeCategories.json b/site/.vuepress/data/codeCategories.json index c6492c3..af70781 100644 --- a/site/.vuepress/data/codeCategories.json +++ b/site/.vuepress/data/codeCategories.json @@ -17,7 +17,7 @@ { "identifier": "metadata", "i18nKey": "generatorconfig.categories.metadata", - "exclusive": true + "exclusive": false }, { "identifier": "misc", From b4a9a443feb0e4ab60e63eca62e8844eb27f378c Mon Sep 17 00:00:00 2001 From: sup39 Date: Mon, 6 Feb 2023 04:46:46 +0900 Subject: [PATCH 09/20] Reserved memory for Controller Input Display --- Readme.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 46f9df4..b957d78 100644 --- a/Readme.md +++ b/Readme.md @@ -90,7 +90,14 @@ Some codes store some states in the games memory starting from address 0x817F000 | ![](./docs/reserved.svg) | `0x4A6` | `0x4A7` | Attempt Counter: Attempt Count | | ![](./docs/reserved.svg) | `0x4A8` | `0x4A8` | Attempt Counter: Got Shine Flag | | ![](./docs/buffer.svg) | `0x4A9` | `0x4AF` | Buffer (Attempt Counter) | -| ![](./docs/unallocated.svg) | `0x4B0` | `0xFFF` | Not Allocated | +| ![](./docs/unallocated.svg) | `0x4B0` | `0x4BF` | Not Allocated | +| ![](./docs/buffer.svg) | `0x4C0` | `0x4C2` | Buffer (Controller Input Display) | +| ![](./docs/reserved.svg) | `0x4C3` | `0x4C3` | Controller Input Display: Line Width | +| ![](./docs/reserved.svg) | `0x4C4` | `0x4C7` | Controller Input Display: Scale | +| ![](./docs/reserved.svg) | `0x4C8` | `0x4CB` | Controller Input Display: (X, Y) Coordinate | +| ![](./docs/reserved.svg) | `0x4CC` | `0x4CF` | Controller Input Display: Background Color | +| ![](./docs/reserved.svg) | `0x4D0` | `0x53F` | Controller Input Display: Components Config | +| ![](./docs/unallocated.svg) | `0x540` | `0xFFF` | Not Allocated | ### Adding translations From 3fa675eceaab130e7f9e210bd3374f4d6f699cdd Mon Sep 17 00:00:00 2001 From: sup39 Date: Mon, 6 Feb 2023 23:47:07 +0900 Subject: [PATCH 10/20] Fixed CustomizedDisplay: hex value of multi-byte char in format string --- changelog.md | 4 ++++ .../.vuepress/components/codes/CustomizedDisplay/codegen.js | 6 +++--- site/.vuepress/components/codes/asm.js | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/changelog.md b/changelog.md index fb070c3..d9fd4be 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,8 @@ # Changelog +## Feb 06, 2023 +### Fixed 'Customized Display' +Fixed the hex value of multi-byte char in format string + ## Feb 05, 2023 ### Created 'Controller Input Display' Display controller input diff --git a/site/.vuepress/components/codes/CustomizedDisplay/codegen.js b/site/.vuepress/components/codes/CustomizedDisplay/codegen.js index 016262a..c24a1bb 100644 --- a/site/.vuepress/components/codes/CustomizedDisplay/codegen.js +++ b/site/.vuepress/components/codes/CustomizedDisplay/codegen.js @@ -39,8 +39,8 @@ export default function codegen(version) { const asm = []; for (const config of configs) { - const { fmt, bgA } = config; - const { preview, format, fields } = parseFormat(fmt, version); + const { fmt: fmtRaw, bgA } = config; + const { preview, format, fields } = parseFormat(fmtRaw, version); // fill_rect if (bgA) { @@ -48,7 +48,7 @@ export default function codegen(version) { } // drawText - if (fmt.trim()) { + if (format.trim()) { const { insts, sp } = drawText(version, config, format, fields); stackFrameSize = Math.max(stackFrameSize, sp); asm.push(...insts); diff --git a/site/.vuepress/components/codes/asm.js b/site/.vuepress/components/codes/asm.js index c404c92..3d0df90 100644 --- a/site/.vuepress/components/codes/asm.js +++ b/site/.vuepress/components/codes/asm.js @@ -195,8 +195,8 @@ export function str2bytes(s, version) { /** @type {Record} */ const charInfo = version.startsWith('GMSJ') ? charInfoJP : charInfoEU; // TODO US const fmtbuf = Array.from(s).flatMap((c) => { - const code = charInfo[c]?.code ?? c.charCodeAt(0); - return code >= 0x100 ? [code >> 16, code & 0xff] : [code]; + const code = charInfo[c]?.code ?? c.charCodeAt(0); // TODO multi-byte invalid char + return code >= 0x100 ? [code >> 8, code & 0xff] : [code]; }); fmtbuf.push(0); // NUL terminated return fmtbuf; From 4d71083130c41c99e7384a3252975456125a1204 Mon Sep 17 00:00:00 2001 From: sup39 Date: Tue, 7 Feb 2023 16:29:10 +0900 Subject: [PATCH 11/20] Support int32 and int16 for fields in CustomizedDisplay --- Codes.xml | 6 ------ changelog.md | 4 ++++ site/.vuepress/components/codes/CustomizedDisplay/fields.js | 2 +- site/.vuepress/components/codes/CustomizedDisplay/format.js | 4 +++- site/.vuepress/components/codes/CustomizedDisplay/loader.js | 2 +- site/.vuepress/components/codes/asm.js | 5 +++++ 6 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Codes.xml b/Codes.xml index 0899928..ed9be22 100644 --- a/Codes.xml +++ b/Codes.xml @@ -4054,9 +4054,6 @@ ::: warning Shine Get Timer does not restart with this code. ::: - ::: warning - Z menu will be disabled - ::: #### Instant Restart - Press `B + D-Pad Up` to **restart the current area** @@ -4084,9 +4081,6 @@ ::: warning シャインゲットタイマーには未対応です。 ::: - ::: warning - Zメニューは無効化されます。 - ::: #### ポーズせずにやり直し - `B+十字キー上`で**現在のエリアをやり直す** diff --git a/changelog.md b/changelog.md index d9fd4be..363d5d7 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,8 @@ # Changelog +## Feb 07, 2023 +### Updated 'Customized Display' +Support signed int32 and int16 for fields + ## Feb 06, 2023 ### Fixed 'Customized Display' Fixed the hex value of multi-byte char in format string diff --git a/site/.vuepress/components/codes/CustomizedDisplay/fields.js b/site/.vuepress/components/codes/CustomizedDisplay/fields.js index b0ae70a..cfceaf1 100644 --- a/site/.vuepress/components/codes/CustomizedDisplay/fields.js +++ b/site/.vuepress/components/codes/CustomizedDisplay/fields.js @@ -86,7 +86,7 @@ export const fields = [ id: 'goop', fmt: '%d', preview: 600, - ...makeFunctionLoader(32, (ver) => [ + ...makeFunctionLoader(-32, (ver) => [ { type: 'call', addr: addrs.getPollutionDegree[ver], diff --git a/site/.vuepress/components/codes/CustomizedDisplay/format.js b/site/.vuepress/components/codes/CustomizedDisplay/format.js index 1f9ad5d..e189723 100644 --- a/site/.vuepress/components/codes/CustomizedDisplay/format.js +++ b/site/.vuepress/components/codes/CustomizedDisplay/format.js @@ -8,6 +8,8 @@ const dtype2fmtinfo = { 8: { prefix: 'hh', mask: 0xff }, 16: { prefix: 'h', mask: 0xffff }, 32: { prefix: '', mask: 0xffffffff }, + [-16]: { prefix: 'h', mask: 0xffff }, + [-32]: { prefix: '', mask: 0xffffffff }, }; /** @@ -58,7 +60,7 @@ export function parseFormat(input, version) { ipvw &= mask; const m = fmt2.trim().match(/^%?(\d*)h{,2}([dioxXu])$/); padfmt = m?.[1] || ''; - const t = m?.[2] || 'u'; + const t = m?.[2] || (dtype > 0 ? 'u' : 'd'); fmt = `%${padfmt}${prefix}${t}`; if ('di'.includes(t)) { if (ipvw > mask >>> 1) ipvw -= mask; diff --git a/site/.vuepress/components/codes/CustomizedDisplay/loader.js b/site/.vuepress/components/codes/CustomizedDisplay/loader.js index 8e3eaaf..34869bb 100644 --- a/site/.vuepress/components/codes/CustomizedDisplay/loader.js +++ b/site/.vuepress/components/codes/CustomizedDisplay/loader.js @@ -12,7 +12,7 @@ export const fTmp = 12; * @typedef {LoadDstReg|LoadDstStack} LoadDst * @typedef {{ * asm(version: GameVersion, dst: LoadDst): ASMInst[] - * dtype: 8|16|32|'float' + * dtype: 8|16|-16|32|-32|'float' * calling: boolean * }} Loader */ diff --git a/site/.vuepress/components/codes/asm.js b/site/.vuepress/components/codes/asm.js index 3d0df90..b8991c2 100644 --- a/site/.vuepress/components/codes/asm.js +++ b/site/.vuepress/components/codes/asm.js @@ -123,6 +123,7 @@ export const ASM = { // load rS, rA, D lbz: makeInstD(34), lhz: makeInstD(40), + lha: makeInstD(42), lwz: makeInstD(32), lfs: makeInstD(48), lfd: makeInstD(50), @@ -161,12 +162,16 @@ export const $load = { 8: ASM.lbz, 16: ASM.lhz, 32: ASM.lwz, + [-16]: ASM.lha, + [-32]: ASM.lwz, float: ASM.lfs, }; export const $store = { 8: ASM.stb, 16: ASM.sth, 32: ASM.stw, + [-16]: ASM.sth, + [-32]: ASM.stw, float: ASM.stfs, double: ASM.stfd, }; From 6c3b4607fdd784652fd78189e7aaaf3b148f13c9 Mon Sep 17 00:00:00 2001 From: sup39 Date: Tue, 14 Feb 2023 02:36:22 +0900 Subject: [PATCH 12/20] Added 'In-Stage Attempt Counter', 'Manual Attempt Counter' --- Codes.xml | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++ changelog.md | 2 + 2 files changed, 162 insertions(+) diff --git a/Codes.xml b/Codes.xml index d43cbef..f19e7ce 100644 --- a/Codes.xml +++ b/Codes.xml @@ -4721,6 +4721,166 @@ 4E800021 00000000 + + misc + In-Stage Attempt Counter + ステージ内Attempt Counter + sup39(サポミク) + 1.0 + Feb 13, 2023 + + | Combination | Result | + | ----------- | --------------------------- | + | D-Pad Left | Display the attempt counter | + | D-Pad Right | Increase attempt count by 1 | + + + | ボタン | 機能 | + | ---------- | --------------------- | + | 十字キー左 | Attempt Counterを表示 | + | 十字キー右 | 試行回数を1増やす | + + + C20ECE5C 0000000A + 3D608040 A40B0D82 + 2B800001 419E000C + 28000002 40A20030 + 3D40817F 880A0479 + 980A0478 419E0020 + A00B0004 A18B0008 + 7C006279 41820010 + A18A04A6 398C0001 + B18A04A6 38E00000 + 60000000 00000000 + + + C2279588 0000000A + 3D60803F A40B545A + 2B800001 419E000C + 28000002 40A20030 + 3D40817F 880A0479 + 980A0478 419E0020 + A00B0004 A18B0008 + 7C006279 41820010 + A18A04A6 398C0001 + B18A04A6 38E00000 + 60000000 00000000 + + + C2291770 0000000A + 3D608040 A40BBC26 + 2B800001 419E000C + 28000002 40A20030 + 3D40817F 880A0479 + 980A0478 419E0020 + A00B0004 A18B0008 + 7C006279 41820010 + A18A04A6 398C0001 + B18A04A6 38E00000 + 60000000 00000000 + + + C22998D8 0000000A + 3D608040 A40B4486 + 2B800001 419E000C + 28000002 40A20030 + 3D40817F 880A0479 + 980A0478 419E0020 + A00B0004 A18B0008 + 7C006279 41820010 + A18A04A6 398C0001 + B18A04A6 38E00000 + 60000000 00000000 + + + + misc + Manual Attempt Counter + 手動Attempt Counter + sup39(サポミク) + 1.0 + Feb 13, 2023 + + Allows you to modify the attempt count and success count manually. + + | Combination | Result | + | ------------------- | --------------------------- | + | R + X + D-Pad Left | Decrease attempt count by 1 | + | R + X + D-Pad Right | Increase attempt count by 1 | + | R + X + D-Pad Down | Decrease success count by 1 | + | R + X + D-Pad Up | Increase success count by 1 | + + + Attempt Counterを手動で操作できるようになります。 + + | ボタン | 機能 | + | ------------------ | ----------------- | + | R + X + 十字キー左 | 試行回数を1減らす | + | R + X + 十字キー右 | 試行回数を1増やす | + | R + X + 十字キー下 | 成功回数を1減らす | + | R + X + 十字キー上 | 成功回数を1増やす | + + + C20ECE58 0000000C + 3D208040 A4090D82 + 7000FFF0 28000420 + 40A20044 89290019 + 3D40817F 880A0479 + 980A0478 A18A04A4 + 5520F7FE 7D806050 + 5520EFFE 7D8C0214 + B18A04A4 A18A04A6 + 552007FE 7D806050 + 5520FFFE 7D8C0214 + B18A04A6 38C00000 + 60000000 00000000 + + + C2279584 0000000C + 3D20803F A409545A + 7000FFF0 28000420 + 40A20044 89290019 + 3D40817F 880A0479 + 980A0478 A18A04A4 + 5520F7FE 7D806050 + 5520EFFE 7D8C0214 + B18A04A4 A18A04A6 + 552007FE 7D806050 + 5520FFFE 7D8C0214 + B18A04A6 38C00000 + 60000000 00000000 + + + C229176C 0000000C + 3D208040 A409BC26 + 7000FFF0 28000420 + 40A20044 89290019 + 3D40817F 880A0479 + 980A0478 A18A04A4 + 5520F7FE 7D806050 + 5520EFFE 7D8C0214 + B18A04A4 A18A04A6 + 552007FE 7D806050 + 5520FFFE 7D8C0214 + B18A04A6 38C00000 + 60000000 00000000 + + + C22998D4 0000000C + 3D208040 A4094486 + 7000FFF0 28000420 + 40A20044 89290019 + 3D40817F 880A0479 + 980A0478 A18A04A4 + 5520F7FE 7D806050 + 5520EFFE 7D8C0214 + B18A04A4 A18A04A6 + 552007FE 7D806050 + 5520FFFE 7D8C0214 + B18A04A6 38C00000 + 60000000 00000000 + + controller metadata diff --git a/changelog.md b/changelog.md index 911f33a..51ae187 100644 --- a/changelog.md +++ b/changelog.md @@ -3,6 +3,8 @@ - Added 'Mario State Savestate' - Added 'No Shine Get Animation' - Added 'Fruit Never Time Out' +- Added 'In-Stage Attempt Counter' +- Added 'Manual Attempt Counter' ## Feb 11, 2023 - Added 'Deathless Blooper Surfing' From 749f393867eaea22f5867a9524dbebd043584125 Mon Sep 17 00:00:00 2001 From: sup39 Date: Tue, 14 Feb 2023 02:51:09 +0900 Subject: [PATCH 13/20] prevent showing attempt counter when pressing R+X --- Codes.xml | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Codes.xml b/Codes.xml index f19e7ce..a193c37 100644 --- a/Codes.xml +++ b/Codes.xml @@ -4821,10 +4821,11 @@ | R + X + 十字キー上 | 成功回数を1増やす |
- C20ECE58 0000000C + C20ECE58 0000000D 3D208040 A4090D82 7000FFF0 28000420 - 40A20044 89290019 + 40A2004C 89290019 + 5520073F 41820040 3D40817F 880A0479 980A0478 A18A04A4 5520F7FE 7D806050 @@ -4836,10 +4837,11 @@ 60000000 00000000 - C2279584 0000000C + C2279584 0000000D 3D20803F A409545A 7000FFF0 28000420 - 40A20044 89290019 + 40A2004C 89290019 + 5520073F 41820040 3D40817F 880A0479 980A0478 A18A04A4 5520F7FE 7D806050 @@ -4851,10 +4853,11 @@ 60000000 00000000 - C229176C 0000000C + C229176C 0000000D 3D208040 A409BC26 7000FFF0 28000420 - 40A20044 89290019 + 40A2004C 89290019 + 5520073F 41820040 3D40817F 880A0479 980A0478 A18A04A4 5520F7FE 7D806050 @@ -4866,10 +4869,11 @@ 60000000 00000000 - C22998D4 0000000C + C22998D4 0000000D 3D208040 A4094486 7000FFF0 28000420 - 40A20044 89290019 + 40A2004C 89290019 + 5520073F 41820040 3D40817F 880A0479 980A0478 A18A04A4 5520F7FE 7D806050 From 6a9302028da299daf451ce8c0d07002147e0b921 Mon Sep 17 00:00:00 2001 From: sup39 Date: Tue, 28 Feb 2023 23:33:26 +0900 Subject: [PATCH 14/20] Fix preview of Controller Input Display --- changelog.md | 3 +++ site/.vuepress/components/codes/controller/preview.vue | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index a115fd5..fbaa30b 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,7 @@ # Changelog +## Feb 28, 2023 +Fix preview of Controller Input Display + ## Feb 23, 2023 ### Updated 'Force Plaza Events' Set the correct BH/RH/GB unlock flag diff --git a/site/.vuepress/components/codes/controller/preview.vue b/site/.vuepress/components/codes/controller/preview.vue index cf9ec68..1c7cbdd 100644 --- a/site/.vuepress/components/codes/controller/preview.vue +++ b/site/.vuepress/components/codes/controller/preview.vue @@ -36,7 +36,7 @@ export default { computed: { transform() { const {x, y, height} = this.config; - return `translate(${x||0}, ${y||0}) scale(${(height||0)/120})`; + return `scale(0.9375,1) translate(${x||0}, ${y||0}) scale(${(height||0)/120})`; }, lw() { const {lw} = this.config; From c22ffabc73d064ba38634f6ddb4a2dcc6faba851 Mon Sep 17 00:00:00 2001 From: sup39 Date: Wed, 17 May 2023 22:28:41 +0900 Subject: [PATCH 15/20] Added font for NTSC-U --- changelog.md | 4 + site/.vuepress/components/PreviewString.vue | 10 +- site/.vuepress/components/codes/asm.js | 7 +- site/.vuepress/components/codes/text.js | 9 +- site/.vuepress/data/charInfo-EU.json | 54 +- site/.vuepress/data/charInfo-US.json | 1346 +++++++++++++++++ site/.vuepress/public/img/preview/font-US.png | Bin 0 -> 30945 bytes site/de/code-reference/index.md | 2 +- site/fr/code-reference/index.md | 2 +- site/ja/code-reference/index.md | 2 +- 10 files changed, 1400 insertions(+), 36 deletions(-) create mode 100644 site/.vuepress/data/charInfo-US.json create mode 100644 site/.vuepress/public/img/preview/font-US.png diff --git a/changelog.md b/changelog.md index fbaa30b..45487e3 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,8 @@ # Changelog +## May 17, 2023 +- Added font for NTSC-U +- Fixed the encoding of NTSC-U and PAL (should be Windows-1252 instead of latin1) + ## Feb 28, 2023 Fix preview of Controller Input Display diff --git a/site/.vuepress/components/PreviewString.vue b/site/.vuepress/components/PreviewString.vue index ef11ea4..a149d67 100644 --- a/site/.vuepress/components/PreviewString.vue +++ b/site/.vuepress/components/PreviewString.vue @@ -21,8 +21,7 @@ export default { }, computed: { previewCssClass() { - // TODO US - return `preview-str preview-${['GMSJ01', 'GMSJ0A'].includes(this.version) ? 'JP' : 'EU'}`; + return `preview-str preview-${this.version.startsWith('GMSJ') ? 'JP' : this.version === 'GMSE01' ? 'US' : 'EU'}`; }, styles() { const {config, version} = this; @@ -96,6 +95,13 @@ export default { mask-image: url(/img/preview/font-JP.png); -webkit-mask-image: url(/img/preview/font-JP.png); } +.preview-US .char-bg { + background: url(/img/preview/font-US.png); +} +.preview-US .char-mask { + mask-image: url(/img/preview/font-US.png); + -webkit-mask-image: url(/img/preview/font-US.png); +} .preview-EU .char-bg { background: url(/img/preview/font-EU.png); } diff --git a/site/.vuepress/components/codes/asm.js b/site/.vuepress/components/codes/asm.js index b8991c2..daf4665 100644 --- a/site/.vuepress/components/codes/asm.js +++ b/site/.vuepress/components/codes/asm.js @@ -1,5 +1,6 @@ import charInfoJP from '../../data/charInfo-JP.json'; import charInfoEU from '../../data/charInfo-EU.json'; +import charInfoUS from '../../data/charInfo-US.json'; /** * @typedef {number} Inst @@ -198,7 +199,11 @@ export function liDX(rT, D) { */ export function str2bytes(s, version) { /** @type {Record} */ - const charInfo = version.startsWith('GMSJ') ? charInfoJP : charInfoEU; // TODO US + const charInfo = version.startsWith('GMSJ') + ? charInfoJP + : version === 'GMSE01' + ? charInfoUS + : charInfoEU; const fmtbuf = Array.from(s).flatMap((c) => { const code = charInfo[c]?.code ?? c.charCodeAt(0); // TODO multi-byte invalid char return code >= 0x100 ? [code >> 8, code & 0xff] : [code]; diff --git a/site/.vuepress/components/codes/text.js b/site/.vuepress/components/codes/text.js index 05193d2..3379a61 100644 --- a/site/.vuepress/components/codes/text.js +++ b/site/.vuepress/components/codes/text.js @@ -1,20 +1,23 @@ /** @typedef {{index: number, kerning: number, width: number, code: number}} CharInfo */ import charInfoJP from '../../data/charInfo-JP.json'; import charInfoEU from '../../data/charInfo-EU.json'; +import charInfoUS from '../../data/charInfo-US.json'; /** * @param {string} version */ const getFontInfo = (version) => - ['GMSJ01', 'GMSJ0A'].includes(version) + version.startsWith('GMSJ') ? { // JP charInfo: /**@type{Record}*/ (charInfoJP), rowSize: 24, // how many char in a row of the img } : { - // EU (TODO US) - charInfo: /**@type{Record}*/ (charInfoEU), + // US, EU + charInfo: /**@type{Record}*/ ( + version === 'GMSE01' ? charInfoUS : charInfoEU + ), rowSize: 16, // how many char in a row of the img }; diff --git a/site/.vuepress/data/charInfo-EU.json b/site/.vuepress/data/charInfo-EU.json index 9b94502..ea2df3b 100644 --- a/site/.vuepress/data/charInfo-EU.json +++ b/site/.vuepress/data/charInfo-EU.json @@ -575,7 +575,7 @@ "width": 20, "code": 127 }, - "\u0080": { + "\u20ac": { "index": 96, "kerning": 1, "width": 16, @@ -587,67 +587,67 @@ "width": 20, "code": 129 }, - "\u0082": { + "\u201a": { "index": 98, "kerning": 0, "width": 8, "code": 130 }, - "\u0083": { + "\u0192": { "index": 99, "kerning": 2, "width": 13, "code": 131 }, - "\u0084": { + "\u201e": { "index": 100, "kerning": 0, "width": 12, "code": 132 }, - "\u0085": { + "\u2026": { "index": 101, "kerning": 1, "width": 17, "code": 133 }, - "\u0086": { + "\u2020": { "index": 102, "kerning": 0, "width": 20, "code": 134 }, - "\u0087": { + "\u2021": { "index": 103, "kerning": 0, "width": 20, "code": 135 }, - "\u0088": { + "\u02c6": { "index": 104, "kerning": 3, "width": 9, "code": 136 }, - "\u0089": { + "\u2030": { "index": 105, "kerning": 0, "width": 20, "code": 137 }, - "\u008a": { + "\u0160": { "index": 106, "kerning": 2, "width": 14, "code": 138 }, - "\u008b": { + "\u2039": { "index": 107, "kerning": 3, "width": 14, "code": 139 }, - "\u008c": { + "\u0152": { "index": 108, "kerning": 0, "width": 19, @@ -659,7 +659,7 @@ "width": 20, "code": 141 }, - "\u008e": { + "\u017d": { "index": 110, "kerning": 2, "width": 14, @@ -677,73 +677,73 @@ "width": 20, "code": 144 }, - "\u0091": { + "\u2018": { "index": 113, "kerning": 4, "width": 5, "code": 145 }, - "\u0092": { + "\u2019": { "index": 114, "kerning": 4, "width": 5, "code": 146 }, - "\u0093": { + "\u201c": { "index": 115, "kerning": 3, "width": 8, "code": 147 }, - "\u0094": { + "\u201d": { "index": 116, "kerning": 3, "width": 8, "code": 148 }, - "\u0095": { + "\u2022": { "index": 117, "kerning": 1, "width": 15, "code": 149 }, - "\u0096": { + "\u2013": { "index": 118, "kerning": 0, "width": 20, "code": 150 }, - "\u0097": { + "\u2014": { "index": 119, "kerning": 0, "width": 20, "code": 151 }, - "\u0098": { + "\u02dc": { "index": 120, "kerning": 2, "width": 13, "code": 152 }, - "\u0099": { + "\u2122": { "index": 121, "kerning": 2, "width": 16, "code": 153 }, - "\u009a": { + "\u0161": { "index": 122, "kerning": 2, "width": 13, "code": 154 }, - "\u009b": { + "\u203a": { "index": 123, "kerning": 0, "width": 15, "code": 155 }, - "\u009c": { + "\u0153": { "index": 124, "kerning": 0, "width": 19, @@ -755,13 +755,13 @@ "width": 20, "code": 157 }, - "\u009e": { + "\u017e": { "index": 126, "kerning": 2, "width": 12, "code": 158 }, - "\u009f": { + "\u0178": { "index": 127, "kerning": 1, "width": 15, diff --git a/site/.vuepress/data/charInfo-US.json b/site/.vuepress/data/charInfo-US.json new file mode 100644 index 0000000..ecd0289 --- /dev/null +++ b/site/.vuepress/data/charInfo-US.json @@ -0,0 +1,1346 @@ +{ + " ": { + "index": 0, + "kerning": 0, + "width": 11, + "code": 32 + }, + "!": { + "index": 1, + "kerning": 3, + "width": 9, + "code": 33 + }, + "\"": { + "index": 2, + "kerning": 3, + "width": 9, + "code": 34 + }, + "#": { + "index": 3, + "kerning": 0, + "width": 20, + "code": 35 + }, + "$": { + "index": 4, + "kerning": 0, + "width": 20, + "code": 36 + }, + "%": { + "index": 5, + "kerning": 0, + "width": 20, + "code": 37 + }, + "&": { + "index": 6, + "kerning": 0, + "width": 20, + "code": 38 + }, + "'": { + "index": 7, + "kerning": 4, + "width": 5, + "code": 39 + }, + "(": { + "index": 8, + "kerning": 3, + "width": 14, + "code": 40 + }, + ")": { + "index": 9, + "kerning": 0, + "width": 15, + "code": 41 + }, + "*": { + "index": 10, + "kerning": 0, + "width": 20, + "code": 42 + }, + "+": { + "index": 11, + "kerning": 0, + "width": 20, + "code": 43 + }, + ",": { + "index": 12, + "kerning": 0, + "width": 8, + "code": 44 + }, + "-": { + "index": 13, + "kerning": 0, + "width": 20, + "code": 45 + }, + ".": { + "index": 14, + "kerning": 0, + "width": 8, + "code": 46 + }, + "/": { + "index": 15, + "kerning": 0, + "width": 20, + "code": 47 + }, + "0": { + "index": 16, + "kerning": 1, + "width": 16, + "code": 48 + }, + "1": { + "index": 17, + "kerning": 2, + "width": 12, + "code": 49 + }, + "2": { + "index": 18, + "kerning": 1, + "width": 15, + "code": 50 + }, + "3": { + "index": 19, + "kerning": 2, + "width": 14, + "code": 51 + }, + "4": { + "index": 20, + "kerning": 1, + "width": 16, + "code": 52 + }, + "5": { + "index": 21, + "kerning": 1, + "width": 15, + "code": 53 + }, + "6": { + "index": 22, + "kerning": 1, + "width": 15, + "code": 54 + }, + "7": { + "index": 23, + "kerning": 1, + "width": 15, + "code": 55 + }, + "8": { + "index": 24, + "kerning": 1, + "width": 15, + "code": 56 + }, + "9": { + "index": 25, + "kerning": 1, + "width": 16, + "code": 57 + }, + ":": { + "index": 26, + "kerning": 3, + "width": 7, + "code": 58 + }, + ";": { + "index": 27, + "kerning": 3, + "width": 7, + "code": 59 + }, + "<": { + "index": 28, + "kerning": 0, + "width": 20, + "code": 60 + }, + "=": { + "index": 29, + "kerning": 0, + "width": 20, + "code": 61 + }, + ">": { + "index": 30, + "kerning": 0, + "width": 20, + "code": 62 + }, + "?": { + "index": 31, + "kerning": 1, + "width": 15, + "code": 63 + }, + "@": { + "index": 32, + "kerning": 0, + "width": 20, + "code": 64 + }, + "A": { + "index": 33, + "kerning": 1, + "width": 17, + "code": 65 + }, + "B": { + "index": 34, + "kerning": 1, + "width": 16, + "code": 66 + }, + "C": { + "index": 35, + "kerning": 1, + "width": 16, + "code": 67 + }, + "D": { + "index": 36, + "kerning": 2, + "width": 15, + "code": 68 + }, + "E": { + "index": 37, + "kerning": 2, + "width": 14, + "code": 69 + }, + "F": { + "index": 38, + "kerning": 2, + "width": 14, + "code": 70 + }, + "G": { + "index": 39, + "kerning": 1, + "width": 17, + "code": 71 + }, + "H": { + "index": 40, + "kerning": 1, + "width": 16, + "code": 72 + }, + "I": { + "index": 41, + "kerning": 4, + "width": 6, + "code": 73 + }, + "J": { + "index": 42, + "kerning": 2, + "width": 13, + "code": 74 + }, + "K": { + "index": 43, + "kerning": 2, + "width": 14, + "code": 75 + }, + "L": { + "index": 44, + "kerning": 2, + "width": 14, + "code": 76 + }, + "M": { + "index": 45, + "kerning": 0, + "width": 19, + "code": 77 + }, + "N": { + "index": 46, + "kerning": 1, + "width": 16, + "code": 78 + }, + "O": { + "index": 47, + "kerning": 1, + "width": 17, + "code": 79 + }, + "P": { + "index": 48, + "kerning": 1, + "width": 16, + "code": 80 + }, + "Q": { + "index": 49, + "kerning": 1, + "width": 18, + "code": 81 + }, + "R": { + "index": 50, + "kerning": 1, + "width": 16, + "code": 82 + }, + "S": { + "index": 51, + "kerning": 2, + "width": 14, + "code": 83 + }, + "T": { + "index": 52, + "kerning": 2, + "width": 13, + "code": 84 + }, + "U": { + "index": 53, + "kerning": 1, + "width": 16, + "code": 85 + }, + "V": { + "index": 54, + "kerning": 1, + "width": 16, + "code": 86 + }, + "W": { + "index": 55, + "kerning": 0, + "width": 20, + "code": 87 + }, + "X": { + "index": 56, + "kerning": 1, + "width": 15, + "code": 88 + }, + "Y": { + "index": 57, + "kerning": 1, + "width": 15, + "code": 89 + }, + "Z": { + "index": 58, + "kerning": 2, + "width": 14, + "code": 90 + }, + "[": { + "index": 59, + "kerning": 0, + "width": 20, + "code": 91 + }, + "\\": { + "index": 60, + "kerning": 0, + "width": 20, + "code": 92 + }, + "]": { + "index": 61, + "kerning": 0, + "width": 20, + "code": 93 + }, + "^": { + "index": 62, + "kerning": 3, + "width": 9, + "code": 94 + }, + "_": { + "index": 63, + "kerning": 0, + "width": 20, + "code": 95 + }, + "`": { + "index": 64, + "kerning": 4, + "width": 5, + "code": 96 + }, + "a": { + "index": 65, + "kerning": 2, + "width": 13, + "code": 97 + }, + "b": { + "index": 66, + "kerning": 2, + "width": 14, + "code": 98 + }, + "c": { + "index": 67, + "kerning": 2, + "width": 11, + "code": 99 + }, + "d": { + "index": 68, + "kerning": 1, + "width": 14, + "code": 100 + }, + "e": { + "index": 69, + "kerning": 2, + "width": 13, + "code": 101 + }, + "f": { + "index": 70, + "kerning": 3, + "width": 9, + "code": 102 + }, + "g": { + "index": 71, + "kerning": 2, + "width": 13, + "code": 103 + }, + "h": { + "index": 72, + "kerning": 2, + "width": 12, + "code": 104 + }, + "i": { + "index": 73, + "kerning": 4, + "width": 6, + "code": 105 + }, + "j": { + "index": 74, + "kerning": 3, + "width": 8, + "code": 106 + }, + "k": { + "index": 75, + "kerning": 2, + "width": 12, + "code": 107 + }, + "l": { + "index": 76, + "kerning": 3, + "width": 7, + "code": 108 + }, + "m": { + "index": 77, + "kerning": 1, + "width": 17, + "code": 109 + }, + "n": { + "index": 78, + "kerning": 2, + "width": 13, + "code": 110 + }, + "o": { + "index": 79, + "kerning": 2, + "width": 14, + "code": 111 + }, + "p": { + "index": 80, + "kerning": 2, + "width": 14, + "code": 112 + }, + "q": { + "index": 81, + "kerning": 1, + "width": 14, + "code": 113 + }, + "r": { + "index": 82, + "kerning": 3, + "width": 9, + "code": 114 + }, + "s": { + "index": 83, + "kerning": 2, + "width": 13, + "code": 115 + }, + "t": { + "index": 84, + "kerning": 3, + "width": 9, + "code": 116 + }, + "u": { + "index": 85, + "kerning": 2, + "width": 13, + "code": 117 + }, + "v": { + "index": 86, + "kerning": 2, + "width": 13, + "code": 118 + }, + "w": { + "index": 87, + "kerning": 1, + "width": 17, + "code": 119 + }, + "x": { + "index": 88, + "kerning": 2, + "width": 11, + "code": 120 + }, + "y": { + "index": 89, + "kerning": 2, + "width": 12, + "code": 121 + }, + "z": { + "index": 90, + "kerning": 2, + "width": 12, + "code": 122 + }, + "{": { + "index": 91, + "kerning": 0, + "width": 20, + "code": 123 + }, + "|": { + "index": 92, + "kerning": 0, + "width": 20, + "code": 124 + }, + "}": { + "index": 93, + "kerning": 0, + "width": 20, + "code": 125 + }, + "~": { + "index": 94, + "kerning": 0, + "width": 20, + "code": 126 + }, + "\u007f": { + "index": 95, + "kerning": 0, + "width": 20, + "code": 127 + }, + "\u20ac": { + "index": 96, + "kerning": 1, + "width": 16, + "code": 128 + }, + "\u0081": { + "index": 97, + "kerning": 0, + "width": 20, + "code": 129 + }, + "\u201a": { + "index": 98, + "kerning": 0, + "width": 8, + "code": 130 + }, + "\u0192": { + "index": 99, + "kerning": 2, + "width": 13, + "code": 131 + }, + "\u201e": { + "index": 100, + "kerning": 0, + "width": 12, + "code": 132 + }, + "\u2026": { + "index": 101, + "kerning": 1, + "width": 17, + "code": 133 + }, + "\u2020": { + "index": 102, + "kerning": 0, + "width": 20, + "code": 134 + }, + "\u2021": { + "index": 103, + "kerning": 0, + "width": 20, + "code": 135 + }, + "\u02c6": { + "index": 104, + "kerning": 3, + "width": 9, + "code": 136 + }, + "\u2030": { + "index": 105, + "kerning": 0, + "width": 20, + "code": 137 + }, + "\u0160": { + "index": 106, + "kerning": 2, + "width": 14, + "code": 138 + }, + "\u2039": { + "index": 107, + "kerning": 3, + "width": 14, + "code": 139 + }, + "\u0152": { + "index": 108, + "kerning": 0, + "width": 19, + "code": 140 + }, + "\u008d": { + "index": 109, + "kerning": 0, + "width": 20, + "code": 141 + }, + "\u017d": { + "index": 110, + "kerning": 2, + "width": 14, + "code": 142 + }, + "\u008f": { + "index": 111, + "kerning": 0, + "width": 20, + "code": 143 + }, + "\u0090": { + "index": 112, + "kerning": 0, + "width": 20, + "code": 144 + }, + "\u2018": { + "index": 113, + "kerning": 4, + "width": 5, + "code": 145 + }, + "\u2019": { + "index": 114, + "kerning": 4, + "width": 5, + "code": 146 + }, + "\u201c": { + "index": 115, + "kerning": 3, + "width": 8, + "code": 147 + }, + "\u201d": { + "index": 116, + "kerning": 3, + "width": 8, + "code": 148 + }, + "\u2022": { + "index": 117, + "kerning": 1, + "width": 15, + "code": 149 + }, + "\u2013": { + "index": 118, + "kerning": 0, + "width": 20, + "code": 150 + }, + "\u2014": { + "index": 119, + "kerning": 0, + "width": 20, + "code": 151 + }, + "\u02dc": { + "index": 120, + "kerning": 2, + "width": 13, + "code": 152 + }, + "\u2122": { + "index": 121, + "kerning": 2, + "width": 16, + "code": 153 + }, + "\u0161": { + "index": 122, + "kerning": 2, + "width": 13, + "code": 154 + }, + "\u203a": { + "index": 123, + "kerning": 0, + "width": 15, + "code": 155 + }, + "\u0153": { + "index": 124, + "kerning": 0, + "width": 19, + "code": 156 + }, + "\u009d": { + "index": 125, + "kerning": 0, + "width": 20, + "code": 157 + }, + "\u017e": { + "index": 126, + "kerning": 2, + "width": 12, + "code": 158 + }, + "\u0178": { + "index": 127, + "kerning": 1, + "width": 15, + "code": 159 + }, + "\u00a0": { + "index": 128, + "kerning": 0, + "width": 20, + "code": 160 + }, + "\u00a1": { + "index": 129, + "kerning": 2, + "width": 9, + "code": 161 + }, + "\u00a2": { + "index": 130, + "kerning": 2, + "width": 13, + "code": 162 + }, + "\u00a3": { + "index": 131, + "kerning": 1, + "width": 15, + "code": 163 + }, + "\u00a4": { + "index": 132, + "kerning": 1, + "width": 16, + "code": 164 + }, + "\u00a5": { + "index": 133, + "kerning": 0, + "width": 20, + "code": 165 + }, + "\u00a6": { + "index": 134, + "kerning": 4, + "width": 6, + "code": 166 + }, + "\u00a7": { + "index": 135, + "kerning": 2, + "width": 13, + "code": 167 + }, + "\u00a8": { + "index": 136, + "kerning": 2, + "width": 11, + "code": 168 + }, + "\u00a9": { + "index": 137, + "kerning": 0, + "width": 20, + "code": 169 + }, + "\u00aa": { + "index": 138, + "kerning": 2, + "width": 11, + "code": 170 + }, + "\u00ab": { + "index": 139, + "kerning": 3, + "width": 14, + "code": 171 + }, + "\u00ac": { + "index": 140, + "kerning": 1, + "width": 17, + "code": 172 + }, + "\u00ad": { + "index": 141, + "kerning": 0, + "width": 20, + "code": 173 + }, + "\u00ae": { + "index": 142, + "kerning": 0, + "width": 20, + "code": 174 + }, + "\u00af": { + "index": 143, + "kerning": 0, + "width": 20, + "code": 175 + }, + "\u00b0": { + "index": 144, + "kerning": 3, + "width": 9, + "code": 176 + }, + "\u00b1": { + "index": 145, + "kerning": 0, + "width": 20, + "code": 177 + }, + "\u00b2": { + "index": 146, + "kerning": 3, + "width": 9, + "code": 178 + }, + "\u00b3": { + "index": 147, + "kerning": 3, + "width": 9, + "code": 179 + }, + "\u00b4": { + "index": 148, + "kerning": 3, + "width": 9, + "code": 180 + }, + "\u00b5": { + "index": 149, + "kerning": 1, + "width": 15, + "code": 181 + }, + "\u00b6": { + "index": 150, + "kerning": 0, + "width": 20, + "code": 182 + }, + "\u00b7": { + "index": 151, + "kerning": 2, + "width": 13, + "code": 183 + }, + "\u00b8": { + "index": 152, + "kerning": 4, + "width": 7, + "code": 184 + }, + "\u00b9": { + "index": 153, + "kerning": 3, + "width": 7, + "code": 185 + }, + "\u00ba": { + "index": 154, + "kerning": 2, + "width": 11, + "code": 186 + }, + "\u00bb": { + "index": 155, + "kerning": 0, + "width": 15, + "code": 187 + }, + "\u00bc": { + "index": 156, + "kerning": 1, + "width": 17, + "code": 188 + }, + "\u00bd": { + "index": 157, + "kerning": 1, + "width": 17, + "code": 189 + }, + "\u00be": { + "index": 158, + "kerning": 1, + "width": 18, + "code": 190 + }, + "\u00bf": { + "index": 159, + "kerning": 1, + "width": 15, + "code": 191 + }, + "\u00c0": { + "index": 160, + "kerning": 1, + "width": 17, + "code": 192 + }, + "\u00c1": { + "index": 161, + "kerning": 1, + "width": 17, + "code": 193 + }, + "\u00c2": { + "index": 162, + "kerning": 1, + "width": 17, + "code": 194 + }, + "\u00c3": { + "index": 163, + "kerning": 1, + "width": 17, + "code": 195 + }, + "\u00c4": { + "index": 164, + "kerning": 1, + "width": 17, + "code": 196 + }, + "\u00c5": { + "index": 165, + "kerning": 1, + "width": 17, + "code": 197 + }, + "\u00c6": { + "index": 166, + "kerning": 0, + "width": 20, + "code": 198 + }, + "\u00c7": { + "index": 167, + "kerning": 2, + "width": 14, + "code": 199 + }, + "\u00c8": { + "index": 168, + "kerning": 2, + "width": 14, + "code": 200 + }, + "\u00c9": { + "index": 169, + "kerning": 2, + "width": 14, + "code": 201 + }, + "\u00ca": { + "index": 170, + "kerning": 2, + "width": 14, + "code": 202 + }, + "\u00cb": { + "index": 171, + "kerning": 2, + "width": 14, + "code": 203 + }, + "\u00cc": { + "index": 172, + "kerning": 3, + "width": 8, + "code": 204 + }, + "\u00cd": { + "index": 173, + "kerning": 3, + "width": 8, + "code": 205 + }, + "\u00ce": { + "index": 174, + "kerning": 3, + "width": 8, + "code": 206 + }, + "\u00cf": { + "index": 175, + "kerning": 3, + "width": 8, + "code": 207 + }, + "\u00d0": { + "index": 176, + "kerning": 1, + "width": 17, + "code": 208 + }, + "\u00d1": { + "index": 177, + "kerning": 1, + "width": 16, + "code": 209 + }, + "\u00d2": { + "index": 178, + "kerning": 1, + "width": 17, + "code": 210 + }, + "\u00d3": { + "index": 179, + "kerning": 1, + "width": 17, + "code": 211 + }, + "\u00d4": { + "index": 180, + "kerning": 1, + "width": 17, + "code": 212 + }, + "\u00d5": { + "index": 181, + "kerning": 1, + "width": 17, + "code": 213 + }, + "\u00d6": { + "index": 182, + "kerning": 1, + "width": 17, + "code": 214 + }, + "\u00d7": { + "index": 183, + "kerning": 2, + "width": 14, + "code": 215 + }, + "\u00d8": { + "index": 184, + "kerning": 1, + "width": 17, + "code": 216 + }, + "\u00d9": { + "index": 185, + "kerning": 1, + "width": 16, + "code": 217 + }, + "\u00da": { + "index": 186, + "kerning": 1, + "width": 16, + "code": 218 + }, + "\u00db": { + "index": 187, + "kerning": 1, + "width": 16, + "code": 219 + }, + "\u00dc": { + "index": 188, + "kerning": 1, + "width": 16, + "code": 220 + }, + "\u00dd": { + "index": 189, + "kerning": 1, + "width": 15, + "code": 221 + }, + "\u00de": { + "index": 190, + "kerning": 1, + "width": 16, + "code": 222 + }, + "\u00df": { + "index": 191, + "kerning": 1, + "width": 16, + "code": 223 + }, + "\u00e0": { + "index": 192, + "kerning": 2, + "width": 13, + "code": 224 + }, + "\u00e1": { + "index": 193, + "kerning": 2, + "width": 13, + "code": 225 + }, + "\u00e2": { + "index": 194, + "kerning": 2, + "width": 13, + "code": 226 + }, + "\u00e3": { + "index": 195, + "kerning": 2, + "width": 13, + "code": 227 + }, + "\u00e4": { + "index": 196, + "kerning": 2, + "width": 13, + "code": 228 + }, + "\u00e5": { + "index": 197, + "kerning": 2, + "width": 13, + "code": 229 + }, + "\u00e6": { + "index": 198, + "kerning": 1, + "width": 17, + "code": 230 + }, + "\u00e7": { + "index": 199, + "kerning": 3, + "width": 12, + "code": 231 + }, + "\u00e8": { + "index": 200, + "kerning": 2, + "width": 13, + "code": 232 + }, + "\u00e9": { + "index": 201, + "kerning": 2, + "width": 13, + "code": 233 + }, + "\u00ea": { + "index": 202, + "kerning": 2, + "width": 13, + "code": 234 + }, + "\u00eb": { + "index": 203, + "kerning": 2, + "width": 13, + "code": 235 + }, + "\u00ec": { + "index": 204, + "kerning": 3, + "width": 8, + "code": 236 + }, + "\u00ed": { + "index": 205, + "kerning": 3, + "width": 8, + "code": 237 + }, + "\u00ee": { + "index": 206, + "kerning": 3, + "width": 8, + "code": 238 + }, + "\u00ef": { + "index": 207, + "kerning": 3, + "width": 8, + "code": 239 + }, + "\u00f0": { + "index": 208, + "kerning": 2, + "width": 14, + "code": 240 + }, + "\u00f1": { + "index": 209, + "kerning": 2, + "width": 13, + "code": 241 + }, + "\u00f2": { + "index": 210, + "kerning": 2, + "width": 14, + "code": 242 + }, + "\u00f3": { + "index": 211, + "kerning": 2, + "width": 14, + "code": 243 + }, + "\u00f4": { + "index": 212, + "kerning": 2, + "width": 14, + "code": 244 + }, + "\u00f5": { + "index": 213, + "kerning": 2, + "width": 14, + "code": 245 + }, + "\u00f6": { + "index": 214, + "kerning": 2, + "width": 14, + "code": 246 + }, + "\u00f7": { + "index": 215, + "kerning": 2, + "width": 14, + "code": 247 + }, + "\u00f8": { + "index": 216, + "kerning": 2, + "width": 14, + "code": 248 + }, + "\u00f9": { + "index": 217, + "kerning": 2, + "width": 13, + "code": 249 + }, + "\u00fa": { + "index": 218, + "kerning": 2, + "width": 13, + "code": 250 + }, + "\u00fb": { + "index": 219, + "kerning": 2, + "width": 13, + "code": 251 + }, + "\u00fc": { + "index": 220, + "kerning": 2, + "width": 13, + "code": 252 + }, + "\u00fd": { + "index": 221, + "kerning": 2, + "width": 12, + "code": 253 + }, + "\u00fe": { + "index": 222, + "kerning": 2, + "width": 14, + "code": 254 + }, + "\u00ff": { + "index": 223, + "kerning": 2, + "width": 12, + "code": 255 + } +} diff --git a/site/.vuepress/public/img/preview/font-US.png b/site/.vuepress/public/img/preview/font-US.png new file mode 100644 index 0000000000000000000000000000000000000000..3ddab5e8fd9627513221f49eb2469e4cf6acd071 GIT binary patch literal 30945 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

1w>$i2wEZ3?rJNA*t;JUr%~B5v_>bZ zE28Q;DlDxt1ax81zI{yOx*_cNgd#fbI@7iC^AVr^6rbw?*&4~4qP?gY4C;#;m);3P zwad=+^Mg%-&ZdVw`q$VzUFrImD0$@npxS=o4)$}TtiQi`?XiC18(@ds9R~XESn(RO z`i2`rbt>7NH;>jj2BLkiD93YCl))dBx1P`68Yb?L zOJ6<#?yHRT-+3F${_BDe-DkP(XzN97m>7H7O)i4@xby^}DJ9{y9yX#{Q>VkJmW{Fl zA}xhOlgff}vVOy}(DE%*8pASer75`6 zhOR_zbJzF25LIhJ?bQDO?;1TpkLfafAQ=h}9m`LD&^sFY{OezxcozGY0}D63{zM5F T`y-An{#o+Qv>lhYc_;rD=e!YV literal 0 HcmV?d00001 diff --git a/site/de/code-reference/index.md b/site/de/code-reference/index.md index 5bd94ed..1d77685 100644 --- a/site/de/code-reference/index.md +++ b/site/de/code-reference/index.md @@ -5,4 +5,4 @@ editLink: false # Code Referenz - \ No newline at end of file + diff --git a/site/fr/code-reference/index.md b/site/fr/code-reference/index.md index 59b5403..8a1900d 100644 --- a/site/fr/code-reference/index.md +++ b/site/fr/code-reference/index.md @@ -5,4 +5,4 @@ editLink: false # Référence des codes - \ No newline at end of file + diff --git a/site/ja/code-reference/index.md b/site/ja/code-reference/index.md index 812ede9..4e1fd7e 100644 --- a/site/ja/code-reference/index.md +++ b/site/ja/code-reference/index.md @@ -5,4 +5,4 @@ editLink: false # チートコード一覧 - \ No newline at end of file + From 948c8a764dbf8ee43cbfe8b1bf651aab318239c1 Mon Sep 17 00:00:00 2001 From: sup39 Date: Wed, 17 May 2023 22:40:32 +0900 Subject: [PATCH 16/20] Added charset image for NTSC-U in Customized Display --- Codes.xml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Codes.xml b/Codes.xml index 1d633a0..6731787 100644 --- a/Codes.xml +++ b/Codes.xml @@ -2814,12 +2814,16 @@ For float data, you can set the *format* to `.{digit}` to specify how many digits to show. %details[ - %summary[All printable characters (in NTSC-J)] - ![Printable charaters](/img/preview/font-JP.png){style="background:black"} + %summary[All printable characters (NTSC-J)] + ![Printable charaters](/img/preview/font-JP.png){style="background:black;padding:8px"} ] %details[ - %summary[All printable characters (in PAL)] - ![Printable charaters](/img/preview/font-EU.png){style="background:black"} + %summary[All printable characters (NTSC-U)] + ![Printable charaters](/img/preview/font-US.png){style="background:black;padding:8px"} + ] + %details[ + %summary[All printable characters (PAL)] + ![Printable charaters](/img/preview/font-EU.png){style="background:black;padding:8px"} ] #### Preview @@ -2853,6 +2857,10 @@ %summary[表示可能な文字一覧(初期版・後期版)] ![表示可能な文字一覧(初期版・後期版)](/img/preview/font-JP.png){style="background:black;padding:8px"} ] + %details[ + %summary[表示可能な文字一覧(北米版・韓国版)] + ![表示可能な文字一覧(北米版・韓国版)](/img/preview/font-US.png){style="background:black;padding:8px"} + ] %details[ %summary[表示可能な文字一覧(欧州版)] ![表示可能な文字一覧(欧州版)](/img/preview/font-EU.png){style="background:black;padding:8px"} From f2a644916468cf64cb7e7c0378d7896de3c36e1d Mon Sep 17 00:00:00 2001 From: sup39 Date: Wed, 17 May 2023 22:44:51 +0900 Subject: [PATCH 17/20] Changed link of sup39 to Github --- site/.vuepress/components/Generator.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/.vuepress/components/Generator.vue b/site/.vuepress/components/Generator.vue index e3a342d..6dcb85d 100644 --- a/site/.vuepress/components/Generator.vue +++ b/site/.vuepress/components/Generator.vue @@ -88,7 +88,7 @@ >Psychonauter, Noki Doki, - sup39 + sup39 & Milk.

From 55e65f1cd5461244af7f8c49eb1bd1c739776857 Mon Sep 17 00:00:00 2001 From: QbeRoot Date: Sun, 9 Jul 2023 00:47:27 +0200 Subject: [PATCH 18/20] peaceful plaza on Level Select --- Codes.xml | 36 +++++++++++----------- changelog.md | 4 +++ site/.vuepress/public/img/levelselect.png | Bin 41288 -> 82360 bytes site/de/code-reference/index.md | 2 +- site/fr/code-reference/index.md | 2 +- site/ja/code-reference/index.md | 2 +- 6 files changed, 25 insertions(+), 21 deletions(-) diff --git a/Codes.xml b/Codes.xml index f34e355..a16a97e 100644 --- a/Codes.xml +++ b/Codes.xml @@ -1576,8 +1576,8 @@ Sélecteur de niveau レベルセレクト Psychonauter, Dan Salvato, Noki Doki - 1.15 - Jul 5, 2021 + 1.16 + Jul 9, 2023 Allows warping to other levels when starting a file or when exiting a level by holding the combination until the screen turns black. @@ -1694,12 +1694,12 @@ 48000134 2C060002 4082000C 39000105 48000124 2C060006 - 4082000C 39000107 + 4082000C 39000106 48000114 2C060004 - 4082000C 39000108 + 4082000C 39000107 48000104 2C060005 - 4082000C 39000109 - 480000F4 39000102 + 4082000C 39000108 + 480000F4 39000109 480000EC 2C070040 40820010 39001400 39202E00 480000C4 @@ -1822,12 +1822,12 @@ 48000134 2C060002 4082000C 39000105 48000124 2C060006 - 4082000C 39000107 + 4082000C 39000106 48000114 2C060004 - 4082000C 39000108 + 4082000C 39000107 48000104 2C060005 - 4082000C 39000109 - 480000F4 39000102 + 4082000C 39000108 + 480000F4 39000109 480000EC 2C070040 40820010 39001400 39202E00 480000C4 @@ -1950,12 +1950,12 @@ 48000134 2C060002 4082000C 39000105 48000124 2C060006 - 4082000C 39000107 + 4082000C 39000106 48000114 2C060004 - 4082000C 39000108 + 4082000C 39000107 48000104 2C060005 - 4082000C 39000109 - 480000F4 39000102 + 4082000C 39000108 + 480000F4 39000109 480000EC 2C070040 40820010 39001400 39202E00 480000C4 @@ -2078,12 +2078,12 @@ 48000134 2C060002 4082000C 39000105 48000124 2C060006 - 4082000C 39000107 + 4082000C 39000106 48000114 2C060004 - 4082000C 39000108 + 4082000C 39000107 48000104 2C060005 - 4082000C 39000109 - 480000F4 39000102 + 4082000C 39000108 + 480000F4 39000109 480000EC 2C070040 40820010 39001400 39202E00 480000C4 diff --git a/changelog.md b/changelog.md index 95a4cd1..0256c39 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,8 @@ # Changelog +## Jul 9, 2023 +### Updated 'Level Select' +The peaceful plaza (after unlocking Ricco and Gelato) is now available as C↘ + Y, later plazas have their shortcuts moved clockwise, and the post-Corona plaza no longer has a dedicated shortcut. To access it, simply load Corona (X with neutral C stick) or Bowser (C↖ + Y + L) then exit to the plaza. + ## Feb 23, 2023 ### Updated 'Force Plaza Events' Set the correct BH/RH/GB unlock flag diff --git a/site/.vuepress/public/img/levelselect.png b/site/.vuepress/public/img/levelselect.png index 4b4de51ed92e77b6d8d186e90008f3d042ab6d73..bfb464734fb26c757e6a7d2c5536f05a727ca63e 100644 GIT binary patch literal 82360 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 literal 41288 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�ScEKbBg*Q`gSFLX#u3U8*5!eMd# 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 \ No newline at end of file + diff --git a/site/fr/code-reference/index.md b/site/fr/code-reference/index.md index 59b5403..8a1900d 100644 --- a/site/fr/code-reference/index.md +++ b/site/fr/code-reference/index.md @@ -5,4 +5,4 @@ editLink: false # Référence des codes - \ No newline at end of file + diff --git a/site/ja/code-reference/index.md b/site/ja/code-reference/index.md index 812ede9..4e1fd7e 100644 --- a/site/ja/code-reference/index.md +++ b/site/ja/code-reference/index.md @@ -5,4 +5,4 @@ editLink: false # チートコード一覧 - \ No newline at end of file + From 7f5511307a9da5fe7ad4c7952322434e6edfb84a Mon Sep 17 00:00:00 2001 From: sup39 Date: Sat, 15 Jul 2023 12:33:27 +0900 Subject: [PATCH 19/20] Ported 'FastForward', 'InstantRestart', 'SpawnYoshi', 'StageIntroSkip' to all versions --- Codes.xml | 275 ++++++++++++++---- changelog.md | 3 + .../codes/InstantRestart/codegen.js | 59 +--- 3 files changed, 225 insertions(+), 112 deletions(-) diff --git a/Codes.xml b/Codes.xml index a16a97e..63ca78d 100644 --- a/Codes.xml +++ b/Codes.xml @@ -4193,62 +4193,75 @@ 0.2.0 Apr 28, 2022 - When you pressed the buttons configured in [#Button Config](#config) simultaneously, - you can restart the current area without selecting "Exit Area" in pause menu. - Note that the restart function behaves differently than pressing Y or Z with "Level Select". - This code only supports restarting 1 area only. - For example, you can restart outside a secret stage or inside a secret stage individually, - but you can NOT restart a combination of outside+inside a secret stage. + When you pressed the buttons configured in [#Button Config](#config) simultaneously, + you can restart the current area without selecting "Exit Area" in pause menu. + Note that the restart function behaves differently than pressing Y or Z with "Level Select". + This code only supports restarting 1 area only. + For example, you can restart outside a secret stage or inside a secret stage individually, + but you can NOT restart a combination of outside+inside a secret stage. - ::: warning - You can NOT restart after destroying the last platform in Bowser fight at the moment. - ::: + ::: warning + You can NOT restart after destroying the last platform in Bowser fight at the moment. + ::: - [#ボタン設定](#config)で設定したボタンを同時に押すと、ポーズメニューから「コースから出る」を選択せずに所在のエリアをやり直すことができます。ただし、Level SelectのYとZのやり直し機能と異なり、エリアごとのやり直ししかできないので注意してください。例えば、ヒミツ外部のみ、ヒミツ内部のみといった一つのエリアのやり直しはできますが、ヒミツ外部+ヒミツ内部といった組み合わせのやり直しはできません。 + [#ボタン設定](#config)で設定したボタンを同時に押すと、ポーズメニューから「コースから出る」を選択せずに所在のエリアをやり直すことができます。ただし、Level SelectのYとZのやり直し機能と異なり、エリアごとのやり直ししかできないので注意してください。例えば、ヒミツ外部のみ、ヒミツ内部のみといった一つのエリアのやり直しはできますが、ヒミツ外部+ヒミツ内部といった組み合わせのやり直しはできません。 - ::: warning - 現時点ではクッパ戦で最後の足場を破壊するとやり直しできません。 - ::: + ::: warning + 現時点ではクッパ戦で最後の足場を破壊するとやり直しできません。 + ::: - C20EAFA0 0000000A - 3C608040 A0A30D50 - 28050808 40A20038 - 3C60817F 38A00001 - 98A300B3 98A30100 - 3C60803E 84A3600E - 90A30004 38A00040 - 90A30000 3C60800E - 6063B3F8 7C6803A6 - 4E800020 2C000002 - 60000000 00000000 - - - C227768C 0000000A - 3C60803F A0A35428 - 28050808 40A20038 - 3C60817F 38A00001 - 98A300B3 98A30100 - 3C60803E 84A3A8EE - 90A30004 38A00040 - 90A30000 3C608027 - 60637AE4 7C6803A6 - 4E800020 2C000002 - 60000000 00000000 + C20EAFA0 0000000A + 3C608040 A0A30D50 + 28050208 40A20038 + 3C60817F 38A00001 + 98A300B3 98A30100 + 3C60803E 84A3600E + 90A30004 38A00040 + 90A30000 3C60800E + 6063B3F8 7C6803A6 + 4E800020 2C000002 + 60000000 00000000 - C22979E4 0000000A - 3C608040 A0A34454 - 28050808 40A20038 - 3C60817F 38A00001 - 98A300B3 98A30100 - 3C60803F 84A3970E - 90A30004 38A00040 - 90A30000 3C608029 - 60637E3C 7C6803A6 - 4E800020 2C000002 - 60000000 00000000 + C22979E4 0000000A + 3C608040 A0A34454 + 28050208 40A20038 + 3C60817F 38A00001 + 98A300B3 98A30100 + 3C60803F 84A3970E + 90A30004 38A00040 + 90A30000 3C608029 + 60637E3C 7C6803A6 + 4E800020 2C000002 + 60000000 00000000 + + + C228F87C 0000000A + 3C608040 A0A3BBF4 + 28050208 40A20038 + 3C60817F 38A00001 + 98A300B3 98A30100 + 3C60803E 84A310CE + 90A30004 38A00040 + 90A30000 3C608028 + 6063FCD4 7C6803A6 + 4E800020 2C000002 + 60000000 00000000 + + + C227768C 0000000A + 3C60803F A0A35428 + 28050208 40A20038 + 3C60817F 38A00001 + 98A300B3 98A30100 + 3C60803E 84A3A8EE + 90A30004 38A00040 + 90A30000 3C608027 + 60637AE4 7C6803A6 + 4E800020 2C000002 + 60000000 00000000 @@ -4331,22 +4344,77 @@ 70000061 4C423102 60000000 00000000 28400D51 00000024 - 040ECF14 b01a004c - 040ec5d0 70000061 + 040ECF14 B01A004C + 040EC5D0 70000061 + E0000000 00000000 + + + 28404454 00000028 + C2299990 0000000A + 899A0064 2C0C0001 + 40A20040 819A0074 + 818C0094 816C02B8 + 2C0B0003 41A1002C + 41A00018 3D80803F + 818C9734 39600000 + 916C0018 48000014 + 3863000F 907A0054 + 3B800000 48000008 + B01A004C 00000000 + C229904C 00000004 + 807F0074 80630094 + 806302B8 2C830000 + 70000061 4C423102 + 60000000 00000000 + 28404455 00000024 + 04299990 B01A004C + 0429904C 70000061 + E0000000 00000000 + + + 283FBBF4 00000028 + C2291828 0000000A + 899A0064 2C0C0001 + 40A20040 819A0074 + 818C0094 816C08DC + 2C0B0003 41A1002C + 41A00018 3D80803E + 818C10F4 39600000 + 916C0018 48000014 + 3863000F 907A0054 + 3B800000 48000008 + B01A004C 00000000 + C2290EE4 00000004 + 807F0074 80630094 + 806308DC 2C830000 + 70000061 4C423102 + 60000000 00000000 + 283FBBF5 00000024 + 04291828 B01A004C + 04290EE4 70000061 E0000000 00000000 283F5428 00000028 - C2279640 00000005 + C2279640 0000000A 899A0064 2C0C0001 - 4182000C B01A004C - 48000010 3863000F - 907A0054 3B800000 + 40A20040 819A0074 + 818C0094 816C02BC + 2C0B0003 41A1002C + 41A00018 3D80803E + 818CA914 39600000 + 916C0018 48000014 + 3863000F 907A0054 + 3B800000 48000008 + B01A004C 00000000 + C2278CFC 00000004 + 807F0074 80630094 + 806302BC 2C830000 + 70000061 4C423102 60000000 00000000 - 04278D00 60000000 283F5429 00000024 04279640 B01A004C - 04278D00 418204EC + 04278CFC 70000061 E0000000 00000000 @@ -4398,6 +4466,75 @@ 4E800021 A01F00FC 60000000 00000000 + + C228102C 0000000A + 807F03F0 3C808040 + A0844454 54800436 + 2C000800 40820034 + 54840EFD 4182002C + 3C006300 5C0027BE + 980300D0 80030008 + 9003000C 807F03F0 + 3D808028 618C11A8 + 7D8803A6 4E800020 + 60000000 00000000 + C21BC5C4 00000009 + 3C808040 A0844454 + 54800436 2C000800 + 4082002C 54840EFD + 41820024 806D9F28 + 806303F0 93E300F0 + 7FE3FB78 81830000 + 818C0104 7D8803A6 + 4E800021 A01F00FC + 60000000 00000000 + + + C2278DB8 0000000A + 807F03F0 3C808040 + A084BBF4 54800436 + 2C000800 40820034 + 54840EFD 4182002C + 3C006300 5C0027BE + 980300D0 80030008 + 9003000C 807F03F0 + 3D808027 618C8F34 + 7D8803A6 4E800020 + 60000000 00000000 + C21B447C 00000009 + 3C808040 A084BBF4 + 54800436 2C000800 + 4082002C 54840EFD + 41820024 806D9E50 + 806303F0 93E300F0 + 7FE3FB78 81830000 + 818C0104 7D8803A6 + 4E800021 A01F00FC + 60000000 00000000 + + + C2260D7C 0000000A + 807F03F0 3C80803F + A0845428 54800436 + 2C000800 40820034 + 54840EFD 4182002C + 3C006300 5C0027BE + 980300D0 80030008 + 9003000C 807F03F0 + 3D808026 618C0EF8 + 7D8803A6 4E800020 + 60000000 00000000 + C219C34C 00000009 + 3C80803F A0845428 + 54800436 2C000800 + 4082002C 54840EFD + 41820024 806D9DE8 + 806303F0 93E300F0 + 7FE3FB78 81830000 + 818C0104 7D8803A6 + 4E800021 A01F00FC + 60000000 00000000 + misc @@ -4412,7 +4549,7 @@ | Combination | Result | |---------------|------| |B + D-Pad Left | Fast forward 4x | - |B + D-Pad Right| Fast forward 8x (may cause lag) | + |B + D-Pad Right| Fast forward 8x (lag may occur) | ::: warning SGT will be inaccurate with this code. @@ -4424,18 +4561,34 @@ | ボタン | 効果 | |--------------|------| |B + 十字キー左|4倍速| - |B + 十字キー右|8倍速(ラグが発生する可能性がある)| + |B + 十字キー右|8倍速(ラグが発生する可能性があります)| ::: warning このコードを使うとシャインゲットタイマーのタイムがずれます。 ::: - 020ecde2 00000258 + 020ECDE2 00000258 28400D50 00000201 - 020ecde2 00000960 + 020ECDE2 00000960 28400D51 00000202 - 020ecde2 000012C0 + 020ECDE2 000012C0 + E0000000 00000000 + + + 0229985E 00000258 + 28404454 00000201 + 0229985E 00000960 + 28404455 00000202 + 0229985E 000012C0 + E0000000 00000000 + + + 022916F6 00000258 + 283FBBF4 00000201 + 022916F6 00000960 + 283FBBF5 00000202 + 022916F6 000012C0 E0000000 00000000 diff --git a/changelog.md b/changelog.md index 0256c39..7c64a1d 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,7 @@ # Changelog +## Jul 15, 2023 +### Ported 'FastForward', 'InstantRestart', 'SpawnYoshi', 'StageIntroSkip' to all versions + ## Jul 9, 2023 ### Updated 'Level Select' The peaceful plaza (after unlocking Ricco and Gelato) is now available as C↘ + Y, later plazas have their shortcuts moved clockwise, and the post-Corona plaza no longer has a dedicated shortcut. To access it, simply load Corona (X with neutral C stick) or Bowser (C↖ + Y + L) then exit to the plaza. diff --git a/site/.vuepress/components/codes/InstantRestart/codegen.js b/site/.vuepress/components/codes/InstantRestart/codegen.js index 9f6dfc2..ba78cfb 100644 --- a/site/.vuepress/components/codes/InstantRestart/codegen.js +++ b/site/.vuepress/components/codes/InstantRestart/codegen.js @@ -14,56 +14,15 @@ export const buttonValues = { DR: 0x0002, DL: 0x0001, }; - -const baseCodes = { - GMSJ01: (b) => ` -C20EAFA0 0000000A -3C608040 A0A30D50 -2805${b} 40A20038 -3C60817F 38A00001 -98A300B3 98A30100 -3C60803E 84A3600E -90A30004 38A00040 -90A30000 3C60800E -6063B3F8 7C6803A6 -4E800020 2C000002 -60000000 00000000 -`, - GMSJ0A: (b) => ` -C227768C 0000000A -3C60803F A0A35428 -2805${b} 40A20038 -3C60817F 38A00001 -98A300B3 98A30100 -3C60803E 84A3A8EE -90A30004 38A00040 -90A30000 3C608027 -60637AE4 7C6803A6 -4E800020 2C000002 -60000000 00000000 -`, - GMSE01: (b) => ` -C22979E4 0000000A -3C608040 A0A34454 -2805${b} 40A20038 -3C60817F 38A00001 -98A300B3 98A30100 -3C60803F 84A3970E -90A30004 38A00040 -90A30000 3C608029 -60637E3C 7C6803A6 -4E800020 2C000002 -60000000 00000000 -`, -}; const zCodes = { - GMSJ01: '040eb024 60000000', - GMSJ0A: '04277710 60000000', - GMSE01: '04297A68 60000000', + GMSJ01: '040EB02460000000', + GMSE01: '04297A6860000000', + GMSP01: '0428F90060000000', + GMSJ0A: '0427771060000000', }; export const defaultConfig = { - button: buttonValues.Y | buttonValues.DU, + button: buttonValues.B | buttonValues.DU, }; export function getConfig() { return { @@ -71,13 +30,11 @@ export function getConfig() { ...(parseJSON(localStorage.getItem(lskey)) ?? {}), }; } -export default function codegen(version) { +export default function codegen(version, src) { const { button } = getConfig(); - const g = baseCodes[version]; - if (g == null) return ''; - let code = g(button.toString(16).padStart(4, '0')); + let code = src.slice(0, 36) + button.toString(16).padStart(4, '0') + src.slice(40); if (button & buttonValues.Z) { code += zCodes[version]; } - return code.replace(/\s/g, ''); + return code; } From c030def3f5c9780560a8dcb23ff3a0b1a55ab300 Mon Sep 17 00:00:00 2001 From: sup39 Date: Sat, 15 Jul 2023 13:47:17 +0900 Subject: [PATCH 20/20] Fixed the bug regarding the settings of background color in 'Controller Input Display' --- changelog.md | 1 + site/.vuepress/components/codes/controller/codegen.js | 2 +- site/.vuepress/components/codes/controller/config.vue | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/changelog.md b/changelog.md index a62320f..7a0af5b 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,6 @@ # Changelog ## Jul 15, 2023 +### Fixed the bug that background color cannot be changed in 'Controller Input Display' ### Ported 'FastForward', 'InstantRestart', 'SpawnYoshi', 'StageIntroSkip' to all versions ## Jul 9, 2023 diff --git a/site/.vuepress/components/codes/controller/codegen.js b/site/.vuepress/components/codes/controller/codegen.js index e0c1166..068e7ce 100644 --- a/site/.vuepress/components/codes/controller/codegen.js +++ b/site/.vuepress/components/codes/controller/codegen.js @@ -64,7 +64,7 @@ export default function codegen(version, baseCode) { // mtx.y int2hex(y - 16, 2), // .conf.bg.color - int2hex((bgRGB << 24) | bgA, 4), + int2hex((bgRGB << 8) | bgA, 4), // .conf.trigger.fill int2hex(cTF, 4), // .conf.trigger.stroke diff --git a/site/.vuepress/components/codes/controller/config.vue b/site/.vuepress/components/codes/controller/config.vue index f2f6aaa..80e1679 100644 --- a/site/.vuepress/components/codes/controller/config.vue +++ b/site/.vuepress/components/codes/controller/config.vue @@ -25,7 +25,7 @@