;;; alien-rpg.el --- Přístupný herní engine pro Alien RPG -*- lexical-binding: t; -*-
;;
;; Autor: Accessibility tool pro nevidomého hráče
;; Popis: Interaktivní navigace, sledování stavu, hod kostkou.
;;        Všechna data v Elispu — žádné hledání v souborech.
;;        Ovládání přes SPC G (Doom Emacs leader prefix).
;;
;; Filosofie:
;;   - NULA závislosti na čtení org souborů během hry
;;   - Minibuffer-driven: completion, ne hledání
;;   - Jeden stisk → odpověď. Žádné scrollování.
;;   - Přesnost: pouze data ověřená z PDF. Žádné vymyšlené dveře.
;;
;;; Code:

(require 'cl-lib)

;; ══════════════════════════════════════════════════════════════
;; DATA: Paluby
;; ══════════════════════════════════════════════════════════════

(defvar alien-rpg-decks
  '((:id "A" :name "Astrometrická observatoř"
     :purpose "Astronomické pozorování"
     :size "Malá (A2)"
     :scale "5 m"
     :position 1
     :notes "Izolovaná od centrální šachty. Přístup pouze z paluby B (západ). Slepá ulička.")

    (:id "B" :name "Řízení provozu"
     :purpose "Velitelský můstek, řízení stanice"
     :size "Střední (A2)"
     :scale "5 m"
     :position 2
     :notes "Strategicky nejdůležitější paluba. MU/TH/UR (hlavní počítač) a řídící středisko.")

    (:id "C" :name "Zdraví a odpočinek"
     :purpose "Medicína, rekreace, botanika"
     :size "Střední (A2)"
     :scale "5 m"
     :position 3
     :notes "Ošetřovna, laboratoř, arboretum, hydroponické zahrady.")

    (:id "D" :name "Recepce a výzkum"
     :purpose "Vědecké laboratoře, příjem návštěvníků"
     :size "Střední (A2)"
     :scale "5 m"
     :position 4
     :notes "Návštěvnický dokovací port (přístup do vesmíru). Astrofyzikální laboratoř.")

    (:id "E" :name "Kajuty a stravování"
     :purpose "Ubytování posádky, stravování"
     :size "Střední (A2)"
     :scale "5 m"
     :position 5
     :notes "6 kajut, jídelna, tělocvična. Poslední 'civilizovaná' paluba.")

    (:id "F" :name "Nápravné zařízení"
     :purpose "Vězeňské zařízení"
     :size "Velká (A1)"
     :scale "5 m"
     :position 6
     :notes "ZBROJNICE (sever-střed). Symetrické: západ = východ. 6 průlezů na G.")

    (:id "G" :name "Hangáry a údržba"
     :purpose "Hangáry, dokovací porty, údržba"
     :size "Velká (A1)"
     :scale "5 m"
     :position 7
     :notes "2 hangáry, 2 dok. porty, 4 EVA pody, kryopody. Nejvíce průlezů (9).")

    (:id "H" :name "Průmyslový komplex"
     :purpose "Energetika, průmysl, tavení"
     :size "Velmi velká (A1, 10m měřítko)"
     :scale "10 m"
     :position 8
     :notes "NEJVĚTŠÍ paluba! Nádrž toxických plynů, plasma, dílny. Průlezy na G.")

    (:id "I" :name "Záchranné moduly"
     :purpose "Evakuace — únikové kapsle"
     :size "Střední (A2)"
     :scale "5 m"
     :position 9
     :notes "Záchranné moduly/kapsle. Na mapě bez textových popisků místností.")

    (:id "J" :name "Strojovna reaktoru"
     :purpose "Energetický reaktor stanice"
     :size "Střední (A2)"
     :scale "5 m"
     :position 10
     :notes "Nejnižší paluba. 3 baterie. Slepá ulička (jen nahoru). Zničení = konec stanice."))
  "Data o palubách stanice. Ověřeno z PDF textových vrstev.")

;; ══════════════════════════════════════════════════════════════
;; DATA: Místnosti
;; ══════════════════════════════════════════════════════════════

