From 7ca43da52dd243f7e53f6edafe4ee70eee50ede6 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Mon, 13 Apr 2026 14:53:08 +0200 Subject: [PATCH] Refactor product start calculation and SQL query: Updated the documentation for the best product start logic to clarify the ranking criteria and cost calculations. Adjusted the SQL query to enhance the worth calculation by incorporating new logic for category-based costs and headroom discounts, ensuring consistency with the updated pricing strategy. --- src/worker/sql.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/worker/sql.rs b/src/worker/sql.rs index 9c1c0b2..d6c3eb9 100644 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -73,10 +73,12 @@ JOIN falukant_data.branch b ON b.region_id = c.region_id AND b.falukant_user_id WHERE current_time BETWEEN '08:00:00' AND '17:00:00'; "#; -/// Bester Produktstart: **Legacy/UI-Formel** (vormals C++ `QUERY_GET_BEST_PRODUCTION`), damit Reihenfolge zur -/// Produkt-Ertrags-Tabelle passt: Wissen geht **additiv** in den Markt-Prozentsatz -/// `(worth + (2×Char + Dir)/3) / 100`, Kosten **`6 × category`**, Skalierung **`/ (300 × production_time)`**. -/// Verkauf/Steuer im laufenden Spiel nutzt weiter `DirectorWorker::compute_piece_sell_price` — nur **Ranking** hier. +/// Bester Produktstart für den Direktor: +/// Wissen geht additiv in den Markt-Prozentsatz `(worth + (2×Char + Dir)/3) / 100`. +/// Für das Ranking werden dieselben Stückkosten wie im DirectorWorker angesetzt: +/// `raw = 6 + category`, mit Headroom-Rabatt über Zertifikat (`min((cert-cat)*0.035, 0.14)`). +/// Skalierung: `/ (300 × production_time)`. +/// Verkauf/Steuer im laufenden Spiel nutzt weiterhin `DirectorWorker::compute_piece_sell_price` — hier nur Ranking. /// /// `worth_percent`: mit Fahrzeug `MAX` über Filialregionen; ohne Fahrzeug nur Direktor-Region. /// **Ein** Spielercharakter je User (`ORDER BY id DESC LIMIT 1`, `health > 0`). @@ -106,7 +108,20 @@ COALESCE((SELECT SUM(COALESCE(fdi.quantity, 0)) FROM falukant_data.stock fds JOI / 3.0 ) / 100.0 - - 6.0 * COALESCE(ftp.category, 0)::float8 + - ( + ( + 6.0 + GREATEST(COALESCE(ftp.category, 1)::float8, 1.0) + ) * ( + 1.0 - LEAST( + GREATEST( + COALESCE(fdu.certificate, 1)::float8 + - GREATEST(COALESCE(ftp.category, 1)::float8, 1.0), + 0.0 + ) * 0.035, + 0.14 + ) + ) + ) ) / (300.0 * NULLIF(ftp.production_time::float8, 0.0)) ) AS worth, fdb.id AS branch_id, (SELECT COUNT(id) FROM falukant_data.production WHERE branch_id = fdb.id) AS running_productions,