Version: 2.0
Ziel: Vollständige Funktionsfähigkeit autonomer NPC-Trader mit Supply/Demand-gesteuerten Handelsrouten
┌─────────────────────────────────────────────────────────────┐
│ Market Supply/Demand Generator │
│ (berechnet Angebot/Nachfrage pro System & Kolonie) │
└────────────────────────┬────────────────────────────────────┘
│
↓
┌─────────────────────────────────────────────────────────────┐
│ Trade Opportunity Analyzer │
│ (findet profitable Handelsrouten: Preis-Differenzen) │
└────────────────────────┬────────────────────────────────────┘
│
↓
┌─────────────────────────────────────────────────────────────┐
│ NPC Trader Fleet Manager │
│ (startet Flotten, verwaltet Routen, Lieferungen) │
└────────────────────────┬────────────────────────────────────┘
│
↓
┌─────────────────────────────────────────────────────────────┐
│ Market Price Adjustment │
│ (Supply/Demand aktualisieren nach Transaktionen) │
└─────────────────────────────────────────────────────────────┘
1. Jede Kolonie produziert + konsumiert → Supply/Demand
2. System aggregiert lokale Supply/Demand
3. Preis = Basis × (Demand/Supply)^0.4 → Price Signals
4. NPC-Trader erkennen Arbitrage-Chancen
5. Trader startet Fleet zu günstiger Quelle
6. Trader kauft dort + liefert zu teurer Destination
7. Markt-Preise passen sich an → Opportunity verschwindet
CREATE TABLE npc_traders (
id INT AUTO_INCREMENT PRIMARY KEY,
faction_id INT NOT NULL,
name VARCHAR(64) NOT NULL,
user_id INT NOT NULL, -- NPC-Benutzer, der die Trader-Flotte steuert
base_colony_id INT NOT NULL, -- Heimatkolonie/Depot
capital_credits DECIMAL(16,2) NOT NULL DEFAULT 50000,
-- Handelsstatistiken
total_profit DECIMAL(16,2) NOT NULL DEFAULT 0,
active_fleets INT UNSIGNED NOT NULL DEFAULT 0,
max_fleets INT UNSIGNED NOT NULL DEFAULT 3,
-- Handels-Strategie
strategy ENUM('profit_max', 'volume', 'stabilize') NOT NULL DEFAULT 'profit_max',
specialization VARCHAR(32) DEFAULT NULL, -- z.B. 'metal', 'luxury'
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (faction_id) REFERENCES npc_factions(id),
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (base_colony_id) REFERENCES colonies(id),
INDEX idx_faction (faction_id),
INDEX idx_active_fleets (active_fleets)
) ENGINE=InnoDB;CREATE TABLE trade_opportunities (
id INT AUTO_INCREMENT PRIMARY KEY,
source_system INT NOT NULL,
target_system INT NOT NULL,
resource_type VARCHAR(32) NOT NULL,
source_price DECIMAL(10,4) NOT NULL,
target_price DECIMAL(10,4) NOT NULL,
profit_margin DECIMAL(5,2) NOT NULL, -- Prozent
available_qty DECIMAL(12,2) NOT NULL, -- verfügbar an Quelle
demand_qty DECIMAL(12,2) NOT NULL, -- nachgefragt am Ziel
-- Chance (wie lange bleibt Route profitabel?)
confidence DECIMAL(4,3) NOT NULL, -- 0-1.0
expires_at DATETIME NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX idx_profit_margin (profit_margin DESC),
INDEX idx_expires (expires_at)
) ENGINE=InnoDB;CREATE TABLE trader_routes (
id INT AUTO_INCREMENT PRIMARY KEY,
trader_id INT NOT NULL,
fleet_id INT NOT NULL, -- Zugewiesene Flotte
source_colony_id INT NOT NULL,
target_colony_id INT NOT NULL,
resource_type VARCHAR(32) NOT NULL,
quantity_planned DECIMAL(12,2) NOT NULL,
quantity_acquired DECIMAL(12,2) NOT NULL DEFAULT 0,
status ENUM('planning', 'acquiring', 'transit', 'delivering', 'completed')
NOT NULL DEFAULT 'planning',
price_paid DECIMAL(10,4) NOT NULL DEFAULT 0,
price_target DECIMAL(10,4) NOT NULL DEFAULT 0,
expected_profit DECIMAL(16,2) NOT NULL DEFAULT 0,
actual_profit DECIMAL(16,2) DEFAULT NULL,
departure_at DATETIME,
arrival_at DATETIME,
delivered_at DATETIME,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (trader_id) REFERENCES npc_traders(id) ON DELETE CASCADE,
FOREIGN KEY (fleet_id) REFERENCES fleets(id),
FOREIGN KEY (source_colony_id) REFERENCES colonies(id),
FOREIGN KEY (target_colony_id) REFERENCES colonies(id),
INDEX idx_trader_status (trader_id, status),
INDEX idx_fleet (fleet_id)
) ENGINE=InnoDB;CREATE TABLE market_supply_demand (
id INT AUTO_INCREMENT PRIMARY KEY,
system_index INT NOT NULL,
resource_type VARCHAR(32) NOT NULL,
-- Lokale Produktion diese Stunde (Units)
production DECIMAL(16,2) NOT NULL DEFAULT 0,
-- Lokaler Verbrauch (Units)
consumption DECIMAL(16,2) NOT NULL DEFAULT 0,
-- Verfügbar zum Verkauf (Lager)
available_sell DECIMAL(16,2) NOT NULL DEFAULT 0,
-- Nachgefragt zum Kauf (Bedarf)
desired_buy DECIMAL(16,2) NOT NULL DEFAULT 0,
-- Resultat
net_balance DECIMAL(16,2) NOT NULL DEFAULT 0, -- verfügbar oder fehlend
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (system_index, resource_type),
INDEX idx_updated (updated_at)
) ENGINE=InnoDB;Neue REST-Endpoints:
GET /api/traders.php?action=list_traders → Liste aller Trader + Statistiken
GET /api/traders.php?action=list_opportunities → Verfügbare Handels-Chancen
GET /api/traders.php?action=list_routes → Aktive Trader-Routen
GET /api/traders.php?action=market_analysis&system=1 → Supply/Demand eines Systems
POST /api/traders.php?action=create_trader → Neuen Trader starten
POST /api/traders.php?action=start_route → Neue Handelsroute initiieren
POST /api/traders.php?action=cancel_route → Laufende Route abbrechen
-- Admin/Debug:
POST /api/traders.php?action=regenerate_opportunities → Chancen neu berechnen
POST /api/traders.php?action=process_tick → Tick-basierte Verarbeitung
Supply/Demand-Berechnung:
/**
* Aggregiere lokale Production + Consumption pro System
* Basis: Colony Output-Logs der letzten Stunde
*/
function calculate_system_supply_demand($db, int $system_index): array
{
// 1. Sammle alle Kolonien im System
// 2. Pro Kolonie: Produktion - Verbrauch = lokale Bilanz
// 3. Aggregiere: Supply/Demand pro Ressource
// 4. Speichere in market_supply_demand
}
/**
* Erkenne profitable Arbitrage-Chancen
* = Quell-Preis < Ziel-Preis − Transportkosten
*/
function find_trade_opportunities($db): array
{
// 1. Lade alle Systeme mit Supply/Demand
// 2. Pro Ressourcen-Typ:
// - Finde Systeme mit Überangebot (Seller)
// - Finde Systeme mit Nachfrage (Buyer)
// 3. Berechne Profit = (Ziel-Preis - Quell-Preis) * Menge - Transportkosten
// 4. Aktualisiere trade_opportunities mit Ranking
}
/**
* NPC-Trader: Führe regelmäßig Transaktionen aus
*/
function execute_trader_tick($db): void
{
// 1. Pro aktiver Trader-Route:
// - Update Fleet-Status
// - Bei Ankunft an Quelle: Kauf
// - Bei Transit: Bewegung
// - Bei Ankunft Ziel: Verkauf
// 2. Update Market Prices (Supply/Demand anpassen)
}Tabs:
- Markt-Chancen — verfügbare Handelsrouten (ranking nach Profit)
- Aktive Trader — laufende NPC-Trader mit Profitstatistiken
- Meine Handelsrouten — Spieler-Handelsrouten (bestehend, erweitert)
- System-Analyse — Supply/Demand Übersicht lokales System
- Trade Opportunity Card → Quelle → Ziel (mit Preis-Delta, Gewinn-Prognose)
- Trader Status → aktive Flotten, bisheriger Profit
- Supply/Demand Graph → lokal + regional (einfache Bar-Charts)
- DB-Tabellen erstellen
- API-Grundgerüst (
api/traders.php) - Supply/Demand-Berechnung
- Opportunity-Finder
- Trader-Entitäten erstellen/verwalten
- Autonome Flotten starten
- Tick-basierte Transaktionen
- Profitabilität tracking
- Traders Dashboard Window
- Trade Opportunity Anzeige
- Market-Analyse-View
- Preisanpassungen testen
- NPC-Verhalten kalibrieren
- Performance-Optimierung
- Neue Quellen für Supply/Demand (nicht nur Events)
- basierend auf tatsächlicher Production/Consumption
- New Fleet Type:
trader_fleet(mit Cargo-Handling) - Support für automatische Buy/Sell Transactions
npc_try_trader_mission()— Trader-Entscheidungslogik
- Trade Director Leader aktivieren
- Auto-Trader Automation via Leader-Skills
// Trader-Verhalten
MAX_TRADER_FLEETS_PER_FACTION = 5
TRADER_CAPITAL_PER_FLEET = 10000 Credits
TRADER_STRATEGY_DRIFT = 0.1 // wie oft Strategie wechselt
// Supply/Demand-Schwellen
ARBITRAGE_MIN_MARGIN = 0.15 // 15% minimum Profit
OPPORTUNITY_TTL = 3600 // 1h bis Chance verfällt
// Preisanpassung nach Trader-Aktion
PRICE_IMPACT_MULTIPLIER = 0.02 // wie stark Kauf Preis treibt- Unit-Tests für Supply/Demand-Berechnung
- Integration-Tests für Trader-Tick
- E2E: Trader startet, bewegt Waren, macht Profit
- Preise passen sich nachweisbar an
- Keine Race-Conditions in DB
- Sollen Spieler direkter mit NPC-Tradervermitteln? (z.B. Handelsgruppe beitreten)
- Können Spieler selbst als "Trader" fungieren (mit Leader-Bonusse)?
- Welche Sicherheitsmechanismen gegen Preismanipulation?
- Wie oft wird Supply/Demand neu berechnet? (Echtzeit? Alle 10min?)
- Sollen schwarze Märkte separat gehandhabt werden?
- ✅ DB-Struktur vollständig
- ✅ Supply/Demand wird aktiv berechnet
- ✅ Mindestens 3 NPC-Trader pro Sektor aktiv
- ✅ Preise reagieren nachweisbar auf Trader-Aktivitäten
- ✅ Dashboard zeigt Live-Chancen und Trader-Status
- ✅ Keine DB-Fehler oder Race-Conditions
- ✅ Performance: Trader-Tick <500ms pro 10 Trader