(defvar alien-rpg-rooms
  '(;; === Paluba A ===
    (:id "A-observatoř" :deck "A" :name "Observatoř"
     :location "Celá paluba" :note "Jeden velký otevřený prostor. Pravděpodobně kopule/okna."
     :connections ("B-průchod-A"))

    ;; === Paluba B ===
    (:id "B-observatoř" :deck "B" :name "Observatoř"
     :location "Sever" :note "Pozorovací místnost"
     :connections ("B-kancelář-vedoucího" "B-řídící-středisko"))
    (:id "B-kancelář-vedoucího" :deck "B" :name "Kancelář vedoucího stanice"
     :location "Sever-střed" :note "Může obsahovat důležité dokumenty/přístupy"
     :connections ("B-observatoř" "B-zasedací" "B-řídící-středisko"))
    (:id "B-zasedací" :deck "B" :name "Zasedací místnost"
     :location "Severozápad" :note "Porady"
     :connections ("B-kancelář-vedoucího" "B-průchod-A"))
    (:id "B-řídící-středisko" :deck "B" :name "Řídící středisko"
     :location "Sever-východ" :note "Hlavní velín. Monitorování a ovládání systémů stanice."
     :connections ("B-observatoř" "B-kancelář-vedoucího" "B-wc-horní"))
    (:id "B-wc-horní" :deck "B" :name "WC (horní)"
     :location "Východ" :note ""
     :connections ("B-řídící-středisko" "B-wc-dolní"))
    (:id "B-wc-dolní" :deck "B" :name "WC (dolní)"
     :location "Východ" :note ""
     :connections ("B-wc-horní" "B-kuchyňka"))
    (:id "B-průchod-A" :deck "B" :name "Průchod na palubu A"
     :location "Západ" :note "Jediný přístup na palubu A"
     :connections ("B-zasedací" "A-observatoř" "B-mu-th-ur"))
    (:id "B-mu-th-ur" :deck "B" :name "MU/TH/UR"
     :location "Jih-střed" :note "Hlavní počítač stanice (Mother). Protokoly, logy, senzory."
     :connections ("B-průchod-A" "B-kuchyňka" "B-centrální-šachta"))
    (:id "B-kuchyňka" :deck "B" :name "Kuchyňka"
     :location "Jihovýchod" :note ""
     :connections ("B-mu-th-ur" "B-sklad" "B-wc-dolní"))
    (:id "B-sklad" :deck "B" :name "Sklad"
     :location "Jihovýchod (jižněji)" :note ""
     :connections ("B-kuchyňka" "B-centrální-šachta"))
    (:id "B-centrální-šachta" :deck "B" :name "Centrální šachta"
     :location "Střed" :note "Přístup na paluby C–J"
     :connections ("B-mu-th-ur" "B-sklad"
                   "C-centrální-šachta" "D-centrální-šachta" "E-centrální-šachta"
                   "F-centrální-šachta" "G-centrální-šachta" "H-centrální-šachta"
                   "I-centrální-šachta" "J-centrální-šachta"))

    ;; === Paluba C ===
    (:id "C-společenská" :deck "C" :name "Společenská místnost"
     :location "Sever-střed" :note "Velká místnost pro odpočinek"
     :connections ("C-sauna" "C-ošetřovna" "C-centrální-šachta"))
    (:id "C-sauna" :deck "C" :name "Sauna, sprchy, WC"
     :location "Severovýchod" :note "Sauna, sprchy, WC — společná zóna. Vlhko, pára."
     :connections ("C-společenská" "C-zotavovací"))
    (:id "C-ošetřovna" :deck "C" :name "Ošetřovna a laboratoř"
     :location "Sever-západ" :note "Léčení a analýza vzorků. Vědecké vybavení."
     :connections ("C-společenská" "C-kajuta-lékař"))
    (:id "C-zotavovací" :deck "C" :name "Zotavovací místnost"
     :location "Sever-východ" :note "Pro rekonvalescenci"
     :connections ("C-sauna" "C-kajuta-vedoucí"))
    (:id "C-kajuta-lékař" :deck "C" :name "Kajuta/kancelář lékařského důstojníka"
     :location "Střed-západ" :note "Bydlení a pracoviště lékaře"
     :connections ("C-ošetřovna" "C-arboretum"))
    (:id "C-kajuta-vedoucí" :deck "C" :name "Kajuta vedoucího stanice"
     :location "Střed-východ" :note "Soukromé bydlení velitele. Může mít speciální přístupy."
     :connections ("C-zotavovací" "C-arboretum"))
    (:id "C-arboretum" :deck "C" :name "Arboretum"
     :location "Střed" :note "Velký zelený prostor. Úkryt i past."
     :connections ("C-kajuta-lékař" "C-kajuta-vedoucí" "C-hydro-zz" "C-hydro-v" "C-centrální-šachta"))
    (:id "C-hydro-zz" :deck "C" :name "Hydroponické zahrady (západ)"
     :location "Jihozápad" :note "Dvě zahrady vedle sebe. Produkce potravin."
     :connections ("C-arboretum"))
    (:id "C-hydro-v" :deck "C" :name "Hydroponická zahrada (východ)"
     :location "Jihovýchod" :note "Třetí zahrada"
     :connections ("C-arboretum"))
    (:id "C-centrální-šachta" :deck "C" :name "Centrální šachta"
     :location "Střed" :note "Přístup na paluby B, D–J"
     :connections ("C-společenská" "C-arboretum"
                   "B-centrální-šachta" "D-centrální-šachta" "E-centrální-šachta"
                   "F-centrální-šachta" "G-centrální-šachta" "H-centrální-šachta"
                   "I-centrální-šachta" "J-centrální-šachta"))

    ;; === Paluba D ===
    (:id "D-měřící" :deck "D" :name "Měřící stanice"
     :location "Sever-střed" :note "Vědecké měření"
     :connections ("D-astro-lab" "D-kajuta-vědec"))
    (:id "D-astro-lab" :deck "D" :name "Astrofyzikální laboratoř"
     :location "Severozápad" :note "Hlavní vědecké pracoviště. Vybavení pro výzkum."
     :connections ("D-měřící" "D-centrální-šachta"))
    (:id "D-kajuta-vědec" :deck "D" :name "Kajuta/kancelář vědeckého důstojníka"
     :location "Severovýchod" :note "Bydlení a pracoviště vědce"
     :connections ("D-měřící" "D-wc"))
    (:id "D-wc" :deck "D" :name "WC (dvě)"
     :location "Střed-východ" :note "Dvě WC nad sebou"
     :connections ("D-kajuta-vědec" "D-recepce"))
    (:id "D-kancelář-inženýr" :deck "D" :name "Kancelář vedoucího inženýra"
     :location "Jihozápad" :note "Technické informace o stanici"
     :connections ("D-sklad" "D-recepce"))
    (:id "D-sklad" :deck "D" :name "Sklad"
     :location "Jihozápad (pod kanceláří)" :note "Zásoby, improvizované zbraně"
     :connections ("D-kancelář-inženýr"))
    (:id "D-recepce" :deck "D" :name "Recepce a VIP salónek"
     :location "Střed-jih" :note "Příjem návštěvníků. Otevřený prostor — špatné krytí."
     :connections ("D-wc" "D-kancelář-inženýr" "D-dokovací-port" "D-centrální-šachta"))
    (:id "D-dokovací-port" :deck "D" :name "Návštěvnický dokovací port"
     :location "Jih" :note "Přistání návštěvnických lodí. Přístup do vesmíru!"
     :connections ("D-recepce"))
    (:id "D-centrální-šachta" :deck "D" :name "Centrální šachta"
     :location "Střed" :note "Přístup na paluby B–C, E–J"
     :connections ("D-astro-lab" "D-recepce"
                   "B-centrální-šachta" "C-centrální-šachta" "E-centrální-šachta"
                   "F-centrální-šachta" "G-centrální-šachta" "H-centrální-šachta"
                   "I-centrální-šachta" "J-centrální-šachta"))

    ;; === Paluba E ===
    (:id "E-sklad" :deck "E" :name "Sklad"
     :location "Severozápad" :note "Zásoby"
     :connections ("E-kajuta-1" "E-prádelna"))
    (:id "E-prádelna" :deck "E" :name "Prádelna"
     :location "Sever-střed-východ" :note "Chemikálie"
     :connections ("E-sklad" "E-kajuta-2"))
    (:id "E-kajuta-1" :deck "E" :name "Kajuta 1 (levá horní)"
     :location "Západ, řada 1" :note "Barikádovatelná"
     :connections ("E-sklad" "E-kajuta-2" "E-kajuta-3" "E-chodba"))
    (:id "E-kajuta-2" :deck "E" :name "Kajuta 2 (pravá horní)"
     :location "Východ, řada 1" :note "Barikádovatelná"
     :connections ("E-prádelna" "E-kajuta-1" "E-kajuta-4" "E-chodba"))
    (:id "E-kajuta-3" :deck "E" :name "Kajuta 3 (levá střední)"
     :location "Západ, řada 2" :note "Barikádovatelná"
     :connections ("E-kajuta-1" "E-kajuta-4" "E-kajuta-5" "E-chodba"))
    (:id "E-kajuta-4" :deck "E" :name "Kajuta 4 (pravá střední)"
     :location "Východ, řada 2" :note "Barikádovatelná"
     :connections ("E-kajuta-2" "E-kajuta-3" "E-kajuta-6" "E-chodba"))
    (:id "E-kajuta-5" :deck "E" :name "Kajuta 5 (levá dolní)"
     :location "Západ, řada 3" :note "Barikádovatelná"
     :connections ("E-kajuta-3" "E-kajuta-6" "E-chodba"))
    (:id "E-kajuta-6" :deck "E" :name "Kajuta 6 (pravá dolní)"
     :location "Východ, řada 3" :note "Barikádovatelná"
     :connections ("E-kajuta-4" "E-kajuta-5" "E-chodba"))
    (:id "E-chodba" :deck "E" :name "Centrální chodba"
     :location "Střed" :note "Propojuje kajuty, jídelnu a centrální šachtu"
     :connections ("E-kajuta-1" "E-kajuta-2" "E-kajuta-3" "E-kajuta-4"
                   "E-kajuta-5" "E-kajuta-6" "E-jídelna" "E-centrální-šachta"))
    (:id "E-jídelna" :deck "E" :name "Jídelna"
     :location "Střed" :note "Velký otevřený prostor. Dobrý přehled ale špatné krytí."
     :connections ("E-chodba" "E-wc" "E-sprchy-z" "E-šatna" "E-centrální-šachta"))
    (:id "E-wc" :deck "E" :name "WC"
     :location "Západ" :note ""
     :connections ("E-jídelna" "E-sprchy-z"))
    (:id "E-sprchy-z" :deck "E" :name "Sprchy (západ)"
     :location "Jihozápad" :note ""
     :connections ("E-wc" "E-jídelna"))
    (:id "E-šatna" :deck "E" :name "Šatna a sprchy (východ)"
     :location "Střed-východ" :note ""
     :connections ("E-jídelna" "E-tělocvična"))
    (:id "E-tělocvična" :deck "E" :name "Tělocvična"
     :location "Jihovýchod" :note "Improvizované zbraně (tyče, závaží)"
     :connections ("E-šatna"))
    (:id "E-centrální-šachta" :deck "E" :name "Centrální šachta"
     :location "Střed" :note "Přístup na paluby B–D, F–J"
     :connections ("E-chodba" "E-jídelna"
                   "B-centrální-šachta" "C-centrální-šachta" "D-centrální-šachta"
                   "F-centrální-šachta" "G-centrální-šachta" "H-centrální-šachta"
                   "I-centrální-šachta" "J-centrální-šachta"))

    ;; === Paluba F ===
    (:id "F-vězeňská-služba" :deck "F" :name "Vězeňská služba"
     :location "Severozápad" :note "Kanceláře vězeňského personálu"
     :connections ("F-údržba-androidů" "F-zbrojnice" "F-sprchy-z"))
    (:id "F-příprava-stravy" :deck "F" :name "Příprava stravy"
     :location "Severovýchod" :note ""
     :connections ("F-ošetřovna" "F-zbrojnice" "F-prádelna"))
    (:id "F-údržba-androidů" :deck "F" :name "Údržba androidů"
     :location "Západ" :note "Opravy/reprogramování androidů"
     :connections ("F-vězeňská-služba" "F-sprchy-z"))
    (:id "F-zbrojnice" :deck "F" :name "Zbrojnice"
     :location "Sever-střed" :note "*** ZBRANĚ *** Klíčové místo!"
     :connections ("F-vězeňská-služba" "F-příprava-stravy" "F-kuchyně"))
    (:id "F-ošetřovna" :deck "F" :name "Ošetřovna"
     :location "Východ" :note "Vězeňská ošetřovna"
     :connections ("F-příprava-stravy" "F-prádelna"))
    (:id "F-kuchyně" :deck "F" :name "Kuchyně"
     :location "Střed (pod zbrojnicí)" :note ""
     :connections ("F-zbrojnice" "F-centrální-šachta"))
    (:id "F-sprchy-z" :deck "F" :name "Sprchy (západ)"
     :location "Krajní západ" :note ""
     :connections ("F-vězeňská-služba" "F-údržba-androidů" "F-sklad-z"))
    (:id "F-sprchy-v" :deck "F" :name "Sprchy (východ)"
     :location "Krajní východ" :note ""
     :connections ("F-prádelna" "F-sklad-v"))
    (:id "F-prádelna" :deck "F" :name "Prádelna"
     :location "Východ" :note ""
     :connections ("F-příprava-stravy" "F-ošetřovna" "F-sprchy-v"))
    (:id "F-sklad-z" :deck "F" :name "Sklad (západ)"
     :location "Střed-západ" :note ""
     :connections ("F-sprchy-z" "F-wc-z" "F-centrální-šachta"))
    (:id "F-sklad-v" :deck "F" :name "Sklad (východ)"
     :location "Střed-východ" :note ""
     :connections ("F-sprchy-v" "F-wc-v" "F-centrální-šachta"))
    (:id "F-wc-z" :deck "F" :name "WC (západ)"
     :location "Střed-západ" :note ""
     :connections ("F-sklad-z" "F-průlez-F1" "F-průlez-F5"))
    (:id "F-wc-v" :deck "F" :name "WC (východ)"
     :location "Střed-východ" :note ""
     :connections ("F-sklad-v" "F-průlez-F2" "F-průlez-F6"))
    (:id "F-cely-z" :deck "F" :name "Cely (západ)"
     :location "Jihozápad" :note "Vězeňské cely — západní blok. Vězni = spojenci i hrozby."
     :connections ("F-průlez-F1" "F-průlez-F7" "F-sklady-jih"))
    (:id "F-cely-v" :deck "F" :name "Cely (východ)"
     :location "Jihovýchod" :note "Vězeňské cely — východní blok"
     :connections ("F-průlez-F2" "F-průlez-F8" "F-sklady-jih"))
    (:id "F-sklady-jih" :deck "F" :name "Sklady (jih, 4 kusy)"
     :location "Jih-střed" :note "Čtyři skladové místnosti v bloku 2×2"
     :connections ("F-cely-z" "F-cely-v" "F-centrální-šachta"))
    ;; Průlezy F
    (:id "F-průlez-F1" :deck "F" :name "Průlez F1"
     :location "Střed-západ" :note "Vede dolů na G1"
     :connections ("F-wc-z" "F-cely-z" "G-průlez-G1"))
    (:id "F-průlez-F2" :deck "F" :name "Průlez F2"
     :location "Střed-východ" :note "Vede dolů na G2"
     :connections ("F-wc-v" "F-cely-v" "G-průlez-G2"))
    (:id "F-průlez-F5" :deck "F" :name "Průlez F5"
     :location "Sever-střed západ" :note "Vede dolů na G5"
     :connections ("F-wc-z" "G-průlez-G5"))
    (:id "F-průlez-F6" :deck "F" :name "Průlez F6"
     :location "Sever-střed východ" :note "Vede dolů na G6"
     :connections ("F-wc-v" "G-průlez-G6"))
    (:id "F-průlez-F7" :deck "F" :name "Průlez F7"
     :location "Jih-západ" :note "Vede dolů na G7"
     :connections ("F-cely-z" "G-průlez-G7"))
    (:id "F-průlez-F8" :deck "F" :name "Průlez F8"
     :location "Jih-východ" :note "Vede dolů na G8"
     :connections ("F-cely-v" "G-průlez-G8"))
    (:id "F-centrální-šachta" :deck "F" :name "Centrální šachta"
     :location "Střed" :note "Přístup na paluby B–E, G–J"
     :connections ("F-kuchyně" "F-sklad-z" "F-sklad-v" "F-sklady-jih"
                   "B-centrální-šachta" "C-centrální-šachta" "D-centrální-šachta"
                   "E-centrální-šachta" "G-centrální-šachta" "H-centrální-šachta"
                   "I-centrální-šachta" "J-centrální-šachta"))

    ;; === Paluba G ===
    (:id "G-shromaždiště" :deck "G" :name "Nouzové shromaždiště"
     :location "Severovýchod" :note "Sraz při evakuaci"
     :connections ("G-nástupní-hala"))
    (:id "G-nástupní-hala" :deck "G" :name "Nástupní hala"
     :location "Sever-střed" :note "Centrální hala"
     :connections ("G-shromaždiště" "G-průlez-G3" "G-průlez-G4" "G-eva-sz" "G-eva-sv"
                   "G-servis-androidů" "G-centrální-šachta"))
    (:id "G-hangár-01" :deck "G" :name "Hangár 01"
     :location "Střed-západ" :note "Velký hangár pro plavidla"
     :connections ("G-dokovací-01" "G-sklady-z" "G-průlez-G5"))
    (:id "G-dokovací-01" :deck "G" :name "Dokovací port 01"
     :location "Krajní západ" :note "Přístup do vesmíru z hangáru 01"
     :connections ("G-hangár-01"))
    (:id "G-hangár-02" :deck "G" :name "Hangár 02"
     :location "Střed-východ" :note "Velký hangár pro plavidla"
     :connections ("G-dokovací-02" "G-sklady-v" "G-průlez-G6"))
    (:id "G-dokovací-02" :deck "G" :name "Dokovací port 02"
     :location "Krajní východ" :note "Přístup do vesmíru z hangáru 02"
     :connections ("G-hangár-02"))
    (:id "G-eva-sz" :deck "G" :name "EVA pod (SZ)"
     :location "Střed, mírně SZ" :note "Skafandry pro výstup do kosmu"
     :connections ("G-nástupní-hala" "G-servis-androidů"))
    (:id "G-eva-sv" :deck "G" :name "EVA pod (SV)"
     :location "Střed, mírně SV" :note "Skafandry pro výstup do kosmu"
     :connections ("G-nástupní-hala" "G-servis-androidů"))
    (:id "G-eva-jz" :deck "G" :name "EVA pod (JZ)"
     :location "Střed, mírně JZ" :note "Skafandry pro výstup do kosmu"
     :connections ("G-servis-androidů" "G-kryopody-z"))
    (:id "G-eva-jv" :deck "G" :name "EVA pod (JV)"
     :location "Střed, mírně JV" :note "Skafandry pro výstup do kosmu"
     :connections ("G-servis-androidů" "G-kryopody-v"))
    (:id "G-sklady-z" :deck "G" :name "Sklady (západ)"
     :location "Střed-západ" :note ""
     :connections ("G-hangár-01" "G-centrální-šachta"))
    (:id "G-sklady-v" :deck "G" :name "Sklady (východ)"
     :location "Střed-východ" :note ""
     :connections ("G-hangár-02" "G-centrální-šachta"))
    (:id "G-servis-androidů" :deck "G" :name "Servisní úložiště androidů"
     :location "Střed" :note "Sklad/servis androidů"
     :connections ("G-nástupní-hala" "G-eva-sz" "G-eva-sv" "G-eva-jz" "G-eva-jv"
                   "G-centrální-šachta"))
    (:id "G-nákladový-dok" :deck "G" :name "Nákladový dok"
     :location "Jihozápad" :note "Nakládání/vykládání"
     :connections ("G-kryopody-z" "G-průlez-G1" "G-průlez-G7"))
    (:id "G-opravárenský-dok" :deck "G" :name "Opravárenský dok"
     :location "Jihovýchod" :note "Opravy plavidel"
     :connections ("G-kryopody-v" "G-průlez-G2" "G-průlez-G8"))
    (:id "G-kryopody-z" :deck "G" :name "Nouzové kryopody (západ)"
     :location "Jihozápad" :note "Záložní kryospánek"
     :connections ("G-eva-jz" "G-nákladový-dok"))
    (:id "G-kryopody-v" :deck "G" :name "Nouzové kryopody (východ)"
     :location "Jihovýchod" :note "Záložní kryospánek"
     :connections ("G-eva-jv" "G-opravárenský-dok"))
    ;; Průlezy G
    (:id "G-průlez-G1" :deck "G" :name "Průlez G1"
     :location "Jihozápad" :note "Vede nahoru na F1"
     :connections ("G-nákladový-dok" "F-průlez-F1"))
    (:id "G-průlez-G2" :deck "G" :name "Průlez G2"
     :location "Jihovýchod" :note "Vede nahoru na F2"
     :connections ("G-opravárenský-dok" "F-průlez-F2"))
    (:id "G-průlez-G3" :deck "G" :name "Průlez G3"
     :location "Severozápad" :note "Vede dolů na H3"
     :connections ("G-nástupní-hala" "H-průlez-H3"))
    (:id "G-průlez-G4" :deck "G" :name "Průlez G4"
     :location "Severovýchod" :note "Vede dolů na H4"
     :connections ("G-nástupní-hala" "H-průlez-H4"))
    (:id "G-průlez-G5" :deck "G" :name "Průlez G5"
     :location "Střed-západ" :note "Vede nahoru na F5"
     :connections ("G-hangár-01" "F-průlez-F5"))
    (:id "G-průlez-G6" :deck "G" :name "Průlez G6"
     :location "Střed-východ" :note "Vede nahoru na F6"
     :connections ("G-hangár-02" "F-průlez-F6"))
    (:id "G-průlez-G7" :deck "G" :name "Průlez G7"
     :location "Jihozápad (jižněji)" :note "Vede dolů na H7"
     :connections ("G-nákladový-dok" "H-průlez-H7"))
    (:id "G-průlez-G8" :deck "G" :name "Průlez G8"
     :location "Jihovýchod (jižněji)" :note "Vede dolů na H8"
     :connections ("G-opravárenský-dok" "H-průlez-H8"))
    (:id "G-průlez-G9" :deck "G" :name "Průlez G9 (komunikační věž)"
     :location "Komunikační věž" :note "Vede dolů na H9 (DA/UT/UR)"
     :connections ("G-centrální-šachta" "GH-komunikační-věž"))
    (:id "G-centrální-šachta" :deck "G" :name "Centrální šachta"
     :location "Střed" :note "Přístup na paluby B–F, H–J"
     :connections ("G-nástupní-hala" "G-sklady-z" "G-sklady-v" "G-servis-androidů"
                   "G-průlez-G9"
                   "B-centrální-šachta" "C-centrální-šachta" "D-centrální-šachta"
                   "E-centrální-šachta" "F-centrální-šachta" "H-centrální-šachta"
                   "I-centrální-šachta" "J-centrální-šachta"))

    ;; === Komunikační věž (G/H) ===
    (:id "GH-komunikační-věž" :deck "GH" :name "Komunikační věž / DA/UT/UR"
     :location "Mezi palubami G a H" :note "DA/UT/UR = komunikační počítač (Daughter). Alternativa k MU/TH/UR. Úzká vertikální struktura — snadno bránitelná i past."
     :connections ("G-průlez-G9" "H-průlez-H9"))

    ;; === Paluba H ===
    (:id "H-plasma-sz" :deck "H" :name "Plasmová přenosová stanice (SZ)"
     :location "Sever-západ" :note "Přenos energie"
     :connections ("H-nádrž-toxických" "H-destilační-z"))
    (:id "H-plasma-sv" :deck "H" :name "Plasmová přenosová stanice (SV)"
     :location "Sever-východ" :note "Přenos energie"
     :connections ("H-nádrž-toxických" "H-destilační-v"))
    (:id "H-nádrž-toxických" :deck "H" :name "Nádrž toxických plynů"
     :location "Sever-střed" :note "*** EXTRÉMNĚ NEBEZPEČNÉ *** Únik = smrt"
     :connections ("H-plasma-sz" "H-plasma-sv" "H-průlez-H3" "H-průlez-H4"))
    (:id "H-destilační-z" :deck "H" :name "Destilační nádrže (Z)"
     :location "Střed-západ" :note "Chemická destilace"
     :connections ("H-plasma-sz" "H-kondenzátory-z"))
    (:id "H-destilační-v" :deck "H" :name "Destilační nádrže (V)"
     :location "Střed-východ" :note "Chemická destilace"
     :connections ("H-plasma-sv" "H-kondenzátory-v"))
    (:id "H-kondenzátory-z" :deck "H" :name "Kondenzátory (Z)"
     :location "Střed-západ" :note ""
     :connections ("H-destilační-z" "H-sběrač-01" "H-dílny-z"))
    (:id "H-kondenzátory-v" :deck "H" :name "Kondenzátory (V)"
     :location "Střed-východ" :note ""
     :connections ("H-destilační-v" "H-sběrač-02" "H-dílny-v"))
    (:id "H-sběrač-01" :deck "H" :name "Plasmový sběrač 01"
     :location "Krajní západ" :note "Sběr plasmy"
     :connections ("H-kondenzátory-z"))
    (:id "H-sběrač-02" :deck "H" :name "Plasmový sběrač 02"
     :location "Krajní východ" :note "Sběr plasmy"
     :connections ("H-kondenzátory-v"))
    (:id "H-dílny-z" :deck "H" :name "Dílny (Z)"
     :location "Střed-západ" :note "Nářadí — improvizované zbraně"
     :connections ("H-kondenzátory-z" "H-řídící-centrum"))
    (:id "H-dílny-v" :deck "H" :name "Dílny (V)"
     :location "Střed-východ" :note "Nářadí — improvizované zbraně"
     :connections ("H-kondenzátory-v" "H-řídící-centrum"))
    (:id "H-řídící-centrum" :deck "H" :name "Řídící centrum"
     :location "Střed" :note "Řízení průmyslových procesů. Sabotáž?"
     :connections ("H-dílny-z" "H-dílny-v" "H-strojovna-z" "H-strojovna-v" "H-centrální-šachta"))
    (:id "H-strojovna-z" :deck "H" :name "Strojovna (Z)"
     :location "Jih-střed-západ" :note ""
     :connections ("H-řídící-centrum" "H-mag-čerpadlo"))
    (:id "H-strojovna-v" :deck "H" :name "Strojovna (V)"
     :location "Jih-střed-východ" :note ""
     :connections ("H-řídící-centrum" "H-mag-čerpadlo"))
    (:id "H-mag-čerpadlo" :deck "H" :name "Magnetické čerpadlo"
     :location "Jih-střed" :note ""
     :connections ("H-strojovna-z" "H-strojovna-v" "H-tavení"))
    (:id "H-tavení" :deck "H" :name "Řídící stanice tavení"
     :location "Jih-střed" :note ""
     :connections ("H-mag-čerpadlo" "H-plasma-jz" "H-plasma-jv"))
    (:id "H-plasma-jz" :deck "H" :name "Plasmová přenosová stanice (JZ)"
     :location "Jihozápad" :note ""
     :connections ("H-tavení" "H-energie-z" "H-průlez-H7"))
    (:id "H-plasma-jv" :deck "H" :name "Plasmová přenosová stanice (JV)"
     :location "Jihovýchod" :note ""
     :connections ("H-tavení" "H-energie-v" "H-průlez-H8"))
    (:id "H-energie-z" :deck "H" :name "Energetické sběrné články (Z)"
     :location "Krajní jihozápad" :note "Zásobník energie"
     :connections ("H-plasma-jz"))
    (:id "H-energie-v" :deck "H" :name "Energetické sběrné články (V)"
     :location "Krajní jihovýchod" :note "Zásobník energie"
     :connections ("H-plasma-jv"))
    ;; Průlezy H
    (:id "H-průlez-H3" :deck "H" :name "Průlez H3"
     :location "Střed-západ" :note "Vede nahoru na G3"
     :connections ("H-nádrž-toxických" "G-průlez-G3"))
    (:id "H-průlez-H4" :deck "H" :name "Průlez H4"
     :location "Střed-východ" :note "Vede nahoru na G4"
     :connections ("H-nádrž-toxických" "G-průlez-G4"))
    (:id "H-průlez-H7" :deck "H" :name "Průlez H7"
     :location "Jih-západ" :note "Vede nahoru na G7"
     :connections ("H-plasma-jz" "G-průlez-G7"))
    (:id "H-průlez-H8" :deck "H" :name "Průlez H8"
     :location "Jih-východ" :note "Vede nahoru na G8"
     :connections ("H-plasma-jv" "G-průlez-G8"))
    (:id "H-průlez-H9" :deck "H" :name "Průlez H9 (komunikační věž)"
     :location "Komunikační věž" :note "Vede nahoru na G9. DA/UT/UR v komunikační věži."
     :connections ("H-centrální-šachta" "GH-komunikační-věž"))
    (:id "H-centrální-šachta" :deck "H" :name "Centrální šachta"
     :location "Střed" :note "Přístup na paluby B–G, I–J"
     :connections ("H-řídící-centrum" "H-průlez-H9"
                   "B-centrální-šachta" "C-centrální-šachta" "D-centrální-šachta"
                   "E-centrální-šachta" "F-centrální-šachta" "G-centrální-šachta"
                   "I-centrální-šachta" "J-centrální-šachta"))

    ;; === Paluba I ===
    (:id "I-záchranné-moduly" :deck "I" :name "Záchranné moduly"
     :location "Celá paluba" :note "Únikové kapsle pro evakuaci. Na mapě bez textových popisků místností."
     :connections ("I-centrální-šachta"))
    (:id "I-centrální-šachta" :deck "I" :name "Centrální šachta"
     :location "Střed" :note "Přístup na paluby B–H, J"
     :connections ("I-záchranné-moduly"
                   "B-centrální-šachta" "C-centrální-šachta" "D-centrální-šachta"
                   "E-centrální-šachta" "F-centrální-šachta" "G-centrální-šachta"
                   "H-centrální-šachta" "J-centrální-šachta"))

    ;; === Paluba J ===
    (:id "J-baterie-horní" :deck "J" :name "Baterie (horní)"
     :location "Sever-střed" :note "Energetická baterie. Zásah = exploze/výpadek."
     :connections ("J-centrální-šachta"))
    (:id "J-baterie-levá" :deck "J" :name "Baterie (levá/západ)"
     :location "Západ" :note "Energetická baterie"
     :connections ("J-centrální-šachta"))
    (:id "J-baterie-pravá" :deck "J" :name "Baterie (pravá/východ)"
     :location "Východ" :note "Energetická baterie"
     :connections ("J-centrální-šachta"))
    (:id "J-centrální-šachta" :deck "J" :name "Centrální šachta"
     :location "Střed" :note "Přístup na paluby B–I. Nejnižší paluba — jen nahoru."
     :connections ("J-baterie-horní" "J-baterie-levá" "J-baterie-pravá"
                   "B-centrální-šachta" "C-centrální-šachta" "D-centrální-šachta"
                   "E-centrální-šachta" "F-centrální-šachta" "G-centrální-šachta"
                   "H-centrální-šachta" "I-centrální-šachta")))
  "Kompletní seznam místností s propojením. Ověřeno z PDF.")


