danoniplus 27.2.0 → 27.4.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 CHANGED
@@ -4,12 +4,12 @@
4
4
  *
5
5
  * Source by tickle
6
6
  * Created : 2018/10/08
7
- * Revised : 2022/03/27
7
+ * Revised : 2022/04/16
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 27.2.0`;
12
- const g_revisedDate = `2022/03/27`;
11
+ const g_version = `Ver 27.4.0`;
12
+ const g_revisedDate = `2022/04/16`;
13
13
  const g_alphaVersion = ``;
14
14
 
15
15
  // カスタム用バージョン (danoni_custom.js 等で指定可)
@@ -41,11 +41,11 @@ let g_localVersion2 = ``;
41
41
  */
42
42
  const current = _ => {
43
43
  if (document.currentScript) {
44
- return document.currentScript.src;
44
+ return encodeURI(document.currentScript.src);
45
45
  }
46
46
  const scripts = document.getElementsByTagName(`script`);
47
47
  const targetScript = scripts[scripts.length - 1];
48
- return targetScript.src;
48
+ return encodeURI(targetScript.src);
49
49
  };
50
50
  const g_rootPath = current().match(/(^.*\/)/)[0];
51
51
  const g_remoteFlg = g_rootPath.match(`^https://cwtickle.github.io/danoniplus/`) !== null;
@@ -885,6 +885,18 @@ const getFontSize = (_str, _maxWidth, _font = getBasicFont(), _maxFontsize = 64,
885
885
  return _minFontsize;
886
886
  };
887
887
 
888
+ /**
889
+ * 補足説明部分のラベル作成
890
+ * @param {string} _id
891
+ * @param {string} _str
892
+ * @param {string} _altId
893
+ * @returns
894
+ */
895
+ const createDescDiv = (_id, _str, _altId = _id) =>
896
+ createDivCss2Label(_id, _str, Object.assign(g_lblPosObj[_altId], {
897
+ siz: getFontSize(_str, g_sWidth, getBasicFont(), C_SIZ_MAIN),
898
+ }));
899
+
888
900
  /*-----------------------------------------------------------*/
889
901
  /* ラベル・ボタン・オブジェクトの作成 */
890
902
  /*-----------------------------------------------------------*/
