From 61ef30f081829d2938b8de9951e90869c64c5200 Mon Sep 17 00:00:00 2001 From: KNSO Date: Sun, 13 Sep 2026 11:36:59 +0200 Subject: [PATCH] docs: Downtown-Bezugspunkt statt Downtown-Kern, stimmige Koordinatenbeispiele MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (−511, 254) ist der Bezugspunkt aus tools/extract/data/districts.json, der Mittelpunkt der westlichen Hochhäuser, und liegt in B9. Der höchste Turm, das Southeast Financial Center, steht in C12. Das Anzeigebeispiel x 412 / y 1830 liegt in F3, nicht in C10. Im Browser bei Task 4 der Minimap aufgefallen. Co-Authored-By: Claude Opus 5 --- .../plans/2026-09-13-feinkalibrierung.md | 20 ++++++++++--------- docs/superpowers/plans/2026-09-13-minimap.md | 17 +++++++++++----- .../2026-09-13-feinkalibrierung-design.md | 12 +++++------ .../specs/2026-09-13-minimap-design.md | 4 ++-- 4 files changed, 31 insertions(+), 22 deletions(-) diff --git a/docs/superpowers/plans/2026-09-13-feinkalibrierung.md b/docs/superpowers/plans/2026-09-13-feinkalibrierung.md index 832b699..766c375 100644 --- a/docs/superpowers/plans/2026-09-13-feinkalibrierung.md +++ b/docs/superpowers/plans/2026-09-13-feinkalibrierung.md @@ -51,11 +51,13 @@ und anfügen: ```python def test_chunk_for_world_matches_javascript(): - # Dieselben Beispiele wie tests/coords.test.js: Ecken des Ausschnitts und der Downtown-Kern in B9. + # Dieselben Beispiele wie tests/coords.test.js: Ecken des Ausschnitts, der Downtown-Bezugspunkt aus + # data/districts.json in B9 und der höchste Turm, das Southeast Financial Center, in C12. assert chunk_for_world(-1000, 2500) == (0, 0) assert chunk_for_world(1999, -499) == (11, 11) assert chunk_for_world(-511, 254) == (1, 8) assert chunk_name(*chunk_for_world(-511, 254)) == "B9" + assert chunk_name(*chunk_for_world(-461.31, -460.1)) == "C12" ``` `tools/extract/tests/test_corrections_load.py`: @@ -81,7 +83,7 @@ def test_all_spec_actions_are_known(): def test_entries_parse_with_their_fields_and_layers(): text = """ [[correction]] -chunk = "c10" +chunk = "f3" action = "remove_building" at = [412, 1830] reason = "Beschriftung" @@ -89,7 +91,7 @@ reason = "Beschriftung" [[correction]] chunk = "B9" action = "add_building" -at = [-490.5, 270] +at = [-600.5, 270] size = [20, 30] height = 15 rotation = 45 @@ -116,7 +118,7 @@ kinds = ["lamp"] """ parsed = parse_corrections(text) assert [c.index for c in parsed] == [1, 2, 3, 4, 5] - assert parsed[0].chunk == "C10" + assert parsed[0].chunk == "F3" assert parsed[0].reason == "Beschriftung" assert parsed[1].fields["rotation"] == 45 assert parsed[2].fields["from"] == [-700, 300] @@ -333,10 +335,10 @@ def _parse_entry(index: int, entry) -> Correction: # # Beispiel: # [[correction]] -# chunk = "C10" +# chunk = "F3" # action = "remove_building" # at = [412, 1830] -# reason = "Beschriftung STARFISH ISLAND, kein Gebäude" +# reason = "Beschriftung der Originalkarte, kein Gebäude" ``` - [ ] **Step 6: Tests laufen lassen, sie müssen bestehen; dann die Suite** @@ -1262,7 +1264,7 @@ Run: `cd tools/extract && uv run python overview.py && cmp debug/overview.png de Expected: `bytegleich`. Weichen die Bilder ab, nicht committen, sondern melden. Run: `cd tools/extract && uv run python overview.py --chunk B9 --suffix probe` -Expected: `debug/chunk-B9-probe.png` mit 1.000 × 1.000 px. Das Bild im Bericht beschreiben (Downtown-Kern) und seinen Pfad nennen. +Expected: `debug/chunk-B9-probe.png` mit 1.000 × 1.000 px. Das Bild im Bericht beschreiben und seinen Pfad nennen. - [ ] **Step 7: Suite und Commit** @@ -1497,7 +1499,7 @@ Zuerst ohne Korrekturen erzeugen. So zeigt schon das Vorher-Bild die Laternen, u Run: `cd tools/extract && uv run python run.py && uv run python overview.py --chunk B9 --suffix vorher` Expected: `Korrekturen: 0 angewendet, 0 übersprungen`, danach `debug/chunk-B9-vorher.png`. -Dann aus den frischen Daten des Downtown-Chunks B9 fünf Probekorrekturen ableiten und **vorübergehend** an `data/corrections.toml` anhängen: zwei für Gebäude, je eine für Straßen, Beläge und Requisiten. +Dann aus den frischen Daten von Chunk B9 fünf Probekorrekturen ableiten und **vorübergehend** an `data/corrections.toml` anhängen: zwei für Gebäude, je eine für Straßen, Beläge und Requisiten. ```bash cd tools/extract && uv run python - <<'PY' @@ -1710,7 +1712,7 @@ Expected: PASS, Ausgabe sauber. Kein Test und keine Quelldatei darf noch `lampPo Dev-Server starten, jeweils mit Screenshot im Bericht: -1. An einer Straße im Downtown-Kern (B9) stehen Laternen am Rand, nicht auf der Fahrbahn und nicht in Gebäuden, und ihr Arm zeigt wie vorher über die Fahrbahn. +1. An einer Straße im Hochhauskern C12 stehen Laternen am Rand, nicht auf der Fahrbahn und nicht in Gebäuden, und ihr Arm zeigt wie vorher über die Fahrbahn. 2. An einer Chunk-Grenze, über die eine Straße läuft (Chunk-Grenzen im Panel einblenden), steht keine Laterne auf der Fahrbahn — das war die bekannte Lücke der Browser-Version. 3. Die Konsole ist frei von Fehlern aus diesem Code. diff --git a/docs/superpowers/plans/2026-09-13-minimap.md b/docs/superpowers/plans/2026-09-13-minimap.md index 5b85137..f35c0c3 100644 --- a/docs/superpowers/plans/2026-09-13-minimap.md +++ b/docs/superpowers/plans/2026-09-13-minimap.md @@ -10,13 +10,15 @@ **Spec:** `docs/superpowers/specs/2026-09-13-minimap-design.md` +> **Korrektur nach Task 4 (Ruling M7):** `(−511, 254)` ist der Bezugspunkt „Downtown“ aus `tools/extract/data/districts.json` — der Mittelpunkt der westlichen Hochhäuser —, nicht der Hochhauskern selbst. Der höchste Turm, das Southeast Financial Center bei `(−461, −460)`, steht in C12. Wortlaut, zwei Testtitel und das Anzeigebeispiel `F3 · x 412 / y 1830` (vorher fälschlich mit C10) sind unten angepasst. + ## Global Constraints - three 0.184.0; **keine neue Laufzeit- oder Testabhängigkeit.** vitest läuft ohne DOM — alles, was ohne Browser getestet werden soll, gehört in reine Funktionen in `mapMath.js`; `map.js` wird im Browser geprüft. - Python-Bibliotheken: numpy, scipy, scikit-image, shapely, networkx, pillow, pytest. - **Niemals** `git add three-player-controller`, **niemals** `git add -A`. Das Submodul bleibt auf `ac39682`; `git status` zeigt es als geändert, das ist ein gewollter Zustand. Commits nur mit ausdrücklichen Pfaden: `git commit -m "…" -- `. - **`tools/extract/run.py` wird nicht angefasst.** Eine parallele Sitzung arbeitet an der Pipeline. Die Kartendateien entstehen über `overview.py`. -- Chunk-Namen: Spalte `A`–`L` aus `i` (West → Ost), Zeile `1`–`12` aus `j` (Nord → Süd). **A1 = `chunk_0_0` = Nordwest-Ecke.** C10 = `chunk_2_9`. Downtown-Kern Welt `(−511, 254)` = B9. +- Chunk-Namen: Spalte `A`–`L` aus `i` (West → Ost), Zeile `1`–`12` aus `j` (Nord → Süd). **A1 = `chunk_0_0` = Nordwest-Ecke.** C10 = `chunk_2_9`. Downtown-Bezugspunkt aus `districts.json` Welt `(−511, 254)` = B9; höchster Turm, Southeast Financial Center `(−461, −460)` = C12. - Koordinaten: three `(x, z)` → Welt `(X = x, Y = −z)` → Kartenpixel `px = (X − x0) · scale`, `py = (y1 − Y) · scale`, mit `x0 = −1000`, `y1 = 2500`. - Ausschnitt: `SLICE = { x0: -1000, x1: 2000, y0: -500, y1: 2500 }`, Chunkgröße 250 m, 12 × 12 Chunks. - Kartendateien in `public/data/vice-a/`: `map.png` 3.000 × 3.000, `map-walkable.png` 750 × 750 (255 begehbar, 0 nicht), `map.json`. Vite liefert sie unter `./data/vice-a/` aus. @@ -93,10 +95,14 @@ describe("Chunk-Namen", () => { } }); - it("verbindet den Namen mit der Lage: der Downtown-Kern liegt in B9", () => { + it("verbindet den Namen mit der Lage: Downtown-Bezugspunkt in B9, höchster Turm in C12", () => { + // (−511, 254) ist der Bezugspunkt "Downtown" aus tools/extract/data/districts.json, der Mittelpunkt + // der westlichen Hochhäuser. Die Türme selbst stehen nördlich und südlich davon. const { i, j } = chunkForWorld(-511, 254); expect({ i, j }).toEqual({ i: 1, j: 8 }); expect(chunkName(i, j)).toBe("B9"); + const tower = chunkForWorld(-461.31, -460.1); // Southeast Financial Center, 248 m + expect(chunkName(tower.i, tower.j)).toBe("C12"); }); }); ``` @@ -665,8 +671,9 @@ describe("Landeplatz", () => { }); describe("Chunk-Namen und Anzeige", () => { - it("nennt am Kartenpunkt des Downtown-Kerns B9", () => { + it("nennt am Downtown-Bezugspunkt B9 und am Southeast Financial Center C12", () => { expect(chunkNameAtMap(INFO, 489, 2246)).toBe("B9"); + expect(chunkNameAtMap(INFO, 538.69, 2960.1)).toBe("C12"); }); it("liefert am östlichen Kartenrand keinen Namen mehr", () => { @@ -815,7 +822,7 @@ export function chunkNameAtMap(info, px, py) { return chunkName(i, j); } -/** Anzeige für die Stelle unter dem Mauszeiger, etwa "C10 · x 412 / y 1830". */ +/** Anzeige für die Stelle unter dem Mauszeiger, etwa "F3 · x 412 / y 1830". */ export function hoverLabel(info, px, py) { const name = chunkNameAtMap(info, px, py); if (!name) return null; @@ -1294,7 +1301,7 @@ Expected: PASS, Ausgabe sauber. (Keine neuen Tests; die Suite belegt, dass nicht Dev-Server starten, Seite öffnen, jeweils mit Screenshot im Bericht: 1. **M** öffnet die Karte: ganzer Ausschnitt, Raster, Namen A1–L12, A1 oben links, gelber Pfeil, „Du bist in …" oben links. Die Namensnennung ist unten links weiterhin sichtbar. -2. Zeiger über der Karte bewegen: unten rechts erscheint `Name · x … / y …`. Den Zeiger über den Downtown-Kern führen — dort muss `B9` stehen. +2. Zeiger über der Karte bewegen: unten rechts erscheint `Name · x … / y …`. Den Zeiger über den Downtown-Bezugspunkt Welt `(−511, 254)` führen — dort muss `B9` stehen; über dem Southeast Financial Center `C12`. 3. Mausrad zoomt um den Zeiger bis vierfach; Ziehen verschiebt und stoppt am Kartenrand. 4. Ein Eingabefeld im Panel anklicken, dann M drücken: die Karte darf **nicht** aufgehen. 5. W gedrückt halten, M drücken, W loslassen, Karte schließen: die Figur darf **nicht** weiterlaufen. diff --git a/docs/superpowers/specs/2026-09-13-feinkalibrierung-design.md b/docs/superpowers/specs/2026-09-13-feinkalibrierung-design.md index 9ac8cd5..755abee 100644 --- a/docs/superpowers/specs/2026-09-13-feinkalibrierung-design.md +++ b/docs/superpowers/specs/2026-09-13-feinkalibrierung-design.md @@ -28,16 +28,16 @@ Eine Korrektur je `[[correction]]`-Tabelle. Koordinaten sind immer Welt-x und We ```toml [[correction]] -chunk = "C10" +chunk = "F3" action = "remove_building" at = [412, 1830] -reason = "Beschriftung STARFISH ISLAND, kein Gebäude" +reason = "Beschriftung der Originalkarte, kein Gebäude" [[correction]] -chunk = "B9" +chunk = "C12" action = "set_building_height" -at = [-490, 270] -height = 180 +at = [-461, -460] +height = 248 reason = "Southeast Financial Center, laut Skyline 248 m, Grundriss verfehlt" ``` @@ -118,7 +118,7 @@ mit `(x0, y0) → (x1, y1)` als Laufrichtung der Mittellinie am Laternenpunkt. E ## Ablauf im Chat -1. Der Nutzer öffnet die Minimap, liest etwa `C10 · x 412 / y 1830` ab und sagt, was dort anders sein soll. +1. Der Nutzer öffnet die Minimap, liest etwa `F3 · x 412 / y 1830` ab und sagt, was dort anders sein soll. 2. Claude trägt die Korrektur mit `reason` in `corrections.toml` ein. 3. Claude rendert einen vergrößerten Ausschnitt genau dieses Chunks aus den aktuellen Chunk-Dateien — **vorher**. 4. Claude lässt `run.py` und `overview.py` laufen. diff --git a/docs/superpowers/specs/2026-09-13-minimap-design.md b/docs/superpowers/specs/2026-09-13-minimap-design.md index 7ee20c0..6973917 100644 --- a/docs/superpowers/specs/2026-09-13-minimap-design.md +++ b/docs/superpowers/specs/2026-09-13-minimap-design.md @@ -92,7 +92,7 @@ name(i, j) = "ABCDEFGHIJKL"[i] + (j + 1) **Auf der Karte:** - Rasterlinien an allen Chunk-Grenzen. - Der Name steht in der Mitte jedes Chunks, sobald der Chunk auf dem Bildschirm mindestens 40 px breit ist; darunter nur die Linien. Beim Öffnen passt der ganze Ausschnitt ins Fenster, dann ist jeder Chunk auf gängigen Bildschirmen breit genug. -- Eine feste Anzeige unten rechts nennt Chunk-Name und Weltkoordinate der Stelle unter dem Mauszeiger, etwa `C10 · x 412 / y 1830`. Die Koordinate erlaubt, eine Stelle innerhalb eines Chunks genau zu benennen. +- Eine feste Anzeige unten rechts nennt Chunk-Name und Weltkoordinate der Stelle unter dem Mauszeiger, etwa `F3 · x 412 / y 1830`. Die Koordinate erlaubt, eine Stelle innerhalb eines Chunks genau zu benennen. - Der Chunk, in dem der Spieler gerade steht, ist hervorgehoben und sein Name steht fest in einer Ecke der Karte. ## Anbindung an vorhandene Funktionen @@ -153,7 +153,7 @@ Die Namensnennung steht unten links; die Koordinatenanzeige der Karte steht desh - `A1 ↔ (0, 0)`, `L1 ↔ (11, 0)`, `A12 ↔ (0, 11)`, `L12 ↔ (11, 11)`, `C10 ↔ (2, 9)` in beide Richtungen. - Kleinschreibung wird akzeptiert; `M1`, `A0`, `A13`, `A`, `10` und die leere Eingabe werden abgewiesen. - Für jeden der 144 Chunks ergibt `parseChunkName(chunkName(i, j))` wieder `(i, j)`. -- Ein Test, der die Namen mit der tatsächlichen Lage verbindet statt nur mit den Indizes: der Downtown-Kern bei Welt `(−511, 254)` ergibt über `chunkForWorld` `(i = 1, j = 8)` und damit `B9`. An der bestehenden Funktion nachgerechnet. +- Ein Test, der die Namen mit der tatsächlichen Lage verbindet statt nur mit den Indizes: der Downtown-Bezugspunkt aus `tools/extract/data/districts.json` bei Welt `(−511, 254)` ergibt über `chunkForWorld` `(i = 1, j = 8)` und damit `B9`; der höchste Turm, das Southeast Financial Center bei `(−461, −460)`, ergibt `C12`. An der bestehenden Funktion nachgerechnet. (Korrigiert nach Task 4: `(−511, 254)` ist der Mittelpunkt der westlichen Hochhäuser, nicht der Hochhauskern selbst.) **Ohne Browser (vitest), für `mapMath.js`:** - `worldToMap` und `mapToWorld` an bekannten Punkten: Spawn `(1699, 3, −743)` und alle vier Ecken des Ausschnitts; dazu Hin- und Rückweg ergibt wieder den Ausgangspunkt. Ein Test, der eine gespiegelte Achse sicher fängt.