;; ══════════════════════════════════════════════════════════════
;; DATA: Postava
;; ══════════════════════════════════════════════════════════════

(defvar alien-rpg-character
  '(:name "prof. Héctor Navarre, Ph.D."
    :career "Biochemický inženýr"
    :age 74
    :attributes (:strength 3 :agility 4 :wits 3 :empathy 4)
    :skills (:close-combat 2 :heavy-machinery 2 :stamina 0
             :mobility 0 :piloting 0 :ranged-combat 3
             :comtech 0 :observation 2 :survival 0
             :command 0 :manipulation 3 :medical-aid 0)
    :talent "Analýza: Hod na OBSERVATION — za každý úspěch (6) získáš jednu informaci o organismu/předmětu."
    :gear ("Svítilna" "CBRN detektor (viry, toxiny, radiace)" "Lokátor PDT (pozice členů týmu)")
    :signature-item "Karta (blíže neurčeno)")
  "Statická data postavy (nemění se během hry).")

(defvar alien-rpg-skill-attributes
  '((:close-combat . :strength)  (:heavy-machinery . :strength) (:stamina . :strength)
    (:mobility . :agility)       (:piloting . :agility)         (:ranged-combat . :agility)
    (:comtech . :wits)           (:observation . :wits)         (:survival . :wits)
    (:command . :empathy)        (:manipulation . :empathy)     (:medical-aid . :empathy))
  "Mapování dovedností na atributy.")

