All checks were successful
Deploy yourpart (blue-green) / deploy (push) Successful in 5m13s
60 lines
3.0 KiB
Markdown
Executable File
60 lines
3.0 KiB
Markdown
Executable File
# Falukant: Kirchenämter (YpDaemon / PoliticsWorker)
|
|
|
|
Umsetzung des Zielmodells: Laufbahn `highest_church_hierarchy_ever`, NPC-Bewerbungen, NPC-Vorgesetzte mit Score, Spieler-Vorgesetzte ohne Daemon-Entscheidung und Events `falukantUpdateChurch`.
|
|
|
|
## Migration
|
|
|
|
- `migrations/007_falukant_character_church_career.sql` — Spalte `falukant_data.character.highest_church_hierarchy_ever` + Backfill aus bestehenden `church_office`.
|
|
|
|
**Ohne Migration** schlagen Bewerbungs-Checks fehl, die die Spalte referenzieren.
|
|
|
|
## Ticks
|
|
|
|
| Was | Wann |
|
|
|-----|------|
|
|
| Kirchen-Gesamtprozess | Täglich im **gleichen** Lauf wie `perform_daily_politics_task` (nicht mehr nur 13:00) |
|
|
| NPC-Entscheidung | Nach mindestens **2 Tagen** offener Bewerbung, täglich |
|
|
|
|
## Logik (Kurz)
|
|
|
|
1. **Freie Sitze** je `church_office_type` / Region (`QUERY_FIND_AVAILABLE_CHURCH_OFFICES`, inkl. `hierarchy_level`).
|
|
2. **Vorgesetzter** = nächsthöhere besetzte Hierarchie in der Region (`QUERY_FIND_CHURCH_SUPERVISOR`).
|
|
3. **Spieler-Vorgesetzter** (`character.user_id IS NOT NULL`): `falukantUpdateChurch` mit `reason: applications` — **keine** automatische Annahme/Ablehnung durch den Daemon.
|
|
4. **NPC-Vorgesetzter**: Nach der zweitägigen Bewerbungsfrist bewertet er Bewerber mit `churchCandidateScore` und entscheidet über die freien Sitze.
|
|
5. **Kein Vorgesetzter**: Der Kirchen-NPC führt denselben Auswahlvorgang nach zwei Tagen durch. Das deckt insbesondere Einstiegsämter ab und verhindert dauerhaft offene Bewerbungen.
|
|
6. **NPC-Laufbahn**: Nur Charaktere mit `user_id IS NULL`; Einstieg ohne Kirchenamt, jede Beförderung ausschließlich aus einem aktuell gehaltenen Amt genau eine Hierarchiestufe darunter.
|
|
|
|
## Bewerbungsvoraussetzungen (Daemon-SQL)
|
|
|
|
`QUERY_CHECK_CHARACTER_ELIGIBILITY`: Für ein gefordertes Voramt (`prerequisite_office_type_id`) gilt **Erfüllt**, wenn
|
|
|
|
- das exakte Amt aktuell gehalten wird, **oder**
|
|
- `GREATEST(highest_church_hierarchy_ever, max. aktuelle Hierarchie aus church_office) >= hierarchy_level` des Voramts.
|
|
|
|
Titelbedingungen unverändert (`min_title_level`).
|
|
|
|
## Genehmigung / Amtsverlust
|
|
|
|
- `QUERY_APPROVE_CHURCH_APPLICATION`: nach Eintrag `church_office` → Update `highest_church_hierarchy_ever`, dann `DELETE` niedrigerer konkurrierender `church_office` desselben Charakters (`remove_lower_ranked`).
|
|
|
|
## WebSocket
|
|
|
|
| Event | Payload |
|
|
|-------|---------|
|
|
| `falukantUpdateChurch` | `{"event":"falukantUpdateChurch","user_id":N,"reason":"…"}` |
|
|
| `falukantUpdateStatus` | wie üblich, direkt danach |
|
|
|
|
**reason:** `applications` (Spieler-Vorgesetzter), `npc_decision` (Kirchen-NPC hat entschieden).
|
|
|
|
Details: [`FALUKANT_UI_WEBSOCKET.md`](./FALUKANT_UI_WEBSOCKET.md).
|
|
|
|
## Backend (außerhalb YpDaemon)
|
|
|
|
- `getAvailableChurchPositions()` muss dieselbe Laufbahn-Logik nutzen (Spec Abschnitt 11).
|
|
- Spieleranträge und gleiche Bewertungsregeln wie im Daemon.
|
|
|
|
## Code
|
|
|
|
- `src/worker/politics.rs` — `perform_church_office_task`, `process_church_supervisor_queue`, NPC-Entscheidungen mit und ohne Vorgesetzten, Hilfsfunktionen.
|
|
- `src/worker/sql.rs` — Abschnitt „Church Office Queries“.
|