42 lines
1.8 KiB
Markdown
42 lines
1.8 KiB
Markdown
# 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**.
|