sekai-calculator 0.6.6 → 0.6.7

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 CHANGED
@@ -625,16 +625,22 @@ class BaseDeckRecommend {
625
625
  }
626
626
  return false;
627
627
  }
628
- static filterCard(cardDetails) {
629
- let afterFilter = cardDetails;
628
+ static filterCard(cardDetails, preMinBonus = 65) {
630
629
  for (const minBonus of [55, 50, 45, 40, 30, 25, 15, 5, 0]) {
630
+ if (minBonus >= preMinBonus)
631
+ continue;
631
632
  const bonusFilter = cardDetails.filter(cardDetail => !(cardDetail.eventBonus !== undefined && cardDetail.eventBonus < minBonus));
632
633
  if (this.canMakeEventDeck(bonusFilter)) {
633
- afterFilter = bonusFilter;
634
- break;
634
+ return {
635
+ minBonus,
636
+ cards: bonusFilter
637
+ };
635
638
  }
636
639
  }
637
- return afterFilter;
640
+ return {
641
+ minBonus: 0,
642
+ cards: cardDetails
643
+ };
638
644
  }
639
645
  static findBestCards(cardDetails, scoreFunc, limit = 1, isChallengeLive = false, member = 5, honorBonus = 0, deckCards = [], deckCharacters = []) {
640
646
  if (deckCards.length === member) {
@@ -674,16 +680,26 @@ class BaseDeckRecommend {
674
680
  if (ans.length > limit)
675
681
  ans = ans.slice(0, limit);
676
682
  }
677
- if (deckCards.length === 0 && ans.length === 0)
678
- throw new Error(`Cannot find deck in ${cardDetails.length} cards`);
683
+ if (deckCards.length === 0 && ans.length === 0) {
684
+ throw new Error(`Cannot find deck in ${cardDetails.length} cards(${cardDetails.map(it => it.cardId).toString()})`);
685
+ }
679
686
  return ans;
680
687
  }
681
688
  async recommendHighScoreDeck(userCards, scoreFunc, { musicMeta, limit = 1, member = 5, cardConfig = {} }, eventId = 0, isChallengeLive = false) {
682
689
  const cards = await this.cardCalculator.batchGetCardDetail(userCards, cardConfig, eventId);
683
- let cardDetails = (isChallengeLive || eventId === 0) ? cards : BaseDeckRecommend.filterCard(cards);
684
- cardDetails = cardDetails.sort((a, b) => a.cardId - b.cardId);
685
690
  const honorBonus = await this.deckCalculator.getHonorBonusPower();
686
- return BaseDeckRecommend.findBestCards(cardDetails, deckCards => scoreFunc(musicMeta, honorBonus, deckCards), limit, isChallengeLive, member, honorBonus);
691
+ let minBonus = (isChallengeLive || eventId === 0) ? 0 : 65;
692
+ while (minBonus > 0) {
693
+ const cardDetails = BaseDeckRecommend.filterCard(cards, minBonus);
694
+ minBonus = cardDetails.minBonus;
695
+ try {
696
+ return BaseDeckRecommend.findBestCards(cardDetails.cards, deckCards => scoreFunc(musicMeta, honorBonus, deckCards), limit, isChallengeLive, member, honorBonus);
697
+ }
698
+ catch (e) {
699
+ console.warn(e);
700
+ }
701
+ }
702
+ return BaseDeckRecommend.findBestCards(cards, deckCards => scoreFunc(musicMeta, honorBonus, deckCards), limit, isChallengeLive, member, honorBonus);
687
703
  }
688
704
  static getLiveScoreFunction(liveType) {
689
705
  return (musicMeta, honorBonus, deckCards) => LiveCalculator.getLiveScoreByDeck(deckCards, honorBonus, musicMeta, liveType);
package/dist/index.mjs CHANGED
@@ -623,16 +623,22 @@ class BaseDeckRecommend {
623
623
  }
624
624
  return false;
625
625
  }
626
- static filterCard(cardDetails) {
627
- let afterFilter = cardDetails;
626
+ static filterCard(cardDetails, preMinBonus = 65) {
628
627
  for (const minBonus of [55, 50, 45, 40, 30, 25, 15, 5, 0]) {
628
+ if (minBonus >= preMinBonus)
629
+ continue;
629
630
  const bonusFilter = cardDetails.filter(cardDetail => !(cardDetail.eventBonus !== undefined && cardDetail.eventBonus < minBonus));
630
631
  if (this.canMakeEventDeck(bonusFilter)) {
631
- afterFilter = bonusFilter;
632
- break;
632
+ return {
633
+ minBonus,
634
+ cards: bonusFilter
635
+ };
633
636
  }
634
637
  }
635
- return afterFilter;
638
+ return {
639
+ minBonus: 0,
640
+ cards: cardDetails
641
+ };
636
642
  }
637
643
  static findBestCards(cardDetails, scoreFunc, limit = 1, isChallengeLive = false, member = 5, honorBonus = 0, deckCards = [], deckCharacters = []) {
638
644
  if (deckCards.length === member) {
@@ -672,16 +678,26 @@ class BaseDeckRecommend {
672
678
  if (ans.length > limit)
673
679
  ans = ans.slice(0, limit);
674
680
  }
675
- if (deckCards.length === 0 && ans.length === 0)
676
- throw new Error(`Cannot find deck in ${cardDetails.length} cards`);
681
+ if (deckCards.length === 0 && ans.length === 0) {
682
+ throw new Error(`Cannot find deck in ${cardDetails.length} cards(${cardDetails.map(it => it.cardId).toString()})`);
683
+ }
677
684
  return ans;
678
685
  }
679
686
  async recommendHighScoreDeck(userCards, scoreFunc, { musicMeta, limit = 1, member = 5, cardConfig = {} }, eventId = 0, isChallengeLive = false) {
680
687
  const cards = await this.cardCalculator.batchGetCardDetail(userCards, cardConfig, eventId);
681
- let cardDetails = (isChallengeLive || eventId === 0) ? cards : BaseDeckRecommend.filterCard(cards);
682
- cardDetails = cardDetails.sort((a, b) => a.cardId - b.cardId);
683
688
  const honorBonus = await this.deckCalculator.getHonorBonusPower();
684
- return BaseDeckRecommend.findBestCards(cardDetails, deckCards => scoreFunc(musicMeta, honorBonus, deckCards), limit, isChallengeLive, member, honorBonus);
689
+ let minBonus = (isChallengeLive || eventId === 0) ? 0 : 65;
690
+ while (minBonus > 0) {
691
+ const cardDetails = BaseDeckRecommend.filterCard(cards, minBonus);
692
+ minBonus = cardDetails.minBonus;
693
+ try {
694
+ return BaseDeckRecommend.findBestCards(cardDetails.cards, deckCards => scoreFunc(musicMeta, honorBonus, deckCards), limit, isChallengeLive, member, honorBonus);
695
+ }
696
+ catch (e) {
697
+ console.warn(e);
698
+ }
699
+ }
700
+ return BaseDeckRecommend.findBestCards(cards, deckCards => scoreFunc(musicMeta, honorBonus, deckCards), limit, isChallengeLive, member, honorBonus);
685
701
  }
686
702
  static getLiveScoreFunction(liveType) {
687
703
  return (musicMeta, honorBonus, deckCards) => LiveCalculator.getLiveScoreByDeck(deckCards, honorBonus, musicMeta, liveType);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sekai-calculator",
3
- "version": "0.6.6",
3
+ "version": "0.6.7",
4
4
  "description": "Project SEKAI Calculator for deck power, live score, event point and more.",
5
5
  "type": "module",
6
6
  "types": "dist/index.d.ts",