# Falukant: Transportüberfälle & Wachen (Daemon) ## Migration `migrations/008_falukant_transport_raid.sql`: - `falukant_data.transport.guard_count` (Standard `0`) - Eintrag `falukant_type.underground.tr = 'raid_transport'` ## Code | Komponente | Datei | |------------|--------| | Tick (ca. 60 s) | `src/worker/falukant_transport_raid.rs` → `run_tick` | | Aufruf | `src/worker/underground.rs` (`UndergroundWorker::tick`, vor den 1-Tage-Jobs) | | SQL | `src/worker/sql.rs` (`QUERY_RAID_*`) | ## Logik (V1) 1. Offene Untergrundaufträge `raid_transport` mit `result IS NULL` (ohne 24h-Wartezeit). 2. Parameter: `regionId`, `bandSize` (JSON, auch `region_id` / `band_size`). 3. Region muss `falukant_type.region.id IN (4,5)` und `label_tr <> 'town'` erfüllen. 4. Kandidaten-Transporte: noch unterwegs, `size >= 2`, Fracht, Route berührt die Region (`source` oder `target`), **nicht** vom Auftraggeber. 5. Begegnung: Zufall mit von Bandengröße und Ladungsgröße abhängiger Wahrscheinlichkeit. 6. Kampf: `raidPower` vs. `guardPower` (Wachen aus `transport.guard_count`) → `repelled` | `partial_success` | `major_success`. 7. Beute: Anteil der Menge, **nie** die volle Ladung; zusätzlicher Verlust beim Abtransport ins Lager (`lostDueToStorage`). 8. Einlagerung: bevorzugt Niederlassung **in derselben Region**, sonst erste Branch-ID des Users. 9. Opfer: reduzierte `reputation`, verkleinerte Transportmenge. ## Events | Event | Empfänger | |-------|-----------| | `falukantTransportRaid` | Opfer (`reason`: `transport_raided`) | | `falukantUndergroundUpdate` | Auftraggeber (`raid_*`) | | `falukantUpdateStatus` | beide | | `falukantBranchUpdate` | beide | ## Backend / UI Projektseitig: API für `raid_transport`, `guardCount` am Transport, Formularfilter für Regionen. Dieses Dokument beschreibt nur den **Daemon**.