aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS.md1
-rw-r--r--TODO.md2
-rw-r--r--org-d20.el38
3 files changed, 35 insertions, 6 deletions
diff --git a/NEWS.md b/NEWS.md
index 279d58c..e28052b 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,6 +1,7 @@
0.4 (unreleased)
----------------
+- New defcustom, `org-d20-display-rolls-buffer`.
- Replace some calls to `loop` with calls to `cl-loop`.
- Other code cleanup.
diff --git a/TODO.md b/TODO.md
index 4dc9be5..d9ad189 100644
--- a/TODO.md
+++ b/TODO.md
@@ -3,5 +3,3 @@ Features
- defcustom to roll each monster's initiative separately (as in 3e),
rather than having type of monster act at the same time (as in 5e)
-
-- small window with trail of recent rolls
diff --git a/org-d20.el b/org-d20.el
index 9c01e58..ed3dc7f 100644
--- a/org-d20.el
+++ b/org-d20.el
@@ -82,6 +82,11 @@ Rather than starting again for each type."
:type 'boolean
:group 'org-d20)
+(defcustom org-d20-display-rolls-buffer nil
+ "Non-nil means split the window and display history of dice rolls."
+ :type 'boolean
+ :group 'org-d20)
+
(defvar org-d20-mode-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "C-c , i") #'org-d20-initiative-dwim)
@@ -186,8 +191,8 @@ the best N of them, e.g., 4d6k3."
(frame-width))
(s-replace " " "" rolls)
rolls)))
- (message "%s = %s = %s" exp rolls-display result*))
- (message "%s = %s" exp (int-to-string result))))
+ (org-d20--record-roll "%s = %s = %s" exp rolls-display result*))
+ (org-d20--record-roll "%s = %s" exp (int-to-string result))))
(when org-d20-dice-sound
(play-sound-file org-d20-dice-sound)))
@@ -213,8 +218,8 @@ the best N of them, e.g., 4d6k3."
(disadv (if (<= fst snd)
(concat (propertize fst* 'face 'bold) " " snd*)
(concat fst* " " (propertize snd* 'face 'bold)))))
- (message "No adv./disadv.: %s\tAdv.: %s\tDisadv.: %s"
- fst* adv disadv))
+ (org-d20--record-roll "No adv./disadv.: %s\tAdv.: %s\tDisadv.: %s"
+ fst* adv disadv))
(when org-d20-dice-sound
(play-sound-file org-d20-dice-sound)))
@@ -448,5 +453,30 @@ the best N of them, e.g., 4d6k3."
(defun org-d20--d20-plus (&optional mod)
(+ 1 mod (random 20)))
+;; Record and display a new dice roll result
+(defun org-d20--record-roll (&rest args)
+ (let ((roll (apply #'format args)))
+ (with-current-buffer (get-buffer-create "*Dice Trail*")
+ (setq-local require-final-newline nil)
+ (goto-char (point-max))
+ (unless (bolp)
+ (insert "\n"))
+ (insert " " roll))
+ (cl-flet ((scroll (window)
+ (with-selected-window window
+ (goto-char (point-max))
+ (beginning-of-line)
+ (recenter -1)
+ (redisplay))))
+ (if-let ((window (get-buffer-window "*Dice Trail*")))
+ (when (window-parameter window 'org-d20--dice-trail-split)
+ (scroll window))
+ (if (and org-d20-mode org-d20-display-rolls-buffer)
+ (let ((window (split-window nil -8 'below)))
+ (set-window-buffer window "*Dice Trail*")
+ (set-window-parameter window 'org-d20--dice-trail-split t)
+ (scroll window))
+ (message roll))))))
+
(provide 'org-d20)
;;; org-d20.el ends here