Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 0 additions & 33 deletions Assets/Tests/EditMode/Data/MapDefinitionTests.cs

This file was deleted.

2 changes: 0 additions & 2 deletions Assets/Tests/EditMode/Data/MapDefinitionTests.cs.meta

This file was deleted.

8 changes: 0 additions & 8 deletions Assets/_Project/Data/Maps.meta

This file was deleted.

37 changes: 0 additions & 37 deletions Assets/_Project/Data/Maps/MAP_Glutrinne.asset

This file was deleted.

8 changes: 0 additions & 8 deletions Assets/_Project/Data/Maps/MAP_Glutrinne.asset.meta

This file was deleted.

41 changes: 0 additions & 41 deletions Assets/_Project/Editor/BootstrapSceneGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UIElements;
using Nova.Data;
using Nova.Gameplay.Audio;
using Nova.Gameplay.CombatFeedback;
using Nova.Gameplay.Match;
Expand Down Expand Up @@ -71,7 +70,6 @@ public static void CreateBootstrapScene()
GameObject ui = CreateUiObject(runner, camera);
CreateMainMenuObject(runner, camera, ui, audio.MusicGroup);
CreateVersionBadgeObject();
EnsureGlutrinneMapAsset();

// The drop-in registry is rebuilt from whatever PF_* prefabs
// currently exist under Assets/_Project/Art (usually zero — the
Expand Down Expand Up @@ -267,45 +265,6 @@ private static void CreateMapObject(MatchRunner runner, GameObject ground)
WireReference(blockout, "_groundRenderer", ground.GetComponent<Renderer>());
}

/// <summary>
/// The data-layer map asset. It records exactly the graybox-accurate
/// subset of the Glutrinne manifest layout — the two spawn points and
/// the five aetherium fields the canonical match registers since
/// Sprint 16.7. Primary-route dressing remains G4 scope
/// (docs/production/ScopeLedger.md) and is deliberately not invented here.
/// </summary>
private static void EnsureGlutrinneMapAsset()
{
const string mapPath = "Assets/_Project/Data/Maps/MAP_Glutrinne.asset";

MapDefinitionSO map = AssetDatabase.LoadAssetAtPath<MapDefinitionSO>(mapPath);
if (map == null)
{
ArtAssetAutoSync.EnsureFolder("Assets/_Project/Data/Maps");
map = ScriptableObject.CreateInstance<MapDefinitionSO>();
AssetDatabase.CreateAsset(map, mapPath);
}

// Both lists are READ from MatchBootstrap, never restated here.
// They used to be literals, and they went stale: this baked the
// five-field layout with a comment claiming it was what
// MatchBootstrap registers, straight through the map changes of
// sprint 21 that took it to fifteen. Nobody caught it because
// MapDefinitionSO has no runtime consumer — which makes a wrong
// value cheap today and expensive on the day someone reads it.
Vector2Int[] hqCentres = MatchBootstrap.CanonicalHqCentreCells;
Vector2Int[] fieldCells = MatchBootstrap.CanonicalFieldCells;

map.Initialize(
"Glutrinne",
MapBiomeType.Desert,
128,
128,
System.Array.ConvertAll(hqCentres, c => new Vector2(c.x, c.y)),
System.Array.ConvertAll(fieldCells, c => new Vector2(c.x, c.y)));
EditorUtility.SetDirty(map);
}

/// <summary>
/// Input sampling, the world-space HUD markers (selection, rally
/// flags, placement ghost), the build bar, the command card, the
Expand Down
8 changes: 0 additions & 8 deletions Assets/_Project/Scripts/Data/Maps.meta

This file was deleted.

12 changes: 0 additions & 12 deletions Assets/_Project/Scripts/Data/Maps/MapBiomeType.cs

This file was deleted.

2 changes: 0 additions & 2 deletions Assets/_Project/Scripts/Data/Maps/MapBiomeType.cs.meta

This file was deleted.

55 changes: 0 additions & 55 deletions Assets/_Project/Scripts/Data/Maps/MapDefinitionSO.cs

This file was deleted.

2 changes: 0 additions & 2 deletions Assets/_Project/Scripts/Data/Maps/MapDefinitionSO.cs.meta

This file was deleted.

26 changes: 3 additions & 23 deletions Assets/_Project/Scripts/Gameplay/Match/MatchBootstrap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -322,15 +322,9 @@ public bool TryGetFieldInitialReserve(ushort fieldId, out long reserveAE)

