diff --git a/src/GameFetcher.ts b/src/GameFetcher.ts index 428e541..7709b46 100644 --- a/src/GameFetcher.ts +++ b/src/GameFetcher.ts @@ -137,17 +137,30 @@ export class GameFetcher { type: "CoopInfo", listNode: null, groupInfo: null, + gradeBefore: null, }; } const { historyDetails, ...groupInfo } = group; - const listNode = historyDetails.nodes.find((i) => i.id === id) ?? + const listNodeIdx = historyDetails.nodes.findIndex((i) => i.id === id) ?? null; + const listNode = listNodeIdx !== null + ? historyDetails.nodes[listNodeIdx] + : null; + const listNodeBefore = listNodeIdx !== null + ? (historyDetails.nodes[listNodeIdx + 1] ?? null) + : null; return { type: "CoopInfo", listNode, groupInfo, + gradeBefore: listNodeBefore?.afterGrade && listNodeBefore.afterGradePoint + ? { + grade: listNodeBefore.afterGrade, + gradePoint: listNodeBefore.afterGradePoint, + } + : null, }; } async getBattleMetaById( diff --git a/src/exporters/stat.ink.ts b/src/exporters/stat.ink.ts index e11d8ff..cd678e6 100644 --- a/src/exporters/stat.ink.ts +++ b/src/exporters/stat.ink.ts @@ -686,6 +686,7 @@ export class StatInkExporter implements GameExporter { } async mapCoop( { + gradeBefore, groupInfo, detail, }: CoopInfo, @@ -732,25 +733,33 @@ export class StatInkExporter implements GameExporter { let title_before: string | undefined = undefined; let title_exp_before: number | undefined = undefined; - const expDiff = COOP_POINT_MAP[clear_waves]; - if ( - nonNullable(title_after) && nonNullable(title_exp_after) && - nonNullable(expDiff) - ) { - if (title_exp_after === 40 && expDiff === 20) { - // 20 -> 40 or ?(rank up) -> 40 - } else if (title_exp_after === 40 && expDiff < 0 && title_after !== "8") { - // 60,50 -> 40 or ?(rank down) to 40 - } else if (title_exp_after === 999 && expDiff !== 0) { - // 980,990 -> 999 - title_before = title_after; - } else { - if (title_exp_after - expDiff >= 0) { + if (gradeBefore) { + title_before = b64Number(gradeBefore.grade.id).toString(); + title_exp_before = gradeBefore.gradePoint; + } else { + const expDiff = COOP_POINT_MAP[clear_waves]; + + if ( + nonNullable(title_after) && nonNullable(title_exp_after) && + nonNullable(expDiff) + ) { + if (title_exp_after === 40 && expDiff === 20) { + // 20 -> 40 or ?(rank up) -> 40 + } else if ( + title_exp_after === 40 && expDiff < 0 && title_after !== "8" + ) { + // 60,50 -> 40 or ?(rank down) to 40 + } else if (title_exp_after === 999 && expDiff !== 0) { + // 980,990 -> 999 title_before = title_after; - title_exp_before = title_exp_after - expDiff; } else { - title_before = (parseInt(title_after) - 1).toString(); + if (title_exp_after - expDiff >= 0) { + title_before = title_after; + title_exp_before = title_exp_after - expDiff; + } else { + title_before = (parseInt(title_after) - 1).toString(); + } } } } diff --git a/src/types.ts b/src/types.ts index c58add7..4af3ba6 100644 --- a/src/types.ts +++ b/src/types.ts @@ -77,6 +77,11 @@ export type BattleListNode = { }; export type CoopListNode = { id: string; + afterGrade: null | { + "name": string; + "id": string; + }; + afterGradePoint: null | number; }; export type HistoryGroupItem = { bankaraMatchChallenge: null | BankaraMatchChallenge; @@ -193,6 +198,13 @@ export type CoopInfo = { listNode: null | CoopListNode; groupInfo: null | Omit; detail: CoopHistoryDetail; + gradeBefore: null | { + grade: { + name: string; + id: string; + }; + gradePoint: number; + }; }; export type Game = VsInfo | CoopInfo; export type VsMode = "REGULAR" | "BANKARA" | "PRIVATE" | "FEST" | "X_MATCH";