@@ -898,8 +910,9 @@ const getFontSize = (_str, _maxWidth, _font = getBasicFont(), _maxFontsize = 64,
898
910
  * @param {number} _y
899
911
  * @param {number} _width
900
912
  * @param {number} _height
913
+ * @param {array} _classes
901
914
  */
902
- const createDiv = (_id, _x, _y, _width, _height) => {
915
+ const createDiv = (_id, _x, _y, _width, _height, _classes = []) => {
903
916
  const div = document.createElement(`div`);
904
917
 
905
918
  div.id = _id;
@@ -909,6 +922,7 @@ const createDiv = (_id, _x, _y, _width, _height) => {
909
922
  style.width = `${_width}px`;
910
923
  style.height = `${_height}px`;
911
924
  style.position = `absolute`;
925
+ div.classList.add(..._classes);
912
926
  setUserSelect(style);
913
927
 
914
928
  return div;
@@ -936,8 +950,7 @@ const setUserSelect = (_style, _value = C_DIS_NONE) => {
936
950
  */
937
951
  const createDivCss2Label = (_id, _text, { x = 0, y = 0, w = C_LEN_SETLBL_WIDTH, h = C_LEN_SETLBL_HEIGHT,
938
952
  siz = C_SIZ_SETLBL, align = C_ALIGN_CENTER, ...rest } = {}, ..._classes) => {
939
- const div = createDiv(_id, x, y, w, h);
940
- div.classList.add(g_cssObj.title_base, ..._classes);
953
+ const div = createDiv(_id, x, y, w, h, [g_cssObj.title_base, ..._classes]);
941
954
 
942
955
  const style = div.style;
943
956
  style.fontSize = `${siz}px`;
@@ -967,18 +980,20 @@ const createImg = (_id, _imgPath, _x, _y, _width, _height) => {
967
980
 
968
981
  /**
969
982
  * ColorPickerの作成
970
- * @param {string} _id
971
- * @param {string} _color
983
+ * @param {string} _parentObj
984
+ * @param {string} _id
985
+ * @param {function} _func
972
986
  * @param {object} _obj
973
987
  * @returns
974
988
  */
975
- const createColorPicker = (_parentObj, _id, { x = 0, y = 0 } = {}) => {
989
+ const createColorPicker = (_parentObj, _id, _func, { x = 0, y = 0 } = {}) => {
976
990
  const picker = document.createElement(`input`);
977
991
  picker.setAttribute(`type`, `color`);
978
992
  picker.id = _id;
979
993
  picker.style.left = `${x}px`;
980
994
  picker.style.top = `${y}px`;
981
995
  picker.style.position = `absolute`;
996
+ picker.addEventListener(`change`, _func);
982
997
  _parentObj.appendChild(picker);
983
998
  return picker;
984
999
  };
@@ -992,19 +1007,20 @@ const createColorPicker = (_parentObj, _id, { x = 0, y = 0 } = {}) => {
992
1007
  const createColorObject2 = (_id,
993
1008
  { x = 0, y = 0, w = C_ARW_WIDTH, h = C_ARW_WIDTH, rotate = ``, styleName = ``, ...rest } = {}, ..._classes) => {
994
1009
 
995
- const div = createDiv(_id, x, y, w, h);
996
- div.classList.add(..._classes);
1010
+ const div = createDiv(_id, x, y, w, h, _classes);
997
1011
  const style = div.style;
998
1012
 
999
1013
  // 矢印・オブジェクト判定
1000
1014
  let charaStyle;
1001
1015
  if (isNaN(parseFloat(rotate))) {
1002
- charaStyle = `${rotate}${styleName}`;
1016
+ const objData = rotate.split(`:`);
1017
+ rotate = setVal(objData[1], 0, C_TYP_FLOAT);
1018
+ charaStyle = `${objData[0]}${styleName}`;
1003
1019
  } else {
1004
1020
  charaStyle = `arrow${styleName}`;
1005
- if (g_stateObj.rotateEnabled) {
1006
- style.transform = `rotate(${rotate}deg)`;
1007
- }
1021
+ }
1022
+ if (g_stateObj.rotateEnabled) {
1023
+ style.transform = `rotate(${rotate}deg)`;
1008
1024
  }
1009
1025
 
1010
1026
  style.maskImage = `url("${g_imgObj[charaStyle]}")`;
@@ -1031,8 +1047,7 @@ const createEmptySprite = (_parentObj, _newObjId, { x = 0, y = 0, w = g_sWidth,
1031
1047
  changeStyle(_newObjId, { x, y, w, h, title, ...rest });
1032
1048
  return document.getElementById(_newObjId);
1033
1049
  }
1034
- const div = createDiv(_newObjId, x, y, w, h);
1035
- div.classList.add(..._classes);
1050
+ const div = createDiv(_newObjId, x, y, w, h, _classes);
1036
1051
  div.title = title;
1037
1052
 
1038
1053
  const style = div.style;
@@ -1124,8 +1139,7 @@ const createCss2Button = (_id, _text, _func = _ => true, { x = 0, y = g_sHeight
1124
1139
  siz = C_LBL_BTNSIZE, align = C_ALIGN_CENTER, title = ``, groupName = g_currentPage, initDisabledFlg = true,
1125
1140
  resetFunc = _ => true, cxtFunc = _ => true, ...rest } = {}, ..._classes) => {
1126
1141
 
1127
- const div = createDiv(_id, x, y, w, h);
1128
- div.classList.add(`button_common`, ..._classes);
1142
+ const div = createDiv(_id, x, y, w, h, [`button_common`, ..._classes]);
1129
1143
  div.innerHTML = _text;
1130
1144
  div.title = title;
1131
1145
 
@@ -1866,6 +1880,7 @@ const initialControl = async () => {
1866
1880
  getScoreDetailData(j);
1867
1881
  }
1868
1882
  }
1883
+ g_customJsObj.preTitle.forEach(func => func());
1869
1884
  titleInit();
1870
1885
  };
1871
1886
 
@@ -1959,7 +1974,8 @@ const loadChartFile = async (_scoreId = g_stateObj.scoreId) => {
1959
1974
 
1960
1975
  const dosInput = document.querySelector(`#dos`);
1961
1976
  const divRoot = document.querySelector(`#divRoot`);
1962
- const queryDos = getQueryParamVal(`dos`) !== null ? `dos/${getQueryParamVal('dos')}.txt` : (document.querySelector(`#externalDos`)?.value ?? ``);
1977
+ const queryDos = getQueryParamVal(`dos`) !== null ?
1978
+ `dos/${getQueryParamVal('dos')}.txt` : encodeURI(document.querySelector(`#externalDos`)?.value ?? ``);
1963
1979
 
1964
1980
  if (dosInput === null && queryDos === ``) {
1965
1981
  makeWarningWindow(g_msgInfoObj.E_0023);
@@ -3650,6 +3666,17 @@ const titleInit = _ => {
3650
3666
  let reloadFlg = false;
3651
3667
  const getLinkSiz = _name => getFontSize(_name, g_sWidth / 2 - 20, getBasicFont(), C_LBL_LNKSIZE, 12);
3652
3668
 
3669
+ /**
3670
+ * クレジット用リンク作成
3671
+ * @param {string} _id
3672
+ * @param {string} _text
3673
+ * @param {string} _url
3674
+ * @returns
3675
+ */
3676
+ const createCreditBtn = (_id, _text, _url) =>
3677
+ createCss2Button(_id, _text, _ => true,
3678
+ Object.assign(g_lblPosObj[_id], { siz: getLinkSiz(_text), resetFunc: _ => openLink(_url) }), g_cssObj.button_Default);
3679
+
3653
3680
  // ボタン描画
3654
3681
  multiAppend(divRoot,
3655
3682
 
@@ -3670,63 +3697,49 @@ const titleInit = _ => {
3670
3697
  localStorage.setItem(g_localStorageUrl, JSON.stringify(g_localStorage));
3671
3698
  reloadFlg = true;
3672
3699
  }
3673
- }, {
3674
- x: 0, y: g_sHeight - 20, w: g_sWidth / 4, h: 16, siz: 12, title: g_msgObj.dataReset,
3700
+ }, Object.assign(g_lblPosObj.btnReset, {
3675
3701
  resetFunc: _ => {
3676
3702
  if (reloadFlg) {
3677
3703
  location.reload();
3678
3704
  }
3679
3705
  },
3680
- }, g_cssObj.button_Reset),
3706
+ }), g_cssObj.button_Reset),
3681
3707
 
3682
3708
  // ロケール切替
3683
- createCss2Button(`btnReload`, g_localeObj.val, _ => true, {
3684
- x: 10, y: 10, w: 30, h: 30, siz: 20, title: g_msgObj.reload,
3685
- resetFunc: _ => {
3686
- g_localeObj.num = (++g_localeObj.num) % g_localeObj.list.length;
3687
- g_langStorage.locale = g_localeObj.list[g_localeObj.num];
3688
- localStorage.setItem(`danoni-locale`, JSON.stringify(g_langStorage));
3689
- location.reload();
3690
- },
3691
- }, g_cssObj.button_Start),
3709
+ createCss2Button(`btnReload`, g_localeObj.val, _ => true,
3710
+ Object.assign(g_lblPosObj.btnReload, {
3711
+ resetFunc: _ => {
3712
+ g_localeObj.num = (++g_localeObj.num) % g_localeObj.list.length;
3713
+ g_langStorage.locale = g_localeObj.list[g_localeObj.num];
3714
+ localStorage.setItem(`danoni-locale`, JSON.stringify(g_langStorage));
3715
+ location.reload();
3716
+ },
3717
+ }), g_cssObj.button_Start),
3692
3718
 
3693
3719
  // ヘルプ
3694
- createCss2Button(`btnHelp`, `?`, _ => true, {
3695
- x: 0, y: g_sHeight - 150, w: 40, h: 40, siz: 30, title: g_msgObj.howto,
3696
- resetFunc: _ => openLink(`https://github.com/cwtickle/danoniplus/wiki/AboutGameSystem`),
3697
- }, g_cssObj.button_Setting),
3720
+ createCss2Button(`btnHelp`, `?`, _ => true,
3721
+ Object.assign(g_lblPosObj.btnHelp, {
3722
+ resetFunc: _ => openLink(`https://github.com/cwtickle/danoniplus/wiki/AboutGameSystem`),
3723
+ }), g_cssObj.button_Setting),
3698
3724
 
3699
3725
  // 製作者表示
3700
- createCss2Button(`lnkMaker`, `${g_lblNameObj.maker}: ${g_headerObj.tuningInit}`, _ => true, {
3701
- x: 0, y: g_sHeight - 50, w: g_sWidth / 2, h: C_LNK_HEIGHT,
3702
- siz: getLinkSiz(`${g_lblNameObj.maker}: ${g_headerObj.tuningInit}`), align: C_ALIGN_LEFT,
3703
- title: g_headerObj.creatorUrl,
3704
- resetFunc: _ => openLink(g_headerObj.creatorUrl),
3705
- }, g_cssObj.button_Default),
3726
+ createCreditBtn(`lnkMaker`, `${g_lblNameObj.maker}: ${g_headerObj.tuningInit}`, g_headerObj.creatorUrl),
3706
3727
 
3707
3728
  // アーティスト表示
3708
- createCss2Button(`lnkArtist`, `${g_lblNameObj.artist}: ${g_headerObj.artistName}`, _ => true, {
3709
- x: g_sWidth / 2, y: g_sHeight - 50, w: g_sWidth / 2, h: C_LNK_HEIGHT,
3710
- siz: getLinkSiz(`${g_lblNameObj.artist}: ${g_headerObj.artistName}`), align: C_ALIGN_LEFT,
3711
- title: g_headerObj.artistUrl,
3712
- resetFunc: _ => openLink(g_headerObj.artistUrl),
3713
- }, g_cssObj.button_Default),
3729
+ createCreditBtn(`lnkArtist`, `${g_lblNameObj.artist}: ${g_headerObj.artistName}`, g_headerObj.artistUrl),
3714
3730
 
3715
3731
  // バージョン描画
3716
- createCss2Button(
3717
- `lnkVersion`, versionName, _ => true, {
3718
- x: g_sWidth / 4, y: g_sHeight - 20, w: g_sWidth * 3 / 4 - 20, h: 16,
3719
- siz: getFontSize(versionName, g_sWidth * 3 / 4 - 20, getBasicFont(), 12),
3720
- align: C_ALIGN_RIGHT, title: g_msgObj.github,
3721
- resetFunc: _ => openLink(`https://github.com/cwtickle/danoniplus`),
3722
- }, g_cssObj.button_Tweet),
3732
+ createCss2Button(`lnkVersion`, versionName, _ => true,
3733
+ Object.assign(g_lblPosObj.lnkVersion, {
3734
+ siz: getFontSize(versionName, g_sWidth * 3 / 4 - 20, getBasicFont(), 12),
3735
+ resetFunc: _ => openLink(`https://github.com/cwtickle/danoniplus`),
3736
+ }), g_cssObj.button_Tweet),
3723
3737
 
3724
3738
  // セキュリティリンク
3725
- createCss2Button(`lnkComparison`, `🛡`, _ => true, {
3726
- x: g_sWidth - 20, y: g_sHeight - 20, w: 20, h: 16, siz: 12,
3727
- title: g_msgObj.security,
3728
- resetFunc: _ => openLink(`https://github.com/cwtickle/danoniplus/security/policy`),
3729
- }, g_cssObj.button_Tweet),
3739
+ createCss2Button(`lnkComparison`, `🛡`, _ => true,
3740
+ Object.assign(g_lblPosObj.lnkComparison, {
3741
+ resetFunc: _ => openLink(`https://github.com/cwtickle/danoniplus/security/policy`),
3742
+ }), g_cssObj.button_Tweet),
3730
3743
  );
3731
3744
 
3732
3745
  // コメントエリア作成
@@ -3746,19 +3759,11 @@ const titleInit = _ => {
3746
3759
  }
3747
3760
  } else {
3748
3761
  multiAppend(divRoot,
3749
-
3750
- createDivCss2Label(`lblComment`, convCommentVal, {
3751
- x: 0, y: 70, w: g_sWidth, h: g_sHeight - 180, siz: C_SIZ_DIFSELECTOR, align: C_ALIGN_LEFT,
3752
- overflow: `auto`, background: `#222222`, color: `#cccccc`, display: C_DIS_NONE,
3753
- }),
3754
-
3762
+ createDivCss2Label(`lblComment`, convCommentVal, g_lblPosObj.lblComment),
3755
3763
  createCss2Button(`btnComment`, g_lblNameObj.comment, _ => {
3756
3764
  const lblCommentDef = lblComment.style.display;
3757
3765
  lblComment.style.display = (lblCommentDef === C_DIS_NONE ? C_DIS_INHERIT : C_DIS_NONE);
3758
- }, {
3759
- x: g_sWidth - 160, y: (g_sHeight / 2) + 150, w: 140, h: 50, siz: 20, border: `solid 1px #999999`,
3760
- }, g_cssObj.button_Default),
3761
-
3766
+ }, g_lblPosObj.btnComment, g_cssObj.button_Default),
3762
3767
  );
3763
3768
  setUserSelect(lblComment.style, `text`);
3764
3769
  }
@@ -3896,31 +3901,31 @@ const commonSettingBtn = _labelName => {
3896
3901
  multiAppend(divRoot,
3897
3902
 
3898
3903
  // タイトル画面へ戻る
3899
- createCss2Button(`btnBack`, g_lblNameObj.b_back, _ => true, {
3900
- animationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: _ => titleInit(),
3901
- }, g_cssObj.button_Back),
3904
+ createCss2Button(`btnBack`, g_lblNameObj.b_back, _ => true,
3905
+ Object.assign(g_lblPosObj.btnBack, {
3906
+ animationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: _ => titleInit(),
3907
+ }), g_cssObj.button_Back),
3902
3908
 
3903
3909
  // キーコンフィグ画面へ移動
3904
- createCss2Button(`btnKeyConfig`, g_lblNameObj.b_keyConfig, _ => true, {
3905
- x: g_sWidth / 3,
3906
- animationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: _ => keyConfigInit(`Main`),
3907
- }, g_cssObj.button_Setting),
3910
+ createCss2Button(`btnKeyConfig`, g_lblNameObj.b_keyConfig, _ => true,
3911
+ Object.assign(g_lblPosObj.btnKeyConfig, {
3912
+ animationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: _ => keyConfigInit(`Main`),
3913
+ }), g_cssObj.button_Setting),
3908
3914
 
3909
3915
  // プレイ開始
3910
3916
  makePlayButton(_ => loadMusic()),
3911
3917
 
3912
3918
  // Display設定へ移動
3913
- createCss2Button(`btn${_labelName}`, `>`, _ => true, {
3914
- x: g_sWidth / 2 + 175 - C_LEN_SETMINI_WIDTH / 2, y: 25,
3915
- w: C_LEN_SETMINI_WIDTH, h: 40, title: g_msgObj[`to${_labelName}`],
3916
- resetFunc: _ => g_jumpSettingWindow[g_currentPage](),
3917
- }, g_cssObj.button_Mini),
3919
+ createCss2Button(`btn${_labelName}`, `>`, _ => true,
3920
+ Object.assign(g_lblPosObj.btnSwitchSetting, {
3921
+ title: g_msgObj[`to${_labelName}`], resetFunc: _ => g_jumpSettingWindow[g_currentPage](),
3922
+ }), g_cssObj.button_Mini),
3918
3923
 
3919
3924
  // データセーブフラグの切替
3920
- createCss2Button(`btnSave`, g_lblNameObj.dataSave, evt => switchSave(evt), {
3921
- x: 0, y: 5, w: g_sWidth / 5, h: 16, siz: 12,
3922
- title: g_msgObj.dataSave, borderStyle: `solid`, cxtFunc: evt => switchSave(evt),
3923
- }, g_cssObj.button_Default, (g_stateObj.dataSaveFlg ? g_cssObj.button_ON : g_cssObj.button_OFF)),
3925
+ createCss2Button(`btnSave`, g_lblNameObj.dataSave, evt => switchSave(evt),
3926
+ Object.assign(g_lblPosObj.btnSave, {
3927
+ cxtFunc: evt => switchSave(evt),
3928
+ }), g_cssObj.button_Default, (g_stateObj.dataSaveFlg ? g_cssObj.button_ON : g_cssObj.button_OFF)),
3924
3929
  );
3925
3930
  };
3926
3931
 
@@ -3928,13 +3933,11 @@ const commonSettingBtn = _labelName => {
3928
3933
  * PLAYボタンの作成
3929
3934
  * @param {function} _func
3930
3935
  */
3931
- const makePlayButton = _func => {
3932
- return createCss2Button(`btnPlay`, g_lblNameObj.b_play, _ => true, {
3933
- x: g_sWidth * 2 / 3,
3936
+ const makePlayButton = _func => createCss2Button(`btnPlay`, g_lblNameObj.b_play, _ => true,
3937
+ Object.assign(g_lblPosObj.btnPlay, {
3934
3938
  animationName: (g_initialFlg ? `` : `smallToNormalY`),
3935
3939
  resetFunc: _func,
3936
- }, g_cssObj.button_Next);
3937
- };
3940
+ }), g_cssObj.button_Next);
3938
3941
 
3939
3942
  /**
3940
3943
  * 設定・オプション画面初期化
@@ -4246,13 +4249,12 @@ const createOptionWindow = _sprite => {
4246
4249
  createScoreDetail(`Speed`),
4247
4250
  createScoreDetail(`Density`),
4248
4251
  createScoreDetail(`ToolDif`, false),
4249
- makeSettingLblCssButton(`lnkScoreDetailB`, `- - -`, 0, _ => changeScoreDetail(-1), {
4250
- x: 10, w: 100, visibility: `hidden`,
4251
- }, g_cssObj.button_RevON),
4252
- makeSettingLblCssButton(`lnkScoreDetail`, `${getStgDetailName(g_stateObj.scoreDetail)}`, 0, _ => changeScoreDetail(), {
4253
- x: 10, w: 100, borderStyle: `solid`,
4254
- cxtFunc: _ => changeScoreDetail(-1),
4255
- }, g_cssObj.button_RevON),
4252
+ makeSettingLblCssButton(`lnkScoreDetailB`, `- - -`, 0, _ => changeScoreDetail(-1),
4253
+ g_lblPosObj.lnkScoreDetailB, g_cssObj.button_RevON),
4254
+ makeSettingLblCssButton(`lnkScoreDetail`, `${getStgDetailName(g_stateObj.scoreDetail)}`, 0, _ => changeScoreDetail(),
4255
+ Object.assign(g_lblPosObj.lnkScoreDetail, {
4256
+ cxtFunc: _ => changeScoreDetail(-1),
4257
+ }), g_cssObj.button_RevON),
4256
4258
  );
4257
4259
  viewScText();
4258
4260
  }
@@ -4497,24 +4499,22 @@ const createOptionWindow = _sprite => {
4497
4499
  `${obj.playingTime}\r\n`;
4498
4500
  }
4499
4501
  multiAppend(detailToolDif,
4500
- makeDifInfoLabel(`lblTooldif`, g_lblNameObj.s_level, { y: 5, w: 250, siz: C_SIZ_JDGCNTS }),
4501
- makeDifInfoLabel(`dataTooldif`, ``, { x: 270, y: 3, w: 160, siz: 18 }),
4502
- makeDifInfoLabel(`lblDouji`, g_lblNameObj.s_douji),
4503
- makeDifInfoLabel(`lblTate`, g_lblNameObj.s_tate, { x: 270 }),
4504
- makeDifInfoLabel(`dataDouji`, ``, { x: 200, w: 160 }),
4505
- makeDifInfoLabel(`dataTate`, ``, { x: 345, w: 160 }),
4506
- makeDifInfoLabel(`lblArrowInfo`, g_lblNameObj.s_cnts, { x: 130, y: 45, w: 290, siz: C_SIZ_JDGCNTS }),
4507
- makeDifInfoLabel(`dataArrowInfo`, ``, { x: 270, y: 45, w: 160, siz: C_SIZ_JDGCNTS }),
4508
- makeDifInfoLabel(`lblArrowInfo2`, ``, { x: 130, y: 70, w: 200, h: 90 }),
4509
- makeDifInfoLabel(`dataArrowInfo2`, ``, { x: 140, y: 70, w: 275, h: 150, overflow: `auto` }),
4502
+ makeDifInfoLabel(`lblTooldif`, g_lblNameObj.s_level, g_lblPosObj.lblTooldif),
4503
+ makeDifInfoLabel(`dataTooldif`, ``, g_lblPosObj.dataTooldif),
4504
+ makeDifInfoLabel(`lblDouji`, g_lblNameObj.s_douji, g_lblPosObj.lblDouji),
4505
+ makeDifInfoLabel(`lblTate`, g_lblNameObj.s_tate, g_lblPosObj.lblTate),
4506
+ makeDifInfoLabel(`dataDouji`, ``, g_lblPosObj.dataDouji),
4507
+ makeDifInfoLabel(`dataTate`, ``, g_lblPosObj.dataTate),
4508
+ makeDifInfoLabel(`lblArrowInfo`, g_lblNameObj.s_cnts, g_lblPosObj.lblArrowInfo),
4509
+ makeDifInfoLabel(`dataArrowInfo`, ``, g_lblPosObj.dataArrowInfo),
4510
+ makeDifInfoLabel(`lblArrowInfo2`, ``, g_lblPosObj.lblArrowInfo2),
4511
+ makeDifInfoLabel(`dataArrowInfo2`, ``, g_lblPosObj.dataArrowInfo2),
4510
4512
  makeSettingLblCssButton(`lnkDifInfo`, g_lblNameObj.s_print, 0, _ => {
4511
4513
  copyTextToClipboard(
4512
4514
  `****** ${g_lblNameObj.s_printTitle} [${g_version}] ******\r\n\r\n`
4513
4515
  + `\t${g_lblNameObj.s_printHeader}\r\n\r\n${printData}`, g_msgInfoObj.I_0003
4514
4516
  );
4515
- }, {
4516
- x: 10, y: 30, w: 100, borderStyle: `solid`
4517
- }, g_cssObj.button_RevON),
4517
+ }, g_lblPosObj.lnkDifInfo, g_cssObj.button_RevON),
4518
4518
  );
4519
4519
  createScText(lnkDifInfo, `DifInfo`, { targetLabel: `lnkDifInfo`, x: -10 });
4520
4520
  };
@@ -4564,12 +4564,10 @@ const createOptionWindow = _sprite => {
4564
4564
  ];
4565
4565
 
4566
4566
  spriteList.scroll.appendChild(
4567
- createCss2Button(`btnReverse`, `${g_lblNameObj.Reverse}:${getStgDetailName(g_stateObj.reverse)}`, evt => setReverse(evt.target), {
4568
- x: 160, y: 0,
4569
- w: 90, h: 21, siz: C_SIZ_DIFSELECTOR,
4570
- borderStyle: `solid`,
4571
- cxtFunc: evt => setReverse(evt.target),
4572
- }, g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.reverse}`])
4567
+ createCss2Button(`btnReverse`, `${g_lblNameObj.Reverse}:${getStgDetailName(g_stateObj.reverse)}`, evt => setReverse(evt.target),
4568
+ Object.assign(g_lblPosObj.btnReverse, {
4569
+ cxtFunc: evt => setReverse(evt.target),
4570
+ }), g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.reverse}`])
4573
4571
  );
4574
4572
  spriteList[g_settings.scrolls.length > 1 ? `reverse` : `scroll`].style.display = C_DIS_NONE;
4575
4573
  } else {
@@ -4604,12 +4602,7 @@ const createOptionWindow = _sprite => {
4604
4602
  spriteList.gauge.appendChild(createLblSetting(`Gauge`));
4605
4603
 
4606
4604
  // ゲージ設定詳細 縦位置: ゲージ設定+1
4607
- spriteList.gauge.appendChild(
4608
- createDivCss2Label(`lblGauge2`, ``, {
4609
- x: C_LEN_SETLBL_LEFT - 35, y: C_LEN_SETLBL_HEIGHT,
4610
- w: C_LEN_SETLBL_WIDTH + 60, h: C_LEN_SETLBL_HEIGHT * 2, siz: 11,
4611
- })
4612
- );
4605
+ spriteList.gauge.appendChild(createDivCss2Label(`lblGauge2`, ``, g_lblPosObj.lblGauge2));
4613
4606
 
4614
4607
  /**
4615
4608
  * ゲージ設定メイン
@@ -4795,9 +4788,8 @@ const createOptionWindow = _sprite => {
4795
4788
  // 縦位置: 11 スライダーあり
4796
4789
  spriteList.fadein.appendChild(createLblSetting(`Fadein`));
4797
4790
 
4798
- const lnkFadein = createDivCss2Label(`lnkFadein`, `${g_stateObj.fadein}${g_lblNameObj.percent}`, {
4799
- x: C_LEN_SETLBL_LEFT, y: 0,
4800
- }, g_cssObj.settings_FadeinBar);
4791
+ const lnkFadein = createDivCss2Label(`lnkFadein`, `${g_stateObj.fadein}${g_lblNameObj.percent}`,
4792
+ g_lblPosObj.lnkFadein, g_cssObj.settings_FadeinBar);
4801
4793
  spriteList.fadein.appendChild(lnkFadein);
4802
4794
 
4803
4795
  const setFadein = _sign => {
@@ -4813,9 +4805,8 @@ const createOptionWindow = _sprite => {
4813
4805
  makeMiniCssButton(`lnkFadein`, `L`, 0, _ => setFadein(-1)),
4814
4806
 
4815
4807
  // フェードインのスライダー処理
4816
- createDivCss2Label(`lblFadeinBar`, `<input id="fadeinSlider" type="range" value="${g_stateObj.fadein}" min="0" max="99" step="1">`, {
4817
- x: C_LEN_SETLBL_LEFT, y: 0,
4818
- }),
4808
+ createDivCss2Label(`lblFadeinBar`, `<input id="fadeinSlider" type="range" value="${g_stateObj.fadein}" min="0" max="99" step="1">`,
4809
+ g_lblPosObj.lblFadeinBar),
4819
4810
 
4820
4811
  )
4821
4812
 
@@ -5274,12 +5265,7 @@ const settingsDisplayInit = _ => {
5274
5265
  createSettingsDisplayWindow(divRoot);
5275
5266
 
5276
5267
  // ショートカットキーメッセージ
5277
- divRoot.appendChild(
5278
- createDivCss2Label(`scMsg`, g_lblNameObj.sdShortcutDesc, {
5279
- x: 0, y: g_sHeight - 45, w: g_sWidth, h: 20,
5280
- siz: getFontSize(g_lblNameObj.sdShortcutDesc, g_sWidth, getBasicFont(), C_SIZ_MAIN),
5281
- })
5282
- );
5268
+ divRoot.appendChild(createDescDiv(`scMsg`, g_lblNameObj.sdShortcutDesc));
5283
5269
 
5284
5270
  // ユーザカスタムイベント(初期)
5285
5271
  g_customJsObj.settingsDisplay.forEach(func => func());
@@ -5365,11 +5351,7 @@ const createSettingsDisplayWindow = _sprite => {
5365
5351
  const displaySprite = createEmptySprite(optionsprite, `displaySprite`, g_windowObj.displaySprite);
5366
5352
  const spriteList = setSpriteList(settingList);
5367
5353
 
5368
- _sprite.appendChild(
5369
- createDivCss2Label(`sdDesc`, g_lblNameObj.sdDesc, {
5370
- x: 0, y: 65, w: g_sWidth, h: 20, siz: C_SIZ_MAIN,
5371
- })
5372
- );
5354
+ _sprite.appendChild(createDivCss2Label(`sdDesc`, g_lblNameObj.sdDesc, g_lblPosObj.sdDesc));
5373
5355
  g_displays.forEach((name, j) => makeDisplayButton(name, j % 7, Math.floor(j / 7)));
5374
5356
 
5375
5357
  // ---------------------------------------------------
@@ -5383,16 +5365,13 @@ const createSettingsDisplayWindow = _sprite => {
5383
5365
 
5384
5366
  // Hidden+/Sudden+初期値用スライダー、ロックボタン
5385
5367
  multiAppend(spriteList.appearance,
5386
- createDivCss2Label(`lblAppearancePos`, `${g_hidSudObj.filterPos}${g_lblNameObj.percent}`, {
5387
- x: C_LEN_SETLBL_LEFT, y: 20, siz: 12, align: C_ALIGN_CENTER,
5388
- }),
5389
- createDivCss2Label(`lblAppearanceBar`, `<input id="appearanceSlider" type="range" value="${g_hidSudObj.filterPos}" min="0" max="100" step="1">`, {
5390
- x: C_LEN_SETLBL_LEFT, y: 15,
5391
- }),
5392
- createCss2Button(`lnkLockBtn`, g_lblNameObj.filterLock, evt => setLockView(evt.target), {
5393
- x: C_LEN_SETLBL_LEFT + C_LEN_SETLBL_WIDTH - 40, y: 0, w: 40, h: C_LEN_SETLBL_HEIGHT, siz: 12,
5394
- borderStyle: `solid`, cxtFunc: evt => setLockView(evt.target),
5395
- }, g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.filterLock}`]),
5368
+ createDivCss2Label(`lblAppearancePos`, `${g_hidSudObj.filterPos}${g_lblNameObj.percent}`, g_lblPosObj.lblAppearancePos),
5369
+ createDivCss2Label(`lblAppearanceBar`, `<input id="appearanceSlider" type="range" value="${g_hidSudObj.filterPos}" min="0" max="100" step="1">`,
5370
+ g_lblPosObj.lblAppearanceBar),
5371
+ createCss2Button(`lnkLockBtn`, g_lblNameObj.filterLock, evt => setLockView(evt.target),
5372
+ Object.assign(g_lblPosObj.lnkLockBtn, {
5373
+ cxtFunc: evt => setLockView(evt.target),
5374
+ }), g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.filterLock}`]),
5396
5375
  );
5397
5376
 
5398
5377
  const setLockView = (_btn) => {
@@ -5488,17 +5467,10 @@ const keyConfigInit = (_kcType = g_kcType) => {
5488
5467
  `<div class="settings_Title">${g_lblNameObj.key}</div><div class="settings_Title2">${g_lblNameObj.config}</div>`
5489
5468
  .replace(/[\t\n]/g, ``), 0, 15, g_cssObj.flex_centering),
5490
5469
 
5491
- createDivCss2Label(`kcDesc`, g_lblNameObj.kcDesc.split(`{0}`).join(g_kCd[C_KEY_RETRY])
5492
- .split(`{1}:`).join(g_isMac ? `` : `Delete:`), {
5493
- x: 0, y: 68, w: g_sWidth, h: 20,
5494
- siz: getFontSize(g_lblNameObj.kcDesc, g_sWidth, getBasicFont(), C_SIZ_MAIN),
5495
- }),
5496
-
5497
- createDivCss2Label(`kcShuffleDesc`, g_lblNameObj.kcShuffleDesc, {
5498
- x: 5, y: g_sHeight - 125, w: g_sWidth, h: 20, align: C_ALIGN_LEFT,
5499
- siz: getFontSize(g_lblNameObj.kcShuffleDesc, g_sWidth, getBasicFont(), C_SIZ_MAIN),
5500
- }),
5470
+ createDescDiv(`kcDesc`, g_lblNameObj.kcDesc.split(`{0}`).join(g_kCd[C_KEY_RETRY])
5471
+ .split(`{1}:`).join(g_isMac ? `` : `Delete:`)),
5501
5472
 
5473
+ createDescDiv(`kcShuffleDesc`, g_lblNameObj.kcShuffleDesc),
5502
5474
  );
5503
5475
 
5504
5476
  // キーの一覧を表示
@@ -5789,26 +5761,17 @@ const keyConfigInit = (_kcType = g_kcType) => {
5789
5761
  viewGroup(_type);
5790
5762
  };
5791
5763
 
5792
- const scMsg = g_lblNameObj.kcShortcutDesc.split(`{0}`).join(g_isMac ? `Shift+${g_kCd[g_headerObj.keyRetry]}` : g_kCd[g_headerObj.keyTitleBack])
5793
- .split(`{1}`).join(g_kCd[g_headerObj.keyRetry]);
5794
-
5795
5764
  multiAppend(divRoot,
5796
5765
 
5797
5766
  // ショートカットキーメッセージ
5798
- createDivCss2Label(
5799
- `scMsg`, scMsg,
5800
- {
5801
- x: 0, y: g_sHeight - 45, w: g_sWidth, h: 20,
5802
- siz: getFontSize(scMsg, g_sWidth, getBasicFont(), C_SIZ_MAIN),
5803
- }),
5767
+ createDescDiv(`scMsg`, g_lblNameObj.kcShortcutDesc.split(`{0}`).join(g_isMac ? `Shift+${g_kCd[g_headerObj.keyRetry]}` : g_kCd[g_headerObj.keyTitleBack])
5768
+ .split(`{1}`).join(g_kCd[g_headerObj.keyRetry]), `scKcMsg`),
5804
5769
 
5805
5770
  // 別キーモード警告メッセージ
5806
5771
  createDivCss2Label(
5807
5772
  `kcMsg`,
5808
5773
  hasVal(g_keyObj[`transKey${keyCtrlPtn}`]) ? g_lblNameObj.transKeyDesc : ``,
5809
- {
5810
- x: 0, y: g_sHeight - 25, w: g_sWidth, h: 20, siz: C_SIZ_MAIN,
5811
- }, g_cssObj.keyconfig_warning
5774
+ g_lblPosObj.kcMsg, g_cssObj.keyconfig_warning
5812
5775
  ),
5813
5776
 
5814
5777
  // キーコンフィグタイプ切替ボタン
@@ -5968,10 +5931,9 @@ const keyConfigInit = (_kcType = g_kcType) => {
5968
5931
  if ([`Default`, `Type0`].includes(g_colorType)) {
5969
5932
  colorPickSprite.style.display = C_DIS_NONE;
5970
5933
  }
5971
- const pickPos = { x: 0, w: 50, h: 15, siz: 11, align: C_ALIGN_LEFT, background: `#${g_headerObj.baseBrightFlg ? `eeeeee` : `111111`}80` };
5972
5934
  multiAppend(colorPickSprite,
5973
- createDivCss2Label(`lblPickArrow`, g_lblNameObj.s_arrow, Object.assign({ y: 0 }, pickPos)),
5974
- createDivCss2Label(`lblPickFrz`, g_lblNameObj.s_frz, Object.assign({ y: 140 }, pickPos)),
5935
+ createDivCss2Label(`lblPickArrow`, g_lblNameObj.s_arrow, Object.assign({ y: 0 }, g_lblPosObj.pickPos)),
5936
+ createDivCss2Label(`lblPickFrz`, g_lblNameObj.s_frz, Object.assign({ y: 140 }, g_lblPosObj.pickPos)),
5975
5937
  createCss2Button(`lnkColorCopy`, `[↓]`, _ => {
5976
5938
  if (window.confirm(g_msgObj.colorCopyConfirm)) {
5977
5939
  for (let j = 0; j < g_headerObj.setColor.length; j++) {
@@ -5980,7 +5942,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
5980
5942
  document.getElementById(`pickfrz${val}${j}`).value = g_headerObj[`frzColor${g_colorType}`][j][k]);
5981
5943
  }
5982
5944
  }
5983
- }, { x: 35, y: -5, w: 30, h: 20, siz: 14 }, g_cssObj.button_Start),
5945
+ }, g_lblPosObj.lnkColorCopy, g_cssObj.button_Start),
5984
5946
  );
5985
5947
 
5986
5948
  /**
@@ -5990,10 +5952,8 @@ const keyConfigInit = (_kcType = g_kcType) => {
5990
5952
  * @param {function} _func
5991
5953
  * @param {object} _obj
5992
5954
  */
5993
- const createColorPickWindow = (_j, _type, _func, { x = 0, y = 15 } = {}) => {
5994
- const picker = createColorPicker(colorPickSprite, `pick${_type}${_j}`, { x, y: y + 25 * _j });
5995
- picker.addEventListener(`change`, _func);
5996
- };
5955
+ const createColorPickWindow = (_j, _type, _func, { x = 0, y = 15 } = {}) =>
5956
+ createColorPicker(colorPickSprite, `pick${_type}${_j}`, _func, { x, y: y + 25 * _j });
5997
5957
 
5998
5958
  for (let j = 0; j < g_headerObj.setColor.length; j++) {
5999
5959
  createColorPickWindow(j, `arrow`, _ => {
@@ -6043,21 +6003,15 @@ const keyConfigInit = (_kcType = g_kcType) => {
6043
6003
  g_currentj = 0;
6044
6004
  g_currentk = 0;
6045
6005
  g_prevKey = 0;
6046
- }, {
6047
- x: g_sWidth / 3, y: g_sHeight - 75,
6048
- w: g_sWidth / 3, h: C_BTN_HEIGHT / 2, siz: C_LBL_BTNSIZE * 2 / 3,
6006
+ }, Object.assign(g_lblPosObj.btnKcBack, {
6049
6007
  resetFunc: _ => (g_baseDisp === `Settings` ? optionInit() : settingsDisplayInit()),
6050
- }, g_cssObj.button_Back),
6008
+ }), g_cssObj.button_Back),
6051
6009
 
6052
- createDivCss2Label(`lblPattern`, `${g_lblNameObj.KeyPattern}: ${g_keyObj.currentPtn === -1 ? 'Self' : g_keyObj.currentPtn + 1}${lblTransKey}`, {
6053
- x: g_sWidth / 6, y: g_sHeight - 100,
6054
- w: g_sWidth / 3, h: C_BTN_HEIGHT / 2,
6055
- }),
6010
+ createDivCss2Label(`lblPattern`, `${g_lblNameObj.KeyPattern}: ${g_keyObj.currentPtn === -1 ?
6011
+ 'Self' : g_keyObj.currentPtn + 1}${lblTransKey}`, g_lblPosObj.lblPattern),
6056
6012
 
6057
6013
  // パターン変更ボタン描画(右回り)
6058
- createCss2Button(`btnPtnChangeR`, `>>`, _ => true, {
6059
- x: g_sWidth / 2, y: g_sHeight - 100,
6060
- w: g_sWidth / 6, h: C_BTN_HEIGHT / 2, siz: C_LBL_BTNSIZE * 2 / 3,
6014
+ createCss2Button(`btnPtnChangeR`, `>>`, _ => true, Object.assign(g_lblPosObj.btnPtnChangeR, {
6061
6015
  resetFunc: _ => {
6062
6016
  const tempPtn = searchPattern(g_keyObj.currentPtn + 1, 1, g_headerObj.transKeyUse, `transKey`);
6063
6017
  g_keyObj.currentPtn = (g_keyObj[`keyCtrl${g_keyObj.currentKey}_${tempPtn}`] !== undefined ?
@@ -6065,12 +6019,10 @@ const keyConfigInit = (_kcType = g_kcType) => {
6065
6019
 
6066
6020
  keyConfigInit();
6067
6021
  },
6068
- }, g_cssObj.button_Setting),
6022
+ }), g_cssObj.button_Setting),
6069
6023
 
6070
6024
  // パターン変更ボタン描画(左回り)
6071
- createCss2Button(`btnPtnChangeL`, `<<`, _ => true, {
6072
- x: 0, y: g_sHeight - 100,
6073
- w: g_sWidth / 6, h: C_BTN_HEIGHT / 2, siz: C_LBL_BTNSIZE * 2 / 3,
6025
+ createCss2Button(`btnPtnChangeL`, `<<`, _ => true, Object.assign(g_lblPosObj.btnPtnChangeL, {
6074
6026
  resetFunc: _ => {
6075
6027
  const tempPtn = searchPattern(g_keyObj.currentPtn - 1, -1, g_headerObj.transKeyUse, `transKey`);
6076
6028
  g_keyObj.currentPtn = (g_keyObj[`keyCtrl${g_keyObj.currentKey}_${tempPtn}`] !== undefined ?
@@ -6078,7 +6030,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
6078
6030
 
6079
6031
  keyConfigInit();
6080
6032
  },
6081
- }, g_cssObj.button_Setting),
6033
+ }), g_cssObj.button_Setting),
6082
6034
 
6083
6035
  // キーコンフィグリセットボタン描画
6084
6036
  createCss2Button(`btnReset`, g_lblNameObj.b_reset, _ => {
@@ -6093,10 +6045,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
6093
6045
  resetCursor(Number(g_kcType === `Replaced`));
6094
6046
  keyconSprite.scrollLeft = - maxLeftX;
6095
6047
  }
6096
- }, {
6097
- x: 0, y: g_sHeight - 75,
6098
- w: g_sWidth / 3, h: C_BTN_HEIGHT / 2, siz: C_LBL_BTNSIZE * 2 / 3,
6099
- }, g_cssObj.button_Reset),
6048
+ }, g_lblPosObj.btnKcReset, g_cssObj.button_Reset),
6100
6049
 
6101
6050
  // プレイ開始
6102
6051
  makePlayButton(_ => loadMusic())
@@ -7996,10 +7945,9 @@ const MainInit = _ => {
7996
7945
  }, g_cssObj.main_stepKeyDown),
7997
7946
 
7998
7947
  // ヒット時モーション
7999
- createColorObject2(`stepHit${j}`, {
8000
- x: -15, y: -15, w: C_ARW_WIDTH + 30, h: C_ARW_WIDTH + 30,
7948
+ createColorObject2(`stepHit${j}`, Object.assign(g_lblPosObj.stepHit, {
8001
7949
  rotate: g_workObj.stepHitRtn[j], styleName: `StepHit`, opacity: 0,
8002
- }, g_cssObj.main_stepDefault),
7950
+ }), g_cssObj.main_stepDefault),
8003
7951
 
8004
7952
  );
8005
7953
  }
@@ -8020,23 +7968,13 @@ const MainInit = _ => {
8020
7968
 
8021
7969
  // Hidden+, Sudden+用のライン、パーセント表示
8022
7970
  const filterCss = g_stateObj.filterLock === C_FLG_OFF ? g_cssObj.life_Failed : g_cssObj.life_Cleared;
8023
- [`filterBar0`, `filterBar1`, `borderBar0`, `borderBar1`].forEach(obj => {
8024
- mainSprite.appendChild(
8025
- createColorObject2(`${obj}`, {
8026
- w: g_headerObj.playingWidth - 50, h: 1, styleName: `lifeBar`,
8027
- opacity: 0.0625,
8028
- }, filterCss)
8029
- );
8030
- });
7971
+ [`filterBar0`, `filterBar1`, `borderBar0`, `borderBar1`].forEach(obj =>
7972
+ mainSprite.appendChild(createColorObject2(obj, g_lblPosObj.filterBar, filterCss)));
8031
7973
  borderBar0.style.top = `${g_posObj.stepDiffY}px`;
8032
7974
  borderBar1.style.top = `${g_posObj.stepDiffY + g_posObj.arrowHeight}px`;
8033
7975
 
8034
7976
  if (g_appearanceRanges.includes(g_stateObj.appearance)) {
8035
- mainSprite.appendChild(
8036
- createDivCss2Label(`filterView`, ``, {
8037
- x: g_headerObj.playingWidth - 70, y: 0, w: 10, h: 10, siz: 10, align: C_ALIGN_RIGHT,
8038
- })
8039
- );
7977
+ mainSprite.appendChild(createDivCss2Label(`filterView`, ``, g_lblPosObj.filterView));
8040
7978
  if (g_stateObj.d_filterline === C_FLG_ON) {
8041
7979
  [`filterBar0`, `filterBar1`, `filterView`].forEach(obj => {
8042
7980
  $id(obj).opacity = g_stateObj.opacity / 100;
@@ -8064,7 +8002,7 @@ const MainInit = _ => {
8064
8002
  if (isNaN(parseFloat(g_workObj.arrowRtn[j]))) {
8065
8003
  multiAppend(frzHit,
8066
8004
  createColorObject2(`frzHitShadow${j}`, {
8067
- rotate: g_workObj.arrowRtn[j], styleName: `Shadow`
8005
+ rotate: g_workObj.arrowRtn[j], styleName: `Shadow`,
8068
8006
  }, g_cssObj.main_objShadow),
8069
8007
  createColorObject2(`frzHitTop${j}`, {
8070
8008
  background: g_workObj.frzHitColors[j], rotate: g_workObj.arrowRtn[j],
@@ -8072,10 +8010,9 @@ const MainInit = _ => {
8072
8010
  );
8073
8011
  } else {
8074
8012
  frzHit.appendChild(
8075
- createColorObject2(`frzHitTop${j}`, {
8076
- x: -8, y: -8, w: C_ARW_WIDTH + 16, h: C_ARW_WIDTH + 16,
8013
+ createColorObject2(`frzHitTop${j}`, Object.assign(g_lblPosObj.frzHitTop, {
8077
8014
  rotate: g_workObj.arrowRtn[j], styleName: `Shadow`,
8078
- }, g_cssObj.main_frzHitTop)
8015
+ }), g_cssObj.main_frzHitTop)
8079
8016
  );
8080
8017
  }
8081
8018
  }
@@ -8202,24 +8139,16 @@ const MainInit = _ => {
8202
8139
  }, g_cssObj.life_Border, g_cssObj.life_BorderColor),
8203
8140
 
8204
8141
  // 曲名・アーティスト名表示
8205
- createDivCss2Label(`lblCredit`, creditName, {
8206
- x: 125, y: g_sHeight - 30, w: g_headerObj.playingWidth - 125, h: 20, siz: checkMusicSiz(creditName, C_SIZ_MUSIC_TITLE), align: C_ALIGN_LEFT,
8207
- }),
8142
+ createDivCss2Label(`lblCredit`, creditName, Object.assign(g_lblPosObj.lblCredit, { siz: checkMusicSiz(creditName, C_SIZ_MUSIC_TITLE) })),
8208
8143
 
8209
8144
  // 譜面名表示
8210
- createDivCss2Label(`lblDifName`, difName, {
8211
- x: 125, y: g_sHeight - 16, w: g_headerObj.playingWidth, h: 20, siz: checkMusicSiz(difName, 12), align: C_ALIGN_LEFT,
8212
- }),
8145
+ createDivCss2Label(`lblDifName`, difName, Object.assign(g_lblPosObj.lblDifName, { siz: checkMusicSiz(difName, 12) })),
8213
8146
 
8214
8147
  // 曲時間表示:現在時間
8215
- createDivCss2Label(`lblTime1`, `-:--`, {
8216
- x: 18, y: g_sHeight - 30, w: 40, h: 20, siz: C_SIZ_MAIN, align: C_ALIGN_RIGHT, display: g_workObj.musicinfoDisp,
8217
- }),
8148
+ createDivCss2Label(`lblTime1`, `-:--`, Object.assign(g_lblPosObj.lblTime1, { display: g_workObj.musicinfoDisp })),
8218
8149
 
8219
8150
  // 曲時間表示:総時間
8220
- createDivCss2Label(`lblTime2`, `/ ${fullTime}`, {
8221
- x: 60, y: g_sHeight - 30, w: 60, h: 20, siz: C_SIZ_MAIN, display: g_workObj.musicinfoDisp,
8222
- }),
8151
+ createDivCss2Label(`lblTime2`, `/ ${fullTime}`, Object.assign(g_lblPosObj.lblTime2, { display: g_workObj.musicinfoDisp })),
8223
8152
  );
8224
8153
 
8225
8154
  // ボーダーライン表示
@@ -8232,11 +8161,7 @@ const MainInit = _ => {
8232
8161
  const wordSprite = createEmptySprite(judgeSprite, `wordSprite`, { w: g_headerObj.playingWidth });
8233
8162
  for (let j = 0; j <= g_scoreObj.wordMaxDepth; j++) {
8234
8163
  const wordY = (j % 2 === 0 ? 10 : (g_headerObj.bottomWordSetFlg ? g_posObj.distY + 10 : g_sHeight - 60));
8235
- wordSprite.appendChild(createDivCss2Label(`lblword${j}`, ``, {
8236
- x: 100, y: wordY, w: g_headerObj.playingWidth - 200, h: 50,
8237
- siz: C_SIZ_MAIN, align: C_ALIGN_LEFT, fontFamily: getBasicFont(),
8238
- display: `block`, margin: `auto`,
8239
- }));
8164
+ wordSprite.appendChild(createDivCss2Label(`lblword${j}`, ``, Object.assign(g_lblPosObj.lblWord, { y: wordY, fontFamily: getBasicFont() })));
8240
8165
  }
8241
8166
 
8242
8167
  const jdgGroups = [`J`, `FJ`];
@@ -8291,17 +8216,11 @@ const MainInit = _ => {
8291
8216
  });
8292
8217
 
8293
8218
  // パーフェクト演出
8294
- judgeSprite.appendChild(
8295
- createDivCss2Label(`finishView`, ``, {
8296
- x: g_headerObj.playingWidth / 2 - 150, y: g_sHeight / 2 - 50, w: 300, h: 20, siz: 50,
8297
- }, g_cssObj.common_kita)
8298
- );
8219
+ judgeSprite.appendChild(createDivCss2Label(`finishView`, ``, g_lblPosObj.finishView, g_cssObj.common_kita));
8299
8220
 
8300
8221
  // 曲情報OFF
8301
8222
  if (g_stateObj.d_musicinfo === C_FLG_OFF) {
8302
- [`lblCredit`, `lblDifName`].forEach(labelName => {
8303
- changeStyle(labelName, { x: 20, animationDuration: `4.0s`, animationName: `leftToRightFade`, animationFillMode: `both` });
8304
- });
8223
+ [`lblCredit`, `lblDifName`].forEach(labelName => changeStyle(labelName, g_lblPosObj.musicInfoOFF));
8305
8224
  }
8306
8225
 
8307
8226
  // ローカル時のみフレーム数を残す
@@ -9672,10 +9591,9 @@ const resultInit = _ => {
9672
9591
  const scoreIdHeader = setScoreIdHeader(g_stateObj.scoreId, g_stateObj.scoreLockFlg);
9673
9592
 
9674
9593
  g_animationData.forEach(sprite => {
9675
- if (g_rootObj[`${sprite}failedS${scoreIdHeader}_data`] !== undefined) {
9676
- [g_headerObj[`${sprite}ResultData`], g_headerObj[`${sprite}ResultMaxDepth`]] = makeSpriteData(g_rootObj[`${sprite}failedS${scoreIdHeader}_data`]);
9677
- } else if (g_rootObj[`${sprite}failedS_data`] !== undefined) {
9678
- [g_headerObj[`${sprite}ResultData`], g_headerObj[`${sprite}ResultMaxDepth`]] = makeSpriteData(g_rootObj[`${sprite}failedS_data`]);
9594
+ const failedData = g_rootObj[`${sprite}failedS${scoreIdHeader}_data`] ?? g_rootObj[`${sprite}failedS_data`];
9595
+ if (failedData !== undefined) {
9596
+ [g_headerObj[`${sprite}ResultData`], g_headerObj[`${sprite}ResultMaxDepth`]] = makeSpriteData(failedData);
9679
9597
  }
9680
9598
  });
9681
9599
  } else if (g_gameOverFlg) {
@@ -9715,8 +9633,7 @@ const resultInit = _ => {
9715
9633
 
9716
9634
  // スコア計算(一括)
9717
9635
  const scoreTmp = Object.keys(g_pointAllocation).reduce(
9718
- (score, name) => score + g_resultObj[name] * g_pointAllocation[name]
9719
- , 0)
9636
+ (score, name) => score + g_resultObj[name] * g_pointAllocation[name], 0);
9720
9637
 
9721
9638
  const allScore = g_fullArrows * 10;
9722
9639
  const resultScore = Math.round(scoreTmp / allScore * g_maxScore) || 0;
@@ -9859,35 +9776,25 @@ const resultInit = _ => {
9859
9776
 
9860
9777
  // ランク描画
9861
9778
  resultWindow.appendChild(
9862
- createDivCss2Label(`lblRank`, rankMark, {
9863
- x: 340, y: 160, w: 70, h: 20, siz: 50, align: C_ALIGN_CENTER,
9779
+ createDivCss2Label(`lblRank`, rankMark, Object.assign(g_lblPosObj.lblRank, {
9864
9780
  color: rankColor, fontFamily: getBasicFont(`"Bookman Old Style"`),
9865
- })
9781
+ }))
9866
9782
  );
9867
9783
 
9868
9784
  // Cleared & Failed表示
9869
9785
  const lblResultPre = createDivCss2Label(
9870
9786
  `lblResultPre`,
9871
9787
  resultViewText(g_gameOverFlg ? `failed` : `cleared`),
9872
- {
9873
- x: g_sWidth / 2 - 150, y: g_sHeight / 2 - 160,
9874
- w: 200, h: 50, siz: 60,
9875
- opacity: 0, animationDuration: (g_gameOverFlg ? `3s` : `2.5s`),
9788
+ Object.assign(g_lblPosObj.lblResultPre, {
9789
+ animationDuration: (g_gameOverFlg ? `3s` : `2.5s`),
9876
9790
  animationName: (g_gameOverFlg ? `upToDownFade` : `leftToRightFade`)
9877
- }, g_cssObj.result_Cleared, g_cssObj.result_Window
9791
+ }), g_cssObj.result_Cleared, g_cssObj.result_Window
9878
9792
  );
9879
9793
  divRoot.appendChild(lblResultPre);
9880
9794
 
9881
- divRoot.appendChild(
9882
- createDivCss2Label(
9883
- `lblResultPre2`,
9884
- resultViewText(g_gameOverFlg ? `failed` :
9885
- (playingArrows === g_fullArrows ? g_resultObj.spState : ``)),
9886
- {
9887
- x: g_sWidth / 2 + 50, y: 40, w: 200, h: 30, siz: 20,
9888
- }, g_cssObj.result_Cleared
9889
- )
9890
- );
9795
+ divRoot.appendChild(createDivCss2Label(`lblResultPre2`,
9796
+ resultViewText(g_gameOverFlg ? `failed` : (playingArrows === g_fullArrows ? g_resultObj.spState : ``)),
9797
+ g_lblPosObj.lblResultPre2, g_cssObj.result_Cleared));
9891
9798
 
9892
9799
  // プレイデータは Cleared & Failed に合わせて表示
9893
9800
  playDataWindow.style.animationDuration = `3s`;
@@ -10019,57 +9926,39 @@ const resultInit = _ => {
10019
9926
  const resultText = `${unEscapeHtml(tweetResultTmp)}`;
10020
9927
  const tweetResult = `https://twitter.com/intent/tweet?text=${encodeURIComponent(resultText)}`;
10021
9928
 
10022
- // ボタン描画
10023
- multiAppend(divRoot,
10024
-
10025
- // タイトル画面へ戻る
10026
- createCss2Button(`btnBack`, g_lblNameObj.b_back, _ => {
9929
+ /** 音源、ループ処理の停止 */
9930
+ const resetCommonBtn = (_id, _name, _posObj, _func, _cssClass) =>
9931
+ createCss2Button(_id, _name, _ => {
10027
9932
  if (g_finishFlg) {
10028
9933
  g_audio.pause();
10029
9934
  }
10030
9935
  clearTimeout(g_timeoutEvtId);
10031
9936
  clearTimeout(g_timeoutEvtResultId);
10032
- }, {
10033
- w: g_sWidth / 4, h: C_BTN_HEIGHT * 5 / 4,
10034
- animationName: `smallToNormalY`, resetFunc: _ => titleInit(),
10035
- }, g_cssObj.button_Back),
9937
+ }, Object.assign(_posObj, { resetFunc: _func }), _cssClass);
9938
+
9939
+ // ボタン描画
9940
+ multiAppend(divRoot,
9941
+
9942
+ // タイトル画面へ戻る
9943
+ resetCommonBtn(`btnBack`, g_lblNameObj.b_back, g_lblPosObj.btnRsBack, titleInit, g_cssObj.button_Back),
10036
9944
 
10037
9945
  // リザルトデータをクリップボードへコピー
10038
9946
  createCss2Button(`btnCopy`, g_lblNameObj.b_copy, _ => {
10039
9947
  copyTextToClipboard(resultText, g_msgInfoObj.I_0001);
10040
- }, {
10041
- x: g_sWidth / 4,
10042
- w: g_sWidth / 2,
10043
- h: C_BTN_HEIGHT * 5 / 8, siz: 24,
10044
- animationName: `smallToNormalY`,
10045
- }, g_cssObj.button_Setting),
9948
+ }, g_lblPosObj.btnRsCopy, g_cssObj.button_Setting),
10046
9949
 
10047
9950
  // リザルトデータをTwitterへ転送
10048
- createCss2Button(`btnTweet`, g_lblNameObj.b_tweet, _ => true, {
10049
- x: g_sWidth / 4, y: g_sHeight - 100 + C_BTN_HEIGHT * 5 / 8,
10050
- w: g_sWidth / 4, h: C_BTN_HEIGHT * 5 / 8, siz: 24,
10051
- animationName: `smallToNormalY`, resetFunc: _ => openLink(tweetResult),
10052
- }, g_cssObj.button_Tweet),
9951
+ createCss2Button(`btnTweet`, g_lblNameObj.b_tweet, _ => true, Object.assign(g_lblPosObj.btnRsTweet, {
9952
+ resetFunc: _ => openLink(tweetResult),
9953
+ }), g_cssObj.button_Tweet),
10053
9954
 
10054
9955
  // Gitterへのリンク
10055
- createCss2Button(`btnGitter`, g_lblNameObj.b_gitter, _ => true, {
10056
- x: g_sWidth / 2, y: g_sHeight - 100 + C_BTN_HEIGHT * 5 / 8,
10057
- w: g_sWidth / 4, h: C_BTN_HEIGHT * 5 / 8, siz: 24,
10058
- animationName: `smallToNormalY`, resetFunc: _ => openLink(`https://gitter.im/danonicw/freeboard`),
10059
- }, g_cssObj.button_Default),
9956
+ createCss2Button(`btnGitter`, g_lblNameObj.b_gitter, _ => true, Object.assign(g_lblPosObj.btnRsGitter, {
9957
+ resetFunc: _ => openLink(`https://gitter.im/danonicw/freeboard`),
9958
+ }), g_cssObj.button_Default),
10060
9959
 
10061
9960
  // リトライ
10062
- createCss2Button(`btnRetry`, g_lblNameObj.b_retry, _ => {
10063
- if (g_finishFlg) {
10064
- g_audio.pause();
10065
- }
10066
- clearTimeout(g_timeoutEvtId);
10067
- clearTimeout(g_timeoutEvtResultId);
10068
- }, {
10069
- x: g_sWidth / 4 * 3,
10070
- w: g_sWidth / 4, h: C_BTN_HEIGHT * 5 / 4,
10071
- animationName: `smallToNormalY`, resetFunc: _ => loadMusic(),
10072
- }, g_cssObj.button_Reset),
9961
+ resetCommonBtn(`btnRetry`, g_lblNameObj.b_retry, g_lblPosObj.btnRsRetry, loadMusic, g_cssObj.button_Reset),
10073
9962
  );
10074
9963
 
10075
9964
  // マスクスプライトを作成
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2022/03/27 (v27.2.0)
8
+ * Revised : 2022/04/16 (v27.4.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -83,31 +83,255 @@ const g_windowObj = {
83
83
  divRoot: { margin: `auto`, letterSpacing: `normal` },
84
84
  divBack: { background: `linear-gradient(#000000, #222222)` },
85
85
 
86
- optionSprite: { w: 450, h: 325 },
87
86
  difList: { x: 165, y: 65, w: 280, h: 255, overflow: `auto` },
88
87
  difCover: { x: 25, y: 65, w: 140, h: 255, overflow: `auto`, opacity: 0.95 },
89
88
 
90
89
  scoreDetail: { x: 20, y: 90, w: 420, h: 230, visibility: `hidden` },
91
90
  detailObj: { w: 420, h: 230, visibility: `hidden` },
92
91
 
93
- displaySprite: { x: 25, y: 30, h: C_LEN_SETLBL_HEIGHT * 5 },
94
- keyconSprite: { overflow: `auto` },
95
92
  colorPickSprite: { x: 0, y: 90, w: 50, h: 280 },
96
-
97
- loader: { h: 10, backgroundColor: `#333333` },
98
-
99
- playDataWindow: { w: 450, h: 110 },
100
- resultWindow: { w: 400, h: 210 },
101
93
  };
102
94
 
95
+ const g_lblPosObj = {};
96
+
103
97
  // 可変部分のウィンドウサイズを更新
104
98
  const updateWindowSiz = _ => {
105
- Object.assign(g_windowObj.optionSprite, { x: (g_sWidth - 450) / 2, y: 65 + (g_sHeight - 500) / 2 });
106
- Object.assign(g_windowObj.displaySprite, { w: (g_sWidth - 450) / 2 });
107
- Object.assign(g_windowObj.keyconSprite, { y: 88 + (g_sHeight - 500) / 2, h: g_sHeight });
108
- Object.assign(g_windowObj.loader, { y: g_sHeight - 10 });
109
- Object.assign(g_windowObj.playDataWindow, { x: g_sWidth / 2 - 225, y: 70 + (g_sHeight - 500) / 2 });
110
- Object.assign(g_windowObj.resultWindow, { x: g_sWidth / 2 - 200, y: 185 + (g_sHeight - 500) / 2 });
99
+ Object.assign(g_windowObj, {
100
+ optionSprite: { x: (g_sWidth - 450) / 2, y: 65 + (g_sHeight - 500) / 2, w: 450, h: 325 },
101
+ displaySprite: { x: 25, y: 30, w: (g_sWidth - 450) / 2, h: C_LEN_SETLBL_HEIGHT * 5 },
102
+ keyconSprite: { y: 88 + (g_sHeight - 500) / 2, h: g_sHeight, overflow: `auto` },
103
+ loader: { y: g_sHeight - 10, h: 10, backgroundColor: `#333333` },
104
+ playDataWindow: { x: g_sWidth / 2 - 225, y: 70 + (g_sHeight - 500) / 2, w: 450, h: 110 },
105
+ resultWindow: { x: g_sWidth / 2 - 200, y: 185 + (g_sHeight - 500) / 2, w: 400, h: 210 },
106
+ });
107
+
108
+ Object.assign(g_lblPosObj, {
109
+
110
+ /** タイトル画面 */
111
+ btnReset: {
112
+ x: 0, y: g_sHeight - 20, w: g_sWidth / 4, h: 16, siz: 12, title: g_msgObj.dataReset,
113
+ },
114
+ btnReload: {
115
+ x: 10, y: 10, w: 30, h: 30, siz: 20, title: g_msgObj.reload,
116
+ },
117
+ btnHelp: {
118
+ x: 0, y: g_sHeight - 150, w: 40, h: 40, siz: 30, title: g_msgObj.howto,
119
+ },
120
+ lnkMaker: {
121
+ x: 0, y: g_sHeight - 50, w: g_sWidth / 2, h: C_LNK_HEIGHT,
122
+ align: C_ALIGN_LEFT, title: g_headerObj.creatorUrl,
123
+ },
124
+ lnkArtist: {
125
+ x: g_sWidth / 2, y: g_sHeight - 50, w: g_sWidth / 2, h: C_LNK_HEIGHT,
126
+ align: C_ALIGN_LEFT, title: g_headerObj.artistUrl,
127
+ },
128
+ lnkVersion: {
129
+ x: g_sWidth / 4, y: g_sHeight - 20, w: g_sWidth * 3 / 4 - 20, h: 16,
130
+ align: C_ALIGN_RIGHT, title: g_msgObj.github,
131
+ },
132
+ lnkComparison: {
133
+ x: g_sWidth - 20, y: g_sHeight - 20, w: 20, h: 16, siz: 12, title: g_msgObj.security,
134
+ },
135
+ lblComment: {
136
+ x: 0, y: 70, w: g_sWidth, h: g_sHeight - 180, siz: C_SIZ_DIFSELECTOR, align: C_ALIGN_LEFT,
137
+ overflow: `auto`, background: `#222222`, color: `#cccccc`, display: C_DIS_NONE,
138
+ },
139
+ btnComment: {
140
+ x: g_sWidth - 160, y: (g_sHeight / 2) + 150, w: 140, h: 50, siz: 20, border: `solid 1px #999999`,
141
+ },
142
+
143
+ /** 設定画面 */
144
+ btnBack: {},
145
+ btnKeyConfig: {
146
+ x: g_sWidth / 3,
147
+ },
148
+ btnPlay: {
149
+ x: g_sWidth * 2 / 3,
150
+ },
151
+ btnSwitchSetting: {
152
+ x: g_sWidth / 2 + 175 - C_LEN_SETMINI_WIDTH / 2, y: 25, w: C_LEN_SETMINI_WIDTH, h: 40,
153
+ },
154
+ btnSave: {
155
+ x: 0, y: 5, w: g_sWidth / 5, h: 16, siz: 12,
156
+ title: g_msgObj.dataSave, borderStyle: `solid`,
157
+ },
158
+
159
+ btnReverse: {
160
+ x: 160, y: 0, w: 90, h: 21, siz: C_SIZ_DIFSELECTOR, borderStyle: `solid`,
161
+ },
162
+ lblGauge2: {
163
+ x: C_LEN_SETLBL_LEFT - 35, y: C_LEN_SETLBL_HEIGHT,
164
+ w: C_LEN_SETLBL_WIDTH + 60, h: C_LEN_SETLBL_HEIGHT * 2, siz: 11,
165
+ },
166
+ lnkFadein: {
167
+ x: C_LEN_SETLBL_LEFT, y: 0,
168
+ },
169
+ lblFadeinBar: {
170
+ x: C_LEN_SETLBL_LEFT, y: 0,
171
+ },
172
+
173
+ /** 設定: 譜面明細子画面 */
174
+ lnkScoreDetailB: {
175
+ x: 10, w: 100, visibility: `hidden`,
176
+ },
177
+ lnkScoreDetail: {
178
+ x: 10, w: 100, borderStyle: `solid`,
179
+ },
180
+
181
+ lblTooldif: {
182
+ y: 5, w: 250, siz: C_SIZ_JDGCNTS,
183
+ },
184
+ dataTooldif: {
185
+ x: 270, y: 3, w: 160, siz: 18,
186
+ },
187
+ lblDouji: {},
188
+ lblTate: {
189
+ x: 270,
190
+ },
191
+ dataDouji: {
192
+ x: 200, w: 160,
193
+ },
194
+ dataTate: {
195
+ x: 345, w: 160,
196
+ },
197
+ lblArrowInfo: {
198
+ x: 130, y: 45, w: 290, siz: C_SIZ_JDGCNTS,
199
+ },
200
+ dataArrowInfo: {
201
+ x: 270, y: 45, w: 160, siz: C_SIZ_JDGCNTS,
202
+ },
203
+ lblArrowInfo2: {
204
+ x: 130, y: 70, w: 200, h: 90,
205
+ },
206
+ dataArrowInfo2: {
207
+ x: 140, y: 70, w: 275, h: 150, overflow: `auto`,
208
+ },
209
+ lnkDifInfo: {
210
+ x: 10, y: 30, w: 100, borderStyle: `solid`,
211
+ },
212
+
213
+ /** ディスプレイ画面 */
214
+ scMsg: {
215
+ x: 0, y: g_sHeight - 45, w: g_sWidth, h: 20,
216
+ },
217
+ sdDesc: {
218
+ x: 0, y: 65, w: g_sWidth, h: 20, siz: C_SIZ_MAIN,
219
+ },
220
+ lblAppearancePos: {
221
+ x: C_LEN_SETLBL_LEFT, y: 20, siz: 12, align: C_ALIGN_CENTER,
222
+ },
223
+ lblAppearanceBar: {
224
+ x: C_LEN_SETLBL_LEFT, y: 15,
225
+ },
226
+ lnkLockBtn: {
227
+ x: C_LEN_SETLBL_LEFT + C_LEN_SETLBL_WIDTH - 40, y: 0, w: 40, h: C_LEN_SETLBL_HEIGHT, siz: 12,
228
+ borderStyle: `solid`,
229
+ },
230
+
231
+ /** キーコンフィグ画面 */
232
+ scKcMsg: {
233
+ x: 0, y: g_sHeight - 45, w: g_sWidth, h: 20,
234
+ },
235
+ kcMsg: {
236
+ x: 0, y: g_sHeight - 25, w: g_sWidth, h: 20, siz: C_SIZ_MAIN,
237
+ },
238
+ kcDesc: {
239
+ x: 0, y: 68, w: g_sWidth, h: 20,
240
+ },
241
+ kcShuffleDesc: {
242
+ x: 5, y: g_sHeight - 125, w: g_sWidth, h: 20, align: C_ALIGN_LEFT,
243
+ },
244
+ pickPos: {
245
+ x: 0, w: 50, h: 15, siz: 11, align: C_ALIGN_LEFT, background: `#${g_headerObj.baseBrightFlg ? `eeeeee` : `111111`}80`,
246
+ },
247
+ lnkColorCopy: {
248
+ x: 35, y: -5, w: 30, h: 20, siz: 14,
249
+ },
250
+
251
+ btnKcBack: {
252
+ x: g_sWidth / 3, y: g_sHeight - 75,
253
+ w: g_sWidth / 3, h: C_BTN_HEIGHT / 2, siz: C_LBL_BTNSIZE * 2 / 3,
254
+ },
255
+ lblPattern: {
256
+ x: g_sWidth / 6, y: g_sHeight - 100, w: g_sWidth / 3, h: C_BTN_HEIGHT / 2,
257
+ },
258
+ btnPtnChangeR: {
259
+ x: g_sWidth / 2, y: g_sHeight - 100,
260
+ w: g_sWidth / 6, h: C_BTN_HEIGHT / 2, siz: C_LBL_BTNSIZE * 2 / 3,
261
+ },
262
+ btnPtnChangeL: {
263
+ x: 0, y: g_sHeight - 100,
264
+ w: g_sWidth / 6, h: C_BTN_HEIGHT / 2, siz: C_LBL_BTNSIZE * 2 / 3,
265
+ },
266
+ btnKcReset: {
267
+ x: 0, y: g_sHeight - 75,
268
+ w: g_sWidth / 3, h: C_BTN_HEIGHT / 2, siz: C_LBL_BTNSIZE * 2 / 3,
269
+ },
270
+
271
+ /** メイン画面 */
272
+ stepHit: {
273
+ x: -15, y: -15, w: C_ARW_WIDTH + 30, h: C_ARW_WIDTH + 30,
274
+ },
275
+ filterBar: {
276
+ w: g_headerObj.playingWidth - 50, h: 1, styleName: `lifeBar`, opacity: 0.0625,
277
+ },
278
+ filterView: {
279
+ x: g_headerObj.playingWidth - 70, y: 0, w: 10, h: 10, siz: 10, align: C_ALIGN_RIGHT,
280
+ },
281
+ frzHitTop: {
282
+ x: -8, y: -8, w: C_ARW_WIDTH + 16, h: C_ARW_WIDTH + 16,
283
+ },
284
+ lblCredit: {
285
+ x: 125, y: g_sHeight - 30, w: g_headerObj.playingWidth - 125, h: 20, align: C_ALIGN_LEFT,
286
+ },
287
+ lblDifName: {
288
+ x: 125, y: g_sHeight - 16, w: g_headerObj.playingWidth, h: 20, align: C_ALIGN_LEFT,
289
+ },
290
+ lblTime1: {
291
+ x: 18, y: g_sHeight - 30, w: 40, h: 20, siz: C_SIZ_MAIN, align: C_ALIGN_RIGHT,
292
+ },
293
+ lblTime2: {
294
+ x: 60, y: g_sHeight - 30, w: 60, h: 20, siz: C_SIZ_MAIN,
295
+ },
296
+ lblWord: {
297
+ x: 100, w: g_headerObj.playingWidth - 200, h: 50,
298
+ siz: C_SIZ_MAIN, align: C_ALIGN_LEFT, display: `block`, margin: `auto`,
299
+ },
300
+ finishView: {
301
+ x: g_headerObj.playingWidth / 2 - 150, y: g_sHeight / 2 - 50, w: 300, h: 20, siz: 50,
302
+ },
303
+ musicInfoOFF: {
304
+ x: 20, animationDuration: `4.0s`, animationName: `leftToRightFade`, animationFillMode: `both`,
305
+ },
306
+
307
+ /** 結果画面 */
308
+ lblRank: {
309
+ x: 340, y: 160, w: 70, h: 20, siz: 50, align: C_ALIGN_CENTER,
310
+ },
311
+ lblResultPre: {
312
+ x: g_sWidth / 2 - 150, y: g_sHeight / 2 - 160, w: 200, h: 50, siz: 60, opacity: 0,
313
+ },
314
+ lblResultPre2: {
315
+ x: g_sWidth / 2 + 50, y: 40, w: 200, h: 30, siz: 20,
316
+ },
317
+ btnRsBack: {
318
+ w: g_sWidth / 4, h: C_BTN_HEIGHT * 5 / 4, animationName: `smallToNormalY`,
319
+ },
320
+ btnRsCopy: {
321
+ x: g_sWidth / 4, w: g_sWidth / 2, h: C_BTN_HEIGHT * 5 / 8, siz: 24, animationName: `smallToNormalY`,
322
+ },
323
+ btnRsTweet: {
324
+ x: g_sWidth / 4, y: g_sHeight - 100 + C_BTN_HEIGHT * 5 / 8,
325
+ w: g_sWidth / 4, h: C_BTN_HEIGHT * 5 / 8, siz: 24, animationName: `smallToNormalY`,
326
+ },
327
+ btnRsGitter: {
328
+ x: g_sWidth / 2, y: g_sHeight - 100 + C_BTN_HEIGHT * 5 / 8,
329
+ w: g_sWidth / 4, h: C_BTN_HEIGHT * 5 / 8, siz: 24, animationName: `smallToNormalY`,
330
+ },
331
+ btnRsRetry: {
332
+ x: g_sWidth / 4 * 3, w: g_sWidth / 4, h: C_BTN_HEIGHT * 5 / 4, animationName: `smallToNormalY`,
333
+ },
334
+ });
111
335
  };
112
336
 
113
337
  // ウィンドウ位置
@@ -2261,11 +2485,19 @@ const g_keyObj = {
2261
2485
  'Left': [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
2262
2486
  'Right': [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
2263
2487
  },
2488
+ assistPos9A_4: {
2489
+ 'Left': [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
2490
+ 'Right': [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
2491
+ },
2264
2492
 
2265
2493
  assistPos11i_0: {
2266
2494
  'Left': [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
2267
2495
  'Right': [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
2268
2496
  },
2497
+ assistPos11i_1: {
2498
+ 'Left': [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
2499
+ 'Right': [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
2500
+ },
2269
2501
 
2270
2502
  assistPos17_0: {
2271
2503
  'Left': [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
@@ -3004,6 +3236,7 @@ const g_errMsgObj = {
3004
3236
  * - 挿入場所ごとに名前を分けて定義
3005
3237
  */
3006
3238
  const g_customJsObj = {
3239
+ preTitle: [],
3007
3240
  title: [],
3008
3241
  titleEnterFrame: [],
3009
3242
  option: [],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "27.2.0",
3
+ "version": "27.4.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {