/* Freier Laufmodus im Dungeon (assets/js/dungeon-freemove.js) */
.dg-free-frame {
  position: relative; box-sizing: border-box; overflow: hidden;
  border: 4px solid var(--dg-wall-col); border-radius: 6px;
  box-shadow: 0 0 0 6px var(--dg-bg), 0 16px 48px rgba(0,0,0,0.9);
  width: min(100%, 96cqh); aspect-ratio: 1 / 1;
}
@supports not (container-type: size) { .dg-free-frame { width: 100%; } }
.dg-free-slide.dg-grid {
  position: absolute; border: 0; box-shadow: none; border-radius: 0; overflow: visible;
  aspect-ratio: auto; max-width: none; will-change: transform;
}
/* Kacheln liegen absolut in der Welt-Ebene (left/top inline; --cw/--ch = Kachelgröße) → Raster wird beim Laufen nur am Rand aufgefrischt */
.dg-free-slide > .dg-cell { position: absolute; width: var(--cw); height: var(--ch); }
.dg-ent-layer { position: absolute; inset: 0; pointer-events: none; z-index: 6; }
.dg-ent {
  position: absolute; transform: translate(-50%, -50%); box-sizing: border-box;
  pointer-events: none; will-change: left, top;
}
.dg-ent .dg-decor-btn, .dg-ent [data-decor-room] { pointer-events: auto; }
.dg-ent-player { filter: drop-shadow(0 2px 1px rgba(0,0,0,0.35)); }
.dg-ent .dg-avatar-mini { animation: none; }
.dg-ent.mv .dg-avatar-mini { animation: baseFreeStep var(--leg-t, 0.3s) ease-in-out infinite !important; }
.dg-ent .dg-field-ent { inset: 4%; }
.dg-ent.mv .dg-field-ent .dg-decor-npc-wrap { animation: none !important; }
.dg-ent.dash .dg-ent-mark { transform: translateX(-50%) scale(1.15); }

/* Beine / Arme im Schritttakt */
.dg-ent.mv .px-l-legL { animation: pxLegA var(--leg-t, 0.3s) linear infinite; }
.dg-ent.mv .px-l-legR { animation: pxLegB var(--leg-t, 0.3s) linear infinite; }
.dg-ent.mv .px-body { animation: pxStrideBob var(--leg-t, 0.3s) linear infinite; }
.dg-ent.mv .px-arm-left { animation: pxArmSwingA var(--leg-t, 0.3s) ease-in-out infinite; }
.dg-ent.mv .px-arm-right { animation: pxArmSwingB var(--leg-t, 0.3s) ease-in-out infinite; }

/* Figuren auf Kachelgröße skalieren (--avs aus dungeon-freemove.js): Figur ≈ 1 Kachel hoch, Füße auf der Kachelunterkante */
.dg-ent .dg-player-wrap, .dg-ent .dg-decor-npc-wrap { position: absolute; inset: 0; display: block; }
.dg-ent .dg-avatar-mini, .dg-ent .dg-decor-npc-avatar {
  position: absolute; left: 50%; bottom: 0; margin-left: -27px; max-width: none; max-height: none;
  scale: var(--avs, 1); transform-origin: 50% 100%;
}
.dg-ent .dg-ent-mark { bottom: calc(74px * var(--avs, 1) - 2px); }
.dg-ent .dg-speech-bubble { bottom: calc(74px * var(--avs, 1) + 6px); }
.dg-ent .dg-player-wrap, .dg-ent .dg-decor-npc-wrap { transform: none; }   /* die Handy-Verkleinerung (0.75) ersetzt --avs */

/* Flavortext als Sprechblase über der Spielfigur (D.say) */
.dg-ent .dg-say { font-size: clamp(0.8rem, calc(0.3rem + 0.45rem * var(--avs, 1)), 1.25rem); max-width: calc(130px * var(--avs, 1)); white-space: normal; }
.dg-ent-player:has(.dg-say) { z-index: 500 !important; }

/* Suedtueren: volles 1x1-Tuerbild vor der Figur, ohne weisse Silhouette. */
.dg-front-layer { position: absolute; inset: 0; pointer-events: none; z-index: 8; }
.dg-sdoor { position: absolute; display: block; pointer-events: auto; cursor: pointer; image-rendering: pixelated; background-size: 100% 100%; background-repeat: no-repeat; filter: drop-shadow(0 3px 0 rgba(0, 0, 0, 0.35)); }
.dg-sdoor .dg-ndoor-q { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; padding-bottom: 6%; color: #fff; font: 900 1.15em/1 "Arial Black", Arial, sans-serif; text-shadow: 0 0 5px #000, 0 1px 0 #000; pointer-events: none; }
/* Tiefe: Boden direkt unter einer Nordwand liegt im Schatten der Wand */
.dg-cell.dg-has-face:not(.dg-door-n) { box-shadow: inset 0 12px 12px -9px rgba(0, 0, 0, 0.4); }

/* Perspektive: Südwand liegt VOR der Figur (Unterkörper verschwindet hinter der Wandkante), Figuren-Ebene hat z 6 */
.dg-free-slide .dg-cell > .pxw-s { z-index: 9; }

/* Durchschreitbare Objekte: unter der Figur transparent statt unsichtbar */
.dg-cell > * { transition: opacity 0.12s ease; }
.dg-cell.dg-walkover > *:not(.pxw):not(.dg-ndoor):not(.dg-door-question):not(.dg-crack) { opacity: 0.45; }

/* Sprechblasen in der Figuren-Ebene: kein Neu-Einblenden bei jedem Neuzeichnen (Kachelwechsel) → kein Flackern */
.dg-ent .dg-speech-bubble, .dg-ent .dg-say, .dg-free-slide .dg-speech-bubble { animation: none !important; }   /* auch Blasen statischer Objekte in den Rasterzellen (Pflegewagen …) */

/* Aktive Sprechblase eines festen Objekts (Pflanze …): Zelle bleibt UNTER der Figuren-Ebene (z 6), sonst läuft die Figur "hinter" dem Objekt */
.dg-free-slide .dg-cell.dg-speech-active { z-index: 5; }
