From 54bcefc4810c0da688e0e67a2ff7c011e0d6b9e8 Mon Sep 17 00:00:00 2001 From: Martin Sukany Date: Tue, 24 Mar 2026 16:37:43 +0100 Subject: [PATCH] Full character card in status, relative stress/health changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SPC G s now shows complete character card: name, career, age, attributes, non-zero skills, talent, position, gear, weapons, armor, injuries, conditions, buddy/rival, XP, story points, signature item - SPC G S (stress): now relative — enter -1 to decrease, +2 to increase. Shows delta in message. - SPC G h (health): accepts relative changes too (-1/+1) Co-Authored-By: Claude Opus 4.6 (1M context) --- alien-rpg.el | 109 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 73 insertions(+), 36 deletions(-) diff --git a/alien-rpg.el b/alien-rpg.el index d33ebc4..3647c4e 100644 --- a/alien-rpg.el +++ b/alien-rpg.el @@ -1031,33 +1031,60 @@ Průlezy G<->H: G3<->H3, G4<->H4, G7<->H7, G8<->H8, G9<->H9 (switch-to-buffer "*Alien RPG*")) (defun alien-rpg-status () - "Stav postavy — stručně." + "Herní karta — kompletní stav postavy." (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))) + (let* ((ch alien-rpg-character) + (st alien-rpg-state) + (room (alien-rpg--current-room)) + (attrs (plist-get ch :attributes)) + (health (plist-get st :health)) + (stress (plist-get st :stress)) + (weapons (plist-get st :weapons)) + (armor (plist-get st :armor)) + (gear (plist-get ch :gear)) + (extra (plist-get st :extra-gear)) + (injuries (plist-get st :injuries)) + (conditions (plist-get st :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))) + ;; Hlavicka + (insert (format "%s\n" (plist-get ch :name))) + (insert (format "%s, %s let\n" (plist-get ch :career) (plist-get ch :age))) + ;; Atributy + (insert (format "Str %s Agi %s Wit %s Emp %s\n" + (plist-get attrs :strength) (plist-get attrs :agility) + (plist-get attrs :wits) (plist-get attrs :empathy))) + ;; Health / Stress + (insert (format "Health: %d/4 | Stress: %d\n" health stress)) + ;; Dovednosti (jen nenulove) + (let ((skills-str + (mapconcat + (lambda (sk) + (let* ((key (car sk)) + (val (plist-get (plist-get ch :skills) key))) + (when (> val 0) + (format "%s %d" (cdr (assq key alien-rpg-skill-names)) val)))) + alien-rpg-skill-attributes ""))) + (insert (format "Dovednosti: %s\n" + (string-join (cl-remove-if #'null + (mapcar (lambda (sk) + (let* ((key (car sk)) + (val (plist-get (plist-get ch :skills) key))) + (when (> val 0) + (format "%s %d" (cdr (assq key alien-rpg-skill-names)) val)))) + alien-rpg-skill-attributes)) ", ")))) + ;; Talent + (insert (format "Talent: %s\n" (plist-get ch :talent))) + ;; Pozice + (insert (format "Pozice: %s [%s]\n" (plist-get room :name) (plist-get room :id))) ;; 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") + (insert "Zbraně:\n") (dolist (w weapons) (insert (format " %s +%s/DMG%s/%s/%sks/W%s\n" (plist-get w :name) @@ -1066,7 +1093,7 @@ Průlezy G<->H: G3<->H3, G4<->H4, G7<->H7, G8<->H8, G9<->H9 (or (plist-get w :range) "?") (or (plist-get w :ammo) 0) (or (plist-get w :weight) 0))))) - (insert "--\n")) + (insert "Zbraně: --\n")) ;; Brneni (insert (format "Brnění: %s\n" (if armor @@ -1075,16 +1102,19 @@ Průlezy G<->H: G3<->H3, G4<->H4, G7<->H7, G8<->H8, G9<->H9 (or (plist-get armor :rating) 0) (or (plist-get armor :weight) 0)) "--"))) - ;; Zraneni - (when injuries - (insert (format "Zranění: %s\n" (string-join injuries ", ")))) - ;; Stavy - (when conditions - (insert (format "Stavy: %s\n" (string-join conditions ", ")))) + ;; Zraneni a stavy + (insert (format "Zranění: %s\n" (if injuries (string-join injuries ", ") "--"))) + (insert (format "Stavy: %s\n" (if conditions (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) "--")))) + (or (plist-get st :buddy) "--") + (or (plist-get st :rival) "--"))) + ;; XP / Story points + (insert (format "XP: %s | Story points: %s\n" + (or (plist-get st :xp) 0) + (or (plist-get st :story-points) 0))) + ;; Signature item + (insert (format "Signature: %s\n" (or (plist-get ch :signature-item) "--")))) (goto-char (point-min)) (special-mode)) (switch-to-buffer "*Alien RPG*"))) @@ -1124,18 +1154,25 @@ Průlezy G<->H: G3<->H3, G4<->H4, G7<->H7, G8<->H8, G9<->H9 ;; --- Upravy stavu --- (defun alien-rpg-set-health (n) - "Nastav Health." - (interactive "nHealth (0-4): ") - (setq alien-rpg-state (plist-put alien-rpg-state :health (max 0 (min 4 n)))) - (alien-rpg--autosave) - (message "Health: %d/4" (plist-get alien-rpg-state :health))) + "Změň Health (+1/-1 nebo absolutně 0-4)." + (interactive "nHealth (+/-N nebo 0-4): ") + (let* ((current (plist-get alien-rpg-state :health)) + (new-val (if (and (>= n -4) (<= n 4) (/= n current) + (or (< n 0) (> (abs (- n current)) 1))) + (max 0 (min 4 (+ current n))) + (max 0 (min 4 n))))) + (setq alien-rpg-state (plist-put alien-rpg-state :health new-val)) + (alien-rpg--autosave) + (message "Health: %d/4 (%s%d)" new-val (if (>= (- new-val current) 0) "+" "") (- new-val current)))) (defun alien-rpg-set-stress (n) - "Nastav Stress." - (interactive "nStress (0+): ") - (setq alien-rpg-state (plist-put alien-rpg-state :stress (max 0 n))) - (alien-rpg--autosave) - (message "Stress: %d" (plist-get alien-rpg-state :stress))) + "Změň Stress (+N/-N relativně, zadej číslo)." + (interactive "nStress (+/-N): ") + (let* ((current (plist-get alien-rpg-state :stress)) + (new-val (max 0 (+ current n)))) + (setq alien-rpg-state (plist-put alien-rpg-state :stress new-val)) + (alien-rpg--autosave) + (message "Stress: %d (%s%d)" new-val (if (>= n 0) "+" "") n))) (defun alien-rpg-add-injury (injury) "Přidej zranění."