feat: add eggstra work mode

main
imspace 2023-04-17 00:34:22 +08:00
parent 0acc59b918
commit c4242e9f66
5 changed files with 71 additions and 7 deletions

View File

@ -1,3 +1,7 @@
## 0.3.3
feat: add eggstra work mode
## 0.3.2 ## 0.3.2
feat: update `WEB_VIEW_VERSION` and query hashes feat: update `WEB_VIEW_VERSION` and query hashes

View File

@ -8,7 +8,7 @@
}, },
"package": { "package": {
"productName": "s3si-ts", "productName": "s3si-ts",
"version": "0.2.1" "version": "0.3.3"
}, },
"tauri": { "tauri": {
"allowlist": { "allowlist": {

View File

@ -1,7 +1,7 @@
import type { StatInkPostBody, VsHistoryDetail } from "./types.ts"; import type { StatInkPostBody, VsHistoryDetail } from "./types.ts";
export const AGENT_NAME = "s3si.ts"; export const AGENT_NAME = "s3si.ts";
export const S3SI_VERSION = "0.3.2"; export const S3SI_VERSION = "0.3.3";
export const NSOAPP_VERSION = "2.5.0"; export const NSOAPP_VERSION = "2.5.0";
export const WEB_VIEW_VERSION = "3.0.0-0742bda0"; export const WEB_VIEW_VERSION = "3.0.0-0742bda0";
export const S3SI_LINK = "https://github.com/spacemeowx2/s3si.ts"; export const S3SI_LINK = "https://github.com/spacemeowx2/s3si.ts";

View File

@ -723,6 +723,8 @@ export class StatInkExporter implements GameExporter {
golden_appearances: wave.goldenPopCount, golden_appearances: wave.goldenPopCount,
golden_delivered: wave.teamDeliverCount, golden_delivered: wave.teamDeliverCount,
special_uses, special_uses,
// fill it later
danger_rate: null,
}; };
} }
async mapCoop( async mapCoop(
@ -766,10 +768,13 @@ export class StatInkExporter implements GameExporter {
: undefined; : undefined;
const title_exp_after = detail.afterGradePoint; const title_exp_after = detail.afterGradePoint;
const maxWaves = detail.rule === "TEAM_CONTEST" ? 5 : 3;
let clear_waves: number; let clear_waves: number;
if (waveResults.length > 0) { if (waveResults.length > 0) {
// when cleared, resultWave === 0, so we need to add 1. // when cleared, resultWave === 0, so we need to add 1.
clear_waves = waveResults.filter((i) => i.waveNumber < 4).length - clear_waves = waveResults.filter((i) =>
i.waveNumber < maxWaves + 1
).length -
1 + (resultWave === 0 ? 1 : 0); 1 + (resultWave === 0 ? 1 : 0);
} else { } else {
clear_waves = 0; clear_waves = 0;
@ -810,7 +815,7 @@ export class StatInkExporter implements GameExporter {
let fail_reason: StatInkCoopPostBody["fail_reason"] = null; let fail_reason: StatInkCoopPostBody["fail_reason"] = null;
// failed // failed
if (clear_waves !== 3 && waveResults.length > 0) { if (clear_waves !== maxWaves && waveResults.length > 0) {
const lastWave = waveResults[waveResults.length - 1]; const lastWave = waveResults[waveResults.length - 1];
if (lastWave.teamDeliverCount >= lastWave.deliverNorm) { if (lastWave.teamDeliverCount >= lastWave.deliverNorm) {
fail_reason = "wipe_out"; fail_reason = "wipe_out";
@ -821,8 +826,9 @@ export class StatInkExporter implements GameExporter {
uuid: await gameId(detail.id), uuid: await gameId(detail.id),
private: groupInfo?.mode === "PRIVATE_CUSTOM" ? "yes" : "no", private: groupInfo?.mode === "PRIVATE_CUSTOM" ? "yes" : "no",
big_run: detail.rule === "BIG_RUN" ? "yes" : "no", big_run: detail.rule === "BIG_RUN" ? "yes" : "no",
eggstra_work: detail.rule === "TEAM_CONTEST" ? "yes" : "no",
stage: b64Number(detail.coopStage.id).toString(), stage: b64Number(detail.coopStage.id).toString(),
danger_rate: dangerRate * 100, danger_rate: detail.rule === "TEAM_CONTEST" ? null : dangerRate * 100,
clear_waves, clear_waves,
fail_reason, fail_reason,
king_smell: smellMeter, king_smell: smellMeter,
@ -855,6 +861,57 @@ export class StatInkExporter implements GameExporter {
automated: "yes", automated: "yes",
start_at: startedAt, start_at: startedAt,
}; };
// caculate wave danger_rate.
// translated from here: https://github.com/frozenpandaman/s3s/commit/d46ece00e5a7706688eaf025f18c5a8ea1c54c0f#diff-819571ec7b067d2398cd1f9dbc737160312efc4128ba4a2f0e165c70225dea0eR1050
if (detail.rule === "TEAM_CONTEST") {
let lastWave: StatInkCoopWave | undefined;
for (
const [wave] of result.waves
.map((p, i) => [p, i] as const)
) {
let haz_level: number;
if (!lastWave) {
haz_level = 60;
} else {
const num_players = result.players.length;
const quota = lastWave.golden_quota; // last wave, most recent one added to the list
const delivered = lastWave.golden_delivered;
let added_percent = 0; // default, no increase if less than 1.5x quota delivered
if (num_players == 4) {
if (delivered >= quota * 2) {
added_percent = 60;
} else if (delivered >= quota * 1.5) {
added_percent = 30;
}
} else if (num_players == 3) {
if (delivered >= quota * 2) {
added_percent = 40;
} else if (delivered >= quota * 1.5) {
added_percent = 20;
}
} else if (num_players == 2) {
if (delivered >= quota * 2) {
added_percent = 20;
} else if (delivered >= quota * 1.5) {
added_percent = 10;
added_percent = 5;
}
} else if (num_players == 1) {
if (delivered >= quota * 2) {
added_percent = 10;
} else if (delivered >= quota * 1.5) {
added_percent = 5;
}
}
const prev_percent = lastWave.danger_rate!;
haz_level = prev_percent + added_percent;
}
wave.danger_rate = haz_level;
lastWave = wave;
}
}
return result; return result;
} }
} }

View File

@ -287,7 +287,7 @@ export type CoopHistoryDetail = {
name: string; name: string;
id: string; id: string;
}; };
rule: "REGULAR" | "BIG_RUN"; rule: "REGULAR" | "BIG_RUN" | "TEAM_CONTEST";
myResult: CoopHistoryPlayerResult; myResult: CoopHistoryPlayerResult;
memberResults: CoopHistoryPlayerResult[]; memberResults: CoopHistoryPlayerResult[];
bossResult: null | { bossResult: null | {
@ -674,6 +674,8 @@ export type StatInkCoopWave = {
golden_delivered: number; golden_delivered: number;
golden_appearances: number; golden_appearances: number;
special_uses?: Record<string, number>; special_uses?: Record<string, number>;
// [0, 333]
danger_rate: number | null;
}; };
export type StatInkCoopPlayer = { export type StatInkCoopPlayer = {
@ -712,9 +714,10 @@ export type StatInkCoopPostBody = {
uuid: string; uuid: string;
private: "yes" | "no"; private: "yes" | "no";
big_run: "yes" | "no"; big_run: "yes" | "no";
eggstra_work: "yes" | "no";
stage: string; stage: string;
// [0, 333] // [0, 333]
danger_rate: number; danger_rate: number | null;
// [0, 3] // [0, 3]
clear_waves: number; clear_waves: number;
fail_reason?: null | "wipe_out" | "time_limit"; fail_reason?: null | "wipe_out" | "time_limit";