diff --git a/AquaNet/src/components/GameSettingFields.svelte b/AquaNet/src/components/GameSettingFields.svelte index 84ed5f21..edd3ada6 100644 --- a/AquaNet/src/components/GameSettingFields.svelte +++ b/AquaNet/src/components/GameSettingFields.svelte @@ -38,7 +38,7 @@ {/each} - + diff --git a/AquaNet/src/components/RatingCompSong.svelte b/AquaNet/src/components/RatingCompSong.svelte index 84a8b5d3..d1393b14 100644 --- a/AquaNet/src/components/RatingCompSong.svelte +++ b/AquaNet/src/components/RatingCompSong.svelte @@ -8,6 +8,7 @@ import { coverNotFound } from "../libs/ui"; import type { MusicMeta } from "../libs/generalTypes"; import { tooltip } from "../libs/ui"; + import useLocalStorage from "../libs/hooks/useLocalStorage.svelte"; export let g: string export let meta: MusicMeta @@ -16,6 +17,9 @@ let mapData = g.split(":").map(Number) let mult = getMult(mapData[3], game) let mapRank: number | undefined = meta?.notes?.[mapData[1] === 10 ? 0 : mapData[1]]?.lv + const rounding = useLocalStorage("rounding", true); + + console.log(rounding.value) let gameIndexMap = { 'mai2': 3, @@ -42,7 +46,11 @@ {("" + getMult(mapData[gameIndex], game)[2]).replace("p", "+")} - {roundFloor(mapData[gameIndex], game, 1)}% + { + rounding.value ? + roundFloor(mapData[gameIndex], game, 1) : + (mapData[gameIndex] / 10000).toFixed(4) + }% {#if game === 'mai2'} diff --git a/AquaNet/src/libs/hooks/useLocalStorage.svelte.ts b/AquaNet/src/libs/hooks/useLocalStorage.svelte.ts new file mode 100644 index 00000000..caeda5a2 --- /dev/null +++ b/AquaNet/src/libs/hooks/useLocalStorage.svelte.ts @@ -0,0 +1,24 @@ +import { onMount } from 'svelte'; + +const useLocalStorage = (key: string, initialValue: T) => { + let value = initialValue; + + const currentValue = localStorage.getItem(key); + if (currentValue) value = JSON.parse(currentValue); + + const save = () => { + localStorage.setItem(key, JSON.stringify(value)); + }; + + return { + get value() { + return value; + }, + set value(v: T) { + value = v; + save(); + }, + }; +}; + +export default useLocalStorage; diff --git a/AquaNet/src/libs/i18n/en_ref.ts b/AquaNet/src/libs/i18n/en_ref.ts index aab83acc..57ee5bbf 100644 --- a/AquaNet/src/libs/i18n/en_ref.ts +++ b/AquaNet/src/libs/i18n/en_ref.ts @@ -137,6 +137,8 @@ export const EN_REF_SETTINGS = { 'settings.fields.waccaInfiniteWp.desc': 'Set WP to 999999', 'settings.fields.waccaAlwaysVip.name': 'Wacca: Always VIP', 'settings.fields.waccaAlwaysVip.desc': 'Set VIP expiration date to 2077-01-01', + 'settings.fields.rounding.name': 'Score Rounding', + 'settings.fields.rounding.desc': 'Round the score to one decimal place', 'settings.mai2.name': 'Player Name', 'settings.profile.picture': 'Profile Picture', 'settings.profile.upload-new': 'Upload New', diff --git a/AquaNet/src/libs/i18n/zh.ts b/AquaNet/src/libs/i18n/zh.ts index 1085c142..09c928e4 100644 --- a/AquaNet/src/libs/i18n/zh.ts +++ b/AquaNet/src/libs/i18n/zh.ts @@ -146,6 +146,8 @@ const zhSettings: typeof EN_REF_SETTINGS = { 'settings.fields.waccaInfiniteWp.desc': '将 WP 设置为 999999', 'settings.fields.waccaAlwaysVip.name': 'Wacca: 永久会员', 'settings.fields.waccaAlwaysVip.desc': '将 VIP 到期时间设置为 2077-01-01', + 'settings.fields.rounding.name': '分数舍入', + 'settings.fields.rounding.desc': '把分数四舍五入到一位小数', 'settings.mai2.name': '玩家名字', 'settings.profile.picture': '头像', 'settings.profile.upload-new': '上传', diff --git a/AquaNet/src/libs/scoring.ts b/AquaNet/src/libs/scoring.ts index e672ea01..91ded584 100644 --- a/AquaNet/src/libs/scoring.ts +++ b/AquaNet/src/libs/scoring.ts @@ -76,10 +76,10 @@ export function getMult(achievement: number, game: GameName) { } export function roundFloor(achievement: number, game: GameName, digits = 2) { - achievement /= 10000 // Round, but if the rounded number reaches the next rank, use floor instead const mult = getMult(achievement, game); + achievement /= 10000 const rounded = achievement.toFixed(digits); - if (getMult(+rounded, game)[2] === mult[2]) return rounded; + if (getMult(+rounded * 10000, game)[2] === mult[2] && rounded !== '101.0') return rounded; return (+rounded - Math.pow(10, -digits)).toFixed(digits); } diff --git a/AquaNet/src/pages/MaimaiRating.svelte b/AquaNet/src/pages/MaimaiRating.svelte index 5bf3d9a0..9dcb3ff3 100644 --- a/AquaNet/src/pages/MaimaiRating.svelte +++ b/AquaNet/src/pages/MaimaiRating.svelte @@ -2,12 +2,14 @@ import { DATA_HOST } from "../libs/config"; import { getMaimai, getMaimaiAllMusic } from "../libs/maimai"; import type { ParsedRating, Rating } from "../libs/maimaiTypes"; - import { getMult } from "../libs/scoring"; + import { getMult, roundFloor } from "../libs/scoring"; import StatusOverlays from "../components/StatusOverlays.svelte"; + import useLocalStorage from "../libs/hooks/useLocalStorage.svelte"; export let userId: any userId = +userId let error: string | null; + const rounding = useLocalStorage("rounding", true); if (!userId) console.error("No user ID provided") @@ -80,7 +82,13 @@
{rating.music.name} - {(rating.achievement / 10000).toFixed(2)}% + + { + rounding.value ? + roundFloor(rating.achievement, 'mai2', 1) : + (rating.achievement / 10000).toFixed(4) + }% + {rating.calc.toFixed(1)} diff --git a/AquaNet/src/pages/UserHome.svelte b/AquaNet/src/pages/UserHome.svelte index 4c55f076..2ea2b8dd 100644 --- a/AquaNet/src/pages/UserHome.svelte +++ b/AquaNet/src/pages/UserHome.svelte @@ -22,6 +22,7 @@ import { GAME_TITLE, t } from "../libs/i18n"; import RankDetails from "../components/RankDetails.svelte"; import RatingComposition from "../components/RatingComposition.svelte"; + import useLocalStorage from "../libs/hooks/useLocalStorage.svelte"; const TREND_DAYS = 60 @@ -33,6 +34,7 @@ let error: string; let me: AquaNetUser title(`User ${username}`) + const rounding = useLocalStorage("rounding", true); const titleText = GAME_TITLE[game] @@ -268,7 +270,11 @@ {("" + getMult(r.achievement, game)[2]).replace("p", "+")} - {roundFloor(r.achievement, game, 1)}% + { + rounding.value ? + roundFloor(r.achievement, game, 1) : + (r.achievement / 10000).toFixed(4) + }% {#if game === 'mai2' || game === 'wacca'}