danoniplus 33.0.0 → 33.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/js/danoni_main.js +175 -42
- package/js/lib/danoni_constants.js +14 -4
- package/package.json +1 -1
- package/skin/skin_css.zip +0 -0
package/js/danoni_main.js
CHANGED
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Source by tickle
|
|
6
6
|
* Created : 2018/10/08
|
|
7
|
-
* Revised : 2023/
|
|
7
|
+
* Revised : 2023/08/03
|
|
8
8
|
*
|
|
9
9
|
* https://github.com/cwtickle/danoniplus
|
|
10
10
|
*/
|
|
11
|
-
const g_version = `Ver 33.
|
|
12
|
-
const g_revisedDate = `2023/
|
|
11
|
+
const g_version = `Ver 33.1.0`;
|
|
12
|
+
const g_revisedDate = `2023/08/03`;
|
|
13
13
|
|
|
14
14
|
// カスタム用バージョン (danoni_custom.js 等で指定可)
|
|
15
15
|
let g_localVersion = ``;
|
|
@@ -50,6 +50,8 @@ const g_rootPath = current().match(/(^.*\/)/)[0];
|
|
|
50
50
|
const g_workPath = new URL(location.href).href.match(/(^.*\/)/)[0];
|
|
51
51
|
const g_remoteFlg = g_rootPath.match(`^https://cwtickle.github.io/danoniplus/`) !== null;
|
|
52
52
|
const g_randTime = Date.now();
|
|
53
|
+
const g_isFile = location.href.match(/^file/);
|
|
54
|
+
const g_isLocal = location.href.match(/^file/) || location.href.indexOf(`localhost`) !== -1;
|
|
53
55
|
|
|
54
56
|
window.onload = async () => {
|
|
55
57
|
g_loadObj.main = true;
|
|
@@ -726,7 +728,7 @@ const loadScript2 = (_url, _requiredFlg = true, _charset = `UTF-8`) => {
|
|
|
726
728
|
* デフォルトは danoni_skin_default.css を読み込む
|
|
727
729
|
* @param {url} _href
|
|
728
730
|
*/
|
|
729
|
-
const importCssFile2 = _href => {
|
|
731
|
+
const importCssFile2 = (_href, { crossOrigin = `anonymous` } = {}) => {
|
|
730
732
|
const baseUrl = _href.split(`?`)[0];
|
|
731
733
|
g_loadObj[baseUrl] = false;
|
|
732
734
|
|
|
@@ -734,6 +736,9 @@ const importCssFile2 = _href => {
|
|
|
734
736
|
const link = document.createElement(`link`);
|
|
735
737
|
link.rel = `stylesheet`;
|
|
736
738
|
link.href = _href;
|
|
739
|
+
if (!g_isFile) {
|
|
740
|
+
link.crossOrigin = crossOrigin;
|
|
741
|
+
}
|
|
737
742
|
link.onload = _ => {
|
|
738
743
|
g_loadObj[baseUrl] = true;
|
|
739
744
|
resolve(link);
|
|
@@ -1485,22 +1490,26 @@ const getCssCustomProperties = _ => {
|
|
|
1485
1490
|
}
|
|
1486
1491
|
}
|
|
1487
1492
|
} catch (error) {
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1493
|
+
|
|
1494
|
+
try {
|
|
1495
|
+
// FirefoxではcomputedStyleMapが使えないため、
|
|
1496
|
+
// CSSの全スタイルシート定義から :root がセレクタのルールを抽出し、カスタムプロパティを抽出
|
|
1497
|
+
const sheets = document.styleSheets;
|
|
1498
|
+
Array.from(sheets).filter(sheet => !g_isFile && sheet.href !== null &&
|
|
1499
|
+
sheet.href.includes(`danoni_skin_`) && sheet.cssRules).forEach(sheet => {
|
|
1500
|
+
for (const rule of sheet.cssRules) {
|
|
1501
|
+
if (rule.selectorText === ':root') {
|
|
1502
|
+
for (let i = 0; i < rule.style.length; i++) {
|
|
1503
|
+
const propertyName = rule.style.item(i);
|
|
1504
|
+
if (/^--/.test(propertyName)) {
|
|
1505
|
+
g_cssBkProperties[propertyName] = rule.style.getPropertyValue(propertyName);
|
|
1506
|
+
}
|
|
1499
1507
|
}
|
|
1500
1508
|
}
|
|
1501
1509
|
}
|
|
1502
|
-
}
|
|
1503
|
-
|
|
1510
|
+
});
|
|
1511
|
+
} catch (error) {
|
|
1512
|
+
// 上記でもNGの場合は何もしない
|
|
1504
1513
|
}
|
|
1505
1514
|
}
|
|
1506
1515
|
}
|
|
@@ -10603,12 +10612,14 @@ const resultInit = _ => {
|
|
|
10603
10612
|
const withOptions = (_flg, _defaultSet, _displayText = _flg) =>
|
|
10604
10613
|
(_flg !== _defaultSet ? getStgDetailName(_displayText) : ``);
|
|
10605
10614
|
|
|
10606
|
-
|
|
10615
|
+
const difDatas = [
|
|
10607
10616
|
`${getKeyName(g_headerObj.keyLabels[g_stateObj.scoreId])}${transKeyData} ${getStgDetailName('key')} / ${g_headerObj.difLabels[g_stateObj.scoreId]}`,
|
|
10608
10617
|
`${withOptions(g_autoPlaysBase.includes(g_stateObj.autoPlay), true, `-${getStgDetailName(g_stateObj.autoPlay)}${getStgDetailName('less')}`)}`,
|
|
10609
10618
|
`${withOptions(g_headerObj.makerView, false, `(${g_headerObj.creatorNames[g_stateObj.scoreId]})`)}`,
|
|
10610
10619
|
`${withOptions(g_stateObj.shuffle, C_FLG_OFF, `[${getStgDetailName(g_stateObj.shuffle)}]`)}`
|
|
10611
|
-
]
|
|
10620
|
+
];
|
|
10621
|
+
let difData = difDatas.filter(value => value !== ``).join(` `);
|
|
10622
|
+
const difDataForImage = difDatas.filter((value, j) => value !== `` && j !== 2).join(` `);
|
|
10612
10623
|
|
|
10613
10624
|
let playStyleData = [
|
|
10614
10625
|
`${g_stateObj.speed}${g_lblNameObj.multi}`,
|
|
@@ -10661,16 +10672,16 @@ const resultInit = _ => {
|
|
|
10661
10672
|
|
|
10662
10673
|
// キャラクタ、スコア描画のID共通部、色CSS名、スコア変数名
|
|
10663
10674
|
const jdgScoreObj = {
|
|
10664
|
-
ii: { pos: 0, id: `Ii`, color: `ii`, label: g_lblNameObj.j_ii, },
|
|
10665
|
-
shakin: { pos: 1, id: `Shakin`, color: `shakin`, label: g_lblNameObj.j_shakin, },
|
|
10666
|
-
matari: { pos: 2, id: `Matari`, color: `matari`, label: g_lblNameObj.j_matari, },
|
|
10667
|
-
shobon: { pos: 3, id: `Shobon`, color: `shobon`, label: g_lblNameObj.j_shobon, },
|
|
10668
|
-
uwan: { pos: 4, id: `Uwan`, color: `uwan`, label: g_lblNameObj.j_uwan, },
|
|
10669
|
-
kita: { pos: 5, id: `Kita`, color: `kita`, label: g_lblNameObj.j_kita, },
|
|
10670
|
-
iknai: { pos: 6, id: `Iknai`, color: `iknai`, label: g_lblNameObj.j_iknai, },
|
|
10671
|
-
maxCombo: { pos: 7, id: `MCombo`, color: `combo`, label: g_lblNameObj.j_maxCombo, },
|
|
10672
|
-
fmaxCombo: { pos: 8, id: `FCombo`, color: `combo`, label: g_lblNameObj.j_fmaxCombo, },
|
|
10673
|
-
score: { pos: 10, id: `Score`, color: `score`, label: g_lblNameObj.j_score, },
|
|
10675
|
+
ii: { pos: 0, id: `Ii`, color: `ii`, label: g_lblNameObj.j_ii, dfColor: `#66ffff`, },
|
|
10676
|
+
shakin: { pos: 1, id: `Shakin`, color: `shakin`, label: g_lblNameObj.j_shakin, dfColor: `#99ff99`, },
|
|
10677
|
+
matari: { pos: 2, id: `Matari`, color: `matari`, label: g_lblNameObj.j_matari, dfColor: `#ff9966`, },
|
|
10678
|
+
shobon: { pos: 3, id: `Shobon`, color: `shobon`, label: g_lblNameObj.j_shobon, dfColor: `#ccccff`, },
|
|
10679
|
+
uwan: { pos: 4, id: `Uwan`, color: `uwan`, label: g_lblNameObj.j_uwan, dfColor: `#ff9999`, },
|
|
10680
|
+
kita: { pos: 5, id: `Kita`, color: `kita`, label: g_lblNameObj.j_kita, dfColor: `#ffff99`, },
|
|
10681
|
+
iknai: { pos: 6, id: `Iknai`, color: `iknai`, label: g_lblNameObj.j_iknai, dfColor: `#99ff66`, },
|
|
10682
|
+
maxCombo: { pos: 7, id: `MCombo`, color: `combo`, label: g_lblNameObj.j_maxCombo, dfColor: `#ffffff`, },
|
|
10683
|
+
fmaxCombo: { pos: 8, id: `FCombo`, color: `combo`, label: g_lblNameObj.j_fmaxCombo, dfColor: `#ffffff`, },
|
|
10684
|
+
score: { pos: 10, id: `Score`, color: `score`, label: g_lblNameObj.j_score, dfColor: `#ffffff`, },
|
|
10674
10685
|
};
|
|
10675
10686
|
|
|
10676
10687
|
// キャラクタ、スコア描画
|
|
@@ -10823,6 +10834,7 @@ const resultInit = _ => {
|
|
|
10823
10834
|
}
|
|
10824
10835
|
const twiturl = new URL(g_localStorageUrl);
|
|
10825
10836
|
twiturl.searchParams.append(`scoreId`, g_stateObj.scoreId);
|
|
10837
|
+
const baseTwitUrl = g_isLocal ? `` : `${twiturl.toString()}`.replace(/[\t\n]/g, ``);
|
|
10826
10838
|
|
|
10827
10839
|
const tweetExcessive = (g_stateObj.excessive === C_FLG_ON) ? `(+${g_resultObj.excessive})` : ``;
|
|
10828
10840
|
|
|
@@ -10844,7 +10856,7 @@ const resultInit = _ => {
|
|
|
10844
10856
|
[`[arrowJdg]`, `${g_resultObj.ii}-${g_resultObj.shakin}-${g_resultObj.matari}-${g_resultObj.shobon}-${g_resultObj.uwan}${tweetExcessive}`],
|
|
10845
10857
|
[`[frzJdg]`, tweetFrzJdg],
|
|
10846
10858
|
[`[maxCombo]`, tweetMaxCombo],
|
|
10847
|
-
[`[url]`,
|
|
10859
|
+
[`[url]`, baseTwitUrl]
|
|
10848
10860
|
]);
|
|
10849
10861
|
if (g_presetObj.resultVals !== undefined) {
|
|
10850
10862
|
Object.keys(g_presetObj.resultVals).forEach(key =>
|
|
@@ -10852,6 +10864,111 @@ const resultInit = _ => {
|
|
|
10852
10864
|
}
|
|
10853
10865
|
const resultText = `${unEscapeHtml(tweetResultTmp)}`;
|
|
10854
10866
|
const tweetResult = `https://twitter.com/intent/tweet?text=${encodeURIComponent(resultText)}`;
|
|
10867
|
+
const currentDateTime = new Date().toLocaleString();
|
|
10868
|
+
|
|
10869
|
+
/**
|
|
10870
|
+
* リザルト画像をCanvasで作成しクリップボードへコピー
|
|
10871
|
+
* @param {string} _msg
|
|
10872
|
+
*/
|
|
10873
|
+
const copyResultImageData = _msg => {
|
|
10874
|
+
const tmpDiv = createEmptySprite(divRoot, `tmpDiv`, { x: 0, y: 0, w: g_sWidth, h: g_sHeight });
|
|
10875
|
+
tmpDiv.style.background = `#000000cc`;
|
|
10876
|
+
const canvas = document.createElement(`canvas`);
|
|
10877
|
+
const artistName = g_headerObj.artistNames[g_headerObj.musicNos[g_stateObj.scoreId]] || g_headerObj.artistName;
|
|
10878
|
+
|
|
10879
|
+
canvas.id = `resultImage`;
|
|
10880
|
+
canvas.width = 400;
|
|
10881
|
+
canvas.height = 410;
|
|
10882
|
+
canvas.style.left = `${(g_sWidth - canvas.width) / 2}px`;
|
|
10883
|
+
canvas.style.top = `20px`;
|
|
10884
|
+
canvas.style.position = `absolute`;
|
|
10885
|
+
|
|
10886
|
+
const context = canvas.getContext(`2d`);
|
|
10887
|
+
const drawText = (_text, { x = 30, dy = 0, hy, siz = 15, color = `#cccccc`, align = C_ALIGN_LEFT, font } = {}) => {
|
|
10888
|
+
context.font = `${siz}px ${getBasicFont(font)}`;
|
|
10889
|
+
context.fillStyle = color;
|
|
10890
|
+
context.textAlign = align;
|
|
10891
|
+
context.fillText(_text, x, 35 + hy * 18 + dy);
|
|
10892
|
+
};
|
|
10893
|
+
const grd = context.createLinearGradient(0, 0, 0, canvas.height);
|
|
10894
|
+
grd.addColorStop(0, `#000000`);
|
|
10895
|
+
grd.addColorStop(1, `#222222`);
|
|
10896
|
+
context.fillStyle = grd;
|
|
10897
|
+
context.fillRect(0, 0, g_sWidth, g_sHeight);
|
|
10898
|
+
|
|
10899
|
+
drawText(`R`, { dy: -5, hy: 0, siz: 40, color: `#9999ff` });
|
|
10900
|
+
drawText(`ESULT`, { x: 57, dy: -5, hy: 0, siz: 25 });
|
|
10901
|
+
drawText(`${g_lblNameObj.dancing}${g_lblNameObj.star}${g_lblNameObj.onigiri}`,
|
|
10902
|
+
{ x: 280, dy: -15, hy: 0, siz: 20, color: `#999999`, align: C_ALIGN_CENTER });
|
|
10903
|
+
drawText(mTitleForView[0], { hy: 1 });
|
|
10904
|
+
drawText(mTitleForView[1], { hy: 2 });
|
|
10905
|
+
drawText(`📝 ${g_headerObj.tuning} / 🎵 ${artistName}`, { hy: mTitleForView[1] !== `` ? 3 : 2, siz: 12 });
|
|
10906
|
+
drawText(difDataForImage, { hy: 4 });
|
|
10907
|
+
drawText(playStyleData, { hy: 5 });
|
|
10908
|
+
|
|
10909
|
+
Object.keys(jdgScoreObj).forEach(score => {
|
|
10910
|
+
drawText(g_lblNameObj[`j_${score}`], { hy: 7 + jdgScoreObj[score].pos, color: jdgScoreObj[score].dfColor });
|
|
10911
|
+
drawText(g_resultObj[score], { x: 200, hy: 7 + jdgScoreObj[score].pos, align: C_ALIGN_RIGHT });
|
|
10912
|
+
});
|
|
10913
|
+
|
|
10914
|
+
if (highscoreCondition) {
|
|
10915
|
+
drawText(`(${highscoreDfObj.score >= 0 ? '+' : '-'} ${Math.abs(highscoreDfObj.score)})`,
|
|
10916
|
+
{ x: 206, hy: 18, color: highscoreDfObj.score > 0 ? `#ffff99` : `#cccccc`, align: C_ALIGN_RIGHT });
|
|
10917
|
+
}
|
|
10918
|
+
|
|
10919
|
+
if (g_stateObj.autoAll === C_FLG_OFF) {
|
|
10920
|
+
drawText(g_lblNameObj.j_fast, { x: 240, hy: 7, color: `#ff9966` });
|
|
10921
|
+
drawText(g_resultObj.fast, { x: 360, hy: 7, align: C_ALIGN_RIGHT });
|
|
10922
|
+
drawText(g_lblNameObj.j_slow, { x: 240, hy: 8, color: `#ccccff` });
|
|
10923
|
+
drawText(g_resultObj.slow, { x: 360, hy: 8, align: C_ALIGN_RIGHT });
|
|
10924
|
+
if (estimatedAdj !== ``) {
|
|
10925
|
+
drawText(g_lblNameObj.j_adj, { x: 240, hy: 9, color: `#99ff99` });
|
|
10926
|
+
drawText(getDiffFrame(estimatedAdj), { x: 360, hy: 9, align: C_ALIGN_RIGHT });
|
|
10927
|
+
}
|
|
10928
|
+
if (g_stateObj.excessive === C_FLG_ON) {
|
|
10929
|
+
drawText(g_lblNameObj.j_excessive, { x: 240, hy: 10, color: `#ffff99` });
|
|
10930
|
+
drawText(g_resultObj.excessive, { x: 360, hy: 10, align: C_ALIGN_RIGHT });
|
|
10931
|
+
}
|
|
10932
|
+
}
|
|
10933
|
+
drawText(rankMark, { x: 240, hy: 18, siz: 50, color: rankColor, font: `"Bookman Old Style"` });
|
|
10934
|
+
drawText(baseTwitUrl, { hy: 19, siz: 8 });
|
|
10935
|
+
drawText(currentDateTime, { hy: 20 });
|
|
10936
|
+
|
|
10937
|
+
tmpDiv.appendChild(canvas);
|
|
10938
|
+
|
|
10939
|
+
try {
|
|
10940
|
+
if (ClipboardItem === undefined) {
|
|
10941
|
+
throw new Error(`error`);
|
|
10942
|
+
}
|
|
10943
|
+
// Canvas の内容を PNG 画像として取得
|
|
10944
|
+
canvas.toBlob(async blob => {
|
|
10945
|
+
await navigator.clipboard.write([
|
|
10946
|
+
new ClipboardItem({
|
|
10947
|
+
'image/png': blob
|
|
10948
|
+
})
|
|
10949
|
+
]);
|
|
10950
|
+
});
|
|
10951
|
+
tmpDiv.removeChild(canvas);
|
|
10952
|
+
divRoot.removeChild(tmpDiv);
|
|
10953
|
+
makeInfoWindow(_msg, `leftToRightFade`);
|
|
10954
|
+
|
|
10955
|
+
} catch (err) {
|
|
10956
|
+
// 画像をクリップボードへコピーできないときは代替で画像保存可能な画面を表示
|
|
10957
|
+
if (document.getElementById(`tmpClose`) === null) {
|
|
10958
|
+
divRoot.oncontextmenu = _ => true;
|
|
10959
|
+
makeLinkButton(tmpDiv, `Tmp`);
|
|
10960
|
+
tmpDiv.appendChild(createCss2Button(`tmpClose`, g_lblNameObj.b_close, _ => true,
|
|
10961
|
+
Object.assign(g_lblPosObj.btnRsCopyClose, {
|
|
10962
|
+
resetFunc: _ => {
|
|
10963
|
+
tmpDiv.removeChild(canvas);
|
|
10964
|
+
divRoot.removeChild(tmpDiv);
|
|
10965
|
+
divRoot.oncontextmenu = _ => false;
|
|
10966
|
+
},
|
|
10967
|
+
}), g_cssObj.button_Back));
|
|
10968
|
+
tmpDiv.appendChild(createDescDiv(`resultImageDesc`, g_lblNameObj.resultImageDesc));
|
|
10969
|
+
}
|
|
10970
|
+
}
|
|
10971
|
+
};
|
|
10855
10972
|
|
|
10856
10973
|
/** 音源、ループ処理の停止 */
|
|
10857
10974
|
const resetCommonBtn = (_id, _name, _posObj, _func, _cssClass) =>
|
|
@@ -10863,6 +10980,25 @@ const resultInit = _ => {
|
|
|
10863
10980
|
clearTimeout(g_timeoutEvtResultId);
|
|
10864
10981
|
}, Object.assign(_posObj, { resetFunc: _func }), _cssClass);
|
|
10865
10982
|
|
|
10983
|
+
/**
|
|
10984
|
+
* 外部リンクボタンを作成
|
|
10985
|
+
* @param {object} _div
|
|
10986
|
+
* @param {string} _param
|
|
10987
|
+
*/
|
|
10988
|
+
const makeLinkButton = (_div = divRoot, _param = ``) => {
|
|
10989
|
+
multiAppend(_div,
|
|
10990
|
+
// リザルトデータをTwitterへ転送
|
|
10991
|
+
createCss2Button(`btnTweet${_param}`, g_lblNameObj.b_tweet, _ => true, Object.assign(g_lblPosObj.btnRsTweet, {
|
|
10992
|
+
resetFunc: _ => openLink(tweetResult),
|
|
10993
|
+
}), g_cssObj.button_Tweet),
|
|
10994
|
+
|
|
10995
|
+
// Gitterへのリンク
|
|
10996
|
+
createCss2Button(`btnGitter${_param}`, g_lblNameObj.b_gitter, _ => true, Object.assign(g_lblPosObj.btnRsGitter, {
|
|
10997
|
+
resetFunc: _ => openLink(`https://app.gitter.im/#/room/#danonicw_freeboard:gitter.im`),
|
|
10998
|
+
}), g_cssObj.button_Default),
|
|
10999
|
+
);
|
|
11000
|
+
}
|
|
11001
|
+
|
|
10866
11002
|
// ボタン描画
|
|
10867
11003
|
multiAppend(divRoot,
|
|
10868
11004
|
|
|
@@ -10872,19 +11008,16 @@ const resultInit = _ => {
|
|
|
10872
11008
|
// リザルトデータをクリップボードへコピー
|
|
10873
11009
|
createCss2Button(`btnCopy`, g_lblNameObj.b_copy, _ => copyTextToClipboard(resultText, g_msgInfoObj.I_0001),
|
|
10874
11010
|
g_lblPosObj.btnRsCopy, g_cssObj.button_Setting),
|
|
10875
|
-
|
|
10876
|
-
|
|
10877
|
-
|
|
10878
|
-
resetFunc: _ => openLink(tweetResult),
|
|
10879
|
-
}), g_cssObj.button_Tweet),
|
|
10880
|
-
|
|
10881
|
-
// Gitterへのリンク
|
|
10882
|
-
createCss2Button(`btnGitter`, g_lblNameObj.b_gitter, _ => true, Object.assign(g_lblPosObj.btnRsGitter, {
|
|
10883
|
-
resetFunc: _ => openLink(`https://app.gitter.im/#/room/#danonicw_freeboard:gitter.im`),
|
|
10884
|
-
}), g_cssObj.button_Default),
|
|
10885
|
-
|
|
11011
|
+
);
|
|
11012
|
+
makeLinkButton();
|
|
11013
|
+
multiAppend(divRoot,
|
|
10886
11014
|
// リトライ
|
|
10887
11015
|
resetCommonBtn(`btnRetry`, g_lblNameObj.b_retry, g_lblPosObj.btnRsRetry, loadMusic, g_cssObj.button_Reset),
|
|
11016
|
+
|
|
11017
|
+
createCss2Button(`btnCopyImage`, `📷`, _ => true,
|
|
11018
|
+
Object.assign(g_lblPosObj.btnRsCopyImage, {
|
|
11019
|
+
resetFunc: _ => copyResultImageData(g_msgInfoObj.I_0001),
|
|
11020
|
+
}), g_cssObj.button_Default_NoColor),
|
|
10888
11021
|
);
|
|
10889
11022
|
|
|
10890
11023
|
// マスクスプライトを作成
|
|
@@ -10940,7 +11073,7 @@ const resultInit = _ => {
|
|
|
10940
11073
|
flowResultTimeline();
|
|
10941
11074
|
|
|
10942
11075
|
// キー操作イベント(デフォルト)
|
|
10943
|
-
setShortcutEvent(g_currentPage);
|
|
11076
|
+
setShortcutEvent(g_currentPage, _ => true, { dfEvtFlg: true });
|
|
10944
11077
|
document.oncontextmenu = _ => true;
|
|
10945
11078
|
|
|
10946
11079
|
g_skinJsObj.result.forEach(func => func());
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Source by tickle
|
|
7
7
|
* Created : 2019/11/19
|
|
8
|
-
* Revised : 2023/
|
|
8
|
+
* Revised : 2023/08/03 (v33.1.0)
|
|
9
9
|
*
|
|
10
10
|
* https://github.com/cwtickle/danoniplus
|
|
11
11
|
*/
|
|
@@ -153,9 +153,6 @@ const g_userAgent = window.navigator.userAgent.toLowerCase(); // msie, edge, chr
|
|
|
153
153
|
const g_isIos = listMatching(g_userAgent, [`iphone`, `ipad`, `ipod`]);
|
|
154
154
|
const g_isMac = listMatching(g_userAgent, [`iphone`, `ipad`, `ipod`, `mac os`]);
|
|
155
155
|
|
|
156
|
-
const g_isFile = location.href.match(/^file/);
|
|
157
|
-
const g_isLocal = location.href.match(/^file/) || location.href.indexOf(`localhost`) !== -1;
|
|
158
|
-
|
|
159
156
|
// 変数型
|
|
160
157
|
const C_TYP_BOOLEAN = `boolean`;
|
|
161
158
|
const C_TYP_NUMBER = `number`;
|
|
@@ -431,6 +428,15 @@ const updateWindowSiz = _ => {
|
|
|
431
428
|
btnRsRetry: {
|
|
432
429
|
x: g_sWidth / 4 * 3, w: g_sWidth / 4, h: g_limitObj.btnHeight * 5 / 4, animationName: `smallToNormalY`,
|
|
433
430
|
},
|
|
431
|
+
btnRsCopyImage: {
|
|
432
|
+
x: g_sWidth - 40, y: 0, w: 40, h: 40, siz: 30,
|
|
433
|
+
},
|
|
434
|
+
btnRsCopyClose: {
|
|
435
|
+
x: g_sWidth - 80, y: 0, w: 80, h: 40, siz: 20,
|
|
436
|
+
},
|
|
437
|
+
resultImageDesc: {
|
|
438
|
+
x: 0, y: g_sHeight - 30, w: g_sWidth, h: 20, siz: g_limitObj.mainSiz,
|
|
439
|
+
},
|
|
434
440
|
});
|
|
435
441
|
};
|
|
436
442
|
|
|
@@ -1522,6 +1528,7 @@ const g_shortcutObj = {
|
|
|
1522
1528
|
KeyC: { id: `btnCopy`, reset: true },
|
|
1523
1529
|
KeyT: { id: `btnTweet`, reset: true },
|
|
1524
1530
|
KeyG: { id: `btnGitter`, reset: true },
|
|
1531
|
+
KeyP: { id: `btnCopyImage` },
|
|
1525
1532
|
Backspace: { id: `btnRetry` },
|
|
1526
1533
|
},
|
|
1527
1534
|
};
|
|
@@ -2642,6 +2649,7 @@ const g_lblNameObj = {
|
|
|
2642
2649
|
b_tweet: `Tweet`,
|
|
2643
2650
|
b_gitter: `Gitter`,
|
|
2644
2651
|
b_retry: `Retry`,
|
|
2652
|
+
b_close: `Close`,
|
|
2645
2653
|
|
|
2646
2654
|
Difficulty: `Difficulty`,
|
|
2647
2655
|
Speed: `Speed`,
|
|
@@ -2822,6 +2830,7 @@ const g_lang_lblNameObj = {
|
|
|
2822
2830
|
kcShortcutDesc: `プレイ中ショートカット:「{0}」タイトルバック / 「{1}」リトライ`,
|
|
2823
2831
|
transKeyDesc: `別キーモードではキーコンフィグ、ColorType等は保存されません`,
|
|
2824
2832
|
sdShortcutDesc: `Hid+/Sud+時ショートカット:「pageUp」カバーを上へ / 「pageDown」下へ`,
|
|
2833
|
+
resultImageDesc: `画像を右クリックしてコピーできます`,
|
|
2825
2834
|
|
|
2826
2835
|
s_level: `Level`,
|
|
2827
2836
|
s_douji: `同時補正`,
|
|
@@ -2855,6 +2864,7 @@ const g_lang_lblNameObj = {
|
|
|
2855
2864
|
kcShortcutDesc: `Shortcut during play: "{0}" Return to title / "{1}" Retry the game`,
|
|
2856
2865
|
transKeyDesc: `Key config, Color type, etc. are not saved in another key mode`,
|
|
2857
2866
|
sdShortcutDesc: `When "Hidden+" or "Sudden+" select, "pageUp" cover up / "pageDown" cover down`,
|
|
2867
|
+
resultImageDesc: `You can copy the image by right-clicking on it.`,
|
|
2858
2868
|
|
|
2859
2869
|
s_level: `Level`,
|
|
2860
2870
|
s_douji: `Chords`,
|
package/package.json
CHANGED
package/skin/skin_css.zip
DELETED
|
Binary file
|