danoniplus 33.0.0 → 33.1.1

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.
@@ -4,7 +4,7 @@
4
4
  本体cssファイル
5
5
 
6
6
  Created : 2018/10/08
7
- Revised : 2023/07/29 (v33.0.0)
7
+ Revised : 2023/08/04 (v33.1.1)
8
8
 
9
9
  https://github.com/cwtickle/danoniplus
10
10
  ------------------------------------------ */
@@ -569,35 +569,35 @@ input[type="color"] {
569
569
 
570
570
  /* 結果画面:判定名 */
571
571
  .common_ii {
572
- background: var(--common-ii, #66ffff);
572
+ color: var(--common-ii, #66ffff);
573
573
  }
574
574
 
575
575
  .common_shakin {
576
- background: var(--common-shakin, #99ff99);
576
+ color: var(--common-shakin, #99ff99);
577
577
  }
578
578
 
579
579
  .common_matari {
580
- background: var(--common-matari, #ff9966);
580
+ color: var(--common-matari, #ff9966);
581
581
  }
582
582
 
583
583
  .common_shobon {
584
- background: var(--common-shobon, #ccccff);
584
+ color: var(--common-shobon, #ccccff);
585
585
  }
586
586
 
587
587
  .common_uwan {
588
- background: var(--common-uwan, #ff9999);
588
+ color: var(--common-uwan, #ff9999);
589
589
  }
590
590
 
591
591
  .common_kita {
592
- background: var(--common-kita, #ffff99);
592
+ color: var(--common-kita, #ffff99);
593
593
  }
594
594
 
595
595
  .common_iknai {
596
- background: var(--common-iknai, #99ff66);
596
+ color: var(--common-iknai, #99ff66);
597
597
  }
598
598
 
599
599
  .common_combo {
600
- background: var(--common-combo, #ffffff);
600
+ color: var(--common-combo, #ffffff);
601
601
  }
602
602
 
603
603
  .common_score {
@@ -605,27 +605,27 @@ input[type="color"] {
605
605
  }
606
606
 
607
607
  .common_comboJ {
608
- background: var(--common-comboJ, var(--common-kita));
608
+ color: var(--common-comboJ, var(--common-kita));
609
609
  }
610
610
 
611
611
  .common_comboFJ {
612
- background: var(--common-comboFJ, var(--common-ii));
612
+ color: var(--common-comboFJ, var(--common-ii));
613
613
  }
614
614
 
615
615
  .common_diffFast {
616
- background: var(--common-diffFast, var(--common-matari));
616
+ color: var(--common-diffFast, var(--common-matari));
617
617
  }
618
618
 
619
619
  .common_diffSlow {
620
- background: var(--common-diffSlow, var(--common-shobon));
620
+ color: var(--common-diffSlow, var(--common-shobon));
621
621
  }
622
622
 
623
623
  .common_estAdj {
624
- background: var(--common-estAdj, var(--common-shakin));
624
+ color: var(--common-estAdj, var(--common-shakin));
625
625
  }
626
626
 
627
627
  .common_excessive {
628
- background: var(--common-excessive, var(--common-kita));
628
+ color: var(--common-excessive, var(--common-kita));
629
629
  }
630
630
 
631
631
  /* 結果画面:枠 */
@@ -817,20 +817,6 @@ input[type="color"] {
817
817
  .settings_Title2::first-letter,
818
818
  .settings_TitleStar,
819
819
  .settings_Display::first-letter,
820
- .common_ii,
821
- .common_shakin,
822
- .common_matari,
823
- .common_shobon,
824
- .common_uwan,
825
- .common_kita,
826
- .common_iknai,
827
- .common_combo,
828
- .common_comboJ,
829
- .common_comboFJ,
830
- .common_diffFast,
831
- .common_diffSlow,
832
- .common_estAdj,
833
- .common_excessive,
834
820
  .result_AllPerfect,
835
821
  .result_Perfect,
836
822
  .result_FullCombo,
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/07/29
7
+ * Revised : 2023/08/04
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 33.0.0`;
12
- const g_revisedDate = `2023/07/29`;
11
+ const g_version = `Ver 33.1.1`;
12
+ const g_revisedDate = `2023/08/04`;
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
- // FirefoxではcomputedStyleMapが使えないため、
1489
- // CSSの全スタイルシート定義から :root がセレクタのルールを抽出し、カスタムプロパティを抽出
1490
- const sheets = document.styleSheets;
1491
- for (const sheet of sheets) {
1492
- if (!g_isFile && sheet.cssRules) {
1493
- for (const rule of sheet.cssRules) {
1494
- if (rule.selectorText === ':root') {
1495
- for (let i = 0; i < rule.style.length; i++) {
1496
- const propertyName = rule.style.item(i);
1497
- if (/^--/.test(propertyName)) {
1498
- g_cssBkProperties[propertyName] = rule.style.getPropertyValue(propertyName);
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
  }
@@ -7676,7 +7685,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7676
7685
  */
7677
7686
  const makeBackgroundData = (_header, _scoreNo, { resultTypes = [] } = {}) => {
7678
7687
  const dataList = [];
7679
- const calcFrameFunc = resultTypes.length > 0 ? calcFrame : undefined;
7688
+ const calcFrameFunc = resultTypes.length > 0 ? undefined : calcFrame;
7680
7689
  const addDataList = (_type = ``) => dataList.push(...getPriorityList(_header, _type, _scoreNo));
7681
7690
  getPriorityHeader(resultTypes).forEach(val => addDataList(val));
7682
7691
 
@@ -10603,12 +10612,14 @@ const resultInit = _ => {
10603
10612
  const withOptions = (_flg, _defaultSet, _displayText = _flg) =>
10604
10613
  (_flg !== _defaultSet ? getStgDetailName(_displayText) : ``);
10605
10614
 
10606
- let difData = [
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
- ].filter(value => value !== ``).join(` `);
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]`, g_isLocal ? `` : `${twiturl.toString()}`.replace(/[\t\n]/g, ``)]
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
- // リザルトデータをTwitterへ転送
10877
- createCss2Button(`btnTweet`, g_lblNameObj.b_tweet, _ => true, Object.assign(g_lblPosObj.btnRsTweet, {
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/07/29 (v33.0.0)
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "33.0.0",
3
+ "version": "33.1.1",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/skin/skin_css.zip DELETED
Binary file