feat: release version 1.0.9
This commit is contained in:
@@ -17,6 +17,9 @@ type CombinationCandidate = {
|
||||
overallPower: number;
|
||||
perfectNoteScore: number;
|
||||
directSongScoreBonusPercent?: number;
|
||||
eventBonusPercent?: number;
|
||||
rankingMultiplier?: number;
|
||||
optimizationObjective?: 'maximum' | 'expected';
|
||||
};
|
||||
|
||||
type CombinationRequest = {
|
||||
@@ -30,9 +33,24 @@ type RankedCombination = {
|
||||
overallPower: number;
|
||||
cards?: OptimizerCard[];
|
||||
directSongScoreBonusPercent?: number;
|
||||
eventBonusPercent?: number;
|
||||
rankingMultiplier?: number;
|
||||
achievementProbabilities?: ScoreAchievementProbabilities;
|
||||
};
|
||||
|
||||
function rankingScore(ranking: RankedCombination): number {
|
||||
const score = ranking.rankingMultiplier === undefined
|
||||
? ranking.result.theoreticalMaxScore
|
||||
: ranking.result.expectedScore;
|
||||
return score * (ranking.rankingMultiplier ?? 1);
|
||||
}
|
||||
|
||||
function compareRankings(left: RankedCombination, right: RankedCombination): number {
|
||||
return rankingScore(right) - rankingScore(left) ||
|
||||
right.result.expectedScore - left.result.expectedScore ||
|
||||
right.result.theoreticalMaxScore - left.result.theoreticalMaxScore;
|
||||
}
|
||||
|
||||
type AchievementRequest = {
|
||||
type: 'estimate-achievement';
|
||||
rankings: RankedCombination[];
|
||||
@@ -106,31 +124,26 @@ self.onmessage = (event: MessageEvent<OptimizeRequest | CombinationRequest | Ach
|
||||
const result = optimizeExactOrderAndCooldowns(candidate.cards, event.data.chart, {
|
||||
perfectNoteScore: candidate.perfectNoteScore,
|
||||
directSongScoreBonusPercent: candidate.directSongScoreBonusPercent,
|
||||
objective: candidate.optimizationObjective,
|
||||
onProgress: (progress) => self.postMessage({
|
||||
type: 'progress',
|
||||
progress: { evaluatedCandidates: completedCandidates + progress.evaluatedCandidates, totalCandidates }
|
||||
})
|
||||
});
|
||||
completedCandidates += countOptimizationCandidates(candidate.cards);
|
||||
if (!best || result.theoreticalMaxScore > best.result.theoreticalMaxScore ||
|
||||
(result.theoreticalMaxScore === best.result.theoreticalMaxScore && result.expectedScore > best.result.expectedScore)) {
|
||||
best = {
|
||||
result,
|
||||
overallPower: candidate.overallPower,
|
||||
cards: candidate.cards,
|
||||
directSongScoreBonusPercent: candidate.directSongScoreBonusPercent
|
||||
};
|
||||
}
|
||||
rankings.push({
|
||||
const ranking: RankedCombination = {
|
||||
result,
|
||||
overallPower: candidate.overallPower,
|
||||
cards: candidate.cards,
|
||||
directSongScoreBonusPercent: candidate.directSongScoreBonusPercent
|
||||
});
|
||||
directSongScoreBonusPercent: candidate.directSongScoreBonusPercent,
|
||||
eventBonusPercent: candidate.eventBonusPercent,
|
||||
rankingMultiplier: candidate.rankingMultiplier
|
||||
};
|
||||
if (!best || compareRankings(ranking, best) < 0) best = ranking;
|
||||
rankings.push(ranking);
|
||||
}
|
||||
if (!best) throw new Error('정밀 분석할 조합이 없습니다.');
|
||||
rankings.sort((left, right) => right.result.theoreticalMaxScore - left.result.theoreticalMaxScore ||
|
||||
right.result.expectedScore - left.result.expectedScore);
|
||||
rankings.sort(compareRankings);
|
||||
self.postMessage({ type: 'combination-result', ...best, rankings: rankings.slice(0, 10) });
|
||||
} catch (error) {
|
||||
self.postMessage({
|
||||
|
||||
Reference in New Issue
Block a user