1 ;;----------------------------------------------------------------------------
4 ;; Skill procedures should not do any requirements-checking because the kernel
5 ;; checks all requirements before allowing them to be called. Skill procedures
6 ;; should always return (ie, evaluate to) one of the standard result-* codes
7 ;; (eg, result-ok, result-no-target, etc... see naz.scm).
9 (define (skill-jump kactor)
11 (let ((x (* (occ-ability-stracro kactor) (kern-obj-get-ap kactor))))
12 (cond ((> x 1000) 4) ;; inconceivable!
16 (if (has-effect? kactor ef_fatigue)
18 (cast-ui-ranged-loc powers-jump
23 (define (skill-sprint kactor)
24 (if (has-effect? kactor ef_fatigue)
26 (let* ((origin (kern-obj-get-location kactor))
27 (kplace (loc-place origin))
28 (sprint-max-range (+ 2 (occ-ability-stracro kactor)))
29 (sprint-max-cost (* sprint-max-range (kern-obj-get-ap kactor)))
31 (define (too-far? origin dest)
32 (let ((path (line (loc-x origin) (loc-y origin)
33 (loc-x dest) (loc-y dest))))
34 (let ((cost (foldr (lambda (d xy)
36 (kern-place-get-movement-cost (mk-loc kplace
43 (> cost sprint-max-cost))))
44 (define (checkloc x y)
45 (let ((dest (mk-loc kplace x y)))
46 (and (kern-place-is-passable dest kactor)
47 (not (occupied? dest))
48 (kern-in-los? origin dest)
49 (not (too-far? origin dest))
51 (cast-ui-template-loc powers-sprint
53 (kern-mk-templ origin sprint-max-range 'checkloc)
56 (define (skill-wriggle kactor)
57 ;; fixme: use smart target that only suggests viable locations?
58 (cast-ui-ranged-loc powers-wriggle kactor 1 0))
60 (define (check-wriggle kactor)
61 (cond ((null? (kern-char-get-arms kactor)) #t)
63 (kern-log-msg "Must unready arms!")
68 (load "disarm-trap.scm")
70 (define (skill-stealth kactor)
71 (kern-obj-add-effect kactor ef_stealth nil)
74 (define (skill-butcher kactor)
75 (cast-ui-ranged-any powers-butcher
76 kactor 1 (occ-ability-crafting kactor)
77 (mk-ifc-query 'butcher)))
79 (define (skill-pickpocket kactor)
80 (cast-ui-basic-ranged-spell powers-pickpocket
83 (occ-ability-thief kactor)
86 ;;----------------------------------------------------------------------------
89 ;; (kern-mk-skill <tag>
94 ;; <can-use-in-wilderness?>
97 ;; <yusage-special-check-proc>
98 ;; <list-of-required-tools>
99 ;; <list-of-required-consumables>)
101 (define (mk-skill name description ap-cost mp-cost use-in-wilderness
102 is-passive yusage-proc yusage-special-check-proc list-of-required-tools list-of-required-consumables)
103 (kern-mk-skill name description ap-cost mp-cost use-in-wilderness
104 is-passive yusage-proc yusage-special-check-proc list-of-required-tools list-of-required-consumables))
108 (mk-skill "Jump" "Jump over impassable terrain"
120 (mk-skill "Arm Trap" "Allows character to use beartraps and caltrops"
132 (mk-skill "Sprint" "Move quickly, in a straight line, for a short distance"
145 (mk-skill "Wriggle" "Squeeze through tight spots"
150 'skill-wriggle ;; yusage
151 'check-wriggle ;; yusage check
153 (list (list t_grease 1)) ;; material
156 (define sk_disarm_trap
157 ;; fixme: should some special tools be required?
158 (mk-skill "Disarm Trap" "Disarm a trap on a door or chest"
163 'skill-disarm-trap ;; yusage
170 (mk-skill "Stealth" "Avoid detection"
175 'skill-stealth ;; yusage
182 (mk-skill "Reach" "Handle objects more than one tile away"
194 (mk-skill "Butcher" "Turn an animal corpse into food or materials"
199 'skill-butcher ;; yusage
201 nil ;; tools (fixme: add knife)
205 (define sk_pickpocket
206 (mk-skill "Pickpocket" "Take something from an NPC"
211 'skill-pickpocket ;; yusage
218 (mk-skill "Unlock" "Unlock a door with a picklock"
229 ;;----------------------------------------------------------------------------
230 ;; Skill Set declarations
232 ;; The number preceeding the skill name is the minimum level needed to use the
236 (kern-mk-skill-set "Warrior" (list
242 (kern-mk-skill-set "Ranger" (list
250 (kern-mk-skill-set "Wrogue" (list
254 (list 2 sk_disarm_trap)
258 (list 4 sk_pickpocket)
263 (kern-mk-skill-set "Wright" (list
266 (list 3 sk_disarm_trap)
270 (kern-mk-skill-set "Wanderer" (list
275 (list 4 sk_disarm_trap)
277 (list 5 sk_pickpocket)