Skip to content

KI verteidigt weder ihre Harvester noch den Sammelplatz — ein Panzer erntet risikolos ab #101

Description

@cubetribe

Aus der Spielabnahme vom 2026-08-18 (Arbeitsstand e650864, macOS Editor). Befund des Projektinhabers beim Spielen, nicht aus einem Testbericht.

@arn-c0de — das betrifft den Einheitenstrang. Scripts/AI/ und Scripts/AI.Data/ liegen in deiner Schreibhoheit (13-15_Parallelbetrieb.md, Tabelle „Schreibhoheit"), deshalb ein Issue statt eines PR von uns.

Beobachtung

Beim Spielen gegen die Skirmish-KI:

  1. Der Sammelplatz ist ein Freifahrtschein. Ich fahre mit einem einzelnen Panzer zum Aetheriumfeld der KI und erschieße dort Einheit um Einheit. Es standen KI-Einheiten in der Nähe — zurückgeschossen hat niemand, nachgerückt ist auch niemand.
  2. Der Harvester wird nicht bewacht. Er erntet unter Beschuss weiter, bis er stirbt. Kein Begleitschutz, keine Reaktion, kein Rückzug.

Spielerisch ist das der billigste Sieg im Spiel: die KI verliert ihre Wirtschaft und beliebig viele Einheiten, ohne dass ein einziger Schuss zurückkommt. Der Harvester ist die teuerste und wichtigste Nicht-Kampfeinheit — dass er unbewacht ist, hebelt die gesamte Verknappungsmechanik aus #80/D-102 aus.

Warum das so ist — der Code beantwortet beides

1. Die Verteidigungsregel kennt nur das HQ

DefendHome (r8, PR #96) ist die einzige Regel, die eine KI-Einheit von der Wellensammlung abzieht. Ihr Auslöser ist ausschließlich ein Radius um die HQ-Zelle:

// Assets/_Project/Scripts/AI/SkirmishAiSystem.cs:974
private bool IsHomeThreatened(int hqCellX, int hqCellY, List<long> threatCells)
{
    int radius = _profile.Profile.DefendHomeCells;   // 10 (ms1-canonical)
    ...
    if (Math.Abs(hqCellX - threatX) <= radius && Math.Abs(hqCellY - threatY) <= radius) return true;

Der Docstring derselben Methode sagt es wörtlich und war damals bewusst so entschieden:

Around the headquarters, not around any building: the entity scan has that cell in hand, the observed and measured case is the one at the headquarters […] If the measurement later shows attacks on the refinery going through the same way, that arrives as its own number."

Das ist die Messung. Ein Angriff am Aetheriumfeld — bei der kanonischen Kartenlage weit außerhalb von 10 Zellen um das HQ — hebt HomeThreatened nie, also fällt in ResolveGoal nie DefendHome, und jede wartende Einheit bleibt bei Hold am Sammelpunkt stehen. Es gibt in GoalKind schlicht kein Ziel, das „mein Harvester wird beschossen" heißt.

2. Der Harvester selbst hat keine Reaktion

Die KI behandelt Harvester ausschließlich als Wirtschaftsobjekt: untätige Harvester bekommen ein HarvestPayload auf das nächste nicht erschöpfte Feld (SkirmishAiSystem.cs:306 und :447). „Wird beschossen" kommt in diesem Pfad nicht vor — es gibt weder Flucht noch Feldwechsel noch einen Hilferuf.

3. Warum auch die Nebenstehenden schweigen

Die Auto-Zielerfassung aus D-087 wäre der eine Mechanismus, der ohne KI-Regel zurückschießt — sie greift aber nur unter zwei Bedingungen:

// Assets/_Project/Scripts/Simulation/Combat/CombatSystem.cs:191
if (!attacker.IsActive || attacker.AttackTarget.IsValid || _construction.IsActiveSite(attacker.Id)) continue;
...
// :206
if (!IsInRange(in attacker, in candidate, weapon.AttackRange)) continue;

Also: nur ohne gültigen Angriffsbefehl und nur innerhalb der eigenen Waffenreichweite. Beides passt zum Beobachteten — eine Einheit ein paar Zellen neben dem Feld ist außer Reichweite, und nichts in der KI bringt sie näher heran; eine Einheit mit stehendem Auftrag aus einer früheren Welle wird gar nicht erst umgelenkt. Welcher der beiden Fälle es im konkreten Lauf war, sollte einmal am Lab/DebugHud nachgesehen werden, bevor die Regel gebaut wird — davon hängt ab, ob es eine reine Zielregel braucht oder auch eine Bewegung.

Was wir uns wünschen (Ausgestaltung liegt bei dir)

Kein fertiger Entwurf, sondern die Wirkung, die im Spiel fehlt:

  1. Ein Angriff auf einen eigenen Harvester löst eine Reaktion aus. Nicht „immer bewachen" — ein dauerhaft abgestellter Begleitschutz ist eine Balancing-Entscheidung, die niemand getroffen hat. Aber wenn geschossen wird, muss etwas passieren.
  2. Der Sammelplatz ist verteidigt, wenn dort gekämpft wird — im Zweifel über dieselbe Mechanik, die DefendHome schon hat, nur mit einem zweiten Ankerpunkt (Feld/Raffinerie) statt nur dem HQ.
  3. Der Harvester ist unter Beschuss nicht wehrlos-dumm — Ausweichen, Feldwechsel oder Rückzug zur Raffinerie sind alle akzeptabel; „weiterernten bis tot" ist es nicht.

Was dabei zu beachten ist (aus dem Bestand, nicht als Vorgabe)

  • GoalKind-Werte werden angehängt, nie umnummeriert. Der Enum-Docstring begründet das ausführlich: die Zahl steht als blanke Ganzzahl in goals.ndjson, Umnummerieren würde jeden aufgezeichneten Lauf still umetikettieren.
  • Die Prioritätsreihenfolge ist die Testreihenfolge in ResolveGoal, nicht der Zahlenwert. Wo eine neue Regel zwischen Retreat, DefendHome und Attack einsortiert wird, ist die eigentliche Design-Entscheidung.
  • DefendBase ist an genau dieser Stelle schon einmal gescheitert (Verhaltensjournal V002): ein bewegliches Ziel erzeugte jeden Entscheidungstakt einen frischen Befehl für jede Einheit, +23 % Intents und ein schlechteres Match. Der Harvester bewegt sich — das ist die Falle dieses Issues. Das Feld bzw. die Raffinerie steht still und ist der naheliegende statische Anker.
  • Kein neuer CommandKind. Das Register ist eingefroren (13-15_Parallelbetrieb.md); ein „Bewachen"-Befehl im Spielersinn ist „Bewachen"-Befehl für Eskorten — Folge der langen Harvester-Wege #90 und braucht erst eine Registerentscheidung. Für die KI genügen bestehende Move-/Attack-Payloads.
  • Ein Regelschalter gehört ins Profil, so wie DefendHomeCells es vorgemacht hat — AiProfile.ProfileHash bewegt sich damit ohnehin.
  • Das bewegt den Ausgangspin. CanonicalAiOutcomeTests (Netzstrang, D-101) hält Entscheidungstick und Endzustand der kanonischen KI-Partie; SkirmishAiTests.AiBehaviorId_TracksWhichAiThisIs gehört dir. Neue Baseline bitte ansagen, damit das Merge-Fenster mit dem Netzstrang abgestimmt ist.

Abnahmekriterium

Ein einzelner Panzer am Aetheriumfeld der KI darf dort nicht mehr risikolos abernten: er bekommt Feuer, oder das Ziel weicht aus. Nachweisbar am Lab-Lauf (Verluste beider Seiten am Feld) und in einer gespielten Runde.

Zusammenhänge

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requestsimulationSimulationskern, Determinismus, Netzcode

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions