Files
allienrpg_03_2026/alien-rpg.el
Martin Sukany dc0d9e5e39 update
2026-03-24 13:01:49 +01:00

1220 lines
60 KiB
EmacsLisp
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;;; 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 CJ"
: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, DJ"
: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 BC, EJ"
: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 BD, FJ"
: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 BE, GJ"
: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 BF, HJ"
: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 BG, IJ"
: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 BH, 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 BI. 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