Created 'Quarterframe Section Timer'
This commit is contained in:
parent
20e3af3816
commit
2f0be0bf68
11 changed files with 306 additions and 17 deletions
152
Codes.xml
152
Codes.xml
|
@ -4221,4 +4221,156 @@
|
||||||
040eb024 60000000
|
040eb024 60000000
|
||||||
</source>
|
</source>
|
||||||
</code>
|
</code>
|
||||||
|
<code>
|
||||||
|
<id>qfst</id>
|
||||||
|
<category>misc</category>
|
||||||
|
<title lang="en-US">Quarterframe Section Timer</title>
|
||||||
|
<title lang="ja-JP">QFセクションタイマー</title>
|
||||||
|
<author>sup39(サポミク)</author>
|
||||||
|
<version>0.1</version>
|
||||||
|
<date>Jan 31, 2023</date>
|
||||||
|
<dependencies>drawText</dependencies>
|
||||||
|
<description lang="en-US">
|
||||||
|
Calculate and display section times whenever Quarterframe Timer freezes.
|
||||||
|
</description>
|
||||||
|
<description lang="ja-JP">
|
||||||
|
QFタイマーが一時停止する度にセクションタイムを計算して表示します。
|
||||||
|
</description>
|
||||||
|
<source version="GMSJ01">
|
||||||
|
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
|
||||||
|
</source>
|
||||||
|
<source version="GMSJ0A">
|
||||||
|
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
|
||||||
|
</source>
|
||||||
|
<source version="GMSP01">
|
||||||
|
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
|
||||||
|
</source>
|
||||||
|
<source version="GMSE01">
|
||||||
|
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
|
||||||
|
</source>
|
||||||
|
</code>
|
||||||
</codes>
|
</codes>
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
## Jan 31, 2023
|
## Jan 31, 2023
|
||||||
|
### Created 'Quarterframe Section Timer'
|
||||||
|
Calculate and display section times whenever Quarterframe Timer freezes
|
||||||
|
|
||||||
### Updated 'Pattern Selector'
|
### Updated 'Pattern Selector'
|
||||||
- Rewrote with C2 + separated config 06
|
- Rewrote with C2 + separated config 06
|
||||||
- Remove label option
|
- Remove label option
|
||||||
|
|
|
@ -38,10 +38,9 @@ export default {
|
||||||
showPreview() {
|
showPreview() {
|
||||||
return [
|
return [
|
||||||
'PatternSelector',
|
'PatternSelector',
|
||||||
'PASDisplay',
|
|
||||||
'SpeedDisplay',
|
|
||||||
'CustomizedDisplay',
|
'CustomizedDisplay',
|
||||||
'qft',
|
'qft',
|
||||||
|
'qfst',
|
||||||
].includes(this.code.id); // TODO
|
].includes(this.code.id); // TODO
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -113,6 +113,7 @@ import { translate } from '../i18n/localeHelper';
|
||||||
|
|
||||||
// Code Configs
|
// Code Configs
|
||||||
import {getConfig as getConfigQFT} from './codes/qft/codegen';
|
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 getConfigCD} from './codes/CustomizedDisplay/codegen';
|
||||||
import {getConfig as getConfigPS} from './codes/PatternSelector/codegen';
|
import {getConfig as getConfigPS} from './codes/PatternSelector/codegen';
|
||||||
|
|
||||||
|
@ -163,6 +164,7 @@ export default {
|
||||||
// update config for preview
|
// update config for preview
|
||||||
this.codeConfigs = {
|
this.codeConfigs = {
|
||||||
qft: getConfigQFT(),
|
qft: getConfigQFT(),
|
||||||
|
qfst: getConfigQFST(),
|
||||||
PatternSelector: getConfigPS(),
|
PatternSelector: getConfigPS(),
|
||||||
CustomizedDisplay: getConfigCD(e),
|
CustomizedDisplay: getConfigCD(e),
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="preview-root">
|
<div class="preview-root">
|
||||||
<div class="preview-ctn">
|
<div class="preview-ctn">
|
||||||
<PreviewString :config="config.qft" :version="_version" />
|
|
||||||
<PreviewString v-for="mdp,i in (config.CustomizedDisplay || [])"
|
<PreviewString v-for="mdp,i in (config.CustomizedDisplay || [])"
|
||||||
:key="'mdp'+i" :config="mdp" :version="_version" />
|
:key="'mdp'+i" :config="mdp" :version="_version" />
|
||||||
<PreviewString :config="config.PatternSelector" :version="_version" />
|
<PreviewString :config="config.PatternSelector" :version="_version" />
|
||||||
|
<PreviewString :config="config.qft" :version="_version" />
|
||||||
|
<PreviewString :config="config.qfst" :version="_version" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
import InstantRestart from './InstantRestart/codegen.js';
|
import InstantRestart from './InstantRestart/codegen.js';
|
||||||
import qft from './qft/codegen.js';
|
import qft from './qft/codegen.js';
|
||||||
|
import qfst from './qfst/codegen.js';
|
||||||
import CustomizedDisplay from './CustomizedDisplay/codegen.js';
|
import CustomizedDisplay from './CustomizedDisplay/codegen.js';
|
||||||
import PatternSelector from './PatternSelector/codegen.js';
|
import PatternSelector from './PatternSelector/codegen.js';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
InstantRestart,
|
InstantRestart,
|
||||||
qft,
|
qft,
|
||||||
|
qfst,
|
||||||
CustomizedDisplay,
|
CustomizedDisplay,
|
||||||
PatternSelector,
|
PatternSelector,
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
{
|
{
|
||||||
"ja-JP": {
|
"ja-JP": {
|
||||||
|
"h3": {
|
||||||
|
"appearance": "見た目"
|
||||||
|
},
|
||||||
"location": "位置:",
|
"location": "位置:",
|
||||||
"fontSize": "文字サイズ:",
|
"fontSize": "文字サイズ:",
|
||||||
"fgColor": "文字色:",
|
"fgColor": "文字色:",
|
||||||
|
@ -15,6 +18,9 @@
|
||||||
"bottom": "下"
|
"bottom": "下"
|
||||||
},
|
},
|
||||||
"en-US": {
|
"en-US": {
|
||||||
|
"h3": {
|
||||||
|
"appearance": "Appearance"
|
||||||
|
},
|
||||||
"location": "Location: ",
|
"location": "Location: ",
|
||||||
"fontSize": "Font size: ",
|
"fontSize": "Font size: ",
|
||||||
"fgColor": "Font color: ",
|
"fgColor": "Font color: ",
|
||||||
|
|
66
site/.vuepress/components/codes/qfst/codegen.js
Normal file
66
site/.vuepress/components/codes/qfst/codegen.js
Normal file
|
@ -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, '');
|
||||||
|
}
|
69
site/.vuepress/components/codes/qfst/config.vue
Normal file
69
site/.vuepress/components/codes/qfst/config.vue
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<section class="appearance">
|
||||||
|
<h3>{{ l('h3.appearance') }}</h3>
|
||||||
|
<TextConfig v-model="textConfig" />
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { defaultConfig, lskey, getConfig, getPreviewText } from './codegen.js';
|
||||||
|
import { makeUpdateConfig, makeGetLabel } from '../utils';
|
||||||
|
import labels from '../labels.json';
|
||||||
|
import TextConfig from '../TextConfig.vue';
|
||||||
|
|
||||||
|
const updateConfig = makeUpdateConfig(lskey, defaultConfig, getPreviewText);
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
TextConfig,
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
version: { type: String },
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
updateConfig,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
const config = getConfig();
|
||||||
|
return {...config};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
l() {
|
||||||
|
return makeGetLabel(labels, this.$lang);
|
||||||
|
},
|
||||||
|
textConfig: {
|
||||||
|
get() {
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
set(value) {
|
||||||
|
Object.assign(this, value);
|
||||||
|
this.updateConfig();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
input[type='number'],
|
||||||
|
td.right {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
input[type='number'] {
|
||||||
|
width: 3em;
|
||||||
|
margin: 0 2px;
|
||||||
|
}
|
||||||
|
.appearance > div {
|
||||||
|
padding: 0 0 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type='number'] {
|
||||||
|
-moz-appearance: textfield;
|
||||||
|
}
|
||||||
|
input[type='number']::-webkit-inner-spin-button,
|
||||||
|
input[type='number']::-webkit-outer-spin-button {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -26,7 +26,7 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { defaultConfig, lskey, getConfig, getPreviewText, codes, statusKeys } from './codegen.js';
|
import { defaultConfig, lskey, getConfig, getPreviewText, codes, statusKeys } from './codegen.js';
|
||||||
import { makeUpdateConfig, rgbI2S, rgbS2I, rgbaI2S } from '../utils';
|
import { makeUpdateConfig } from '../utils';
|
||||||
import labels from './labels.json';
|
import labels from './labels.json';
|
||||||
import TextConfig from '../TextConfig.vue';
|
import TextConfig from '../TextConfig.vue';
|
||||||
|
|
||||||
|
@ -43,19 +43,7 @@ export default {
|
||||||
this.freeze[key] = $event.target.checked;
|
this.freeze[key] = $event.target.checked;
|
||||||
this.updateConfig();
|
this.updateConfig();
|
||||||
},
|
},
|
||||||
toggleGradient($event) {
|
|
||||||
if ($event.target.checked) {
|
|
||||||
this.fgRGB2 = this.fgRGB;
|
|
||||||
this.fgA2 = this.fgA;
|
|
||||||
} else {
|
|
||||||
this.fgRGB2 = null;
|
|
||||||
this.fgA2 = null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
updateConfig,
|
updateConfig,
|
||||||
rgbI2S,
|
|
||||||
rgbS2I,
|
|
||||||
rgbaI2S,
|
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
const config = getConfig();
|
const config = getConfig();
|
||||||
|
@ -83,7 +71,6 @@ export default {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
width: updateConfig,
|
|
||||||
freezeDuration: updateConfig,
|
freezeDuration: updateConfig,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,10 +2,12 @@ import InstantRestart from './InstantRestart/config.vue';
|
||||||
import CustomizedDisplay from './CustomizedDisplay/config.vue';
|
import CustomizedDisplay from './CustomizedDisplay/config.vue';
|
||||||
import PatternSelector from './PatternSelector/config.vue';
|
import PatternSelector from './PatternSelector/config.vue';
|
||||||
import qft from './qft/config.vue';
|
import qft from './qft/config.vue';
|
||||||
|
import qfst from './qfst/config.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
InstantRestart,
|
InstantRestart,
|
||||||
CustomizedDisplay,
|
CustomizedDisplay,
|
||||||
PatternSelector,
|
PatternSelector,
|
||||||
qft,
|
qft,
|
||||||
|
qfst,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue