2 ;;---------------------------------------------------------------
5 (define (vehicle-broadside-facing vehicle dx dy)
6 (let ((facing (kern-obj-get-facing vehicle)))
7 (cond ((< dx 0) ;;west side
8 (if (equal? facing NORTH) NORTH SOUTH))
10 (if (equal? facing SOUTH) SOUTH NORTH))
11 ((< dy 0) ;;north side
12 (if (equal? facing WEST) WEST EAST))
13 ((> dy 0) ;;south side
14 (if (equal? facing EAST) EAST WEST))
18 (define (map-paste-centered dst-map src-map src-x src-y src-w src-h dst-x dst-y dst-w dst-h)
19 (let* ((cw (min src-w dst-w))
20 (ch (min src-h dst-h))
21 (src-cx (floor (+ src-x (/ (- src-w cw) 2))))
22 (dst-cx (floor (+ dst-x (/ (- dst-w cw) 2))))
23 (src-cy (floor (+ src-y (/ (- src-h ch) 2))))
24 (dst-cy (floor (+ dst-y (/ (- dst-h ch) 2)))))
25 (kern-blit-map dst-map dst-cx dst-cy
30 (define (place-add-objects-offset place src-x src-y src-w src-h dst-x dst-y dst-w dst-h objectlist)
31 (let* ((cw (min src-w dst-w))
32 (ch (min src-h dst-h))
33 (src-cx (floor (+ src-x (/ (- src-w cw) 2))))
34 (dst-cx (floor (+ dst-x (/ (- dst-w cw) 2))))
35 (src-cy (floor (+ src-y (/ (- src-h ch) 2))))
36 (dst-cy (floor (+ dst-y (/ (- dst-h ch) 2))))
37 (dx (- dst-cx src-cx))
38 (dy (- dst-cy src-cy)))
41 (kern-obj-put-at (car objectentry)
43 (+ (cadr objectentry) dx)
44 (+ (caddr objectentry) dy)
51 (define (mk-vehicle ktype)
52 (kern-mk-vehicle ktype north 100))
54 (define (vehicle-object-list-rotate facing n-wid n-hgt objectlist)
55 (let* ((turn-matrix (cond
56 ((equal? facing NORTH) (list 0 0 1 0 0 1))
57 ((equal? facing EAST) (list (- n-hgt 1) 0 0 -1 1 0))
58 ((equal? facing WEST) (list 0 (- n-wid 1) 0 1 -1 0))
59 (else (list (- n-wid 1) (- n-hgt 1) -1 0 0 -1))))
60 (xoff (car turn-matrix))
61 (yoff (cadr turn-matrix))
62 (xxmult (list-ref turn-matrix 2))
63 (xymult (list-ref turn-matrix 3))
64 (yxmult (list-ref turn-matrix 4))
65 (yymult (list-ref turn-matrix 5)))
70 (+ xoff (* xxmult (cadr objectentry)) (* xymult (caddr objectentry)))
71 (+ yoff (* yxmult (cadr objectentry)) (* yymult (caddr objectentry)))
78 (define (facing-turn-90right facing)
79 (cond ((equal? facing NORTH) EAST)
80 ((equal? facing WEST) NORTH)
81 ((equal? facing EAST) SOUTH)
82 ((equal? facing SOUTH) WEST)
85 (define (facing-turn-90left facing)
86 (cond ((equal? facing NORTH) WEST)
87 ((equal? facing WEST) SOUTH)
88 ((equal? facing EAST) NORTH)
89 ((equal? facing SOUTH) EAST)
93 ;;--------------------------------------------------------------------------
94 ;; vehicle objects: wheel
100 (kern-obj-set-facing kwheel (gob kwheel))
104 (mk-obj-type 't_shipswheel "ÂÉÎØ" s_shipswheel layer-mechanism shipwheel-ifc)
106 (define (vehicle-mk-wheel facing)
107 (let ((kwheel (kern-mk-obj t_shipswheel 1)))
108 (kern-obj-set-facing kwheel facing)
112 ;;---------------------------------------------------------------------------
113 ;; boarding ramp handling
119 (let* ((kloc (kern-obj-get-location kramp))
121 (wid (kern-place-get-width kplace))
122 (hgt (kern-place-get-height kplace))
125 (define (vehicle-check-ramp x y)
130 ((kern-place-is-passable (list kplace x y) kramp) 1)
132 (let ((objs (kern-get-objects-at (list kplace x y))))
133 (if (and (not (null? objs))
134 (equal? (kern-obj-get-type (car objs)) (eval 't_onramp)))
138 (define (vehicle-trigger-ramp-neighbors x y)
144 (let ((objs (kern-get-objects-at (list kplace x y))))
145 (if (and (not (null? objs))
146 (equal? (kern-obj-get-type (car objs)) (eval 't_onramp)))
147 ((kobj-ifc (car objs)) 'exec (car objs))
151 (+ (vehicle-check-ramp (+ rx 1) ry)
152 (vehicle-check-ramp (- rx 1) ry)
153 (vehicle-check-ramp rx (+ ry 1))
154 (vehicle-check-ramp rx (- ry 1))))
156 (kern-place-set-terrain (list kplace rx ry) t_deck)
157 (kern-obj-remove kramp)
158 (vehicle-trigger-ramp-neighbors (+ rx 1) ry)
159 (vehicle-trigger-ramp-neighbors (- rx 1) ry)
160 (vehicle-trigger-ramp-neighbors rx (+ ry 1))
161 (vehicle-trigger-ramp-neighbors rx (- ry 1))
163 (kern-obj-remove kramp)
168 (mk-obj-type 't_onramp nil nil layer-none onramp-ifc)
170 ;;------------------------------------------------------------------------
174 'm_ship_n 9 17 pal_expanded
176 "-- -- -- -- -- -- -- -- --";
177 "-- -- -- #e #a #f -- -- --";
178 "-- -- #e #E ee #F #f -- --";
179 "-- #e #E ee ee ee #F #f --";
180 "-- #b ee ee ee ee ee #c --";
181 "-- #b <n #= #= #= <n #c --";
182 "-- ee ee ee oo ee ee ee --";
183 "-- #b ee ee ee ee ee #c --";
184 "-- #b ee ee ee ee ee #c --";
185 "-- #b ee ee ee ee ee #c --";
186 "-- ee ee ee ee ee ee ee --";
187 "-- #b ee ee oo ee ee #c --";
188 "-- #b <s #= #= #= <s #c --";
189 "-- #b ee ee ee ee ee #c --";
190 "-- #g #G ee ee ee #H #h --";
191 "-- -- #g #d #d #d #h -- --";
192 "-- -- -- -- -- -- -- -- --";
196 'm_ship_s 9 17 pal_expanded
198 "-- -- -- -- -- -- -- -- --";
199 "-- -- #e #a #a #a #f -- --";
200 "-- #e #E ee ee ee #F #f --";
201 "-- #b ee ee ee ee ee #c --";
202 "-- #b <n #= #= #= <n #c --";
203 "-- #b ee ee oo ee ee #c --";
204 "-- ee ee ee ee ee ee ee --";
205 "-- #b ee ee ee ee ee #c --";
206 "-- #b ee ee ee ee ee #c --";
207 "-- #b ee ee ee ee ee #c --";
208 "-- ee ee ee oo ee ee ee --";
209 "-- #b <s #= #= #= <s #c --";
210 "-- #b ee ee ee ee ee #c --";
211 "-- #g #G ee ee ee #H #h --";
212 "-- -- #g #G ee #H #h -- --";
213 "-- -- -- #g #d #h -- -- --";
214 "-- -- -- -- -- -- -- -- --";
218 'm_ship_e 17 9 pal_expanded
220 "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --";
221 "-- -- #e #a #a #a ee #a #a #a ee #a #a #f -- -- --";
222 "-- #e #E ee <w ee ee ee ee ee ee <e ee #F #f -- --";
223 "-- #b ee ee #| ee ee ee ee ee ee #| ee ee #F #f --";
224 "-- #b ee ee #| oo ee ee ee ee oo #| ee ee ee #c --";
225 "-- #b ee ee #| ee ee ee ee ee ee #| ee ee #H #h --";
226 "-- #g #G ee <w ee ee ee ee ee ee <e ee #H #h -- --";
227 "-- -- #g #d #d #d ee #d #d #d ee #d #d #h -- -- --";
228 "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --";
232 'm_ship_w 17 9 pal_expanded
234 "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --";
235 "-- -- -- #e #a #a ee #a #a #a ee #a #a #a #f -- --";
236 "-- -- #e #E ee <w ee ee ee ee ee ee <e ee #F #f --";
237 "-- #e #E ee ee #| ee ee ee ee ee ee #| ee ee #c --";
238 "-- #b ee ee ee #| oo ee ee ee ee oo #| ee ee #c --";
239 "-- #g #G ee ee #| ee ee ee ee ee ee #| ee ee #c --";
240 "-- -- #g #G ee <w ee ee ee ee ee ee <e ee #H #h --";
241 "-- -- -- #g #d #d ee #d #d #d ee #d #d #d #h -- --";
242 "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --";
245 (define vehicle-ship-handler
246 (lambda (place vehicle off_x off_y)
247 (let* ((facing (vehicle-broadside-facing vehicle off_x off_y))
248 (vmap (get-cardinal-lref (list m_ship_n m_ship_w m_ship_e m_ship_s) facing))
249 (src-w (kern-terrainmap-get-width vmap))
250 (src-h (kern-terrainmap-get-height vmap))
251 (dst-x (combat-off-to-dst off_x))
252 (dst-y (combat-off-to-dst off_y))
253 (dst-w (combat-off-to-len (kern-place-get-width place) off_x))
254 (dst-h (combat-off-to-len (kern-place-get-height place) off_y)))
255 (map-paste-centered (kern-place-get-terrain-map place) vmap
257 dst-x dst-y dst-w dst-h)
258 (place-add-objects-offset place
260 dst-x dst-y dst-w dst-h
261 (vehicle-object-list-rotate facing 9 17
263 (list (vehicle-mk-wheel facing) 4 12)
264 (list (arms-mk-cannon (facing-turn-90right facing)) 7 8)
265 (list (arms-mk-cannon (facing-turn-90left facing)) 1 8)
266 (list (kern-mk-obj t_onramp 1) 0 6)
267 (list (kern-mk-obj t_onramp 1) 8 6)
268 (list (kern-mk-obj t_onramp 1) 0 10)
269 (list (kern-mk-obj t_onramp 1) 8 10)
274 (kern-mk-vehicle-type 't_ship ; tag
280 #t ; occupants die when destroyed
282 "sail" ; move description
283 sound-ship-move ; move sound
286 2 ; crosswind penalty
290 vehicle-ship-handler;
294 (kern-mk-vehicle t_ship north 100))
296 ;;----------------------------------------------------------------------------
298 ;;----------------------------------------------------------------------------
300 'm_voidship_n 9 17 pal_expanded
302 "** ** ** ** ** ** ** ** **"
303 "** ** ** ** ** ** ** ** **"
304 "** ** ** #i #A #j ** ** **"
305 "** ** #i #E ee #F #j ** **"
306 "** #i #E ee ee ee #F #j **"
307 "** #B ee ee 00 ee ee #C **"
308 "** #B ee ee 00 ee ee #C **"
309 "** #B ee ee ee ee ee #C **"
310 "** ee ee ee ee ee ee ee **"
311 "** #B ee ee ee ee ee #C **"
312 "#n #m #O ee ee ee #N #m #o"
313 "#m #m #M ee 00 ee #m #m #M"
314 "#m #m #M ee ## ee #m #m #M"
315 "#m #m #M #D ## #D #m #m #M"
316 "#m #m #M ** ** ** #m #m #M"
317 "#p #M #q ** ** ** #p #M #q"
318 "** ** ** ** ** ** ** ** **"
322 'm_voidship_s 9 17 pal_expanded
324 "** ** ** ** ** ** ** ** **"
325 "#n #m #o ** ** ** #n #m #o"
326 "#m #m #M ** ** ** #m #m #M"
327 "#m #m #M #A ## #A #m #m #M"
328 "#m #m #M ee ## ee #m #m #M"
329 "#m #m #M ee 00 ee #m #m #M"
330 "#p #M #Q ee ee ee #P #M #q"
331 "** #B ee ee ee ee ee #C **"
332 "** ee ee ee ee ee ee ee **"
333 "** #B ee ee ee ee ee #C **"
334 "** #B ee ee 00 ee ee #C **"
335 "** #B ee ee 00 ee ee #C **"
336 "** #k #G ee ee ee #H #l **"
337 "** ** #k #G ee #H #l ** **"
338 "** ** ** #k #D #l ** ** **"
339 "** ** ** ** ** ** ** ** **"
340 "** ** ** ** ** ** ** ** **"
344 'm_voidship_e 17 9 pal_expanded
346 "** #n #m #m #m #m #o ** ** ** ** ** ** ** ** ** **";
347 "** #m #m #m #m #m #M #A ee #A #A #A #j ** ** ** **";
348 "** #p #M #M #M #M #Q ee ee ee ee ee #F #j ** ** **";
349 "** ** ** #B ee ee ee ee ee ee ee ee ee #F #j ** **";
350 "** ** ** ## ## 00 ee ee ee ee 00 00 ee ee #C ** **";
351 "** ** ** #B ee ee ee ee ee ee ee ee ee #H #l ** **";
352 "** #n #m #m #m #m #O ee ee ee ee ee #H #l ** ** **";
353 "** #m #m #m #m #m #M #D ee #D #D #D #l ** ** ** **";
354 "** #p #M #M #M #M #q ** ** ** ** ** ** ** ** ** **";
359 'm_voidship_w 17 9 pal_expanded
361 "** ** ** ** ** ** ** ** ** ** #n #m #m #m #m #o **";
362 "** ** ** ** #i #A #A #A ee #A #m #m #m #m #m #M **";
363 "** ** ** #i #E ee ee ee ee ee #P #M #M #M #M #q **";
364 "** ** #i #E ee ee ee ee ee ee ee ee ee #C ** ** **";
365 "** ** #B ee ee 00 00 ee ee ee ee 00 ## ## ** ** **";
366 "** ** #k #G ee ee ee ee ee ee ee ee ee #C ** ** **";
367 "** ** ** #k #G ee ee ee ee ee #N #m #m #m #m #o **";
368 "** ** ** ** #k #D #D #D ee #D #m #m #m #m #m #M **";
369 "** ** ** ** ** ** ** ** ** ** #p #M #M #M #M #q **";
372 (define vehicle-voidship-handler
373 (lambda (place vehicle off_x off_y)
374 (let* ((facing (vehicle-broadside-facing vehicle off_x off_y))
375 (vmap (get-cardinal-lref (list m_voidship_n m_voidship_w m_voidship_e m_voidship_s) facing))
376 (src-w (kern-terrainmap-get-width vmap))
377 (src-h (kern-terrainmap-get-height vmap))
378 (dst-x (combat-off-to-dst off_x))
379 (dst-y (combat-off-to-dst off_y))
380 (dst-w (combat-off-to-len (kern-place-get-width place) off_x))
381 (dst-h (combat-off-to-len (kern-place-get-height place) off_y)))
382 (map-paste-centered (kern-place-get-terrain-map place) vmap
384 dst-x dst-y dst-w dst-h)
385 (place-add-objects-offset place
387 dst-x dst-y dst-w dst-h
388 (vehicle-object-list-rotate facing 9 17
390 (list (vehicle-mk-wheel facing) 4 6)
391 (list (arms-mk-cannon (facing-turn-90right facing)) 7 6)
392 (list (arms-mk-cannon (facing-turn-90left facing)) 1 6)
393 (list (kern-mk-obj t_onramp 1) 0 8)
394 (list (kern-mk-obj t_onramp 1) 8 8)
398 (kern-mk-vehicle-type 't_voidship ; tag
404 #t ; occupants die when destroyed
406 "sail" ; move description
407 sound-ship-move ; move sound
410 2 ; crosswind penalty
413 mmode-voidship ; pmask
414 vehicle-voidship-handler;
418 (define (mk-voidship)
419 (kern-mk-vehicle t_voidship north 100))