(defvar alien-rpg-skill-names
  '((:close-combat . "Close Combat") (:heavy-machinery . "Heavy Machinery")
    (:stamina . "Stamina") (:mobility . "Mobility") (:piloting . "Piloting")
    (:ranged-combat . "Ranged Combat") (:comtech . "Comtech")
    (:observation . "Observation") (:survival . "Survival")
    (:command . "Command") (:manipulation . "Manipulation")
    (:medical-aid . "Medical Aid"))
  "Čitelné názvy dovedností.")

;; ══════════════════════════════════════════════════════════════
;; STAV HRY (mění se během sezení)
;; ══════════════════════════════════════════════════════════════

(defvar alien-rpg-state
  '(:health 4
    :stress 0
    :current-room "B-centrální-šachta"
    :weapons ()
    :armor nil
    :extra-gear ()
    :injuries ()
    :xp 0
    :story-points 0
    :notes ()
    :buddy nil
    :rival nil)
  "Dynamický herní stav. Mění se během sezení. Ukládá/načítá ze souboru.")

(defvar alien-rpg-state-file
  (expand-file-name "alien-rpg-save.el"
                    (file-name-directory (or load-file-name
                                             buffer-file-name
                                             "~/alienrpg/")))
  "Soubor pro ukládání herního stavu.")


