# Automatyczne Loot Paths — aktualizacja

Nie wymaga importu: po otwarciu mapy wybierany jest proponowany start z rzeczywistych pozycji i obliczane są BEST, FAST, SAFE. Kliknięcie mapy i zmiana POI/trybu/składu przelicza trasy. CLEAR/RESTORE przywraca dołączone dane.

Źródło: publiczne pliki danych map Fortnite.GG, pobrane 2026-10-03. To statyczna kopia danych, nie oficjalne API ani skan aktualnego meczu. Brak gwarancji obecności chestu. Aktualizacja sezonu wymaga aktualizacji danych i dopasowanej mapy.
- BR: /data/en.js + /data/spawns.js, map 42.30, 1516 punktów.
- Surf City: /data/surfcity.js, surfcity2, 520 punktów.
- Slurp Rush: /data/slurp-rush.js, slurp2, 418 punktów.
- Elite Stronghold: /data/elite.js, elite2, 547 punktów. Obie starsze pozycje Elite i Stronghold w Loot Paths wskazują tę samą rzeczywistą mapę Elite Stronghold — nie są osobnymi datasetami dwóch różnych wysp. Oryginalny kalkulator pozostaje bez zmian.

Źródło współrzędnych: Leaflet CRS.Simple, x=longitude×32, y=−latitude×32 w obrazie 8192×8192. BR crop (400,640,6800,7160) → 860×906; Surf (1760,2280,5240,4640) → 860×762; Slurp (1536,1856,6400,5184) → 860×697. Elite pełna mapa → 2048×2048. Punkty poza kadrem są pomijane. POI przypisywane do najbliższej prawdziwej etykiety lokalizacji: przybliżenie, nie zweryfikowana przynależność do budynku.

Brak danych o piętrach, wysokości, przejściach, spawn rate, ryzyku i skali fizycznej pozostaje UNKNOWN. Optymalizator korzysta wtedy z odległości w pikselach i przybliżonych odcinków; nie udaje nawigacji przez drzwi ani potwierdzonej bezpiecznej trasy. Import można wykorzystać do wzbogacenia tych informacji. Wszystkie dane, obrazy i bundle działają bez zewnętrznego pobierania podczas korzystania.

Uruchomienie: rozpakuj cały ZIP. `npm install`, `npm start`, otwórz lokalny adres serwera → AI LOOT PATHS. Alternatywnie `loot-paths.html` działa jako lokalny plik, z optymalizacją w głównym wątku. Logowanie Discord wymaga serwera i konfiguracji .env.

# AI LOOT PATHS — DropMap

## Uruchomienie

W katalogu `dropmap` wykonaj `npm install`, następnie `npm start`.
Otwórz `http://localhost:3000` → 🎯 AI LOOT PATHS.
Bezpośredni adres: `http://localhost:3000/loot-paths.html`.
Panel map i przyciski działają także po otwarciu loot-paths.html bezpośrednio.
Na file:// używana jest lokalna konfiguracja map i optymalizacja bez Workera.
Pełny serwer jest zalecany dla Discord/Login i odczytu loot-data.json.
Domyślne mapy w lootDefaults.js wygenerowano z loot-data.json; po jego edycji
uruchom `node loot/buildBundle.mjs`. Przycisk IMPORT działa także na file://.

Kalkulator, jego fizyka BR/Reload, Discord i mapy nie są modyfikowane.
Kalkulator i strona główna otrzymały wyłącznie link do nowej kategorii.

## Mapy i dane

BR: `map-battle-royale.png` — ta sama mapa co w kalkulatorze.
Pełna tekstura `map-battle-royale-hq.webp` poprawia jakość przy zoomie.
Reload: Surf City (`map-surf-city.png`), Slurp Rush (`map-slurp-rush.png`),
Elite (`map-b.jpg`), Stronghold (`map-a.jpg`) — osobne datasety.
Surf City i Slurp Rush korzystają też z istniejących tekstur HQ.
Import nadal używa współrzędnych obrazu bazowego, nie większej tekstury HQ.
Dane BR ze starej mapy wymagają ponownego importu; aplikacja nie przelicza
fikcyjnie ich współrzędnych.
Współrzędne x/y to piksele ORYGINALNEGO obrazu wybranej mapy (x od lewej, y od góry).
Dane z innej mapy lub innego kadru należy wcześniej przeliczyć.
Domyślne `loot-data.json` jest celowo puste. Nie ma fikcyjnych chestów,
nie ma automatycznego pobierania danych ani nieoficjalnego endpointu udającego API.

IMPORT LOOT DATA: JSON/CSV dla aktualnie wybranej mapy.
Import zastępuje dataset tylko tej mapy. Zapis lokalny w przeglądarce,
bez wysyłania danych na serwer. CLEAR IMPORT usuwa zapis tej mapy.
Pełny trwale udostępniony zestaw można umieścić w loot-data.json.

## Format

