;;; 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