This commit is contained in:
QbeRoot 2022-12-17 00:54:58 +01:00
parent 375ba5eb73
commit 313ee79416
10 changed files with 261 additions and 598 deletions

348
Codes.xml
View file

@ -1237,12 +1237,14 @@
<title lang="en-US">Quarterframe Timer (Experimental)</title> <title lang="en-US">Quarterframe Timer (Experimental)</title>
<title lang="ja-JP">QFタイマー</title> <title lang="ja-JP">QFタイマー</title>
<author>Noki Doki, sup39(サポミク)</author> <author>Noki Doki, sup39(サポミク)</author>
<version>1.2</version> <version>1.3</version>
<date>Oct 16, 2022</date> <date>Dec 16, 2022</date>
<dependencies version="GMSJ01">drawText</dependencies> <dependencies version="GMSJ01">drawText</dependencies>
<dependencies version="GMSE01">drawText</dependencies>
<dependencies version="GMSP01">drawText</dependencies>
<dependencies version="GMSJ0A">drawText</dependencies> <dependencies version="GMSJ0A">drawText</dependencies>
<description lang="en-US"> <description lang="en-US">
Adds an in-game timer to every level, starting on the last black frame after the 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 loading screen and ending as soon as the 'Shine Get' animation starts
(similar to the x-cam timer of SM64). (similar to the x-cam timer of SM64).
@ -1251,46 +1253,45 @@
::: :::
</description> </description>
<source version="GMSJ01"> <source version="GMSJ01">
C20ECE44 0000000B C20ECE44 00000006
981A0260 3CE0817F 981A0260 3CE0817F
880700B3 2C000000 880700B3 2C000000
38800000 908700BC 38000000 900700BC
41820010 B08700B2 41820010 B00700B2
3800FFFC 900700B4 3800FFFC 900700B4
60E30110 60E50094 60000000 00000000
80CD97F8 80C60048 C2206738 0000001F
60E700A4 39000002 3C60817F 6064011C
39200000 3D808001 38630094 3D808020
618C9904 7D8803A6 398C1EA8 7D8803A6
4E800021 00000000 4E800021 3C60817F
C2206738 0000001B 888300B2 810300B4
3C60817F 888300B2 2C040000 40A20030
810300B4 2C040000 808300BC 2C040000
40A20030 808300BC 40A20010 810D97E8
2C040000 40A20010 8108005C 48000010
810D97E8 8108005C 3884FFFF 908300BC
48000010 3884FFFF 810300B8 800300B4
908300BC 810300B8 7D080214 3CE0000A
800300B4 7D080214 60E7F9B0 7C074000
3CE0000A 60E7F9B0 40A00010 7CE83B78
7C074000 40A00010 98E300B2 90E300B4
7CE83B78 98E300B2 1D0803E9 38000078
90E300B4 1D0803E9 7D080396 9421FFF0
38000078 7D080396
380003E8 7CE80396 380003E8 7CE80396
7C0701D6 7D004050 7C0701D6 7D004050
3800003C 7CC70396 91010008 3800003C
7C0601D6 7CE03850 7D270396 7C0901D6
38A300A4 3880000F 7D403850 80E30118
80630210 4CC63182 390300A4 80C30114
3D808008 618C40C4 3D80817F 80A30110
7D8803A6 4E800021 618C0238 808300A0
3C60817F 60630110 7D8803A6 80630094
38800000 38A00000 4E800021 38210010
38C10E90 38E00081 38610E90 3D808003
3D808001 618C8E64 398C5228 7D8803A6
7D8803A6 4E800021 4E800021 881F0046
881F0046 00000000 60000000 00000000
C20EFA30 00000005 C20EFA30 00000005
3CA0817F A00500B2 3CA0817F A00500B2
2C000000 40820014 2C000000 40820014
@ -1327,64 +1328,47 @@
5400003A 900500B8 5400003A 900500B8
3800FFFF 900500BC 3800FFFF 900500BC
60000000 00000000 60000000 00000000
C2196314 00000004
80AD97E8 8005005C
3CA0817F 900500B8
3800001E 900500BC
38A00000 00000000
C2196128 00000005
7C030378 80A3005C
38A50003 54A0003A
3CA0817F 900500B8
3800001E 900500BC
60000000 00000000
077F0094 0000001D
00000010 000001A0
00000280 000001E0
25753A25 3032752E
25303375 00000000
</source> </source>
<source version="GMSE01"> <source version="GMSE01">
C22998C0 0000000B C22998C0 00000006
981A0260 3CE0817F 981A0260 3CE0817F
880700B3 2C000000 880700B3 2C000000
38800000 908700BC 38000000 900700BC
41820010 B08700B2 41820010 B00700B2
3800FFFC 900700B4 3800FFFC 900700B4
60E30110 60E50094 60000000 00000000
80CD9FC8 80C60048 C2143F18 0000001F
60E700A4 39000002 3C60817F 6064011C
39200000 3D80802D 38630094 3D808014
618C0848 7D8803A6 398C0390 7D8803A6
4E800021 00000000 4E800021 3C60817F
C2143F18 0000001B 888300B2 810300B4
3C60817F 888300B2 2C040000 40A20030
810300B4 2C040000 808300BC 2C040000
40A20030 808300BC 40A20010 810D9FB8
2C040000 40A20010 8108005C 48000010
810D9FB8 8108005C 3884FFFF 908300BC
48000010 3884FFFF 810300B8 800300B4
908300BC 810300B8 7D080214 3CE0000A
800300B4 7D080214 60E7F9B0 7C074000
3CE0000A 60E7F9B0 40A00010 7CE83B78
7C074000 40A00010 98E300B2 90E300B4
7CE83B78 98E300B2 1D0803E9 38000078
90E300B4 1D0803E9 7D080396 9421FFF0
38000078 7D080396
380003E8 7CE80396 380003E8 7CE80396
7C0701D6 7D004050 7C0701D6 7D004050
3800003C 7CC70396 91010008 3800003C
7C0601D6 7CE03850 7D270396 7C0901D6
38A300A4 3880000F 7D403850 80E30118
80630210 4CC63182 390300A4 80C30114
3D808033 618C97A4 3D80817F 80A30110
7D8803A6 4E800021 618C0238 808300A0
3C60817F 60630110 7D8803A6 80630094
38800000 38A00000 4E800021 38210010
38C10BD0 38E00081 38610BD0 3D80802F
3D80802C 618CFDA8 398CB6BC 7D8803A6
7D8803A6 4E800021 4E800021 881F0046
881F0046 00000000 60000000 00000000
C229C520 00000005 C229C520 00000005
3CA0817F A00500B2 3CA0817F A00500B2
2C000000 40820014 2C000000 40820014
@ -1421,64 +1405,47 @@
5400003A 900500B8 5400003A 900500B8
3800FFFF 900500BC 3800FFFF 900500BC
60000000 00000000 60000000 00000000
077F0094 0000001D
00000010 000001A0
00000280 000001E0
25753A25 3032752E
25303375 00000000
C21BE474 00000004
80AD9FB8 8005005C
3CA0817F 900500B8
3800001E 900500BC
38A00000 00000000
C21BE288 00000005
7C030378 80A3005C
38A50003 54A0003A
3CA0817F 900500B8
3800001E 900500BC
60000000 00000000
</source> </source>
<source version="GMSP01"> <source version="GMSP01">
C2291758 0000000B C2291758 00000006
981A0260 3CE0817F 981A0260 3CE0817F
880700B3 2C000000 880700B3 2C000000
38800000 908700BC 38000000 900700BC
41820010 B08700B2 41820010 B00700B2
3800FFFC 900700B4 3800FFFC 900700B4
60E30110 60E50094 60000000 00000000
80CD9EF0 80C60048 C2138B54 0000001F
60E700A4 39000002 3C60817F 6064011C
39200000 3D80802C 38630094 3D808013
618C89F0 7D8803A6 398C4F0C 7D8803A6
4E800021 00000000 4E800021 3C60817F
C2138B54 0000001B 888300B2 810300B4
3C60817F 888300B2 2C040000 40A20030
810300B4 2C040000 808300BC 2C040000
40A20030 808300BC 40A20010 810D9EE0
2C040000 40A20010 8108005C 48000010
810D9EE0 8108005C 3884FFFF 908300BC
48000010 3884FFFF 810300B8 800300B4
908300BC 810300B8 7D080214 3CE0000A
800300B4 7D080214 60E7F9B0 7C074000
3CE0000A 60E7F9B0 40A00010 7CE83B78
7C074000 40A00010 98E300B2 90E300B4
7CE83B78 98E300B2 1D0803E9 38000078
90E300B4 1D0803E9 7D080396 9421FFF0
38000078 7D080396
380003E8 7CE80396 380003E8 7CE80396
7C0701D6 7D004050 7C0701D6 7D004050
3800003C 7CC70396 91010008 3800003C
7C0601D6 7CE03850 7D270396 7C0901D6
38A300A4 3880000F 7D403850 80E30118
80630210 4CC63182 390300A4 80C30114
3D808033 618C1924 3D80817F 80A30110
7D8803A6 4E800021 618C0238 808300A0
3C60817F 60630110 7D8803A6 80630094
38800000 38A00000 4E800021 38210010
38C10BE4 38E00081 38610BE4 3D80802E
3D80802C 618C7F50 398C3864 7D8803A6
7D8803A6 4E800021 4E800021 881F0046
881F0046 00000000 60000000 00000000
C22943FC 00000005 C22943FC 00000005
3CA0817F A00500B2 3CA0817F A00500B2
2C000000 40820014 2C000000 40820014
@ -1515,64 +1482,47 @@
5400003A 900500B8 5400003A 900500B8
3800FFFF 900500BC 3800FFFF 900500BC
60000000 00000000 60000000 00000000
077F0094 0000001D
00000010 000001A0
00000280 000001E0
25753A25 3032752E
25303375 00000000
C21B632C 00000004
80AD9EE0 8005005C
3CA0817F 900500B8
3800001E 900500BC
38A00000 00000000
C21B6140 00000005
7C030378 80A3005C
38A50003 54A0003A
3CA0817F 900500B8
3800001E 900500BC
60000000 00000000
</source> </source>
<source version="GMSJ0A"> <source version="GMSJ0A">
C2279570 0000000B C2279570 00000006
981A0260 3CE0817F 981A0260 3CE0817F
880700B3 2C000000 880700B3 2C000000
38800000 908700BC 38000000 900700BC
41820010 B08700B2 41820010 B00700B2
3800FFFC 900700B4 3800FFFC 900700B4
60E30110 60E50094 60000000 00000000
80CD9E88 80C60048 C21252A4 0000001F
60E700A4 39000002 3C60817F 6064011C
39200000 3D80802B 38630094 3D808012
618C0058 7D8803A6 398C1660 7D8803A6
4E800021 00000000 4E800021 3C60817F
C21252A4 0000001B 888300B2 810300B4
3C60817F 888300B2 2C040000 40A20030
810300B4 2C040000 808300BC 2C040000
40A20030 808300BC 40A20010 810D9E78
2C040000 40A20010 8108005C 48000010
810D9E78 8108005C 3884FFFF 908300BC
48000010 3884FFFF 810300B8 800300B4
908300BC 810300B8 7D080214 3CE0000A
800300B4 7D080214 60E7F9B0 7C074000
3CE0000A 60E7F9B0 40A00010 7CE83B78
7C074000 40A00010 98E300B2 90E300B4
7CE83B78 98E300B2 1D0803E9 38000078
90E300B4 1D0803E9 7D080396 9421FFF0
38000078 7D080396
380003E8 7CE80396 380003E8 7CE80396
7C0701D6 7D004050 7C0701D6 7D004050
3800003C 7CC70396 91010008 3800003C
7C0601D6 7CE03850 7D270396 7C0901D6
38A300A4 3880000F 7D403850 80E30118
80630210 4CC63182 390300A4 80C30114
3D808031 618C90A4 3D80817F 80A30110
7D8803A6 4E800021 618C0238 808300A0
3C60817F 60630110 7D8803A6 80630094
38800000 38A00000 4E800021 38210010
38C10BEC 38E00081 38610BEC 3D80802D
3D80802A 618CF5B8 398CAECC 7D8803A6
7D8803A6 4E800021 4E800021 881F0046
881F0046 00000000 60000000 00000000
C227C214 00000005 C227C214 00000005
3CA0817F A00500B2 3CA0817F A00500B2
2C000000 40820014 2C000000 40820014
@ -1609,22 +1559,6 @@
5400003A 900500B8 5400003A 900500B8
3800FFFF 900500BC 3800FFFF 900500BC
60000000 00000000 60000000 00000000
077F0094 0000001D
00000010 000001A0
00000280 000001E0
25753A25 3032752E
25303375 00000000
C219E1FC 00000004
80AD9E78 8005005C
3CA0817F 900500B8
3800001E 900500BC
38A00000 00000000
C219E010 00000005
7C030378 80A3005C
38A50003 54A0003A
3CA0817F 900500B8
3800001E 900500BC
60000000 00000000
</source> </source>
</code> </code>
<code> <code>

