Improve IK-style artifact scanner pipeline
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
import type { CaptureResult, KeyPressResult } from "../types/global";
|
||||
import { validateLookupPackage, type LookupValidationStatus } from "./genshinLookup";
|
||||
|
||||
export type ScanEntryMode = "visible-inventory" | "direct-inventory" | "paimon-menu" | "auto-entry";
|
||||
|
||||
export interface AutoScanEntryAction {
|
||||
type: "key" | "click-artifact-tab" | "click-first-artifact" | "capture-preflight";
|
||||
key?: "ESC" | "B";
|
||||
label: string;
|
||||
}
|
||||
|
||||
export interface AutoScanEntryPreflight {
|
||||
ok: boolean;
|
||||
reason: string;
|
||||
}
|
||||
|
||||
export function buildAutoScanEntryPlan(mode: ScanEntryMode): AutoScanEntryAction[] {
|
||||
if (mode === "visible-inventory") {
|
||||
return [{ type: "capture-preflight", label: "Capture visible artifact inventory" }];
|
||||
}
|
||||
if (mode === "direct-inventory") {
|
||||
return [
|
||||
{ type: "key", key: "B", label: "Open inventory from the current world state" },
|
||||
{ type: "click-artifact-tab", label: "Select artifact inventory tab" },
|
||||
{ type: "click-first-artifact", label: "Select first visible artifact so the detail card is open" },
|
||||
{ type: "capture-preflight", label: "Verify artifact inventory grid and detail card" },
|
||||
];
|
||||
}
|
||||
if (mode === "auto-entry") {
|
||||
return [
|
||||
{ type: "key", key: "B", label: "Try direct inventory entry from world" },
|
||||
{ type: "click-artifact-tab", label: "Select artifact inventory tab if inventory opened" },
|
||||
{ type: "click-first-artifact", label: "Select first visible artifact so the detail card is open" },
|
||||
{ type: "key", key: "ESC", label: "Fallback: Inventory Kamera step from already-open Paimon menu" },
|
||||
{ type: "key", key: "ESC", label: "Fallback: close Paimon menu if ESC opened or left it visible" },
|
||||
{ type: "key", key: "B", label: "Fallback: open inventory from world" },
|
||||
{ type: "click-artifact-tab", label: "Fallback: select artifact inventory tab" },
|
||||
{ type: "click-first-artifact", label: "Fallback: select first visible artifact" },
|
||||
{ type: "capture-preflight", label: "Verify artifact inventory grid and detail card" },
|
||||
];
|
||||
}
|
||||
return [
|
||||
{ type: "key", key: "ESC", label: "Inventory Kamera step: leave the already-open Paimon menu" },
|
||||
{ type: "key", key: "ESC", label: "If Paimon is still visible, close it before opening inventory" },
|
||||
{ type: "key", key: "B", label: "Inventory Kamera step: open inventory from world" },
|
||||
{ type: "click-artifact-tab", label: "Inventory Kamera step: select artifact inventory tab" },
|
||||
{ type: "click-first-artifact", label: "Select first visible artifact so the detail card is open" },
|
||||
{ type: "capture-preflight", label: "Verify artifact inventory grid and detail card" },
|
||||
];
|
||||
}
|
||||
|
||||
export function artifactTabClickTarget(capture: CaptureResult): { x: number; y: number } {
|
||||
return {
|
||||
x: Math.round(capture.width * (448 / 1280)),
|
||||
y: Math.round(capture.height * (31 / 720)),
|
||||
};
|
||||
}
|
||||
|
||||
export function keyPressBlocked(result: KeyPressResult | null | undefined) {
|
||||
return !result?.ok || Boolean(result.inputBlocked);
|
||||
}
|
||||
|
||||
export function validateAutoScanEntryPreflight(
|
||||
capture: CaptureResult | null,
|
||||
lookupStatus: LookupValidationStatus = validateLookupPackage(),
|
||||
): AutoScanEntryPreflight {
|
||||
if (!lookupStatus.valid) {
|
||||
return {
|
||||
ok: false,
|
||||
reason: `Lookup invalid: ${lookupStatus.errors[0] ?? "unknown lookup error"}`,
|
||||
};
|
||||
}
|
||||
if (!capture) return { ok: false, reason: "Keine Capture-Daten fuer den Auto-Scan-Start." };
|
||||
if (capture.captureTarget === "primary-screen") {
|
||||
return { ok: false, reason: "Auto-Scan blockiert: Capture stammt vom Primary Screen statt vom Genshin-Client." };
|
||||
}
|
||||
if (capture.layout?.warning) return { ok: false, reason: capture.layout.warning };
|
||||
if (capture.paimonMenu?.present) {
|
||||
return { ok: false, reason: `Paimon-Menue erkannt (${capture.paimonMenu.confidence}%). Auto-Scan startet erst im Artifact-Inventar mit sichtbarer Detailkarte.` };
|
||||
}
|
||||
if (!capture.inventoryGrid || capture.inventoryGrid.source === "missing" || capture.inventoryGrid.centers.length === 0) {
|
||||
return { ok: false, reason: "Kein verlaessliches Artifact-Grid erkannt. Artifact-Inventar sichtbar lassen." };
|
||||
}
|
||||
if (!capture.artifactDetail?.present) {
|
||||
const confidence = capture.artifactDetail ? ` (${capture.artifactDetail.confidence}% Detail-Marker)` : "";
|
||||
return { ok: false, reason: `Keine Artifact-Detailansicht erkannt${confidence}. Artifact-Inventar mit sichtbarer Detailkarte oeffnen.` };
|
||||
}
|
||||
return { ok: true, reason: "" };
|
||||
}
|
||||
Reference in New Issue
Block a user