diff --git a/SECURITY.md b/SECURITY.md index 6f8c1adb..1060f486 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -6,7 +6,7 @@ - 修正対象のバージョンは下記の通りです。 - 基本的には、同一メジャーバージョンの最新版がサポート対象です。 -- v1 ~ v43, v45 は**更新を終了しました。** +- v1 ~ v43, v45 ~ v46 は**更新を終了しました。** v46 の対応終了時期は v49 リリース開始時を予定しています。(変更可能性あり) バージョン別の更新継続可否は現状、[ライフサイクルポリシー](https://github.com/cwtickle/danoniplus/wiki/LifecyclePolicy)に従います。 - 各バージョンの概要は[更新情報](https://github.com/cwtickle/danoniplus/wiki/UpdateInfo)に記載しています。 @@ -18,10 +18,11 @@ | Version | Supported | Latest Version | Logs | First Release | End of Support | | ------------ | ------------------ | ------------------------------------------------------------------------------ | ---------------------------------------------------------------------- | ------------- | ---------------- | -| v48 | :heavy_check_mark: | [v48.5.1](https://github.com/cwtickle/danoniplus/releases/tag/v48.5.1) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-latest) | 2026-05-17 | (At Release v51) | -| v47 | :heavy_check_mark: | [v47.6.5](https://github.com/cwtickle/danoniplus/releases/tag/v47.6.5) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v47) | 2026-04-19 | (At Release v50) | -| v46 | :warning: | [v46.7.3](https://github.com/cwtickle/danoniplus/releases/tag/v46.7.3) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v46) | 2026-03-12 | (At Release v49) | -| v45 | :x: | [v45.5.13 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v45.5.13) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v45) | 2026-02-26 | 2026-05-17 | +| v49 :anchor: | :heavy_check_mark: | [v49.0.0](https://github.com/cwtickle/danoniplus/releases/tag/v49.0.0) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-latest) | 2026-06-23 | (At Release v58) | +| v48 | :heavy_check_mark: | [v48.5.2](https://github.com/cwtickle/danoniplus/releases/tag/v48.5.2) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v48) | 2026-05-17 | (At Release v51) | +| v47 | :warning: | [v47.6.5](https://github.com/cwtickle/danoniplus/releases/tag/v47.6.5) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v47) | 2026-04-19 | (At Release v50) | +| v46 | :x: | [v46.7.3 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v46.7.3) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v46) | 2026-03-12 | 2026-06-23 / Launched v49 | +| v45 | :x: | [v45.5.13 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v45.5.13) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v45) | 2026-02-26 | 2026-05-17 / Launched v48 | | v44 :anchor: | :heavy_check_mark: | [v44.5.17](https://github.com/cwtickle/danoniplus/releases/tag/v44.5.17) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v44) | 2026-02-07 | (At Release v53) |
@@ -29,41 +30,41 @@ | Version | Supported | Latest Version | Logs | First Release | End of Support | | ------------ | --------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------- | -------------- | -| v43 | :x: | [v43.6.12 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v43.6.12) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v43) | 2025-09-15 | 2026-03-12 | -| v42 | :x: | [v42.5.13 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v42.5.13) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v42) | 2025-05-24 | 2026-02-26 | -| v41 | :x: | [v41.4.16 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v41.4.16) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v41) | 2025-04-12 | 2026-02-07 | -| v40 | :x: | [v40.7.7 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v40.7.7) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v40) | 2025-03-01 | 2025-09-15 | -| v39 :anchor: | :x: | [v39.8.23 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v39.8.23) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v39) | 2025-02-01 | 2026-05-17 | -| v38 | :x: | [v38.3.4 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v38.3.4) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v38) | 2024-11-04 | 2025-04-12 | -| v37 | :x: | [v37.8.9 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v37.8.9) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v37) | 2024-06-15 | 2025-03-01 | -| v36 | :x: | [v36.6.11 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v36.6.11) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v36) | 2024-04-15 | 2025-02-01 | -| v35 | :x: | [v35.5.7 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v35.5.7) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v35) | 2024-01-28 | 2024-11-04 | -| v34 :anchor: | :x: | [v34.7.17 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v34.7.17) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v34) | 2023-09-24 | 2025-09-15 | -| v33 | :x: | [v33.7.8 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v33.7.8) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v33) | 2023-07-29 | 2024-04-15 | -| v32 | :x: | [v32.7.7 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v32.7.7) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v32) | 2023-05-07 | 2024-01-28 | -| v31 | :x: | [v31.7.7 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v31.7.7) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v31) | 2023-03-20 | 2023-09-24 | -| v30 | :x: | [v30.6.3 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v30.6.3) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v30) | 2023-02-10 | 2023-07-29 | -| v29 :anchor: | :x: | [v29.4.15 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v29.4.15) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v29) | 2022-11-05 | 2024-11-04 | -| v28 | :x: | [v28.6.7 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v28.6.7) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v28) | 2022-08-21 | 2023-03-20 | -| v27 | :x: | [v27.8.7 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v27.8.7) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v27) | 2022-03-18 | 2023-02-10 | -| v26 | :x: | [v26.7.6 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v26.7.6) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v26) | 2022-01-30 | 2022-11-05 | -| v25 | :x: | [v25.5.10 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v25.5.10) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v25) | 2022-01-04 | 2022-08-21 | -| v24 :anchor: | :x: | [v24.6.19 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v24.6.19) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v24) | 2021-10-24 | 2023-07-29 | -| v23 | :x: | [v23.5.6 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v23.5.6) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v23) | 2021-09-04 | 2022-01-30 | -| v22 | :x: | [v22.5.6 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v22.5.6) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v22) | 2021-04-28 | 2022-01-04 | -| v21 | :x: | [v21.5.6 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v21.5.6) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v21) | 2021-03-12 | 2021-10-24 | -| v20 | :x: | [v20.5.4 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v20.5.4) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v20) | 2021-02-12 | 2021-09-04 | -| v19 :anchor: | :x: | [v19.5.17 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v19.5.17) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v19) | 2021-01-17 | 2022-08-21 | -| v18 | :x: | [v18.9.6 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v18.9.6) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v18) | 2020-10-25 | 2021-03-12 | -| v17 | :x: | [v17.5.9 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v17.5.9) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v17) | 2020-09-27 | 2021-02-12 | -| v16 | :x: | [v16.4.10 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v16.4.10) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v16) | 2020-08-06 | 2021-01-17 | -| v15 | :x: | [v15.7.5 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v15.7.5) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v15) | 2020-05-13 | 2020-10-25 | -| v14 :anchor: | :x: | [v14.5.21 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v14.5.21) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v14) | 2020-04-29 | 2021-09-04 | -| v13 | :x: | [v13.6.8 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v13.6.8) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v13) | 2020-03-29 | 2020-08-06 | -| v12 | :x: | [v12.3.6 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v12.3.6) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v12) | 2020-02-09 | 2020-05-13 | +| v43 | :x: | [v43.6.12 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v43.6.12) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v43) | 2025-09-15 | 2026-03-12 / Launched v46 | +| v42 | :x: | [v42.5.13 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v42.5.13) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v42) | 2025-05-24 | 2026-02-26 / Launched v45 | +| v41 | :x: | [v41.4.16 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v41.4.16) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v41) | 2025-04-12 | 2026-02-07 / Launched v44 | +| v40 | :x: | [v40.7.7 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v40.7.7) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v40) | 2025-03-01 | 2025-09-15 / Launched v43 | +| v39 :anchor: | :x: | [v39.8.23 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v39.8.23) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v39) | 2025-02-01 | 2026-05-17 / Launched **v48** | +| v38 | :x: | [v38.3.4 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v38.3.4) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v38) | 2024-11-04 | 2025-04-12 / Launched v41 | +| v37 | :x: | [v37.8.9 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v37.8.9) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v37) | 2024-06-15 | 2025-03-01 / Launched v40 | +| v36 | :x: | [v36.6.11 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v36.6.11) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v36) | 2024-04-15 | 2025-02-01 / Launched v39 | +| v35 | :x: | [v35.5.7 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v35.5.7) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v35) | 2024-01-28 | 2024-11-04 / Launched v38 | +| v34 :anchor: | :x: | [v34.7.17 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v34.7.17) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v34) | 2023-09-24 | 2025-09-15 / Launched **v43** | +| v33 | :x: | [v33.7.8 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v33.7.8) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v33) | 2023-07-29 | 2024-04-15 / Launched v36 | +| v32 | :x: | [v32.7.7 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v32.7.7) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v32) | 2023-05-07 | 2024-01-28 / Launched v35 | +| v31 | :x: | [v31.7.7 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v31.7.7) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v31) | 2023-03-20 | 2023-09-24 / Launched v34 | +| v30 | :x: | [v30.6.3 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v30.6.3) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v30) | 2023-02-10 | 2023-07-29 / Launched v33 | +| v29 :anchor: | :x: | [v29.4.15 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v29.4.15) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v29) | 2022-11-05 | 2024-11-04 / Launched **v38** | +| v28 | :x: | [v28.6.7 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v28.6.7) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v28) | 2022-08-21 | 2023-03-20 / Launched v31 | +| v27 | :x: | [v27.8.7 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v27.8.7) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v27) | 2022-03-18 | 2023-02-10 / Launched v30 | +| v26 | :x: | [v26.7.6 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v26.7.6) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v26) | 2022-01-30 | 2022-11-05 / Launched v29 | +| v25 | :x: | [v25.5.10 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v25.5.10) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v25) | 2022-01-04 | 2022-08-21 / Launched v28 | +| v24 :anchor: | :x: | [v24.6.19 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v24.6.19) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v24) | 2021-10-24 | 2023-07-29 / Launched **v33** | +| v23 | :x: | [v23.5.6 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v23.5.6) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v23) | 2021-09-04 | 2022-01-30 / Launched v26 | +| v22 | :x: | [v22.5.6 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v22.5.6) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v22) | 2021-04-28 | 2022-01-04 / Launched v25 | +| v21 | :x: | [v21.5.6 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v21.5.6) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v21) | 2021-03-12 | 2021-10-24 / Launched v24 | +| v20 | :x: | [v20.5.4 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v20.5.4) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v20) | 2021-02-12 | 2021-09-04 / Launched v23 | +| v19 :anchor: | :x: | [v19.5.17 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v19.5.17) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v19) | 2021-01-17 | 2022-08-21 / Launched **v28** | +| v18 | :x: | [v18.9.6 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v18.9.6) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v18) | 2020-10-25 | 2021-03-12 / Launched v21 | +| v17 | :x: | [v17.5.9 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v17.5.9) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v17) | 2020-09-27 | 2021-02-12 / Launched v20 | +| v16 | :x: | [v16.4.10 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v16.4.10) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v16) | 2020-08-06 | 2021-01-17 / Launched v19 | +| v15 | :x: | [v15.7.5 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v15.7.5) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v15) | 2020-05-13 | 2020-10-25 / Launched v18 | +| v14 :anchor: | :x: | [v14.5.21 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v14.5.21) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v14) | 2020-04-29 | 2021-09-04 / Launched **v23** | +| v13 | :x: | [v13.6.8 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v13.6.8) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v13) | 2020-03-29 | 2020-08-06 / Launched v16 | +| v12 | :x: | [v12.3.6 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v12.3.6) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v12) | 2020-02-09 | 2020-05-13 / Launched v15 | | v11 | :x: | [v11.4.5 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v11.4.5) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v11) | 2019-12-14 | 2020-04-18 | | v10 | :x: | [v10.5.5 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v10.5.5) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v10) | 2019-11-04 | 2020-02-10 | -| v9 :anchor: | :x: | [v9.4.27 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v9.4.27) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v9) | 2019-10-08 | 2021-01-17 | +| v9 :anchor: | :x: | [v9.4.27 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v9.4.27) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v9) | 2019-10-08 | 2021-01-17 / Launched **v19** | | v8 | :x: | [v8.7.10 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v8.7.10) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v8) | 2019-09-08 | 2019-12-14 | | v7 | :x: | [v7.9.13 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v7.9.13) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v7) | 2019-07-08 | 2019-11-04 | | v6 | :x: | [v6.6.13 (final)](https://github.com/cwtickle/danoniplus/releases/tag/v6.6.13) | [:memo:](https://github.com/cwtickle/danoniplus/wiki/Changelog-v6) | 2019-06-22 | 2019-11-04 | diff --git a/js/danoni_main.js b/js/danoni_main.js index f3d86943..455dec54 100644 --- a/js/danoni_main.js +++ b/js/danoni_main.js @@ -4,12 +4,12 @@ * * Source by tickle * Created : 2018/10/08 - * Revised : 2026/06/15 + * Revised : 2026/06/23 * * https://github.com/cwtickle/danoniplus */ -const g_version = `Ver 48.5.1`; -const g_revisedDate = `2026/06/15`; +const g_version = `Ver 49.0.0`; +const g_revisedDate = `2026/06/23`; // カスタム用バージョン (danoni_custom.js 等で指定可) let g_localVersion = ``; @@ -1492,6 +1492,53 @@ const getEmojiForCanvas = _str => { return result; }; +/** + * 複数行に跨る可能性のある文字列を、改行タグ付きの文字列とフォントサイズに変換 + * @param {string} _targetStr + * @param {number} _maxWidth + * @param {object} object + * @param {string} [object.font=getBasicFont()] + * @param {number} [object.maxSiz=14] + * @param {number} [object.minSiz=5] + * @param {number} [object.maxSizMulti=maxSiz] + * @param {string} [object.prefix=''] + * @param {number} [object.len=30] + * @param {string} [object.delim=' '] + * @returns {[string, number]} + */ +const getFontSizeMulti = (_targetStr, _maxWidth, { font = getBasicFont(), + maxSiz = 14, minSiz = 5, maxSizMulti = maxSiz, prefix = ``, len = 20, delim = ` ` } = {}) => { + + // _targetStr が長い場合のみ、その中身を 2つ に分解する + if (_targetStr.length > len) { + let breakNum = -1; + const halfIndex = Math.floor(_targetStr.length / 2); + + // 文字列の中央から前に向かってスペースを探す + for (let j = halfIndex; j > 0; j--) { + if (_targetStr[j] === delim) { + breakNum = j; + break; + } + } + // スペースがなければ、中央(よりやや左)で強制分割 + if (breakNum === -1) { + breakNum = halfIndex; + } + const isSpace = _targetStr[breakNum] === delim; + const firstPart = _targetStr.slice(0, breakNum); + const secondPart = _targetStr.slice(isSpace ? breakNum + delim.length : breakNum); + + // 難易度名の中に
を仕込む + _targetStr = `${firstPart}
${secondPart}`; + } + + // 3. 最終的な文字列を結合(prefix と難易度名の1つ目の塊が1行目になる) + const fullStr = `${prefix}${_targetStr}`; + + return [fullStr, getFontSize2(fullStr, _maxWidth, { font, maxSiz: _targetStr.includes(`
`) ? maxSizMulti : maxSiz, minSiz })]; +}; + /** * 指定した横幅に合ったフォントサイズを取得 * @param {string} _str @@ -1502,8 +1549,16 @@ const getEmojiForCanvas = _str => { * @returns {number} */ const getFontSize2 = (_str, _maxWidth, { font = getBasicFont(), maxSiz = 14, minSiz = 5 } = {}) => { + // 文字列を改行で分割(null/undefined 対策も含む) + const lines = _str ? _str.split('
') : []; + if (lines.length === 0) return maxSiz; + + // 大きいサイズから順に試す for (let siz = maxSiz; siz >= minSiz; siz--) { - if (_maxWidth >= getStrWidth(getLongestStr(_str?.split(`
`)), siz, font)) { + // すべての行が _maxWidth 以内に収まるかチェック + const isFitAllLines = lines.every(line => _maxWidth >= getStrWidth(line, siz, font)); + + if (isFitAllLines) { return siz; } } @@ -7179,12 +7234,21 @@ const makeDifList = (_difList, _targetKey = ``) => { g_headerObj.viewLists.forEach(j => { const keyLabel = g_headerObj.keyLabels[j]; if (_targetKey === `` || keyLabel === _targetKey) { - let text = `${getKeyName(keyLabel)} / ${g_headerObj.difLabels[j]}`; + + // 譜面名の表示 + const prefix = `${getKeyName(keyLabel)} / `; + let text = `${g_headerObj.difLabels[j]}`; if (g_headerObj.makerView) { text += ` (${g_headerObj.creatorNames[j]})`; } - _difList.appendChild(makeDifLblCssButton(`dif${k}`, text, k, () => nextDifficulty(j - g_stateObj.scoreId), - { btnStyle: (j === g_stateObj.scoreId ? `Setting` : `Default`) })); + // キー種と譜面名に分割し、譜面名が長すぎる場合は二段に分割して表示 + const [difText, difSiz] = getFontSizeMulti(text, g_limitObj.difSelectorWidth, { + maxSiz: g_limitObj.difSelectorSiz, maxSizMulti: 9, prefix, len: 30, + }) + _difList.appendChild(makeDifLblCssButton(`dif${k}`, difText, k, () => nextDifficulty(j - g_stateObj.scoreId), { + btnStyle: (j === g_stateObj.scoreId ? `Setting` : `Default`), siz: difSiz, + })); + document.getElementById(`dif${k}`).style.lineHeight = `9px`; if (j === g_stateObj.scoreId) { pos = k + 6.5 * (g_sHeight - 239) / 261; curk = k; @@ -8133,12 +8197,17 @@ const setDifficulty = (_initFlg) => { // 3. 名称の設定 // 譜面名設定 (Difficulty) - const difWidth = parseFloat(lnkDifficulty.style.width); + const difWidth = parseFloat(lnkDifficulty.style.width) - 20; const transKeyName = getTransKeyName(); const keyUnitName = getStgDetailName(getKeyUnitName(g_keyObj.currentKey)); - const difNames = [`${getKeyName(g_keyObj.currentKey)}${transKeyName} ${keyUnitName} / ${g_headerObj.difLabels[g_stateObj.scoreId]}`]; - lnkDifficulty.style.fontSize = wUnit(getFontSize2(difNames[0], difWidth, { maxSiz: g_limitObj.setLblSiz })); + const prefix = `${getKeyName(g_keyObj.currentKey)}${transKeyName} ${keyUnitName} / `; + let difLabel = `${g_headerObj.difLabels[g_stateObj.scoreId]}`; + + const [difName, difSiz] = getFontSizeMulti(difLabel, difWidth, { maxSiz: g_limitObj.setLblSiz, prefix }); + lnkDifficulty.style.fontSize = wUnit(difSiz); + + const difNames = [difName]; if (g_headerObj.makerView) { difNames.push(`(${g_headerObj.creatorNames[g_stateObj.scoreId]})`); difNames.forEach((difName, j) => { @@ -8998,6 +9067,9 @@ const setExcessive = (_btn, _val) => { const getKeyCtrl = (_localStorage, _extraKeyName = ``) => { g_keyObj.storagePtn = _localStorage[`keyCtrlPtn${_extraKeyName}`]; const basePtn = `${g_keyObj.currentKey}_${g_keyObj.storagePtn}`; + if (g_keyObj[`keyCtrl${basePtn}`] === undefined || hasVal(g_keyObj[`transKey${basePtn}`])) { + return; + } const baseKeyNum = g_keyObj[`${g_keyObj.defaultProp}${basePtn}`].length; if (_localStorage[`keyCtrl${_extraKeyName}`]?.[0].length > 0) { @@ -10098,6 +10170,11 @@ const keyConfigInit = (_kcType = g_kcType, _initFlg = false) => { // 譜面初期情報ロード許可フラグ g_canLoadDifInfoFlg = false; + if (_initFlg) { + g_stateObj.keyLockFlg = false; + g_stateObj.kbPreviewFlg = false; + } + multiAppend(divRoot, // キーコンフィグ画面タイトル @@ -10105,8 +10182,7 @@ const keyConfigInit = (_kcType = g_kcType, _initFlg = false) => { `
${g_lblNameObj.key}
${g_lblNameObj.config}
` .replace(/[\t\n]/g, ``), 0, 15, g_cssObj.flex_centering), - createDescDiv(`kcDesc`, g_lblNameObj.kcDesc.split(`{0}`).join(g_kCd[C_KEY_RETRY]) - .split(`{1}:`).join(g_isMac ? `` : `Delete:`)), + createDescDiv(`kcDesc`, getKcDescMsg()), createDescDiv(`kcShuffleDesc`, g_headerObj.shuffleUse && g_settings.shuffles.filter(val => val.endsWith(`+`)).length > 0 @@ -10236,11 +10312,24 @@ const keyConfigInit = (_kcType = g_kcType, _initFlg = false) => { * @param {number} _scrollNum */ const changeTmpColor = (_j, _scrollNum = 1) => { - changeTmpData(`color`, g_headerObj.setColor.length, _j, _scrollNum); - const arrowColor = getKeyConfigColor(_j, g_keyObj[`color${keyCtrlPtn}`][_j]); - $id(`arrow${_j}`).background = arrowColor; - $id(`arrowShadow${_j}`).background = getShadowColor(g_keyObj[`color${keyCtrlPtn}`][_j], arrowColor); + const changeTmpOneColor = _idx => { + changeTmpData(`color`, g_headerObj.setColor.length, _idx, _scrollNum); + const arrowColor = getKeyConfigColor(_idx, g_keyObj[`color${keyCtrlPtn}`][_idx]); + $id(`arrow${_idx}`).background = arrowColor; + $id(`arrowShadow${_idx}`).background = getShadowColor(g_keyObj[`color${keyCtrlPtn}`][_idx], arrowColor); + }; + if (g_stateObj.keyLockFlg && keyIsShift()) { + const tmpList = []; + g_keyObj[`color${keyCtrlPtn}`].forEach((val, idx) => { + if (val === g_keyObj[`color${keyCtrlPtn}`][_j]) { + tmpList.push(idx); + } + }); + tmpList.forEach(idx => changeTmpOneColor(idx)); + } else { + changeTmpOneColor(_j); + } adjustScrollPoint(parseFloat($id(`arrow${_j}`).left)); }; @@ -10250,10 +10339,23 @@ const keyConfigInit = (_kcType = g_kcType, _initFlg = false) => { * @param {number} _scrollNum */ const changeTmpShuffleNum = (_j, _scrollNum = 1) => { - const tmpShuffle = changeTmpData(`shuffle`, g_keyObj[`keyCtrl${keyCtrlPtn}`].length - 1, _j, _scrollNum); - document.getElementById(`sArrow${_j}`).textContent = tmpShuffle + 1; + const changeTmpOneShuffle = _idx => { + const tmpShuffle = changeTmpData(`shuffle`, g_keyObj[`keyCtrl${keyCtrlPtn}`].length - 1, _idx, _scrollNum); + document.getElementById(`sArrow${_idx}`).textContent = tmpShuffle + 1; + changeShuffleConfigColor(keyCtrlPtn, g_keyObj[`shuffle${keyCtrlPtn}_${g_keycons.shuffleGroupNum}`][_idx], _idx); + }; - changeShuffleConfigColor(keyCtrlPtn, g_keyObj[`shuffle${keyCtrlPtn}_${g_keycons.shuffleGroupNum}`][_j], _j); + if (g_stateObj.keyLockFlg && keyIsShift()) { + const tmpList = []; + g_keyObj[`shuffle${keyCtrlPtn}`].forEach((val, idx) => { + if (val === g_keyObj[`shuffle${keyCtrlPtn}`][_j]) { + tmpList.push(idx); + } + }); + tmpList.forEach(idx => changeTmpOneShuffle(idx)); + } else { + changeTmpOneShuffle(_j); + } adjustScrollPoint(parseFloat($id(`arrow${_j}`).left)); }; @@ -10941,17 +11043,30 @@ const keyConfigInit = (_kcType = g_kcType, _initFlg = false) => { } }, g_lblPosObj.btnKcReset, g_cssObj.button_Reset), + createCss2Button(`btnKeyLock`, getKeyLockName(), () => { + g_stateObj.keyLockFlg = !g_stateObj.keyLockFlg; + makeInfoWindow(g_msgInfoObj.I_0012.split(`{0}`).join(boolToSwitch(!g_stateObj.keyLockFlg)), `leftToRightFade`); + toggleKcDesc(); + }, g_lblPosObj.btnKcKeyLock, g_cssObj.button_Mini), + // プレイ開始 makePlayButton(() => loadMusic()) ); + toggleKcDesc(); // キーボード押下時処理 setShortcutEvent(g_currentPage, (kbCode) => { + const C_KEY_ESCAPE = 27; + const C_KEY_IME = 229; const keyCdObj = document.getElementById(`keycon${g_currentj}_${g_currentk}`); let setKey = g_kCdN.findIndex(kCd => kCd === kbCode); - const C_KEY_ESCAPE = 27; - const C_KEY_IME = 229; + if (g_stateObj.keyLockFlg) { + if (setKey === C_KEY_ESCAPE) { + btnBack.click(); + } + return; + } // 全角切替、BackSpace、Deleteキー、Escキーは割り当て禁止 // また、直前と同じキーを押した場合(BackSpaceを除く)はキー操作を無効にする @@ -11032,11 +11147,33 @@ const keyConfigInit = (_kcType = g_kcType, _initFlg = false) => { }) ); + if (g_stateObj.kbPreviewFlg) { + btnKbPreview.click(); + } + safeExecuteCustomHooks(`g_skinJsObj.keyconfig`, g_skinJsObj.keyconfig); document.onkeyup = evt => commonKeyUp(evt); document.oncontextmenu = () => false; }; +const toggleKcDesc = () => { + if (document.getElementById(`kcDesc`) !== null) { + kcDesc.textContent = getKcDescMsg(); + kcDesc.style.fontSize = wUnit(getFontSize2(kcDesc.textContent, g_lblPosObj.kcDesc.w, { maxSiz: g_limitObj.mainSiz })); + kcDesc.classList.remove(g_cssObj.title_base, g_cssObj.keyconfig_Defaultkey); + kcDesc.classList.add(g_stateObj.keyLockFlg ? g_cssObj.keyconfig_Defaultkey : g_cssObj.title_base); + btnKeyLock.innerHTML = getKeyLockName(); + } +}; + +const getKcDescMsg = () => + g_stateObj.keyLockFlg + ? g_lblNameObj.kcNonDesc + : g_lblNameObj.kcDesc.split(`{0}`).join(g_kCd[C_KEY_RETRY]).split(`{1}:`).join(g_isMac ? `` : `Delete:`); + +const getKeyLockName = () => + `${g_lblNameObj.b_keyLock}${g_stateObj.keyLockFlg ? g_emojiObj.locked : g_emojiObj.unlocked}`; + /** * キーボードレイアウトプレビュー(Canvas版) * @@ -11612,7 +11749,9 @@ const keyconfigKeyboardPreview = (() => { _state.visible = !_state.visible; area.style.display = _state.visible ? `block` : `none`; - + g_stateObj.kbPreviewFlg = _state.visible; + g_stateObj.keyLockFlg = _state.visible; + toggleKcDesc(); if (_state.visible) refresh(); }; @@ -16725,7 +16864,8 @@ const resultInit = () => { makeCssResultPlayData(`lblMusicData`, dataRX, g_cssObj.result_style, 0, mTitleForView[0]), makeCssResultPlayData(`lblMusicData2`, dataRX, g_cssObj.result_style, 1, mTitleForView[1]), makeCssResultPlayData(`lblDifficulty`, lblRX, g_cssObj.result_lbl, 2, g_lblNameObj.rt_Difficulty, C_ALIGN_LEFT), - makeCssResultPlayData(`lblDifData`, dataRX, g_cssObj.result_style, 2, settingData.difData), + makeCssResultPlayData(`lblDifData`, dataRX, g_cssObj.result_style, 2, settingData.difData, C_ALIGN_CENTER, + { siz: getFontSize2(settingData.difData, 350) }), makeCssResultPlayData(`lblStyle`, lblRX, g_cssObj.result_lbl, 3, g_lblNameObj.rt_Style, C_ALIGN_LEFT), makeCssResultPlayData(`lblStyleData`, dataRX, g_cssObj.result_style, 3, settingData.playStyleData), makeCssResultPlayData(`lblDisplay`, lblRX, g_cssObj.result_lbl, 4, g_lblNameObj.rt_Display, C_ALIGN_LEFT), @@ -16734,21 +16874,9 @@ const resultInit = () => { ); // 設定項目が多い場合に2行に分解して表示する処理 - let playStyleBreakNum = lblStyleData.textContent.length; - if (lblStyleData.textContent.length > 60) { - for (let j = Math.floor(lblStyleData.textContent.length / 2); j > 0; j--) { - if (lblStyleData.textContent[j] === `,`) { - playStyleBreakNum = j + 2; - break; - } - } - lblStyleData.style.top = `${parseFloat(lblStyleData.style.top) - 3}px`; - lblStyleData.innerHTML = `${lblStyleData.textContent.slice(0, playStyleBreakNum)}
` + - `${lblStyleData.textContent.slice(playStyleBreakNum)}`; - lblStyleData.style.fontSize = `${getFontSize2(lblStyleData.textContent.slice(0, playStyleBreakNum), 350, { maxSiz: 10 })}px`; - } else { - lblStyleData.style.fontSize = `${getFontSize2(lblStyleData.textContent, 350)}px`; - } + const [styleStr, styleSiz] = getFontSizeMulti(settingData.playStyleData, 350, { maxSizMulti: 10, len: 60 }); + lblStyleData.innerHTML = styleStr; + lblStyleData.style.fontSize = wUnit(styleSiz); /** * キャラクタ、スコア描画のID共通部、色CSS名、スコア変数名 @@ -17182,6 +17310,7 @@ const resultInit = () => { const artistName = g_headerObj.artistNames[g_headerObj.musicNos[g_stateObj.scoreId]] || g_headerObj.artistName; const logicalWidth = 400; const logicalHeight = g_sHeight - 90; + const flapWidth = 370; canvas.id = `resultImage`; canvas.width = logicalWidth * g_dpr; @@ -17210,13 +17339,14 @@ const resultInit = () => { drawText(unEscapeHtml(mTitleForView[1]), { hy: 2 }); drawText(`${getEmojiForCanvas(g_emojiObj.memo)} ${unEscapeHtml(g_headerObj.tuning)} / ${getEmojiForCanvas(g_emojiObj.musical)} ${unEscapeHtml(artistName)}`, { hy: mTitleForView[1] !== `` ? 3 : 2, siz: 12 }); - drawText(unEscapeHtml(settingData.difDataForImage), { hy: 4 }); + drawText(unEscapeHtml(settingData.difDataForImage), { hy: 4, siz: getFontSize2(settingData.difDataForImage, flapWidth) }); if (settingData.playStyleData.length > 60) { - drawText(settingData.playStyleData.slice(0, playStyleBreakNum), { hy: 5, siz: getFontSize2(settingData.playStyleData.slice(0, playStyleBreakNum), 370) }); - drawText(settingData.playStyleData.slice(playStyleBreakNum), { hy: 6, siz: getFontSize2(settingData.playStyleData.slice(playStyleBreakNum), 370) }); + const strs = styleStr.split(`
`); + drawText(strs[0], { hy: 5, siz: getFontSize2(strs[0], flapWidth) }); + drawText(strs[1], { hy: 6, siz: getFontSize2(strs[1], flapWidth) }); } else { - drawText(settingData.playStyleData, { hy: 5, siz: getFontSize2(settingData.playStyleData, 370, { maxSiz: 15 }) }); + drawText(settingData.playStyleData, { hy: 5, siz: getFontSize2(settingData.playStyleData, flapWidth, { maxSiz: 15 }) }); } Object.keys(jdgScoreObj).forEach(score => { drawText(g_lblNameObj[`j_${score}`], { hy: 7 + jdgScoreObj[score].pos, color: jdgScoreObj[score].dfColor }); diff --git a/js/lib/danoni_constants.js b/js/lib/danoni_constants.js index e3715a52..d2d4e061 100644 --- a/js/lib/danoni_constants.js +++ b/js/lib/danoni_constants.js @@ -5,7 +5,7 @@ * * Source by tickle * Created : 2019/11/19 - * Revised : 2026/06/14 (v48.5.0) + * Revised : 2026/06/23 (v49.0.0) * * https://github.com/cwtickle/danoniplus */ @@ -640,6 +640,10 @@ const updateWindowSiz = () => { x: g_btnX() + Math.floor((g_btnWidth() - 80) / 2), y: 3, w: 80, h: 18, siz: 11, title: g_msgObj.displayPreview, }, + btnKcKeyLock: { + x: g_btnX() + Math.floor((g_btnWidth() - 80) / 2) + 90, y: 3, w: 80, h: 18, siz: 11, + title: g_msgObj.keyLock, + }, btnKcBack: { x: g_btnX(1 / 3), y: g_sHeight - 75, @@ -1062,6 +1066,8 @@ const g_emojiObj = { memo: `📝`, // メモ (memo) musical: `🎵`, // 音符 (musical note) camera: `📷`, // カメラ (camera) + locked: `🔒`, // 鍵 (locked) + unlocked: `🔓`, // 鍵開 (unlocked) }; /** 設定・オプション画面用共通 */ @@ -1284,6 +1290,9 @@ const g_stateObj = { rotateEnabled: true, flatStepHeight: C_ARW_WIDTH, + keyLockFlg: false, + kbPreviewFlg: false, + dm_environment: C_FLG_OFF, dm_highscores: C_FLG_OFF, dm_customKey: C_FLG_OFF, @@ -3597,7 +3606,7 @@ const g_keyObj = { // - _0 の数字部分をカウントアップすることで実現できる。 keyCtrl5_1: [[`Space`], [`Left`], [`Down`], [`Up`], [`Right`]], keyCtrl7_1: [[`S`], [`E`], [`F`], [`Space`, `G`, `H`], [`J`], [`I`], [`L`]], - keyCtrl8_1: [[`Enter`], [`S`], [`D`], [`F`], [`Space`], [`J`], [`K`], [`L`]], + keyCtrl8_1: [[`Tab`], [`S`], [`D`], [`F`], [`Space`], [`J`], [`K`], [`L`]], keyCtrl9A_1: [[`S`], [`D`], [`E`, `R`], [`F`], [`Space`], [`Left`], [`Down`], [`Up`], [`Right`]], keyCtrl9i_1: [[`A`], [`S`], [`D`], [`F`], [`Space`], [`Left`], [`Down`], [`Up`], [`Right`]], keyCtrl11_1: [[`S`], [`D`], [`F`], [`Space`], [`J`], [`K`], [`L`], [`Left`], [`Down`], [`Up`], [`Right`]], @@ -3658,7 +3667,7 @@ const g_keyObj = { // ショートカットキーコード keyRetry: 8, // 8: Backspace keyRetry8_0: 9, // 9: Tab - keyRetry8_1: 9, + keyRetry8_1: 8, // 8: Backspace keyRetry11j_0: 123, // 123: F12 keyTitleBack: 46, // 46: Delete @@ -3666,9 +3675,8 @@ const g_keyObj = { // 別キー transKey8_2: '12', - transKey15A_1: '', - transKey15B_0: '', - transKey15B_1: '', + transKey15A_1: '15B', // 15A/15Bはキーパターンをコピーして生成するため、transKeyを明示的に指定 + transKey15B_0: '', // 15A/15Bはキーパターンをコピーして生成するため、transKeyを明示的に指定 // キー置換用(ParaFla版との互換) keyTransPattern: { @@ -4461,6 +4469,7 @@ const g_lang_msgInfoObj = { I_0006: `ローカルストレージ情報をクリップボードにコピーしました!`, I_0007: `オブジェクト情報をクリップボードにコピーしました!`, I_0011: `指定した部分キーが未定義のため、画面表示できません。設定を見直してください。`, + I_0012: `キー割り当てモードを{0}に変更しました。`, }, En: { W_0001: `Your browser is not guaranteed to work.
@@ -4511,6 +4520,7 @@ const g_lang_msgInfoObj = { I_0006: `Local storage information copied to clipboard!`, I_0007: `Object information copied to clipboard!`, I_0011: `The specified partial key is undefined and cannot be displayed on the screen. Please review your settings.`, + I_0012: `Key assignment mode changed to {0}.`, }, }; @@ -4566,6 +4576,7 @@ const g_lblNameObj = { b_close: `Close`, b_cReset: `Reset`, b_precond: `Precondition`, + b_keyLock: `KeyLock`, Difficulty: `Difficulty`, Speed: `Speed`, @@ -4818,6 +4829,7 @@ const g_lang_lblNameObj = { dataDeleteONDesc: `セーフモード適用中はデータ消去は行えません。変更するにはセーフモードを解除してください`, kcDesc: `[{0}:スキップ / {1}:(代替キーのみ)キー無効化]`, + kcNonDesc: `キー割り当て無効化中です。解除するには「KeyLock」を押してください`, kcShuffleDesc: `番号をクリックでシャッフルグループ、矢印をクリックでカラーグループを変更`, kcNoShuffleDesc: `矢印をクリックでカラーグループを変更`, sdDesc: `[クリックでON/OFFを切替、灰色でOFF]`, @@ -4881,6 +4893,7 @@ const g_lang_lblNameObj = { dataDeleteONDesc: `Data erasure cannot be performed while safe mode is applied.
Please deactivate the safe mode to change the data.`, kcDesc: `[{0}:Skip / {1}:Key invalidation (Alternate keys only)]`, + kcNonDesc: `Key assignments are currently disabled. Press "KeyLock" to disable this setting.`, kcShuffleDesc: `Click the number to change the shuffle group, and click the arrow to change the color.`, kcNoShuffleDesc: `Click the arrow to change the color group.`, sdDesc: `[Click to switch, gray to OFF]`, @@ -5052,6 +5065,7 @@ const g_lang_msgObj = { stepRtnGroup: `矢印などノーツの種類、回転に関するパターンを切り替えます。\nあらかじめ設定されている場合のみ変更可能です。`, kcReset: `対応するキーの割り当てを元に戻します。`, kcPreview: `キーボードレイアウトのプレビューを表示/非表示します。`, + keyLock: `キー割り当ての有効/無効を切り替えます。\n無効化時はシフトキー+番号/矢印クリックで同一グループの矢印群をまとめてグループ変更できます。`, pickArrow: `色番号ごとの矢印色(枠、塗りつぶし)、通常時のフリーズアロー色(枠、帯)を\nカラーピッカーから選んで変更できます。`, pickColorR: `設定する矢印色の種類を切り替えます。`, @@ -5159,6 +5173,7 @@ const g_lang_msgObj = { stepRtnGroup: `Switches the type of notes, such as arrows, and the pattern regarding rotation.\nThis can only be changed if it has been set in advance.`, kcReset: `Restores the corresponding key assignments.`, kcPreview: `Show/hide the preview of the keyboard layout.`, + keyLock: `Toggles key assignments on or off. \nWhen disabled, you can use the Shift key plus a number or arrow key \nto change the group of all arrows in the same group at once.`, pickArrow: `Change the frame or fill of arrow color and the frame or bar of normal freeze-arrow color\nfor each color number from the color picker.`, pickColorR: `Switches the arrow color type to be set.`, diff --git a/package.json b/package.json index 96e47032..08f71250 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "danoniplus", - "version": "48.5.1", + "version": "49.0.0", "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game", "main": "./js/danoni_main.js", "jsdelivr": "./js/danoni_main.js",