sekai-calculator 0.1.0 → 0.1.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
@@ -27,10 +27,61 @@ function duplicateObj(obj, times) {
27
27
  ret.push(obj);
28
28
  return ret;
29
29
  }
30
- function mapOrUndefined(arr, fun) {
31
- if (arr === undefined)
32
- return undefined;
33
- return arr.map(fun);
30
+
31
+ class DeckService {
32
+ dataProvider;
33
+ constructor(dataProvider) {
34
+ this.dataProvider = dataProvider;
35
+ }
36
+ async getUserCard(cardId) {
37
+ const userCards = await this.dataProvider.getUserData('userCards');
38
+ return findOrThrow(userCards, it => it.cardId === cardId);
39
+ }
40
+ async getDeck(deckId) {
41
+ const userDecks = await this.dataProvider.getUserData('userDecks');
42
+ return findOrThrow(userDecks, it => it.deckId === deckId);
43
+ }
44
+ async getDeckCards(userDeck) {
45
+ const cardIds = [userDeck.member1, userDeck.member2, userDeck.member3, userDeck.member4, userDeck.member5];
46
+ return await Promise.all(cardIds.map(async (id) => await this.getUserCard(id)));
47
+ }
48
+ static toUserDeck(userCards, deckId = 1, name = 'ユニット01') {
49
+ if (userCards.length !== 5)
50
+ throw new Error('deck card should be 5');
51
+ return {
52
+ userId: userCards[0].userId,
53
+ deckId,
54
+ name,
55
+ leader: userCards[0].cardId,
56
+ subLeader: userCards[1].cardId,
57
+ member1: userCards[0].cardId,
58
+ member2: userCards[1].cardId,
59
+ member3: userCards[2].cardId,
60
+ member4: userCards[3].cardId,
61
+ member5: userCards[4].cardId
62
+ };
63
+ }
64
+ async getChallengeLiveSoloDeck(characterId) {
65
+ const userChallengeLiveSoloDecks = await this.dataProvider.getUserData('userChallengeLiveSoloDecks');
66
+ return findOrThrow(userChallengeLiveSoloDecks, it => it.characterId === characterId);
67
+ }
68
+ async getChallengeLiveSoloDeckCards(deck) {
69
+ const cardIds = [deck.leader, deck.support1, deck.support2, deck.support3, deck.support4];
70
+ return await Promise.all(cardIds.filter(it => it !== undefined && it !== null)
71
+ .map(async (id) => await this.getUserCard(id === null ? 0 : id)));
72
+ }
73
+ static toUserChallengeLiveSoloDeck(userCards, characterId) {
74
+ if (userCards.length !== 5)
75
+ throw new Error('deck card should be 5');
76
+ return {
77
+ characterId,
78
+ leader: userCards[0].cardId,
79
+ support1: userCards[1].cardId,
80
+ support2: userCards[2].cardId,
81
+ support3: userCards[3].cardId,
82
+ support4: userCards[4].cardId
83
+ };
84
+ }
34
85
  }
35
86
 
36
87
  class CardPowerCalculator {
@@ -222,18 +273,6 @@ class DeckCalculator {
222
273
  this.dataProvider = dataProvider;
223
274
  this.cardCalculator = new CardCalculator(dataProvider);
224
275
  }
225
- async getDeck(deckId) {
226
- const userDecks = await this.dataProvider.getUserData('userDecks');
227
- return findOrThrow(userDecks, it => it.deckId === deckId);
228
- }
229
- async getDeckCards(userDeck) {
230
- const userCards = await this.dataProvider.getUserData('userCards');
231
- const cardIds = [userDeck.member1, userDeck.member2, userDeck.member3, userDeck.member4, userDeck.member5];
232
- return cardIds.map(id => findOrThrow(userCards, it => it.cardId === id));
233
- }
234
- async getDeckCardsById(deckId) {
235
- return await this.getDeckCards(await this.getDeck(deckId));
236
- }
237
276
  async getHonorBonusPower() {
238
277
  const honors = await this.dataProvider.getMasterData('honors');
239
278
  const userHonors = await this.dataProvider.getUserData('userHonors');
@@ -268,9 +307,6 @@ class DeckCalculator {
268
307
  const cardDetails = await Promise.all(deckCards.map(async (it) => await this.cardCalculator.getCardDetail(it, userItemLevels)));
269
308
  return await this.getDeckDetailByCards(cardDetails, await this.getHonorBonusPower());
270
309
  }
271
- async getDeckDetailById(deckId) {
272
- return await this.getDeckDetail(await this.getDeckCardsById(deckId));
273
- }
274
310
  }
275
311
 
276
312
  class CardEventCalculator {
@@ -314,21 +350,39 @@ class CardEventCalculator {
314
350
 
315
351
  class EventCalculator {
316
352
  dataProvider;
317
- deckCalculator;
318
353
  cardEventCalculator;
319
354
  constructor(dataProvider) {
320
355
  this.dataProvider = dataProvider;
321
- this.deckCalculator = new DeckCalculator(dataProvider);
322
356
  this.cardEventCalculator = new CardEventCalculator(dataProvider);
323
357
  }
324
- async getDeckEventBonus(userDeck, eventId) {
325
- const deckCards = await this.deckCalculator.getDeckCards(userDeck);
358
+ async getDeckEventBonus(deckCards, eventId) {
326
359
  return await deckCards.reduce(async (v, it) => await v + await this.cardEventCalculator.getCardEventBonus(it, eventId), Promise.resolve(0));
327
360
  }
328
- async getDeckEventBonusById(deckId, eventId) {
329
- return await this.getDeckEventBonus(await this.deckCalculator.getDeck(deckId), eventId);
361
+ static getEventPoint(type, selfScore, musicRate = 100, deckBonus = 0, boostRate = 1, otherScore = 0, life = 1000) {
362
+ const musicRate0 = musicRate / 100;
363
+ const deckRate = deckBonus / 100 + 1;
364
+ switch (type) {
365
+ case exports.EventLiveType.SOLO:
366
+ return Math.floor((100 + Math.floor(selfScore / 20000)) * musicRate0 * deckRate) * boostRate;
367
+ case exports.EventLiveType.CHALLENGE:
368
+ return (100 + Math.floor(selfScore / 20000)) * 120;
369
+ case exports.EventLiveType.MULTI:
370
+ return Math.floor((110 + Math.floor(selfScore / 17000) +
371
+ Math.floor(Math.min(otherScore, 5200000) / 400000)) * musicRate0 * deckRate) * boostRate;
372
+ case exports.EventLiveType.CHEERFUL:
373
+ return Math.floor((114 + Math.floor(selfScore / 12500) +
374
+ Math.floor(Math.min(otherScore, 4400000) / 400000) + Math.floor(Math.min(life, 1000) / 25)) *
375
+ musicRate0 * deckRate) * boostRate;
376
+ }
330
377
  }
331
378
  }
379
+ exports.EventLiveType = void 0;
380
+ (function (EventLiveType) {
381
+ EventLiveType["SOLO"] = "solo";
382
+ EventLiveType["CHALLENGE"] = "challenge";
383
+ EventLiveType["MULTI"] = "multi";
384
+ EventLiveType["CHEERFUL"] = "cheerful";
385
+ })(exports.EventLiveType || (exports.EventLiveType = {}));
332
386
 
333
387
  class LiveCalculator {
334
388
  dataProvider;
@@ -377,23 +431,40 @@ class LiveCalculator {
377
431
  tap: musicMeta.tap_count
378
432
  };
379
433
  }
380
- getMultiLiveSkill(deckDetail) {
434
+ static getMultiLiveSkill(deckDetail) {
381
435
  const scoreUp = deckDetail.skill.reduce((v, it, i) => v + (i === 0 ? it.scoreUp : (it.scoreUp / 5)), 0);
382
436
  const lifeRecovery = deckDetail.skill[0].lifeRecovery;
383
- return { scoreUp, lifeRecovery };
437
+ return {
438
+ scoreUp,
439
+ lifeRecovery
440
+ };
441
+ }
442
+ static getSoloLiveSkill(liveSkills, skillDetails) {
443
+ if (liveSkills === undefined)
444
+ return undefined;
445
+ const skills = liveSkills.map(liveSkill => findOrThrow(skillDetails, it => it.cardId === liveSkill.cardId));
446
+ const ret = [];
447
+ for (let i = 0; i < 6; ++i) {
448
+ ret.push({
449
+ scoreUp: 0,
450
+ lifeRecovery: 0
451
+ });
452
+ }
453
+ for (let i = 0; i < skills.length - 1; ++i) {
454
+ ret[i] = skills[i];
455
+ }
456
+ ret[5] = skills[skills.length - 1];
457
+ return ret;
384
458
  }
385
459
  async getLiveDetail(deckCards, musicId, musicDiff, liveType, liveSkills = undefined) {
386
460
  const musicMetas = await this.dataProvider.getMusicMeta();
387
461
  const musicMeta = findOrThrow(musicMetas, it => it.music_id === musicId && it.difficulty === musicDiff);
388
462
  const deckDetail = await this.deckCalculator.getDeckDetail(deckCards);
389
463
  const skills = liveType === exports.LiveType.MULTI
390
- ? duplicateObj(this.getMultiLiveSkill(deckDetail), 6)
391
- : (mapOrUndefined(liveSkills, liveSkill => findOrThrow(deckDetail.skill, it => it.cardId === liveSkill.cardId)));
464
+ ? duplicateObj(LiveCalculator.getMultiLiveSkill(deckDetail), 6)
465
+ : LiveCalculator.getSoloLiveSkill(liveSkills, deckDetail.skill);
392
466
  return await this.getLiveDetailByDeck(deckDetail, musicMeta, liveType, skills);
393
467
  }
394
- async getLiveDetailById(deckId, musicId, musicDiff, liveType, liveSkills = undefined) {
395
- return await this.getLiveDetail(await this.deckCalculator.getDeckCardsById(deckId), musicId, musicDiff, liveType, liveSkills);
396
- }
397
468
  }
398
469
  exports.LiveType = void 0;
399
470
  (function (LiveType) {
@@ -404,6 +475,10 @@ exports.LiveType = void 0;
404
475
 
405
476
  exports.CardCalculator = CardCalculator;
406
477
  exports.CardDetailMap = CardDetailMap;
478
+ exports.CardEventCalculator = CardEventCalculator;
479
+ exports.CardPowerCalculator = CardPowerCalculator;
480
+ exports.CardSkillCalculator = CardSkillCalculator;
407
481
  exports.DeckCalculator = DeckCalculator;
482
+ exports.DeckService = DeckService;
408
483
  exports.EventCalculator = EventCalculator;
409
484
  exports.LiveCalculator = LiveCalculator;
package/dist/index.d.ts CHANGED
@@ -5,7 +5,11 @@ interface DataProvider {
5
5
  }
6
6
 
7
7
  interface UserDeck {
8
+ userId: number;
8
9
  deckId: number;
10
+ name: string;
11
+ leader: number;
12
+ subLeader: number;
9
13
  member1: number;
10
14
  member2: number;
11
15
  member3: number;
@@ -13,27 +17,49 @@ interface UserDeck {
13
17
  member5: number;
14
18
  }
15
19
 
16
- declare class EventCalculator {
17
- private readonly dataProvider;
18
- private readonly deckCalculator;
19
- private readonly cardEventCalculator;
20
- constructor(dataProvider: DataProvider);
21
- getDeckEventBonus(userDeck: UserDeck, eventId: number): Promise<number>;
22
- getDeckEventBonusById(deckId: number, eventId: number): Promise<number>;
23
- }
24
-
25
20
  interface UserCard {
21
+ userId: number;
26
22
  cardId: number;
27
23
  level: number;
24
+ exp?: number;
25
+ totalExp: number;
28
26
  skillLevel: number;
27
+ skillExp: number;
28
+ totalSkillExp: number;
29
29
  masterRank: number;
30
- specialTrainingStatus?: string;
30
+ specialTrainingStatus: string;
31
+ defaultImage: string;
32
+ duplicateCount: number;
33
+ createdAt: number;
31
34
  episodes: Array<{
32
35
  cardEpisodeId: number;
33
36
  scenarioStatus: string;
37
+ scenarioStatusReasons: string[];
38
+ isNotSkipped: boolean;
34
39
  }>;
35
40
  }
36
41
 
42
+ interface UserChallengeLiveSoloDeck {
43
+ characterId: number;
44
+ leader: number;
45
+ support1: number;
46
+ support2: number | null;
47
+ support3: number | null;
48
+ support4: number | null;
49
+ }
50
+
51
+ declare class DeckService {
52
+ private readonly dataProvider;
53
+ constructor(dataProvider: DataProvider);
54
+ getUserCard(cardId: number): Promise<UserCard>;
55
+ getDeck(deckId: number): Promise<UserDeck>;
56
+ getDeckCards(userDeck: UserDeck): Promise<UserCard[]>;
57
+ static toUserDeck(userCards: UserCard[], deckId?: number, name?: string): UserDeck;
58
+ getChallengeLiveSoloDeck(characterId: number): Promise<UserChallengeLiveSoloDeck>;
59
+ getChallengeLiveSoloDeckCards(deck: UserChallengeLiveSoloDeck): Promise<UserCard[]>;
60
+ static toUserChallengeLiveSoloDeck(userCards: UserCard[], characterId: number): UserChallengeLiveSoloDeck;
61
+ }
62
+
37
63
  interface AreaItemLevel {
38
64
  areaItemId: number;
39
65
  level: number;
@@ -77,17 +103,73 @@ declare class CardDetailMap {
77
103
  isCertainlyLessThen(another: CardDetailMap): boolean;
78
104
  }
79
105
 
106
+ interface CommonResource {
107
+ resourceId?: number;
108
+ resourceType: string;
109
+ resourceLevel?: number;
110
+ quantity: number;
111
+ }
112
+
113
+ interface Card {
114
+ id: number;
115
+ seq: number;
116
+ characterId: number;
117
+ cardRarityType: string;
118
+ specialTrainingPower1BonusFixed: number;
119
+ specialTrainingPower2BonusFixed: number;
120
+ specialTrainingPower3BonusFixed: number;
121
+ attr: string;
122
+ supportUnit: string;
123
+ skillId: number;
124
+ cardSkillName: string;
125
+ prefix: string;
126
+ assetbundleName: string;
127
+ gachaPhrase: string;
128
+ flavorText: string;
129
+ releaseAt: number;
130
+ cardParameters: Array<{
131
+ id: number;
132
+ cardId: number;
133
+ cardLevel: number;
134
+ cardParameterType: string;
135
+ power: number;
136
+ }>;
137
+ specialTrainingCosts: CommonResource[];
138
+ masterLessonAchieveResources: {
139
+ releaseConditionId: number;
140
+ cardId: number;
141
+ masterRank: number;
142
+ resources: CommonResource[];
143
+ };
144
+ }
145
+
146
+ declare class CardPowerCalculator {
147
+ private readonly dataProvider;
148
+ constructor(dataProvider: DataProvider);
149
+ getCardPower(userCard: UserCard, card: Card, cardUnits: string[], userAreaItemLevels: AreaItemLevel[]): Promise<CardDetailMap>;
150
+ private getPower;
151
+ private getCardBasePowers;
152
+ private getAreaItemBonusPower;
153
+ private getCharacterBonusPower;
154
+ }
155
+
156
+ declare class CardSkillCalculator {
157
+ private readonly dataProvider;
158
+ constructor(dataProvider: DataProvider);
159
+ getCardSkill(userCard: UserCard, card: Card): Promise<{
160
+ scoreUp: CardDetailMap;
161
+ lifeRecovery: number;
162
+ }>;
163
+ private getSkillDetail;
164
+ }
165
+
80
166
  declare class DeckCalculator {
81
167
  private readonly dataProvider;
82
168
  private readonly cardCalculator;
83
169
  constructor(dataProvider: DataProvider);
84
- getDeck(deckId: number): Promise<UserDeck>;
85
- getDeckCards(userDeck: UserDeck): Promise<UserCard[]>;
86
- getDeckCardsById(deckId: number): Promise<UserCard[]>;
87
170
  private getHonorBonusPower;
88
171
  getDeckDetailByCards(cardDetails: CardDetail[], honorBonus: number): Promise<DeckDetail>;
89
172
  getDeckDetail(deckCards: UserCard[]): Promise<DeckDetail>;
90
- getDeckDetailById(deckId: number): Promise<DeckDetail>;
91
173
  }
92
174
  interface DeckDetail {
93
175
  power: number;
@@ -99,6 +181,27 @@ interface SkillDetail {
99
181
  lifeRecovery: number;
100
182
  }
101
183
 
184
+ declare class CardEventCalculator {
185
+ private readonly dataProvider;
186
+ constructor(dataProvider: DataProvider);
187
+ private getEventDeckBonus;
188
+ getCardEventBonus(userCard: UserCard, eventId: number): Promise<number>;
189
+ }
190
+
191
+ declare class EventCalculator {
192
+ private readonly dataProvider;
193
+ private readonly cardEventCalculator;
194
+ constructor(dataProvider: DataProvider);
195
+ getDeckEventBonus(deckCards: UserCard[], eventId: number): Promise<number>;
196
+ static getEventPoint(type: EventLiveType, selfScore: number, musicRate?: number, deckBonus?: number, boostRate?: number, otherScore?: number, life?: number): number;
197
+ }
198
+ declare enum EventLiveType {
199
+ SOLO = "solo",
200
+ CHALLENGE = "challenge",
201
+ MULTI = "multi",
202
+ CHEERFUL = "cheerful"
203
+ }
204
+
102
205
  interface MusicMeta {
103
206
  music_id: number;
104
207
  difficulty: string;
@@ -121,9 +224,9 @@ declare class LiveCalculator {
121
224
  private getBaseScore;
122
225
  private getSkillScore;
123
226
  getLiveDetailByDeck(deckDetail: DeckDetail, musicMeta: MusicMeta, liveType: LiveType, skillDetails?: SkillDetail[] | undefined, multiPowerSum?: number): Promise<LiveDetail>;
124
- private getMultiLiveSkill;
227
+ private static getMultiLiveSkill;
228
+ private static getSoloLiveSkill;
125
229
  getLiveDetail(deckCards: UserCard[], musicId: number, musicDiff: string, liveType: LiveType, liveSkills?: LiveSkill[] | undefined): Promise<LiveDetail>;
126
- getLiveDetailById(deckId: number, musicId: number, musicDiff: string, liveType: LiveType, liveSkills?: LiveSkill[] | undefined): Promise<LiveDetail>;
127
230
  }
128
231
  interface LiveDetail {
129
232
  score: number;
@@ -141,4 +244,4 @@ declare enum LiveType {
141
244
  AUTO = "auto"
142
245
  }
143
246
 
144
- export { CardCalculator, CardDetail, CardDetailMap, DataProvider, DeckCalculator, DeckDetail, EventCalculator, LiveCalculator, LiveDetail, LiveSkill, LiveType, SkillDetail };
247
+ export { CardCalculator, CardDetail, CardDetailMap, CardEventCalculator, CardPowerCalculator, CardSkillCalculator, DataProvider, DeckCalculator, DeckDetail, DeckService, EventCalculator, EventLiveType, LiveCalculator, LiveDetail, LiveSkill, LiveType, SkillDetail };
package/dist/index.mjs CHANGED
@@ -25,10 +25,61 @@ function duplicateObj(obj, times) {
25
25
  ret.push(obj);
26
26
  return ret;
27
27
  }
28
- function mapOrUndefined(arr, fun) {
29
- if (arr === undefined)
30
- return undefined;
31
- return arr.map(fun);
28
+
29
+ class DeckService {
30
+ dataProvider;
31
+ constructor(dataProvider) {
32
+ this.dataProvider = dataProvider;
33
+ }
34
+ async getUserCard(cardId) {
35
+ const userCards = await this.dataProvider.getUserData('userCards');
36
+ return findOrThrow(userCards, it => it.cardId === cardId);
37
+ }
38
+ async getDeck(deckId) {
39
+ const userDecks = await this.dataProvider.getUserData('userDecks');
40
+ return findOrThrow(userDecks, it => it.deckId === deckId);
41
+ }
42
+ async getDeckCards(userDeck) {
43
+ const cardIds = [userDeck.member1, userDeck.member2, userDeck.member3, userDeck.member4, userDeck.member5];
44
+ return await Promise.all(cardIds.map(async (id) => await this.getUserCard(id)));
45
+ }
46
+ static toUserDeck(userCards, deckId = 1, name = 'ユニット01') {
47
+ if (userCards.length !== 5)
48
+ throw new Error('deck card should be 5');
49
+ return {
50
+ userId: userCards[0].userId,
51
+ deckId,
52
+ name,
53
+ leader: userCards[0].cardId,
54
+ subLeader: userCards[1].cardId,
55
+ member1: userCards[0].cardId,
56
+ member2: userCards[1].cardId,
57
+ member3: userCards[2].cardId,
58
+ member4: userCards[3].cardId,
59
+ member5: userCards[4].cardId
60
+ };
61
+ }
62
+ async getChallengeLiveSoloDeck(characterId) {
63
+ const userChallengeLiveSoloDecks = await this.dataProvider.getUserData('userChallengeLiveSoloDecks');
64
+ return findOrThrow(userChallengeLiveSoloDecks, it => it.characterId === characterId);
65
+ }
66
+ async getChallengeLiveSoloDeckCards(deck) {
67
+ const cardIds = [deck.leader, deck.support1, deck.support2, deck.support3, deck.support4];
68
+ return await Promise.all(cardIds.filter(it => it !== undefined && it !== null)
69
+ .map(async (id) => await this.getUserCard(id === null ? 0 : id)));
70
+ }
71
+ static toUserChallengeLiveSoloDeck(userCards, characterId) {
72
+ if (userCards.length !== 5)
73
+ throw new Error('deck card should be 5');
74
+ return {
75
+ characterId,
76
+ leader: userCards[0].cardId,
77
+ support1: userCards[1].cardId,
78
+ support2: userCards[2].cardId,
79
+ support3: userCards[3].cardId,
80
+ support4: userCards[4].cardId
81
+ };
82
+ }
32
83
  }
33
84
 
34
85
  class CardPowerCalculator {
@@ -220,18 +271,6 @@ class DeckCalculator {
220
271
  this.dataProvider = dataProvider;
221
272
  this.cardCalculator = new CardCalculator(dataProvider);
222
273
  }
223
- async getDeck(deckId) {
224
- const userDecks = await this.dataProvider.getUserData('userDecks');
225
- return findOrThrow(userDecks, it => it.deckId === deckId);
226
- }
227
- async getDeckCards(userDeck) {
228
- const userCards = await this.dataProvider.getUserData('userCards');
229
- const cardIds = [userDeck.member1, userDeck.member2, userDeck.member3, userDeck.member4, userDeck.member5];
230
- return cardIds.map(id => findOrThrow(userCards, it => it.cardId === id));
231
- }
232
- async getDeckCardsById(deckId) {
233
- return await this.getDeckCards(await this.getDeck(deckId));
234
- }
235
274
  async getHonorBonusPower() {
236
275
  const honors = await this.dataProvider.getMasterData('honors');
237
276
  const userHonors = await this.dataProvider.getUserData('userHonors');
@@ -266,9 +305,6 @@ class DeckCalculator {
266
305
  const cardDetails = await Promise.all(deckCards.map(async (it) => await this.cardCalculator.getCardDetail(it, userItemLevels)));
267
306
  return await this.getDeckDetailByCards(cardDetails, await this.getHonorBonusPower());
268
307
  }
269
- async getDeckDetailById(deckId) {
270
- return await this.getDeckDetail(await this.getDeckCardsById(deckId));
271
- }
272
308
  }
273
309
 
274
310
  class CardEventCalculator {
@@ -312,21 +348,39 @@ class CardEventCalculator {
312
348
 
313
349
  class EventCalculator {
314
350
  dataProvider;
315
- deckCalculator;
316
351
  cardEventCalculator;
317
352
  constructor(dataProvider) {
318
353
  this.dataProvider = dataProvider;
319
- this.deckCalculator = new DeckCalculator(dataProvider);
320
354
  this.cardEventCalculator = new CardEventCalculator(dataProvider);
321
355
  }
322
- async getDeckEventBonus(userDeck, eventId) {
323
- const deckCards = await this.deckCalculator.getDeckCards(userDeck);
356
+ async getDeckEventBonus(deckCards, eventId) {
324
357
  return await deckCards.reduce(async (v, it) => await v + await this.cardEventCalculator.getCardEventBonus(it, eventId), Promise.resolve(0));
325
358
  }
326
- async getDeckEventBonusById(deckId, eventId) {
327
- return await this.getDeckEventBonus(await this.deckCalculator.getDeck(deckId), eventId);
359
+ static getEventPoint(type, selfScore, musicRate = 100, deckBonus = 0, boostRate = 1, otherScore = 0, life = 1000) {
360
+ const musicRate0 = musicRate / 100;
361
+ const deckRate = deckBonus / 100 + 1;
362
+ switch (type) {
363
+ case EventLiveType.SOLO:
364
+ return Math.floor((100 + Math.floor(selfScore / 20000)) * musicRate0 * deckRate) * boostRate;
365
+ case EventLiveType.CHALLENGE:
366
+ return (100 + Math.floor(selfScore / 20000)) * 120;
367
+ case EventLiveType.MULTI:
368
+ return Math.floor((110 + Math.floor(selfScore / 17000) +
369
+ Math.floor(Math.min(otherScore, 5200000) / 400000)) * musicRate0 * deckRate) * boostRate;
370
+ case EventLiveType.CHEERFUL:
371
+ return Math.floor((114 + Math.floor(selfScore / 12500) +
372
+ Math.floor(Math.min(otherScore, 4400000) / 400000) + Math.floor(Math.min(life, 1000) / 25)) *
373
+ musicRate0 * deckRate) * boostRate;
374
+ }
328
375
  }
329
376
  }
377
+ var EventLiveType;
378
+ (function (EventLiveType) {
379
+ EventLiveType["SOLO"] = "solo";
380
+ EventLiveType["CHALLENGE"] = "challenge";
381
+ EventLiveType["MULTI"] = "multi";
382
+ EventLiveType["CHEERFUL"] = "cheerful";
383
+ })(EventLiveType || (EventLiveType = {}));
330
384
 
331
385
  class LiveCalculator {
332
386
  dataProvider;
@@ -375,23 +429,40 @@ class LiveCalculator {
375
429
  tap: musicMeta.tap_count
376
430
  };
377
431
  }
378
- getMultiLiveSkill(deckDetail) {
432
+ static getMultiLiveSkill(deckDetail) {
379
433
  const scoreUp = deckDetail.skill.reduce((v, it, i) => v + (i === 0 ? it.scoreUp : (it.scoreUp / 5)), 0);
380
434
  const lifeRecovery = deckDetail.skill[0].lifeRecovery;
381
- return { scoreUp, lifeRecovery };
435
+ return {
436
+ scoreUp,
437
+ lifeRecovery
438
+ };
439
+ }
440
+ static getSoloLiveSkill(liveSkills, skillDetails) {
441
+ if (liveSkills === undefined)
442
+ return undefined;
443
+ const skills = liveSkills.map(liveSkill => findOrThrow(skillDetails, it => it.cardId === liveSkill.cardId));
444
+ const ret = [];
445
+ for (let i = 0; i < 6; ++i) {
446
+ ret.push({
447
+ scoreUp: 0,
448
+ lifeRecovery: 0
449
+ });
450
+ }
451
+ for (let i = 0; i < skills.length - 1; ++i) {
452
+ ret[i] = skills[i];
453
+ }
454
+ ret[5] = skills[skills.length - 1];
455
+ return ret;
382
456
  }
383
457
  async getLiveDetail(deckCards, musicId, musicDiff, liveType, liveSkills = undefined) {
384
458
  const musicMetas = await this.dataProvider.getMusicMeta();
385
459
  const musicMeta = findOrThrow(musicMetas, it => it.music_id === musicId && it.difficulty === musicDiff);
386
460
  const deckDetail = await this.deckCalculator.getDeckDetail(deckCards);
387
461
  const skills = liveType === LiveType.MULTI
388
- ? duplicateObj(this.getMultiLiveSkill(deckDetail), 6)
389
- : (mapOrUndefined(liveSkills, liveSkill => findOrThrow(deckDetail.skill, it => it.cardId === liveSkill.cardId)));
462
+ ? duplicateObj(LiveCalculator.getMultiLiveSkill(deckDetail), 6)
463
+ : LiveCalculator.getSoloLiveSkill(liveSkills, deckDetail.skill);
390
464
  return await this.getLiveDetailByDeck(deckDetail, musicMeta, liveType, skills);
391
465
  }
392
- async getLiveDetailById(deckId, musicId, musicDiff, liveType, liveSkills = undefined) {
393
- return await this.getLiveDetail(await this.deckCalculator.getDeckCardsById(deckId), musicId, musicDiff, liveType, liveSkills);
394
- }
395
466
  }
396
467
  var LiveType;
397
468
  (function (LiveType) {
@@ -400,4 +471,4 @@ var LiveType;
400
471
  LiveType["AUTO"] = "auto";
401
472
  })(LiveType || (LiveType = {}));
402
473
 
403
- export { CardCalculator, CardDetailMap, DeckCalculator, EventCalculator, LiveCalculator, LiveType };
474
+ export { CardCalculator, CardDetailMap, CardEventCalculator, CardPowerCalculator, CardSkillCalculator, DeckCalculator, DeckService, EventCalculator, EventLiveType, LiveCalculator, LiveType };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sekai-calculator",
3
- "version": "0.1.0",
3
+ "version": "0.1.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",