/// <summary>
/// The same list as <see cref="AllFieldCells"/>, readable WITHOUT a
/// live component. Editor tooling that bakes the canonical map reads
/// the layout from here instead of restating it: the field table
/// already stands in five places by necessity (Unity host, headless
/// scenario, three test mirrors — risk R-1 of sprint 21), and a sixth
/// copy in BootstrapSceneGenerator drifted silently through two map
/// changes before anyone noticed. Its comment still claimed "the five
/// fields MatchBootstrap registers" when there were fifteen. A copy
/// nobody reads is not harmless; it is a wrong answer waiting for its
/// first reader.
/// live component, so tooling can read the canonical layout instead of
/// restating it. (The map data asset that used to read it was removed
/// in #127, D-123.)
/// </summary>
public static Vector2Int[] CanonicalFieldCells
{
Expand All @@ -345,20 +339,6 @@ public static Vector2Int[] CanonicalFieldCells
}
}

/// <summary>
/// The two HQ footprint CENTRES in slot order (local, enemy), derived
/// from the same slot layouts the match spawns from — so the D-107
/// point mirror p -&gt; 124 - p holds by construction rather than by
/// a second hand-kept pair of literals. Same purpose as
/// <see cref="CanonicalFieldCells"/>: editor tooling reads, it does
/// not restate.
/// </summary>
public static Vector2Int[] CanonicalHqCentreCells => new[]
{
new Vector2Int(LocalLayout.HqOriginX + 1, LocalLayout.HqOriginY + 1),
new Vector2Int(EnemyLayout.HqOriginX + 1, EnemyLayout.HqOriginY + 1),
};

/// <summary>Lower-left footprint origin of the human HQ (4, 4).</summary>
public Vector2Int LocalHqOrigin => new Vector2Int(LocalPlayerLayout.HqOriginX, LocalPlayerLayout.HqOriginY);

Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ die Versionierung folgt (in der aktuellen Doku-Phase) dem Dokumentationsstand de
> erzeugt; MS-0 und MS-1 bleiben offen.