;; ══════════════════════════════════════════════════════════════
;; POMOCNÉ FUNKCE
;; ══════════════════════════════════════════════════════════════

(defun alien-rpg--get-room (room-id)
  "Najdi místnost podle ROOM-ID."
  (cl-find-if (lambda (r) (string= (plist-get r :id) room-id))
              alien-rpg-rooms))

(defun alien-rpg--get-deck (deck-id)
  "Najdi palubu podle DECK-ID."
  (cl-find-if (lambda (d) (string= (plist-get d :id) deck-id))
              alien-rpg-decks))

(defun alien-rpg--room-display-name (room)
  "Vytvoř zobrazovaný název místnosti ROOM."
  (format "[%s] %s" (plist-get room :deck) (plist-get room :name)))

(defun alien-rpg--current-room ()
  "Vrať plist aktuální místnosti."
  (alien-rpg--get-room (plist-get alien-rpg-state :current-room)))

(defun alien-rpg--connected-rooms (room)
  "Vrať seznam plistů místností spojených s ROOM."
  (let ((conn-ids (plist-get room :connections)))
    (cl-remove-if #'null
                  (mapcar #'alien-rpg--get-room conn-ids))))

(defun alien-rpg--rooms-on-deck (deck-id)
  "Vrať všechny místnosti na palubě DECK-ID."
  (cl-remove-if-not
   (lambda (r) (string= (plist-get r :deck) deck-id))
   alien-rpg-rooms))

(defun alien-rpg--skill-total (skill-key)
  "Vrať celkový počet kostek (atribut + dovednost) pro SKILL-KEY."
  (let* ((attrs (plist-get alien-rpg-character :attributes))
         (skills (plist-get alien-rpg-character :skills))
         (attr-key (cdr (assq skill-key alien-rpg-skill-attributes)))
         (attr-val (or (plist-get attrs attr-key) 0))
         (skill-val (or (plist-get skills skill-key) 0)))
    (+ attr-val skill-val)))


;; ══════════════════════════════════════════════════════════════
;; ULOŽENÍ / NAČTENÍ STAVU
;; ══════════════════════════════════════════════════════════════

(defun alien-rpg-save-state ()
  "Ulož herní stav do souboru."
  (interactive)
  (let ((file (or alien-rpg-state-file
                  (expand-file-name "alien-rpg-save.el"
                                    (file-name-directory
                                     (or buffer-file-name default-directory))))))
    (with-temp-file file
      (insert ";; Alien RPG — uložený herní stav\n")
      (insert (format ";; Uloženo: %s\n" (format-time-string "%Y-%m-%d %H:%M")))
      (insert "(setq alien-rpg-state\n  '")
      (pp alien-rpg-state (current-buffer))
      (insert ")\n"))
    (setq alien-rpg-state-file file)
    (message "Stav uložen: %s" file)))

(defun alien-rpg-load-state ()
  "Načti herní stav ze souboru."
  (interactive)
  (let ((file (or alien-rpg-state-file
                  (read-file-name "Načíst stav ze souboru: "
                                  nil nil t "alien-rpg-save.el"))))
    (when (file-exists-p file)
      (load file nil 'nomessage)
      (setq alien-rpg-state-file file)
      (message "Stav načten: %s" file))))

(defun alien-rpg--autosave ()
  "Automaticky ulož stav (tiše, bez zprávy)."
  (when alien-rpg-state-file
    (with-temp-file alien-rpg-state-file
      (insert ";; Alien RPG — uložený herní stav\n")
      (insert (format ";; Uloženo: %s\n" (format-time-string "%Y-%m-%d %H:%M")))
      (insert "(setq alien-rpg-state\n  '")
      (pp alien-rpg-state (current-buffer))
      (insert ")\n"))))

;; Automaticky načti uložený stav při startu (pokud existuje)
(when (and alien-rpg-state-file (file-exists-p alien-rpg-state-file))
  (load alien-rpg-state-file nil 'nomessage)
  (message "Alien RPG: stav načten z %s" alien-rpg-state-file))


;; ══════════════════════════════════════════════════════════════
;; INTERAKTIVNÍ PŘÍKAZY
;; ══════════════════════════════════════════════════════════════

;; --- Kde jsem ---

(defun alien-rpg-where-am-i ()
  "Zobraz aktuální pozici a okolí. Jeden stisk = kompletní přehled."
  (interactive)
  (let* ((room (alien-rpg--current-room))
         (deck (alien-rpg--get-deck (plist-get room :deck)))
         (connected (alien-rpg--connected-rooms room))
         (same-deck (cl-remove-if-not
                     (lambda (r) (string= (plist-get r :deck) (plist-get room :deck)))
                     connected))
         (other-deck (cl-remove-if
                      (lambda (r) (string= (plist-get r :deck) (plist-get room :deck)))
                      connected)))
    (with-current-buffer (get-buffer-create "*Alien RPG*")
      (let ((inhibit-read-only t))
        (erase-buffer)
        (insert (propertize "═══ KDE JSEM ═══\n" 'face 'bold))
        (insert (format "\nPaluba %s — %s\n" (plist-get deck :id) (plist-get deck :name)))
        (insert (format "Místnost: %s\n" (plist-get room :name)))
        (insert (format "Poloha: %s\n" (plist-get room :location)))
        (when (and (plist-get room :note) (not (string-empty-p (plist-get room :note))))
          (insert (format "\n%s\n" (plist-get room :note))))
        ;; Okolní místnosti na stejné palubě
        (when same-deck
          (insert (propertize "\n── Na této palubě ──\n" 'face 'bold))
          (dolist (r same-deck)
            (insert (format "  • %s (%s)\n"
                            (plist-get r :name)
                            (plist-get r :location)))))
        ;; Přístupy na jiné paluby
        (when other-deck
          (insert (propertize "\n── Přístupy na jiné paluby ──\n" 'face 'bold))
          (dolist (r other-deck)
            (insert (format "  → [%s] %s\n"
                            (plist-get r :deck)
                            (plist-get r :name)))))
        ;; Paluba info
        (insert (propertize "\n── Info o palubě ──\n" 'face 'bold))
        (insert (format "Účel: %s\n" (plist-get deck :purpose)))
        (insert (format "Velikost: %s, Měřítko: %s\n" (plist-get deck :size) (plist-get deck :scale)))
        (insert (format "%s\n" (plist-get deck :notes))))
      (goto-char (point-min))
      (special-mode))
    (pop-to-buffer "*Alien RPG*")))

;; --- Přesun ---

(defun alien-rpg-move ()
  "Přesuň se do propojené místnosti. Completion — žádné hledání."
  (interactive)
  (let* ((room (alien-rpg--current-room))
         (connected (alien-rpg--connected-rooms room))
         (candidates (mapcar (lambda (r)
                               (cons (alien-rpg--room-display-name r)
                                     (plist-get r :id)))
                             connected))
         (choice (completing-read
                  (format "Přesun z [%s] %s → " (plist-get room :deck) (plist-get room :name))
                  candidates nil t))
         (target-id (cdr (assoc choice candidates))))
    (plist-put alien-rpg-state :current-room target-id)
    (alien-rpg--autosave)
    (alien-rpg-where-am-i)))

;; --- Teleport (GM řekne "jsi na palubě X") ---

(defun alien-rpg-teleport ()
  "Přesuň se kamkoliv na stanici. Pro případy kdy GM řekne novou pozici."
  (interactive)
  (let* ((candidates (mapcar (lambda (r)
                               (cons (alien-rpg--room-display-name r)
                                     (plist-get r :id)))
                             alien-rpg-rooms))
         (choice (completing-read "Teleport na: " candidates nil t))
         (target-id (cdr (assoc choice candidates))))
    (plist-put alien-rpg-state :current-room target-id)
    (alien-rpg--autosave)
    (alien-rpg-where-am-i)))

;; --- Najít místnost ---

(defun alien-rpg-find-room ()
  "Najdi a zobraz informace o libovolné místnosti."
  (interactive)
  (let* ((candidates (mapcar (lambda (r)
                               (cons (alien-rpg--room-display-name r)
                                     r))
                             alien-rpg-rooms))
         (choice (completing-read "Najít místnost: " candidates nil t))
         (room (cdr (assoc choice candidates)))
         (deck (alien-rpg--get-deck (plist-get room :deck)))
         (connected (alien-rpg--connected-rooms room)))
    (with-current-buffer (get-buffer-create "*Alien RPG*")
      (let ((inhibit-read-only t))
        (erase-buffer)
        (insert (propertize "═══ MÍSTNOST ═══\n" 'face 'bold))
        (insert (format "\n[%s] %s — %s\n" (plist-get deck :id) (plist-get deck :name) (plist-get room :name)))
        (insert (format "Poloha na palubě: %s\n" (plist-get room :location)))
        (when (and (plist-get room :note) (not (string-empty-p (plist-get room :note))))
          (insert (format "\n%s\n" (plist-get room :note))))
        (insert (propertize "\n── Propojení ──\n" 'face 'bold))
        (dolist (r connected)
          (insert (format "  → [%s] %s (%s)\n"
                          (plist-get r :deck)
                          (plist-get r :name)
                          (plist-get r :location)))))
      (goto-char (point-min))
      (special-mode))
    (pop-to-buffer "*Alien RPG*")))

;; --- Přehled paluby ---

(defun alien-rpg-deck-overview ()
  "Zobraz přehled zvolené paluby."
  (interactive)
  (let* ((candidates (mapcar (lambda (d)
                               (cons (format "%s — %s" (plist-get d :id) (plist-get d :name))
                                     (plist-get d :id)))
                             alien-rpg-decks))
         (choice (completing-read "Paluba: " candidates nil t))
         (deck-id (cdr (assoc choice candidates)))
         (deck (alien-rpg--get-deck deck-id))
         (rooms (alien-rpg--rooms-on-deck deck-id)))
    (with-current-buffer (get-buffer-create "*Alien RPG*")
      (let ((inhibit-read-only t))
        (erase-buffer)
        (insert (propertize (format "═══ PALUBA %s ═══\n" deck-id) 'face 'bold))
        (insert (format "\n%s\n" (plist-get deck :name)))
        (insert (format "Účel: %s\n" (plist-get deck :purpose)))
        (insert (format "Velikost: %s, Měřítko: %s\n" (plist-get deck :size) (plist-get deck :scale)))
        (insert (format "\n%s\n" (plist-get deck :notes)))
        (insert (propertize "\n── Místnosti ──\n" 'face 'bold))
        (dolist (r rooms)
          (insert (format "  • %s (%s)" (plist-get r :name) (plist-get r :location)))
          (when (and (plist-get r :note) (not (string-empty-p (plist-get r :note))))
            (insert (format " — %s" (plist-get r :note))))
          (insert "\n")))
      (goto-char (point-min))
      (special-mode))
    (pop-to-buffer "*Alien RPG*")))

;; --- Stav postavy ---

(defun alien-rpg-status ()
  "Zobraz aktuální stav postavy. Zdraví, stres, výbava, pozice."
  (interactive)
  (let* ((room (alien-rpg--current-room))
         (deck (alien-rpg--get-deck (plist-get room :deck)))
         (health (plist-get alien-rpg-state :health))
         (stress (plist-get alien-rpg-state :stress))
         (weapons (plist-get alien-rpg-state :weapons))
         (armor (plist-get alien-rpg-state :armor))
         (gear (plist-get alien-rpg-character :gear))
         (extra (plist-get alien-rpg-state :extra-gear))
         (injuries (plist-get alien-rpg-state :injuries)))
    (with-current-buffer (get-buffer-create "*Alien RPG*")
      (let ((inhibit-read-only t))
        (erase-buffer)
        (insert (propertize "═══ STAV POSTAVY ═══\n" 'face 'bold))
        (insert (format "\n%s\n" (plist-get alien-rpg-character :name)))
        (insert (format "%s, %d let\n" (plist-get alien-rpg-character :career)
                        (plist-get alien-rpg-character :age)))
        ;; Pozice
        (insert (propertize "\n── Pozice ──\n" 'face 'bold))
        (insert (format "Paluba %s — %s\n" (plist-get deck :id) (plist-get deck :name)))
        (insert (format "Místnost: %s\n" (plist-get room :name)))
        ;; Zdraví
        (insert (propertize "\n── Zdraví a stres ──\n" 'face 'bold))
        (insert (format "Health:  %d/4%s\n" health
                        (cond ((= health 4) " ████")
                              ((= health 3) " ███░")
                              ((= health 2) " ██░░")
                              ((= health 1) " █░░░ ⚠ KRITICKÉ!")
                              (t " ░░░░ ☠ BEZ VĚDOMÍ!"))))
        (insert (format "Stress:  %d%s\n" stress
                        (if (>= stress 7)
                            (format " (PANIKA při dalším stresu!)")
                          "")))
        ;; Zranění
        (when injuries
          (insert (propertize "\n── Zranění ──\n" 'face 'bold))
          (dolist (i injuries)
            (insert (format "  ✖ %s\n" i))))
        ;; Výbava
        (insert (propertize "\n── Výbava ──\n" 'face 'bold))
        (dolist (g gear) (insert (format "  • %s\n" g)))
        (dolist (g extra) (insert (format "  + %s\n" g)))
        (if weapons
            (progn
              (insert (propertize "\n── Zbraně ──\n" 'face 'bold))
              (dolist (w weapons) (insert (format "  ⚔ %s\n" w))))
          (insert "\n  (žádné zbraně)\n"))
        (when armor
          (insert (format "\n  🛡 Brnění: %s\n" armor)))
        ;; Buddy/Rival
        (insert (propertize "\n── Vztahy ──\n" 'face 'bold))
        (insert (format "Buddy: %s\n" (or (plist-get alien-rpg-state :buddy) "(nenastaveno)")))
        (insert (format "Rival: %s\n" (or (plist-get alien-rpg-state :rival) "(nenastaveno)"))))
      (goto-char (point-min))
      (special-mode))
    (pop-to-buffer "*Alien RPG*")))

;; --- Hod kostkou ---

(defun alien-rpg-roll ()
  "Hoď na dovednost. Vybere dovednost → automaticky spočítá kostky → hodí."
  (interactive)
  (let* ((stress (plist-get alien-rpg-state :stress))
         (candidates
          (mapcar (lambda (sk)
                    (let* ((key (car sk))
                           (name (cdr (assq key alien-rpg-skill-names)))
                           (total (alien-rpg--skill-total key)))
                      (cons (format "%s (%d kostek)" name total) key)))
                  alien-rpg-skill-attributes))
         (choice (completing-read "Hoď na: " candidates nil t))
         (skill-key (cdr (assoc choice candidates)))
         (skill-name (cdr (assq skill-key alien-rpg-skill-names)))
         (base-dice (alien-rpg--skill-total skill-key))
         (stress-dice stress)
         (total-dice (+ base-dice stress-dice))
         ;; Hod
         (base-results (cl-loop repeat base-dice collect (1+ (random 6))))
         (stress-results (cl-loop repeat stress-dice collect (1+ (random 6))))
         (successes (+ (cl-count 6 base-results) (cl-count 6 stress-results)))
         (facehuggers (cl-count 1 stress-results)))
    (with-current-buffer (get-buffer-create "*Alien RPG*")
      (let ((inhibit-read-only t))
        (erase-buffer)
        (insert (propertize "═══ HOD KOSTKOU ═══\n" 'face 'bold))
        (insert (format "\n%s\n" skill-name))
        (insert (format "Základ: %d kostek  |  Stress: %d kostek  |  Celkem: %d\n\n"
                        base-dice stress-dice total-dice))
        ;; Výsledky
        (insert (format "Základní:  %s\n" (mapconcat #'number-to-string base-results " ")))
        (when (> stress-dice 0)
          (insert (format "Stresové:  %s\n" (mapconcat #'number-to-string stress-results " "))))
        (insert (propertize (format "\n✦ ÚSPĚCHY: %d\n" successes) 'face 'bold))
        (when (> facehuggers 0)
          (insert (propertize (format "☣ FACEHUGGER IKONY: %d — PANIKA!\n" facehuggers) 'face 'error)))
        ;; Push info
        (when (= successes 0)
          (insert "\n→ Můžeš pushovat (přehodit neúspěchy). Stress +1.\n"))
        ;; Talent reminder
        (when (eq skill-key :observation)
          (insert "\n★ TALENT ANALÝZA: Za každý úspěch jedna informace o organismu/předmětu.\n")))
      (goto-char (point-min))
      (special-mode))
    (pop-to-buffer "*Alien RPG*")))

;; --- Upravit zdraví/stres ---

(defun alien-rpg-set-health (n)
  "Nastav Health na N."
  (interactive "nHealth (0-4): ")
  (plist-put alien-rpg-state :health (max 0 (min 4 n)))
  (alien-rpg--autosave)
  (message "Health: %d/4" (plist-get alien-rpg-state :health)))

(defun alien-rpg-set-stress (n)
  "Nastav Stress na N."
  (interactive "nStress (0+): ")
  (plist-put alien-rpg-state :stress (max 0 n))
  (alien-rpg--autosave)
  (let ((s (plist-get alien-rpg-state :stress)))
    (message "Stress: %d%s" s (if (>= s 7) " ⚠ NEBEZPEČÍ PANIKY!" ""))))

(defun alien-rpg-add-injury (injury)
  "Přidej zranění INJURY."
  (interactive "sZranění: ")
  (plist-put alien-rpg-state :injuries
             (append (plist-get alien-rpg-state :injuries) (list injury)))
  (alien-rpg--autosave)
  (message "Přidáno zranění: %s" injury))

(defun alien-rpg-add-gear (item)
  "Přidej výbavu ITEM."
  (interactive "sNová výbava: ")
  (plist-put alien-rpg-state :extra-gear
             (append (plist-get alien-rpg-state :extra-gear) (list item)))
  (alien-rpg--autosave)
  (message "Přidáno: %s" item))

(defun alien-rpg-add-weapon (weapon)
  "Přidej zbraň WEAPON."
  (interactive "sNová zbraň: ")
  (plist-put alien-rpg-state :weapons
             (append (plist-get alien-rpg-state :weapons) (list weapon)))
  (alien-rpg--autosave)
  (message "Přidána zbraň: %s" weapon))

(defun alien-rpg-set-buddy (name)
  "Nastav Buddy."
  (interactive "sBuddy: ")
  (plist-put alien-rpg-state :buddy name)
  (alien-rpg--autosave)
  (message "Buddy: %s" name))

(defun alien-rpg-set-rival (name)
  "Nastav Rivala."
  (interactive "sRival: ")
  (plist-put alien-rpg-state :rival name)
  (alien-rpg--autosave)
  (message "Rival: %s" name))

(defun alien-rpg-add-note (note)
  "Přidej herní poznámku NOTE."
  (interactive "sPoznámka: ")
  (plist-put alien-rpg-state :notes
             (append (plist-get alien-rpg-state :notes)
                     (list (format "[%s] %s"
                                   (format-time-string "%H:%M")
                                   note))))
  (alien-rpg--autosave)
  (message "Poznámka uložena."))

;; --- Klíčová místa (rychlá reference) ---

(defun alien-rpg-key-locations ()
  "Zobraz klíčová místa — kam utéct, co najít."
  (interactive)
  (with-current-buffer (get-buffer-create "*Alien RPG*")
    (let ((inhibit-read-only t))
      (erase-buffer)
      (insert (propertize "═══ KLÍČOVÁ MÍSTA ═══\n" 'face 'bold))
      (insert "
ZBRANĚ:           [F] Zbrojnice (sever-střed paluby F)
LÉKAŘSKÁ POMOC:   [C] Ošetřovna a laboratoř (sever-západ paluby C)
HLAVNÍ POČÍTAČ:   [B] MU/TH/UR (jih-střed paluby B)
KOMUNIKACE:       [GH] DA/UT/UR (komunikační věž mezi G a H)
EVAKUACE LODÍ:    [G] Hangár 01 (západ) nebo Hangár 02 (východ)
EVAKUACE KAPSLE:  [I] Záchranné moduly
SKRÝŠ/BARIKÁDA:   [E] Kajuty (6 kusů, barikádovatelné)
KRYOSPÁNEK:       [G] Nouzové kryopody (jihozápad/jihovýchod)
ZNIČENÍ STANICE:  [J] Strojovna reaktoru
NÁŘADÍ:           [H] Dílny (střed paluby H)
EVA SKAFANDRY:    [G] EVA pody (4 kusy, střed)
VĚDECKÁ LAB:      [D] Astrofyzikální laboratoř (severozápad)
DOK. PORT:        [D] Návštěvnický dokovací port (jih)

═══ VERTIKÁLNÍ PŘESUNY ═══

Centrální šachta:  B ↔ C ↔ D ↔ E ↔ F ↔ G ↔ H ↔ I ↔ J  (střed každé paluby)
Průchod B→A:       Západ paluby B (jediný přístup na A)
Průlezy F↔G:       F1↔G1, F2↔G2, F5↔G5, F6↔G6, F7↔G7, F8↔G8
Průlezy G↔H:       G3↔H3, G4↔H4, G7↔H7, G8↔H8, G9↔H9 (kom. věž)
"))
    (goto-char (point-min))
    (special-mode))
  (pop-to-buffer "*Alien RPG*"))

;; --- Dovednosti (rychlý přehled) ---

(defun alien-rpg-skills ()
  "Zobraz přehled dovedností seřazený od nejsilnějších."
  (interactive)
  (let* ((skill-data
          (mapcar (lambda (sk)
                    (let* ((key (car sk))
                           (name (cdr (assq key alien-rpg-skill-names)))
                           (total (alien-rpg--skill-total key)))
                      (list total name key)))
                  alien-rpg-skill-attributes))
         (sorted (sort skill-data (lambda (a b) (> (car a) (car b))))))
    (with-current-buffer (get-buffer-create "*Alien RPG*")
      (let ((inhibit-read-only t))
        (erase-buffer)
        (insert (propertize "═══ DOVEDNOSTI ═══\n\n" 'face 'bold))
        (dolist (s sorted)
          (let ((total (nth 0 s))
                (name (nth 1 s)))
            (insert (format "  %d kostek — %s%s\n" total name
                            (cond ((>= total 7) "  ★★★")
                                  ((>= total 5) "  ★★")
                                  (t ""))))))
        (insert "\n")
        (insert (propertize "Talent: " 'face 'bold))
        (insert (plist-get alien-rpg-character :talent))
        (insert "\n"))
      (goto-char (point-min))
      (special-mode))
    (pop-to-buffer "*Alien RPG*")))

;; --- Přehled stanice (boční pohled) ---

(defun alien-rpg-station-overview ()
  "Zobraz vertikální přehled stanice."
  (interactive)
  (let ((current-deck (plist-get (alien-rpg--current-room) :deck)))
    (with-current-buffer (get-buffer-create "*Alien RPG*")
      (let ((inhibit-read-only t))
        (erase-buffer)
        (insert (propertize "═══ STANICE — BOČNÍ POHLED ═══\n\n" 'face 'bold))
        (dolist (d alien-rpg-decks)
          (let* ((id (plist-get d :id))
                 (here (string= id current-deck))
                 (line (format "%s%s — %s (%s)\n"
                               (if here "→ " "  ")
                               id
                               (plist-get d :name)
                               (plist-get d :purpose))))
            (insert (if here (propertize line 'face 'bold) line))
            ;; Vzdálenosti
            (pcase id
              ("A" (insert "     ╎ (izolovaná, přístup jen z B)\n"))
              ("E" (insert "     ║ (střední mezera)\n"))
              ("H" (insert "     ║\n     ║ (VELKÁ mezera)\n     ║\n"))
              ("I" (insert "     ║ (střední mezera)\n"))
              (_ (unless (string= id "J") (insert "     ║\n")))))))
      (goto-char (point-min))
      (special-mode))
    (pop-to-buffer "*Alien RPG*")))

;; --- Najít cestu ---

(defun alien-rpg-find-path ()
  "Najdi nejkratší cestu z aktuální místnosti do cíle (BFS)."
  (interactive)
  (let* ((start (plist-get alien-rpg-state :current-room))
         (candidates (mapcar (lambda (r)
                               (cons (alien-rpg--room-display-name r)
                                     (plist-get r :id)))
                             alien-rpg-rooms))
         (choice (completing-read "Najít cestu do: " candidates nil t))
         (goal (cdr (assoc choice candidates)))
         ;; BFS
         (queue (list (list start)))
         (visited (list start))
         (found nil))
    (while (and queue (not found))
      (let* ((path (pop queue))
             (current (car (last path)))
             (room (alien-rpg--get-room current))
             (connections (plist-get room :connections)))
        (if (string= current goal)
            (setq found path)
          (dolist (next connections)
            (unless (member next visited)
              (push next visited)
              (setq queue (append queue (list (append path (list next))))))))))
    (with-current-buffer (get-buffer-create "*Alien RPG*")
      (let ((inhibit-read-only t))
        (erase-buffer)
        (if found
            (progn
              (insert (propertize "═══ CESTA ═══\n\n" 'face 'bold))
              (insert (format "Kroků: %d\n\n" (1- (length found))))
              (let ((step 0))
                (dolist (room-id found)
                  (let ((r (alien-rpg--get-room room-id)))
                    (insert (format "%s%d. [%s] %s\n"
                                    (if (= step 0) "📍 " "   ")
                                    step
                                    (plist-get r :deck)
                                    (plist-get r :name)))
                    (cl-incf step)))))
          (insert "Cesta nenalezena!\n")))
      (goto-char (point-min))
      (special-mode))
    (pop-to-buffer "*Alien RPG*")))

;; --- Poznámky ---

(defun alien-rpg-show-notes ()
  "Zobraz všechny herní poznámky."
  (interactive)
  (with-current-buffer (get-buffer-create "*Alien RPG*")
    (let ((inhibit-read-only t)
          (notes (plist-get alien-rpg-state :notes)))
      (erase-buffer)
      (insert (propertize "═══ POZNÁMKY ═══\n\n" 'face 'bold))
      (if notes
          (dolist (n notes)
            (insert (format "  %s\n" n)))
        (insert "  (žádné poznámky)\n")))
    (goto-char (point-min))
    (special-mode))
  (pop-to-buffer "*Alien RPG*"))


;; ══════════════════════════════════════════════════════════════
;; DOOM EMACS KEYBINDINGS
;; ══════════════════════════════════════════════════════════════
;; SPC G = Alien RPG prefix

(with-eval-after-load 'doom-keybinds
  (map! :leader
        (:prefix ("G" . "Alien RPG")
         ;; Navigace
         :desc "Kde jsem"           "w" #'alien-rpg-where-am-i
         :desc "Přesun"             "m" #'alien-rpg-move
         :desc "Teleport"           "t" #'alien-rpg-teleport
         :desc "Najít místnost"     "f" #'alien-rpg-find-room
         :desc "Najít cestu"        "p" #'alien-rpg-find-path
         :desc "Přehled paluby"     "d" #'alien-rpg-deck-overview
         :desc "Přehled stanice"    "o" #'alien-rpg-station-overview
         :desc "Klíčová místa"      "k" #'alien-rpg-key-locations
         ;; Postava
         :desc "Stav postavy"       "s" #'alien-rpg-status
         :desc "Dovednosti"         "i" #'alien-rpg-skills
         :desc "Hodit kostkou"      "r" #'alien-rpg-roll
         ;; Úpravy stavu
         :desc "Nastavit Health"    "h" #'alien-rpg-set-health
         :desc "Nastavit Stress"    "S" #'alien-rpg-set-stress
         :desc "Přidat zranění"     "j" #'alien-rpg-add-injury
         :desc "Přidat výbavu"      "g" #'alien-rpg-add-gear
         :desc "Přidat zbraň"       "W" #'alien-rpg-add-weapon
         ;; Sociální
         :desc "Nastavit Buddy"     "b" #'alien-rpg-set-buddy
         :desc "Nastavit Rival"     "R" #'alien-rpg-set-rival
         ;; Poznámky
         :desc "Přidat poznámku"    "n" #'alien-rpg-add-note
         :desc "Zobrazit poznámky"  "N" #'alien-rpg-show-notes
         ;; Uložení
         :desc "Uložit stav"        "q" #'alien-rpg-save-state
         :desc "Načíst stav"        "Q" #'alien-rpg-load-state)))

(provide 'alien-rpg)
;;; alien-rpg.el ends here
