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 +107 -32
- package/dist/index.d.ts +120 -17
- package/dist/index.mjs +104 -33
- package/package.json +1 -1
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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(
|
|
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
|
-
|
|
329
|
-
|
|
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 {
|
|
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(
|
|
391
|
-
: (
|
|
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
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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(
|
|
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
|
-
|
|
327
|
-
|
|
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 {
|
|
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(
|
|
389
|
-
: (
|
|
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 };
|