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:
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.
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in new issue
Block a user