docs: Downtown-Bezugspunkt statt Downtown-Kern, stimmige Koordinatenbeispiele

(−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 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Opus 5 committed 2026-09-13 11:36:59 +02:00
1 parent 2ece0decb6
commit 61ef30f081
4 files changed
+31 -22

No files matched your search

@@ -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.
+12 -5
View File
@@ -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 "…" -- <pfade>`.
- **`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.
@@ -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.
@@ -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.