NPCs & Bevölkerung
Jeder Sektor hat eine simulierte Bevölkerung mit echten NPCs — nicht abstrakte Zahlen, sondern benannte Personen mit Stelle, Wohnsitz, Familienstatus und Stundenplan. Die Stadt hat 10.000 bis 40.000 NPCs, die jeden Tag geboren werden, sterben, kündigen, abwandern und beobachten was du tust. Wer das System ignoriert, verliert die Kontrolle über sein Imperium.
NPC-Typen (Roles)
Aus engine/internal/population/types.go:
| Role | Bedeutung |
|---|---|
| Owner | Ein NPC pro Nicht-Landmark-Building. Eigentümer. |
| Staff | Angestellte in Commercial/Industrial-Buildings. Mit Wage. |
| Resident | Wohnt in Residential, ohne Job. Birth-Pool für neue Owner/Staff. |
| Unemployed | Aktiv arbeitslos (z.B. nach Quit, vor Replacement). |
Phase-6+ Spezialitäten (Server-Roadmap, teilweise im Pool reserviert): Auditor, Judge, Doctor, Teacher, Cop, CorpSec, Journalist, Lawyer, Guard.
NPC-Attribute (0-100)
Jeder NPC hat sechs psychologische + ökonomische Werte:
| Attribut | Bedeutung |
|---|---|
| Wealth | 0-100+ (kann darüber hinaus). Bestimmt Wealth-Tier (low/mid/high). |
| Corruption | 0-100. Bribe-Anfälligkeit — hoch = leicht zu kaufen. |
| Fear | 0-100. Reaktion auf Intimidation. Hoher Fear = quittet eher. |
| Loyalty | 0-100. Treue zu Arbeitgeber/Familie. < 20 = Informant-Flag. |
| Observance | 0-100. Zeugen-Klarheit. < 20 = bezeugt nichts. |
| Productivity | 0-100. Job-Output-Modifier. |
Stundenplan (StateAt)
Jeder NPC hat einen deterministischen Stundenplan als Pure-Function:
ShiftStart = Minute-of-Day, default 540 (09:00)
ShiftEnd = default 1020 (17:00)
Commute = 10 (gleicher Sektor) | 30 (adjacent) | 60 (weit)
States: Home → CommutingOut → Working → CommutingIn → Home → OffDuty | Sick | Imprisoned | Grieving.
StateAt(tick) ist O(1) — du kannst zu jeder Tageszeit fragen “wo ist NPC X gerade?”. Wichtig für Witness-Mechanik (siehe unten).
Witness-System (Zeugen)
NPCs am Tatort beobachten Verbrechen. Per NPC ein Ring-Buffer von 10 Events:
WitnessEvent = {
Day, EventType, ActorPlayerIdx, NodeID, SectorID,
Fidelity (0-100, Decay -10/Tag)
}
Gates:
- NPC muss mindestens Observance ≥ 20 haben
- NPC muss am Tatort-Knoten oder im 2-Hop-Radius sein (Phase 4)
- Same-Location-Bonus: +30 Fidelity
Decay: −10 Fidelity/Tag. Bei 0 → Event wird aus Buffer gepruned.
Fog-of-War: Andere Spieler sehen ActorPlayerIdx als −1 (unbekannt) — nur du selbst (oder Building-Owner) siehst, wer das Verbrechen begangen hat.
Dedup: Gleicher (EventType, Actor, Node) → existierender Eintrag wird auf Fidelity 100 refreshed, statt Duplikat.
Spieler-Counter-Aktionen gegen Zeugen (volle Einträge in Aktionen):
- WITNESS_INTIMIDATION — STR/CHA-getrieben, 45 min, 500 $. Verlangsamt Evidence-Akkumulation im Sektor. Am besten früh in einer Ermittlung einsetzen, bevor der Fall über die Beat-Cop-Stage hinaus eskaliert.
- CLEAN_UP (Server v1.62.0) — STL/TCH-getrieben, 45 min. Physische Spurenbeseitigung am Tatknoten — zieht Fidelity direkt von Witness-Events ab, retrospektive Heat-Reduktion am Hood.
- DATA_WIPE (Server v1.68.0) — TCH-Hack auf das Polizei-Aktensystem. Berührt die Zeugen selbst nicht, bereinigt aber die nachgelagerte Aktenspur; passt zu Intimidation, wenn der Fall bereits geöffnet wurde.
Informant-Mechanik
Wenn Staff.Loyalty ≤ 20:
Staff.Informant = true (sticky — flippt nicht zurück bei Loyalty-Recovery)
Informanten leaken Witness-Events an die Polizei — das ist ein Hauptweg, wie deine Verbrechen in Investigations enden.
Reset: Nur via Phase-3.F-Action explizit clearbar. Sonst: NPC entlassen oder ersetzen.
Sichtbar: Building-Owner sieht den Informant-Flag im Exact-Attribute-View, andere Spieler nicht.
Bribe-Effekt auf NPCs
bribe-Action auf NPC:
- Corruption +5..10 (je nach Erfolg)
- BribedMask-Bit für deinen Player-Index gesetzt (sticky)
- Re-Bribe → Repeat-Bribe-Discount (UI-Signal)
- Über 60% Korruption (Cops): permanente DirtyCop-Beziehung möglich (Layer 6)
Lebenszyklus pro Tick (End-of-Day)
In jedem Tick laufen folgende Population-Phasen:
Mortality (Altersdes Tod)
< 360 Monate (30 Jahre) → 0% chance
360-720 Monate (30-60 Jahre) → linear 0.001%/Monat-Excess
> 720 Monate (60+ Jahre) → linear 0.003%/Monat-Excess (3× Multiplier)
Birth (Geburten)
- Daily Chance: 0.0005 pro Adult-Resident (240-540 Monate alt)
- Penalties: Violence-Deaths (−50% bei 20+), Emigration (−40% bei 30+), Sektor-Heat (−40% bei Heat=100)
- Newborn spawnt im HomeNode des Eltern-Residents
Emigration (Auswanderung)
- Triggert in Sektoren mit DeathsTotal > 5
- Base: 0.005/Tag pro Resident, +0.002 pro Excess-Death
- Heat-Boost: linear ×1.0 → ×2.0 (Heat 0 → 100)
- Cause:
EmigrationCauseDeathSpiraloderEmigrationCauseHeat
Quit (freiwilliger Job-Verlust für Staff/Owner)
Drei unabhängige Channels:
- Loyalty-Channel: Pro Punkt unter 30 → +0.001/Tag Quit-Chance
- Fear-Channel: Pro Punkt über 70 → +0.0005/Tag
- Wage-Channel: Sehr niedriger Wage → +0.01/Tag base
- Tenure-Inertia: Veteranen quitten weniger schnell
Retirement (altersbedingt)
- Trigger: Owner/Staff ≥ 540 Monate (45 Jahre)
- Probabilität: 0.05/Tag bei 540, ramped auf 1.0/Tag bei 900+ Monaten
- Replacement spawnt sofort
Replacement (Death/Quit → neuer NPC)
- Promotion: Lokaler Adult-Resident (20-40 Jahre, passende Wealth-Tier) → Staff/Owner
- Fresh Spawn: Wenn kein Kandidat → frischer NPC mit Baseline-50-Attributen
Immigration (Zuzug)
- Trigger: LaborDemand/LaborSupply > 1.3 (Sektor unterstaffed)
- Inflow: ~5% PopulationTotal/Tag
- Wealth-Tier matched zur Wage-Offer
Loyalty-Regen
- Daily +1 Loyalty für Staff unter Baseline (50)
- One-sided — Staff ≥ 50 wird nicht touched
- Aber: Informant-Flag bleibt sticky auch bei Loyalty-Recovery
Sektor-Aggregate
Jeder Sektor trackt 20+ Counter (Births, Deaths-By-Cause, Quits, Hires, etc.) als Lifetime + Today-Werte plus 7-Tage-Rolling-History (für UI-Sparklines).
Health-Tier (demographisch)
| Tier | Trigger |
|---|---|
| Thriving | Births − Emigration > 5 |
| Stable | Default |
| Declining | Emigration − Births > 5 |
| Collapsing | DeathsByViolence ≥ 10 ODER (Emigration ≥ 10 UND Births/Emigration < 0.33) |
Economy-Tier (wirtschaftlich)
| Tier | Trigger |
|---|---|
| Booming | WealthInflow ≥ 200 + Inflow/Outflow ≥ 3:1 |
| Stable | Default |
| Stagnating | LaborSupply ≥ 5 + Supply/Demand ≥ 2:1 |
| Recession | Outflow ≥ 200 + Outflow/Inflow ≥ 3:1 |
Beide Tiers sind unabhängig — ein Sektor kann gleichzeitig Thriving (demografisch) UND Recession (wirtschaftlich) sein. “Brain-Drain”-Marker.
Was du als Spieler siehst (Fog-of-War)
| Position | Was sichtbar ist |
|---|---|
| Unscouted Sector | Nur Aggregate (Population, Labor, Migration, Avg-Wealth). Keine individuellen NPCs. |
| Scouted Sector | Owner/Staff-Listen mit gehinten Attributen (“very_corrupt”, “very_loyal”). Keine exakten Werte. |
| Eigenes Building | Staff mit exakten 0-100-Werten + Informant-Flag + Witness-Events (eigene Crimes mit ActorPlayerIdx, fremde mit −1). |
| Admin | Kein Fog. |
NPCDTO Felder
Aus engine/internal/fixture/population.go:
NPCDTO {
ID, Name, Surname, AgeYears
Role // "owner" | "staff" | "resident" | "unemployed"
HomeBuildingID, WorkBuildingID
WealthTier // "low" | "mid" | "high"
CorruptionHint, FearHint, LoyaltyHint // gehinted, kategorisch
Wage, TenureDays
State, CurrentNode, ShiftStart, ShiftEnd, NextTransition
Exact?: { // nur Owner/Admin
Corruption, Fear, Loyalty, Observance, Productivity, Wealth
Informant, BribedByRequester
WitnessedEvents[]
}
}
Sektor-Population-DTO
SectorPopulationDTO {
Total, Cap // Population + Housing
LaborDemand, LaborSupply, MigrationFlag // +1 Inflow / -1 Outflow / 0 Stable
AvgWealth, AvgOwnerFear, AvgStaffLoyalty
InformantCount // Anzahl ohne Identitäten
AvgStaffProductivity
}
Strategische Konsequenzen
Vertiefung: Sobald du Gebäude organisierst, greift das Belegschaft & Streiks-Arbeitssystem — chronische Mustererkennung, Federal-Heat-Strafen, Crisis-Stufen und Bot-Adaption laufen mit.
- Sektor-Health unter Druck halten: Heat → Emigration → weniger Staff verfügbar → Buildings unproduktiv
- Manager-Heat niedrig halten: > 30 = Synergie-Modifier reduziert Wasch-Cap (siehe Wirtschaft)
- Loyalty als langfristige Investition: Staff < 20 = Informant. Entweder Loyalty pflegen oder NPC ersetzen
- Gewalt = Bevölkerungs-Crash: Häufige Murder/Arson generieren
DeathsByViolence→ Sektor in Collapsing → Buildings verlieren Workforce - Wealth-Inflow lockt reiche NPCs an: Booming-Sektoren bringen mehr Wealth-Inflow + bessere Owner/Staff-Rekrutierung
- Witness-Decay nutzen: Verbrechen in unauffälligen Zeitfenstern (NPCs auf Schicht woanders) reduziert Zeugen
- Bribe-Mask sticky: Gekaufte NPCs bleiben dauerhaft markiert — Repeat-Bribes günstiger
Quellen
engine/internal/population/— 115+ Go-Files, vollständige Lifecycle-Engineengine/internal/fixture/population.go— DTO-Mapping für APIengine/internal/government/institutional_effects.go— Contact-Effekte (NPC ist die Basis von Contacts)