danoniplus 41.0.2 → 41.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/js/danoni_main.js +68 -26
  2. package/package.json +1 -1
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 : 2025/04/21
7
+ * Revised : 2025/05/05
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 41.0.2`;
12
- const g_revisedDate = `2025/04/21`;
11
+ const g_version = `Ver 41.1.0`;
12
+ const g_revisedDate = `2025/05/05`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -2601,7 +2601,8 @@ const initialControl = async () => {
2601
2601
  g_customJsObj.preTitle.forEach(func => func());
2602
2602
  const queryMusicId = getQueryParamVal(`musicId`);
2603
2603
  g_settings.musicIdxNum = queryMusicId !== null ? Number(queryMusicId) :
2604
- g_headerObj.musicNos[g_stateObj.scoreId] || g_headerObj.musicNos[0];
2604
+ g_headerObj.musicGroups?.[g_headerObj.musicNos[g_stateObj.scoreId]] ??
2605
+ g_headerObj.musicNos[g_stateObj.scoreId] ?? g_headerObj.musicNos[0];
2605
2606
  titleInit(true);
2606
2607
 
2607
2608
  // 未使用のg_keyObjプロパティを削除
@@ -3583,6 +3584,19 @@ const headerConvert = _dosObj => {
3583
3584
  obj.musicNos = fillArray(obj.keyLabels.length);
3584
3585
  }
3585
3586
 
3587
+ // 楽曲別のグループ化設定(選曲モードのみ)
3588
+ if (hasVal(_dosObj.musicGroup)) {
3589
+ obj.musicGroups = _dosObj.musicGroup.split(`,`)
3590
+ .map((val, j) => setVal(val, j, C_TYP_NUMBER))
3591
+ .map((val, j) => val < 0 ? j + val : val);
3592
+ for (let k = obj.musicGroups.length; k <= Math.max(...obj.musicNos); k++) {
3593
+ obj.musicGroups[k] = k;
3594
+ }
3595
+ obj.musicIdxList = makeDedupliArray(obj.musicGroups);
3596
+ } else {
3597
+ obj.musicIdxList = [...Array(Math.max(...obj.musicNos) + 1).keys()];
3598
+ }
3599
+
3586
3600
  // 譜面変更セレクターの利用有無
3587
3601
  obj.difSelectorUse = getDifSelectorUse(_dosObj.difSelectorUse, obj.viewLists);
3588
3602
 
@@ -4874,7 +4888,7 @@ const titleInit = (_initFlg = false) => {
4874
4888
  if (getQueryParamVal(`scoreId`) !== null) {
4875
4889
  g_headerObj.viewLists = [];
4876
4890
  g_headerObj.musicNos.forEach((val, j) => {
4877
- if (val === g_settings.musicIdxNum) {
4891
+ if ((g_headerObj.musicGroups?.[val] ?? val) === g_settings.musicIdxNum) {
4878
4892
  g_headerObj.viewLists.push(j);
4879
4893
  tmpCreatorList.push(g_headerObj.creatorNames[j]);
4880
4894
  }
@@ -4893,8 +4907,6 @@ const titleInit = (_initFlg = false) => {
4893
4907
 
4894
4908
  // 選曲画面の初期化
4895
4909
  const wheelCycle = 2;
4896
- const musicMaxIdx = Math.max(...g_headerObj.musicNos);
4897
- const musicIdxTmpList = [...Array(musicMaxIdx + 1).keys()];
4898
4910
 
4899
4911
  /**
4900
4912
  * メイン以外の選曲ボタンの作成
@@ -4931,7 +4943,7 @@ const titleInit = (_initFlg = false) => {
4931
4943
  createCss2Button(`btnMusicSelectNext`, `↓`, () => changeMSelect(1),
4932
4944
  g_lblPosObj.btnMusicSelectNext, g_cssObj.button_Setting),
4933
4945
  createCss2Button(`btnMusicSelectRandom`, `Random`, () =>
4934
- changeMSelect(Math.floor(Math.random() * musicIdxTmpList.length)),
4946
+ changeMSelect(g_headerObj.musicIdxList[Math.floor(Math.random() * g_headerObj.musicIdxList.length)]),
4935
4947
  g_lblPosObj.btnMusicSelectRandom, g_cssObj.button_Default),
4936
4948
  createDivCss2Label(`lblMusicCnt`, ``, g_lblPosObj.lblMusicCnt),
4937
4949
  createDivCss2Label(`lblComment`, ``, g_lblPosObj.lblComment_music),
@@ -4940,8 +4952,23 @@ const titleInit = (_initFlg = false) => {
4940
4952
 
4941
4953
  let wheelCnt = 0;
4942
4954
  wheelHandler = g_handler.addListener(divRoot, `wheel`, e => {
4955
+
4956
+ // コメント欄(lblComment)のスクロール可能性をチェック
4957
+ const isScrollable = lblComment.scrollHeight > lblComment.clientHeight;
4958
+
4959
+ // マウスがコメント欄上にあり、スクロールが可能ならイベントをスキップ
4960
+ if (lblComment.contains(e.target) && isScrollable) {
4961
+ // スクロール位置の判定
4962
+ const atTop = lblComment.scrollTop === 0 && e.deltaY < 0;
4963
+ const atBottom = (lblComment.scrollTop + lblComment.clientHeight >= lblComment.scrollHeight) && e.deltaY > 0;
4964
+
4965
+ // スクロール可能&上端または下端ではないなら処理をスキップ
4966
+ if (!atTop && !atBottom) {
4967
+ return;
4968
+ }
4969
+ }
4970
+ e.preventDefault();
4943
4971
  if (g_stateObj.keyInitial && wheelCnt === 0) {
4944
- e.preventDefault();
4945
4972
  changeMSelect(e.deltaY > 0 ? 1 : -1);
4946
4973
  }
4947
4974
  wheelCnt = (wheelCnt + 1) % wheelCycle;
@@ -5034,7 +5061,8 @@ const titleInit = (_initFlg = false) => {
5034
5061
  }, g_cssObj.button_Start),
5035
5062
 
5036
5063
  // 製作者表示
5037
- createCreditBtn(`lnkMaker`, `${g_lblNameObj.maker}: ${g_headerObj.musicSelectUse ? creatorName : g_headerObj.tuningInit}`, creatorUrl),
5064
+ createCreditBtn(`lnkMaker`, `${g_lblNameObj.maker}: ${g_headerObj.musicSelectUse ? creatorName : g_headerObj.tuningInit}`,
5065
+ g_headerObj.musicSelectUse ? creatorUrl : g_headerObj.creatorUrl),
5038
5066
 
5039
5067
  // アーティスト表示
5040
5068
  createCreditBtn(`lnkArtist`, `${g_lblNameObj.artist}: ${g_headerObj.artistNames[g_settings.musicIdxNum]}`, g_headerObj.artistUrls[g_settings.musicIdxNum]),
@@ -5257,12 +5285,10 @@ const getCreatorInfo = (_creatorList) => {
5257
5285
  */
5258
5286
  const changeMSelect = (_num, _initFlg = false) => {
5259
5287
  const limitedMLength = 35;
5260
- const musicMaxIdx = Math.max(...g_headerObj.musicNos);
5261
- const musicIdxTmpList = [...Array(musicMaxIdx + 1).keys()];
5262
5288
 
5263
5289
  // 選択方向に合わせて楽曲リスト情報を再取得
5264
5290
  for (let j = -g_settings.mSelectableTerms; j <= g_settings.mSelectableTerms; j++) {
5265
- const idx = (j + _num + g_settings.musicIdxNum + musicIdxTmpList.length * 10) % musicIdxTmpList.length;
5291
+ const idx = g_headerObj.musicIdxList[(j + _num + g_settings.musicIdxNum + g_headerObj.musicIdxList.length * 10) % g_headerObj.musicIdxList.length];
5266
5292
  if (j === 0) {
5267
5293
  } else {
5268
5294
  document.getElementById(`btnMusicSelect${j}`).style.fontSize =
@@ -5273,33 +5299,35 @@ const changeMSelect = (_num, _initFlg = false) => {
5273
5299
  }
5274
5300
  }
5275
5301
  // 現在選択中の楽曲IDを再設定
5276
- g_settings.musicIdxNum = (g_settings.musicIdxNum + _num + musicIdxTmpList.length) % musicIdxTmpList.length;
5302
+ g_settings.musicIdxNum = (g_settings.musicIdxNum + _num + g_headerObj.musicIdxList.length) % g_headerObj.musicIdxList.length;
5277
5303
 
5278
5304
  // 選択した楽曲に対応する譜面番号、製作者情報、曲長を取得
5279
5305
  g_headerObj.viewLists = [];
5280
- const tmpKeyList = [], tmpCreatorList = [], tmpPlayingFrameList = [];
5306
+ const tmpKeyList = [], tmpCreatorList = [], tmpPlayingFrameList = [], tmpBpmList = [];
5307
+ const targetIdx = g_headerObj.musicIdxList[(g_settings.musicIdxNum + g_headerObj.musicIdxList.length * 20) % g_headerObj.musicIdxList.length];
5281
5308
  g_headerObj.musicNos.forEach((val, j) => {
5282
- if (val === (g_settings.musicIdxNum + musicIdxTmpList.length * 20) %
5283
- musicIdxTmpList.length) {
5309
+ if ((g_headerObj.musicGroups?.[val] ?? val) === targetIdx) {
5284
5310
  g_headerObj.viewLists.push(j);
5285
5311
  tmpKeyList.push(g_headerObj.keyLabels[j]);
5286
5312
  tmpCreatorList.push(g_headerObj.creatorNames[j]);
5287
5313
  tmpPlayingFrameList.push(g_detailObj.playingFrameWithBlank[j]);
5314
+ tmpBpmList.push(g_headerObj.bpms[g_headerObj.musicNos[j]]);
5288
5315
  }
5289
5316
  });
5290
- const playingFrames = makeDedupliArray(tmpPlayingFrameList.sort((a, b) => a - b).map(val => transFrameToTimer(val))).join(`, `);
5317
+ const playingFrames = makeDedupliArray(tmpPlayingFrameList.map(val => transFrameToTimer(val))).join(`, `);
5318
+ const bpm = makeDedupliArray(tmpBpmList).join(`, `);
5291
5319
  const [creatorName, creatorUrl, creatorIdx] = getCreatorInfo(tmpCreatorList);
5292
5320
  const creatorLink = creatorIdx >= 0 ?
5293
5321
  `<a href="${creatorUrl}" target="_blank">${creatorName}</a>` : creatorName;
5294
5322
 
5295
5323
  // 選択した楽曲の情報表示
5296
- const idx = g_settings.musicIdxNum;
5324
+ const idx = g_headerObj.musicIdxList[g_settings.musicIdxNum];
5297
5325
  document.getElementById(`lblMusicSelect`).innerHTML =
5298
5326
  `<span style="font-size:${getFontSize(g_headerObj.musicTitlesForView[idx].join(`<br>`), g_btnWidth(1 / 2), getBasicFont(), 18)}px;` +
