diff options
Diffstat (limited to 'super-bloom/game.scm')
-rw-r--r-- | super-bloom/game.scm | 138 |
1 files changed, 114 insertions, 24 deletions
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 <super-bloom-mode>) position) + (attach-to (parent mode) + (make <water> + #:rank 3 + #:position position + #:quadtree (quadtree mode)))) + +(define-method (spawn-dirt-ball (mode <super-bloom-mode>) position) + (attach-to (parent mode) + (make <dirt-ball> + #: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 <super-bloom-mode>)) + (spawn-water mode (vec2 (random:float %game-width:float) + (random:float %game-height:float)))) + +(define-method (spawn-random-dirt-ball (mode <super-bloom-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 <super-bloom-mode>)) + (spawn-random-water mode) + (sleep 1.0) + (spawn-random-water mode) + (sleep 1.0) + (spawn-random-dirt-ball mode)) + +(define-method (wave2 (mode <super-bloom-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 <super-bloom-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 <super-bloom-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 <super-bloom-mode>)) + (let ((wave (vector-ref waves (random (vector-length waves))))) + (wave mode))) + +(define-method (start-game (mode <super-bloom-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 <super-bloom-mode>)) (& (parent mode) player)) @@ -140,28 +241,6 @@ (define-method (player-move-up-stop (mode <super-bloom-mode>)) (set! (move-up? (player mode)) #f)) -(define-method (add-random-water (mode <super-bloom-mode>)) - (let ((p (vec2 (random:float %game-width:float) (random:float %game-height:float)))) - (attach-to (parent mode) - (make <water> - #:rank 3 - #:position p - #:quadtree (quadtree mode))))) - -(define-method (add-random-dirt-ball (mode <super-bloom-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 <dirt-ball> - #: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 <super-bloom-mode>)) (spray-water (player mode))) @@ -169,17 +248,27 @@ (exit-catbird)) (define-method (update (mode <super-bloom-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 <dirt-ball>) + (set! (dead? child) #t))) + scene) (replace-major-mode scene (make <win-mode>))) (begin (pk 'no-flower) (stop-moving (& scene player)) (replace-major-mode scene (make <game-over-mode>)))))) +(define-method (do-reset (mode <super-bloom-mode>)) + (clear (parent mode)) + (replace-major-mode (parent mode) (make <super-bloom-mode>))) + (bind-input <super-bloom-mode> (key-press 'escape) do-quit) (bind-input <super-bloom-mode> (key-press 'left) player-move-left) (bind-input <super-bloom-mode> (key-release 'left) player-move-left-stop) @@ -192,6 +281,7 @@ (bind-input <super-bloom-mode> (key-press 'space) add-random-water) (bind-input <super-bloom-mode> (key-press 'return) add-random-dirt-ball) (bind-input <super-bloom-mode> (key-press 'z) do-spray-water) +(bind-input <super-bloom-mode> (key-press 'r) do-reset) (define-class <game-over-mode> (<major-mode>)) |