3.9 KiB
Director: Stückkosten Produktion (Balancing)
Was der Daemon nicht macht (häufige Missverständnisse)
- Nicht
6 × Kategorie(also kein reiner Multiplikator nur aus der Klassennummer). - Nicht
2 × Kategorie— im ypdaemon-Stand gibt es diese Formel nicht. - Nicht „höheres Zertifikat ⇒ höhere Stückkosten“: Das Zertifikat begrenzt nur die Produktpalette (
ftp.category <= certificate); es wird nicht alsZertifikat × 6o. Ä. auf die Kosten drauf multipliziert.
Die kanonische Berechnung lebt in Rust: DirectorWorker::piece_production_cost in src/worker/director.rs (gleiche Logik beim Produktionsstart und bei der Kostenbasis für Steuer/Marge beim Verkauf über resolve_production_piece_cost).
Modell
falukant_user.certificatebegrenzt nur, welche Produkte wählbar sind (ftp.category <= certificateinQUERY_GET_BEST_PRODUCTION). Es gibt keine höheren Stückkosten nur wegen eines höheren Zertifikats.- Die Stückkosten hängen von der Produktklasse (
falukant_type.product.category) und einer Basis ab; optional Headroom-Rabatt, wenn das Zertifikat über der Klasse des produzierten Guts liegt (Erfahrung/Reserve, nicht „Strafe“ fürs Zertifikat).
Formel (Rust, DirectorWorker)
raw = PRODUCTION_COST_BASE + product_category × PRODUCTION_COST_PER_PRODUCT_CATEGORY
headroom = max(0, certificate − product_category)
discount = min(headroom × PRODUCTION_HEADROOM_DISCOUNT_PER_STEP, PRODUCTION_HEADROOM_DISCOUNT_CAP)
effektiv_stückkosten = raw × (1 − discount)
Ausgeschrieben mit den Standardkonstanten:
raw = 6 + 1 × product_category (Kategorie mindestens 1), dann Rabatt nur bei Headroom.
Beispiele (Standardkonstanten, ohne Rundung):
| Kategorie | Zertifikat | raw | Headroom | effektiv (ca.) |
|---|---|---|---|---|
| 1 | 4 | 7 | 3 | 7 × (1 − min(0,105; 0,14)) ≈ 6,27 |
| 4 | 4 | 10 | 0 | 10 |
Chargenkosten beim Start einer Linie: effektiv_stückkosten × Stückzahl (Stückzahl bis 100 pro Linie, siehe create_single_production).
| Konstante | Standard | Bedeutung |
|---|---|---|
PRODUCTION_COST_BASE |
6.0 |
fixer Basisanteil pro Stück |
PRODUCTION_COST_PER_PRODUCT_CATEGORY |
1.0 |
Aufschlag pro Produktklasse (additiv zu 6, nicht „6×Kategorie“) |
PRODUCTION_HEADROOM_DISCOUNT_PER_STEP |
0.035 |
Rabatt pro Headroom-Stufe |
PRODUCTION_HEADROOM_DISCOUNT_CAP |
0.14 |
maximaler Gesamtrabatt |
Ranking in SQL (QUERY_GET_BEST_PRODUCTION)
Sortierung nach Gewinn pro Minute, mit demselben Verkaufs-Modell wie DirectorWorker::compute_piece_price_for_percent / compute_piece_sell_price in director.rs:
- Regionaler Basispreis:
sell_cost × (worth_percent / 100)— mit FahrzeugMAX(worth_percent)über alle Filialregionen des Users, sonst nur Region der Direktor-Filiale. - Wissensband: effektiver Verkaufspreis = Basis ×
0.6 + 0.4 × (k/100)mit k = Wissen 0…100 (linear zwischen 60 % und 100 % der Basis). Entsprichtmin_price + (max_price − min_price) × k/100mitmin = 0.6 × Basis,max = Basis. - k:
(2 × knowledge Spielercharakter + knowledge Direktor) / 3ausfalukant_data.knowledge(Produktzeilen für Charakter bzw. Direktor). - Stückkosten: wie
piece_production_cost(siehe oben). - Formel:
(Verkaufspreis/Stück − Stückkosten) / production_time. Steuer im Ranking nicht abgezogen.
UI / Node: Sollte dieselbe Preislogik wie der Daemon nutzen. Weicht calcRegionalSellPriceSync ab (z. B. 70 % statt 60 % unterhalb der Basis), Frontend an diese Rust-Formel anpassen — nicht umgekehrt den Daemon „blind“ an eine abweichende UI koppeln.
Parallelproduktionen
MAX_PARALLEL_PRODUCTIONS (aktuell 2) bestimmt, wie viele Linien pro Tick Geld binden — unabhängig von der Stückkostenformel.