View file

@ -1,4 +1,10 @@
# Changelog # Changelog
## Dec 16, 2022
### Updated 'Quarterframe Timer'
- Gave the timer a 1 frame headstart to make it more accurate to SGT and IL retiming rules
- Ported the customizable visuals and freeze conditions to the US and PAL versions
## Nov 19, 2022 ## Nov 19, 2022
Added `CAngle` for 'Customized Display' to show camera angle Added `CAngle` for 'Customized Display' to show camera angle

View file

@ -66,12 +66,12 @@ export default {
for (const code of c) { for (const code of c) {
const codegen = codegens[code.id]; const codegen = codegens[code.id];
if (codegen) { if (codegen) {
code.source = codegen(this.versionIdentifier); code.source = codegen(this.versionIdentifier, code.source);
} }
} }
// generate file // generate file
const codeSize = c.reduce((a, e) => a+e.source.length, 0)/2 + 16; // 8(00D0)+8(F000) const codeSize = c.reduce((a, e) => a + e.source.length, 0) / 2 + 16; // 8(00D0)+8(F000)
// console.log(codeSize, c); // console.log(codeSize, c);
switch (this.format) { switch (this.format) {
case 'gct': case 'gct':
@ -94,9 +94,12 @@ export default {
} }
}, },
alertDolphinCodeSize(size) { alertDolphinCodeSize(size) {
if (size > 3272) { // 0x3000-0x2338 if (size > 3272) {
// 0x3000-0x2338
// excluding header+footer // excluding header+footer
alert(translate('generatorconfig.alert.dolphin', this.$lang).replaceAll('{size}', size-16)); alert(
translate('generatorconfig.alert.dolphin', this.$lang).replaceAll('{size}', size - 16),
);
} }
}, },
generateGCT(codes, version) { generateGCT(codes, version) {

View file

@ -4,90 +4,12 @@ export const r13off = -0x6048;
* @type {{[key: string]: {addr: number, orig: number}}} * @type {{[key: string]: {addr: number, orig: number}}}
*/ */
export const freezeCodeInfo = { export const freezeCodeInfo = {
yellowCoin: { addr: 0x801becb4, orig: 0x8805000e },
redCoin: { addr: 0x801be474, orig: 0x38a00000 }, redCoin: { addr: 0x801be474, orig: 0x38a00000 },
blueCoin: { addr: 0x801be288, orig: 0x7c030378 }, blueCoin: { addr: 0x801be288, orig: 0x7c030378 },
item: { addr: 0x801bf3b4, orig: 0x8001001c },
talk: { addr: 0x80298128, orig: 0x807f00b0 },
demo: { addr: 0x802981a4, orig: 0x88e7013c },
cleaned: { addr: 0x80215c58, orig: 0x80010044 },
bowser: { addr: 0x801fc0a4, orig: 0x2c1d0003 },
}; };
export const baseCode = `
C22998C0 0000000B
981A0260 3CE0817F
880700B3 2C000000
38000000 900700BC
4182000C B00700B2
900700B4 60E30110
38800000 60E50094
80CD9FC8 80C60048
60E700A4 39000002
39200000 3D80802D
618C0848 7D8803A6
4E800021 00000000
C2143F18 0000001B
3C60817F 888300B2
810300B4 2C040000
40A20030 808300BC
2C040000 40A20010
810D9FB8 8108005C
48000010 3884FFFF
908300BC 810300B8
800300B4 7D080214
3CE0000A 60E7F9B0
7C074000 40A00010
7CE83B78 98E300B2
90E300B4 1D0803E9
38000078 7D080396
380003E8 7CE80396
7C0701D6 7D004050
3800003C 7CC70396
7C0601D6 7CE03850
38A300A4 3880000F
80630210 4CC63182
3D808033 618C97A4
7D8803A6 4E800021
3C60817F 60630110
38800000 38A00000
38C10BD0 38E00081
3D80802C 618CFDA8
7D8803A6 4E800021
881F0046 00000000
C229C520 00000005
3CA0817F A00500B2
2C000000 40820014
800500B4 80C3005C
7C003214 900500B4
7C0802A6 00000000
C229A5AC 00000005
3CA0817F 80C500B4
8003005C 7CC60214
38C60004 54C6003A
90C500B4 38C0FFFF
B0C500B2 00000000
C21FA380 00000005
3D00817F 80C800B4
8003005C 7CC60214
38C60004 54C6003A
90C800B4 38C0FFFF
B0C800B2 00000000
C2164E24 00000002
2C030001 3C60817F
98A300B3 00000000
C229880C 00000002
389C0001 3CA0817F
988500B3 00000000
C22991A8 00000005
3CA0817F 38600001
986500B3 807F005C
38630003 5463003A
906500B8 3860FFFF
906500BC 00000000
C229A36C 00000005
3CA0817F 980500B3
801E005C 30000004
5400003A 900500B8
3800FFFF 900500BC
60000000 00000000
077F0094 0000001D
00000010 000001A0
00000280 000001E0
25753A25 3032752E
25303375 00000000
`;

View file

@ -13,80 +13,3 @@ export const freezeCodeInfo = {
cleaned: { addr: 0x8017a3c0, orig: 0x80010044 }, cleaned: { addr: 0x8017a3c0, orig: 0x80010044 },
bowser: { addr: 0x801d3c78, orig: 0x2c1d0003 }, bowser: { addr: 0x801d3c78, orig: 0x2c1d0003 },
}; };
export const baseCode = `
C20ECE44 00000005
981A0260 3CE0817F
880700B3 2C000000
38000000 900700BC
4182000C B00700B2
900700B4 00000000
C2206738 0000001F
3C60817F 6064011C
38630094 3D808020
398C1EA8 7D8803A6
4E800021 3C60817F
888300B2 810300B4
2C040000 40820030
808300BC 2C040000
40820010 810D97E8
8108005C 48000010
3884FFFF 908300BC
810300B8 800300B4
7D080214 3CE0000A
60E7F9B0 7C074000
40800010 7CE83B78
98E300B2 90E300B4
3C60817F 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 00000000
C20EFA30 00000005
3CA0817F A00500B2
2C000000 40820014
800500B4 80C3005C
7C003214 900500B4
7C0802A6 00000000
C20EDB30 00000005
3CA0817F 80C500B4
8003005C 7CC60214
38C60004 54C6003A
90C500B4 38C0FFFF
B0C500B2 00000000
C21D1F38 00000005
3D00817F 80C800B4
8003005C 7CC60214
38C60004 54C6003A
90C800B4 38C0FFFF
B0C800B2 00000000
C22257CC 00000002
2C030001 3C60817F
98A300B3 00000000
C20EBD78 00000002
389C0001 3CA0817F
988500B3 00000000
C20EC72C 00000005
3CA0817F 38600001
986500B3 807F005C
38630003 5463003A
906500B8 3860FFFF
906500BC 00000000
C20ED8F0 00000005
3CA0817F 980500B3
801E005C 30000004
5400003A 900500B8
3800FFFF 900500BC
60000000 00000000
`;

View file

@ -13,80 +13,3 @@ export const freezeCodeInfo = {
cleaned: { addr: 0x801f5af8, orig: 0x80010044 }, cleaned: { addr: 0x801f5af8, orig: 0x80010044 },
bowser: { addr: 0x801dbe48, orig: 0x2c1d0003 }, bowser: { addr: 0x801dbe48, orig: 0x2c1d0003 },
}; };
export const baseCode = `
C2279570 00000005
981A0260 3CE0817F
880700B3 2C000000
38000000 900700BC
4182000C B00700B2
900700B4 00000000
C21252A4 0000001F
3C60817F 6064011C
38630094 3D808012
398C1660 7D8803A6
4E800021 3C60817F
888300B2 810300B4
2C040000 40820030
808300BC 2C040000
40820010 810D9E78
8108005C 48000010
3884FFFF 908300BC
810300B8 800300B4
7D080214 3CE0000A
60E7F9B0 7C074000
40800010 7CE83B78
98E300B2 90E300B4
3C60817F 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
3D80802D 398CAECC
7D8803A6 4E800021
881F0046 00000000
C227C214 00000005
3CA0817F A00500B2
2C000000 40820014
800500B4 80C3005C
7C003214 900500B4
7C0802A6 00000000
C227A298 00000005
3CA0817F 80C500B4
8003005C 7CC60214
38C60004 54C6003A
90C500B4 38C0FFFF
B0C500B2 00000000
C21DA0FC 00000005
3D00817F 80C800B4
8003005C 7CC60214
38C60004 54C6003A
90C800B4 38C0FFFF
B0C800B2 00000000
C2145EBC 00000002
2C030001 3C60817F
98A300B3 00000000
C22784B4 00000002
389C0001 3CA0817F
988500B3 00000000
C2278E58 00000005
3CA0817F 38600001
986500B3 807F005C
38630003 5463003A
906500B8 3860FFFF
906500BC 00000000
C227A01C 00000005
3CA0817F 980500B3
801E005C 30000004
5400003A 900500B8
3800FFFF 900500BC
60000000 00000000
`;

