danoniplus 33.2.0 → 33.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 : 2023/08/20
7
+ * Revised : 2023/08/27
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 33.2.0`;
12
- const g_revisedDate = `2023/08/20`;
11
+ const g_version = `Ver 33.4.0`;
12
+ const g_revisedDate = `2023/08/27`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -162,6 +162,7 @@ const g_workObj = {
162
162
  keyHitFlg: [],
163
163
  scrollDir: [],
164
164
  dividePos: [],
165
+ nonDefaultSc: false,
165
166
  };
166
167
 
167
168
  // 歌詞制御
@@ -1379,21 +1380,27 @@ const resetKeyControl = _ => {
1379
1380
  const clearWindow = (_redrawFlg = false, _customDisplayName = ``) => {
1380
1381
  resetKeyControl();
1381
1382
 
1383
+ // ボタン、オブジェクトをクリア (divRoot配下のもの)
1384
+ deleteChildspriteAll(`divRoot`);
1385
+
1386
+ // 拡張範囲を取得
1387
+ const diffX = (_customDisplayName === `Main` && g_workObj.nonDefaultSc ?
1388
+ g_headerObj.scAreaWidth * (g_headerObj.playingLayout ? 2 : 1) : 0);
1389
+
1390
+ const getLayerWithClear = (_name) => {
1391
+ const layer = document.getElementById(_name);
1392
+ const ctx = layer.getContext(`2d`);
1393
+ ctx.clearRect(0, 0, layer.width, g_sHeight);
1394
+ return ctx;
1395
+ };
1396
+
1382
1397
  if (document.querySelector(`#layer0`) !== null) {
1383
1398
 
1384
1399
  // レイヤー情報取得
1385
- const layer0 = document.querySelector(`#layer0`);
1386
- const l0ctx = layer0.getContext(`2d`);
1387
- layer0.width = g_sWidth;
1388
-
1389
- // 線画、図形をクリア
1390
- l0ctx.clearRect(0, 0, g_sWidth, g_sHeight);
1400
+ const l0ctx = getLayerWithClear(`layer0`);
1391
1401
 
1392
1402
  if (document.querySelector(`#layer1`) !== null) {
1393
- const layer1 = document.querySelector(`#layer1`);
1394
- const l1ctx = layer1.getContext(`2d`);
1395
- layer1.width = g_sWidth;
1396
- l1ctx.clearRect(0, 0, g_sWidth, g_sHeight);
1403
+ const l1ctx = getLayerWithClear(`layer1`);
1397
1404
 
1398
1405
  // 線画 (title-line)
1399
1406
  l1ctx.beginPath();
@@ -1409,61 +1416,45 @@ const clearWindow = (_redrawFlg = false, _customDisplayName = ``) => {
1409
1416
  l1ctx.stroke();
1410
1417
  }
1411
1418
  if (document.querySelector(`#layer2`) !== null) {
1412
- const layer2 = document.querySelector(`#layer2`);
1413
- const l2ctx = layer2.getContext(`2d`);
1414
- layer2.width = g_sWidth;
1415
- l2ctx.clearRect(0, 0, g_sWidth, g_sHeight);
1419
+ getLayerWithClear(`layer2`);
1416
1420
  }
1417
- }
1418
1421
 
1419
- // ボタン、オブジェクトをクリア (divRoot配下のもの)
1420
- deleteChildspriteAll(`divRoot`);
1422
+ if (_redrawFlg) {
1423
+ // 画面背景を指定 (background-color)
1424
+ $id(`canvas-frame`).width = `${g_sWidth + diffX}px`;
1425
+ layer0.width = g_sWidth + diffX;
1426
+ const grd = l0ctx.createLinearGradient(0, 0, 0, g_sHeight);
1427
+ if (!g_headerObj[`customBack${_customDisplayName}Use`]) {
1428
+ grd.addColorStop(0, `#000000`);
1429
+ grd.addColorStop(1, `#222222`);
1430
+ l0ctx.fillStyle = grd;
1431
+ l0ctx.fillRect(0, 0, g_sWidth + diffX, g_sHeight);
1432
+ }
1433
+ }
1434
+ }
1421
1435
 
