1;; rune sprites
2
3;; also used where external events trigger quest
4(define (rune-basic-quest questtag questicon)
5   	(quest-data-complete questtag)
6	(quest-data-assign-once questtag)
7	(quest-data-update-with questtag 'done 1 (grant-party-xp-fn 50))
8	(qst-set-icon! (quest-get questtag) questicon)
9	)
10
11(define (rune-basic-get kobj kchar questtag)
12  ;; Get the sprite before picking up the object, because picking it up will
13  ;; deallocate it.
14  (let ((sprite (kern-obj-get-sprite kobj)))
15    (kobj-get kobj kchar)
16    (rune-basic-quest questtag sprite)))
17
18;; rune interface: when a rune is used on a special altar, it transforms the
19;; alter and signals the demon gate mechanism
20(define (rune-use ktype kuser)
21  (let ((loc (get-target-loc kuser 1)))
22    (cond ((null? loc)
23           result-no-target)
24          ((eqv? (kern-place-get-terrain loc) t_rune_altar)
25           (shake-map 5)
26           (kern-log-msg "A LOCK IS RELEASED!")
27           (kern-obj-remove-from-inventory kuser ktype 1)
28           (kern-place-set-terrain loc t_active_altar)
29           (send-signal kuser demon-gate 'on)
30           result-ok)
31          (else
32           result-not-here))))
33
34(define rune-ifc
35  (ifc obj-ifc
36       (method 'use rune-use)
37       ))
38
39;; special extended interface for rune of leadership: summon the ghost of the
40;; warritrix when the player picks it up
41(define (rune-li-get kobj kchar)
42  (kern-log-msg "An apparition appears!")
43  (kern-obj-put-at (mk-warritrix)
44                   (kern-obj-get-location kobj))
45  (let ((sprite (kern-obj-get-sprite kobj)))
46    (kern-obj-remove kobj)
47    (kobj-get (kern-mk-obj t_rune_l 1) kchar)
48    (rune-basic-quest 'questentry-rune-l sprite))
49  )
50(define rune-li-ifc
51  (ifc rune-ifc
52       (method 'get rune-li-get)))
53
54;; trigger quest update
55(define (rune-l-get kobj kchar)
56	(rune-basic-get kobj kchar 'questentry-rune-p)
57	)
58(define rune-l-ifc
59  (ifc rune-ifc
60       (method 'get rune-l-get)))
61
62;; trigger quest update
63(define (rune-k-receive ktype kchar)
64	(quest-data-update-with 'questentry-thiefrune 'recovered 1 (quest-notify (grant-party-xp-fn 50)))
65	(quest-data-update 'questentry-rune-k 'player-got-rune 1)
66	)
67(define (rune-k-get kobj kchar)
68	(rune-k-receive kobj kchar)
69	(kobj-get kobj kchar)
70	)
71(define rune-k-ifc
72  (ifc rune-ifc
73       (method 'get rune-k-get)
74       (method 'receive rune-k-receive)
75       ))
76
77;; trigger quest update
78(define (rune-p-get kobj kchar)
79	(rune-basic-get kobj kchar 'questentry-rune-p)
80	)
81(define rune-p-ifc
82  (ifc rune-ifc
83       (method 'get rune-p-get)))
84
85;; trigger quest update
86(define (rune-w-get kobj kchar)
87	(rune-basic-get kobj kchar 'questentry-rune-w)
88	)
89(define rune-w-ifc
90  (ifc rune-ifc
91       (method 'get rune-w-get)))
92
93;; trigger quest update
94(define (rune-f-get kobj kchar)
95	(rune-basic-get kobj kchar 'questentry-rune-f)
96	)
97(define rune-f-ifc
98  (ifc rune-ifc
99       (method 'get rune-f-get)))
100
101;; trigger quest update
102(define (rune-d-get kobj kchar)
103	(rune-basic-get kobj kchar 'questentry-rune-d)
104	)
105(define rune-d-ifc
106  (ifc rune-ifc
107       (method 'get rune-d-get)))
108
109;; trigger quest update
110(define (rune-c-get kobj kchar)
111	(rune-basic-get kobj kchar 'questentry-rune-c)
112	)
113(define rune-c-ifc
114  (ifc rune-ifc
115       (method 'get rune-c-get)))
116
117;; trigger quest update
118(define (rune-s-get kobj kchar)
119	(rune-basic-get kobj kchar 'questentry-rune-s)
120	)
121(define rune-s-ifc
122  (ifc rune-ifc
123       (method 'get rune-s-get)))
124
125;; rune types
126(mk-quest-obj-type 't_rune_k "Rune of Knowledge" s_runestone_k layer-item rune-k-ifc)
127(mk-quest-obj-type 't_rune_p "Rune of Power" s_runestone_p layer-item rune-p-ifc)
128(mk-quest-obj-type 't_rune_s "Rune of Skill" s_runestone_s layer-item rune-s-ifc)
129(mk-quest-obj-type 't_rune_c "Rune of Curiosity" s_runestone_c layer-item rune-c-ifc)
130(mk-quest-obj-type 't_rune_f "Rune of Freedom" s_runestone_f layer-item rune-f-ifc)
131(mk-quest-obj-type 't_rune_w "Rune of Wisdom" s_runestone_w layer-item rune-w-ifc)
132(mk-quest-obj-type 't_rune_d "Rune of Discretion" s_runestone_d layer-item rune-d-ifc)
133(mk-quest-obj-type 't_rune_l "Rune of Leadership" s_runestone_l layer-item rune-l-ifc)
134(mk-quest-obj-type 't_rune_l_init "Rune of Leadership" s_runestone_l layer-item rune-li-ifc)
135
136;; list of all rune types
137(define rune-types
138  (list t_rune_k
139        t_rune_p
140        t_rune_s
141        t_rune_c
142        t_rune_l
143        t_rune_f
144        t_rune_w
145        t_rune_d))
146
147;; check if kpc has all the runes in inventory
148(define (has-all-runes? kpc)
149  (all-in-inventory? kpc rune-types))
150