1 (defun decode-percent-table (table)
5 (cons (- (car i) base) (cdr i))
12 ( 17 "Axe, hand (returning)")
15 ( 23 "Bola (returning)")
18 ( 43 "Dagger (returning)")
20 ( 56 "Hammer, war (returning)")
22 ( 60 "Javelin (returning)")
26 ( 79 "Net (returning)")
29 ( 97 "Spear (returning)")
32 (defparameter new-weapons
33 '((9 "D" "Axe, battle")
35 (2 "B" "Axe, hand (returning)")
38 (1 "B" "Bola (returning)")
41 (3 "B" "Dagger (returning)")
42 (4 "C" "Flail, one-handed")
43 (2 "D" "Flail, two-handed")
45 (10 "C" "Hammer, war")
47 (1 "B" "Javelin (returning)")
50 (5 "C" "Morning star")
52 (1 "B" "Net (returning)")
56 (3 "B" "Spear (returning)")
59 (defun normalize-percent-table (table)
60 (let* ((max (reduce #'+ (mapcar #'car table)))
61 (aug (mapcar (lambda (i)
62 (let* ((ideal (* 100 (/ (car i) max)))
63 (actual (max 1 (round ideal))))
64 (list* (- actual ideal) actual (cdr i))))
66 (tot (reduce #'+ (mapcar #'cadr aug))))
68 (let ((dir (signum (- 100 tot)))
76 (let ((diff (abs (- (car i) dir))))
77 (cond ((or (null best-diff) (< diff best-diff))
81 ((and (= diff best-diff)
82 (zerop (random (1+ nbest))))
86 (error "Can't normalize this table!"))
88 (incf (cadr best) dir)
92 (defun print-percent-table (table)
93 (let* ((rangetab (let ((base 1))
94 (flet ((percentage (n)
95 (format nil "~@2,,,'0A"
99 (cons (if (= (car i) 1)
107 (mapcar #'princ-to-string
109 (incf base (car i))))
111 (widths (reduce (lambda (acc item)
112 (format t "*** ~S~%" item)
113 (mapcar #'max acc (mapcar #'length item)))
115 :initial-value (mapcar (constantly 0)
118 (dolist (item rangetab)
120 (write-string " \\\\ \\hlx{+}")
126 when sep do (format t " & ")
127 do (format t "~vA" w i)
131 (write-string " \\\\ \\hlx*{vh}")