1422
1436
  // 背景を再描画
1423
1437
  if (_redrawFlg) {
1424
- drawDefaultBackImage(_customDisplayName);
1425
- }
1426
- };
1427
-
1428
- /**
1429
- * デフォルト背景画像の描画処理
1430
- * @param {string} _key メイン画面かどうか。Main:メイン画面、(空白):それ以外
1431
- */
1432
- const drawDefaultBackImage = _key => {
1433
-
1434
- g_btnAddFunc = {};
1435
- g_btnDeleteFlg = {};
1436
- g_cxtAddFunc = {};
1437
- g_cxtDeleteFlg = {};
1438
+ g_btnAddFunc = {};
1439
+ g_btnDeleteFlg = {};
1440
+ g_cxtAddFunc = {};
1441
+ g_cxtDeleteFlg = {};
1438
1442
 
1439
- // レイヤー情報取得
1440
- if (document.querySelector(`#layer0`) !== null) {
1441
- const layer0 = document.querySelector(`#layer0`);
1442
- const l0ctx = layer0.getContext(`2d`);
1443
+ if (document.querySelector(`#layer0`) === null ||
1444
+ (!g_headerObj[`customBack${_customDisplayName}Use`] && !g_headerObj.defaultSkinFlg)) {
1443
1445
 
1444
- // 画面背景を指定 (background-color)
1445
- const grd = l0ctx.createLinearGradient(0, 0, 0, g_sHeight);
1446
- if (!g_headerObj[`customBack${_key}Use`]) {
1447
- grd.addColorStop(0, `#000000`);
1448
- grd.addColorStop(1, `#222222`);
1449
- l0ctx.fillStyle = grd;
1450
- l0ctx.fillRect(0, 0, g_sWidth, g_sHeight);
1451
-
1452
- if (!g_headerObj.defaultSkinFlg) {
1453
- createEmptySprite(divRoot, `divBack`);
1454
- }
1446
+ $id(`canvas-frame`).width = `${g_sWidth + diffX}px`;
1447
+ createEmptySprite(divRoot, `divBack`, { w: g_sWidth + diffX });
1455
1448
  }
1456
- } else {
1457
- createEmptySprite(divRoot, `divBack`);
1458
- }
1459
1449
 
1460
- // CSSスタイルの初期化
1461
- Object.keys(g_cssBkProperties).forEach(prop =>
1462
- document.documentElement.style.setProperty(prop, g_cssBkProperties[prop]));
1450
+ // CSSスタイルの初期化
1451
+ Object.keys(g_cssBkProperties).forEach(prop =>
1452
+ document.documentElement.style.setProperty(prop, g_cssBkProperties[prop]));
1463
1453
 
1464
- Object.keys(g_headerObj).filter(val => val.startsWith(`--`) && hasVal(g_headerObj[val])).forEach(prop =>
1465
- document.documentElement.style.setProperty(prop, getCssCustomProperty(prop, g_headerObj[prop])));
1454
+ Object.keys(g_headerObj).filter(val => val.startsWith(`--`) && hasVal(g_headerObj[val])).forEach(prop =>
1455
+ document.documentElement.style.setProperty(prop, getCssCustomProperty(prop, g_headerObj[prop])));
1466
1456
 
1457
+ }
1467
1458
  };
1468
1459
 
