1 ;; Implements the Quest Log pane of the Ztats UI
3 (define (zqug-mk) (list nil nil 0 0 0))
4 (define (zqug-dims! gob dims) (set-car! gob dims))
5 (define (zqug-dims gob) (list-ref gob 0))
6 (define (zqug-party! gob kparty) (set-car! (cdr gob) kparty))
7 (define (zqug-party gob) (list-ref gob 1))
8 (define (zqug-cur-entry gob) (list-ref gob 2))
9 (define (zqug-cur-entry! gob val) (list-set-ref! gob 2 val))
10 (define (zqug-max-entry! gob val) (list-set-ref! gob 3 val))
11 (define (zqug-max-entry gob) (list-ref gob 3))
12 (define (zqug-top-entry gob) (list-ref gob 4))
13 (define (zqug-top-entry! gob val) (list-set-ref! gob 4 val))
15 (define sprite-offset-x 40)
16 (define sprite-offset-y (/ (- 32 kern-ascii-h) 2))
17 (define sprite-lineheight 40)
19 (define (zqug-store-max-entry! zqug)
20 (let ((pgob (gob (zqug-party zqug))))
23 (let ((qlst (tbl-get pgob 'quests)))
26 (zqug-max-entry! zqug (1- (length qlst)))
34 (lambda (zqug kparty dir dims)
35 (kern-status-set-title "Quest Log")
36 (zqug-dims! zqug dims)
37 (zqug-party! zqug kparty)
38 (zqug-store-max-entry! zqug)
43 (let* ((top (zqug-top-entry zqug))
44 (cur (zqug-cur-entry zqug))
45 (max (zqug-max-entry zqug))
46 (winh (/ (rect-h (zqug-dims zqug)) sprite-lineheight))
48 (maxtop (- (1+ max) winh))
51 (define (up n top cur)
52 (cond ((and (> cur 0) (> n 0))
54 (< cur (- max midwin)))
55 (up (1- n) (1- top) (1- cur))
56 (up (1- n) top (1- cur)))
59 (zqug-top-entry! zqug top)
60 (zqug-cur-entry! zqug cur)
63 (define (down n top cur)
64 (cond ((and (< cur max) (> n 0))
65 (if (and (< top maxtop)
67 (down (1- n) (1+ top) (1+ cur))
68 (down (1- n) top (1+ cur)))
71 (println "down" top " " cur)
72 (zqug-top-entry! zqug top)
73 (zqug-cur-entry! zqug cur)
76 (cond ((= dir scroll-up) (up 1 top cur) #t)
77 ((= dir scroll-down) (down 1 top cur) #t)
78 ((= dir scroll-pageup) (up winh top cur) #t)
79 ((= dir scroll-pagedown) (down winh top cur) #t)
81 (zqug-top-entry! zqug 0)
82 (zqug-cur-entry! zqug 0)
84 ((= dir scroll-bottom)
85 (zqug-top-entry! zqug maxtop)
86 (zqug-cur-entry! zqug max)
93 (let* ((dims (zqug-dims zqug))
94 (pgob (gob (zqug-party zqug)))
95 (winh (/ (rect-h dims) kern-ascii-h))
96 (top (zqug-top-entry zqug))
97 (cur (zqug-cur-entry zqug))
100 (define (scrnprn qlst entry line)
101 (if (and (notnull? qlst)
104 (scrnprn (cdr qlst) (1+ entry) line)
105 (let* ((rect (rect-crop-down dims (* line sprite-lineheight)))
106 (icon (safe-eval (qst-icon (car qlst))))
107 (colorplus (cond ((qst-complete? (car qlst)) "^c+g")
108 ((qst-failed? (car qlst)) "^c+r")
110 (rect (if (null? (quest-tbl-get (car qlst) 'qparent))
112 (rect-crop-offset rect 12 0)))
114 (if (> (rect-h rect) 0)
116 (if (not (null? icon))
117 (kern-screen-draw-sprite rect 0 icon)
119 (kern-screen-print (rect-offset rect sprite-offset-x sprite-offset-y) 0 colorplus (qst-title (car qlst)) "^c-" )
121 (kern-screen-shade rect 128)
123 (scrnprn (cdr qlst) (1+ entry) (1+ line))
129 (scrnprn "No Quests!")
130 (let ((qlst (tbl-get pgob 'quests)))
132 (scrnprn "No Quests Yet! (But keep trying!)")
136 ;; select proc - run the ztats quest applet
139 ;; ztats quest applet gob
140 (define (zqag-mk) (list nil))
141 (define (zqag-dims! zqag val) (set-car! zqag val))
142 (define (zqag-dims zqag) (car zqag))
144 (let* ((pgob (gob (zqug-party zqug)))
145 (qlst (tbl-get pgob 'quests))
149 (let ((qst (list-ref qlst (zqug-cur-entry zqug))))
153 ;; paint proc - render the quest details pane
155 (let* ((rect (zqag-dims zqag))
156 (icon (safe-eval (qst-icon qst)))
157 (line-offset sprite-lineheight)
158 (display-lines-available (floor (/ (- (rect-h rect) sprite-lineheight kern-ascii-h) kern-ascii-h)))
159 (max-offset (length (qst-descr qst)))
161 (kern-screen-erase rect)
162 (if (not (null? icon))
163 (kern-screen-draw-sprite rect 0 icon)
166 (kern-screen-print (rect-down rect sprite-offset-y) kern-sp-centered "^c+c" (qst-title qst) "^c-")
168 ;; set offset to sane values
169 (if (> offset-page (- max-offset display-lines-available))
170 (set! offset-page (- max-offset display-lines-available))
172 (if (< offset-page 0)
176 (let ((offset-loop offset-page))
178 (if (and (eqv? offset-loop 0) (< (+ line-offset kern-ascii-h kern-ascii-h) (rect-h rect)))
180 (set! line-offset (+ line-offset kern-ascii-h))
181 (kern-screen-print (rect-down rect line-offset) 0 line )
183 (set! offset-loop (- offset-loop 1))
188 (kern-screen-update rect)
193 ;; run proc - paint & push a keyhandler that exits when player hits ESC
195 ;;(kern-status-set-title "Quest") //doesnt work right
196 (zqag-dims! zqag dims)
198 (kern-event-run-keyhandler
200 (cond ((or (= key kern-key-esc)
201 (= key kern-key-space)
202 (= key kern-key-return)
203 (= key kern-key-enter))
206 (if (> offset-page 0)
207 (set! offset-page (- offset-page 1))
212 ((= key kern-key-down)
213 (set! offset-page (+ offset-page 1))
217 ((or (= key kern-key-pgup) (= key kern-key-kp-pgup))
218 (set! offset-page (- offset-page (- (floor (/ (rect-h dims) kern-ascii-h)) 7)))
219 (if (< offset-page 0)
225 ((or (= key kern-key-pgdn) (= key kern-key-kp-pgdn))
226 (set! offset-page (+ offset-page (- (floor (/ (rect-h dims) kern-ascii-h)) 7)))