From feed38794b0209d4defc3b7f110043b5ec86e92f Mon Sep 17 00:00:00 2001 From: David Thompson Date: Sun, 4 Jun 2023 10:55:00 -0400 Subject: An attempt to make things somewhat playable. --- super-bloom/game.scm | 138 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 114 insertions(+), 24 deletions(-) (limited to 'super-bloom/game.scm') diff --git a/super-bloom/game.scm b/super-bloom/game.scm index f5f1d99..9d0dbeb 100644 --- a/super-bloom/game.scm +++ b/super-bloom/game.scm @@ -28,6 +28,7 @@ #:use-module (chickadee graphics texture) #:use-module (chickadee math rect) #:use-module (chickadee math vector) + #:use-module (chickadee scripting) #:use-module (oop goops) #:use-module (super-bloom actor) #:use-module (super-bloom common) @@ -117,8 +118,108 @@ #:position (vec2 (/ %game-width:float 2.0) (/ %game-height:float 2.0)) #:quadtree (quadtree mode) - #:growth-goal 10 - #:growth-interval 0.5)))) + #:growth-goal 20 + #:growth-interval 3.0)) + (start-game mode))) + +(define-method (spawn-water (mode ) position) + (attach-to (parent mode) + (make + #:rank 3 + #:position position + #:quadtree (quadtree mode)))) + +(define-method (spawn-dirt-ball (mode ) position) + (attach-to (parent mode) + (make + #:rank 3 + #:position position + #:quadtree (quadtree mode) + #:flower (& (parent mode) flower) + #:speed 1.0 + #:explosion-particles (& (parent mode) explosion-particles)))) + +(define-method (spawn-random-water (mode )) + (spawn-water mode (vec2 (random:float %game-width:float) + (random:float %game-height:float)))) + +(define-method (spawn-random-dirt-ball (mode )) + (spawn-dirt-ball mode (vec2 (if (= (random 2) 0) + -32.0 + (+ %game-width:float 32.0)) + (+ (/ %game-height 2.0) + (* (/ %game-height 2.0) + (- (random:float 2.0) 1.0)))))) + +(define-method (wave1 (mode )) + (spawn-random-water mode) + (sleep 1.0) + (spawn-random-water mode) + (sleep 1.0) + (spawn-random-dirt-ball mode)) + +(define-method (wave2 (mode )) + (spawn-random-water mode) + (spawn-random-water mode) + (sleep 1.0) + (spawn-random-water mode) + (spawn-random-water mode) + (sleep 1.0) + (spawn-random-dirt-ball mode) + (sleep 1.0) + (spawn-random-dirt-ball mode) + (sleep 1.0) + (spawn-random-dirt-ball mode)) + +(define-method (wave3 (mode )) + (spawn-random-water mode) + (spawn-random-water mode) + (spawn-random-water mode) + (spawn-random-water mode) + (spawn-random-water mode) + (spawn-random-water mode) + (sleep 1.0) + (spawn-random-dirt-ball mode) + (sleep 1.0) + (spawn-random-dirt-ball mode) + (spawn-random-dirt-ball mode) + (sleep 1.0) + (spawn-random-dirt-ball mode)) + +(define hw (/ %game-width:float 2.0)) +(define hh (/ %game-height:float 2.0)) + +(define-method (wave4 (mode )) + (let ((offset 200.0)) + (spawn-random-water mode) + (spawn-random-water mode) + (sleep 1.0) + (spawn-dirt-ball mode (vec2 hw (+ hh offset))) + (spawn-dirt-ball mode (vec2 hw (- hh offset))) + (spawn-dirt-ball mode (vec2 (+ hw offset) hh)) + (spawn-dirt-ball mode (vec2 (- hw offset) hh)))) + +(define waves (vector wave1 wave2 wave3 wave4)) + +(define-method (do-random-wave (mode )) + (let ((wave (vector-ref waves (random (vector-length waves))))) + (wave mode))) + +(define-method (start-game (mode )) + (run-script mode + (spawn-water mode (vec2 120.0 100.0)) + (sleep 1.0) + (spawn-water mode (vec2 160.0 140.0)) + (sleep 1.0) + (spawn-water mode (vec2 200.0 100.0)) + (sleep 3.0) + (wave1 mode) + (sleep 5.0) + (wave2 mode) + (sleep 5.0) + (forever + (do-random-wave mode) + (sleep 5.0)))) (define-method (player (mode )) (& (parent mode) player)) @@ -140,28 +241,6 @@ (define-method (player-move-up-stop (mode )) (set! (move-up? (player mode)) #f)) -(define-method (add-random-water (mode )) - (let ((p (vec2 (random:float %game-width:float) (random:float %game-height:float)))) - (attach-to (parent mode) - (make - #:rank 3 - #:position p - #:quadtree (quadtree mode))))) - -(define-method (add-random-dirt-ball (mode )) - (let ((p (vec2 (if (= (random 2) 0) -32.0 (+ %game-width:float 32.0)) - (+ (/ %game-height 2.0) - (* (/ %game-height 2.0) - (- (random:float 2.0) 1.0)))))) - (attach-to (parent mode) - (make - #:rank 3 - #:position p - #:quadtree (quadtree mode) - #:flower (& (parent mode) flower) - #:speed 1.0 - #:explosion-particles (& (parent mode) explosion-particles))))) - (define-method (do-spray-water (mode )) (spray-water (player mode))) @@ -169,17 +248,27 @@ (exit-catbird)) (define-method (update (mode ) dt) + (with-agenda (agenda mode) + (update-agenda dt)) (let* ((scene (parent mode)) (flower (& scene flower))) (if flower (when (= (growth-progress flower) (growth-goal flower)) (stop-moving (& scene player)) + (for-each-child (lambda (child) + (when (is-a? child ) + (set! (dead? child) #t))) + scene) (replace-major-mode scene (make ))) (begin (pk 'no-flower) (stop-moving (& scene player)) (replace-major-mode scene (make )))))) +(define-method (do-reset (mode )) + (clear (parent mode)) + (replace-major-mode (parent mode) (make ))) + (bind-input (key-press 'escape) do-quit) (bind-input (key-press 'left) player-move-left) (bind-input (key-release 'left) player-move-left-stop) @@ -192,6 +281,7 @@ (bind-input (key-press 'space) add-random-water) (bind-input (key-press 'return) add-random-dirt-ball) (bind-input (key-press 'z) do-spray-water) +(bind-input (key-press 'r) do-reset) (define-class ()) -- cgit v1.2.3