1;;----------------------------------------------------------------------------
2;; Skill procedures
3;;
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).
8
9(define (skill-jump kactor)
10  (define (range)
11    (let ((x (* (occ-ability-stracro kactor) (kern-obj-get-ap kactor))))
12      (cond ((> x 1000) 4) ;; inconceivable!
13            ((> x 500) 3)
14            ((> x 150) 2)
15            (else 0))))
16  (if (has-effect? kactor ef_fatigue)
17      result-not-now
18      (cast-ui-ranged-loc powers-jump
19                          kactor
20                          (range)
21                          0)))
22
23(define (skill-sprint kactor)
24  (if (has-effect? kactor ef_fatigue)
25      result-not-now
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)))
30             )
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)
35                                 (+ d
36                                    (kern-place-get-movement-cost (mk-loc kplace
37                                                                          (car xy)
38                                                                          (cdr xy))
39                                                                  kactor)
40                                    ))
41                               0
42                               path)))
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))
50                 )))
51        (cast-ui-template-loc powers-sprint
52                              kactor
53                              (kern-mk-templ origin sprint-max-range 'checkloc)
54                              0))))
55
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))
59
60(define (check-wriggle kactor)
61  (cond ((null? (kern-char-get-arms kactor)) #t)
62        (else
63         (kern-log-msg "Must unready arms!")
64         #f
65         )))
66
67
68(load "disarm-trap.scm")
69
70(define (skill-stealth kactor)
71  (kern-obj-add-effect kactor ef_stealth nil)
72  result-ok)
73
74(define (skill-butcher kactor)
75  (cast-ui-ranged-any powers-butcher
76                      kactor 1 (occ-ability-crafting kactor)
77                      (mk-ifc-query 'butcher)))
78
79(define (skill-pickpocket kactor)
80  (cast-ui-basic-ranged-spell powers-pickpocket
81                              kactor
82                              1
83                              (occ-ability-thief kactor)
84                              ))
85
86;;----------------------------------------------------------------------------
87;; Skill declarations
88;;
89;; (kern-mk-skill <tag>
90;;                <name>
91;;                <description>
92;;                <ap-consumed>
93;;                <mp-consumed>
94;;                <can-use-in-wilderness?>
95;;                <is-passive?>
96;;                <yusage-proc>
97;;                <yusage-special-check-proc>
98;;                <list-of-required-tools>
99;;                <list-of-required-consumables>)
100
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))
105
106
107(define sk_jump
108  (mk-skill "Jump" "Jump over impassable terrain"
109            0
110            0
111            #f
112            #f
113           'skill-jump
114            nil
115            nil
116            nil
117            ))
118
119(define sk_arm_trap
120  (mk-skill "Arm Trap" "Allows character to use beartraps and caltrops"
121            0
122            0
123            #f
124            #t
125            nil
126            nil
127            nil
128            nil
129            ))
130
131(define sk_sprint
132  (mk-skill "Sprint" "Move quickly, in a straight line, for a short distance"
133            0
134            0
135            #f
136            #f
137            'skill-sprint
138            nil
139            nil
140            nil
141            nil
142            ))
143
144(define sk_wriggle
145  (mk-skill "Wriggle" "Squeeze through tight spots"
146            base-move-ap   ;; ap
147            0              ;; mp
148            #f             ;; wilderness?
149            #f             ;; passive?
150            'skill-wriggle ;; yusage
151            'check-wriggle ;; yusage check
152            nil            ;; tools
153            (list (list t_grease 1)) ;; material
154            ))
155
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"
159            0              ;; ap
160            0              ;; mp
161            #f             ;; wilderness?
162            #f             ;; passive?
163            'skill-disarm-trap ;; yusage
164            nil            ;; yusage check
165            nil            ;; tools
166            nil            ;; material
167            ))
168
169(define sk_stealth
170  (mk-skill "Stealth" "Avoid detection"
171            base-move-ap   ;; ap
172            0              ;; mp
173            #f             ;; wilderness?
174            #f             ;; passive?
175            'skill-stealth ;; yusage
176            nil            ;; yusage check
177            nil            ;; tools
178            nil            ;; material
179            ))
180
181(define sk_reach
182  (mk-skill "Reach" "Handle objects more than one tile away"
183            base-move-ap   ;; ap
184            0              ;; mp
185            #f             ;; wilderness?
186            #t             ;; passive?
187            nil            ;; yusage
188            nil            ;; yusage check
189            nil            ;; tools
190            nil            ;; material
191            ))
192
193(define sk_butcher
194  (mk-skill "Butcher" "Turn an animal corpse into food or materials"
195            0              ;; ap
196            0              ;; mp
197            #f             ;; wilderness?
198            #f             ;; passive?
199            'skill-butcher ;; yusage
200            nil            ;; yusage check
201            nil            ;; tools (fixme: add knife)
202            nil            ;; material
203            ))
204
205(define sk_pickpocket
206  (mk-skill "Pickpocket" "Take something from an NPC"
207            base-move-ap   ;; ap
208            0              ;; mp
209            #f             ;; wilderness?
210            #f             ;; passive?
211            'skill-pickpocket ;; yusage
212            nil            ;; yusage check
213            nil            ;; tools
214            nil            ;; material
215            ))
216
217(define sk_unlock
218  (mk-skill "Unlock" "Unlock a door with a picklock"
219            0
220            0
221            #f
222            #t ;; passive
223            'skill-unlock
224            nil
225            (list t_picklock)
226            nil
227            ))
228
229;;----------------------------------------------------------------------------
230;; Skill Set declarations
231;;
232;; The number preceeding the skill name is the minimum level needed to use the
233;; skill.
234
235(define sks_warrior
236  (kern-mk-skill-set "Warrior" (list
237                                (list 1 sk_sprint)
238                                (list 2 sk_jump)
239                                )))
240
241(define sks_ranger
242  (kern-mk-skill-set "Ranger" (list
243                                (list 1 sk_sprint)
244                                (list 2 sk_jump)
245                                (list 3 sk_arm_trap)
246                                (list 5 sk_stealth)
247                                )))
248
249(define sks_wrogue
250  (kern-mk-skill-set "Wrogue" (list
251                               (list 1 sk_sprint)
252                               (list 1 sk_arm_trap)
253                               (list 2 sk_unlock)
254                               (list 2 sk_disarm_trap)
255                               (list 3 sk_jump)
256                               (list 3 sk_wriggle)
257                               (list 4 sk_reach)
258                               (list 4 sk_pickpocket)
259                               (list 5 sk_stealth)
260                               )))
261
262(define sks_wright
263  (kern-mk-skill-set "Wright" (list
264                               (list 1 sk_arm_trap)
265                               (list 2 sk_unlock)
266                               (list 3 sk_disarm_trap)
267                               )))
268
269(define sks_wanderer
270  (kern-mk-skill-set "Wanderer" (list
271                               (list 2 sk_sprint)
272                               (list 3 sk_jump)
273                               (list 3 sk_unlock)
274                               (list 4 sk_arm_trap)
275                               (list 4 sk_disarm_trap)
276                               (list 5 sk_reach)
277                               (list 5 sk_pickpocket)
278                               (list 6 sk_stealth)
279                               )))
280