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="ja-JP">QFタイマー</title>
<author>Noki Doki, sup39(サポミク)</author>
<version>1.2</version>
<date>Oct 16, 2022</date>
<version>1.3</version>
<date>Dec 16, 2022</date>
<dependencies version="GMSJ01">drawText</dependencies>
<dependencies version="GMSE01">drawText</dependencies>
<dependencies version="GMSP01">drawText</dependencies>
<dependencies version="GMSJ0A">drawText</dependencies>
<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
(similar to the x-cam timer of SM64).
@ -1251,46 +1253,45 @@
:::
</description>
<source version="GMSJ01">
C20ECE44 0000000B
C20ECE44 00000006
981A0260 3CE0817F
880700B3 2C000000
38800000 908700BC
41820010 B08700B2
38000000 900700BC
41820010 B00700B2
3800FFFC 900700B4
60E30110 60E50094
80CD97F8 80C60048
60E700A4 39000002
39200000 3D808001
618C9904 7D8803A6
4E800021 00000000
C2206738 0000001B
3C60817F 888300B2
810300B4 2C040000
40A20030 808300BC
2C040000 40A20010
810D97E8 8108005C
48000010 3884FFFF
908300BC 810300B8
800300B4 7D080214
3CE0000A 60E7F9B0
7C074000 40A00010
7CE83B78 98E300B2
90E300B4 1D0803E9
38000078 7D080396
60000000 00000000
C2206738 0000001F
3C60817F 6064011C
38630094 3D808020
398C1EA8 7D8803A6
4E800021 3C60817F
888300B2 810300B4
2C040000 40A20030
808300BC 2C040000
40A20010 810D97E8
8108005C 48000010
3884FFFF 908300BC
810300B8 800300B4
7D080214 3CE0000A
60E7F9B0 7C074000
40A00010 7CE83B78
98E300B2 90E300B4
1D0803E9 38000078
7D080396 9421FFF0
380003E8 7CE80396
7C0701D6 7D004050
3800003C 7CC70396
7C0601D6 7CE03850
38A300A4 3880000F
80630210 4CC63182
3D808008 618C40C4
7D8803A6 4E800021
3C60817F 60630110
38800000 38A00000
38C10E90 38E00081
3D808001 618C8E64
7D8803A6 4E800021
881F0046 00000000
91010008 3800003C
7D270396 7C0901D6
7D403850 80E30118
390300A4 80C30114
3D80817F 80A30110
618C0238 808300A0
7D8803A6 80630094
4E800021 38210010
38610E90 3D808003
398C5228 7D8803A6
4E800021 881F0046
60000000 00000000
C20EFA30 00000005
3CA0817F A00500B2
2C000000 40820014
@ -1327,64 +1328,47 @@
5400003A 900500B8
3800FFFF 900500BC
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 version="GMSE01">
C22998C0 0000000B
C22998C0 00000006
981A0260 3CE0817F
880700B3 2C000000
38800000 908700BC
41820010 B08700B2
38000000 900700BC
41820010 B00700B2
3800FFFC 900700B4
60E30110 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
60000000 00000000
C2143F18 0000001F
3C60817F 6064011C
38630094 3D808014
398C0390 7D8803A6
4E800021 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 9421FFF0
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
91010008 3800003C
7D270396 7C0901D6
7D403850 80E30118
390300A4 80C30114
3D80817F 80A30110
618C0238 808300A0
7D8803A6 80630094
4E800021 38210010
38610BD0 3D80802F
398CB6BC 7D8803A6
4E800021 881F0046
60000000 00000000
C229C520 00000005
3CA0817F A00500B2
2C000000 40820014
@ -1421,64 +1405,47 @@
5400003A 900500B8
3800FFFF 900500BC
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 version="GMSP01">
C2291758 0000000B
C2291758 00000006
981A0260 3CE0817F
880700B3 2C000000
38800000 908700BC
41820010 B08700B2
38000000 900700BC
41820010 B00700B2
3800FFFC 900700B4
60E30110 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
60000000 00000000
C2138B54 0000001F
3C60817F 6064011C
38630094 3D808013
398C4F0C 7D8803A6
4E800021 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 9421FFF0
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
91010008 3800003C
7D270396 7C0901D6
7D403850 80E30118
390300A4 80C30114
3D80817F 80A30110
618C0238 808300A0
7D8803A6 80630094
4E800021 38210010
38610BE4 3D80802E
398C3864 7D8803A6
4E800021 881F0046
60000000 00000000
C22943FC 00000005
3CA0817F A00500B2
2C000000 40820014
@ -1515,64 +1482,47 @@
5400003A 900500B8
3800FFFF 900500BC
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 version="GMSJ0A">
C2279570 0000000B
C2279570 00000006
981A0260 3CE0817F
880700B3 2C000000
38800000 908700BC
41820010 B08700B2
38000000 900700BC
41820010 B00700B2
3800FFFC 900700B4
60E30110 60E50094
80CD9E88 80C60048
60E700A4 39000002
39200000 3D80802B
618C0058 7D8803A6
4E800021 00000000
C21252A4 0000001B
3C60817F 888300B2
810300B4 2C040000
40A20030 808300BC
2C040000 40A20010
810D9E78 8108005C
48000010 3884FFFF
908300BC 810300B8
800300B4 7D080214
3CE0000A 60E7F9B0
7C074000 40A00010
7CE83B78 98E300B2
90E300B4 1D0803E9
38000078 7D080396
60000000 00000000
C21252A4 0000001F
3C60817F 6064011C
38630094 3D808012
398C1660 7D8803A6
4E800021 3C60817F
888300B2 810300B4
2C040000 40A20030
808300BC 2C040000
40A20010 810D9E78
8108005C 48000010
3884FFFF 908300BC
810300B8 800300B4
7D080214 3CE0000A
60E7F9B0 7C074000
40A00010 7CE83B78
98E300B2 90E300B4
1D0803E9 38000078
7D080396 9421FFF0
380003E8 7CE80396
7C0701D6 7D004050
3800003C 7CC70396
7C0601D6 7CE03850
38A300A4 3880000F
80630210 4CC63182
3D808031 618C90A4
7D8803A6 4E800021
3C60817F 60630110
38800000 38A00000
38C10BEC 38E00081
3D80802A 618CF5B8
7D8803A6 4E800021
881F0046 00000000
91010008 3800003C
7D270396 7C0901D6
7D403850 80E30118
390300A4 80C30114
3D80817F 80A30110
618C0238 808300A0
7D8803A6 80630094
4E800021 38210010
38610BEC 3D80802D
398CAECC 7D8803A6
4E800021 881F0046
60000000 00000000
C227C214 00000005
3CA0817F A00500B2
2C000000 40820014
@ -1609,22 +1559,6 @@
5400003A 900500B8
3800FFFF 900500BC
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>
</code>
<code>

