danoniplus 47.2.0 → 47.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 +118 -66
- package/js/lib/danoni_constants.js +3 -3
- 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 : 2026/04/
|
|
7
|
+
* Revised : 2026/04/26
|
|
8
8
|
*
|
|
9
9
|
* https://github.com/cwtickle/danoniplus
|
|
10
10
|
*/
|
|
11
|
-
const g_version = `Ver 47.
|
|
12
|
-
const g_revisedDate = `2026/04/
|
|
11
|
+
const g_version = `Ver 47.4.0`;
|
|
12
|
+
const g_revisedDate = `2026/04/26`;
|
|
13
13
|
|
|
14
14
|
// カスタム用バージョン (danoni_custom.js 等で指定可)
|
|
15
15
|
let g_localVersion = ``;
|
|
@@ -3451,7 +3451,11 @@ const createSplitCanvases = (_width, _totalHeight, _dpr) => {
|
|
|
3451
3451
|
|
|
3452
3452
|
/**
|
|
3453
3453
|
* 描画対象のCanvasを判定して描画を実行する
|
|
3454
|
-
* @param {
|
|
3454
|
+
* @param {object[]} _canvases
|
|
3455
|
+
* @param {HTMLCanvasElement} _canvases[].canvas 分割されたCanvas要素
|
|
3456
|
+
* @param {CanvasRenderingContext2D} _canvases[].ctx Canvasの描画コンテキスト
|
|
3457
|
+
* @param {number} _canvases[].offsetTop Canvasの論理上のオフセット位置
|
|
3458
|
+
* @param {number} _canvases[].logicalHeight Canvasの論理上の高さ
|
|
3455
3459
|
* @param {number} _y
|
|
3456
3460
|
* @param {number} _h
|
|
3457
3461
|
* @param {number} _dpr
|
|
@@ -7286,6 +7290,7 @@ const drawSpeedGraph = _scoreId => {
|
|
|
7286
7290
|
speed: { frame: [0], speed: [1], cnt: 0, strokeColor: g_graphColorObj.speed },
|
|
7287
7291
|
boost: { frame: [0], speed: [1], cnt: 0, strokeColor: g_graphColorObj.boost }
|
|
7288
7292
|
};
|
|
7293
|
+
const dpr = window.devicePixelRatio || 1;
|
|
7289
7294
|
|
|
7290
7295
|
const tmpSpeedPoint = [0];
|
|
7291
7296
|
Object.keys(speedObj).forEach(speedType => {
|
|
@@ -7890,7 +7895,7 @@ const drawMinimap = (_scoreId, { _initFlg = false, _fadeinFlg = false } = {}) =>
|
|
|
7890
7895
|
|
|
7891
7896
|
// --- ヘッダー部分 ---
|
|
7892
7897
|
const detailMiniMapHeader = createEmptySprite(detailMiniMap, `detailMiniMapHeader`, g_windowObj.detailMiniMapHeader);
|
|
7893
|
-
$id(`detailMiniMapHeader`).top = (g_stateObj.miniMapRevFlg ? 230 : 0) + `px`;
|
|
7898
|
+
$id(`detailMiniMapHeader`).top = (g_stateObj.miniMapRevFlg ? 230 + g_sHeight - 500 : 0) + `px`;
|
|
7894
7899
|
detailMiniMapHeader.appendChild(g_detailObj.scoreMinimapHeader[_scoreId]);
|
|
7895
7900
|
|
|
7896
7901
|
// --- メイン(譜面)部分 ---
|
|
@@ -8229,13 +8234,18 @@ const createOptionWindow = _sprite => {
|
|
|
8229
8234
|
const bkColor = window.getComputedStyle(textBaseObj, ``).backgroundColor;
|
|
8230
8235
|
|
|
8231
8236
|
graphObj.id = `graph${_name}${j > 0 ? j + 1 : ``}`;
|
|
8232
|
-
|
|
8233
|
-
graphObj.
|
|
8237
|
+
const dpr = window.devicePixelRatio || 1;
|
|
8238
|
+
graphObj.width = g_limitObj.graphWidth * dpr;
|
|
8239
|
+
graphObj.height = g_limitObj.graphHeight * dpr;
|
|
8240
|
+
graphObj.style.width = wUnit(g_limitObj.graphWidth);
|
|
8241
|
+
graphObj.style.height = wUnit(g_limitObj.graphHeight);
|
|
8234
8242
|
graphObj.style.left = wUnit(125);
|
|
8235
8243
|
graphObj.style.top = wUnit(0);
|
|
8236
8244
|
graphObj.style.position = `absolute`;
|
|
8237
8245
|
graphObj.style.background = j === 0 ? bkColor : `#ffffff00`;
|
|
8238
8246
|
graphObj.style.border = `dotted ${wUnit(2)}`;
|
|
8247
|
+
const ctx = graphObj.getContext(`2d`);
|
|
8248
|
+
ctx.scale(dpr, dpr);
|
|
8239
8249
|
|
|
8240
8250
|
detailObj.appendChild(graphObj);
|
|
8241
8251
|
}
|
|
@@ -11774,6 +11784,24 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
|
|
|
11774
11784
|
/** Motionの適用フレーム数 */
|
|
11775
11785
|
g_workObj.motionFrame = [];
|
|
11776
11786
|
|
|
11787
|
+
const boostData = [];
|
|
11788
|
+
if (hasArrayList(_dataObj.boostData, 2)) {
|
|
11789
|
+
const _data = _dataObj.boostData.concat();
|
|
11790
|
+
for (let k = 0; k < _data.length; k += 2) {
|
|
11791
|
+
boostData.push({ frame: _data[k], spd: getSpeedFactor(_data[k + 1]) });
|
|
11792
|
+
}
|
|
11793
|
+
if (boostData.length > 0 && boostData[0].frame > 0) {
|
|
11794
|
+
boostData.unshift({ frame: 0, spd: 1 });
|
|
11795
|
+
}
|
|
11796
|
+
}
|
|
11797
|
+
const getSpdByFrame = _targetFrame => {
|
|
11798
|
+
// targetFrame 以下の frame を持つ要素の中で、最後(最新)のものを見つける
|
|
11799
|
+
const result = boostData.findLast((item) => _targetFrame >= item.frame);
|
|
11800
|
+
|
|
11801
|
+
// 該当するものがない場合(frame: 0 未満など)のフォールバック
|
|
11802
|
+
return result ? result.spd : 1;
|
|
11803
|
+
};
|
|
11804
|
+
|
|
11777
11805
|
/**
|
|
11778
11806
|
* 矢印・フリーズアローのデータ格納処理
|
|
11779
11807
|
* @param {number} _j
|
|
@@ -11787,9 +11815,14 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
|
|
|
11787
11815
|
* @param {number} object.arrivalFrame
|
|
11788
11816
|
* @param {number} object.motionFrame
|
|
11789
11817
|
*/
|
|
11790
|
-
const setNotes = (_j, _k, _data, _startPoint, _header, _frzFlg = false, { initY, initBoostY, arrivalFrame, motionFrame } = {}) => {
|
|
11818
|
+
const setNotes = (_j, _k, _data, _startPoint, _header, _frzFlg = false, { initY, initBoostY, arrivalFrame, motionFrame, boostSpd } = {}) => {
|
|
11791
11819
|
if (_startPoint >= 0) {
|
|
11792
|
-
const arrowAttrs = {
|
|
11820
|
+
const arrowAttrs = {
|
|
11821
|
+
pos: _j, initY, initBoostY, arrivalFrame, motionFrame, boostSpd,
|
|
11822
|
+
get boostDir() {
|
|
11823
|
+
return Math.sign(this.boostSpd);
|
|
11824
|
+
}
|
|
11825
|
+
};
|
|
11793
11826
|
if (g_workObj[`mk${_header}Arrow`][_startPoint] === undefined) {
|
|
11794
11827
|
g_workObj[`mk${_header}Arrow`][_startPoint] = [arrowAttrs];
|
|
11795
11828
|
} else {
|
|
@@ -11848,12 +11881,15 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
|
|
|
11848
11881
|
g_workObj.arrivalFrame[frmPrev] = tmpObj.arrivalFrm;
|
|
11849
11882
|
g_workObj.motionFrame[frmPrev] = tmpObj.motionFrm;
|
|
11850
11883
|
g_workObj.initBoostY[frmPrev] = calcInitBoostY(frmPrev);
|
|
11884
|
+
let minNotesFrame = startPoint[lastk];
|
|
11851
11885
|
|
|
11852
11886
|
if (_frzFlg) {
|
|
11853
11887
|
g_workObj[`mk${camelHeader}Length`][_j] = [];
|
|
11854
11888
|
}
|
|
11855
|
-
setNotes(_j, lastk, _data, startPoint[lastk], camelHeader, _frzFlg,
|
|
11856
|
-
|
|
11889
|
+
setNotes(_j, lastk, _data, startPoint[lastk], camelHeader, _frzFlg, {
|
|
11890
|
+
initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev],
|
|
11891
|
+
arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm, boostSpd: getSpdByFrame(arrowArrivalFrm)
|
|
11892
|
+
});
|
|
11857
11893
|
|
|
11858
11894
|
// 矢印は1つずつ、フリーズアローは2つで1セット
|
|
11859
11895
|
for (let k = lastk - setcnt; k >= 0; k -= setcnt) {
|
|
@@ -11896,10 +11932,46 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
|
|
|
11896
11932
|
g_workObj.initBoostY[frmPrev] = calcInitBoostY(frmPrev);
|
|
11897
11933
|
}
|
|
11898
11934
|
|
|
11935
|
+
// --- 逆転検知ロジック ---
|
|
11936
|
+
// 後ろからループしているため、minNotesFrameには「自分より譜面上後ろにあるノーツ」の
|
|
11937
|
+
// 最小生成フレーム(最も早く出現するもの)が入っている。
|
|
11938
|
+
|
|
11939
|
+
// 「自分より後ろのノーツ」の方が、「自分」よりも早く出現する場合、
|
|
11940
|
+
// 配列の順序と出現時間の順序が入れ替わっている(逆転)とみなす。
|
|
11941
|
+
// 逆転している場合は、最小生成フレームまでさらに遡って、出現フレームを再計算する。
|
|
11942
|
+
if (minNotesFrame < startPoint[k]) {
|
|
11943
|
+
|
|
11944
|
+
const getAdjArrowStartFrame = (_obj, _speedOnFrame, _targetFrame) => {
|
|
11945
|
+
while (_obj.frm > _targetFrame) {
|
|
11946
|
+
_obj.startY += _speedOnFrame[_obj.frm - 1];
|
|
11947
|
+
|
|
11948
|
+
if (_speedOnFrame[_obj.frm - 1] !== 0) {
|
|
11949
|
+
_obj.motionFrm++;
|
|
11950
|
+
}
|
|
11951
|
+
_obj.frm--;
|
|
11952
|
+
_obj.arrivalFrm++;
|
|
11953
|
+
}
|
|
11954
|
+
return _obj;
|
|
11955
|
+
};
|
|
11956
|
+
tmpObj = getAdjArrowStartFrame(tmpObj, _speedOnFrame, minNotesFrame);
|
|
11957
|
+
startPoint[k] = tmpObj.frm;
|
|
11958
|
+
frmPrev = tmpObj.frm;
|
|
11959
|
+
g_workObj.initY[frmPrev] = tmpObj.startY;
|
|
11960
|
+
g_workObj.arrivalFrame[frmPrev] = tmpObj.arrivalFrm;
|
|
11961
|
+
g_workObj.motionFrame[frmPrev] = tmpObj.motionFrm;
|
|
11962
|
+
g_workObj.initBoostY[frmPrev] = calcInitBoostY(frmPrev);
|
|
11963
|
+
}
|
|
11964
|
+
|
|
11965
|
+
// 最小値を更新
|
|
11966
|
+
if (startPoint[k] < minNotesFrame) {
|
|
11967
|
+
minNotesFrame = startPoint[k];
|
|
11968
|
+
}
|
|
11969
|
+
|
|
11899
11970
|
// 出現タイミングを保存
|
|
11900
|
-
setNotes(_j, k, _data, startPoint[k], camelHeader, _frzFlg,
|
|
11901
|
-
|
|
11902
|
-
|
|
11971
|
+
setNotes(_j, k, _data, startPoint[k], camelHeader, _frzFlg, {
|
|
11972
|
+
initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev],
|
|
11973
|
+
arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm, boostSpd: getSpdByFrame(arrowArrivalFrm)
|
|
11974
|
+
});
|
|
11903
11975
|
}
|
|
11904
11976
|
};
|
|
11905
11977
|
|
|
@@ -11914,30 +11986,6 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
|
|
|
11914
11986
|
calcNotes(j, _dataObj.dummyFrzData[j], `dummyFrz`, true);
|
|
11915
11987
|
}
|
|
11916
11988
|
|
|
11917
|
-
// 個別加速のタイミング更新
|
|
11918
|
-
const calcBoostData = _data => {
|
|
11919
|
-
if (hasArrayList(_data, 2)) {
|
|
11920
|
-
let delIdx = 0;
|
|
11921
|
-
for (let k = _data.length - 2; k >= 0; k -= 2) {
|
|
11922
|
-
const tmpObj = getArrowStartFrame(_data[k], _speedOnFrame);
|
|
11923
|
-
if (tmpObj.frm < g_scoreObj.frameNum) {
|
|
11924
|
-
_data[k] = g_scoreObj.frameNum;
|
|
11925
|
-
delIdx = k;
|
|
11926
|
-
break;
|
|
11927
|
-
} else {
|
|
11928
|
-
_data[k] = tmpObj.frm;
|
|
11929
|
-
}
|
|
11930
|
-
_data[k + 1] = getSpeedFactor(_data[k + 1]);
|
|
11931
|
-
}
|
|
11932
|
-
for (let k = 0; k < delIdx; k++) {
|
|
11933
|
-
_data.shift();
|
|
11934
|
-
}
|
|
11935
|
-
return _data;
|
|
11936
|
-
}
|
|
11937
|
-
return [];
|
|
11938
|
-
};
|
|
11939
|
-
g_workObj.boostData = calcBoostData(_dataObj.boostData);
|
|
11940
|
-
|
|
11941
11989
|
/**
|
|
11942
11990
|
* 色変化・モーションデータ・スクロール反転データのタイミング更新
|
|
11943
11991
|
* - この関数を使用する場合、配列グループの先頭2つが「フレーム数、矢印番号」となっていないと動作しない
|
|
@@ -12998,10 +13046,8 @@ const mainInit = () => {
|
|
|
12998
13046
|
// EffectのArrowEffect追加処理
|
|
12999
13047
|
g_effectFunc.get(g_stateObj.effect)();
|
|
13000
13048
|
|
|
13001
|
-
//
|
|
13049
|
+
// 現在の矢印・フリーズアローの速度の初期化 (速度変化時に直す)
|
|
13002
13050
|
g_workObj.currentSpeed = 2;
|
|
13003
|
-
g_workObj.boostSpd = 1;
|
|
13004
|
-
g_workObj.boostDir = 1;
|
|
13005
13051
|
|
|
13006
13052
|
// 開始位置、楽曲再生位置の設定
|
|
13007
13053
|
const firstFrame = g_scoreObj.frameNum;
|
|
@@ -13672,8 +13718,8 @@ const mainInit = () => {
|
|
|
13672
13718
|
|
|
13673
13719
|
const arrowName = `${_name}${_j}_${_arrowCnt}`;
|
|
13674
13720
|
const stepY = C_STEP_Y + g_posObj.reverseStepY * dividePos;
|
|
13675
|
-
const firstPosY = stepY + (_attrs.initY *
|
|
13676
|
-
_attrs.initBoostY *
|
|
13721
|
+
const firstPosY = stepY + (_attrs.initY * _attrs.boostSpd +
|
|
13722
|
+
_attrs.initBoostY * _attrs.boostDir) * g_workObj.scrollDir[_j];
|
|
13677
13723
|
|
|
13678
13724
|
const arrowRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], arrowName, {
|
|
13679
13725
|
x: 0, y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH,
|
|
@@ -13687,13 +13733,13 @@ const mainInit = () => {
|
|
|
13687
13733
|
// 生存フレーム数 (ストップ分除去、個別加速/Motionオプション用)
|
|
13688
13734
|
boostCnt: _attrs.motionFrame,
|
|
13689
13735
|
// 個別加速量
|
|
13690
|
-
boostSpd:
|
|
13736
|
+
boostSpd: _attrs.boostSpd,
|
|
13691
13737
|
// ステップゾーン位置 (0: デフォルト, 1: リバース)
|
|
13692
13738
|
dividePos: dividePos,
|
|
13693
13739
|
// スクロール方向 (1: デフォルト, -1: リバース)
|
|
13694
13740
|
dir: g_workObj.scrollDir[_j],
|
|
13695
13741
|
// 個別加速方向 (1: 順方向加速, -1: 逆方向加速)
|
|
13696
|
-
boostDir:
|
|
13742
|
+
boostDir: _attrs.boostDir,
|
|
13697
13743
|
// 前フレーム時の位置 (判定で使用)
|
|
13698
13744
|
prevY: firstPosY,
|
|
13699
13745
|
// 現フレーム時の位置
|
|
@@ -13788,9 +13834,9 @@ const mainInit = () => {
|
|
|
13788
13834
|
const frzNo = `${_j}_${_arrowCnt}`;
|
|
13789
13835
|
const frzName = `${_name}${frzNo}`;
|
|
13790
13836
|
const stepY = C_STEP_Y + g_posObj.reverseStepY * dividePos;
|
|
13791
|
-
const firstPosY = stepY + (_attrs.initY *
|
|
13792
|
-
_attrs.initBoostY *
|
|
13793
|
-
const firstBarLength = g_workObj[`mk${toCapitalize(_name)}Length`][_j][(_arrowCnt - 1) * 2] *
|
|
13837
|
+
const firstPosY = stepY + (_attrs.initY * _attrs.boostSpd +
|
|
13838
|
+
_attrs.initBoostY * _attrs.boostDir) * g_workObj.scrollDir[_j];
|
|
13839
|
+
const firstBarLength = g_workObj[`mk${toCapitalize(_name)}Length`][_j][(_arrowCnt - 1) * 2] * _attrs.boostSpd;
|
|
13794
13840
|
|
|
13795
13841
|
const frzRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], frzName, {
|
|
13796
13842
|
x: 0, y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH + firstBarLength,
|
|
@@ -13818,13 +13864,13 @@ const mainInit = () => {
|
|
|
13818
13864
|
// キーを離していたフレーム数 (基準値超えでNG判定)
|
|
13819
13865
|
keyUpFrame: 0,
|
|
13820
13866
|
// 個別加速量
|
|
13821
|
-
boostSpd:
|
|
13867
|
+
boostSpd: _attrs.boostSpd,
|
|
13822
13868
|
// ステップゾーン位置 (0: デフォルト, 1: リバース)
|
|
13823
13869
|
dividePos: dividePos,
|
|
13824
13870
|
// スクロール方向 (1: デフォルト, -1: リバース)
|
|
13825
13871
|
dir: g_workObj.scrollDir[_j],
|
|
13826
13872
|
// 個別加速方向 (1: 順方向加速, -1: 逆方向加速)
|
|
13827
|
-
boostDir:
|
|
13873
|
+
boostDir: _attrs.boostDir,
|
|
13828
13874
|
// 現フレーム時のフリーズアロー本体の位置
|
|
13829
13875
|
y: firstPosY,
|
|
13830
13876
|
// フリーズアロー(帯)の相対位置
|
|
@@ -14036,11 +14082,6 @@ const mainInit = () => {
|
|
|
14036
14082
|
g_workObj.currentSpeed = g_workObj.speedData[speedCnts + 1];
|
|
14037
14083
|
speedCnts += 2;
|
|
14038
14084
|
}
|
|
14039
|
-
while (currentFrame >= g_workObj.boostData?.[boostCnts]) {
|
|
14040
|
-
g_workObj.boostSpd = g_workObj.boostData[boostCnts + 1];
|
|
14041
|
-
g_workObj.boostDir = (g_workObj.boostSpd > 0 ? 1 : -1);
|
|
14042
|
-
boostCnts += 2;
|
|
14043
|
-
}
|
|
14044
14085
|
|
|
14045
14086
|
objList.forEach(header => {
|
|
14046
14087
|
const headerU = toCapitalize(header);
|
|
@@ -15422,8 +15463,12 @@ const resultInit = () => {
|
|
|
15422
15463
|
for (let j = 0; j < 2; j++) {
|
|
15423
15464
|
const canvas = document.createElement(`canvas`);
|
|
15424
15465
|
canvas.id = `graphGaugeTransition${j > 0 ? j + 1 : ``}`;
|
|
15425
|
-
|
|
15426
|
-
canvas.
|
|
15466
|
+
const dpr = window.devicePixelRatio || 1;
|
|
15467
|
+
canvas.width = g_limitObj.gaugeTransitionWidth * dpr;
|
|
15468
|
+
canvas.height = g_limitObj.gaugeTransitionHeight * dpr;
|
|
15469
|
+
canvas.style.width = wUnit(g_limitObj.gaugeTransitionWidth);
|
|
15470
|
+
canvas.style.height = wUnit(g_limitObj.gaugeTransitionHeight);
|
|
15471
|
+
canvas.getContext(`2d`).scale(dpr, dpr);
|
|
15427
15472
|
canvas.style.left = wUnit(0);
|
|
15428
15473
|
canvas.style.top = wUnit(0);
|
|
15429
15474
|
canvas.style.position = `absolute`;
|
|
@@ -15550,13 +15595,14 @@ const resultInit = () => {
|
|
|
15550
15595
|
|
|
15551
15596
|
const canvas = document.getElementById(`graphGaugeTransition2`);
|
|
15552
15597
|
const ctx = canvas.getContext(`2d`);
|
|
15553
|
-
const
|
|
15554
|
-
|
|
15598
|
+
const [w, h] = [parseInt(canvas.style.width), parseInt(canvas.style.height)];
|
|
15599
|
+
const x = cursorFrame / playingFrame * w;
|
|
15600
|
+
ctx.clearRect(0, 0, w, h);
|
|
15555
15601
|
|
|
15556
15602
|
// 縦線
|
|
15557
15603
|
ctx.beginPath();
|
|
15558
15604
|
ctx.moveTo(x, 0);
|
|
15559
|
-
ctx.lineTo(x,
|
|
15605
|
+
ctx.lineTo(x, h);
|
|
15560
15606
|
ctx.strokeStyle = "#009999";
|
|
15561
15607
|
ctx.lineWidth = 1.5;
|
|
15562
15608
|
ctx.stroke();
|
|
@@ -15565,10 +15611,10 @@ const resultInit = () => {
|
|
|
15565
15611
|
const timer = transFrameToTimer(cursorFrame + startFrame);
|
|
15566
15612
|
ctx.font = `14px ${getBasicFont()}`;
|
|
15567
15613
|
ctx.fillStyle = "#009999";
|
|
15568
|
-
ctx.textAlign = x >
|
|
15614
|
+
ctx.textAlign = x > w * 0.8 ? C_ALIGN_RIGHT : C_ALIGN_LEFT;
|
|
15569
15615
|
ctx.fillText(
|
|
15570
15616
|
`${timer}`,
|
|
15571
|
-
x >
|
|
15617
|
+
x > w * 0.8 ? x - 5 : x + 5,
|
|
15572
15618
|
g_limitObj.gaugeTransitionHeight - 35
|
|
15573
15619
|
);
|
|
15574
15620
|
};
|
|
@@ -15733,22 +15779,28 @@ const resultInit = () => {
|
|
|
15733
15779
|
tmpDiv.style.background = `#000000cc`;
|
|
15734
15780
|
const canvas = document.createElement(`canvas`);
|
|
15735
15781
|
const artistName = g_headerObj.artistNames[g_headerObj.musicNos[g_stateObj.scoreId]] || g_headerObj.artistName;
|
|
15782
|
+
const dpr = window.devicePixelRatio || 1;
|
|
15783
|
+
const logicalWidth = 400;
|
|
15784
|
+
const logicalHeight = g_sHeight - 90;
|
|
15736
15785
|
|
|
15737
15786
|
canvas.id = `resultImage`;
|
|
15738
|
-
canvas.width =
|
|
15739
|
-
canvas.height =
|
|
15740
|
-
canvas.style.
|
|
15787
|
+
canvas.width = logicalWidth * dpr;
|
|
15788
|
+
canvas.height = logicalHeight * dpr;
|
|
15789
|
+
canvas.style.width = wUnit(logicalWidth);
|
|
15790
|
+
canvas.style.height = wUnit(logicalHeight);
|
|
15791
|
+
canvas.style.left = wUnit((g_sWidth - parseFloat(canvas.style.width)) / 2);
|
|
15741
15792
|
canvas.style.top = wUnit(20);
|
|
15742
15793
|
canvas.style.position = `absolute`;
|
|
15743
15794
|
|
|
15744
15795
|
const context = canvas.getContext(`2d`);
|
|
15796
|
+
context.scale(dpr, dpr);
|
|
15745
15797
|
const drawText = (_text, { x = 30, dy = 0, hy, siz = 15, color = `#cccccc`, align = C_ALIGN_LEFT, font } = {}) => {
|
|
15746
15798
|
context.font = `${wUnit(siz)} ${getBasicFont(font)}`;
|
|
15747
15799
|
context.fillStyle = color;
|
|
15748
15800
|
context.textAlign = align;
|
|
15749
15801
|
context.fillText(_text, x, 35 + hy * 18 + dy);
|
|
15750
15802
|
};
|
|
15751
|
-
makeBgCanvas(context, { h:
|
|
15803
|
+
makeBgCanvas(context, { w: logicalWidth, h: logicalHeight });
|
|
15752
15804
|
|
|
15753
15805
|
drawText(`R`, { dy: -5, hy: 0, siz: 40, color: `#9999ff` });
|
|
15754
15806
|
drawText(`ESULT`, { x: 57, dy: -5, hy: 0, siz: 25 });
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Source by tickle
|
|
7
7
|
* Created : 2019/11/19
|
|
8
|
-
* Revised : 2026/04/
|
|
8
|
+
* Revised : 2026/04/25 (v47.3.2)
|
|
9
9
|
*
|
|
10
10
|
* https://github.com/cwtickle/danoniplus
|
|
11
11
|
*/
|
|
@@ -212,9 +212,9 @@ const updateWindowSiz = () => {
|
|
|
212
212
|
difCover: { x: 20, y: 60, w: 145, h: 270 + g_sHeight - 500, opacity: 0.95, pointerEvents: C_DIS_AUTO },
|
|
213
213
|
difFilter: { x: 0, y: 66, w: 140, h: 204 + g_sHeight - 500, overflow: C_DIS_AUTO, pointerEvents: C_DIS_AUTO },
|
|
214
214
|
displaySprite: { x: 25, y: 30, w: (g_sWidth - 450) / 2, h: g_limitObj.setLblHeight * 5 },
|
|
215
|
-
scoreDetail: { x: 20, y: 85, w: (g_sWidth - 500) / 2 + 420, h: 245, visibility: `hidden`, pointerEvents: C_DIS_AUTO },
|
|
215
|
+
scoreDetail: { x: 20, y: 85, w: (g_sWidth - 500) / 2 + 420, h: 245 + g_sHeight - 500, visibility: `hidden`, pointerEvents: C_DIS_AUTO },
|
|
216
216
|
detailMiniMapHeader: { x: 110, y: 0, w: (g_sWidth - 500) / 2 + 310, h: 15 },
|
|
217
|
-
detailMiniMapSub: { x: 110, y: 15, w: (g_sWidth - 500) / 2 + 310, h: 230, overflow: C_DIS_AUTO, pointerEvents: C_DIS_AUTO },
|
|
217
|
+
detailMiniMapSub: { x: 110, y: 15, w: (g_sWidth - 500) / 2 + 310, h: 230 + g_sHeight - 500, overflow: C_DIS_AUTO, pointerEvents: C_DIS_AUTO },
|
|
218
218
|
detailObj: { w: (g_sWidth - 500) / 2 + 420, h: 230, visibility: `hidden` },
|
|
219
219
|
keyconSprite: { y: 105, h: g_sHeight - 105, overflow: C_DIS_AUTO },
|
|
220
220
|
loader: { y: g_sHeight - 10, h: 10, backgroundColor: `#333333` },
|