JSON: tablica węzłów lub obiekt `{nodes: [...], links: [...], metersPerPixel: ..., source: ...}`.
Węzeł: `id, x, y, poi, floor, building, chestType/type, spawnRate, priority`.
Opcjonalnie: `height` (metry), `risk` (0–1), `lootTime` (sekundy).
`floor`: rzeczywisty numer piętra; `building`: identyfikator budynku.
`spawnRate`: procent 0–100; brak oznacza nieznany, nie gwarantowany spawn.
`priority`: 0–10, domyślnie 1. `type`: chest, rare, guaranteed, loot, contest,
rotation lub waypoint. Guaranteed oznacza 100% i jest deklaracją importera.

CSV: nagłówek `id,x,y,poi,floor,building,type,spawnRate,priority,height,risk,lootTime`.
Wymagane x,y. Obsługiwane cytowane pola, przecinki w cudzysłowie i CRLF.
Brakujące pola opcjonalne pozostają nieznane. Skala może być wpisana w panelu.
CSV nie zawiera grafu przejść: do niego użyj pełnego JSON.

Przejście w `links`: `from,to,oneWay,distance,time,risk`.
`distance`: metry, `time`: sekundy; opcjonalne przy znanej skali.
Linki zawierające dystans w metrach wymagają skali m/px.
Linki muszą odwoływać się do istniejących id. Są jedynymi dozwolonymi
przejściami grafu, jeśli podano choć jeden link. Można używać waypointów,
rzeczywistych klatek schodowych i wejść jako węzłów.
Start łączy się z najbliższym węzłem nawigacji; ten odcinek wymaga
weryfikacji w grze. Nie wnioskujemy drzwi ani wysokości z tekstury.

Brak linków = jawnie oznaczona estymacja prostoliniowa. Przeszkody i wejścia
nie są wówczas znane. Brak ryzyka = NOT PROVIDED, nigdy fałszywe LOW.
Brak skali = px i brak czasu całej trasy w sekundach.
Ryzyko/bezpieczeństwo muszą pochodzić z prawdziwych danych użytkownika.
Rotation jest wybierana wyłącznie spośród importowanych węzłów rotation.
Brak strefy = brak twierdzenia, że dana rotacja prowadzi do aktualnej strefy.

## Algorytm

Ważony graf + Dijkstra dla kosztu przejścia. Beam search generuje i ocenia
wiele kolejności lootowania; nie jest to wybór kolejnego najbliższego chestu.
Koszt obejmuje dystans/czas, piętra, podejście w górę, zmianę budynku,
czas lootowania i importowane ryzyko. Nagroda: spawn rate, priority i typ lootu.
BEST wybiera strategię panelu, FAST minimalizuje koszt czasu, SAFE mocniej
karze ryzyko; MAX LOOT zwiększa nagrodę i budżet; CONTEST promuje szybki
loot o dużej wartości. To deterministyczna optymalizacja, nie zewnętrzny LLM.
Ocena 0–100 jest względnym wynikiem heurystyki, nie prawdopodobieństwem sukcesu.
Solo/Duo/Trio/Squad zmienia rozmiar planu; nie udajemy symulacji wielu graczy.
Czas zbierania jest szacunkiem profilu (BR 4s / Reload 2.5s na węzeł),
chyba że import podaje rzeczywisty lootTime. Skoryguj profile po pomiarach.

Granice: import 2000 węzłów; optymalizacja 80 najbliższych loot node w POI,
pełny graf nawigacji do 350 węzłów. Beam 36 stanów; maks. 20 celów.
Ograniczenia są jawnie pokazywane. Trzy strategie mogą dać tę samą trasę
przy małej liczbie chestów; aplikacja nie tworzy sztucznych wariantów.

## Wydajność

Web Worker dla optymalizacji, cache wyników po opcji/rewizji datasetu,
przestrzenna siatka dla widocznych markerów, requestAnimationFrame,
rysowanie przy zmianie widoku, render DPI do 2. Zoom 1–16, przeciąganie,
START przez klik, FIT MAP. Numeracja trasy jest stała na ekranie przy zoomie.

## Pliki

Zmienione: index.html i calculator.html (tylko linki nawigacyjne).
Dodane: loot-paths.html, loot/loot.css, loot/loot-data.json,
loot/lootDataManager.js, loot/lootImporter.js, loot/lootPathEngine.js,
loot/lootScoring.js, loot/lootRenderer.js, loot/lootWorker.js,
loot/lootApp.js, loot/package.json, loot/README.md, loot/tests.mjs,
loot/VERIFICATION.txt.
Nie zmieniono serwera, logowania, istniejących obrazów ani logiki kalkulatora.

## Weryfikacja

Uruchom `node --test loot/tests.mjs`. Szczegóły i ograniczenia kontroli
są w `loot/VERIFICATION.txt`. Skrypty istniejącego kalkulatora są identyczne
z wersją wejściową. Kontrola wizualna w przeglądarce pozostaje do wykonania.

## Poprawka uruchomienia

lootBundle.js jest klasycznym skryptem wygenerowanym z modularnych źródeł.
Nie wymaga importów ES w przeglądarce. lootDefaults.js udostępnia konfigurację
map bez fetch na file://. Mechanizm pokazuje błąd startu zamiast bez końca
wyświetlać Loading map. Po zmianie źródeł: `node loot/buildBundle.mjs`.