1469
1460
  /**
@@ -2649,7 +2640,7 @@ const preheaderConvert = _dosObj => {
2649
2640
  // 外部スキンファイルの指定
2650
2641
  const tmpSkinType = _dosObj.skinType ?? g_presetObj.skinType ?? `default`;
2651
2642
  const tmpSkinTypes = tmpSkinType.split(`,`);
2652
- obj.defaultSkinFlg = tmpSkinTypes.includes(`default`);
2643
+ obj.defaultSkinFlg = tmpSkinTypes.includes(`default`) && setBoolVal(_dosObj.bgCanvasUse ?? g_presetObj.bgCanvasUse, true);
2653
2644
  setJsFiles(tmpSkinTypes, C_DIR_SKIN, `skin`);
2654
2645
 
2655
2646
  // 外部jsファイルの指定
@@ -3267,6 +3258,16 @@ const headerConvert = _dosObj => {
3267
3258
  // プレイ中クレジットを表示しないエリアのサイズ(X方向)
3268
3259
  obj.customViewWidth = setVal(_dosObj.customViewWidth ?? _dosObj.customCreditWidth, 0, C_TYP_FLOAT);
3269
3260
 
3261
+ // ショートカットキーが既定値ではない場合の左右の拡張エリアのサイズ
3262
+ if (hasVal(_dosObj.scArea)) {
3263
+ const tmp = _dosObj.scArea.split(`,`);
3264
+ obj.scAreaWidth = setVal(tmp[0], 0, C_TYP_FLOAT);
3265
+ obj.playingLayout = tmp[1] !== `left`;
3266
+ } else {
3267
+ obj.scAreaWidth = g_presetObj.scAreaWidth ?? 0;
3268
+ obj.playingLayout = g_presetObj.playingLayout ?? true;
3269
+ }
3270
+
3270
3271
  // ジャストフレームの設定 (ローカル: 0フレーム, リモートサーバ上: 1フレーム以内)
3271
3272
  obj.justFrames = (g_isLocal) ? 0 : 1;
3272
3273
 
@@ -3274,6 +3275,9 @@ const headerConvert = _dosObj => {
3274
3275
  const resultFormatDefault = `【#danoni[hashTag]】[musicTitle]([keyLabel]) /[maker] /Rank:[rank]/Score:[score]/Playstyle:[playStyle]/[arrowJdg]/[frzJdg]/[maxCombo] [url]`;
3275
3276
  obj.resultFormat = escapeHtmlForEnabledTag(_dosObj.resultFormat ?? g_presetObj.resultFormat ?? resultFormatDefault);
3276
3277
 
3278
+ // リザルト画像データのカスタム設定
3279
+ obj.resultValsView = _dosObj.resultValsView?.split(`,`) ?? g_presetObj.resultValsView ?? Array.from(Object.keys(g_presetObj.resultVals ?? {}));
3280
+
3277
3281
  // フェードイン時にそれ以前のデータを蓄積しない種別(word, back, mask)を指定
3278
3282
  obj.unStockCategories = (_dosObj.unStockCategory ?? ``).split(`,`);
3279
3283
  if (g_presetObj.unStockCategories !== undefined) {
@@ -3693,6 +3697,22 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
3693
3697
  return _str;
3694
3698
  };
3695
3699
 
3700
+ /**
3701
+ * divMaxX, posXの下段補完処理
3702
+ * ・divXの1番目の指定があるとき、その値を元に下段の位置を補完
3703
+ * 例) |div11x=7,b6|pos11x=0,1,2,3,4,5,6,b0,b1,b5,b6|
3704
+ * -> |div11x=7,13|pos11x=0,1,2,3,4,5,6,7,8,12,13|
3705
+ * @param {number} _num
3706
+ * @param {number} _divNum
3707
+ * @returns
3708
+ */
3709
+ const getKeyPosNum = (_num, _divNum = 0) => {
3710
+ if (!hasVal(_num) || (!_num.startsWith(`b`) && isNaN(parseFloat(_num)))) {
3711
+ return _num;
3712
+ }
3713
+ return _num.startsWith(`b`) ? parseFloat(_num.slice(1)) + _divNum : parseFloat(_num);
3714
+ }
3715
+
3696
3716
  /**
3697
3717
  * 新キー用複合パラメータ
3698
3718
  * @param {string} _key キー数
@@ -3888,9 +3908,6 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
3888
3908
  // 矢印の回転量指定、キャラクタパターン (stepRtnX_Y)
3889
3909
  newKeyTripleParam(newKey, `stepRtn`);
3890
3910
 
3891
- // ステップゾーン位置 (posX_Y)
3892
- newKeyMultiParam(newKey, `pos`, toFloat);
3893
-
3894
3911
  // 各キーの区切り位置 (divX_Y)
3895
3912
  _dosObj[`div${newKey}`]?.split(`$`).forEach((tmpDiv, k) => {
3896
3913
  const tmpDivPtn = tmpDiv.split(`,`);
@@ -3906,10 +3923,19 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
3906
3923
  } else {
3907
3924
  // それ以外の場合は指定された値を適用(未指定時はその後で指定)
3908
3925
  g_keyObj[`div${ptnName}`] = setVal(tmpDivPtn[0], undefined, C_TYP_NUMBER);
3909
- g_keyObj[`divMax${ptnName}`] = setVal(tmpDivPtn[1], undefined, C_TYP_FLOAT);
3926
+ g_keyObj[`divMax${ptnName}`] = setVal(getKeyPosNum(tmpDivPtn[1], g_keyObj[`div${ptnName}`]), undefined, C_TYP_FLOAT);
3910
3927
  }
3911
3928
  });
3912
3929
 
3930
+ // ステップゾーン位置 (posX_Y)
3931
+ newKeyMultiParam(newKey, `pos`, toFloat, {
3932
+ loopFunc: (k, keyheader) => {
3933
+ g_keyObj[`${keyheader}_${k + dfPtnNum}`].forEach((val, j) => {
3934
+ g_keyObj[`${keyheader}_${k + dfPtnNum}`][j] = getKeyPosNum(String(val), g_keyObj[`div${newKey}_${k + dfPtnNum}`]);
3935
+ });
3936
+ },
3937
+ });
3938
+
3913
3939
  // charaX_Y, posX_Y, keyGroupX_Y, divX_Y, divMaxX_Yが未指定の場合はkeyCtrlX_Yを元に適用
3914
3940
  for (let k = 0; k < g_keyObj.minPatterns; k++) {
3915
3941
  setKeyDfVal(`${newKey}_${k + dfPtnNum}`);
@@ -4285,8 +4311,8 @@ const makeWarningWindow = (_text = ``, { resetFlg = false, backBtnUse = false }
4285
4311
  * お知らせウィンドウ(汎用)を表示
4286
4312
  * @param {string} _text
4287
4313
  */