### Entschieden
- **D-123 (Entwurf): `MapDefinitionSO` abgeschafft.** Typ, `MapBiomeType`, `MAP_Glutrinne.asset`, der zugehörige EditMode-Test, der Generator-Abschnitt und `MatchBootstrap.CanonicalHqCentreCells` entfallen; das Asset hatte keinen Laufzeitleser (#127).
- **D-108 berichtigt und neu gefasst: jedes eigene Gebäude wird Bauanker.** Die
Erstfassung vom 2026-08-17 behauptete, der Code lasse *jedes* Gebäude als Anker
gelten, und wollte diesen Zustand nur aussprechen. Das war falsch:
Expand Down
50 changes: 50 additions & 0 deletions docs/production/DecisionLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -3662,6 +3662,56 @@ berührt.
Ansturm-Gegner ab. Wer ohne Menü startet (AutoStart, Harness), spielt diesen,
nicht r8.

### D-123 | Entwurf | MapDefinitionSO wird abgeschafft (statt einen Konsumenten zu bekommen)

**Status:** Entwurf aus dem Issue-Lauf vom 2026-10-17 (#127); verbindlich mit dem
Merge des PR.

**Kontext:** `MapDefinitionSO` (Typ, `MapBiomeType`, Asset `MAP_Glutrinne.asset`)
wurde nur von `BootstrapSceneGenerator` beschrieben und von einem eigenen
EditMode-Test geprüft; kein Laufzeitcode las es. Genau deshalb blieb sein Inhalt
seit Sprint 21 falsch (fünf statt fünfzehn Felder), bis #125 den Generator auf
`MatchBootstrap.CanonicalFieldCells` umstellte. Die Gegenprobe über die GUIDs
findet in Szenen, Prefabs und Assets keinen weiteren Verweis. Die Karte lebt
tatsächlich in `MatchBootstrap.FieldLayouts`, den HQ-Slots, `MatchConfig` und
dem C#-Prädikat `GlutrinneTerrainMap`. Die Headless-Lane kompiliert `Nova.Data`
nicht und kann ein ScriptableObject nie lesen. Weitere Karten sind Post-MVP und
erst nach G5 mit eigener D-ID geplant (D-056).

**Alternativen:**

1. **Konsument geben:** `MatchBootstrap` liest die Lage aus dem Asset. Das Asset
hat nur `Vector2`-Listen für Spawns und Ressourcenknoten, keine Reserven,
kein Terrain, keine Feld-IDs, und die Sim kennt nur ganzzahlige Zellen. Die
Headless-Lane könnte es nicht lesen, es bliebe also eine zweite Wahrheit
neben der Sim. Ohne zweite Karte kauft das nichts.
2. **Behalten, wie es ist:** ein gepflegtes Artefakt ohne Zweck; jede
Kartenänderung müsste es mitziehen, ohne dass jemand sagen kann, wofür.
3. **Abschaffen:** Typ, Enum, Asset, Test und Generator-Abschnitt entfallen, die
kanonische Lage steht nur dort, wo sie gebraucht wird.

**Entscheidung:** Alternative 3. `MapDefinitionSO`, `MapBiomeType`,
`MAP_Glutrinne.asset`, `MapDefinitionTests` und `EnsureGlutrinneMapAsset` werden
samt `.meta`-Dateien entfernt, ebenso `MatchBootstrap.CanonicalHqCentreCells`
(einziger Leser war der Generator). `CanonicalFieldCells` bleibt, weil
`AllFieldCells` darauf beruht. Eine Wiedereinführung ist nur als engine-freie
Kartendefinition (lesbar auch von der Headless-Lane) nach G5 mit eigener D-ID
zulässig.

**Begründung:** Ohne Leser ist ein Datenartefakt nur Pflegelast und eine
Fehlerquelle. Vor der Mehrkarten-Entscheidung ist Abschaffen die ehrlichere
Variante; ein späterer Anlauf braucht ohnehin ein anderes Format.

**Konsequenzen:**

- Keine Sim-, Snapshot- oder Baseline-Änderung; die Headless-Tests sind nicht
betroffen.
- Die Feldlage steht weiterhin an mehreren Stellen literal (Unity-Host,
Headless-Szenario, Testspiegel). Diese Klasse von Spiegelstellen bleibt
ausdrücklich offen und ist nicht Teil dieser Entscheidung.
- Unity-Spuren (Kompilieren von `Nova.Editor`/`Nova.Data.Tests`, Generator-Lauf)
sind lokal nachzuholen; ältere Doku nennt das Asset historisch weiter.

## Offene Punkte

- Alle Sprint-4-Review-Befunde (105, davon 9 kritisch): 7 entscheidungsbedürftige kritische Befunde sind durch D-043–D-052 entschieden.
Expand Down
7 changes: 4 additions & 3 deletions docs/production/ScopeLedger.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Scope-Ledger der Graybox-Spur

**Version:** 0.7.0 | **Status:** laufendes Register – Graybox-Entwurf D-067 plus verbindliche 12B-Abweichungen D-090 und D-102-Fünf-Feld-Stand | **Verantwortungsbereich:** Orchestrator / Technical Writer | **Sprint:** 16
**Version:** 0.8.0 | **Status:** laufendes Register – Graybox-Entwurf D-067 plus verbindliche 12B-Abweichungen D-090 und D-102-Fünf-Feld-Stand | **Verantwortungsbereich:** Orchestrator / Technical Writer | **Sprint:** 16

## Zweck

Expand Down Expand Up @@ -40,8 +40,8 @@ funktionalen Anteil, das genannte Gate den vollständigen Inhalt.
| Manifest-Schlüsselpfad | Graybox-Substitut | Rückkehr-Gate | D-ID-Klausel |
|---|---|---|---|
| `startStatePerPlayer.unitRoles` | Startaufstellung des Determinismus-Szenarios portiert; zusätzlich vier Infanterieeinheiten je Slot, damit überhaupt etwas zu sehen ist | G4 | D-067 K1, K2 |
| `map.id`, `map.biome` | die Karte heißt seit GB-003 Glutrinne und zeigt einen Wüsten-Blockout (Sandtönung, Kartenrand-Rahmen, Kristallmarker – reine Präsentation über `GlutrinneBlockoutView` plus Datenasset `MAP_Glutrinne.asset`); weiterhin kein Terrain-/Biom-System und keine Hindernisse, nur die Kantenlänge stimmt | G4 (G2: technisch korrektes Testlayout) | D-067 K1, K2 |
| `map.aetheriumFields` | seit D-102 sind fünf endliche Felder in Manifestanzahl und -reserven an festen, punktgespiegelten Zellen registriert und als Kristallmarker sichtbar; Startaufstellung, Headless-Szenario, Datenasset und Tests sind synchron, aber eine gespielte Abnahme beziehungsweise ein G4-Nachweis fehlt weiterhin | G4 (G2) | D-067 K1, K2; D-102 |
| `map.id`, `map.biome` | die Karte heißt seit GB-003 Glutrinne und zeigt einen Wüsten-Blockout (Sandtönung, Kartenrand-Rahmen, Kristallmarker – reine Präsentation über `GlutrinneBlockoutView`; ein Datenasset gibt es seit #127/D-123 nicht mehr); das Terrain ist ein reines C#-Prädikat (`GlutrinneTerrainMap`, D-109), ein Biom-System gibt es weiterhin nicht | G4 (G2: technisch korrektes Testlayout) | D-067 K1, K2 |
| `map.aetheriumFields` | seit D-102 sind fünf endliche Felder in Manifestanzahl und -reserven an festen, punktgespiegelten Zellen registriert und als Kristallmarker sichtbar; Startaufstellung, Headless-Szenario und Tests sind synchron, aber eine gespielte Abnahme beziehungsweise ein G4-Nachweis fehlt weiterhin | G4 (G2) | D-067 K1, K2; D-102 |
| `map.primaryRouteCount` | keine Routenführung; die Ebene ist überall passierbar | G4 (G2) | D-067 K1, K2 |
| `factions[1]` | seit dieser Sitzung Simulationswirklichkeit: 34 fraktionsaufgelöste Definitionen (`SimDefinitions`, Id-Regel und Provenienz per D-075), Slot-Fraktion im Economy-Snapshotblock v2 mit `SetSlotFaction`-Guard, fraktionsaufgelöste Kosten/Bauzeiten/Energie/Waffenwerte, Graybox-Farben aus den D-072-Paletten im `UnitViewManager` und Slot-Fraktionen im Debug-HUD. Verbleibend: das `weaponProfile` der Identität (eigene Zeile) und der untätige KI-Slot (eigene Zeile). Kein Gate-Nachweis — die Zeile bleibt bis zur auflösenden Evidence | G4 | D-067 K1, K2 |
| `factions[1].identity.harvesterCargoAE` | seit dieser Sitzung im Code erfüllt: die Kapazität lebt in der Harvester-Definitionszeile (`SimUnitDefinition.CargoCapacityAE`), das `EconomySystem` klammert die Ernte fraktionsaufgelöst; die Entity-Store-Snapshotvalidierung deckelt auf das fraktionsübergreifende Maximum und bietet die pro-Entity-Fraktionsgrenze als Überladung. Kein Gate-Nachweis — die Zeile bleibt bis zur auflösenden Evidence | G4 | D-067 K1, K2 |
Expand Down Expand Up @@ -153,3 +153,4 @@ implementierten Gefechtsfeedback fest. D-090 ist die führende Entscheidung.
| 0.5.0 | 2026-08-05 | Sitzung GB-004: Zeile `persistence.pauseRequired` fortgeschrieben (Pause an P gebunden; kein Pausenmenü – Zeile bleibt bis G2) | Technical Writer |
| 0.6.0 | 2026-08-08 | Separaten D-090-Abschnitt mit sämtlichen bekannten Abweichungen des ausgeführten Sprint-12-Strangs B ergänzt; Graybox-Hauptregister und Manifestverweise unverändert erhalten | Technical Writer / Agent (Umsetzung) |
| 0.7.0 | 2026-08-10 | `map.aetheriumFields` auf D-102/Sprint 16.7 fortgeschrieben: fünf endliche Felder sind registriert, sichtbar und automatisiert gespiegelt; mangels gespielter Abnahme bleibt die Zeile bis zum Gate-Nachweis bestehen | Codex / Dennis Westermann |
| 0.8.0 | 2026-10-17 | #127/D-123: Verweis auf das Datenasset `MAP_Glutrinne.asset` in `map.id`/`map.biome` und `map.aetheriumFields` gestrichen (abgeschafft, kein Laufzeitleser); Terrain-Aussage auf den Stand D-109 berichtigt (`GlutrinneTerrainMap`) | Orchestrator |
Loading
Loading