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 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.length >= 5) {
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: scoreFunc(deckCards),
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 cardDetails = BaseDeckRecommend.filterCard(await this.cardCalculator.batchGetCardDetail(userCards, eventId));
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.length >= 5) {
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: scoreFunc(deckCards),
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 cardDetails = BaseDeckRecommend.filterCard(await this.cardCalculator.batchGetCardDetail(userCards, eventId));
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 {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sekai-calculator",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
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",