Files
allienrpg_03_2026/alien-rpg.el
2026-03-24 14:25:14 +01:00

1127 lines
50 KiB
EmacsLisp

;;; alien-rpg.el --- Přístupný herní engine pro Alien RPG -*- lexical-binding: t; -*-
;;
;; Přístupný systém pro nevidomého hráče Alien RPG.
;; Ovládání přes SPC G (Doom Emacs).
;; Žádné soubory, žádné scrollování. Jeden stisk = informace.
;;
;;; Code:
(require 'cl-lib)
;; ====================================================================
;; STANICE
;; ====================================================================
(defvar alien-rpg-station-name "USCSS CETORHINA"
"Jméno stanice.")
;; ====================================================================
;; PALUBY
;; ====================================================================
(defvar alien-rpg-decks
'((:id "A" :name "Astrometrická observatoř"
:purpose "Astronomické pozorování"
:size "Mala (A2)" :scale "5 m" :position 1
:notes "Izolovaná. Přístup pouze z paluby B (západ).")
(:id "B" :name "Řízení provozu"
:purpose "Velitelský můstek"
:size "Středni (A2)" :scale "5 m" :position 2
:notes "MU/TH/UR (hlavni pocitac), řídící středisko.")
(:id "C" :name "Zdraví a odpočinek"
:purpose "Medicína, rekreace, botanika"
:size "Středni (A2)" :scale "5 m" :position 3
:notes "Ošetřovna, laboratoř, arboretum.")
(:id "D" :name "Recepce a výzkum"
:purpose "Vědecké laboratoře, příjem návštěvníků"
:size "Středni (A2)" :scale "5 m" :position 4
:notes "Návštěvnický dokovací port (přístup do vesmíru).")
(:id "E" :name "Kajuty a stravování"
:purpose "Ubytování posádky, stravování"
:size "Středni (A2)" :scale "5 m" :position 5
:notes "6 kajut, jídelna, tělocvična.")
(:id "F" :name "Nápravné zařízení"
:purpose "Vězeňské zařízení"
:size "Velka (A1)" :scale "5 m" :position 6
:notes "Zbrojnice. 6 průlezů na G.")
(:id "G" :name "Hangáry a údržba"
:purpose "Hangáry, dokovací porty, údržba"
:size "Velka (A1)" :scale "5 m" :position 7
:notes "2 hangáry, 2 dok. porty, 4 EVA pody, kryopody. 9 průlezů.")
(:id "H" :name "Průmyslový komplex"
:purpose "Energetika, průmysl, tavení"
:size "Velmi velka (A1, 10m meritko)" :scale "10 m" :position 8
:notes "NEJVĚTŠÍ paluba. Nádrž toxických plynů, plasma, dílny.")
(:id "I" :name "Záchranné moduly"
:purpose "Evakuace — únikové kapsle"
:size "Středni (A2)" :scale "5 m" :position 9
:notes "Záchranné moduly/kapsle.")
(:id "J" :name "Strojovna reaktoru"
:purpose "Energetický reaktor"
:size "Středni (A2)" :scale "5 m" :position 10
:notes "Nejnižší paluba. 3 baterie. Slepá ulička."))
"Data o palubách.")
;; ====================================================================
;; MISTNOSTI
;; ====================================================================
(defvar alien-rpg-rooms
'(;; === Paluba A ===
(:id "A-observator" :deck "A" :name "Observatoř"
:location "Celá paluba" :note "Jeden otevreny prostor — kopule."
:connections ("B-pruchod-A"))
;; === Paluba B ===
(:id "B-observator" :deck "B" :name "Observatoř"
:location "Sever" :note ""
:connections ("B-kancelar-vedouciho" "B-ridici-stredisko"))
(:id "B-kancelar-vedouciho" :deck "B" :name "Kancelář vedoucího stanice"
:location "Sever-střed" :note ""
:connections ("B-observator" "B-zasedaci" "B-chodba"))
(:id "B-zasedaci" :deck "B" :name "Zasedací místnost"
:location "Severozápad" :note ""
:connections ("B-kancelar-vedouciho" "B-pruchod-A"))
(:id "B-ridici-stredisko" :deck "B" :name "Řídící středisko"
:location "Severovýchod" :note "Hlavní velín."
:connections ("B-observator" "B-wc-horni" "B-chodba"))
(:id "B-wc-horni" :deck "B" :name "WC (horní)"
:location "Východ" :note ""
:connections ("B-ridici-stredisko" "B-wc-dolni"))
(:id "B-wc-dolni" :deck "B" :name "WC (dolní)"
:location "Východ" :note ""
:connections ("B-wc-horni" "B-chodba"))
(:id "B-pruchod-A" :deck "B" :name "Průchod na palubu A"
:location "Západ" :note "Jediný přístup na palubu A."
:connections ("B-zasedaci" "B-chodba" "A-observator"))
(:id "B-chodba" :deck "B" :name "Hlavní chodba"
:location "Střed" :note ""
:connections ("B-kancelar-vedouciho" "B-ridici-stredisko" "B-pruchod-A"
"B-wc-dolni" "B-mu-th-ur" "B-centralni-sachta"))
(:id "B-mu-th-ur" :deck "B" :name "MU/TH/UR"
:location "Jih-střed" :note "Hlavní počítač stanice (Mother)."
:connections ("B-chodba" "B-kuchynka"))
(:id "B-kuchynka" :deck "B" :name "Kuchyňka"
:location "Jihovýchod" :note ""
:connections ("B-mu-th-ur" "B-sklad"))
(:id "B-sklad" :deck "B" :name "Sklad"
:location "Jihovýchod" :note ""
:connections ("B-kuchynka"))
(:id "B-centralni-sachta" :deck "B" :name "Centrální šachta"
:location "Střed" :note ""
:connections ("B-chodba"
"C-centralni-sachta" "D-centralni-sachta" "E-centralni-sachta"
"F-centralni-sachta" "G-centralni-sachta" "H-centralni-sachta"
"I-centralni-sachta" "J-centralni-sachta"))
;; === Paluba C ===
(:id "C-spolecenska" :deck "C" :name "Společenská místnost"
:location "Sever" :note ""
:connections ("C-sauna" "C-wc" "C-osetrovna" "C-zotavovaci" "C-centralni-sachta"))
(:id "C-sauna" :deck "C" :name "Sauna a sprchy"
:location "Severovýchod" :note ""
:connections ("C-spolecenska"))
(:id "C-wc" :deck "C" :name "WC"
:location "Východ" :note ""
:connections ("C-spolecenska"))
(:id "C-osetrovna" :deck "C" :name "Ošetřovna a laboratoř"
:location "Severozápad" :note "Léčení, analýza vzorků."
:connections ("C-spolecenska" "C-kajuta-lekar" "C-centralni-sachta"))
(:id "C-zotavovaci" :deck "C" :name "Zotavovací místnost"
:location "Severovýchod" :note ""
:connections ("C-spolecenska" "C-kajuta-vedouci" "C-centralni-sachta"))
(:id "C-kajuta-lekar" :deck "C" :name "Kajuta lékařského důstojníka"
:location "Západ" :note ""
:connections ("C-osetrovna" "C-arboretum" "C-centralni-sachta"))
(:id "C-kajuta-vedouci" :deck "C" :name "Kajuta vedoucího stanice"
:location "Východ" :note ""
:connections ("C-zotavovaci" "C-arboretum" "C-centralni-sachta"))
(:id "C-arboretum" :deck "C" :name "Arboretum"
:location "Střed-jih" :note "Velký zelený prostor."
:connections ("C-kajuta-lekar" "C-kajuta-vedouci" "C-centralni-sachta"
"C-hydro-z" "C-hydro-v"))
(:id "C-hydro-z" :deck "C" :name "Hydroponická zahrada (Z)"
:location "Jihozápad" :note ""
:connections ("C-arboretum"))
(:id "C-hydro-v" :deck "C" :name "Hydroponická zahrada (V)"
:location "Jihovýchod" :note ""
:connections ("C-arboretum"))
(:id "C-centralni-sachta" :deck "C" :name "Centrální šachta"
:location "Střed" :note ""
:connections ("C-spolecenska" "C-osetrovna" "C-zotavovaci"
"C-kajuta-lekar" "C-kajuta-vedouci" "C-arboretum"
"B-centralni-sachta" "D-centralni-sachta" "E-centralni-sachta"
"F-centralni-sachta" "G-centralni-sachta" "H-centralni-sachta"
"I-centralni-sachta" "J-centralni-sachta"))
;; === Paluba D ===
(:id "D-merici" :deck "D" :name "Měřící stanice"
:location "Sever-střed" :note ""
:connections ("D-astro-lab" "D-kajuta-vedec"))
(:id "D-astro-lab" :deck "D" :name "Astrofyzikální laboratoř"
:location "Severozápad" :note ""
:connections ("D-merici" "D-centralni-sachta"))
(:id "D-kajuta-vedec" :deck "D" :name "Kajuta vědeckého důstojníka"
:location "Severovýchod" :note ""
:connections ("D-merici" "D-wc"))
(:id "D-wc" :deck "D" :name "WC"
:location "Východ" :note ""
:connections ("D-kajuta-vedec" "D-recepce"))
(:id "D-kancelar-inzenyr" :deck "D" :name "Kancelář vedoucího inženýra"
:location "Jihozápad" :note ""
:connections ("D-sklad" "D-recepce"))
(:id "D-sklad" :deck "D" :name "Sklad"
:location "Jihozápad" :note ""
:connections ("D-kancelar-inzenyr"))
(:id "D-recepce" :deck "D" :name "Recepce a VIP salónek"
:location "Jih-střed" :note ""
:connections ("D-wc" "D-kancelar-inzenyr" "D-dokovaci-port" "D-centralni-sachta"))
(:id "D-dokovaci-port" :deck "D" :name "Návštěvnický dokovací port"
:location "Jih" :note "Přístup do vesmíru."
:connections ("D-recepce"))
(:id "D-centralni-sachta" :deck "D" :name "Centrální šachta"
:location "Střed" :note ""
:connections ("D-astro-lab" "D-recepce"
"B-centralni-sachta" "C-centralni-sachta" "E-centralni-sachta"
"F-centralni-sachta" "G-centralni-sachta" "H-centralni-sachta"
"I-centralni-sachta" "J-centralni-sachta"))
;; === Paluba E ===
(:id "E-sklad" :deck "E" :name "Sklad"
:location "Severozápad" :note ""
:connections ("E-kajuta-1" "E-pradelna"))
(:id "E-pradelna" :deck "E" :name "Prádelna"
:location "Severovýchod" :note ""
:connections ("E-sklad" "E-kajuta-2"))
(:id "E-kajuta-1" :deck "E" :name "Kajuta 1 (levá horní)"
:location "Západ, rada 1" :note ""
: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, rada 1" :note ""
:connections ("E-pradelna" "E-kajuta-1" "E-kajuta-4" "E-chodba"))
(:id "E-kajuta-3" :deck "E" :name "Kajuta 3 (levá střední)"
:location "Západ, rada 2" :note ""
: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, rada 2" :note ""
: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, rada 3" :note ""
:connections ("E-kajuta-3" "E-kajuta-6" "E-chodba"))
(:id "E-kajuta-6" :deck "E" :name "Kajuta 6 (pravá dolní)"
:location "Východ, rada 3" :note ""
:connections ("E-kajuta-4" "E-kajuta-5" "E-chodba"))
(:id "E-chodba" :deck "E" :name "Centrální chodba"
:location "Střed" :note ""
:connections ("E-kajuta-1" "E-kajuta-2" "E-kajuta-3" "E-kajuta-4"
"E-kajuta-5" "E-kajuta-6" "E-jidelna" "E-centralni-sachta"))
(:id "E-jidelna" :deck "E" :name "Jídelna"
:location "Střed-jih" :note ""
:connections ("E-chodba" "E-wc" "E-sprchy-z" "E-satna" "E-centralni-sachta"))
(:id "E-wc" :deck "E" :name "WC"
:location "Jihozápad" :note ""
:connections ("E-jidelna" "E-sprchy-z"))
(:id "E-sprchy-z" :deck "E" :name "Sprchy (západ)"
:location "Jihozápad" :note ""
:connections ("E-wc" "E-jidelna"))
(:id "E-satna" :deck "E" :name "Šatna a sprchy (východ)"
:location "Jihovýchod" :note ""
:connections ("E-jidelna" "E-telocvicna"))
(:id "E-telocvicna" :deck "E" :name "Tělocvična"
:location "Jihovýchod" :note ""
:connections ("E-satna"))
(:id "E-centralni-sachta" :deck "E" :name "Centrální šachta"
:location "Střed" :note ""
:connections ("E-chodba" "E-jidelna"
"B-centralni-sachta" "C-centralni-sachta" "D-centralni-sachta"
"F-centralni-sachta" "G-centralni-sachta" "H-centralni-sachta"
"I-centralni-sachta" "J-centralni-sachta"))
;; === Paluba F ===
(:id "F-centralni-sachta" :deck "F" :name "Centrální šachta"
:location "Sever (vrch paluby)" :note "Šachta navrchu, chodba vede ke zbrojnici."
:connections ("F-zbrojnice"
"B-centralni-sachta" "C-centralni-sachta" "D-centralni-sachta"
"E-centralni-sachta" "G-centralni-sachta" "H-centralni-sachta"
"I-centralni-sachta" "J-centralni-sachta"))
(:id "F-zbrojnice" :deck "F" :name "Zbrojnice"
:location "Sever-střed" :note "ZBRANE."
:connections ("F-centralni-sachta" "F-kuchyne" "F-vezenska-sluzba" "F-priprava-stravy"))
(:id "F-kuchyne" :deck "F" :name "Kuchyně"
:location "Střed-sever" :note ""
:connections ("F-zbrojnice" "F-sklad-z" "F-sklad-v"))
(:id "F-vezenska-sluzba" :deck "F" :name "Vězeňská služba"
:location "Severozápad" :note ""
:connections ("F-zbrojnice" "F-udrzba-androidu"))
(:id "F-priprava-stravy" :deck "F" :name "Příprava stravy"
:location "Severovýchod" :note ""
:connections ("F-zbrojnice" "F-osetrovna" "F-pradelna"))
(:id "F-udrzba-androidu" :deck "F" :name "Údržba androidů"
:location "Západ" :note ""
:connections ("F-vezenska-sluzba" "F-sprchy-z" "F-sklad-z"))
(:id "F-osetrovna" :deck "F" :name "Ošetřovna"
:location "Východ" :note ""
:connections ("F-priprava-stravy" "F-pradelna"))
(:id "F-pradelna" :deck "F" :name "Prádelna"
:location "Východ" :note ""
:connections ("F-priprava-stravy" "F-osetrovna" "F-sprchy-v" "F-sklad-v"))
(:id "F-sprchy-z" :deck "F" :name "Sprchy (západ)"
:location "Krajní západ" :note ""
:connections ("F-udrzba-androidu" "F-sklad-z" "F-prulez-F1"))
(:id "F-sprchy-v" :deck "F" :name "Sprchy (východ)"
:location "Krajní východ" :note ""
:connections ("F-pradelna" "F-sklad-v" "F-prulez-F2"))
(:id "F-sklad-z" :deck "F" :name "Sklad (západ)"
:location "Střed-západ" :note ""
:connections ("F-kuchyne" "F-udrzba-androidu" "F-sprchy-z" "F-wc-z"))
(:id "F-sklad-v" :deck "F" :name "Sklad (východ)"
:location "Střed-východ" :note ""
:connections ("F-kuchyne" "F-pradelna" "F-sprchy-v" "F-wc-v"))
(:id "F-wc-z" :deck "F" :name "WC (západ)"
:location "Střed-západ" :note ""
:connections ("F-sklad-z" "F-prulez-F5" "F-prulez-F1"))
(:id "F-wc-v" :deck "F" :name "WC (východ)"
:location "Střed-východ" :note ""
:connections ("F-sklad-v" "F-prulez-F6" "F-prulez-F2"))
(:id "F-cely-z" :deck "F" :name "Cely (západ)"
:location "Jihozápad" :note ""
:connections ("F-prulez-F1" "F-prulez-F7" "F-sklady-jih"))
(:id "F-cely-v" :deck "F" :name "Cely (východ)"
:location "Jihovýchod" :note ""
:connections ("F-prulez-F2" "F-prulez-F8" "F-sklady-jih"))
(:id "F-sklady-jih" :deck "F" :name "Sklady (jih, 4 kusy)"
:location "Jih-střed" :note ""
:connections ("F-cely-z" "F-cely-v"))
(:id "F-prulez-F1" :deck "F" :name "Průlez F1"
:location "Západ" :note "-> G1"
:connections ("F-sprchy-z" "F-wc-z" "F-cely-z" "G-prulez-G1"))
(:id "F-prulez-F2" :deck "F" :name "Průlez F2"
:location "Východ" :note "-> G2"
:connections ("F-sprchy-v" "F-wc-v" "F-cely-v" "G-prulez-G2"))
(:id "F-prulez-F5" :deck "F" :name "Průlez F5"
:location "Střed-západ" :note "-> G5"
:connections ("F-wc-z" "G-prulez-G5"))
(:id "F-prulez-F6" :deck "F" :name "Průlez F6"
:location "Střed-východ" :note "-> G6"
:connections ("F-wc-v" "G-prulez-G6"))
(:id "F-prulez-F7" :deck "F" :name "Průlez F7"
:location "Jihozápad" :note "-> G7"
:connections ("F-cely-z" "G-prulez-G7"))
(:id "F-prulez-F8" :deck "F" :name "Průlez F8"
:location "Jihovýchod" :note "-> G8"
:connections ("F-cely-v" "G-prulez-G8"))
;; === Paluba G ===
(:id "G-shromazdiste" :deck "G" :name "Nouzové shromaždiště"
:location "Sever" :note ""
:connections ("G-nastupni-hala" "G-prulez-G9"))
(:id "G-nastupni-hala" :deck "G" :name "Nástupní hala"
:location "Sever-střed" :note ""
:connections ("G-shromazdiste" "G-prulez-G3" "G-prulez-G4"
"G-eva-sz" "G-eva-sv" "G-servis-androidu" "G-centralni-sachta"))
(:id "G-hangar-01" :deck "G" :name "Hangár 01"
:location "Západ" :note ""
:connections ("G-dokovaci-01" "G-sklady-z" "G-prulez-G5"))
(:id "G-dokovaci-01" :deck "G" :name "Dokovací port 01"
:location "Krajní západ" :note "Přístup do vesmíru."
:connections ("G-hangar-01"))
(:id "G-hangar-02" :deck "G" :name "Hangár 02"
:location "Východ" :note ""
:connections ("G-dokovaci-02" "G-sklady-v" "G-prulez-G6"))
(:id "G-dokovaci-02" :deck "G" :name "Dokovací port 02"
:location "Krajní východ" :note "Přístup do vesmíru."
:connections ("G-hangar-02"))
(:id "G-eva-sz" :deck "G" :name "EVA pod (SZ)"
:location "Střed-SZ" :note ""
:connections ("G-nastupni-hala" "G-servis-androidu"))
(:id "G-eva-sv" :deck "G" :name "EVA pod (SV)"
:location "Střed-SV" :note ""
:connections ("G-nastupni-hala" "G-servis-androidu"))
(:id "G-eva-jz" :deck "G" :name "EVA pod (JZ)"
:location "Střed-JZ" :note ""
:connections ("G-servis-androidu" "G-kryopody-z"))
(:id "G-eva-jv" :deck "G" :name "EVA pod (JV)"
:location "Střed-JV" :note ""
:connections ("G-servis-androidu" "G-kryopody-v"))
(:id "G-sklady-z" :deck "G" :name "Sklady (západ)"
:location "Západ" :note ""
:connections ("G-hangar-01" "G-centralni-sachta"))
(:id "G-sklady-v" :deck "G" :name "Sklady (východ)"
:location "Východ" :note ""
:connections ("G-hangar-02" "G-centralni-sachta"))
(:id "G-servis-androidu" :deck "G" :name "Servisní úložiště androidů"
:location "Střed" :note ""
:connections ("G-nastupni-hala" "G-eva-sz" "G-eva-sv"
"G-eva-jz" "G-eva-jv" "G-centralni-sachta"))
(:id "G-nakladovy-dok" :deck "G" :name "Nákladový dok"
:location "Jihozápad" :note ""
:connections ("G-kryopody-z" "G-prulez-G1" "G-prulez-G7"))
(:id "G-opravarensky-dok" :deck "G" :name "Opravárenský dok"
:location "Jihovýchod" :note ""
:connections ("G-kryopody-v" "G-prulez-G2" "G-prulez-G8"))
(:id "G-kryopody-z" :deck "G" :name "Nouzové kryopody (Z)"
:location "Jihozápad" :note ""
:connections ("G-eva-jz" "G-nakladovy-dok"))
(:id "G-kryopody-v" :deck "G" :name "Nouzové kryopody (V)"
:location "Jihovýchod" :note ""
:connections ("G-eva-jv" "G-opravarensky-dok"))
(:id "G-prulez-G1" :deck "G" :name "Průlez G1"
:location "Jihozápad" :note "-> F1"
:connections ("G-nakladovy-dok" "F-prulez-F1"))
(:id "G-prulez-G2" :deck "G" :name "Průlez G2"
:location "Jihovýchod" :note "-> F2"
:connections ("G-opravarensky-dok" "F-prulez-F2"))
(:id "G-prulez-G3" :deck "G" :name "Průlez G3"
:location "Severozápad" :note "-> H3"
:connections ("G-nastupni-hala" "H-prulez-H3"))
(:id "G-prulez-G4" :deck "G" :name "Průlez G4"
:location "Severovýchod" :note "-> H4"
:connections ("G-nastupni-hala" "H-prulez-H4"))
(:id "G-prulez-G5" :deck "G" :name "Průlez G5"
:location "Západ" :note "-> F5"
:connections ("G-hangar-01" "F-prulez-F5"))
(:id "G-prulez-G6" :deck "G" :name "Průlez G6"
:location "Východ" :note "-> F6"
:connections ("G-hangar-02" "F-prulez-F6"))
(:id "G-prulez-G7" :deck "G" :name "Průlez G7"
:location "Jihozápad" :note "-> H7"
:connections ("G-nakladovy-dok" "F-prulez-F7" "H-prulez-H7"))
(:id "G-prulez-G8" :deck "G" :name "Průlez G8"
:location "Jihovýchod" :note "-> H8"
:connections ("G-opravarensky-dok" "F-prulez-F8" "H-prulez-H8"))
(:id "G-prulez-G9" :deck "G" :name "Průlez G9 (komunikační věž)"
:location "Sever (vez)" :note "-> komunikační věž / H9"
:connections ("G-shromazdiste" "GH-komunikacni-vez"))
(:id "G-centralni-sachta" :deck "G" :name "Centrální šachta"
:location "Střed" :note ""
:connections ("G-nastupni-hala" "G-sklady-z" "G-sklady-v" "G-servis-androidu"
"B-centralni-sachta" "C-centralni-sachta" "D-centralni-sachta"
"E-centralni-sachta" "F-centralni-sachta" "H-centralni-sachta"
"I-centralni-sachta" "J-centralni-sachta"))
;; === Komunikacni vez (G/H) ===
(:id "GH-komunikacni-vez" :deck "GH" :name "Komunikační věž / DA/UT/UR"
:location "Mezi G a H" :note "Komunikační počítač (Daughter)."
:connections ("G-prulez-G9" "H-prulez-H9"))
;; === Paluba H ===
(:id "H-plasma-sz" :deck "H" :name "Plasmová stanice (SZ)"
:location "Severozápad" :note ""
:connections ("H-nadrz-toxickych" "H-destilacni-z"))
(:id "H-plasma-sv" :deck "H" :name "Plasmová stanice (SV)"
:location "Severovýchod" :note ""
:connections ("H-nadrz-toxickych" "H-destilacni-v"))
(:id "H-nadrz-toxickych" :deck "H" :name "Nádrž toxických plynů"
:location "Sever-střed" :note "NEBEZPEČNÉ — unik = smrt."
:connections ("H-plasma-sz" "H-plasma-sv" "H-prulez-H3" "H-prulez-H4"))
(:id "H-destilacni-z" :deck "H" :name "Destilační nádrže (Z)"
:location "Západ" :note ""
:connections ("H-plasma-sz" "H-kondenzatory-z"))
(:id "H-destilacni-v" :deck "H" :name "Destilační nádrže (V)"
:location "Východ" :note ""
:connections ("H-plasma-sv" "H-kondenzatory-v"))
(:id "H-kondenzatory-z" :deck "H" :name "Kondenzátory (Z)"
:location "Západ" :note ""
:connections ("H-destilacni-z" "H-sberac-01" "H-dilny-z"))
(:id "H-kondenzatory-v" :deck "H" :name "Kondenzátory (V)"
:location "Východ" :note ""
:connections ("H-destilacni-v" "H-sberac-02" "H-dilny-v"))
(:id "H-sberac-01" :deck "H" :name "Plasmový sběrač 01"
:location "Krajní západ" :note ""
:connections ("H-kondenzatory-z"))
(:id "H-sberac-02" :deck "H" :name "Plasmový sběrač 02"
:location "Krajní východ" :note ""
:connections ("H-kondenzatory-v"))
(:id "H-dilny-z" :deck "H" :name "Dílny (Z)"
:location "Střed-západ" :note "Nářadí."
:connections ("H-kondenzatory-z" "H-ridici-centrum"))
(:id "H-dilny-v" :deck "H" :name "Dílny (V)"
:location "Střed-východ" :note "Nářadí."
:connections ("H-kondenzatory-v" "H-ridici-centrum"))
(:id "H-ridici-centrum" :deck "H" :name "Řídící centrum"
:location "Střed" :note ""
:connections ("H-dilny-z" "H-dilny-v" "H-strojovna-z" "H-strojovna-v" "H-centralni-sachta"))
(:id "H-strojovna-z" :deck "H" :name "Strojovna (Z)"
:location "Jih-západ" :note ""
:connections ("H-ridici-centrum" "H-mag-cerpadlo"))
(:id "H-strojovna-v" :deck "H" :name "Strojovna (V)"
:location "Jih-východ" :note ""
:connections ("H-ridici-centrum" "H-mag-cerpadlo"))
(:id "H-mag-cerpadlo" :deck "H" :name "Magnetické čerpadlo"
:location "Jih-střed" :note ""
:connections ("H-strojovna-z" "H-strojovna-v" "H-taveni"))
(:id "H-taveni" :deck "H" :name "Řídící stanice tavení"
:location "Jih-střed" :note ""
:connections ("H-mag-cerpadlo" "H-plasma-jz" "H-plasma-jv"))
(:id "H-plasma-jz" :deck "H" :name "Plasmová stanice (JZ)"
:location "Jihozápad" :note ""
:connections ("H-taveni" "H-energie-z" "H-prulez-H7"))
(:id "H-plasma-jv" :deck "H" :name "Plasmová stanice (JV)"
:location "Jihovýchod" :note ""
:connections ("H-taveni" "H-energie-v" "H-prulez-H8"))
(:id "H-energie-z" :deck "H" :name "Energetické sběrné články (Z)"
:location "Krajní jihozápad" :note ""
:connections ("H-plasma-jz"))
(:id "H-energie-v" :deck "H" :name "Energetické sběrné články (V)"
:location "Krajní jihovýchod" :note ""
:connections ("H-plasma-jv"))
(:id "H-prulez-H3" :deck "H" :name "Průlez H3"
:location "Západ" :note "-> G3"
:connections ("H-nadrz-toxickych" "G-prulez-G3"))
(:id "H-prulez-H4" :deck "H" :name "Průlez H4"
:location "Východ" :note "-> G4"
:connections ("H-nadrz-toxickych" "G-prulez-G4"))
(:id "H-prulez-H7" :deck "H" :name "Průlez H7"
:location "Jihozápad" :note "-> G7"
:connections ("H-plasma-jz" "G-prulez-G7"))
(:id "H-prulez-H8" :deck "H" :name "Průlez H8"
:location "Jihovýchod" :note "-> G8"
:connections ("H-plasma-jv" "G-prulez-G8"))
(:id "H-prulez-H9" :deck "H" :name "Průlez H9 (komunikační věž)"
:location "Sever (vez)" :note "-> G9 / DA/UT/UR"
:connections ("H-centralni-sachta" "GH-komunikacni-vez"))
(:id "H-centralni-sachta" :deck "H" :name "Centrální šachta"
:location "Střed" :note ""
:connections ("H-ridici-centrum" "H-prulez-H9"
"B-centralni-sachta" "C-centralni-sachta" "D-centralni-sachta"
"E-centralni-sachta" "F-centralni-sachta" "G-centralni-sachta"
"I-centralni-sachta" "J-centralni-sachta"))
;; === Paluba I ===
(:id "I-zachranne-moduly" :deck "I" :name "Záchranné moduly"
:location "Celá paluba" :note "Únikové kapsle."
:connections ("I-centralni-sachta"))
(:id "I-centralni-sachta" :deck "I" :name "Centrální šachta"
:location "Střed" :note ""
:connections ("I-zachranne-moduly"
"B-centralni-sachta" "C-centralni-sachta" "D-centralni-sachta"
"E-centralni-sachta" "F-centralni-sachta" "G-centralni-sachta"
"H-centralni-sachta" "J-centralni-sachta"))
;; === Paluba J ===
(:id "J-baterie-horni" :deck "J" :name "Baterie (horní)"
:location "Sever-střed" :note ""
:connections ("J-centralni-sachta"))
(:id "J-baterie-leva" :deck "J" :name "Baterie (západ)"
:location "Západ" :note ""
:connections ("J-centralni-sachta"))
(:id "J-baterie-prava" :deck "J" :name "Baterie (východ)"
:location "Východ" :note ""
:connections ("J-centralni-sachta"))
(:id "J-centralni-sachta" :deck "J" :name "Centrální šachta"
:location "Střed" :note "Nejnižší paluba — jen nahoru."
:connections ("J-baterie-horni" "J-baterie-leva" "J-baterie-prava"
"B-centralni-sachta" "C-centralni-sachta" "D-centralni-sachta"
"E-centralni-sachta" "F-centralni-sachta" "G-centralni-sachta"
"H-centralni-sachta" "I-centralni-sachta")))
"Kompletní seznam místností. Ověřeno z PDF map.")
;; ====================================================================
;; POSTAVA
;; ====================================================================
(defvar alien-rpg-character
'(:name "prof. Hector 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 "Analyza: Observation → info o organismu/předmětu"
:gear ("Svítilna" "CBRN detektor" "Lokátor PDT")
:signature-item "Karta")
"Statická data postavy.")
(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"))
"Názvy dovedností.")
(defvar alien-rpg-attr-abbrevs
'((:strength . "Str") (:agility . "Agi") (:wits . "Wit") (:empathy . "Emp"))
"Zkratky atributů.")
;; ====================================================================
;; STAV HRY
;; ====================================================================
(defvar alien-rpg-state
'(:health 4
:stress 0
:current-room "B-centralni-sachta"
:weapons ()
:armor nil
:extra-gear ()
:injuries ()
:conditions ()
:xp 0
:story-points 0
:notes ()
:buddy nil
:rival nil)
"Dynamický herní stav.")
(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í.")
;; ====================================================================
;; POMOCNE 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-label (room)
"Kód a jméno: B-mu-th-ur MU/TH/UR"
(format "%s %s" (plist-get room :id) (plist-get room :name)))
(defun alien-rpg--current-room ()
"Aktuální místnost."
(alien-rpg--get-room (plist-get alien-rpg-state :current-room)))
(defun alien-rpg--connected-rooms (room)
"Propojené místnosti."
(cl-remove-if #'null
(mapcar #'alien-rpg--get-room (plist-get room :connections))))
(defun alien-rpg--rooms-on-deck (deck-id)
"Všechny místnosti na palubě."
(cl-remove-if-not
(lambda (r) (string= (plist-get r :deck) deck-id))
alien-rpg-rooms))
(defun alien-rpg--skill-total (skill-key)
"Celkový počet (atribut + dovednost)."
(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)))
(defun alien-rpg--find-all-shortest-paths (start goal)
"Najdi všechny nejkratší cesty z START do GOAL."
(let ((queue (list (list (list start))))
(visited (make-hash-table :test 'equal))
(found-paths nil)
(found-dist most-positive-fixnum))
(puthash start 0 visited)
(while queue
(let* ((path (pop queue))
(current (car (last path)))
(dist (1- (length path))))
(when (> dist found-dist)
(setq queue nil))
(when (<= dist found-dist)
(if (string= current goal)
(progn
(setq found-dist dist)
(push path found-paths))
(let ((room (alien-rpg--get-room current)))
(when room
(dolist (next (plist-get room :connections))
(let ((new-dist (1+ dist)))
(when (<= new-dist found-dist)
(let ((prev (gethash next visited)))
(when (or (null prev) (>= prev new-dist))
(puthash next new-dist visited)
(setq queue (append queue (list (append path (list next))))))))))))))))
(nreverse found-paths)))
;; ====================================================================
;; ULOZENI / NACTENI
;; ====================================================================
(defun alien-rpg-save-state ()
"Ulož herní stav."
(interactive)
(let ((file alien-rpg-state-file))
(with-temp-file file
(insert ";; Alien RPG — ulozeny herni stav\n")
(insert (format ";; %s\n" (format-time-string "%Y-%m-%d %H:%M")))
(insert "(setq alien-rpg-state\n '")
(pp alien-rpg-state (current-buffer))
(insert ")\n"))
(message "Uloženo: %s" file)))
(defun alien-rpg-load-state ()
"Načti herní stav."
(interactive)
(let ((file (or alien-rpg-state-file
(read-file-name "Načíst ze souboru: " nil nil t "alien-rpg-save.el"))))
(when (file-exists-p file)
(load file nil 'nomessage)
(setq alien-rpg-state-file file)
;; Zpětná kompatibilita — doplnit chybějící klíče
(unless (plist-member alien-rpg-state :conditions)
(plist-put alien-rpg-state :conditions nil))
(unless (plist-member alien-rpg-state :armor)
(plist-put alien-rpg-state :armor nil))
(message "Načteno: %s" file))))
(defun alien-rpg--autosave ()
"Automaticky ulož (tiše)."
(when alien-rpg-state-file
(with-temp-file alien-rpg-state-file
(insert ";; Alien RPG — ulozeny herni stav\n")
(insert (format ";; %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 nacti stav pri startu
(when (and alien-rpg-state-file (file-exists-p alien-rpg-state-file))
(load alien-rpg-state-file nil 'nomessage))
;; ====================================================================
;; INTERAKTIVNI PRIKAZY
;; ====================================================================
(defun alien-rpg-where-am-i ()
"Kde jsem — stručně."
(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 (format "%s: %s\n" (plist-get room :id) (plist-get room :name)))
(insert (format "[%s] %s -- %s\n"
(plist-get deck :id) (plist-get deck :name) (plist-get room :location)))
(when (and (plist-get room :note) (not (string-empty-p (plist-get room :note))))
(insert (format "%s\n" (plist-get room :note))))
(when same-deck
(insert (format "Na palubě: %s\n"
(mapconcat (lambda (r) (plist-get r :id)) same-deck ", "))))
(when other-deck
(let ((deck-ids (mapcar (lambda (r) (plist-get r :deck)) other-deck)))
(insert (format "Šachta: %s\n"
(string-join (cl-remove-duplicates deck-ids :test #'string=) " "))))))
(goto-char (point-min))
(special-mode))
(pop-to-buffer "*Alien RPG*")))
(defun alien-rpg-move ()
"Přesun do propojené místnosti."
(interactive)
(let* ((room (alien-rpg--current-room))
(connected (alien-rpg--connected-rooms room))
(candidates (mapcar (lambda (r)
(cons (alien-rpg--room-label r) (plist-get r :id)))
connected))
(choice (completing-read
(format "%s -> " (plist-get room :id))
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)))
(defun alien-rpg-teleport ()
"Teleport kamkoliv."
(interactive)
(let* ((candidates (mapcar (lambda (r)
(cons (alien-rpg--room-label r) (plist-get r :id)))
alien-rpg-rooms))
(choice (completing-read "Teleport: " 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)))
(defun alien-rpg-find-room ()
"Info o místnosti."
(interactive)
(let* ((candidates (mapcar (lambda (r)
(cons (alien-rpg--room-label r) r))
alien-rpg-rooms))
(choice (completing-read "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 (format "%s: %s\n" (plist-get room :id) (plist-get room :name)))
(insert (format "[%s] %s -- %s\n"
(plist-get deck :id) (plist-get deck :name) (plist-get room :location)))
(when (and (plist-get room :note) (not (string-empty-p (plist-get room :note))))
(insert (format "%s\n" (plist-get room :note))))
(insert (format "Propojení: %s\n"
(mapconcat (lambda (r) (plist-get r :id)) connected ", "))))
(goto-char (point-min))
(special-mode))
(pop-to-buffer "*Alien RPG*")))
(defun alien-rpg-find-path ()
"Všechny nejkratší cesty do cíle."
(interactive)
(let* ((start (plist-get alien-rpg-state :current-room))
(candidates (mapcar (lambda (r)
(cons (alien-rpg--room-label r) (plist-get r :id)))
alien-rpg-rooms))
(choice (completing-read "Cesta do: " candidates nil t))
(goal (cdr (assoc choice candidates)))
(paths (alien-rpg--find-all-shortest-paths start goal)))
(with-current-buffer (get-buffer-create "*Alien RPG*")
(let ((inhibit-read-only t))
(erase-buffer)
(if paths
(let ((dist (1- (length (car paths))))
(count (min 10 (length paths))))
(insert (format "%s -> %s: %d krok%s"
start goal dist
(cond ((= dist 1) "") ((< dist 5) "y") (t "u"))))
(when (> (length paths) 1)
(insert (format " (%d cest)" (length paths))))
(insert "\n")
(cl-loop for path in paths
for i from 1 to count do
(when (> count 1)
(insert (format "%d) " i)))
(insert (mapconcat #'identity path " -> "))
(insert "\n")))
(insert "Cesta nenalezena.\n")))
(goto-char (point-min))
(special-mode))
(pop-to-buffer "*Alien RPG*")))
(defun alien-rpg-deck-overview ()
"Přehled 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 (format "[%s] %s | %s\n"
deck-id (plist-get deck :name) (plist-get deck :scale)))
(dolist (r rooms)
(insert (format " %-25s %-35s %s\n"
(plist-get r :id)
(plist-get r :name)
(plist-get r :location)))))
(goto-char (point-min))
(special-mode))
(pop-to-buffer "*Alien RPG*")))
(defun alien-rpg-station-overview ()
"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 (format "%s\n" alien-rpg-station-name))
(dolist (d alien-rpg-decks)
(let* ((id (plist-get d :id))
(here (string= id current-deck))
(marker (if here "> " " ")))
(insert (format "%s%s %s\n" marker id (plist-get d :name)))
(pcase id
("A" (insert " (izolovaná, přístup jen z B)\n"))
("E" (insert " ---\n"))
("H" (insert " (průlezy G<->H)\n ---\n"))))))
(goto-char (point-min))
(special-mode))
(pop-to-buffer "*Alien RPG*")))
(defun alien-rpg-key-locations ()
"Klíčová místa."
(interactive)
(with-current-buffer (get-buffer-create "*Alien RPG*")
(let ((inhibit-read-only t))
(erase-buffer)
(insert "\
Zbrane: F-zbrojnice [F] Sever-střed
Lekar: C-osetrovna [C] SZ
Pocitac: B-mu-th-ur [B] Jih-střed
Komunikace: GH-komunikacni-vez [GH]
Hangary: G-hangar-01 [G] Z, G-hangar-02 [G] V
Kapsle: I-zachranne-moduly [I]
Kryopody: G-kryopody-z, G-kryopody-v [G]
Reaktor: J-centralni-sachta [J]
Dílny: H-dilny-z, H-dilny-v [H]
EVA: G-eva-sz, G-eva-sv, G-eva-jz, G-eva-jv [G]
Šachta: B<->C<->D<->E<->F<->G<->H<->I<->J
Pruchod B->A: B-pruchod-A [B] Západ
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
"))
(goto-char (point-min))
(special-mode))
(pop-to-buffer "*Alien RPG*"))
(defun alien-rpg-status ()
"Stav postavy — stručně."
(interactive)
(let* ((room (alien-rpg--current-room))
(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))
(conditions (plist-get alien-rpg-state :conditions)))
(with-current-buffer (get-buffer-create "*Alien RPG*")
(let ((inhibit-read-only t))
(erase-buffer)
(insert (format "%s | Health %d/4 | Stress %d\n"
(plist-get alien-rpg-character :name) health stress))
(insert (format "Pozice: %s %s [%s]\n"
(plist-get room :id) (plist-get room :name)
(plist-get room :deck)))
;; Vybava
(let ((all-gear (append gear extra)))
(insert (format "Výbava: %s\n" (if all-gear (string-join all-gear ", ") "--"))))
;; Zbrane
(insert "Zbrane: ")
(if weapons
(progn
(insert "\n")
(dolist (w weapons)
(insert (format " %s +%d/DMG%d/%s/%dks/W%s\n"
(plist-get w :name) (plist-get w :bonus)
(plist-get w :damage) (plist-get w :range)
(plist-get w :ammo) (plist-get w :weight)))))
(insert "--\n"))
;; Brneni
(insert (format "Brnění: %s\n"
(if armor
(format "%s (%d/W%s)"
(plist-get armor :name)
(plist-get armor :rating)
(plist-get armor :weight))
"--")))
;; Zraneni
(when injuries
(insert (format "Zranění: %s\n" (string-join injuries ", "))))
;; Stavy
(when conditions
(insert (format "Stavy: %s\n" (string-join conditions ", "))))
;; Vztahy
(insert (format "Buddy: %s | Rival: %s\n"
(or (plist-get alien-rpg-state :buddy) "--")
(or (plist-get alien-rpg-state :rival) "--"))))
(goto-char (point-min))
(special-mode))
(pop-to-buffer "*Alien RPG*")))
(defun alien-rpg-skills ()
"Dovednosti — seřazené od nejsilnějších."
(interactive)
(let* ((skill-data
(mapcar (lambda (sk)
(let* ((key (car sk))
(attr-key (cdr sk))
(name (cdr (assq key alien-rpg-skill-names)))
(attr-abbr (cdr (assq attr-key alien-rpg-attr-abbrevs)))
(attr-val (plist-get (plist-get alien-rpg-character :attributes) attr-key))
(skill-val (plist-get (plist-get alien-rpg-character :skills) key))
(total (+ attr-val skill-val)))
(list total name attr-abbr attr-val skill-val)))
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)
(dolist (s sorted)
(let ((total (nth 0 s))
(name (nth 1 s))
(abbr (nth 2 s))
(attr (nth 3 s))
(sk (nth 4 s)))
(if (> sk 0)
(insert (format "%d %-18s (%s %d + %d)\n" total name abbr attr sk))
(insert (format "%d %-18s (%s %d)\n" total name abbr attr)))))
(insert (format "\nTalent: %s\n" (plist-get alien-rpg-character :talent))))
(goto-char (point-min))
(special-mode))
(pop-to-buffer "*Alien RPG*")))
;; --- Upravy stavu ---
(defun alien-rpg-set-health (n)
"Nastav Health."
(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."
(interactive "nStress (0+): ")
(plist-put alien-rpg-state :stress (max 0 n))
(alien-rpg--autosave)
(message "Stress: %d" (plist-get alien-rpg-state :stress)))
(defun alien-rpg-add-injury (injury)
"Přidej zranění."
(interactive "sZranění: ")
(plist-put alien-rpg-state :injuries
(append (plist-get alien-rpg-state :injuries) (list injury)))
(alien-rpg--autosave)
(message "Zranění: %s" injury))
(defun alien-rpg-add-gear (item)
"Přidej výbavu."
(interactive "sVýbava: ")
(plist-put alien-rpg-state :extra-gear
(append (plist-get alien-rpg-state :extra-gear) (list item)))
(alien-rpg--autosave)
(message "Výbava: %s" item))
(defun alien-rpg-add-weapon ()
"Přidej zbraň se všemi parametry."
(interactive)
(let* ((name (read-string "Zbraň: "))
(bonus (read-number "Bonus: " 0))
(damage (read-number "Damage: " 1))
(range (completing-read "Range: " '("Engaged" "Short" "Medium" "Long" "Extreme") nil t))
(ammo (read-number "Ammo (0=neomezeno): " 0))
(weight (read-number "Weight: " 1))
(weapon (list :name name :bonus bonus :damage damage
:range range :ammo ammo :weight weight)))
(plist-put alien-rpg-state :weapons
(append (plist-get alien-rpg-state :weapons) (list weapon)))
(alien-rpg--autosave)
(message "Zbraň: %s +%d/DMG%d/%s" name bonus damage range)))
(defun alien-rpg-add-armor ()
"Nastav brnění."
(interactive)
(let* ((name (read-string "Brnění: "))
(rating (read-number "Rating: " 1))
(weight (read-number "Weight: " 1))
(armor (list :name name :rating rating :weight weight)))
(plist-put alien-rpg-state :armor armor)
(alien-rpg--autosave)
(message "Brnění: %s (%d/W%d)" name rating weight)))
(defun alien-rpg-add-condition ()
"Přidej stav (Fatigued, Radiation, ...)."
(interactive)
(let ((cond-name (read-string "Stav: ")))
(plist-put alien-rpg-state :conditions
(append (plist-get alien-rpg-state :conditions) (list cond-name)))
(alien-rpg--autosave)
(message "Stav: %s" cond-name)))
(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 poznámku."
(interactive "sPoznamka: ")
(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."))
(defun alien-rpg-show-notes ()
"Zobraz 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)
(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
;; ====================================================================
(with-eval-after-load 'doom-keybinds
(map! :leader
(:prefix ("G" . "Alien RPG")
: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
:desc "Stav postavy" "s" #'alien-rpg-status
:desc "Dovednosti" "i" #'alien-rpg-skills
:desc "Health" "h" #'alien-rpg-set-health
:desc "Stress" "S" #'alien-rpg-set-stress
:desc "Zraneni" "j" #'alien-rpg-add-injury
:desc "Vybava" "g" #'alien-rpg-add-gear
:desc "Zbran" "W" #'alien-rpg-add-weapon
:desc "Brneni" "a" #'alien-rpg-add-armor
:desc "Stav/condition" "c" #'alien-rpg-add-condition
:desc "Buddy" "b" #'alien-rpg-set-buddy
:desc "Rival" "R" #'alien-rpg-set-rival
:desc "Poznámka" "n" #'alien-rpg-add-note
:desc "Poznamky" "N" #'alien-rpg-show-notes
:desc "Uložit" "q" #'alien-rpg-save-state
:desc "Načíst" "Q" #'alien-rpg-load-state)))
(provide 'alien-rpg)
;;; alien-rpg.el ends here