View file

@ -4,90 +4,12 @@ export const r13off = -0x6120;
* @type {{[key: string]: {addr: number, orig: number}}} * @type {{[key: string]: {addr: number, orig: number}}}
*/ */
export const freezeCodeInfo = { export const freezeCodeInfo = {
yellowCoin: { addr: 0x801b6b6c, orig: 0x8805000e },
redCoin: { addr: 0x801b632c, orig: 0x38a00000 }, redCoin: { addr: 0x801b632c, orig: 0x38a00000 },
blueCoin: { addr: 0x801b6140, orig: 0x7c030378 }, blueCoin: { addr: 0x801b6140, orig: 0x7c030378 },
item: { addr: 0x801b726c, orig: 0x8001001c },
talk: { addr: 0x8028ffc0, orig: 0x807f00b0 },
demo: { addr: 0x8029003c, orig: 0x88e7013c },
cleaned: { addr: 0x8020db3c, orig: 0x80010044 },
bowser: { addr: 0x801f3f88, orig: 0x2c1d0003 },
}; };
export const baseCode = `
C2291758 0000000B
981A0260 3CE0817F
880700B3 2C000000
38000000 900700BC
4182000C B00700B2
900700B4 60E30110
38800000 60E50094
80CD9EF0 80C60048
60E700A4 39000002
39200000 3D80802C
618C89F0 7D8803A6
4E800021 00000000
C2138B54 0000001B
3C60817F 888300B2
810300B4 2C040000
40A20030 808300BC
2C040000 40A20010
810D9EE0 8108005C
48000010 3884FFFF
908300BC 810300B8
800300B4 7D080214
3CE0000A 60E7F9B0
7C074000 40A00010
7CE83B78 98E300B2
90E300B4 1D0803E9
38000078 7D080396
380003E8 7CE80396
7C0701D6 7D004050
3800003C 7CC70396
7C0601D6 7CE03850
38A300A4 3880000F
80630210 4CC63182
3D808033 618C1924
7D8803A6 4E800021
3C60817F 60630110
38800000 38A00000
38C10BE4 38E00081
3D80802C 618C7F50
7D8803A6 4E800021
881F0046 00000000
C22943FC 00000005
3CA0817F A00500B2
2C000000 40820014
800500B4 80C3005C
7C003214 900500B4
7C0802A6 00000000
C2292480 00000005
3CA0817F 80C500B4
8003005C 7CC60214
38C60004 54C6003A
90C500B4 38C0FFFF
B0C500B2 00000000
C21F2258 00000005
3D00817F 80C800B4
8003005C 7CC60214
38C60004 54C6003A
90C800B4 38C0FFFF
B0C800B2 00000000
C2159E9C 00000002
2C030001 3C60817F
98A300B3 00000000
C22906A4 00000002
389C0001 3CA0817F
988500B3 00000000
C2291040 00000005
3CA0817F 38600001
986500B3 807F005C
38630003 5463003A
906500B8 3860FFFF
906500BC 00000000
C2292204 00000005
3CA0817F 980500B3
801E005C 30000004
5400003A 900500B8
3800FFFF 900500BC
60000000 00000000
077F0094 0000001D
00000010 000001A0
00000280 000001E0
25753A25 3032752E
25303375 00000000
`;

