sekai-calculator 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +21 -3
- package/dist/index.mjs +21 -3
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -519,11 +519,25 @@ class BaseDeckRecommend {
|
|
|
519
519
|
this.cardCalculator = new CardCalculator(dataProvider);
|
|
520
520
|
this.deckCalculator = new DeckCalculator(dataProvider);
|
|
521
521
|
}
|
|
522
|
+
static canMakeEventDeck(cardDetails) {
|
|
523
|
+
const map = new Map();
|
|
524
|
+
for (const cardDetail of cardDetails) {
|
|
525
|
+
computeWithDefault(map, cardDetail.attr, new Set(), it => it.add(cardDetail.characterId));
|
|
526
|
+
for (const unit of cardDetail.units) {
|
|
527
|
+
computeWithDefault(map, unit, new Set(), it => it.add(cardDetail.characterId));
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
for (const v of map.values()) {
|
|
531
|
+
if (v.size >= 5)
|
|
532
|
+
return true;
|
|
533
|
+
}
|
|
534
|
+
return false;
|
|
535
|
+
}
|
|
522
536
|
static filterCard(cardDetails) {
|
|
523
537
|
let afterFilter = cardDetails;
|
|
524
538
|
for (const minBonus of [65, 50, 40, 25, 15, 0]) {
|
|
525
539
|
const bonusFilter = cardDetails.filter(cardDetail => !(cardDetail.eventBonus !== undefined && cardDetail.eventBonus < minBonus));
|
|
526
|
-
if (bonusFilter
|
|
540
|
+
if (this.canMakeEventDeck(bonusFilter)) {
|
|
527
541
|
afterFilter = bonusFilter;
|
|
528
542
|
break;
|
|
529
543
|
}
|
|
@@ -532,8 +546,9 @@ class BaseDeckRecommend {
|
|
|
532
546
|
}
|
|
533
547
|
static findBestCards(cardDetails, scoreFunc, isChallengeLive = false, member = 5, deckCards = [], deckCharacters = []) {
|
|
534
548
|
if (deckCards.length === member) {
|
|
549
|
+
const score = scoreFunc(deckCards);
|
|
535
550
|
return {
|
|
536
|
-
score
|
|
551
|
+
score,
|
|
537
552
|
deckCards
|
|
538
553
|
};
|
|
539
554
|
}
|
|
@@ -559,10 +574,13 @@ class BaseDeckRecommend {
|
|
|
559
574
|
if (result.score > ans.score)
|
|
560
575
|
ans = result;
|
|
561
576
|
}
|
|
577
|
+
if (deckCards.length === 0 && ans.score === 0)
|
|
578
|
+
throw new Error(`Cannot find deck in ${cardDetails.length} cards`);
|
|
562
579
|
return ans;
|
|
563
580
|
}
|
|
564
581
|
async recommendHighScoreDeck(userCards, musicMeta, scoreFunc, eventId = 0, isChallengeLive = false, member = 5) {
|
|
565
|
-
const
|
|
582
|
+
const cards = await this.cardCalculator.batchGetCardDetail(userCards, eventId);
|
|
583
|
+
const cardDetails = (isChallengeLive || eventId === 0) ? cards : BaseDeckRecommend.filterCard(cards);
|
|
566
584
|
const honorBonus = await this.deckCalculator.getHonorBonusPower();
|
|
567
585
|
const best = BaseDeckRecommend.findBestCards(cardDetails, deckCards => scoreFunc(musicMeta, honorBonus, deckCards), isChallengeLive, member);
|
|
568
586
|
return {
|
package/dist/index.mjs
CHANGED
|
@@ -517,11 +517,25 @@ class BaseDeckRecommend {
|
|
|
517
517
|
this.cardCalculator = new CardCalculator(dataProvider);
|
|
518
518
|
this.deckCalculator = new DeckCalculator(dataProvider);
|
|
519
519
|
}
|
|
520
|
+
static canMakeEventDeck(cardDetails) {
|
|
521
|
+
const map = new Map();
|
|
522
|
+
for (const cardDetail of cardDetails) {
|
|
523
|
+
computeWithDefault(map, cardDetail.attr, new Set(), it => it.add(cardDetail.characterId));
|
|
524
|
+
for (const unit of cardDetail.units) {
|
|
525
|
+
computeWithDefault(map, unit, new Set(), it => it.add(cardDetail.characterId));
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
for (const v of map.values()) {
|
|
529
|
+
if (v.size >= 5)
|
|
530
|
+
return true;
|
|
531
|
+
}
|
|
532
|
+
return false;
|
|
533
|
+
}
|
|
520
534
|
static filterCard(cardDetails) {
|
|
521
535
|
let afterFilter = cardDetails;
|
|
522
536
|
for (const minBonus of [65, 50, 40, 25, 15, 0]) {
|
|
523
537
|
const bonusFilter = cardDetails.filter(cardDetail => !(cardDetail.eventBonus !== undefined && cardDetail.eventBonus < minBonus));
|
|
524
|
-
if (bonusFilter
|
|
538
|
+
if (this.canMakeEventDeck(bonusFilter)) {
|
|
525
539
|
afterFilter = bonusFilter;
|
|
526
540
|
break;
|
|
527
541
|
}
|
|
@@ -530,8 +544,9 @@ class BaseDeckRecommend {
|
|
|
530
544
|
}
|
|
531
545
|
static findBestCards(cardDetails, scoreFunc, isChallengeLive = false, member = 5, deckCards = [], deckCharacters = []) {
|
|
532
546
|
if (deckCards.length === member) {
|
|
547
|
+
const score = scoreFunc(deckCards);
|
|
533
548
|
return {
|
|
534
|
-
score
|
|
549
|
+
score,
|
|
535
550
|
deckCards
|
|
536
551
|
};
|
|
537
552
|
}
|
|
@@ -557,10 +572,13 @@ class BaseDeckRecommend {
|
|
|
557
572
|
if (result.score > ans.score)
|
|
558
573
|
ans = result;
|
|
559
574
|
}
|
|
575
|
+
if (deckCards.length === 0 && ans.score === 0)
|
|
576
|
+
throw new Error(`Cannot find deck in ${cardDetails.length} cards`);
|
|
560
577
|
return ans;
|
|
561
578
|
}
|
|
562
579
|
async recommendHighScoreDeck(userCards, musicMeta, scoreFunc, eventId = 0, isChallengeLive = false, member = 5) {
|
|
563
|
-
const
|
|
580
|
+
const cards = await this.cardCalculator.batchGetCardDetail(userCards, eventId);
|
|
581
|
+
const cardDetails = (isChallengeLive || eventId === 0) ? cards : BaseDeckRecommend.filterCard(cards);
|
|
564
582
|
const honorBonus = await this.deckCalculator.getHonorBonusPower();
|
|
565
583
|
const best = BaseDeckRecommend.findBestCards(cardDetails, deckCards => scoreFunc(musicMeta, honorBonus, deckCards), isChallengeLive, member);
|
|
566
584
|
return {
|