diff --git a/Assets/Tests/EditMode/Data/MapDefinitionTests.cs b/Assets/Tests/EditMode/Data/MapDefinitionTests.cs deleted file mode 100644 index 561971aa..00000000 --- a/Assets/Tests/EditMode/Data/MapDefinitionTests.cs +++ /dev/null @@ -1,33 +0,0 @@ -using NUnit.Framework; -using UnityEngine; -using Nova.Data; - -namespace Nova.Data.Tests -{ - [TestFixture] - public class MapDefinitionTests - { - [Test] - public void MapDefinition_ValidatesDimensionsAndSpawnPoints() - { - var map = ScriptableObject.CreateInstance(); - - map.Initialize( - mapName: "Dust Bowl 1v1", - biome: MapBiomeType.Desert, - width: 128, - height: 128, - spawnPoints: new Vector2[] { new Vector2(20f, 20f), new Vector2(100f, 100f) }, - resourceNodes: new Vector2[] { new Vector2(64f, 64f) } - ); - - Assert.IsTrue(map.IsValid()); - Assert.AreEqual("Dust Bowl 1v1", map.MapName); - Assert.AreEqual(MapBiomeType.Desert, map.Biome); - Assert.AreEqual(2, map.SpawnPoints.Count); - Assert.AreEqual(1, map.ResourceNodes.Count); - - Object.DestroyImmediate(map); - } - } -} diff --git a/Assets/Tests/EditMode/Data/MapDefinitionTests.cs.meta b/Assets/Tests/EditMode/Data/MapDefinitionTests.cs.meta deleted file mode 100644 index 78234d89..00000000 --- a/Assets/Tests/EditMode/Data/MapDefinitionTests.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: a18a6271566414973ba76d9ad11c1874 \ No newline at end of file diff --git a/Assets/_Project/Data/Maps.meta b/Assets/_Project/Data/Maps.meta deleted file mode 100644 index 455de55f..00000000 --- a/Assets/_Project/Data/Maps.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 3b0d81bddd2a1426e8bb27dc498058ed -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Data/Maps/MAP_Glutrinne.asset b/Assets/_Project/Data/Maps/MAP_Glutrinne.asset deleted file mode 100644 index 406d5fcd..00000000 --- a/Assets/_Project/Data/Maps/MAP_Glutrinne.asset +++ /dev/null @@ -1,37 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6e9d3d1437c224b09bc533559bd3f5c4, type: 3} - m_Name: MAP_Glutrinne - m_EditorClassIdentifier: Nova.Data::Nova.Data.MapDefinitionSO - _mapName: Glutrinne - _biome: 0 - _width: 128 - _height: 128 - _spawnPoints: - - {x: 5, y: 5} - - {x: 119, y: 119} - _resourceNodes: - - {x: 7, y: 7} - - {x: 117, y: 117} - - {x: 24, y: 40} - - {x: 100, y: 84} - - {x: 62, y: 62} - - {x: 54, y: 54} - - {x: 70, y: 70} - - {x: 54, y: 70} - - {x: 70, y: 54} - - {x: 44, y: 24} - - {x: 80, y: 100} - - {x: 44, y: 80} - - {x: 80, y: 44} - - {x: 24, y: 96} - - {x: 100, y: 28} diff --git a/Assets/_Project/Data/Maps/MAP_Glutrinne.asset.meta b/Assets/_Project/Data/Maps/MAP_Glutrinne.asset.meta deleted file mode 100644 index 3aacdebd..00000000 --- a/Assets/_Project/Data/Maps/MAP_Glutrinne.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2fc75419d63b14bd3b706c990cf6eee0 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Editor/BootstrapSceneGenerator.cs b/Assets/_Project/Editor/BootstrapSceneGenerator.cs index 852883e0..42d30a20 100644 --- a/Assets/_Project/Editor/BootstrapSceneGenerator.cs +++ b/Assets/_Project/Editor/BootstrapSceneGenerator.cs @@ -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; @@ -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 @@ -267,45 +265,6 @@ private static void CreateMapObject(MatchRunner runner, GameObject ground) WireReference(blockout, "_groundRenderer", ground.GetComponent()); } - /// - /// 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. - /// - private static void EnsureGlutrinneMapAsset() - { - const string mapPath = "Assets/_Project/Data/Maps/MAP_Glutrinne.asset"; - - MapDefinitionSO map = AssetDatabase.LoadAssetAtPath(mapPath); - if (map == null) - { - ArtAssetAutoSync.EnsureFolder("Assets/_Project/Data/Maps"); - map = ScriptableObject.CreateInstance(); - 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); - } - /// /// Input sampling, the world-space HUD markers (selection, rally /// flags, placement ghost), the build bar, the command card, the diff --git a/Assets/_Project/Scripts/Data/Maps.meta b/Assets/_Project/Scripts/Data/Maps.meta deleted file mode 100644 index 37bae84f..00000000 --- a/Assets/_Project/Scripts/Data/Maps.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: e367d5c8c53824df4b3c48bce0656118 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Scripts/Data/Maps/MapBiomeType.cs b/Assets/_Project/Scripts/Data/Maps/MapBiomeType.cs deleted file mode 100644 index b581c039..00000000 --- a/Assets/_Project/Scripts/Data/Maps/MapBiomeType.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Nova.Data -{ - /// - /// Enum defining map biome environments in Project Nova. - /// - public enum MapBiomeType : byte - { - Desert = 0, - Snow = 1, - JungleIndustrial = 2 - } -} diff --git a/Assets/_Project/Scripts/Data/Maps/MapBiomeType.cs.meta b/Assets/_Project/Scripts/Data/Maps/MapBiomeType.cs.meta deleted file mode 100644 index 061a7882..00000000 --- a/Assets/_Project/Scripts/Data/Maps/MapBiomeType.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 62af6784fee134f7f8e3aaedcc0e3ee7 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Data/Maps/MapDefinitionSO.cs b/Assets/_Project/Scripts/Data/Maps/MapDefinitionSO.cs deleted file mode 100644 index 1f3c51fc..00000000 --- a/Assets/_Project/Scripts/Data/Maps/MapDefinitionSO.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -namespace Nova.Data -{ - /// - /// ScriptableObject defining map layout, spawn points, resource locations, and biome profile. - /// Supports 1v1 and 2v2 maps across 3 biomes. - /// - [CreateAssetMenu(fileName = "NewMapDefinition", menuName = "Project Nova/Maps/Map Definition")] - public class MapDefinitionSO : ScriptableObject - { - [SerializeField] private string _mapName = "Untitled Map"; - [SerializeField] private MapBiomeType _biome = MapBiomeType.Desert; - [SerializeField] private ushort _width = 128; - [SerializeField] private ushort _height = 128; - [SerializeField] private List _spawnPoints = new List(); - [SerializeField] private List _resourceNodes = new List(); - - public string MapName => _mapName; - public MapBiomeType Biome => _biome; - public ushort Width => _width; - public ushort Height => _height; - public IReadOnlyList SpawnPoints => _spawnPoints; - public IReadOnlyList ResourceNodes => _resourceNodes; - - public void Initialize(string mapName, MapBiomeType biome, ushort width, ushort height, Vector2[] spawnPoints, Vector2[] resourceNodes) - { - _mapName = mapName; - _biome = biome; - _width = width; - _height = height; - - _spawnPoints.Clear(); - if (spawnPoints != null) _spawnPoints.AddRange(spawnPoints); - - _resourceNodes.Clear(); - if (resourceNodes != null) _resourceNodes.AddRange(resourceNodes); - } - - public bool IsValid() - { - if (_width == 0 || _height == 0) return false; - if (_spawnPoints.Count < 2) return false; // Must support at least 1v1 (2 players) - - for (int i = 0; i < _spawnPoints.Count; i++) - { - Vector2 sp = _spawnPoints[i]; - if (sp.x < 0f || sp.x >= _width || sp.y < 0f || sp.y >= _height) return false; - } - - return true; - } - } -} diff --git a/Assets/_Project/Scripts/Data/Maps/MapDefinitionSO.cs.meta b/Assets/_Project/Scripts/Data/Maps/MapDefinitionSO.cs.meta deleted file mode 100644 index 0493d496..00000000 --- a/Assets/_Project/Scripts/Data/Maps/MapDefinitionSO.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 6e9d3d1437c224b09bc533559bd3f5c4 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/Match/MatchBootstrap.cs b/Assets/_Project/Scripts/Gameplay/Match/MatchBootstrap.cs index 8b3e9288..724e33a4 100644 --- a/Assets/_Project/Scripts/Gameplay/Match/MatchBootstrap.cs +++ b/Assets/_Project/Scripts/Gameplay/Match/MatchBootstrap.cs @@ -322,15 +322,9 @@ public bool TryGetFieldInitialReserve(ushort fieldId, out long reserveAE) /// /// The same list as , 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.) /// public static Vector2Int[] CanonicalFieldCells { @@ -345,20 +339,6 @@ public static Vector2Int[] CanonicalFieldCells } } - /// - /// 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 -> 124 - p holds by construction rather than by - /// a second hand-kept pair of literals. Same purpose as - /// : editor tooling reads, it does - /// not restate. - /// - public static Vector2Int[] CanonicalHqCentreCells => new[] - { - new Vector2Int(LocalLayout.HqOriginX + 1, LocalLayout.HqOriginY + 1), - new Vector2Int(EnemyLayout.HqOriginX + 1, EnemyLayout.HqOriginY + 1), - }; - /// Lower-left footprint origin of the human HQ (4, 4). public Vector2Int LocalHqOrigin => new Vector2Int(LocalPlayerLayout.HqOriginX, LocalPlayerLayout.HqOriginY); diff --git a/CHANGELOG.md b/CHANGELOG.md index 3af38f47..188a2736 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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: diff --git a/docs/production/DecisionLog.md b/docs/production/DecisionLog.md index c00a15ca..9aee9e3a 100644 --- a/docs/production/DecisionLog.md +++ b/docs/production/DecisionLog.md @@ -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. diff --git a/docs/production/ScopeLedger.md b/docs/production/ScopeLedger.md index 34a6db5a..4a847371 100644 --- a/docs/production/ScopeLedger.md +++ b/docs/production/ScopeLedger.md @@ -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 @@ -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 | @@ -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 | diff --git a/docs/tech/modules/MapExpansion_Spec.md b/docs/tech/modules/MapExpansion_Spec.md index 43aaec5f..1fbb6633 100644 --- a/docs/tech/modules/MapExpansion_Spec.md +++ b/docs/tech/modules/MapExpansion_Spec.md @@ -1,10 +1,10 @@ # Modulspezifikation – Map- & Biom-Erweiterung (`Nova.Presentation.Maps`) -**Version:** 1.1.1 | **Status:** historischer Prototyp-/Scaffolding-Stand gemäß D-055 – nicht verbindlich | **Verantwortungsbereich:** Level Designer / Lead Technical Director | **Sprint:** Phase 2 (Modul 19) +**Version:** 1.1.2 | **Status:** historischer Prototyp-/Scaffolding-Stand gemäß D-055 – nicht verbindlich | **Verantwortungsbereich:** Level Designer / Lead Technical Director | **Sprint:** Phase 2 (Modul 19) ## Zweck -Dieses Dokument beschreibt die Präsentations-Struktur der **Map- & Biom-Erweiterung** von *Hashkrieg*. Das Modul verwaltet Karten-Layouts (`MapDefinitionSO`) für 1v1- und 2v2-Gefechte, 2 bis 4 Spieler-Spawn-Punkte, Aetherium-Kristallknoten-Positionen sowie drei Biom-Umgebungen (`Desert`, `Snow`, `JungleIndustrial`). +Dieses Dokument beschreibt die Präsentations-Struktur der **Map- & Biom-Erweiterung** von *Hashkrieg*. Das Modul sollte Karten-Layouts für 1v1- und 2v2-Gefechte, 2 bis 4 Spieler-Spawn-Punkte, Aetherium-Kristallknoten-Positionen sowie drei Biom-Umgebungen (`Desert`, `Snow`, `JungleIndustrial`) verwalten. Die dafür gedachten Typen `MapDefinitionSO` und `MapBiomeType` samt Datenasset wurden mit #127 (D-123) entfernt, weil sie keinen Laufzeitkonsumenten hatten; dieser Text beschreibt nur noch den historischen Entwurf. ## Abhängigkeiten @@ -34,7 +34,7 @@ Dieses Dokument beschreibt die Präsentations-Struktur der **Map- & Biom-Erweite [ MatchRunner / Game Setup ] │ ▼ - [ MapDefinitionSO ] ──► Validate Map Dimensions & Spawn Points (IsValid) + [ Kartendefinition (entfernt, D-123) ] ──► Validate Map Dimensions & Spawn Points (historisch: IsValid) │ ├── Spawn Base HQs ─────► ConstructionSystem └── Spawn Aetherium ───► ResourceHarvestingSystem @@ -44,7 +44,7 @@ Dieses Dokument beschreibt die Präsentations-Struktur der **Map- & Biom-Erweite ## 2. Qualitätssicherung & Tests -* **Unit Tests:** [`MapDefinitionTests.cs`](../../../Assets/Tests/EditMode/Data/MapDefinitionTests.cs) (Validierung von Kartenabmessungen, Spawn-Punkten und Biom-Typen). +* **Unit Tests:** entfallen mit #127 (D-123); `MapDefinitionTests.cs` prüfte nur die Selbstvalidierung des entfernten Typs. ## Offene Punkte @@ -64,3 +64,4 @@ Dieses Dokument beschreibt die Präsentations-Struktur der **Map- & Biom-Erweite | 1.0.0 | 2026-07-24 | Historischen Prototyp-/Scaffolding-Stand dokumentiert | Modulverantwortliche | | 1.1.0 | 2026-07-24 | Freigabe gemäß D-055 entzogen und aktive Recovery-Verträge als führend verankert | Lead Technical Director | | 1.1.1 | 2026-07-25 | Testpfad korrigiert: `MapDefinitionSO`/`MapBiomeType` liegen nach der G0-B-Assembly-Bereinigung in `Nova.Data`, der Test in `Nova.Data.Tests` | Lead Technical Director | +| 1.1.2 | 2026-10-17 | `MapDefinitionSO`, `MapBiomeType`, Datenasset und Test entfernt (#127, D-123); toten Testlink gestrichen | Orchestrator | diff --git a/reports/v8.6.0/issue-lauf-2026-10-17/04-issue-127-remove-map-definition-so.md b/reports/v8.6.0/issue-lauf-2026-10-17/04-issue-127-remove-map-definition-so.md new file mode 100644 index 00000000..99c392bc --- /dev/null +++ b/reports/v8.6.0/issue-lauf-2026-10-17/04-issue-127-remove-map-definition-so.md @@ -0,0 +1,53 @@ +--- +issue: 127 +paket: P-127 +branch: chore/127-remove-map-definition-so +agent: builder (sonnet) +datum: 2026-10-17 +status: DONE +--- +# MapDefinitionSO ohne Laufzeitkonsumenten abschaffen + +## Aufgabe +Issue #127 verlangt die Wahl: `MapDefinitionSO` einen Konsumenten geben oder abschaffen. Umgesetzt ist die Empfehlung der Triage (abschaffen): Typ, Enum, Asset, Test und Generator-Abschnitt entfallen, ebenso `MatchBootstrap.CanonicalHqCentreCells`. + +## Was geändert wurde (Files Changed) +- Assets/_Project/Scripts/Data/Maps/MapDefinitionSO.cs (+.meta) — gelöscht, kein Laufzeitleser +- Assets/_Project/Scripts/Data/Maps/MapBiomeType.cs (+.meta) — gelöscht, nur von obigem Typ benutzt +- Assets/_Project/Scripts/Data/Maps.meta — gelöscht (Ordner-.meta) +- Assets/_Project/Data/Maps/MAP_Glutrinne.asset (+.meta) — gelöscht +- Assets/_Project/Data/Maps.meta — gelöscht (Ordner-.meta) +- Assets/Tests/EditMode/Data/MapDefinitionTests.cs (+.meta) — gelöscht, einziger Test des Typs +- Assets/_Project/Editor/BootstrapSceneGenerator.cs — `using Nova.Data;`, Aufruf und `EnsureGlutrinneMapAsset` samt Doc-Kommentar entfernt (`Nova.Data` wird sonst in der Datei nicht gebraucht) +- Assets/_Project/Scripts/Gameplay/Match/MatchBootstrap.cs — `CanonicalHqCentreCells` entfernt (git grep: nur der Generator las sie); Kommentar von `CanonicalFieldCells` gekürzt, Property bleibt (`AllFieldCells`) +- docs/tech/modules/MapExpansion_Spec.md — Version 1.1.2, toten Testlink entfernt, Hinweise auf Wegfall (#127, D-123) +- docs/production/ScopeLedger.md — Zeilen 43/44: Verweis auf das Datenasset gestrichen, Terrain-Aussage auf Stand D-109 (C#-Prädikat) berichtigt +- docs/production/DecisionLog.md — D-123-Entwurf vor „## Offene Punkte"; Kopfversion/Verlauf unberührt +- CHANGELOG.md — eine Zeile unter Entschieden (#127) + +## Tests und Prüfungen +- `dotnet test tools/Nova.SimRunner.Tests/Nova.SimRunner.Tests.csproj -c Release`: 778/778 grün (gemessen). Hinweis: diese Lane kompiliert weder Gameplay noch Editor, belegt die C#-Änderungen also nicht. +- `python3 .github/scripts/check_docs.py`: OK, 203 Markdown-Dateien. `check_baseline_guard.py --self-test`: bestanden. +- `git grep` auf MapDefinitionSO / MapBiomeType / CanonicalHqCentreCells in .cs/.asmdef/.unity/.prefab/.asset: keine Treffer mehr. In Doku/Altberichten (GrayboxLog, Statusberichte, Sprintdokumente) bleibt das Asset historisch genannt, absichtlich nicht angefasst. +- GUID-Gegenprobe (git grep über Assets, ProjectSettings, Packages): MapBiomeType 62af6784…, Asset 2fc75419…, Maps-Ordner e367d5c8… und 3b0d81bd…, Test a18a6271… — jeweils nur in der eigenen gelöschten .meta. Skript-GUID MapDefinitionSO 6e9d3d14… steht nur in der gelöschten .meta und im gelöschten Asset. Kein Verweis bleibt. +- NICHT gelaufen: Unity (Kompilieren von Nova.Editor, Nova.Data.Tests, MatchBootstrap; Generator-Lauf; EditMode-Tests). Keine neuen Tests. Spielabnahme: nicht gespielt. + +## Entscheidung +D-123 (Entwurf): abgeschafft; Wiedereinführung nur als engine-freie Kartendefinition nach G5 mit eigener D-ID. Siehe docs/production/DecisionLog.md. + +## Nebenbefunde +- Die Feldlage steht weiterhin mehrfach literal (MatchBootstrap, Determinism10000Scenario, Testspiegel); bewusst offen. +- ScopeLedger Z. 44 nennt noch „fünf endliche Felder" (Drift, P-12-drift überlassen). +- Ältere Doku (GrayboxLog, StatusSnapshot, Sprintdokument 22) nennt das Asset historisch. +- Ich habe `git rm` und danach `git reset -q` (nur Index, um die Löschungen unstaged zu lassen) benutzt; Arbeitsbaum-Zustand ist wie gewünscht, Index entspricht HEAD. + +## Offene Fragen an den Inhaber +- Keine zwingenden. Bestätigung, dass vor der Mehrkarten-Entscheidung abgeschafft wird (so entschieden im D-123-Entwurf). + +## Commit-Titel und PR +Titel: `chore(data): remove MapDefinitionSO without runtime reader` +PR: Was: Typ, Enum, Asset, Test, Generator-Abschnitt und `CanonicalHqCentreCells` entfernt. Warum: kein Laufzeitleser, Inhalt war unbemerkt falsch (#127, D-123). Bereiche: Data, Editor, Gameplay/Match, Doku. Changelog: Entschieden, D-123. Unity-Spuren: nicht gelaufen (Kompilieren, Generator, EditMode). Spielabnahme: nicht gespielt; Restrisiko: Unity-Kompilierfehler in Editor/Gameplay möglich, in der Headless-Lane nicht sichtbar. Textkonflikt: Art-Commit 73f54b5 ändert MatchBootstrap.cs bei ca. Z. 367, mein Hunk endet um Z. 342; kein Überlapp zu erwarten, nicht durchprobiert. + +## Unity-Spuren nachgefahren (Integrator, 2026-10-17) + +Nach dem Commit mit `tools/unity-tests/run_unity_tests.py` (Branch #110) auf diesem Worktree, Unity 6000.5.4f1, warme Library: **EditMode 662/662, PlayMode 15/15**, keine Fehlschläge, keine Compile-Fehler, Arbeitsbaum danach sauber. Die Zeile „Unity-Spuren: nicht gelaufen“ oben ist damit überholt; der PR-Text nennt die gemessenen Zahlen. diff --git a/reports/v8.6.0/issue-lauf-2026-10-17/04b-review-1-issue-127.md b/reports/v8.6.0/issue-lauf-2026-10-17/04b-review-1-issue-127.md new file mode 100644 index 00000000..408cc047 --- /dev/null +++ b/reports/v8.6.0/issue-lauf-2026-10-17/04b-review-1-issue-127.md @@ -0,0 +1,117 @@ +--- +issue: 127 +paket: P-127 +branch: chore/127-remove-map-definition-so +reviewer: opus +runde: 1 +verdict: APPROVED +datum: 2026-10-17 +--- +# Review 1 zu P-127: MapDefinitionSO ohne Laufzeitkonsumenten abschaffen + +Unabhängiges Read-only-Review nach AGENTS.md §3. Ich habe keine Projektdatei geändert. Hilfsdateien liegen +unter `scratchpad/build-127/review/`. + +## Was geprüft wurde + +- `git status --short`, `git diff` (alle 16 Pfade) und der Builder-Bericht `04-issue-127-remove-map-definition-so.md`, + abgeglichen mit Issue #127, Analyse/Gegenprüfung `triage/issue-127.json` und Paketspezifikation `paket-P-127.json`. +- Schreibumfang: alle 16 geänderten Pfade liegen im Paket-Schreibumfang, dazu kommt der Bericht. Die vier + Guard-Dateien sind unverändert (`git diff HEAD --stat` leer). Der Index ist leer (`git diff --cached` leer), + die Löschungen liegen unstaged im Arbeitsbaum. +- GUID-Gegenprobe (selbst gemessen): GUIDs aus den sechs gelöschten `.meta`-Dateien aus `HEAD` gelesen und mit + `grep -rl` über `Assets/`, `ProjectSettings/` und `Packages/` des Arbeitsbaums gesucht: + `a18a6271…` (Test), `3b0d81bd…` (Data/Maps-Ordner), `2fc75419…` (Asset), `e367d5c8…` (Scripts/Data/Maps-Ordner), + `62af6784…` (MapBiomeType), `6e9d3d14…` (MapDefinitionSO). **Kein Treffer.** Die Ordner `Assets/_Project/Data/Maps` + und `Assets/_Project/Scripts/Data/Maps` existieren nicht mehr, verwaiste `.meta`-Dateien bleiben keine zurück. +- Symbolsuche: `git grep` auf `MapDefinitionSO|MapBiomeType|CanonicalHqCentreCells|MAP_Glutrinne|EnsureGlutrinneMapAsset|MapDefinitionTests` + findet keinen Code-, Szenen-, Prefab- oder Asset-Treffer mehr, nur historische Doku (GrayboxLog, StatusSnapshot, + ImplementationAudit, Sprintdokumente 01/21/22) und die neuen D-123-, Changelog- und Spec-Hinweise. +- Kompilierbarkeit ohne Unity, durch Lesen geprüft: `BootstrapSceneGenerator.cs` benutzt nach dem Entfernen von + `using Nova.Data;` keinen Typ aus `Assets/_Project/Scripts/Data/` mehr (alle dort deklarierten Typnamen gegen die + Datei geprüft). `LocalLayout`/`EnemyLayout` in `MatchBootstrap` haben weiter Leser (Z. 367/368/795/796). + `CanonicalFieldCells` bleibt über `AllFieldCells` (Z. 321) in Gebrauch. `Nova.Data.Tests` behält drei Testdateien + plus asmdef. +- Konfliktprobe mit dem Art-Branch (lesend, per `git merge-file` im Scratchpad, Merge-Basis `85c912b`): + - `MatchBootstrap.cs`, PR-Stand gegen `feat/generals-look-and-feel`: genau ein Konflikt bei `RestartMatch` + (`ApplyLocalMatchSeed` aus main gegen `ApplyLocalSkirmishFaction` aus 73f54b5). Derselbe Konflikt entsteht auch + mit dem unveränderten main-Stand `a6858d1`. Er gehört also nicht zu diesem PR. Der PR-Hunk (Z. 322–361) mischt sich + sauber mit dem Art-Hunk @367. + - `BootstrapSceneGenerator.cs`: konfliktfrei, sowohl gegen die Branch-Spitze als auch gegen den uncommitteten + Arbeitsbaum-Stand im Hauptbaum. Der Art-Branch fügt weder im Commit noch im Arbeitsbaum neue Leser von + `CanonicalHqCentreCells`, `MapDefinitionSO` oder `MapBiomeType` hinzu. +- Fachlich: Determinismus nicht berührt (keine Datei unter `Scripts/Simulation`, keine Baseline). D-123 ist + vollständig. Changelog-Zeile vorhanden. Spec- und ScopeLedger-Inhalte stimmen mit dem Code überein. + +## Nachgerechnete Ergebnisse (im Worktree, selbst ausgeführt) + +| Prüfung | Befehl | Ergebnis | Builder-Angabe | +|---|---|---|---| +| Headless-Tests | `dotnet test tools/Nova.SimRunner.Tests/Nova.SimRunner.Tests.csproj -c Release` | **778/778 bestanden**, 0 Fehler, 0 übersprungen (15 s) | 778/778, stimmt | +| Doku-Links | `python3 .github/scripts/check_docs.py` | **OK: 204 Markdown-Dateien**, 5 Quality-JSONs | 203. Die Differenz ist der danach geschriebene Builder-Bericht (203 getrackt + 1 untrackt), also plausibel und kein Widerspruch | +| Baseline-Guard Selbsttest | `python3 .github/scripts/check_baseline_guard.py --self-test` | bestanden, inklusive Negativkontrolle | stimmt | +| Baseline-Guard auf echtem Diff | `--changed-files <17 Pfade> --labels ` | „passed: only one side of the separation“ | (nicht angegeben) | +| Unity (Kompilieren Nova.Editor/Nova.Data.Tests/Gameplay, Generator, EditMode) | — | **nicht gelaufen** (Review-Rahmen) | nicht gelaufen, korrekt ausgewiesen | + +## Befunde + +### hoch +Keine. + +### mittel + +1. **Verbotener Git-Befehl benutzt** (Builder-Bericht, Nebenbefunde): Der Builder hat `git rm` und danach `git reset -q` + ausgeführt. `reset` ist im Paketrahmen ausdrücklich untersagt. Ich habe den Effekt geprüft: Der Index entspricht HEAD, + der Arbeitsbaum zeigt die gewollten Löschungen, kein Schaden. Der Builder hat es offen gemeldet. Deshalb ist das ein + Prozessbefund und kein Blocker. *Vorschlag:* Im Builder-Prompt künftig `rm`/`git rm --cached` vermeiden und reine + Dateisystem-Löschung vorschreiben. +2. **ScopeLedger ohne Kopfversion und Verlaufszeile** (`docs/production/ScopeLedger.md:3` und `:145ff`): Die Zeilen + `map.id`/`map.biome` (Z. 43) und `map.aetheriumFields` (Z. 44) wurden inhaltlich geändert, unter anderem die + Terrain-Aussage auf D-109 berichtigt. Version 0.7.0 und der Änderungsverlauf blieben unverändert. Bisher hat jede + inhaltliche Fortschreibung dieser Datei die Version erhöht (0.3.0–0.7.0). *Vorschlag:* 0.8.0 mit Verlaufszeile + „#127/D-123: Datenasset-Verweis gestrichen, Terrain-Aussage auf D-109“. Die Arbeit mit P-12-drift (schreibt danach + in dieselbe Datei) beim Integrieren abstimmen. + +### niedrig + +3. `docs/tech/modules/MapExpansion_Spec.md:22-27`: Die Spezifikation sah vor, auch die Biom-Liste auf den Wegfall + hinweisen zu lassen. Erledigt ist das indirekt über den Zweck-Absatz (Z. 7). Das reicht für ein historisches + Dokument, ist aber nicht wörtlich umgesetzt. +4. `docs/tech/modules/MapExpansion_Spec.md:67`: Als Autor der Verlaufszeile steht „Builder“, die übrigen Zeilen nennen + Rollen („Lead Technical Director“). *Vorschlag:* Rolle eintragen. +5. `Assets/_Project/Scripts/Gameplay/Match/MatchBootstrap.cs:324-327`: Der gekürzte Docstring begründet `public static` + noch mit „tooling can read“. Nach dem Wegfall des Generators gibt es außer `AllFieldCells` keinen statischen Leser + mehr. Das ist sachlich nicht falsch und laut Spezifikation gewollt („Property bleibt“), aber die Begründung ist jetzt + prospektiv. Kein Handlungszwang. +6. D-123 (`docs/production/DecisionLog.md`, Alternativen): Es gibt die geforderten drei Alternativen, aber nur 1 und 2 + tragen eine explizite Bewertung. Die Bewertung von 3 steckt in der „Begründung“. Formal ausreichend. + +## Nebenbefunde (nicht umsetzen) + +- `.gitignore` Z. 26: `reports/ # lokale …` — Git kennt keine Inline-Kommentare. Das Muster ist damit der + Literalstring samt Kommentar und ignoriert `reports/` **nicht** (`git check-ignore` meldet nichts, `git ls-files + --others --exclude-standard` listet den Bericht). Folge: `check_docs.py` zählt lokale Berichte mit, und der Hinweis + im Rahmen „reports/ ist gitignored“ stimmt faktisch nicht. Eigene Kleinst-Korrektur außerhalb dieses Pakets. +- Der Konflikt `ApplyLocalMatchSeed`/`ApplyLocalSkirmishFaction` in `MatchBootstrap.RestartMatch` zwischen main (`a6858d1`) + und dem Art-Branch besteht unabhängig von diesem PR und muss beim Rebase des Art-Branches gelöst werden. +- Die Nebenbefunde des Builders (Feldlage mehrfach literal, ScopeLedger Z. 44 „fünf Felder“, historische Asset-Nennungen) + kann ich bestätigen. Sie sind korrekt als offen markiert. + +## Ehrlichkeit des Builder-Berichts + +Stimmt. Testzahl 778/778 und Guard-Selbsttest decken sich mit meiner Messung. Die Abweichung der Doku-Zählung +(203/204) erklärt sich durch die Reihenfolge. GUID-Liste und Symbolsuche stimmen. Unity, Generator-Lauf, EditMode und +Spielabnahme sind als nicht gelaufen ausgewiesen. Den Art-Konflikt hat der Builder als „nicht durchprobiert“ markiert. +Das habe ich nachgeholt: kein Konflikt durch diesen PR. Den `git reset` hat er selbst offengelegt. + +## Empfehlung für den Inhaber + +**APPROVED.** Mergebar nach grüner Pflicht-CI, wenn vorher oder beim Integrieren Folgendes passiert: +1. ScopeLedger auf 0.8.0 mit Verlaufszeile setzen (Befund 2). +2. Vor dem Merge lokal in Unity öffnen: Nova.Editor, Nova.Gameplay und Nova.Data.Tests müssen fehlerfrei kompilieren. + Den Generator einmal laufen lassen (es darf kein `Assets/_Project/Data/Maps/` mehr entstehen) und die + Data-EditMode-Tests ausführen. Ist das nicht geschehen, im PR „Unity nicht gelaufen“ stehen lassen. Das Restrisiko + ist gering, weil alle Leser per Grep und GUID ausgeschlossen sind, ein Kompilierfehler im Editor-Assembly fiele in + der CI aber nicht auf. +3. Die Mehrkarten-Richtung bestätigen. Der D-123-Entwurf legt fest, dass eine Wiedereinführung nur als engine-freie + Kartendefinition nach G5 erfolgt. Das ist eine Inhaberentscheidung.