Mobile enemies, more levels
This commit is contained in:
parent
6aa14d1068
commit
5650e336d1
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
(require racket/set)
|
(require racket/set)
|
||||||
(require racket/match)
|
(require racket/match)
|
||||||
|
(require racket/promise)
|
||||||
(require plot/utils) ;; for vector utilities
|
(require plot/utils) ;; for vector utilities
|
||||||
|
|
||||||
(require prospect)
|
(require prospect)
|
||||||
|
@ -299,6 +300,7 @@
|
||||||
(define game-piece-configuration-projection
|
(define game-piece-configuration-projection
|
||||||
(compile-projection (?! (game-piece-configuration ? ? ? ?))))
|
(compile-projection (?! (game-piece-configuration ? ? ? ?))))
|
||||||
(define touching-projection (compile-projection (?! (touching ? ? ?))))
|
(define touching-projection (compile-projection (?! (touching ? ? ?))))
|
||||||
|
(define level-size-projection (compile-projection (level-size (?!))))
|
||||||
|
|
||||||
(define (update-set-from-patch orig p projection)
|
(define (update-set-from-patch orig p projection)
|
||||||
(define-values (added removed) (patch-project/set/single p projection))
|
(define-values (added removed) (patch-project/set/single p projection))
|
||||||
|
@ -659,8 +661,6 @@
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; Ground Block
|
;; Ground Block
|
||||||
|
|
||||||
(define standard-ground-height 50)
|
|
||||||
|
|
||||||
(define (spawn-ground-block top-left size #:color [color "purple"])
|
(define (spawn-ground-block top-left size #:color [color "purple"])
|
||||||
(match-define (vector x y) top-left)
|
(match-define (vector x y) top-left)
|
||||||
(match-define (vector w h) size)
|
(match-define (vector w h) size)
|
||||||
|
@ -703,11 +703,57 @@
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; Enemy
|
;; Enemy
|
||||||
|
|
||||||
(define (spawn-enemy initial-x initial-y range-lo range-hi)
|
(define (spawn-enemy initial-x initial-y range-lo range-hi
|
||||||
|
#:speed [speed 0.2]
|
||||||
|
#:facing [initial-facing 'right])
|
||||||
|
(struct enemy-state [level-size facing] #:prefab)
|
||||||
|
|
||||||
(define enemy-id (gensym 'enemy))
|
(define enemy-id (gensym 'enemy))
|
||||||
|
|
||||||
(define i (icon enemy-bug planetcute-scale 9/10 1/3 5/6))
|
(define i (icon enemy-bug planetcute-scale 9/10 1/3 5/6))
|
||||||
|
(define i-flipped (struct-copy icon i [pict (flip-horizontal (icon-pict i))]))
|
||||||
(define initial-top-left (focus->top-left i initial-x initial-y))
|
(define initial-top-left (focus->top-left i initial-x initial-y))
|
||||||
|
(define initial-state (enemy-state #f initial-facing))
|
||||||
|
|
||||||
|
(define (sprite-patch s top-left)
|
||||||
|
(update-sprites #:meta-level game-level
|
||||||
|
(icon-sprite (match (enemy-state-facing s)
|
||||||
|
['right i]
|
||||||
|
['left i-flipped])
|
||||||
|
-1
|
||||||
|
top-left)))
|
||||||
|
|
||||||
|
(define (motion-patch s)
|
||||||
|
(patch-seq (retract (impulse enemy-id ?))
|
||||||
|
(assert (impulse enemy-id (vector (* speed (match (enemy-state-facing s)
|
||||||
|
['right 1]
|
||||||
|
['left -1]))
|
||||||
|
0)))))
|
||||||
|
|
||||||
|
(define ((monitor-level-size-change p) s)
|
||||||
|
(transition (for/fold [(s s)] [(vec (matcher-project/set/single (patch-added p)
|
||||||
|
level-size-projection))]
|
||||||
|
(struct-copy enemy-state s [level-size vec]))
|
||||||
|
'()))
|
||||||
|
|
||||||
|
(define ((monitor-position-change p) s)
|
||||||
|
(define positions (matcher-project/set/single (patch-added p) position-projection))
|
||||||
|
(and (not (set-empty? positions))
|
||||||
|
(match (set-first positions)
|
||||||
|
[(position _ (and top-left (vector left top)) (vector width height))
|
||||||
|
(match (enemy-state-level-size s)
|
||||||
|
[(vector _ level-height) #:when (> top level-height) (quit)]
|
||||||
|
[_
|
||||||
|
(define old-facing (enemy-state-facing s))
|
||||||
|
(define new-facing (cond [(< left range-lo) 'right]
|
||||||
|
[(> (+ left width) range-hi) 'left]
|
||||||
|
[else old-facing]))
|
||||||
|
(if (equal? old-facing new-facing)
|
||||||
|
(transition s (sprite-patch s top-left))
|
||||||
|
(let ((new-s (struct-copy enemy-state s [facing new-facing])))
|
||||||
|
(transition new-s
|
||||||
|
(list (motion-patch new-s)
|
||||||
|
(sprite-patch new-s top-left)))))])])))
|
||||||
|
|
||||||
(define ((damage-contacts p) s)
|
(define ((damage-contacts p) s)
|
||||||
(define-values (to-damage squashed?)
|
(define-values (to-damage squashed?)
|
||||||
|
@ -726,15 +772,20 @@
|
||||||
(match e
|
(match e
|
||||||
[(? patch? p)
|
[(? patch? p)
|
||||||
(sequence-transitions (transition s '())
|
(sequence-transitions (transition s '())
|
||||||
|
(monitor-level-size-change p)
|
||||||
|
(monitor-position-change p)
|
||||||
(damage-contacts p))]
|
(damage-contacts p))]
|
||||||
[_ #f]))
|
[_ #f]))
|
||||||
(void)
|
initial-state
|
||||||
(assert (game-piece-configuration enemy-id
|
(assert (game-piece-configuration enemy-id
|
||||||
initial-top-left
|
initial-top-left
|
||||||
(icon-hitbox-size i)
|
(icon-hitbox-size i)
|
||||||
(set 'touchable)))
|
(set 'mobile 'massive 'touchable)))
|
||||||
|
(sub (level-size ?))
|
||||||
|
(sub (position enemy-id ? ?))
|
||||||
(sub (touching player-id enemy-id ?))
|
(sub (touching player-id enemy-id ?))
|
||||||
(update-sprites #:meta-level game-level (icon-sprite i -1 initial-top-left))))
|
(motion-patch initial-state)
|
||||||
|
(sprite-patch initial-state initial-top-left)))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; DisplayControl
|
;; DisplayControl
|
||||||
|
@ -811,7 +862,7 @@
|
||||||
|
|
||||||
(define (spawn-level #:initial-player-x [initial-player-x 50]
|
(define (spawn-level #:initial-player-x [initial-player-x 50]
|
||||||
#:initial-player-y [initial-player-y 50]
|
#:initial-player-y [initial-player-y 50]
|
||||||
#:level-size level-size-vec
|
#:level-size [level-size-vec (vector 4000 2000)]
|
||||||
. actions)
|
. actions)
|
||||||
(spawn-world
|
(spawn-world
|
||||||
(spawn-display-controller level-size-vec)
|
(spawn-display-controller level-size-vec)
|
||||||
|
@ -820,26 +871,44 @@
|
||||||
(spawn-level-termination-monitor)
|
(spawn-level-termination-monitor)
|
||||||
actions))
|
actions))
|
||||||
|
|
||||||
(define (spawn-numbered-level level-number)
|
(define standard-ground-height 50)
|
||||||
(match level-number
|
|
||||||
[0 (spawn-level #:level-size (vector 4000 800)
|
|
||||||
(spawn-goal-piece 250 280)
|
|
||||||
(spawn-enemy 550 200 400 600)
|
|
||||||
(spawn-ground-block (vector 400 200) (vector 200 standard-ground-height))
|
|
||||||
(spawn-ground-block (vector 200 280) (vector 200 200)
|
|
||||||
#:color "orange")
|
|
||||||
(spawn-ground-block (vector 25 300) (vector 500 standard-ground-height)))]
|
|
||||||
[_ (spawn-standalone-assertions
|
|
||||||
(update-sprites #:meta-level 2
|
|
||||||
(let ((message (text "You won!" 72 "red")))
|
|
||||||
(simple-sprite 0
|
|
||||||
10
|
|
||||||
100
|
|
||||||
(image-width message)
|
|
||||||
(image-height message)
|
|
||||||
message))))]))
|
|
||||||
|
|
||||||
(define (spawn-level-spawner)
|
(define (slab left top width #:color [color "purple"])
|
||||||
|
(spawn-ground-block (vector left top) (vector width standard-ground-height) #:color color))
|
||||||
|
|
||||||
|
(define levels
|
||||||
|
(delay
|
||||||
|
(list
|
||||||
|
(spawn-level (slab 25 300 500)
|
||||||
|
(slab 500 400 500)
|
||||||
|
(slab 1000 500 400)
|
||||||
|
(spawn-goal-piece 1380 500))
|
||||||
|
(spawn-level (slab 25 300 1000)
|
||||||
|
(spawn-enemy 600 300 25 1025 #:facing 'left)
|
||||||
|
(spawn-goal-piece 980 300))
|
||||||
|
(spawn-level (spawn-goal-piece 250 280)
|
||||||
|
(spawn-enemy 550 200 400 600)
|
||||||
|
(spawn-enemy 520 200 -100 1000 #:facing 'left)
|
||||||
|
(spawn-ground-block (vector 400 200) (vector 200 standard-ground-height))
|
||||||
|
(spawn-ground-block (vector 200 280) (vector 200 200)
|
||||||
|
#:color "orange")
|
||||||
|
(spawn-ground-block (vector 25 300) (vector 500 standard-ground-height)))
|
||||||
|
)))
|
||||||
|
|
||||||
|
(define (spawn-numbered-level level-number)
|
||||||
|
(if (< level-number (length (force levels)))
|
||||||
|
(list-ref (force levels) level-number)
|
||||||
|
(spawn-standalone-assertions
|
||||||
|
(update-sprites #:meta-level 2
|
||||||
|
(let ((message (text "You won!" 72 "red")))
|
||||||
|
(simple-sprite 0
|
||||||
|
10
|
||||||
|
100
|
||||||
|
(image-width message)
|
||||||
|
(image-height message)
|
||||||
|
message))))))
|
||||||
|
|
||||||
|
(define (spawn-level-spawner starting-level)
|
||||||
(struct level-spawner-state (current-level level-complete?) #:prefab)
|
(struct level-spawner-state (current-level level-complete?) #:prefab)
|
||||||
|
|
||||||
(list (spawn (lambda (e s)
|
(list (spawn (lambda (e s)
|
||||||
|
@ -852,7 +921,7 @@
|
||||||
[(message (level-completed))
|
[(message (level-completed))
|
||||||
(transition (struct-copy level-spawner-state s [level-complete? #t]) '())]
|
(transition (struct-copy level-spawner-state s [level-complete? #t]) '())]
|
||||||
[_ #f]))
|
[_ #f]))
|
||||||
(level-spawner-state 0 #f)
|
(level-spawner-state starting-level #f)
|
||||||
(sub (level-running))
|
(sub (level-running))
|
||||||
(sub (level-completed)))
|
(sub (level-completed)))
|
||||||
(spawn-numbered-level 0)))
|
(spawn-numbered-level 0)))
|
||||||
|
@ -865,6 +934,6 @@
|
||||||
(spawn-keyboard-integrator)
|
(spawn-keyboard-integrator)
|
||||||
(spawn-scene-manager)
|
(spawn-scene-manager)
|
||||||
(spawn-world (spawn-score-keeper)
|
(spawn-world (spawn-score-keeper)
|
||||||
(spawn-level-spawner)
|
(spawn-level-spawner 0)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue