Status: draft v0.2 Version: 0.2 Stand: 29.03.2026
Dieses Dokument definiert ein neues Vessel/Module-System mit Blueprints.
Spielziel:
- Schiffe werden nicht mehr nur als starre Typen gebaut, sondern aus Hull + Modulen zusammengesetzt.
- Shipyards bauen nur Blueprints, die fuer Standort, Tech und Fraktion freigeschaltet sind.
- Fraktionen (Spieler- und NPC-Seite) beeinflussen verfuegbare Hulls, Module, Kosten und Bauzeit.
Nicht-Ziel (v1):
- Kein vollstaendiger Retrofit bestehender Kampfsimulation im ersten Schritt.
- Keine komplette Abschaltung des Legacy-Pfads ueber SHIP_STATS in der ersten Migration.
Bereits als Scaffold umgesetzt:
- SQL-Migrationen fuer
vessel_hulls,module_groups,modules,hull_module_compatibility,vessel_blueprints,vessel_blueprint_modules,faction_tech_affinitiessowie Hull-Energiebasisfelder (migrate_vessel_blueprints_v4.sql). - Seed-Daten fuer einen minimalen Starter-Hull und Modulgruppen in
sql/test_vessel_blueprints_seed.sql. - Runtime-Resolver in
api/game_engine.php, damit synthetische Typenbp_<id>bereits Kosten, Cargo, Speed und Kampfwerte liefern koennen. api/shipyard.phpmit additiven Actions:
action=listliefert jetzt auchblueprints.action=list_blueprintsliefert reine Blueprint-Daten.action=list_hullsliefert Hull-Katalog inkl.ship_classundslot_variation_json.action=list_modulesliefert modulgruppenweise Moduloptionen fuer ein konkretes Hull/Layout.action=create_blueprintvalidiert Hull/Module, kompiliert Snapshot-Werte und speichert einen Spieler-Blueprint.action=buildakzeptiert jetzt zusaetzlichblueprint_idund produziertships.type = bp_<id>.
-
api/fleet.phpnutzt Runtime-Resolver bereits fuer Versand, Preview und Battle-Stats. -
Shipyard-UI zeigt Hull-Klassen, Layout-Varianten und einen Slot-fuer-Slot-Editor fuer die Blueprint-Erstellung.
-
Hulls und Module koennen bereits ueber
research_req_json,build_req_json/shipyard_req_jsonund Faction-Standing gefiltert sowie serverseitig validiert werden. -
Ship-Builds laufen jetzt ueber eine echte
ship_build_queuemit ETA (queued/running/done/cancelled) statt Sofortabschluss. -
Queue-Completion ist in Fleet-Pfaden verdrahtet (Versand, Defender-Combat-Read, Preview/Matchup, Spy-Read), damit fertige Schiffe konsistent ohne vorherigen Shipyard-Refresh gezaehlt werden.
-
api/shipyard.phpliefertaction=list_vessels(individuelle Vessel pro Kolonie) undaction=decommission_vessel; Shipyard-UI zeigt "Docked Vessels"-Panel mit HP-Bar, Stat-Chips und Dekommissionieren-Button. -
scripts/recompile_blueprints.phprecompiliertcompiled_stats_json/compiled_cost_json/compiled_time_secsfuer alle oder gefilterte Blueprints CLI-sicher (PHP_SAPI-Guard in shipyard.php eingefuehrt).
Noch offen:
- Feinere UI fuer freie Slot-Reihenfolge, Modulvergleich und gespeicherte Presets. [umgesetzt: swapSlots, updateStatsPreview, Presets via localStorage, renderAffinityChips]
- Einzelvessel-Runtime (
built_vessels) statt aggregierterships-Zaehler. [umgesetzt: built_vessels-Tabelle per migrate_vessel_blueprints_v5.sql; spawn_built_vessels() in complete_ship_build_queue; list_vessels + decommission_vessel API; Docked-Vessels-Panel in Shipyard-UI] - Datengetriebene Freischaltung ueber echte Fraktions-Mappings aus
fractions/*statt nurnpc_factions.code. [umgesetzt: faction_tech_affinities per migrate_vessel_blueprints_v3.sql; Affinity-Chips im Slot-Editor; load_faction_tech_affinities_for_user in compile_shipyard_blueprint]
Der aktuelle Build-Stack basiert auf statischen Schiffstypen:
api/shipyard.php
action=listundaction=build- Bau prueft
SHIP_STATS[$type], Shipyard-Level und Ressourcen.
api/game_engine.php
const SHIP_STATSdefiniert Kosten, Cargo, Speed, Attack, Shield, Hull.ship_cost(),ship_speed(),ship_cargo()lesen direkt daraus.
- SQL-Bestand
ships(colony_id, type, count)speichert aggregierte Schiffsanzahl pro Typ.- Kein persistentes Modell fuer einzelne Blueprint-Konfigurationen.
- Fraktionsquellen
- Lore- und Designdaten liegen in
fractions/*/spec.json. - NPC-Faktionen liegen in
npc_factions,diplomacy,trade_offers.
Konsequenz:
- Hohe Einfachheit, aber keine modulare Schiffsanpassung.
- Fraktionsidentitaet ist bei Schiffen aktuell nur indirekt abgebildet.
- Vessel Hull
- Der Grundkoerper eines Schiffs (Klasse, Slot-Profil, Basiswerte).
1a. Ship Class
- Grobe Einsatzklasse eines Hulls, z. B. corvette, frigate, destroyer, cruiser, carrier, dreadnought.
- Bestimmt Balance-Erwartung, Tech-Gating, Fraktionsrollenbild und typische Slot-Spannen.
1b. Slot Layout Variation
- Ein Hull besitzt ein Basis-Slot-Profil und optionale Layout-Varianten.
- Varianten verschieben Slot-Anzahlen pro Modulgruppe, ohne den Hull selbst zu duplizieren.
- Beispiel: Corvette
default-> 2 weapon / 1 utility; Corvetteinterceptor-> 3 weapon / 0 utility.
- Module Group
- Funktionsgruppe fuer Slots, zum Beispiel:
- propulsion
- power
- weapon
- hull
- shield
- auxiliary
- command
- utility
- Module
- Konkrete Komponente innerhalb einer Gruppe (z. B. Impulse Drive Mk2).
- Blueprint
- Reproduzierbare Konfiguration aus Hull + Modulbelegung + Metadaten.
- Shipyard Capability
- Welche Hull-Tiers, Modulgruppen und Build-Features ein konkreter Shipyard bauen darf.
- Additiv statt Breaking Change.
- Blueprint soll zu stabilen Laufzeitwerten kompiliert werden (snapshot stats).
- Fraktions-/Spezies-Boni wirken datengetrieben, nicht hartcodiert pro Schiff.
- Legacy-Schiffe bleiben waehrend Migration baubar.
- vessel_hulls
- id
- code (unique)
- label
- role (scout, combat, logistics, capital, support)
- ship_class (corvette, frigate, destroyer, cruiser, carrier, capital)
- tier
- base_mass
- base_attack
- base_shield
- base_hull
- base_cargo
- base_speed
- base_energy_output
- base_energy_capacity
- base_energy_upkeep
- base_weapon_efficiency
- base_shield_efficiency
- base_attack_energy_share
- slot_profile_json
- slot_variation_json
- research_req_json
- build_req_json
- faction_tag (nullable)
- is_active
- module_groups
- id
- code (propulsion, power, weapon, hull, shield, auxiliary, ...)
- label
- max_per_hull_default
- is_required
- modules
- id
- code (unique)
- group_id
- label
- tier
- rarity
- stats_delta_json
- power_draw
- mass_delta
- build_cost_json
- build_time_secs
- research_req_json
- shipyard_req_json
- faction_tag (nullable)
- species_affinity_json (optional)
- is_active
- hull_module_compatibility
- hull_id
- group_id
- slot_count
- allowed_module_tags_json
- max_module_tier
- faction_tech_affinities
- faction_code
- module_group_code
- bonus_type (cost_pct, build_time_pct, stat_mult, unlock_tier)
- bonus_value
- vessel_blueprints
- id
- user_id (nullable fuer globale Templates)
- code (unique im user scope)
- name
- hull_id
- slot_layout_code
- doctrine_tag (raider, trader, tank, glass_cannon, ...)
- source_type (system, player, faction_reward, npc_drop)
- is_public
- version
- compiled_stats_json
- compiled_cost_json
- compiled_slot_profile_json
- compiled_time_secs
- created_at
- updated_at
- vessel_blueprint_modules
- blueprint_id
- module_id
- slot_index
- quantity
- colony_shipyard_unlocks
- colony_id
- unlock_type (hull, module_group, module, blueprint_feature)
- unlock_ref_id
- source (building_level, research, quest, faction_contract)
- unlocked_at
- ship_build_queue (neu oder Erweiterung)
- id
- colony_id
- blueprint_id (nullable fuer legacy type)
- legacy_type (nullable)
- quantity
- unit_cost_json
- unit_time_secs
- status (queued, running, done, cancelled)
- started_at
- eta
- built_vessels (optional v2)
- id
- owner_user_id
- colony_id
- blueprint_id
- snapshot_stats_json
- hp_state_json
- status (docked, assigned, destroyed)
- fleet_vessel_assignments (optional v2)
- fleet_id
- built_vessel_id
Hinweis:
v1 kann weiter aggregiert in ships zaehlen, indem fuer jeden Blueprint ein synthetischer type-Code verwendet wird (bp_<id>), bis die Fleet-Logik auf Einzelvessels umgestellt wird.
- Spieler waehlt Hull.
- UI zeigt Schiffsklasse, Basis-Slot-Profil und verfuegbare Layout-Varianten.
- Spieler waehlt ein Slot-Layout fuer den Hull.
- UI zeigt erforderliche Modulgruppen und freie Slots fuer genau dieses Layout.
- Spieler belegt Slots mit verfuegbaren Modulen.
- Backend validiert:
- Hull aktiv?
- Schiffsklasse und Hull-Tier fuer Standort/Fortschritt erlaubt?
- Slot-Layout auf dem Hull definiert?
- Modul kompatibel mit Hull?
- Slot-Anzahl des gewaehlten Layouts eingehalten?
- Required Groups belegt?
- Research + Shipyard + Fraktionsbedingungen erfuellt?
- Backend kompiliert Snapshot-Werte und speichert Blueprint.
shipyard/buildnimmtblueprint_id+count.- Validierung gegen
colony_shipyard_unlocks, Research, Ressourcen. - Kosten und Zeiten koennen durch Modifikatoren veraendert werden:
- Shipyard-Level
- Leader-Skills (
leaders) - Fraktionsstanding (
diplomacy) - Event-/Situationsmodifikatoren
- Queue-Eintrag wird erzeugt.
- Nach Abschluss:
- v1: Erhoehe
ships.type = bp_<id> - v2: Erzeuge
built_vesselsDatensaetze
Betroffene Stellen:
api/shipyard.php
listmuss legacy und blueprintfaehige Einheiten liefern.buildmusslegacy_typeundblueprint_idakzeptieren.
api/game_engine.php
SHIP_STATSbleibt als Legacy-Fallback bestehen.- Neue Resolver:
resolve_vessel_stats($typeOrBlueprint)resolve_vessel_cost(...)
api/fleet.php
- muss synthetische Blueprint-Typen in Kampfrechner/Cargo/Speed verstehen.
Anbindung an research und RESEARCH_PREREQS:
- Hulls und Module deklarieren
research_req_json. - Ein zentraler Gate-Resolver prueft die Bedingungen.
- Dadurch bleibt das System konsistent mit vorhandener Forschungsprogression.
Quellen:
fractions/*/spec.json: Lore- und Design-Authority.npc_factions,diplomacy,trade_offers: spielmechanische Beziehungen.
Vorgeschlagene Kopplung:
- Jede Fraktion/Spezies bekommt optionale Affinitaeten auf Modulgruppen.
- Standing-Schwellen schalten spezielle Module/Hulls frei (Lizenzmodell).
- Fraktionsquests koennen Blueprints als Reward geben.
- Trade-Offer koennen Module als Vertragsware enthalten (spaeter v2).
Wichtig:
- Trenne "Lore Fraktion" (fractions) von "NPC Diplomatie Fraktion" (npc_factions), aber erlaube Mapping-Tabelle
faction_code_mapfuer Gameplay-Verknuepfungen.
leaders besitzt bereits Rollen und Skillwerte.
Neue Synergien:
advisorkann Blueprint-Empfehlungen generieren (role-fit).science_directorreduziert Modul-Forschungskosten.trade_directorreduziert Importkosten seltener Module.
- GET
api/shipyard.php?action=blueprints&colony_id=
- Liefert baubare Blueprints + Verfuegbarkeit + effektive Kosten.
- POST
api/shipyard.php?action=create_blueprint
- Body:
name,hull_code,modules[].
- POST
api/shipyard.php?action=build
- Erweiterung:
- legacy:
type,count - neu:
blueprint_id,count
- legacy:
- GET
api/shipyard.php?action=modules_catalog
- Katalog gefiltert nach colony/research/faction standing.
- Optional GET
api/factions.php?action=ship_licenses&faction_id=
- Zeigt freischaltbare hull/module-Lizenzen.
- Neue Tabellen anlegen (hulls/modules/blueprints/unlocks).
- Legacy-Schiffe in Start-Blueprints spiegeln (one-time backfill).
- Shipyard Build unterstuetzt beide Pfade.
- Blueprint-UI und Modul-Katalog freischalten.
- Fraktions-Affinitaeten und Standing-Gates aktivieren.
- Erste Fraktionsspezifische Hulls/Module ausrollen.
- Fleet/Kampf auf Blueprint-Snapshots (und spaeter Einzelvessels) umstellen.
- Marketplace und Diplomatie fuer Modulhandel erweitern.
- Balancing-Telemetrie pro Modulgruppe/Blueprint einbauen.
- Harte Pflichtgruppen je Hull:
- propulsion >= 1
- power >= 1
- hull >= 1
- Soft-Caps:
- Waffenlast und Schildlast durch Power Budget begrenzen.
- Metriken fuer Monitoring:
- Build share je Blueprint
- Win/Loss delta je Modulgruppe
- Durchschnittliche Bauzeit/Kosten pro Tier
- Anti-Meta-Monokultur:
- diminishing returns auf gleiche Modulstapel
- Fraktions-/Doctrinetradeoffs statt linearer Best-in-Slot-Kette
- Komplexitaetssprung in UI und Datenmodell.
- Legacy/Blueprint-Doppelpfad erzeugt temporaer mehr Wartung.
- Fractions-Daten sind teils lore-lastig; fuer Balancing braucht es zusaetzliche numerische Felder.
Gegenmassnahmen:
- Feature-Flags pro API-Endpunkt.
- Schrittweise Aktivierung pro Fraktion und Hull-Tier.
- Balancing-Daten in dedizierten Tabellen statt in Freitext-Lore.
- Soll v1 weiterhin nur aggregierte Schiffszaehlung nutzen (
ships) oder direktbuilt_vesselseinfuehren? - Wie strikt ist die Trennung zwischen spielbaren Spezies (fractions) und NPC-Faction-Meta?
- Sollen Module handelbar als Item werden oder nur via Unlock/Lizenz?
- Wird Refit (Umbau bestehender Schiffe) in v1 benoetigt?
- Ein Blueprint kann mit Hull + mindestens 3 Modulgruppen gespeichert werden.
- Shipyard kann Blueprint bauen, wenn Ressourcen und Anforderungen passen.
- Fraktionsstanding beeinflusst mindestens einen Unlock-Pfad.
- Legacy-Schiffsbau funktioniert unveraendert weiter.
- Telemetrie erfasst Blueprint-Bauten und Bauabbrueche.
Dieses Kapitel definiert ein kampffaehiges Regelwerk fuer modulare Schiffe inkl. Boni/Mali aus Fraktion, Spezies, Commander/Leader und zufallsgetriebener Varianz.
- Lesbare Kausalitaet: Spieler soll verstehen, warum ein Kampf gewonnen/verloren wurde.
- Build-Relevanz: Blueprint-Entscheidungen muessen den Ausgang dominant beeinflussen.
- Kontrollierte Varianz: Zufall erzeugt Spannung, aber keine totale Willkuer.
- Erweiterbarkeit: Neue Module/Faktionen duerfen das Kernsystem nicht brechen.
Vorschlag fuer v1:
- Kampf wird in diskreten Combat Rounds simuliert (z. B. 6-12 Runden max).
- Jede Runde hat Phasen:
- Initiative/Targeting
- Energiehaushalt und Allokation (Waffen, Schilde, Utility)
- Angriffswurf und Treffer
- Schaden nach Resistenz/Schilde/Huelle
- Morale/Retreat-Check
Grundidee:
- Alpha-Strike wird begrenzt (Schadensdeckel pro Runde).
- Schilde regenerieren nur zwischen Kaempfen oder stark reduziert pro Runde.
- Rueckzug ist strategisch moeglich, aber mit Verlust-/Interception-Risiko.
Pro Vessel-Snapshot (aus Blueprint kompiliert):
- offense_profile_json
- kinetic, energy, explosive, electronic_warfare
- defense_profile_json
- shield_capacity, armor_rating, evasion, point_defense
- utility_profile_json
- sensor_lock, jam_resist, repair_rate, command_link
- damage_profile_json
- crit_chance_base, crit_mult_base, accuracy_base
Pro Kampfteilnehmer (Flotte):
- doctrine_mode (aggressive, balanced, defensive, hit_and_run)
- commander_context (skills, traits, temporary states)
- faction_context (standing bonuses, treaty auras)
- energy_context
- reactor_output
- capacitor_capacity
- weapon_efficiency
- shield_efficiency
- baseline_upkeep
- energy_priority_json (weapon/shield/utility)
Feste Reihenfolge verhindert Exploit-Stacking:
- Basiswerte aus Hull + Modulen
- Forschung/Technologie
- Fraktion/Spezies-Affinitaet
- Commander-/Leader-Skills
- Situative Effekte (Terrain, Event, Versorgung, Moral)
- Zufallsereignisse pro Runde
Regel: Additive Werte zuerst, multiplikative danach, dann Caps.
- Flat:
+X(z. B. +15 Shield) - Percent Add:
+Y%auf Basiswert - Percent Mult:
*Z(z. B. 1.12) - Clamp/Cap: min/max Grenzen
- Conditional: nur bei Bedingungen (z. B. shield < 30%)
- Fractions / NPC Fraktionen
- Standing-Baender aktivieren Combat Auras:
- +5 bis +15% auf definierte Modulgruppen
- oder Resistenz gegen Fraktionstypen
- Race / Spezies
- Kleine, klare Signaturboni statt Vollasymmetrie.
- Beispiel:
- Aereth: +energy precision, -kinetic armor
- Vor'Tak: +hull integrity, -sensor lock
- Commander / Leader
fleet_commander: initiative, retreat control, crit timingscience_director: module overclock windowsadvisor: pre-battle scouting und Counterfit-Hinweise
- Situation/Logistik
- Treibstoffmangel, Reparaturstatus, intel quality, morale.
Zufall soll kontrolliert und reproduzierbar sein.
- Deterministischer Seed pro Kampf:
seed = hash(battle_id + attacker_id + defender_id + timestamp_bucket)
- Pro Runde/Phase eigener Subseed fuer Debug-Replay.
- Kampfreports speichern Seed + Hauptwuerfe fuer Nachvollziehbarkeit.
Trefferwurf mit 2W6-Charakteristik (Glockenkurve statt flachem W20):
-
Attack Score: $$ A = accuracy + commander_aim + sensor_lock - target_evasion $$
-
Roll: $$ R = 2d6 + A $$
-
Hit-Schwelle: $$ R \ge T $$
Vorteil von
- weniger extreme Ausreisser als bei
$1d20$ - Build- und Skillvorteile bleiben konsistenter spuerbar
- Crit-Window klein halten (z. B. 5-12% nach Modifikatoren, hard cap 25%).
- Fumble nur fuer bestimmte Waffentypen oder Jam-Effekte.
- Schadensstreuung begrenzen, z. B. Basis * [0.9 .. 1.1].
Ziel: Zufall sorgt fuer Spannung, aber nicht fuer komplette Entwertung guter Builds.
Relevante Muster:
- Waffen-gegen-Defense-Counter (Shield/Armor/Hull)
- Tracking vs Evasion als zentrale Trefferlogik
- Flottenkomposition wichtiger als Einzel-Superunit
Transfer nach GalaxyQuest:
- Modulgruppen als Counter-Matrix modellieren.
- Evasion und Targeting getrennt behandeln.
Relevante Muster:
- Taktik-/Battle-Postures vor Kampfstart
- Rollenorientierte Loadouts mit klaren Tradeoffs
Transfer:
- doctrine_mode pro Flotte als leichte Taktikebene vor jeder Schlacht.
Relevante Muster:
- Starkes Ship-Design mit Slot-/Tonnage-Entscheidungen
- Forschung + Hull-Upgrade als Progressionskern
Transfer:
- Blueprint-Editor mit klaren Slot-Grenzen und Tier-Gates.
Relevante Muster:
- Schnelle serverseitige Batch-Simulation
- Einheitentypen mit klarer Kosten/Nutzen-Struktur
Transfer:
- Legacy-Kompatibilitaet beibehalten, Combat-Engine aber auf Blueprint-Snapshots erweitern.
- Scope
- Nur 3 Modulgruppen kampfrelevant aktivieren: weapon, shield, propulsion.
- Nur 4 Schadenskanalwerte: kinetic, energy, explosive, ew.
- Regeln
- 6 feste Runden, kein Mid-Battle Reinforcement.
- Treffer: 2d6-Modell mit Accuracy/Evasion.
- Schaden: channel vs resistance + kleine Streuung.
- Energie: pro Runde harter Energiepool mit Allokation auf Waffen/Schilde.
- Boni
- Eine Spezies-Affinitaet, ein Fraktionsstanding-Bonus, ein Commander-Skill aktiv.
- Output
- Erweiterter
battle_report_jsonmit Modifier-Breakdown und Dice-Log.
- Erfolgskriterium
- Spieler kann im Report mindestens 80% des Outcomes auf konkrete Faktoren zurueckfuehren.
- RNG-Budget pro Kampf begrenzen (z. B. max 15-20% Outcome-Impact).
- Keine doppelten Multiplikatoren ohne Cap.
- Hard Caps fuer Crit, Evasion, Damage Reduction.
- Matchmaking/Threat-Scoring soll extreme Outlier vermeiden.
- Telemetrie: Winrate je Blueprint-Cluster, nicht nur je Schiffstyp.
- Echtzeit-Resolver oder strikt rundenbasiert serverseitig?
- Vollstaendiges Dice-Log fuer alle Schuesse oder aggregiertes Log pro Runde?
- Rueckzug deterministisch nach Schwellwert oder mit Wurf?
- Friendly Fire/Overkill als taktischer Faktor ja/nein?
Um den ersten Implementierungsschnitt schnell und testbar zu halten, wird fuer v1 festgelegt:
- Resolver: strikt rundenbasiert und serverseitig.
- Log-Tiefe: aggregiertes Dice-Log pro Runde (nicht pro Projektil).
- Rueckzug: Schwellwert + Wurf (teilkontrolliert).
- Friendly Fire: nein in v1.
Alle Waffen und Schutzmassnahmen verbrauchen Energie beim Gebrauch. Damit sind Schussfrequenz, Schildabsorptionsleistung und effektive Defensivleistung direkt an Energiequelle + Systemeffizienz gekoppelt.
Begriffe pro Runde:
E_gen: erzeugte Energie aus Reaktor und Boni.E_store: verfuegbare Pufferenergie aus Kondensator.E_upkeep: Grundverbrauch (Sensorik, Triebwerk, EW, Debuffs).E_avail: frei verteilbare Energie.
Formeln: $$ E_{avail} = clamp(E_{gen} + E_{store} - E_{upkeep}, 0, E_{max}) $$
Allokation je Seite: $$ E_{weapon} + E_{shield} + E_{utility} \le E_{avail} $$
Effizienz:
eta_weaponskaliert nutzbare Waffenenergie.eta_shieldskaliert nutzbare Schildenergie.- Beide entstehen aus Power-Modulen, Forschungsboni, Leadern, Statusdebuffs.
clamp(x, min, max)begrenzt einen Wert.roll_2d6()liefert 2..12.rng(seed, key)liefert deterministische Zufallszahl in [0,1).
Fuer jede Seite: $$ I = base_initiative + commander_initiative + doctrine_initiative + roll_2d6() $$
Bei Gleichstand:
- Hoehere Sensor-Qualitaet gewinnt.
- Danach Seed-basierter Coinflip.
Angriffswert: $$ A = accuracy + tracking + commander_aim + sensor_lock $$
Verteidigungswert: $$ D = evasion + jam + terrain_penalty_to_attacker $$
Treffercheck: $$ H = roll_2d6() + (A - D) $$
Hit wenn: $$ H \ge 8 $$
Zusatzregel:
- Natuerliche 2 = auto miss.
- Natuerliche 12 = auto hit.
Krit-Chance: $$ P_{crit} = clamp(crit_base + crit_mods - anti_crit_target, 0.05, 0.25) $$
Krit-Multiplikator: $$ M_{crit} = clamp(crit_mult_base + crit_mult_mods, 1.25, 2.00) $$
Fuer jeden Schadenskanal
Streuung: $$ spread_c = 0.90 + 0.20 \cdot rng(seed, round|attacker|target|c) $$
Waffe i mit energy_per_shot_i und nomineller Schusszahl rof_i:
$$
shots_i = min\left(rof_i,\left\lfloor \frac{E_{weapon} \cdot eta_{weapon}}{energy_per_shot_i} \right\rfloor\right)
$$
Wenn E_weapon sinkt, sinken direkte Schuesse/Tick.
Damit wird die Energiequelle zum harten DPS-Limiter.
Effektive Resistenz pro Kanal: $$ R_c = clamp(resist_c - penetration_c, 0.00, 0.80) $$
Effektiver Kanalschaden: $$ eff_c = rolled_c \cdot (1 - R_c) $$
Gesamtschaden vor Crit: $$ DMG = \sum_c eff_c $$
Bei Crit: $$ DMG = DMG \cdot M_{crit} $$
Festlegung fuer v1-Kanalmapping:
- Energiewaffen -> Kanal
energy - Projektilwaffen -> Kanal
kinetic
Wirkung auf Verteidigungsschichten:
- Energiewaffen
- Schilde absorbieren gut.
- Gegen Panzerung/Huelle verheerend.
- Projektilwaffen
- Gegen Panzerung/Huelle sehr effektiv.
- Von Schilden nur schwer abzuwehren.
Verbindliche Multiplikatoren in v1:
- Layer-Damage-Multiplikator
M_layer(c, layer)
energy: shield0.75, armor1.35, hull1.15kinetic: shield1.10, armor1.30, hull1.20
- Schild-Abwehr-Effizienz je Kanal
M_absorb(c)
energy:1.30kinetic:0.75
Interpretation:
- Gegen
energysind Schilde besonders effizient (M_absorb > 1), dadurch mehr Absorption und weniger Leakage. - Gegen
kineticsind Schilde ineffizient (M_absorb < 1), dadurch mehr Restschaden auf Armor/Hull.
- Schaden geht zuerst in Shield.
- Rest in Armor/Hull nach Kanalgewichtung.
- Overflow auf naechste Schicht.
Schild-Absorptionsgrenze pro Runde: $$ AbsorbCap_c = E_{shield} \cdot eta_{shield} \cdot shield_absorb_rate \cdot M_{absorb}(c) $$
Tatsaechliche Schildabsorption: $$ Absorb_c = min(ShieldHP, DMG_{in,c}, AbsorbCap_c) $$
Leakage: $$ Leak_c = DMG_{in,c} - Absorb_c $$
Schichtschaden: $$ DMG_{layer,c} = Leak_c \cdot M_{layer}(c, layer) $$
Vereinfachung v1:
- Armor als Damage-Reduction-Layer, Hull als finale HP.
Rueckzugsversuch erlaubt, wenn mindestens eine Bedingung gilt:
- Eigene Hull-Integrity <= 35%
- Eigene effektive Feuerkraft <= 50% vom Gegner
Erfolgschance: $$ P_{retreat} = clamp(0.35 + nav_adv + commander_retreat - enemy_intercept, 0.10, 0.90) $$
Wurf mit rng(...); bei Fehlschlag kaempft die Flotte weiter.
- Evasion hard cap: 65%
- Damage reduction (gesamt) hard cap: 80%
- Crit chance hard cap: 25%
- Crit multiplier hard cap: 2.0
- Initiative bonus cap aus Leader+Doctrine: +6
- Genauigkeit floor: mindestens 10% Resttrefferchance nach allen Modifikatoren
eta_weaponcap: [0.60 .. 1.40]eta_shieldcap: [0.60 .. 1.40]- Maximal in Schilde allokierbare Energie pro Runde: 70% von
E_avail
Ziel: Keine unverwundbaren Builds und keine One-Shot-Metadominanz.
Jeder Modifier folgt einem einheitlichen Vertrag:
{
"key": "combat.accuracy.add_pct",
"scope": "fleet",
"source_type": "leader",
"source_ref": "fleet_commander:skill_tactics",
"operation": "add_pct",
"value": 0.08,
"condition": {
"phase": "opening",
"channel": "energy"
},
"priority": 40
}- Accuracy/Hit
combat.accuracy.add_flatcombat.accuracy.add_pctcombat.tracking.add_flatcombat.target_evasion.add_flat
- Damage
combat.damage.kinetic.add_pctcombat.damage.energy.add_pctcombat.damage.explosive.add_pctcombat.damage.all.mult
- Defense
combat.resist.kinetic.add_pctcombat.resist.energy.add_pctcombat.resist.explosive.add_pctcombat.shield.capacity.add_pctcombat.hull.integrity.add_pct
- Crit
combat.crit.chance.add_flatcombat.crit.mult.add_flatcombat.anti_crit.add_flat
- Control
combat.initiative.add_flatcombat.retreat.chance.add_flatcombat.intercept.add_flat
- Energy Economy
combat.energy.generation.add_flatcombat.energy.generation.add_pctcombat.energy.storage.add_flatcombat.energy.upkeep.add_flatcombat.energy.weapon_efficiency.add_pctcombat.energy.shield_efficiency.add_pctcombat.energy.shield_allocation_cap.add_pct
- Gleicher Key + gleiche Quelle stackt nicht doppelt.
- Additive Aggregation vor Multiplikation.
- Caps immer nach kompletter Aggregation anwenden.
{
"battle_id": 123456,
"version": 1,
"seed": "a8b7f4...",
"attacker": {
"user_id": 10,
"fleet_id": 345,
"blueprint_mix": [
{ "blueprint_id": 1001, "count": 24 }
]
},
"defender": {
"user_id": 22,
"fleet_id": 901,
"blueprint_mix": [
{ "blueprint_id": 2010, "count": 18 }
]
},
"pre_battle": {
"modifier_summary": {
"attacker": [
{ "key": "combat.damage.energy.add_pct", "value": 0.1, "source": "faction:helion_confederation" }
],
"defender": [
{ "key": "combat.hull.integrity.add_pct", "value": 0.12, "source": "race:vor_tak" }
]
},
"power_rating": {
"attacker": 1820,
"defender": 1755
}
},
"rounds": [
{
"round": 1,
"initiative_winner": "attacker",
"dice": {
"attacker_hit_roll_avg": 8.7,
"defender_hit_roll_avg": 7.9,
"crit_events": 2
},
"damage": {
"attacker_to_defender": {
"shield": 420,
"hull": 115,
"by_channel": { "kinetic": 180, "energy": 290, "explosive": 65, "ew": 0 }
},
"defender_to_attacker": {
"shield": 350,
"hull": 90,
"by_channel": { "kinetic": 210, "energy": 140, "explosive": 90, "ew": 0 }
}
},
"state_after": {
"attacker_hull_pct": 93.4,
"defender_hull_pct": 89.1
}
}
],
"result": {
"winner": "attacker",
"retreat": { "attempted": true, "successful": false },
"losses": {
"attacker": [
{ "blueprint_id": 1001, "destroyed": 3 }
],
"defender": [
{ "blueprint_id": 2010, "destroyed": 7 }
]
}
},
"explainability": {
"top_factors": [
{ "factor": "energy_damage_bonus", "impact_pct": 22.5 },
{ "factor": "commander_initiative", "impact_pct": 14.2 },
{ "factor": "dice_variance", "impact_pct": 11.1 }
]
}
}top_factors muss die groessten Outcome-Treiber ausweisen.
dice_variance wird explizit als Faktor gezeigt, damit Zufall sichtbar aber quantifiziert bleibt.
- POST
api/fleet.php?action=simulate_battle
- Input: attacker_fleet_id, defender_fleet_id, context flags.
- Output: battle_id + kompakter Report.
- GET
api/reports.php?action=battle_detail&id=
- Liefert volles
battle_report_jsoninkl. round breakdown.
- POST
api/fleet.php?action=resolve_battle
- Persistiert Ergebnis (Verluste, Loot, XP, Diplomatieeffekte).
Idempotenz:
resolve_battleakzeptiert einenresolution_token.- Doppeltes Resolve fuer denselben Kampf wird geblockt.
- Deterministische Unit Tests mit fixem Seed fuer Kernformeln.
- Monte-Carlo-Suite (z. B. 10k Simulationen je Matchup) fuer Winrate-Drift.
- Guardrails:
- Kein Matchup mit >70% Winrate ueber gleiches Power-Band ohne klaren Counter.
- RNG-Anteil am Outcome median <= 20%.
- Telemetriefelder pro Kampf:
- blueprint_cluster_attacker/defender
- modifier_total_attack/defense
- dice_variance_index
- outcome_delta_vs_power_rating
- Fixture erzeugen:
php scripts/seed_combat_probe_fixture.php
- Einzel-/Batch-Probe gegen konkrete Ziele:
php scripts/combat_batch_probe.php --fleet=<id> --target=<id> --iterations=200 --seed=probe_v1php scripts/combat_batch_probe.php --fleet=<id> --targets=<id,id,id> --iterations=500 --seed=scan_v1
- API-Scan fuer UI/Automation:
POST api/fleet.php?action=matchup_scan- Body:
attacker_fleet_id, optionaltarget_colony_ids[],iterations,deterministic_seed
- Fixture bereinigen:
php scripts/cleanup_combat_probe_fixture.php- optional:
php scripts/cleanup_combat_probe_fixture.php --remove-test-mod-links=1