Add 50:50 rank
parent
6ef0c74622
commit
e213abb4ed
|
@ -479,6 +479,7 @@
|
||||||
"totalPull": "Total Pull",
|
"totalPull": "Total Pull",
|
||||||
"luck5": "Luckiness 5★",
|
"luck5": "Luckiness 5★",
|
||||||
"luck4": "Luckiness 4★",
|
"luck4": "Luckiness 4★",
|
||||||
|
"luckWinRateOff": "Luckiness Win 50:50",
|
||||||
"medianTotal": "Global Median {median} pulls",
|
"medianTotal": "Global Median {median} pulls",
|
||||||
"medianLuck": "Global Median {median}%",
|
"medianLuck": "Global Median {median}%",
|
||||||
"moreTotal": "More pulls than {percentage}% of paimon.moe users",
|
"moreTotal": "More pulls than {percentage}% of paimon.moe users",
|
||||||
|
|
|
@ -479,6 +479,7 @@
|
||||||
"totalPull": "Total Wish",
|
"totalPull": "Total Wish",
|
||||||
"luck5": "Keberuntungan 5★",
|
"luck5": "Keberuntungan 5★",
|
||||||
"luck4": "Keberuntungan 4★",
|
"luck4": "Keberuntungan 4★",
|
||||||
|
"luckWinRateOff": "Keberuntungan Menang 50:50",
|
||||||
"medianTotal": "Median Global {median} pull",
|
"medianTotal": "Median Global {median} pull",
|
||||||
"medianLuck": "Median Global {median}%",
|
"medianLuck": "Median Global {median}%",
|
||||||
"moreTotal": "Lebih banyak dari {percentage}% pengguna paimon.moe",
|
"moreTotal": "Lebih banyak dari {percentage}% pengguna paimon.moe",
|
||||||
|
|
|
@ -22,12 +22,26 @@
|
||||||
legendary: '...',
|
legendary: '...',
|
||||||
rare: '...',
|
rare: '...',
|
||||||
};
|
};
|
||||||
|
let percentageWinRateOff = {
|
||||||
|
legendary: 0,
|
||||||
|
rare: 0,
|
||||||
|
};
|
||||||
|
let medianWinRateOff = {
|
||||||
|
legendary: '...',
|
||||||
|
rare: '...',
|
||||||
|
};
|
||||||
let loading = {
|
let loading = {
|
||||||
total: true,
|
total: true,
|
||||||
legendary: true,
|
legendary: true,
|
||||||
rare: true,
|
rare: true,
|
||||||
|
winRateOff: {
|
||||||
|
legendary: true,
|
||||||
|
rare: true,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let disableWinRateOff = false;
|
||||||
|
|
||||||
export async function getData() {
|
export async function getData() {
|
||||||
loading.total = true;
|
loading.total = true;
|
||||||
percentage = 0;
|
percentage = 0;
|
||||||
|
@ -73,7 +87,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
percentage = 100 - (totalLower / total) * 100;
|
percentage = 100 - (totalLower / total) * 100;
|
||||||
console.log(totalLower, percentage, value);
|
|
||||||
|
|
||||||
loading.total = false;
|
loading.total = false;
|
||||||
}
|
}
|
||||||
|
@ -122,16 +135,69 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
percentageLuck[rarity] = 100 - (totalLower / total) * 100;
|
percentageLuck[rarity] = 100 - (totalLower / total) * 100;
|
||||||
console.log(totalLower, percentage, value);
|
|
||||||
|
|
||||||
loading[rarity] = false;
|
loading[rarity] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getDataWinRateOff(rarity, percentages) {
|
||||||
|
loading.winRateOff[rarity] = true;
|
||||||
|
percentageWinRateOff[rarity] = 0;
|
||||||
|
medianWinRateOff[rarity] = '...';
|
||||||
|
|
||||||
|
if (percentages[current] === undefined) return;
|
||||||
|
if (percentages[current].winRateOff === undefined) {
|
||||||
|
disableWinRateOff = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const url = new URL(`${__paimon.env.API_HOST}/wish/summary/winrateoff`);
|
||||||
|
const query = new URLSearchParams({ banner: current, rarity });
|
||||||
|
url.search = query.toString();
|
||||||
|
|
||||||
|
const res = await fetch(url, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
});
|
||||||
|
|
||||||
|
data = await res.json();
|
||||||
|
|
||||||
|
total = 0;
|
||||||
|
const sorted = [];
|
||||||
|
for (const item of data) {
|
||||||
|
total += item[1];
|
||||||
|
sorted.push(...new Array(item[1]).fill(item[0]));
|
||||||
|
}
|
||||||
|
medianWinRateOff[rarity] = (sorted[Math.round(sorted.length / 2)] * 100).toFixed(2);
|
||||||
|
|
||||||
|
getPercentileWinRateOff(percentages[current].winRateOff[rarity], rarity);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPercentileWinRateOff(value, rarity) {
|
||||||
|
let totalLower = 0;
|
||||||
|
for (const item of data) {
|
||||||
|
const qty = item[0];
|
||||||
|
const amount = item[1];
|
||||||
|
totalLower += amount;
|
||||||
|
|
||||||
|
if (qty >= value) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
percentageWinRateOff[rarity] = 100 - (totalLower / total) * 100;
|
||||||
|
|
||||||
|
loading.winRateOff[rarity] = false;
|
||||||
|
}
|
||||||
|
|
||||||
export function getDataLuckAll(percentages) {
|
export function getDataLuckAll(percentages) {
|
||||||
const sources = percentages === undefined ? wishPercentage : percentages;
|
const sources = percentages === undefined ? wishPercentage : percentages;
|
||||||
|
|
||||||
getDataLuck('legendary', sources);
|
getDataLuck('legendary', sources);
|
||||||
getDataLuck('rare', sources);
|
getDataLuck('rare', sources);
|
||||||
|
|
||||||
|
getDataWinRateOff('legendary', sources);
|
||||||
}
|
}
|
||||||
|
|
||||||
function change(type) {
|
function change(type) {
|
||||||
|
@ -143,6 +209,7 @@
|
||||||
$: fixedPoint = percentage < 0.1 ? 2 : percentage < 2 ? 1 : 0;
|
$: fixedPoint = percentage < 0.1 ? 2 : percentage < 2 ? 1 : 0;
|
||||||
$: fixedPointLegendary = percentageLuck.legendary < 0.1 ? 2 : percentageLuck.legendary < 2 ? 1 : 0;
|
$: fixedPointLegendary = percentageLuck.legendary < 0.1 ? 2 : percentageLuck.legendary < 2 ? 1 : 0;
|
||||||
$: fixedPointRare = percentageLuck.rare < 0.1 ? 2 : percentageLuck.rare < 2 ? 1 : 0;
|
$: fixedPointRare = percentageLuck.rare < 0.1 ? 2 : percentageLuck.rare < 2 ? 1 : 0;
|
||||||
|
$: fixedPointWinRateOff = percentageWinRateOff < 0.1 ? 2 : percentageWinRateOff < 2 ? 1 : 0;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="flex flex-col items-center bg-item rounded-xl p-4 w-full mt-4">
|
<div class="flex flex-col items-center bg-item rounded-xl p-4 w-full mt-4">
|
||||||
|
@ -182,6 +249,44 @@
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{#if current !== 'standard' && !disableWinRateOff}
|
||||||
|
<div class="bg-background flex-row items-center justify-center mb-2 p-4 rounded-xl flex relative group w-full">
|
||||||
|
<div
|
||||||
|
class="group-hover:flex hidden absolute left-0 items-center z-10"
|
||||||
|
style="max-width: 80%; bottom: 12px; left: 12px;"
|
||||||
|
>
|
||||||
|
<div class="bg-gray-200 text-gray-900 px-4 py-1 rounded-xl text-sm md:text-base">
|
||||||
|
{$t('wish.rank.medianLuck', { values: { median: medianWinRateOff.legendary } })}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="text-gray-200 flex-1">
|
||||||
|
<p class="text-gray-200">{$t('wish.rank.luckWinRateOff')}</p>
|
||||||
|
<p class="text-sm text-gray-600 leading-none">
|
||||||
|
{#if percentageWinRateOff.legendary < 50}
|
||||||
|
{$t('wish.rank.moreLuck', {
|
||||||
|
values: { percentage: (100 - percentageWinRateOff.legendary).toFixed(fixedPointRare) },
|
||||||
|
})}
|
||||||
|
{:else}
|
||||||
|
{$t('wish.rank.lessLuck', { values: { percentage: percentageWinRateOff.legendary.toFixed(0) } })}
|
||||||
|
{/if}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="pl-3">
|
||||||
|
<span class="text-sm font-black text-white opacity-75 block leading-none">
|
||||||
|
{loading.winRateOff.legendary
|
||||||
|
? $t('wish.rank.top')
|
||||||
|
: $t(`wish.rank.${percentageWinRateOff.legendary < 50 ? 'top' : 'bottom'}`)}
|
||||||
|
</span>
|
||||||
|
<span class="text-white font-black text-3xl leading-none block" style="line-height: 0.75;">
|
||||||
|
{loading.winRateOff.legendary
|
||||||
|
? '...'
|
||||||
|
: percentageWinRateOff.legendary < 50
|
||||||
|
? percentageWinRateOff.legendary.toFixed(fixedPointWinRateOff)
|
||||||
|
: (100 - percentageWinRateOff.legendary).toFixed(fixedPointWinRateOff)}%
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
<div class="bg-background flex-row items-center justify-center mb-2 p-4 rounded-xl flex relative group w-full">
|
<div class="bg-background flex-row items-center justify-center mb-2 p-4 rounded-xl flex relative group w-full">
|
||||||
<div
|
<div
|
||||||
class="group-hover:flex hidden absolute left-0 items-center z-10"
|
class="group-hover:flex hidden absolute left-0 items-center z-10"
|
||||||
|
|
|
@ -227,9 +227,17 @@
|
||||||
(counterData.rateoff.legendary.win + counterData.rateoff.legendary.lose),
|
(counterData.rateoff.legendary.win + counterData.rateoff.legendary.lose),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
percentages[type.id] = {
|
||||||
|
winRateOff: {
|
||||||
|
legendary: avg[type.id].legendary.rateOff.percentage,
|
||||||
|
rare: avg[type.id].rare.rateOff.percentage,
|
||||||
|
},
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
percentages[type.id] = {
|
percentages[type.id] = {
|
||||||
|
...percentages[type.id],
|
||||||
legendary: avg[type.id].legendary.percentage,
|
legendary: avg[type.id].legendary.percentage,
|
||||||
rare: avg[type.id].rare.percentage,
|
rare: avg[type.id].rare.percentage,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue