The D&D Craft rules suck. They are too damn complicated & hard to predict. I think it would have been better to provide a simple formula based on the assumption that people Take 10. I need to write some code to figure out how long something will take given its price, the DC, and the skill. I hate it when the rules are so complicate that you cannot guestimate time and cost.
I think this is what happened to the authors of CrucibleOfFreya. There’s a smith having Craft (armor) +4 who will provide the party with a plate armor if they rescue his daughter. According to the craft rules, we determine the price (1500 gp = 15000 sp), and the DC (10 + 8 = 18).
Some Emacs code to help me out:
(defun d (x y) "Roll XdY." (let ((total 0)) (dotimes (i x) (setq total (+ total 1 (random y)))) total)) ;; (d 1 20) => 12 (defun craft (dc skill price) "Craft something of a given DC using a SKILL given its PRICE in gold pieces. Example: Craft (armor) +4, DC 18, 1500 gp for a village smith trying to craft a suit of plate mail." (interactive "nDC: \nnSkill: \nnPrice (gp): ") (let ((progress 0) (target (* price 10)) (raw (/ price 3)) (cost 0) (week 0)) (setq cost raw) (while (> target progress) (setq week (1+ week)) (let ((roll (+ (d 1 20) skill))) (cond ((>= roll dc) (setq progress (+ progress (* roll dc)))) ((<= roll (- dc 5)) (setq cost (+ cost (/ raw 2))))))) (message "It takes %d weeks and %d gp to craft." week cost))) ;; (craft 18 11 1500) => (51 1250) (defun sample (func) "Average 100 calls of FUNC. FUNC must be a function that takes no argument and returns a list of numbers." (let ((total nil) (sample-size 100)) (dotimes (n sample-size) (let ((result (funcall func))) (dotimes (i (length result)) (let ((r (assq i total))) (unless r (setq total (cons (cons i 0) total) r (car total))) (setcdr r (+ (cdr r) (nth i result))))))) (nreverse (mapcar (lambda (x) (/ (cdr x) sample-size)) total)))) ;; (sample (lambda () '(5 6))) => (5 6) ;; (sample (lambda () (list (random 10) (random 20)))) => (4 7)
Now we’re ready to roll!
Ordinary equipment (+0), Craft (armor) +4 as written:
(apply 'message "It takes %d weeks and %d gp on average." (sample (lambda () (craft 18 4 1500))))
⇒ It takes 112 weeks and 13042 gp on average.
Assuming enough aids to grant him a +4 bonus on average, a maxed out Craft skill ranks(+9), skill focus on that very skill (+3), and masterwork equipment (+2):
(apply 'message "It takes %d weeks and %d gp on average." (sample (lambda () (craft 18 18 1500))))
⇒ It takes 29 weeks and 500 gp on average.
It remains a formidable task!
I think for the purpose of this adventure, we’ll have to assume that Voril the smith has a nearly finished plate mail hidden in his closet.