summaryrefslogtreecommitdiff
path: root/lisparuga/game.scm
diff options
context:
space:
mode:
Diffstat (limited to 'lisparuga/game.scm')
-rw-r--r--lisparuga/game.scm184
1 files changed, 115 insertions, 69 deletions
diff --git a/lisparuga/game.scm b/lisparuga/game.scm
index 9e79898..f5b3082 100644
--- a/lisparuga/game.scm
+++ b/lisparuga/game.scm
@@ -23,6 +23,7 @@
(define-module (lisparuga game)
#:use-module (chickadee)
+ #:use-module (chickadee math)
#:use-module (chickadee math rect)
#:use-module (chickadee math vector)
#:use-module (chickadee render color)
@@ -62,7 +63,16 @@
;; scrolling background
(define-class <game> (<canvas>)
(player-control? #:accessor player-control? #:init-value #f)
- (complete? #:accessor complete? #:init-value #f))
+ (complete? #:accessor complete? #:init-value #f)
+ (skip-tutorial? #:accessor skip-tutorial? #:init-value #f))
+
+(define-method (reset (game <game>))
+ (set! (player-control? game) #f)
+ (set! (complete? game) #f)
+ (reset (& game player))
+ (for-each detach (children (& game enemies)))
+ (let ((battle-report (& game battle-report)))
+ (and battle-report (detach battle-report))))
(define-method (initialize (game <game>) initargs)
(next-method)
@@ -81,6 +91,7 @@
#:rank 2
#:capacity 500
#:texture-atlas player-bullet-atlas))
+ (player (make-player player-bullets))
(enemy-bullets (make <bullet-field>
#:name 'enemy-bullets
#:rank 5
@@ -98,11 +109,13 @@
(ui (make <node-2d>
#:name 'ui
#:rank 999)))
+ (set! (rank player) 1)
(attach-to game
(make <sprite>
#:name 'clouds
#:rank 0
#:texture clouds)
+ player
player-bullets
(make <node-2d>
#:name 'enemies
@@ -128,26 +141,11 @@
#:align 'right)
(make <label>
#:name 'lives
- #:position (vec2 2.0 2.0)))
- (start-stage game)))
+ #:position (vec2 2.0 2.0)))))
(define-method (start-stage (game <game>))
- (let ((player (make-player (& game player-bullets))))
- (set! (rank player) 1)
- (attach-to game player)
- (update-ui game)
- (play-stage-1 game)))
-
-(define-method (spawn-enemies (game <game>))
- ;; Test enemies
- (spawn-enemy game (make-utatsugumi 'white 10.0 180.0))
- (spawn-enemy game (make-utatsugumi 'white 30.0 180.0))
- (spawn-enemy game (make-utatsugumi 'white 50.0 180.0))
- (spawn-enemy game (make-utatsugumi 'black 70.0 180.0))
- (spawn-enemy game (make-utatsugumi 'black 90.0 180.0))
- (spawn-enemy game (make-utatsugumi 'black 110.0 180.0))
- (spawn-enemy game (make-utatsugumi 'white 130.0 180.0))
- (spawn-enemy game (make-utatsugumi 'white 150.0 180.0)))
+ (update-ui game)
+ (play-stage-1 game))
(define-method (update-ui (game <game>))
(set! (text (& game ui score))
@@ -178,26 +176,25 @@
(define-method (update (game <game>) dt)
(let ((refresh-ui? #f)
(player (& game player)))
- (when player
- ;; enemy -> player bullet collision
- ;; enemy -> player collision
- (for-each (lambda (enemy)
- (cond
- ((and (collide (& game player-bullets) enemy)
- (dead? enemy))
- (on-kill player enemy)
- (fire-parting-shots-maybe enemy player)
- (explode game enemy)
- (detach enemy)
- (set! refresh-ui? #t))
- ((collide player enemy)
- (set! refresh-ui? #t))))
- (children (& game enemies)))
- ;; player -> enemy bullet collision
- (when (collide (& game enemy-bullets) (& game player))
- (set! refresh-ui? #t))
- (when refresh-ui?
- (update-ui game)))
+ ;; enemy -> player bullet collision
+ ;; enemy -> player collision
+ (for-each (lambda (enemy)
+ (cond
+ ((and (collide (& game player-bullets) enemy)
+ (dead? enemy))
+ (on-kill player enemy)
+ (fire-parting-shots-maybe enemy player)
+ (explode game enemy)
+ (detach enemy)
+ (set! refresh-ui? #t))
+ ((collide player enemy)
+ (set! refresh-ui? #t))))
+ (children (& game enemies)))
+ ;; player -> enemy bullet collision
+ (when (collide (& game enemy-bullets) (& game player))
+ (set! refresh-ui? #t))
+ (when refresh-ui?
+ (update-ui game))
(next-method)))
(define-method (spawn-enemy (game <game>) enemy)
@@ -226,8 +223,7 @@
(update-ui game)))
(define-method (game-over? (game <game>))
- (let ((player (& game player)))
- (and player (dead? player))))
+ (dead? (& game player)))
(define-method (play-stage-1 game)
(run-script game
@@ -244,8 +240,6 @@
(set! (player-control? game) #t)
(show (& game ui)))
-(define *skip-tutorial?* #t)
-
(define-method (do-tutorial (game <game>))
(define* (instruct text continue? #:optional (post-delay 60))
(let ((instructions (make <label>
@@ -259,7 +253,7 @@
(sleep post-delay)
(detach instructions)
(sleep 60)))
- (unless *skip-tutorial?*
+ (unless (skip-tutorial? game)
(sleep 30)
(instruct "use arrow keys to move"
(let ((v (velocity (& game player))))
@@ -269,7 +263,7 @@
(instruct "press Z to shoot"
(lambda ()
(shooting? (& game player))))
- (instruct "press X to change color"
+ (instruct "press X to change energy"
(let ((starting-polarity (polarity (& game player))))
(lambda ()
(not (eq? (polarity (& game player)) starting-polarity)))))
@@ -280,28 +274,72 @@
(instruct "press C to release energy"
(lambda ()
(zero? (energy (& game player)))))
- (instruct "get ready!" (const #t) 120)))
+ (instruct "shoot opposite energy" (const #t) 90)
+ (instruct "deal 2x damage" (const #t) 90)
+ (set! (invincible? (& game player)) #t)
+ (spawn-enemy game (make-utatsugumi 'white 48.0 150.0))
+ (spawn-enemy game (make-utatsugumi 'white 80.0 150.0))
+ (spawn-enemy game (make-utatsugumi 'white 112.0 150.0))
+ (instruct "destroy 3 of same energy"
+ (lambda ()
+ (null? (children (& game enemies)))))
+ (spawn-enemy game (make-utatsugumi 'black 48.0 150.0))
+ (spawn-enemy game (make-utatsugumi 'black 80.0 150.0))
+ (spawn-enemy game (make-utatsugumi 'black 112.0 150.0))
+ (instruct "repeat for chain bonus"
+ (lambda ()
+ (null? (children (& game enemies)))))
+ (set! (score (& game player)) 0)
+ (set! (chain (& game player)) 0)
+ (set! (chain-progress (& game player)) '())
+ (set! (max-chain (& game player)) 0)
+ (set! (energy (& game player)) 0)
+ (set! (invincible? (& game player)) #f)
+ (update-ui game)
+ (instruct "get ready!" (const #t) 120)
+ (set! (skip-tutorial? game) #t)))
(define-method (do-phase-1 (game <game>))
- (define (utatsugumi-sweep x polarity)
- (let loop ((i 0))
- (when (< i 6)
- (let ((utatsugumi (make-utatsugumi polarity x 260.0)))
- (spawn-enemy game utatsugumi)
- (set-vec2! (velocity utatsugumi) 0.0 -3.0)
- (script
- (sleep (* 10 60))
- (detach utatsugumi))
- (sleep 10))
- (loop (+ i 1)))))
- (utatsugumi-sweep 140.0 'white)
- (sleep 60)
- (utatsugumi-sweep 20.0 'black)
- (sleep 60)
- (utatsugumi-sweep 140.0 'white)
- (sleep 60)
- (utatsugumi-sweep 20.0 'black)
- (sleep (* 3 60)))
+ (define (utatsugumi-sweep x dir polarity)
+ (let ((speed 3.0))
+ (let loop ((i 0))
+ (when (< i 6)
+ (let ((utatsugumi (make-utatsugumi polarity x 260.0)))
+ (spawn-enemy game utatsugumi)
+ (set-vec2! (velocity utatsugumi)
+ (* (cos (* pi 1.5)) speed)
+ (* (sin (* pi 1.5)) speed))
+ (script
+ (sleep 5)
+ (let loop ((i 0))
+ (when (< i 25)
+ (let ((theta (+ (* pi 1.5)
+ (* dir i (/ (* pi .5) 25.0)))))
+ (set-vec2! (velocity utatsugumi)
+ (* (cos theta) speed)
+ (* (sin theta) speed))
+ (sleep 3)
+ (loop (+ i 1)))))
+ (sleep 60)
+ (detach utatsugumi))
+ (sleep 15))
+ (loop (+ i 1))))))
+ (utatsugumi-sweep 140.0 -1.0 'white)
+ (sleep 15)
+ (utatsugumi-sweep 20.0 1.0 'black)
+ (sleep 15)
+ (utatsugumi-sweep 140.0 -1.0 'white)
+ (sleep 15)
+ (utatsugumi-sweep 20.0 1.0 'black)
+ (sleep 15)
+ (utatsugumi-sweep 140.0 -1.0 'white)
+ (sleep 15)
+ (utatsugumi-sweep 20.0 1.0 'black)
+ (sleep 15)
+ (utatsugumi-sweep 140.0 -1.0 'white)
+ (sleep 15)
+ (utatsugumi-sweep 20.0 1.0 'black)
+ (sleep 60))
(define-method (do-win (game <game>))
(set! (player-control? game) #f)
@@ -331,21 +369,29 @@
(lambda (c)
(set! (color backdrop) c))
#:interpolate color-lerp))
+ (sleep 30)
+ (attach-to battle-report
+ (make <label>
+ #:rank 999
+ #:text "STAGE CLEAR!"
+ #:align 'center
+ #:position (vec2 80.0 190.0)))
+ (sleep 30)
(attach-to battle-report
(make <label>
#:rank 999
#:text "BATTLE REPORT"
#:align 'center
- #:position (vec2 80.0 180.0)))
+ #:position (vec2 80.0 145.0)))
(sleep 30)
- (add-row 140.0 "SCORE" (number->string (score (& game player))))
+ (add-row 120.0 "SCORE" (number->string (score (& game player))))
(sleep 30)
- (add-row 110.0 "MAX CHAIN" (number->string (max-chain (& game player))))
+ (add-row 100.0 "MAX CHAIN" (number->string (max-chain (& game player))))
(sleep 30)
(attach-to battle-report
(make <label>
#:rank 999
#:text "press ENTER to play again"
- #:position (vec2 80.0 60.0)
+ #:position (vec2 80.0 40.0)
#:align 'center))
(set! (complete? game) #t)))