2 (define (edge-spawn-exec kwm)
4 ;;(println "edge-spawn-exec")
6 (define (get-ptype loc)
7 (println "get-ptype:" loc)
8 (terrain-to-ptype (kern-place-get-terrain loc)
9 (mean-player-party-level)))
11 (define (try-to-spawn-at loc)
12 (let ((ptype (get-ptype loc)))
13 ;;(println " try-to-spawn-at:ptype=" ptype)
14 (if (not (null? ptype))
15 (let ((kparty (ptype-generate ptype)))
16 ;; note: must put the party on the map (thus giving it a refcount)
18 ;; FIXME: what if loc is invalid? will put-at fail? will ttl then crash?
19 (kern-obj-put-at kparty loc)
20 (kern-obj-set-ttl kparty 50)
23 (define (pick-edge-tile)
26 (ploc (kern-obj-get-location (kern-get-player)))
27 (kplace (loc-place ploc))
30 (case (modulo (random-next) 4)
31 ((0) (random-loc kplace (- x ww) (- y wh) (+ 1 (* 2 ww)) 1)) ; north
32 ((1) (random-loc kplace (- x ww) (+ y wh) (+ 1 (* 2 ww)) 1)) ; south
33 ((2) (random-loc kplace (+ x ww) (- y wh) 1 (+ 1 (* 2 wh)))) ; east
34 ((3) (random-loc kplace (- x ww) (- y wh) 1 (+ 1 (* 2 wh)))) ; west
37 (define (roll-to-spawn?)
38 (>= (modulo (random-next) 100) 98))
40 (if (and (kern-place-is-wilderness? (loc-place (kern-obj-get-location (kern-get-player))))
42 (try-to-spawn-at (pick-edge-tile)))
46 (define edge-spawn-ifc
48 (method 'exec edge-spawn-exec)))
50 (mk-obj-type 't_edge_spawn nil nil layer-none edge-spawn-ifc)
52 (define (mk-edge-spawn-generator)
53 (kern-obj-set-visible (kern-mk-obj t_edge_spawn 1) #f)