2007-06-26 Craft Skill

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))))

;; (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.



I think you missed a couple of points ;)

Well, the source book says he’s a level 6 expert with various Craft skills, including a Craft (armor) +4. I don’t dispute that this guy has not and will probably not make any plate armors. What I’m criticizing is that the module text says he’ll make a piece of plate armor in gratitude when the rules as they are written clearly require him to work on it for years. Also note my second example where I maxed out his Craft (armor) skill to +9, skill focus feat for another +3, granted him apprentices who Aid Another for another +4, masterwork equipment for another +2 – and it still takes him more than half a year. That’s Ok as far as I’m concerned. As far as CrucibleOfFreya is concerned, the rules require a different explanation for the plate armor he smith offers, that’s all.

AlexSchroeder 2007-06-28 08:07 UTC

Well, your beginning statement was “The D&D Craft rules suck.”, so it was kind of hard for me to guess that your actual critique was about the adventure and its assertion that the smith will craft that damn thing. ;)

– madalex 2007-06-28 11:03 UTC

I understand. I’ll edit the post to reflect that both the rules and this particular aspect of the module suck. :)

AlexSchroeder 2007-06-28 14:31 UTC

Please make sure you contribute only your own work, or work licensed under the GNU Free Documentation License. See Info for text formatting rules. You can edit the comment page if you need to fix typos. You can subscribe to new comments by email without leaving a comment.

To save this page you must answer this question:

Please say HELLO.