View file

@ -67,11 +67,15 @@ export const codes = { GMSJ01, GMSE01, GMSP01, GMSJ0A };
bl 817fxxxx bl 817fxxxx
****/ ****/
const freezeCodeAddr = 0x817f0348; const freezeCodeAddr = 0x817f0348;
/** @param {keyof typeof codes} version */ /**
export default function codegen(version) { * @param {keyof typeof codes} version
* @param {string=} baseCode
*/
export default function codegen(version, baseCode) {
if (!baseCode) return '';
const config = getConfig(); const config = getConfig();
const { freezeCodeInfo, baseCode, r13off } = codes[version] ?? {}; const { freezeCodeInfo, r13off } = codes[version] ?? {};
if (baseCode == null) return '';
let code = baseCode; let code = baseCode;
const { freezeDuration: frame } = config; const { freezeDuration: frame } = config;
@ -163,29 +167,27 @@ export default function codegen(version) {
code += [...code04, ...code07].map(inst2gecko).join(''); code += [...code04, ...code07].map(inst2gecko).join('');
} }
// ui (GMSJ01/GMSJ0A only) // ui
if (['GMSJ01', 'GMSJ0A'].includes(version)) { /* bounds */
/* bounds */ const { x, y, fontSize, width } = config;
const { x, y, fontSize, width } = config; const scale = fontSize / 20;
const scale = fontSize / 20; code += '077F0094 0000001D';
code += '077F0094 0000001D'; code += [
code += [ x, // x1
x, // x1 y - fontSize - 2, // y1
y - fontSize - 2, // y1 x + width * scale, // x2
x + width * scale, // x2 y, // y2
y, // y2 ]
] .map(inst2gecko)
.map(inst2gecko) .join('');
.join(''); code += '25753a253032752e2530337500000000'; // fmt
code += '25753a253032752e2530337500000000'; // fmt /* fontSize, fgColor, bgColor */
/* fontSize, fgColor, bgColor */ code += '077F0110 00000010';
code += '077F0110 00000010'; const bgColor = (config.bgRGB & 0xffffff) * 256 + (config.bgA & 0xff);
const bgColor = (config.bgRGB & 0xffffff) * 256 + (config.bgA & 0xff); const fgColor = (config.fgRGB & 0xffffff) * 256 + (config.fgA & 0xff);
const fgColor = (config.fgRGB & 0xffffff) * 256 + (config.fgA & 0xff); const fgColor2 =
const fgColor2 = ((config.fgRGB2 ?? config.fgRGB) & 0xffffff) * 256 + ((config.fgA2 ?? config.fgA) & 0xff);
((config.fgRGB2 ?? config.fgRGB) & 0xffffff) * 256 + ((config.fgA2 ?? config.fgA) & 0xff); code += [fontSize, fgColor, fgColor2, bgColor].map(inst2gecko).join('');
code += [fontSize, fgColor, fgColor2, bgColor].map(inst2gecko).join('');
}
return code.replace(/\s/g, ''); return code.replace(/\s/g, '');
} }