View file

@ -1,4 +1,10 @@
# 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
Added `CAngle` for 'Customized Display' to show camera angle

View file

@ -66,12 +66,12 @@ export default {
for (const code of c) {
const codegen = codegens[code.id];
if (codegen) {
code.source = codegen(this.versionIdentifier);
code.source = codegen(this.versionIdentifier, code.source);
}
}
// 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);
switch (this.format) {
case 'gct':
@ -94,9 +94,12 @@ export default {
}
},
alertDolphinCodeSize(size) {
if (size > 3272) { // 0x3000-0x2338
if (size > 3272) {
// 0x3000-0x2338
// 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) {

View file

@ -4,90 +4,12 @@ export const r13off = -0x6048;
* @type {{[key: string]: {addr: number, orig: number}}}
*/
export const freezeCodeInfo = {
yellowCoin: { addr: 0x801becb4, orig: 0x8805000e },
redCoin: { addr: 0x801be474, orig: 0x38a00000 },
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 },
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 },
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}}}
*/
export const freezeCodeInfo = {
yellowCoin: { addr: 0x801b6b6c, orig: 0x8805000e },
redCoin: { addr: 0x801b632c, orig: 0x38a00000 },
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
****/
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 { freezeCodeInfo, baseCode, r13off } = codes[version] ?? {};
if (baseCode == null) return '';
const { freezeCodeInfo, r13off } = codes[version] ?? {};
let code = baseCode;
const { freezeDuration: frame } = config;
@ -163,29 +167,27 @@ export default function codegen(version) {
code += [...code04, ...code07].map(inst2gecko).join('');
}
// ui (GMSJ01/GMSJ0A only)
if (['GMSJ01', 'GMSJ0A'].includes(version)) {
/* bounds */
const { x, y, fontSize, width } = config;
const scale = fontSize / 20;
code += '077F0094 0000001D';
code += [
x, // x1
y - fontSize - 2, // y1
x + width * scale, // x2
y, // y2
]
.map(inst2gecko)
.join('');
code += '25753a253032752e2530337500000000'; // fmt
/* fontSize, fgColor, bgColor */
code += '077F0110 00000010';
const bgColor = (config.bgRGB & 0xffffff) * 256 + (config.bgA & 0xff);
const fgColor = (config.fgRGB & 0xffffff) * 256 + (config.fgA & 0xff);
const fgColor2 =
((config.fgRGB2 ?? config.fgRGB) & 0xffffff) * 256 + ((config.fgA2 ?? config.fgA) & 0xff);
code += [fontSize, fgColor, fgColor2, bgColor].map(inst2gecko).join('');
}
// ui
/* bounds */
const { x, y, fontSize, width } = config;
const scale = fontSize / 20;
code += '077F0094 0000001D';
code += [
x, // x1
y - fontSize - 2, // y1
x + width * scale, // x2
y, // y2
]
.map(inst2gecko)
.join('');
code += '25753a253032752e2530337500000000'; // fmt
/* fontSize, fgColor, bgColor */
code += '077F0110 00000010';
const bgColor = (config.bgRGB & 0xffffff) * 256 + (config.bgA & 0xff);
const fgColor = (config.fgRGB & 0xffffff) * 256 + (config.fgA & 0xff);
const fgColor2 =
((config.fgRGB2 ?? config.fgRGB) & 0xffffff) * 256 + ((config.fgA2 ?? config.fgA) & 0xff);
code += [fontSize, fgColor, fgColor2, bgColor].map(inst2gecko).join('');
return code.replace(/\s/g, '');
}

View file

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

View file

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