Add store header OCR and market observation outbox

This commit is contained in:
2026-08-11 17:29:41 +03:00
parent d6e0ba466b
commit f87a65bb04
13 changed files with 1110 additions and 182 deletions
+14 -16
View File
@@ -3,12 +3,11 @@ import assert from "node:assert/strict";
import {
isCalibrationReady,
isRectInside,
parseMerchantText,
parseFieldValue,
parseStoreHeaderText,
parseTooltipText,
rectFromPoints,
resolveFieldRect,
resolveScreenRect,
} from "../src/parser.js";
test("normalizes a reverse drag into a positive rectangle", () => {
@@ -41,7 +40,7 @@ test("requires both anchors and exact OCR regions", () => {
assert.equal(
isCalibrationReady({
saleAnchor: { image: "data:image/png;base64,x", width: 20, height: 10 },
merchantRegion: { xRatio: 0.1, yRatio: 0.1, widthRatio: 0.2, heightRatio: 0.1 },
storeHeaderRegion: { offsetX: -50, offsetY: -300, width: 250, height: 24 },
tooltipSearchRegion: { offsetX: -100, offsetY: -300, width: 300, height: 100 },
tooltipAnchor: { image: "data:image/png;base64,y", width: 30, height: 12 },
itemNameRegion: { offsetX: 0, offsetY: -18, width: 220, height: 18 },
@@ -56,17 +55,6 @@ test("detects OCR rectangles outside the captured frame", () => {
assert.equal(isRectInside({ x: 90, y: 10, width: 20, height: 20 }, 100, 100), false);
});
test("resolves the merchant region against the current window size", () => {
assert.deepEqual(
resolveScreenRect(
{ xRatio: 0.25, yRatio: 0.1, widthRatio: 0.5, heightRatio: 0.08 },
1200,
800,
),
{ x: 300, y: 80, width: 600, height: 64 },
);
});
test("parses a hovered item tooltip", () => {
assert.deepEqual(
parseTooltipText("Tears of Eva\nPrice : 3,000,000 Adena\n(3 Million Adena)"),
@@ -79,6 +67,16 @@ test("parses a hovered item tooltip", () => {
assert.equal(parseTooltipText("Purchase List\nAdena 5,403,160"), null);
});
test("takes the first OCR line as merchant name", () => {
assert.equal(parseMerchantText(" Dwa \nVagabond\n"), "Dwa");
test("parses trade side and merchant from the store header", () => {
assert.deepEqual(parseStoreHeaderText("Private Store(Buy) - Hikvision"), {
side: "buy",
merchant: "Hikvision",
rawText: "Private Store(Buy) - Hikvision",
});
assert.deepEqual(parseStoreHeaderText(" Private Store({Sell) - Dwa \n"), {
side: "sell",
merchant: "Dwa",
rawText: "Private Store({Sell) - Dwa",
});
assert.equal(parseStoreHeaderText("Items on Sale"), null);
});