5299
5327
  `font-weight:bold">${g_headerObj.musicTitlesForView[idx].join(`<br>`)}</span>`;
5300
5328
  document.getElementById(`lblMusicSelectDetail`).innerHTML =
5301
5329
  `Maker: ${creatorLink} / Artist: <a href="${g_headerObj.artistUrls[idx]}" target="_blank">` +
5302
- `${g_headerObj.artistNames[idx]}</a><br>Duration: ${playingFrames} / BPM: ${g_headerObj.bpms[idx]}`;
5330
+ `${g_headerObj.artistNames[idx]}</a><br>Duration: ${playingFrames} / BPM: ${bpm}`;
5303
5331
 
5304
5332
  // 選択した楽曲で使われているキー種の一覧を作成
5305
5333
  deleteChildspriteAll(`keyTitleSprite`);
@@ -5311,7 +5339,7 @@ const changeMSelect = (_num, _initFlg = false) => {
5311
5339
 
5312
5340
 
5313
5341
  // 選択した楽曲の選択位置を表示
5314
- lblMusicCnt.innerHTML = `${g_settings.musicIdxNum + 1} / ${musicMaxIdx + 1}`;
5342
+ lblMusicCnt.innerHTML = `${g_settings.musicIdxNum + 1} / ${g_headerObj.musicIdxList.length}`;
5315
5343
 
5316
5344
  // 楽曲別のローカルストレージを再取得
5317
5345
  loadLocalStorage(g_settings.musicIdxNum);
@@ -5829,11 +5857,7 @@ const optionInit = () => {
5829
5857
  g_stateObj.filterKeys = ``;
5830
5858
 
5831
5859
  // 楽曲データの表示
5832
- let text = `♪` + (g_headerObj.musicSelectUse ? `${g_headerObj.musicTitles[g_settings.musicIdxNum]} / ` : ``) +
5833
- `BPM: ${g_headerObj.bpms[g_settings.musicIdxNum]}`;
5834
- if (!g_headerObj.musicSelectUse && g_headerObj.bpms[g_settings.musicIdxNum] === `----`) {
5835
- text = ``;
5836
- }
5860
+ const text = getMusicInfoView();
5837
5861
  divRoot.appendChild(createDivCss2Label(`lblMusicInfo`, text,
5838
5862
  Object.assign({ siz: getFontSize(text, g_btnWidth(3 / 4), getBasicFont(), 12) }, g_lblPosObj.lblMusicInfo)));
5839
5863
 
@@ -5857,6 +5881,20 @@ const optionInit = () => {
5857
5881
  g_skinJsObj.option.forEach(func => func());
5858
5882
  };
5859
5883
 
5884
+ /**
5885
+ * 設定画面に表示する楽曲・BPM情報の取得
5886
+ * @returns {string}
5887
+ */
5888
+ const getMusicInfoView = () => {
5889
+ const idx = g_headerObj.musicNos[g_stateObj.scoreId];
5890
+ let text = `♪` + (g_headerObj.musicSelectUse ? `${g_headerObj.musicTitles[idx]} / ` : ``) +
5891
+ `BPM: ${g_headerObj.bpms[idx]}`;
5892
+ if (!g_headerObj.musicSelectUse && g_headerObj.bpms[idx] === `----`) {
5893
+ text = ``;
5894
+ }
5895
+ return text;
5896
+ };
5897
+
5860
5898
  /**
5861
5899
  * 設定画面用スプライトリストの作成
5862
5900
  * @param {object} _settingList (設定名、縦位置、縦位置差分、幅差分、高さ差分)を設定別にリスト化
@@ -6685,6 +6723,10 @@ const setDifficulty = (_initFlg) => {
6685
6723
  makeHighScore(g_stateObj.scoreId);
6686
6724
  }
6687
6725
 
6726
+ // 楽曲データの表示
6727
+ lblMusicInfo.textContent = getMusicInfoView();
6728
+ lblMusicInfo.style.fontSize = wUnit(getFontSize(lblMusicInfo.textContent, g_btnWidth(3 / 4), getBasicFont(), 12));
6729
+
6688
6730
  // ユーザカスタムイベント(初期)
6689
6731
  g_customJsObj.difficulty.forEach(func => func(_initFlg, g_canLoadDifInfoFlg));
6690
6732
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "41.0.2",
3
+ "version": "41.1.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "scripts": {