diff --git a/README.md b/README.md index fa4844a..bf112aa 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,12 @@ Ungültige oder fehlende Abläufe machen nur dieses Format unauswählbar (mit Be Die Wahl wird als `mp_teamname_1` (Team mit CT-Start) und `mp_teamname_2` (T-Start) an den Server übergeben. +### Bilder für Maps und Seitenwahl + +- **Map-Bilder** liegen lokal unter `client/public/maps/.webp` (960 px breit, je ca. 50–90 KB). `"image"` in `map-pools.json` verweist darauf. Neue oder fehlende Bilder lädt `npm run images` von [ghostcap-gaming/cs2-map-images](https://github.com/ghostcap-gaming/cs2-map-images), verkleinert sie und trägt den Pfad ein (`npm run images -- --force` lädt alle neu). Die Bilder stammen aus dem Spiel; die Rechte liegen bei Valve. Ohne Bild zeigt die Kachel ein Muster in der Map-Farbe. +- **Seiten-Embleme** für CT und T liegen unter `client/public/sides/ct.png` und `client/public/sides/t.png` (quadratisch, z. B. 256×256). Fehlt eine Datei, erscheint ein schlichtes Ersatzsymbol. +- Bestehende Matches behalten die Map-Liste, mit der sie erstellt wurden. Neue Bilder erscheinen in neu erstellten Matches. + > Die mitgelieferten Map-Pools entsprechen dem Stand der Entwicklung. Valve ändert den aktiven Map-Pool regelmäßig. Map-IDs bitte gegen die eigene Serverinstallation prüfen. Eine Map, die nicht existiert, führt zu „Konfiguration fehlgeschlagen“ mit Meldung. --- diff --git a/client/public/maps/de_ancient.webp b/client/public/maps/de_ancient.webp new file mode 100644 index 0000000..f6533af Binary files /dev/null and b/client/public/maps/de_ancient.webp differ diff --git a/client/public/maps/de_anubis.webp b/client/public/maps/de_anubis.webp new file mode 100644 index 0000000..a2363eb Binary files /dev/null and b/client/public/maps/de_anubis.webp differ diff --git a/client/public/maps/de_dust2.webp b/client/public/maps/de_dust2.webp new file mode 100644 index 0000000..e8582d7 Binary files /dev/null and b/client/public/maps/de_dust2.webp differ diff --git a/client/public/maps/de_inferno.webp b/client/public/maps/de_inferno.webp new file mode 100644 index 0000000..acc3a64 Binary files /dev/null and b/client/public/maps/de_inferno.webp differ diff --git a/client/public/maps/de_mirage.webp b/client/public/maps/de_mirage.webp new file mode 100644 index 0000000..6314a48 Binary files /dev/null and b/client/public/maps/de_mirage.webp differ diff --git a/client/public/maps/de_nuke.webp b/client/public/maps/de_nuke.webp new file mode 100644 index 0000000..a4272dd Binary files /dev/null and b/client/public/maps/de_nuke.webp differ diff --git a/client/public/maps/de_overpass.webp b/client/public/maps/de_overpass.webp new file mode 100644 index 0000000..e18dd44 Binary files /dev/null and b/client/public/maps/de_overpass.webp differ diff --git a/client/public/maps/de_train.webp b/client/public/maps/de_train.webp new file mode 100644 index 0000000..736c9e4 Binary files /dev/null and b/client/public/maps/de_train.webp differ diff --git a/client/public/maps/de_vertigo.webp b/client/public/maps/de_vertigo.webp new file mode 100644 index 0000000..ca120d3 Binary files /dev/null and b/client/public/maps/de_vertigo.webp differ diff --git a/client/src/components/MapImage.jsx b/client/src/components/MapImage.jsx new file mode 100644 index 0000000..0d4f115 --- /dev/null +++ b/client/src/components/MapImage.jsx @@ -0,0 +1,17 @@ +import { useState } from 'react'; + +/** + * Map-Bild aus der Konfiguration (map.image). Lädt das Bild nicht, bleibt das + * gezeichnete Muster in Map-Farbe darunter sichtbar. + */ +export default function MapImage({ map, className = '' }) { + const [failed, setFailed] = useState(false); + return ( + + ); +} diff --git a/client/src/components/SeriesList.jsx b/client/src/components/SeriesList.jsx index 2ad698c..dd2e2c3 100644 --- a/client/src/components/SeriesList.jsx +++ b/client/src/components/SeriesList.jsx @@ -1,3 +1,6 @@ +import MapImage from './MapImage.jsx'; +import SideIcon from './SideIcon.jsx'; + const STATUS = { pending: 'Ausstehend', next: 'Wird eingerichtet', live: 'Aktuell', done: 'Gespielt' }; export default function SeriesList({ state }) { @@ -12,13 +15,19 @@ export default function SeriesList({ state }) { const t = s.ctTeam ? teams[s.ctTeam === 'A' ? 'B' : 'A'].name : null; return (
  • + Map {s.number} {s.mapName} {s.pickedBy ? `Pick von ${teams[s.pickedBy].name}` : 'Entscheidungsmap'} - {ct ? <>CT: {ct} T: {t} : 'Seiten im Spiel festlegen'} + {ct ? ( + <> + {ct} + {t} + + ) : 'Seiten im Spiel festlegen'} {STATUS[s.status]}
  • diff --git a/client/src/components/SideIcon.jsx b/client/src/components/SideIcon.jsx new file mode 100644 index 0000000..f92ae45 --- /dev/null +++ b/client/src/components/SideIcon.jsx @@ -0,0 +1,36 @@ +import { useState } from 'react'; + +// Emblem-Dateien in client/public/sides/. Fehlen sie, wird ein schlichtes Ersatzsymbol gezeichnet. +const IMAGES = { CT: '/sides/ct.png', T: '/sides/t.png' }; + +export default function SideIcon({ side, size = 28 }) { + const [failed, setFailed] = useState(false); + if (!failed) { + return ( + setFailed(true)} /> + ); + } + return ; +} + +function FallbackIcon({ side, size }) { + if (side === 'CT') { + return ( + + ); + } + return ( + + ); +} diff --git a/client/src/components/VetoBoard.jsx b/client/src/components/VetoBoard.jsx index 7903bc3..22dbbd7 100644 --- a/client/src/components/VetoBoard.jsx +++ b/client/src/components/VetoBoard.jsx @@ -1,5 +1,7 @@ import { useEffect, useState } from 'react'; import { clock } from '../lib/labels.js'; +import MapImage from './MapImage.jsx'; +import SideIcon from './SideIcon.jsx'; const STEP_SHORT = { ban: 'Ban', pick: 'Pick', side: 'Seite', decider: 'Decider' }; @@ -57,7 +59,7 @@ export default function VetoBoard({ state, viewer, act, busy, compact = false }) aria-pressed={isSel} aria-label={`${meta.name}: ${statusText(m, teams)}`} > -