4288
- const makeInfoWindow = (_text, _animationName = ``, _backColor = `#ccccff`) => {
4289
- const lblWarning = setWindowStyle(`<p>${_text}</p>`, _backColor, `#000066`, C_ALIGN_CENTER);
4314
+ const makeInfoWindow = (_text, _animationName = ``, { _backColor = `#ccccff`, _x = 0 } = {}) => {
4315
+ const lblWarning = setWindowStyle(`<p>${_text}</p>`, _backColor, `#000066`, C_ALIGN_CENTER, { _x: _x });
4290
4316
  lblWarning.style.pointerEvents = C_DIS_NONE;
4291
4317
 
4292
4318
  if (_animationName !== ``) {
@@ -4305,7 +4331,7 @@ const makeInfoWindow = (_text, _animationName = ``, _backColor = `#ccccff`) => {
4305
4331
  * @param {string} _textColor
4306
4332
  * @param {string} _align
4307
4333
  */
4308
- const setWindowStyle = (_text, _bkColor, _textColor, _align = C_ALIGN_LEFT) => {
4334
+ const setWindowStyle = (_text, _bkColor, _textColor, _align = C_ALIGN_LEFT, { _x = 0 } = {}) => {
4309
4335
 
4310
4336
  deleteDiv(divRoot, `lblWarning`);
4311
4337
 
@@ -4322,7 +4348,7 @@ const setWindowStyle = (_text, _bkColor, _textColor, _align = C_ALIGN_LEFT) => {
4322
4348
  const warnHeight = Math.min(150, Math.max(range.getClientRects().length,
4323
4349
  _text.split(`<br>`).length + _text.split(`<p>`).length - 1) * 21);
4324
4350
  const lbl = createDivCss2Label(`lblWarning`, _text, {
4325
- x: 0, y: 70, w: g_sWidth, h: warnHeight, siz: g_limitObj.mainSiz, backgroundColor: _bkColor,
4351
+ x: _x, y: 70, w: g_sWidth, h: warnHeight, siz: g_limitObj.mainSiz, backgroundColor: _bkColor,
4326
4352
  opacity: 0.9, lineHeight: `15px`, color: _textColor, align: _align, fontFamily: getBasicFont(),
4327
4353
  whiteSpace: `normal`,
4328
4354
  });
@@ -6926,7 +6952,7 @@ const loadMusic = _ => {
6926
6952
  lblLoading.textContent = g_lblNameObj.pleaseWait;
6927
6953
  setAudio(blobUrl);
6928
6954
  } else {
6929
- makeWarningWindow(`${g_msgInfoObj.E_0041.split('{0}').join(getFullPath(musicUrl))}<br>(${request.status} ${request.statusText})`, { backBtnUse: true });
6955
+ makeWarningWindow(`${g_msgInfoObj.E_0041.split('{0}').join(getFullPath(url))}<br>(${request.status} ${request.statusText})`, { backBtnUse: true });
6930
6956
  }
6931
6957
  });
6932
6958
 
@@ -8599,6 +8625,8 @@ const getArrowSettings = _ => {
8599
8625
  g_workObj.lifeVal = Math.floor(g_workObj.lifeInit * 100) / 100;
8600
8626
  g_gameOverFlg = false;
8601
8627
  g_finishFlg = true;
8628
+ g_workObj.nonDefaultSc = g_headerObj.keyRetry !== C_KEY_RETRY || g_headerObj.keyTitleBack !== C_KEY_TITLEBACK;
8629
+ g_workObj.playingX = g_headerObj.playingX + (g_workObj.nonDefaultSc && g_headerObj.playingLayout ? g_headerObj.scAreaWidth : 0);
8602
8630
 
8603
8631
  if (g_stateObj.dataSaveFlg) {
8604
8632
  // ローカルストレージへAdjustment, HitPosition, Volume設定を保存
@@ -8717,14 +8745,14 @@ const mainInit = _ => {
8717
8745
 
8718
8746
  // ステップゾーン、矢印のメインスプライトを作成
8719
8747
  const mainSprite = createEmptySprite(divRoot, `mainSprite`, {
8720
- x: g_headerObj.playingX, y: g_posObj.stepY - C_STEP_Y, w: g_headerObj.playingWidth, transform: `scale(${g_keyObj.scale})`,
8748
+ x: g_workObj.playingX, y: g_posObj.stepY - C_STEP_Y, w: g_headerObj.playingWidth, transform: `scale(${g_keyObj.scale})`,
8721
8749
  });
8722
8750
 
8723
8751
  // 曲情報・判定カウント用スプライトを作成(メインスプライトより上位)
8724
- const infoSprite = createEmptySprite(divRoot, `infoSprite`, { x: g_headerObj.playingX, w: g_headerObj.playingWidth });
8752
+ const infoSprite = createEmptySprite(divRoot, `infoSprite`, { x: g_workObj.playingX, w: g_headerObj.playingWidth });
8725
8753
 
8726
8754
  // 判定系スプライトを作成(メインスプライトより上位)
8727
- const judgeSprite = createEmptySprite(divRoot, `judgeSprite`, { x: g_headerObj.playingX, w: g_headerObj.playingWidth });
8755
+ const judgeSprite = createEmptySprite(divRoot, `judgeSprite`, { x: g_workObj.playingX, w: g_headerObj.playingWidth });
8728
8756
 
8729
8757
  const tkObj = getKeyInfo();
8730
8758
  const [keyCtrlPtn, keyNum] = [tkObj.keyCtrlPtn, tkObj.keyNum];
@@ -8997,6 +9025,23 @@ const mainInit = _ => {
8997
9025
  createDivCss2Label(`lblTime2`, `/ ${fullTime}`, Object.assign(g_lblPosObj.lblTime2, { display: g_workObj.musicinfoDisp })),
8998
9026
  );
8999
9027
 
9028
+ if (g_workObj.nonDefaultSc) {
9029
+ multiAppend(infoSprite,
9030
+ createDivCss2Label(`lblRetry`, `[${g_lblNameObj.l_retry}]`, Object.assign(g_lblPosObj.lblMainScHeader, { y: g_sHeight - 65 })),
9031
+ );
9032
+ multiAppend(infoSprite,
9033
+ createDivCss2Label(`lblRetrySc`, g_kCd[g_headerObj.keyRetry],
9034
+ Object.assign(g_lblPosObj.lblMainScKey, { y: g_sHeight - 50, fontWeight: g_headerObj.keyRetry === C_KEY_RETRY ? `normal` : `bold` })),
9035
+ );
9036
+ multiAppend(infoSprite,
9037
+ createDivCss2Label(`lblTitleBack`, `[${g_lblNameObj.l_titleBack}]`, Object.assign(g_lblPosObj.lblMainScHeader, { y: g_sHeight - 35 })),
9038
+ );
9039
+ multiAppend(infoSprite,
9040
+ createDivCss2Label(`lblTitleBackSc`, g_isMac ? `Shift+${g_kCd[g_headerObj.keyRetry]}` : g_kCd[g_headerObj.keyTitleBack],
9041
+ Object.assign(g_lblPosObj.lblMainScKey, { y: g_sHeight - 20, fontWeight: g_headerObj.keyTitleBack === C_KEY_TITLEBACK ? `normal` : `bold` })),
9042
+ );
9043
+ }
9044
+
9000
9045
  // ボーダーライン表示
9001
9046
  lifeBorderObj.textContent = g_workObj.lifeBorder;
9002
9047
  if (g_stateObj.lifeBorder === 0 || g_workObj.lifeVal === g_headerObj.maxLifeVal) {
@@ -9018,7 +9063,6 @@ const mainInit = _ => {
9018
9063
  jdgY[0] += g_diffObj.arrowJdgY;
9019
9064
  jdgY[1] += g_diffObj.frzJdgY;
9020
9065
  }
9021
- const jdgCombos = [`kita`, `ii`];
9022
9066
 
9023
9067
  jdgGroups.forEach((jdg, j) => {
9024
9068
  // キャラクタ表示
@@ -9057,7 +9101,7 @@ const mainInit = _ => {
9057
9101
  MCombo: [`combo`, 5], Kita: [`kita`, 7], Iknai: [`iknai`, 8], FCombo: [`combo`, 9],
9058
9102
  };
9059
9103
  Object.keys(jdgMainScoreObj).forEach(jdgScore =>
9060
- infoSprite.appendChild(makeCounterSymbol(`lbl${jdgScore}`, g_headerObj.playingWidth - 110,
9104
+ infoSprite.appendChild(makeCounterSymbol(`lbl${jdgScore}`, g_headerObj.playingWidth - 110 + (g_workObj.nonDefaultSc ? g_headerObj.scAreaWidth : 0),
9061
9105
  g_cssObj[`common_${jdgMainScoreObj[jdgScore][0]}`], jdgMainScoreObj[jdgScore][1] + 1, 0, g_workObj.scoreDisp)));
9062
9106
 
9063
9107
  // パーフェクト演出
@@ -9086,7 +9130,7 @@ const mainInit = _ => {
9086
9130
 
9087
9131
  divRoot.appendChild(
9088
9132
  createDivCss2Label(`lblReady`, readyHtml, {
9089
- x: g_headerObj.playingX + (g_headerObj.playingWidth - g_sWidth) / 2,
9133
+ x: g_workObj.playingX + (g_headerObj.playingWidth - g_sWidth) / 2,
9090
9134
  y: (g_sHeight + g_posObj.stepYR) / 2 - 75,
9091
9135
  w: g_sWidth, h: 50, siz: 40,
9092
9136
  animationDuration: `${g_headerObj.readyAnimationFrame / g_fps}s`,
@@ -9097,7 +9141,7 @@ const mainInit = _ => {
9097
9141
  }
9098
9142
 
9099
9143
  if (getMusicUrl(g_stateObj.scoreId) === `nosound.mp3`) {
9100
- makeInfoWindow(g_msgInfoObj.I_0004, `leftToRightFade`);
9144
+ makeInfoWindow(g_msgInfoObj.I_0004, `leftToRightFade`, { _x: g_workObj.playingX });
9101
9145
  }
9102
9146
 
9103
9147
  // ユーザカスタムイベント(初期)
@@ -10931,6 +10975,12 @@ const resultInit = _ => {
10931
10975
  drawText(g_lblNameObj.j_excessive, { x: 240, hy: 10, color: `#ffff99` });
10932
10976
  drawText(g_resultObj.excessive, { x: 360, hy: 10, align: C_ALIGN_RIGHT });
10933
10977
  }
10978
+ g_headerObj.resultValsView
10979
+ .filter(key => hasVal(g_resultObj[g_presetObj.resultVals[key]]))
10980
+ .forEach((key, j) => {
10981
+ drawText(g_presetObj.resultVals[key], { x: 240, hy: j + 12, color: `#ffffff` });
10982
+ drawText(g_resultObj[g_presetObj.resultVals[key]], { x: 360, hy: j + 12, align: C_ALIGN_RIGHT });
10983
+ });
10934
10984
  }
10935
10985
  drawText(rankMark, { x: 240, hy: 18, siz: 50, color: rankColor, font: `"Bookman Old Style"` });
10936
10986
  drawText(baseTwitUrl, { hy: 19, siz: 8 });
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2023/08/03 (v33.1.0)
8
+ * Revised : 2023/08/27 (v33.4.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -400,6 +400,12 @@ const updateWindowSiz = _ => {
400
400
  musicInfoOFF: {
401
401
  x: 20, animationDuration: `4.0s`, animationName: `leftToRightFade`, animationFillMode: `both`,
402
402
  },
403
+ lblMainScHeader: {
404
+ x: g_sWidth + g_headerObj.scAreaWidth - 85, w: 80, h: 20, siz: 12, align: C_ALIGN_RIGHT,
405
+ },
406
+ lblMainScKey: {
407
+ x: g_sWidth + g_headerObj.scAreaWidth - 85, w: 80, h: 20, siz: 12, align: C_ALIGN_RIGHT,
408
+ },
403
409
 
404
410
  /** 結果画面 */
405
411
  lblRank: {
@@ -2853,6 +2859,9 @@ const g_lang_lblNameObj = {
2853
2859
  j_adj: `推定Adj`,
2854
2860
  j_excessive: `Excessive`,
2855
2861
 
2862
+ l_retry: `リトライ`,
2863
+ l_titleBack: `タイトルバック`,
2864
+
2856
2865
  helpUrl: `https://github.com/cwtickle/danoniplus/wiki/AboutGameSystem`,
2857
2866
  securityUrl: `https://github.com/cwtickle/danoniplus/security/policy`,
2858
2867
  },
@@ -2887,6 +2896,9 @@ const g_lang_lblNameObj = {
2887
2896
  j_adj: `Est-Adj.`,
2888
2897
  j_excessive: `Excessive`,
2889
2898
 
2899
+ l_retry: `Retry`,
2900
+ l_titleBack: `Go to title`,
2901
+
2890
2902
  helpUrl: `https://github.com/cwtickle/danoniplus-docs/wiki/AboutGameSystem`,
2891
2903
  securityUrl: `https://github.com/cwtickle/danoniplus-docs/wiki/SecurityPolicy`,
2892
2904
  },
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
  /**
3
3
  * Dancing☆Onigiri 設定用jsファイル
4
- * Template Update: 2023/06/24 (v32.5.0)
4
+ * Template Update: 2023/08/27 (v33.4.0)
5
5
  *
6
6
  * このファイルでは、作品全体に対しての初期設定を行うことができます。
7
7
  * 譜面データ側で個別に同様の項目が設定されている場合は、譜面データ側の設定が優先されます。
@@ -42,6 +42,9 @@ g_presetObj.tuningUrl = `https://www.google.co.jp/`;
42
42
  /** 既定スキン (デフォルトは default) */
43
43
  g_presetObj.skinType = `default`;
44
44
 
45
+ /** skinTypeがdefaultのとき、Canvas背景を有効にするかどうかのフラグ (デフォルトは有効(true)。falseで無効化) */
46
+ //g_presetObj.bgCanvasUse = false;
47
+
45
48
  /** 既定カスタムJs (デフォルトは danoni_custom.js) */
46
49
  //g_presetObj.customJs = `danoni_custom.js,danoni_init.js`;
47
50
 
@@ -115,9 +118,9 @@ g_presetObj.gaugeList = {
115
118
 
116
119
  /**
117
120
  空押し判定を行うか
118
- 判定させる場合は `true` を指定
121
+ 判定させる場合は true を指定
119
122
  */
120
- g_presetObj.excessiveJdgUse = `false`;
123
+ g_presetObj.excessiveJdgUse = false;
121
124
 
122
125
 
123
126
  /*
@@ -139,9 +142,9 @@ g_presetObj.frzColors = true;
139
142
 
140
143
  /**
141
144
  フリーズアローの始点で通常矢印の判定を行うか(dotさんソース方式)
142
- 判定させる場合は `true` を指定
145
+ 判定させる場合は true を指定
143
146
  */
144
- g_presetObj.frzStartjdgUse = `false`;
147
+ g_presetObj.frzStartjdgUse = false;
145
148
 
146
149
  /*
147
150
  ------------------------------------------------------------------------
@@ -151,14 +154,14 @@ g_presetObj.frzStartjdgUse = `false`;
151
154
  */
152
155
 
153
156
  // デフォルトのデザインを使用せず、独自のデザインを使用するかを指定
154
- // カスタムデザインにする場合は `true` を指定
157
+ // カスタムデザインにする場合は true を指定
155
158
  g_presetObj.customDesignUse = {
156
- title: `false`,
157
- titleArrow: `false`,
158
- titleAnimation: `false`,
159
- back: `false`,
160
- backMain: `false`,
161
- ready: `false`,
159
+ title: false,
160
+ titleArrow: false,
161
+ titleAnimation: false,
162
+ back: false,
163
+ backMain: false,
164
+ ready: false,
162
165
  };
163
166
 
164
167
  /**
@@ -212,6 +215,7 @@ g_presetObj.customDesignUse = {
212
215
  /**
213
216
  オプション利用設定(デフォルト)
214
217
  一律使用させたくない場合は `false` を指定(デフォルトは `true`)
218
+ Display設定の場合は `true,OFF`(設定は有効だが初期値はOFF)といったことができる
215
219
  */
216
220
  g_presetObj.settingUse = {
217
221
  motion: `true`,
@@ -274,6 +278,19 @@ g_presetObj.stockForceDelList = {
274
278
  mask: [],
275
279
  };
276
280
 
281
+ /**
282
+ * ショートカットキーが既定と異なる場合に表示する
283
+ * ショートカットキーエリア用に、プレイ時のみ左右に拡張するサイズの設定
284
+ * - 表示内容が収まるサイズは80px
285
+ * - 下記のplayingLayoutの設定により拡張幅が変わる (center: 左右両方拡張, left: 右のみ拡張)
286
+ */
287
+ //g_presetObj.scAreaWidth = 80;
288
+
289
+ /**
290
+ * プレイ画面の表示レイアウト (既定: center)
291
+ * - 現状影響する範囲は「scAreaWidth」の設定のみ
292
+ */
293
+ //g_presetObj.playingLayout = `left`;
277
294
 
278
295
  /*
279
296
  ------------------------------------------------------------------------
@@ -313,6 +330,11 @@ g_presetObj.resultVals = {
313
330
  // exScore: `exScore`,
314
331
  };
315
332
 
333
+ /*
334
+ リザルトカスタムデータの表示設定
335
+ g_presetObj.resultVals から、リザルト画像データに表示したい項目を列挙します。
336
+ */
337
+ //g_presetObj.resultValsView = [`exScore`];
316
338
 
317
339
  /*
318
340
  ------------------------------------------------------------------------
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "33.2.0",
3
+ "version": "33.4.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {