feat: add eggstra work mode
parent
0acc59b918
commit
c4242e9f66
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"package": {
|
"package": {
|
||||||
"productName": "s3si-ts",
|
"productName": "s3si-ts",
|
||||||
"version": "0.2.1"
|
"version": "0.3.3"
|
||||||
},
|
},
|
||||||
"tauri": {
|
"tauri": {
|
||||||
"allowlist": {
|
"allowlist": {
|
||||||
|
|
|
||||||
|
|
@ -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";
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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";
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue