ScopedVR Map Editor (Standalone-PC-App, Godot-Fundament) — M2, Platzhalter
Find a file
2026-10-15 12:01:17 +00:00
library M2: Map-Editor MVP App-Skelett — svmap laden/speichern (V1-V14), Viewport-Grundgeruest, Neue-Map-Dialog (t_5badf371) 2026-10-15 11:34:32 +02:00
scenes M2: Map-Editor MVP App-Skelett — svmap laden/speichern (V1-V14), Viewport-Grundgeruest, Neue-Map-Dialog (t_5badf371) 2026-10-15 11:34:32 +02:00
src Terrain: Godot .uid-Dateien der Terrain-Module committed (deterministischer Import) 2026-10-15 12:01:17 +00:00
tests Terrain: Godot .uid-Dateien der Terrain-Module committed (deterministischer Import) 2026-10-15 12:01:17 +00:00
.gitignore M2: Map-Editor MVP App-Skelett — svmap laden/speichern (V1-V14), Viewport-Grundgeruest, Neue-Map-Dialog (t_5badf371) 2026-10-15 11:34:32 +02:00
icon.svg M2: Map-Editor MVP App-Skelett — svmap laden/speichern (V1-V14), Viewport-Grundgeruest, Neue-Map-Dialog (t_5badf371) 2026-10-15 11:34:32 +02:00
icon.svg.import M2: Map-Editor MVP App-Skelett — svmap laden/speichern (V1-V14), Viewport-Grundgeruest, Neue-Map-Dialog (t_5badf371) 2026-10-15 11:34:32 +02:00
project.godot M2: Map-Editor MVP App-Skelett — svmap laden/speichern (V1-V14), Viewport-Grundgeruest, Neue-Map-Dialog (t_5badf371) 2026-10-15 11:34:32 +02:00
README.md README: Falle dokumentiert — nach Pull mit neuen class_name-Skripten erst --import (Klassen-Cache), sonst startet die GUI ohne UI 2026-10-15 09:58:43 +00:00

ScopedVR Map Editor

Standalone-PC-App zum Bauen von ScopedVR-Maps. Technisches Fundament: Godot 4.x (MIT-Lizenz, lizenzfrei, keine Fremd-Abhängigkeit). Creator sehen/brauchen Godot NIE — die App ist das Produkt (PLAN.md, Entscheidung 14).

⭐ Chef-Grundsatz (Sly, 15.10.): MAXIMALE NUTZERFREUNDLICHKEIT

„Der soll auf jeden Fall so nutzerfreundlich sein, wie es nur geht, damit echt richtig easy ist Maps zu bauen und es auch Spaß macht!"

Konkret heißt das für JEDE Editor-Karte:

  • Deutsch, große Buttons, Klartext-Beschriftungen — kein Fachchinesisch.
  • Klick statt Konsole: gewünschte Aktion per Maus erreichbar (ziehen, drehen, klicken), ohne Tastenkürzel auswendig zu lernen (Kürzel dürfen optional sein).
  • Sofortiges visuelles Feedback (Objekt leuchtet beim Anfassen, Vorschau vor dem Platzieren, Undo mit STRG+Z).
  • Die App hilft: ungültige Aktionen erklären WARUM („Spawn-Zone fehlt noch für Team Rot — klicke auf den Boden, um sie zu setzen").
  • Test-Benchmark: Sly baut ohne Anleitung in < 10 Minuten eine kleine Map.

Philosophie (Entscheidung 20 — GESCHLOSSENER Baukasten)

  • Objekte kommen ausschließlich aus der Spiel-Asset-Bibliothek (geprüfte Poly-Budgets).
  • KEINE freien Mesh-Imports. Konsistenz + Performance statt unbegrenzter Freiheit.
  • Performance-Prüfung ist eingebaut (Objekt-Count-/Poly-Limits), nicht optional.

MVP-Werkzeuge (Reihenfolge = Karten-Kette)

  1. Terrain — Höhenfeld bearbeiten (heben/senken/glätten), Sniper-Distanzen 100–800 m (Entscheidung 7).
  2. Objekt-Platzierung — Bibliothek-Browser, platzieren/drehen/verschieben.
  3. Spawn-Zonen — pro Team (TDM), Validierung gegen Regeln.
  4. Map-Metadaten — Name, Autor, Version, Wetter-Preset (mittag/abend/regen/nacht, siehe Weather-System 9ebe8ef/a296986).
  5. Performance-Check — Objekt-Count/Poly-Budget gegen die FPS-Baseline.
  6. Export — .svmap-Paket (Format: docs/map_format.md im scopedvr-match-server Repo, Karte t_74976e9f).

Architektur (MVP)

  • Godot 4.x Desktop-App (die Editor-UI IST Godot-Control-UI — pragmatisches MVP).
  • Map-Datenmodell = 1:1 das svmap-Format (kein internes Zwischenformat → kein Konverter).
  • Speichern/Laden direkt auf .svmap; Export = Kopie + Validierung.

Milestone-Zuordnung

M2 (siehe PLAN.md §6): Map-Paket-Format → Editor-MVP → erste offizielle Map (offenes Gelände) → Map-Repo/Release-Workflow über Forgejo (M3).

Status (M2, Karte t_40d855d0 — UX-Fundament FERTIG)

UX-Fundament auf dem App-Skelett (t_5badf371), nach dem Chef-Grundsatz gebaut:

(Unverändert darunter: svmap laden/speichern V1–V14 mit Prüfsummen-Interop, Neue-Map-Dialog mit 4 Pflicht-Spawns pro Team, Orbit-Viewport mit Gitter/ Boden/Wetter-Stimmung — siehe Commit 84bc081 und svmap_io.gd.)

  • Undo/Redo (src/editor/action_history.gd): zentrale ActionHistory über die svmap-Ober-Blöcke (objects/terrain/spawn_zones — tiefe Kopien vor und nach jeder Änderung, merge_tags gegen Mausrad-Tick-Fluten, Max-Stufe 100). Strg+Z / Strg+Y UND große Buttons „↩ Rückgängig / ↪ Wiederholen" oben. Spätere Werkzeuge melden sich mit snapshot(keys) vor und commit(desc, before, after) nach der Änderung an — Terrain-Strokes und Spawn-Zonen landen damit automatisch in derselben History.
  • Objekt-Platzierung mit Ghost-Preview (src/editor/interaction.gd): Bibliothek links (deutsche Namen + Poly-Zahl), Klick startet den Platzier-Modus — eine transparente Vorschau schwebt am Cursor auf dem Boden (Höhe kommt aus dem Terrain), Klick setzt, Rechtsklick/ESC bricht ab, Mausrad dreht die Vorschau VOR dem Setzen (15°-Raster). Modus bleibt an für schnelles Mehrfachsetzen. Poly-Budget wird VOR dem Platzieren geprüft.
  • Auswahl-Anfassen: Klick wählt ein Objekt (orange + Emission), Ziehen verschiebt es (auf Terrain-Höhe geclampt in der Map), R-Taste ODER Mausrad dreht (15°-Raster, Shift+R zurück), Entf löscht. Auch über den Objekt-Baum wählbar (beide Wege bleiben synchron). Panel „Auswahl“ rechts zeigt Position/ Richtung + Bedienhinweise.
  • Helfende Meldungen: Statusleiste unten erklärt nach jeder Aktion den NÄCHSTEN Schritt („Klicke in die Karte“, „Strg+Z holt es zurück“, Budget-Warnung ab 80 %). Fehler-Dialoge bleiben Klartext, keine Godot-Texte im sichtbaren UI.
  • Deutsche, große UI: Schrift 16 px Basis (≥ 14 px überall), Buttons/ Klickflächen ≥ 40 px Höhe, Mausrad-Konflikt gelöst: Rad dreht Objekt/ Vorschau, wenn eines aktiv ist — sonst zoomt es die Kamera.
  • Tests: tests/test_ux.gd (History-Roundtrips setzen/löschen/verschieben/ drehen, Merge-Tag-Verhalten, Alias-Sicherheit der Snapshots, Kapazität, Terrain-Höhen-Abfrage, Platzhalter-Meshes). Lauf: godot --headless --path . --script res://tests/test_ux.gd

Bekannte Falle (15.10. live passiert): Nach git pull mit NEUEN class_name-Skripten (z. B. action_history.gd) muss einmal godot --headless --import laufen, bevor die GUI gestartet wird — sonst ist der globale Klassen-Cache (.godot/) alt, main.gd wirft „Identifier not declared" und das Fenster startet ohne UI. Symptom: Parse-Errors im App-Log trotz grünem Test-Lauf (der ja selbst mit importiertem Cache lief).

Bibliothek: library/objects.json ist die Editor-Kopie der offiziellen Registry aus dem Match-Server-Repo — neue Objekte DORT registrieren und hier synchron ziehen (IDs sind der Vertrag, Entscheidung 20).

Noch offen (folgende Karten der MVP-Kette): Terrain-Werkzeuge (heben/senken/glätten — nutzen ActionHistory mit ["terrain"]), Spawn-Zonen-Editor, Performance-Check-UI, Export-Workflow.