View file

@ -1,26 +1,32 @@
<template> <template>
<div id="config"> <div id="config">
<section v-if="['GMSJ01', 'GMSJ0A'].includes(version)" class="appearance"> <section class="appearance">
<h3>{{l.h3}}</h3> <h3>{{ l.h3 }}</h3>
<div> <div>
<TextConfig v-model="textConfig" /> <TextConfig v-model="textConfig" />
</div> </div>
<div> <div>
<span>{{l.bgColor}}</span><input type="color" :value="rgbI2S(bgRGB)" @change="bgRGB = rgbS2I($event.target.value)"> <span>{{ l.bgColor }}</span
<span>{{l.alpha}}</span><input type="number" min="0" max="255" v-model.number="bgA"><span>/255={{(bgA/2.55).toFixed(1)}}%</span> ><input type="color" :value="rgbI2S(bgRGB)" @change="bgRGB = rgbS2I($event.target.value)" />
<span>{{ l.alpha }}</span
><input type="number" min="0" max="255" v-model.number="bgA" /><span
>/255={{ (bgA / 2.55).toFixed(1) }}%</span
>
</div> </div>
</section> </section>
<section class="freeze"> <section class="freeze">
<h3>{{l.freeze.h3}}</h3> <h3>{{ l.freeze.h3 }}</h3>
<div> <div>
{{l.freeze.duration}}<input type="number" min="0" max="32767" v-model="freezeDuration"> {{l.freeze.frame}} {{ l.freeze.duration }}<input type="number" min="0" max="32767" v-model="freezeDuration" />
= {{(freezeDuration*1001/30000).toFixed(2)}} {{l.freeze.sec}} {{ l.freeze.frame }} = {{ ((freezeDuration * 1001) / 30000).toFixed(2) }} {{ l.freeze.sec }}
</div> </div>
<table> <table>
<tbody> <tbody>
<tr v-for="key in freezeKeys" :key="key"> <tr v-for="key in freezeKeys" :key="key">
<td>{{l.freeze.rows[key]}}</td> <td>{{ l.freeze.rows[key] }}</td>
<td><input type="checkbox" :checked="freeze[key]" @change="onChangeFreeze($event, key)"></td> <td>
<input type="checkbox" :checked="freeze[key]" @change="onChangeFreeze($event, key)" />
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -29,15 +35,27 @@
</template> </template>
<script> <script>
import {getConfig, lskey, codes} from './codegen.js'; import { getConfig, lskey, codes } from './codegen.js';
import {rgbI2S, rgbS2I, rgbaI2S} from '../utils'; import { rgbI2S, rgbS2I, rgbaI2S } from '../utils';
import labels from './labels.json'; import labels from './labels.json';
import TextConfig from '../TextConfig.vue'; import TextConfig from '../TextConfig.vue';
function updateConfig() { function updateConfig() {
const {x, y, fontSize, width, fgRGB, fgA, fgRGB2, fgA2, bgRGB, bgA, freeze, freezeDuration} = this; const { x, y, fontSize, width, fgRGB, fgA, fgRGB2, fgA2, bgRGB, bgA, freeze, freezeDuration } =
this;
const config = { const config = {
x, y, fontSize, width, fgRGB, fgA, fgRGB2, fgA2, bgRGB, bgA, freeze, freezeDuration x,
y,
fontSize,
width,
fgRGB,
fgA,
fgRGB2,
fgA2,
bgRGB,
bgA,
freeze,
freezeDuration,
}; };
localStorage.setItem(lskey, JSON.stringify(config)); localStorage.setItem(lskey, JSON.stringify(config));
this.$emit('config', config); this.$emit('config', config);
@ -48,7 +66,7 @@ export default {
TextConfig, TextConfig,
}, },
props: { props: {
version: {type: String}, version: { type: String },
}, },
methods: { methods: {
onChangeFreeze($event, key) { onChangeFreeze($event, key) {
@ -70,12 +88,21 @@ export default {
rgbaI2S, rgbaI2S,
}, },
data() { data() {
const {x, y, fontSize, width, fgRGB, fgA, fgRGB2, fgA2, bgRGB, bgA, freeze, freezeDuration} = getConfig(); const { x, y, fontSize, width, fgRGB, fgA, fgRGB2, fgA2, bgRGB, bgA, freeze, freezeDuration } =
getConfig();
return { return {
x, y, fontSize, x,
fgRGB, fgA, fgRGB2, fgA2, y,
width, bgRGB, bgA, fontSize,
freeze, freezeDuration, fgRGB,
fgA,
fgRGB2,
fgA2,
width,
bgRGB,
bgA,
freeze,
freezeDuration,
// const // const
freezeKeys: Object.keys(codes[this.version]?.freezeCodeInfo ?? {}), freezeKeys: Object.keys(codes[this.version]?.freezeCodeInfo ?? {}),
}; };
@ -86,8 +113,8 @@ export default {
}, },
textConfig: { textConfig: {
get() { get() {
const {x, y, fontSize, fgRGB, fgA, fgRGB2, fgA2} = this; const { x, y, fontSize, fgRGB, fgA, fgRGB2, fgA2 } = this;
return {x, y, fontSize, fgRGB, fgA, fgRGB2, fgA2}; return { x, y, fontSize, fgRGB, fgA, fgRGB2, fgA2 };
}, },
set(value) { set(value) {
Object.assign(this, value); Object.assign(this, value);
@ -101,14 +128,15 @@ export default {
bgA: updateConfig, bgA: updateConfig,
freezeDuration: updateConfig, freezeDuration: updateConfig,
}, },
} };
</script> </script>
<style scoped> <style scoped>
input[type=number], td.right { input[type='number'],
td.right {
text-align: right; text-align: right;
} }
input[type="number"] { input[type='number'] {
width: 3em; width: 3em;
margin: 0 2px; margin: 0 2px;
} }
@ -116,11 +144,11 @@ input[type="number"] {
padding: 0 0 4px; padding: 0 0 4px;
} }
input[type=number] { input[type='number'] {
-moz-appearance: textfield; -moz-appearance: textfield;
} }
input[type="number"]::-webkit-inner-spin-button, input[type='number']::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button { input[type='number']::-webkit-outer-spin-button {
-webkit-appearance: none; -webkit-appearance: none;
margin: 0; margin: 0;
} }

View file

@ -34,8 +34,8 @@
"fontSize": "Font size: ", "fontSize": "Font size: ",
"fgColor": "Font color: ", "fgColor": "Font color: ",
"fgColorGrad": "Gradient", "fgColorGrad": "Gradient",
"fgColor1": "Font color(Top): ", "fgColor1": "Font color (top): ",
"fgColor2": "Font color(Bottom): ", "fgColor2": "Font color (bottom): ",
"bgColor": "Background color: ", "bgColor": "Background color: ",
"alpha": "Alpha=", "alpha": "Alpha=",
"preview": "Preview", "preview": "Preview",
@ -43,17 +43,17 @@
"freeze": { "freeze": {
"h3": "Freezing the timer", "h3": "Freezing the timer",
"duration": "Duration: ", "duration": "Duration: ",
"frame": "(frame)", "frame": "(frames)",
"sec": "(sec)", "sec": "(sec)",
"rows": { "rows": {
"yellowCoin": "When collected a yellow coin", "yellowCoin": "When a yellow coin is collected",
"redCoin": "When collected a red coin", "redCoin": "When a red coin is collected",
"blueCoin": "When collected a blue coin", "blueCoin": "When a blue coin is collected",
"item": "When collected an item (e.g. nozzle)", "item": "When an item (e.g. nozzle) is collected",
"talk": "When dialogue started", "talk": "When dialogue starts",
"demo": "When cutscene started", "demo": "When a cutscene starts",
"cleaned": "When NPC is cleaned", "cleaned": "When an NPC is cleaned",
"bowser": "When destroyed platform in Bowser fight" "bowser": "When a platform is destroyed in the Bowser fight"
} }
} }
} }