From ceeaae033fd119d8f7ab2bc1f8e61147cd229495 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Sat, 28 Oct 2023 09:35:23 -0400 Subject: Start updating assets to use Christine's sprites; add nested scripts. --- game.scm | 125 +++++++++++++++++++++++++++++++----------- images/enemy-bullets.ase | Bin 421 -> 413 bytes images/flyer0.ase | Bin 692 -> 660 bytes images/flyer0.png | Bin 434 -> 315 bytes images/flyer1.ase | Bin 647 -> 759 bytes images/flyer1.png | Bin 314 -> 487 bytes images/map.ase | Bin 1096 -> 1238 bytes images/map.png | Bin 452 -> 659 bytes images/player.ase | Bin 908 -> 658 bytes images/player.png | Bin 285 -> 605 bytes images/popcorn.ase | Bin 536 -> 522 bytes images/popcorn.png | Bin 306 -> 355 bytes images/turret.ase | Bin 996 -> 470 bytes images/turret.png | Bin 547 -> 250 bytes level.tmx | 140 ++++++++++++++++++++++++++++++++++++++++++++--- 15 files changed, 224 insertions(+), 41 deletions(-) diff --git a/game.scm b/game.scm index 70f9c21..a82136f 100644 --- a/game.scm +++ b/game.scm @@ -205,6 +205,11 @@ (define pi/2 (/ pi 2.0)) (define tau (* pi 2.0)) + (define (do-circle proc k) + (do ((i 0 (+ i 1))) + ((= i k)) + (proc (* tau (inexact (/ i k)))))) + (define (clamp x min max) (cond ((< x min) min) ((> x max) max) @@ -359,14 +364,16 @@ ((= i num-tasks)) (vector-set! tasks i #f))))) (define *scheduler* (make-scheduler 100)) + (define current-script (make-parameter #f)) (define %script-tag (make-prompt-tag "script")) (define-type script %make-script script? (state script-state set-script-state!) - (cont script-cont set-script-cont!)) + (cont script-cont set-script-cont!) + (children script-children set-script-children!)) (define (make-script thunk) - (%make-script 'pending thunk)) + (%make-script 'pending thunk '())) (define (script-pending? script) (eq? (script-state script) 'pending)) (define (script-running? script) @@ -374,15 +381,23 @@ (define (script-cancelled? script) (eq? (script-state script) 'cancelled)) (define (script-cancel! script) - (set-script-state! script 'cancelled)) + (set-script-state! script 'cancelled) + (for-each script-cancel! (script-children script))) (define (script-run! script) (define (run thunk) (unless (script-cancelled? script) - (call-with-prompt %script-tag thunk handler))) + (call-with-prompt %script-tag + (lambda () + (parameterize ((current-script script)) + (thunk))) + handler))) (define (handler k delay) (when delay (scheduler-add! *scheduler* (lambda () (run k)) delay))) (when (script-pending? script) + (let ((parent (current-script))) + (when parent + (set-script-children! parent (cons script (script-children parent))))) (run (lambda () (set-script-state! script 'running) @@ -398,6 +413,10 @@ script)) (define (wait delay) (abort-to-prompt %script-tag delay)) + (define-syntax-rule (forever body ...) + (let loop () + body ... + (loop))) ;; Particles: (define-type particle-pool @@ -487,11 +506,11 @@ (define (explode x y) (let ((speed 1.0)) (sound-effect-play sound:explosion) - (do ((i 0 (+ i 1))) - ((= i 16)) - (let ((theta (* tau (/ i 16.0)))) - (particle-pool-add! particles 'explosion 20 x y - (* (cos theta) speed) (* (sin theta) speed)))))) + (do-circle + (lambda (theta) + (particle-pool-add! particles 'explosion 20 x y + (* (cos theta) speed) (* (sin theta) speed))) + 16))) ;; Bullets: ;; Similar to particles... but different. @@ -728,6 +747,10 @@ (vec2-x (enemy-velocity enemy))) (define (enemy-dy enemy) (vec2-y (enemy-velocity enemy))) + (define (set-enemy-dx! enemy dx) + (set-vec2-x! (enemy-velocity enemy) dx)) + (define (set-enemy-dy! enemy dy) + (set-vec2-y! (enemy-velocity enemy) dy)) (define (enemy-damage! enemy damage) (match enemy (#('enemy type health _ _ _ _ _ _ _ _ _ _) @@ -781,11 +804,12 @@ (h (vec2-y image-size))) (draw-image context image tx 0.0 w h (- x (/ w 2.0)) (- y (/ h 2.0)) w h) - (set-fill-color! context "#ff00ff80") - (fill-rect context - (- x (/ hbw 2.0)) - (- y (/ hbh 2.0)) - hbw hbh)))))) + ;; (set-fill-color! context "#ff00ff80") + ;; (fill-rect context + ;; (- x (/ hbw 2.0)) + ;; (- y (/ hbh 2.0)) + ;; hbw hbh) + ))))) (define-type enemy-pool %make-enemy-pool @@ -836,7 +860,10 @@ (set! *player-score* (+ *player-score* (enemy-points enemy)))) (when (eq? (enemy-type enemy) 'boss) - (set! *game-state* 'game-win)) + (run-script + (lambda () + (wait 60) + (set! *game-state* 'game-win)))) (enemy-pool-remove! pool i) (loop i (- k 1))) (else @@ -862,6 +889,30 @@ (define (spawn-enemy enemy) (enemy-pool-add! enemies enemy)) + (define (spawn-turret* x y script) + (spawn-enemy + (make-enemy 'turret 10 (vec2 x y) (vec2 12.0 12.0) + #t (vec2 0.0 0.0) script 100 + #(0.0 0.0 0.0 0.0) image:turret (vec2 32.0 32.0)))) + + (define (spawn-popcorn* x y script) + (spawn-enemy + (make-enemy 'popcorn 1 (vec2 x y) (vec2 12.0 12.0) + #t (vec2 0.0 0.0) script 100 + #(0.0 0.0 0.0 0.0) image:popcorn (vec2 32.0 32.0)))) + + (define (spawn-flyer0* x y script) + (spawn-enemy + (make-enemy 'flyer0 20 (vec2 x y) (vec2 12.0 12.0) + #f (vec2 0.0 0.0) script 100 + #(0.0 0.0 0.0 0.0) image:flyer0 (vec2 32.0 32.0)))) + + (define (spawn-flyer1* x y script) + (spawn-enemy + (make-enemy 'flyer1 10 (vec2 x y) (vec2 16.0 16.0) + #f (vec2 0.0 0.0) script 100 + #(0.0 0.0 0.0 0.0) image:flyer1 (vec2 32.0 32.0)))) + (define (spawn-turret x y) (define (script enemy) (let ((speed 2.0)) @@ -878,32 +929,42 @@ (* (vec2-y v) speed))) (wait 30) (loop (+ theta 0.2))))) - (spawn-enemy - (make-enemy 'turret 10 (vec2 x y) (vec2 16.0 16.0) - #t (vec2 0.0 0.0) script 100 - #(0.0 0.0 0.0 0.0) image:turret (vec2 64.0 64.0)))) + (spawn-turret* x y script)) (define (spawn-popcorn x y) - (spawn-enemy - (make-enemy 'popcorn 1 (vec2 x y) (vec2 16.0 16.0) - #t (vec2 0.0 0.0) #f 100 - #(0.0 0.0 0.0 0.0) image:popcorn (vec2 32.0 32.0)))) + (spawn-popcorn* x y #f)) (define (spawn-flyer0 x y) - (spawn-enemy - (make-enemy 'flyer0 20 (vec2 x y) (vec2 16.0 16.0) - #t (vec2 0.0 0.0) #f 100 - #(0.0 0.0 0.0 0.0) image:flyer0 (vec2 32.0 32.0)))) + (define (script flyer) + (run-script + (lambda () + (let ((speed 1.0)) + (forever + (do-circle + (lambda (theta) + (bullet-pool-add! enemy-bullets 0 + (enemy-x flyer) + (enemy-y flyer) + 2.0 2.0 + (* (cos theta) speed) + (* (sin theta) speed)) + (wait 5)) + 16))))) + (forever + (pk 'change-velocity) + (set-enemy-dx! flyer 0.5) + (wait 60) + (pk 'change-velocity) + (set-enemy-dx! flyer -0.5) + (wait 60))) + (spawn-flyer0* x y script)) (define (spawn-flyer1 x y) - (spawn-enemy - (make-enemy 'flyer1 10 (vec2 x y) (vec2 16.0 16.0) - #t (vec2 0.0 0.0) #f 100 - #(0.0 0.0 0.0 0.0) image:flyer1 (vec2 32.0 32.0)))) + (spawn-flyer1* x y #f)) (define (spawn-boss x y) (spawn-enemy - (make-enemy 'boss 100 (vec2 x y) (vec2 100.0 40.0) + (make-enemy 'boss 300 (vec2 x y) (vec2 100.0 40.0) #t (vec2 0.0 0.0) #f 1000000 #(0.0 0.0 0.0 0.0) image:boss (vec2 120.0 80.0)))) diff --git a/images/enemy-bullets.ase b/images/enemy-bullets.ase index d020498..f7fc836 100644 Binary files a/images/enemy-bullets.ase and b/images/enemy-bullets.ase differ diff --git a/images/flyer0.ase b/images/flyer0.ase index f7e7ce8..17329cb 100644 Binary files a/images/flyer0.ase and b/images/flyer0.ase differ diff --git a/images/flyer0.png b/images/flyer0.png index 2566428..6505b1d 100644 Binary files a/images/flyer0.png and b/images/flyer0.png differ diff --git a/images/flyer1.ase b/images/flyer1.ase index d64c89a..42fbe42 100644 Binary files a/images/flyer1.ase and b/images/flyer1.ase differ diff --git a/images/flyer1.png b/images/flyer1.png index 4292f5b..5298bcd 100644 Binary files a/images/flyer1.png and b/images/flyer1.png differ diff --git a/images/map.ase b/images/map.ase index 8985475..9f7deb3 100644 Binary files a/images/map.ase and b/images/map.ase differ diff --git a/images/map.png b/images/map.png index 58f01d7..cdaa5ac 100644 Binary files a/images/map.png and b/images/map.png differ diff --git a/images/player.ase b/images/player.ase index 51878b1..0a688d7 100644 Binary files a/images/player.ase and b/images/player.ase differ diff --git a/images/player.png b/images/player.png index f4ac194..03f2251 100644 Binary files a/images/player.png and b/images/player.png differ diff --git a/images/popcorn.ase b/images/popcorn.ase index a9da08c..1168e17 100644 Binary files a/images/popcorn.ase and b/images/popcorn.ase differ diff --git a/images/popcorn.png b/images/popcorn.png index ad843e9..25e8f0f 100644 Binary files a/images/popcorn.png and b/images/popcorn.png differ diff --git a/images/turret.ase b/images/turret.ase index 0cfe325..80601de 100644 Binary files a/images/turret.ase and b/images/turret.ase differ diff --git a/images/turret.png b/images/turret.png index 1e068f8..8da1a03 100644 Binary files a/images/turret.png and b/images/turret.png differ diff --git a/level.tmx b/level.tmx index 8c376b1..9bb5348 100644 --- a/level.tmx +++ b/level.tmx @@ -1,8 +1,34 @@ - + - + + + + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, @@ -42,11 +68,51 @@ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,2,0,0,0,0,0,0,0,0,0,0,0,3,1, -1,1,2,0,0,0,0,0,0,0,0,0,3,1,1 +1,1,2,0,0,0,0,0,0,0,0,0,3,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 6,0,0,0,0,0,0,0,0,0,0,0,0,0,6, 6,0,0,0,0,0,0,0,0,0,0,0,0,0,6, 6,0,0,0,0,0,0,0,0,0,0,0,0,0,6, @@ -86,13 +152,69 @@ 6,0,0,0,0,0,0,0,0,0,0,0,0,0,6, 6,0,0,0,0,0,0,0,0,0,0,0,0,0,6, 6,0,0,0,0,0,0,0,0,0,0,0,0,0,6, -6,6,0,0,0,0,0,0,0,0,0,0,0,6,6 +6,6,0,0,0,0,0,0,0,0,0,0,0,6,6, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3