diff --git a/alien-rpg.el b/alien-rpg.el index 76d22df..c21afb7 100644 --- a/alien-rpg.el +++ b/alien-rpg.el @@ -936,17 +936,55 @@ (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))) + (my-deck (plist-get room :deck)) + (connected (alien-rpg--connected-rooms room)) + (same-deck (cl-remove-if-not + (lambda (r) (string= (plist-get r :deck) my-deck)) + connected)) + (shaft-rooms (cl-remove-if-not + (lambda (r) (string-match-p "centralni-sachta" + (plist-get r :id))) + connected)) + (cross-deck (cl-remove-if + (lambda (r) (or (string= (plist-get r :deck) my-deck) + (string-match-p "centralni-sachta" + (plist-get r :id)))) + 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" + (insert (format "%s [%s]\n" (plist-get room :name) (plist-get room :id))) + (insert (format "Paluba %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 ", ")))) + (when (plist-get room :desc) + (insert (format "%s\n" (plist-get room :desc)))) + (when same-deck + (insert (format "Východy: %s\n" + (mapconcat (lambda (r) + (format "%s [%s]" + (plist-get r :name) + (plist-get r :id))) + same-deck ", ")))) + (when cross-deck + (insert (format "Průchody: %s\n" + (mapconcat (lambda (r) + (let ((d (alien-rpg--get-deck (plist-get r :deck)))) + (format "%s [%s] (paluba %s)" + (plist-get r :name) + (plist-get r :id) + (if d (plist-get d :id) (plist-get r :deck))))) + cross-deck ", ")))) + (when shaft-rooms + (let ((deck-ids (cl-remove-duplicates + (mapcar (lambda (r) (plist-get r :deck)) shaft-rooms) + :test #'string=))) + (insert (format "Šachta: %s\n" + (mapconcat (lambda (did) + (let ((d (alien-rpg--get-deck did))) + (if d + (format "%s %s" did (plist-get d :name)) + did))) + deck-ids ", ")))))) (goto-char (point-min)) (special-mode)) (pop-to-buffer "*Alien RPG*"))) @@ -955,11 +993,13 @@ "Všechny nejkratší cesty do cíle." (interactive) (let* ((start (plist-get alien-rpg-state :current-room)) + (start-room (alien-rpg--get-room start)) (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))) + (goal-room (alien-rpg--get-room goal)) (paths (alien-rpg--find-all-shortest-paths start goal))) (with-current-buffer (get-buffer-create "*Alien RPG*") (let ((inhibit-read-only t)) @@ -968,16 +1008,22 @@ (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")))) + (plist-get start-room :name) + (plist-get goal-room :name) + dist + (cond ((= dist 1) "") ((< dist 5) "y") (t "ů")))) (when (> (length paths) 1) (insert (format " (%d cest)" (length paths)))) - (insert "\n") + (insert "\n\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 (format "Cesta %d:\n" i))) + (dolist (step path) + (let ((r (alien-rpg--get-room step))) + (insert (format " - %s [%s]\n" + (if r (plist-get r :name) step) + step)))) (insert "\n"))) (insert "Cesta nenalezena.\n"))) (goto-char (point-min)) @@ -1085,18 +1131,21 @@ Průlezy G<->H: G3<->H3, G4<->H4, G7<->H7, G8<->H8, G9<->H9 (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 (format " %s +%s/DMG%s/%s/%sks/W%s\n" + (plist-get w :name) + (or (plist-get w :bonus) 0) + (or (plist-get w :damage) 0) + (or (plist-get w :range) "?") + (or (plist-get w :ammo) 0) + (or (plist-get w :weight) 0))))) (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)) + (format "%s (%s/W%s)" + (or (plist-get armor :name) "?") + (or (plist-get armor :rating) 0) + (or (plist-get armor :weight) 0)) "--"))) ;; Zraneni (when injuries