mirror of https://github.com/hykilpikonna/AquaDX
[+] Setting of score rounding and fix bugs
parent
d0aecc76ed
commit
a6a8734599
|
@ -38,7 +38,7 @@
|
||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<StatusOverlays {error} loading={!gameFields.length && !!submitting}/>
|
<StatusOverlays {error} loading={!gameFields.length || !!submitting}/>
|
||||||
|
|
||||||
<style lang="sass">
|
<style lang="sass">
|
||||||
.fields
|
.fields
|
||||||
|
|
|
@ -2,8 +2,56 @@
|
||||||
import { fade } from "svelte/transition";
|
import { fade } from "svelte/transition";
|
||||||
import { FADE_IN, FADE_OUT } from "../libs/config";
|
import { FADE_IN, FADE_OUT } from "../libs/config";
|
||||||
import GameSettingFields from "./GameSettingFields.svelte";
|
import GameSettingFields from "./GameSettingFields.svelte";
|
||||||
|
import { ts } from "../libs/i18n";
|
||||||
|
import useLocalStorage from "../libs/hooks/useLocalStorage.svelte";
|
||||||
|
|
||||||
|
const rounding = useLocalStorage("rounding", true);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div out:fade={FADE_OUT} in:fade={FADE_IN}>
|
<div out:fade={FADE_OUT} in:fade={FADE_IN} class="fields">
|
||||||
<GameSettingFields game="general"/>
|
<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>
|
</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>
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
import { coverNotFound } from "../libs/ui";
|
import { coverNotFound } from "../libs/ui";
|
||||||
import type { MusicMeta } from "../libs/generalTypes";
|
import type { MusicMeta } from "../libs/generalTypes";
|
||||||
import { tooltip } from "../libs/ui";
|
import { tooltip } from "../libs/ui";
|
||||||
|
import useLocalStorage from "../libs/hooks/useLocalStorage.svelte";
|
||||||
|
|
||||||
export let g: string
|
export let g: string
|
||||||
export let meta: MusicMeta
|
export let meta: MusicMeta
|
||||||
|
@ -16,6 +17,9 @@
|
||||||
let mapData = g.split(":").map(Number)
|
let mapData = g.split(":").map(Number)
|
||||||
let mult = getMult(mapData[3], game)
|
let mult = getMult(mapData[3], game)
|
||||||
let mapRank: number | undefined = meta?.notes?.[mapData[1] === 10 ? 0 : mapData[1]]?.lv
|
let mapRank: number | undefined = meta?.notes?.[mapData[1] === 10 ? 0 : mapData[1]]?.lv
|
||||||
|
const rounding = useLocalStorage("rounding", true);
|
||||||
|
|
||||||
|
console.log(rounding.value)
|
||||||
|
|
||||||
let gameIndexMap = {
|
let gameIndexMap = {
|
||||||
'mai2': 3,
|
'mai2': 3,
|
||||||
|
@ -42,7 +46,11 @@
|
||||||
|
|
||||||
<span class="rank-text">{("" + getMult(mapData[gameIndex], game)[2]).replace("p", "+")}</span>
|
<span class="rank-text">{("" + getMult(mapData[gameIndex], game)[2]).replace("p", "+")}</span>
|
||||||
<span class="rank-num" use:tooltip={(mapData[gameIndex] / 10000).toFixed(4)}>
|
<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>
|
||||||
</span>
|
</span>
|
||||||
{#if game === 'mai2'}
|
{#if game === 'mai2'}
|
||||||
|
|
|
@ -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;
|
|
@ -137,6 +137,8 @@ export const EN_REF_SETTINGS = {
|
||||||
'settings.fields.waccaInfiniteWp.desc': 'Set WP to 999999',
|
'settings.fields.waccaInfiniteWp.desc': 'Set WP to 999999',
|
||||||
'settings.fields.waccaAlwaysVip.name': 'Wacca: Always VIP',
|
'settings.fields.waccaAlwaysVip.name': 'Wacca: Always VIP',
|
||||||
'settings.fields.waccaAlwaysVip.desc': 'Set VIP expiration date to 2077-01-01',
|
'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.mai2.name': 'Player Name',
|
||||||
'settings.profile.picture': 'Profile Picture',
|
'settings.profile.picture': 'Profile Picture',
|
||||||
'settings.profile.upload-new': 'Upload New',
|
'settings.profile.upload-new': 'Upload New',
|
||||||
|
|
|
@ -146,6 +146,8 @@ const zhSettings: typeof EN_REF_SETTINGS = {
|
||||||
'settings.fields.waccaInfiniteWp.desc': '将 WP 设置为 999999',
|
'settings.fields.waccaInfiniteWp.desc': '将 WP 设置为 999999',
|
||||||
'settings.fields.waccaAlwaysVip.name': 'Wacca: 永久会员',
|
'settings.fields.waccaAlwaysVip.name': 'Wacca: 永久会员',
|
||||||
'settings.fields.waccaAlwaysVip.desc': '将 VIP 到期时间设置为 2077-01-01',
|
'settings.fields.waccaAlwaysVip.desc': '将 VIP 到期时间设置为 2077-01-01',
|
||||||
|
'settings.fields.rounding.name': '分数舍入',
|
||||||
|
'settings.fields.rounding.desc': '把分数四舍五入到一位小数',
|
||||||
'settings.mai2.name': '玩家名字',
|
'settings.mai2.name': '玩家名字',
|
||||||
'settings.profile.picture': '头像',
|
'settings.profile.picture': '头像',
|
||||||
'settings.profile.upload-new': '上传',
|
'settings.profile.upload-new': '上传',
|
||||||
|
|
|
@ -76,10 +76,10 @@ export function getMult(achievement: number, game: GameName) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function roundFloor(achievement: number, game: GameName, digits = 2) {
|
export function roundFloor(achievement: number, game: GameName, digits = 2) {
|
||||||
achievement /= 10000
|
|
||||||
// Round, but if the rounded number reaches the next rank, use floor instead
|
// Round, but if the rounded number reaches the next rank, use floor instead
|
||||||
const mult = getMult(achievement, game);
|
const mult = getMult(achievement, game);
|
||||||
|
achievement /= 10000
|
||||||
const rounded = achievement.toFixed(digits);
|
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);
|
return (+rounded - Math.pow(10, -digits)).toFixed(digits);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,12 +2,14 @@
|
||||||
import { DATA_HOST } from "../libs/config";
|
import { DATA_HOST } from "../libs/config";
|
||||||
import { getMaimai, getMaimaiAllMusic } from "../libs/maimai";
|
import { getMaimai, getMaimaiAllMusic } from "../libs/maimai";
|
||||||
import type { ParsedRating, Rating } from "../libs/maimaiTypes";
|
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 StatusOverlays from "../components/StatusOverlays.svelte";
|
||||||
|
import useLocalStorage from "../libs/hooks/useLocalStorage.svelte";
|
||||||
|
|
||||||
export let userId: any
|
export let userId: any
|
||||||
userId = +userId
|
userId = +userId
|
||||||
let error: string | null;
|
let error: string | null;
|
||||||
|
const rounding = useLocalStorage("rounding", true);
|
||||||
|
|
||||||
if (!userId) console.error("No user ID provided")
|
if (!userId) console.error("No user ID provided")
|
||||||
|
|
||||||
|
@ -80,7 +82,13 @@
|
||||||
<div class="detail">
|
<div class="detail">
|
||||||
<span class="name">{rating.music.name}</span>
|
<span class="name">{rating.music.name}</span>
|
||||||
<span class="rating">
|
<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="">
|
<img class="rank" src={`${DATA_HOST}/maimai/sprites/rankimage/UI_GAM_Rank_${rating.rank}.png`} alt="">
|
||||||
</span>
|
</span>
|
||||||
<span>{rating.calc.toFixed(1)}</span>
|
<span>{rating.calc.toFixed(1)}</span>
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
import { GAME_TITLE, t } from "../libs/i18n";
|
import { GAME_TITLE, t } from "../libs/i18n";
|
||||||
import RankDetails from "../components/RankDetails.svelte";
|
import RankDetails from "../components/RankDetails.svelte";
|
||||||
import RatingComposition from "../components/RatingComposition.svelte";
|
import RatingComposition from "../components/RatingComposition.svelte";
|
||||||
|
import useLocalStorage from "../libs/hooks/useLocalStorage.svelte";
|
||||||
|
|
||||||
const TREND_DAYS = 60
|
const TREND_DAYS = 60
|
||||||
|
|
||||||
|
@ -33,6 +34,7 @@
|
||||||
let error: string;
|
let error: string;
|
||||||
let me: AquaNetUser
|
let me: AquaNetUser
|
||||||
title(`User ${username}`)
|
title(`User ${username}`)
|
||||||
|
const rounding = useLocalStorage("rounding", true);
|
||||||
|
|
||||||
const titleText = GAME_TITLE[game]
|
const titleText = GAME_TITLE[game]
|
||||||
|
|
||||||
|
@ -268,7 +270,11 @@
|
||||||
<span class={`rank-${getMult(r.achievement, game)[2].toString()[0]}`}>
|
<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-text">{("" + getMult(r.achievement, game)[2]).replace("p", "+")}</span>
|
||||||
<span class="rank-num" use:tooltip={(r.achievement / 10000).toFixed(4)}>
|
<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>
|
||||||
</span>
|
</span>
|
||||||
{#if game === 'mai2' || game === 'wacca'}
|
{#if game === 'mai2' || game === 'wacca'}
|
||||||
|
|
Loading…
Reference in New Issue