[+] Setting of score rounding and fix bugs

pull/50/head
Clansty 2024-08-08 14:49:20 +08:00
parent d0aecc76ed
commit a6a8734599
No known key found for this signature in database
GPG Key ID: 3A6BE8BAF2EDE134
9 changed files with 106 additions and 8 deletions

View File

@ -38,7 +38,7 @@
{/each}
</div>
<StatusOverlays {error} loading={!gameFields.length && !!submitting}/>
<StatusOverlays {error} loading={!gameFields.length || !!submitting}/>
<style lang="sass">
.fields

View File

@ -2,8 +2,56 @@
import { fade } from "svelte/transition";
import { FADE_IN, FADE_OUT } from "../libs/config";
import GameSettingFields from "./GameSettingFields.svelte";
import { ts } from "../libs/i18n";
import useLocalStorage from "../libs/hooks/useLocalStorage.svelte";
const rounding = useLocalStorage("rounding", true);
</script>
<div out:fade={FADE_OUT} in:fade={FADE_IN}>
<div out:fade={FADE_OUT} in:fade={FADE_IN} class="fields">
<GameSettingFields game="general"/>
<div class="field">
<div class="bool">
<input id="rounding" type="checkbox" bind:checked={rounding.value}/>
<label for="rounding">
<span class="name">{ts(`settings.fields.rounding.name`)}</span>
<span class="desc">{ts(`settings.fields.rounding.desc`)}</span>
</label>
</div>
</div>
</div>
<style lang="sass">
.fields
display: flex
flex-direction: column
gap: 12px
.bool
display: flex
align-items: center
gap: 1rem
label
display: flex
flex-direction: column
.desc
opacity: 0.6
.field
display: flex
flex-direction: column
label
max-width: max-content
> div:not(.bool)
display: flex
align-items: center
gap: 1rem
margin-top: 0.5rem
> input
flex: 1
</style>

View File

@ -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 @@
<span class="rank-text">{("" + getMult(mapData[gameIndex], game)[2]).replace("p", "+")}</span>
<span class="rank-num" use:tooltip={(mapData[gameIndex] / 10000).toFixed(4)}>
{roundFloor(mapData[gameIndex], game, 1)}%
{
rounding.value ?
roundFloor(mapData[gameIndex], game, 1) :
(mapData[gameIndex] / 10000).toFixed(4)
}%
</span>
</span>
{#if game === 'mai2'}

View File

@ -0,0 +1,24 @@
import { onMount } from 'svelte';
const useLocalStorage = <T>(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;

View File

@ -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',

View File

@ -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': '上传',

View File

@ -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);
}

View File

@ -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 @@
<div class="detail">
<span class="name">{rating.music.name}</span>
<span class="rating">
<span>{(rating.achievement / 10000).toFixed(2)}%</span>
<span>
{
rounding.value ?
roundFloor(rating.achievement, 'mai2', 1) :
(rating.achievement / 10000).toFixed(4)
}%
</span>
<img class="rank" src={`${DATA_HOST}/maimai/sprites/rankimage/UI_GAM_Rank_${rating.rank}.png`} alt="">
</span>
<span>{rating.calc.toFixed(1)}</span>

View File

@ -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 @@
<span class={`rank-${getMult(r.achievement, game)[2].toString()[0]}`}>
<span class="rank-text">{("" + getMult(r.achievement, game)[2]).replace("p", "+")}</span>
<span class="rank-num" use:tooltip={(r.achievement / 10000).toFixed(4)}>
{roundFloor(r.achievement, game, 1)}%
{
rounding.value ?
roundFloor(r.achievement, game, 1) :
(r.achievement / 10000).toFixed(4)
}%
</span>
</span>
{#if game === 'mai2' || game === 'wacca'}