Kunden, Rechnungen und Polizeibesuche
DOOR ist nicht nur ein Slot, sondern ein Ereigniskoordinator. Die Oberfläche priorisiert offene Polizeifälle, periodische Rechnungshinweise und Kundenangebote.
Ereignispriorität
Ein bereits offener Polizeifall verhindert neue Kundenangebote. Die Rechnung bleibt im Ledger, auch wenn der Türhinweis geschlossen wurde.
Kundenangebot
| Schritt | Methode | Logik |
|---|---|---|
| Verfügbarkeit | CUSTOMER_SALES.available() | prüft freie, nicht reservierte Weed- oder Tablettenbestände |
| Ankunft | createOfferAtomic() | eine Transaktion prüft offene Ereignisse, würfelt Polizei und reserviert Ware |
| Auswahl | interne choices() | zufällige Produktgruppe, Produkt, NPC und Menge 1–20 |
| Annahme | acceptAtomic(id) | Hold validieren, Bestand reduzieren, USD gutschreiben, Historie/Statistik erhöhen |
| Ablehnung | declineAtomic(id) | Reservierung entfernen, Angebot löschen, Nachfrage ablehnen erhöhen |
| Später | DOOR.postponeOffer() | Popup schließen; persistentes Angebot/Reservierung bleibt erhalten |
NPCs
Skinny Jeans, Sticky, Andy und Metal Jack. Das NPC-Bild beeinflusst keine Preise oder Mengen.
Preise
Weed nutzt den Sortenpreis pro Gramm; Legacy-Bestand 5,00 $/g. Chemieprodukte nutzen bundlePrice × 10 pro Tablette.
Historie
Maximal 20 Türverkäufe im State. Statistik zählt Verkäufe, Gramm, Tabletten, Umsatz, größten Verkauf und letzten Zeitpunkt.
Nachfrage
doorDemand[kind:productId] zählt requests, accepted und declined.
Reservierungssystem
SALE_RESERVATIONS verhindert, dass dieselbe physische Ware gleichzeitig an der Tür und im Darkweb angeboten wird.
| Funktion | Aufgabe |
|---|---|
freeSaleStock() | physischer Bestand minus alle gültigen Holds, optional ohne aktuellen Hold |
reserveSale() | prüft Produkt, Epoch, Menge und freien Bestand; legt Hold an |
pruneSales() | entfernt abgelaufene Darkweb-Quotes/Holds; Tür-Holds besitzen kein Ablaufdatum |
assertSales() | prüft Konsistenz von Angebot, Quote, Hold und physischem Bestand |
Polizeimechanik
Bewertung und Strafe
Der Warenwert besteht aus Weed zum jeweiligen Verkaufspreis und Chemieprodukten zum Bündelpreis. Die Strafe wird auf 1-$-Stufen gerundet und zwischen 250 $ und 5.000 $ begrenzt.
POLICE_EVENTS.pay()
Prüft Fall-ID und Epoch, zieht die vollständige Strafe ab, aktualisiert Statistik/Historie und schließt den Fall. Reicht das Geld nicht, bleibt der Fall offen.
POLICE_EVENTS.seize()
Leert Weed, Tabletten, Rohstoffe, Pflanzen und Chemieaufträge; entfernt Verkaufsreservierungen und zählt die Verluste.
assertPoliceFreeze() jede andere Buchung, die konfiszierbare Waren, Pflanzen oder Chemiejobs verändert. Nur police:pay und police:seize dürfen den Zustand auflösen.Rechnung an der Tür
| Aktion | Wirkung |
|---|---|
openOfferAtomic({allowOutstanding:true}) | öffnet den mit doorNoticeBillId verknüpften ältesten offenen Beleg |
payBill() | zahlt nur diese Rechnung, auch teilweise; entfernt den Hinweis nach einer sinnvollen Zahlung |
postponeBill() | führt dismissDoorNotice() aus; die Schuld bleibt in der Banking-App |
newNotification() | zeichnet genau das derzeit priorisierte Ereignis |
notificationInterval() | plant Folgeereignisse über GameClock statt eigener Dauerintervalle |