summaryrefslogtreecommitdiff
path: root/lisparuga/game.scm
diff options
context:
space:
mode:
Diffstat (limited to 'lisparuga/game.scm')
-rw-r--r--lisparuga/game.scm96
1 files changed, 91 insertions, 5 deletions
diff --git a/lisparuga/game.scm b/lisparuga/game.scm
index edd97fc..5b14edd 100644
--- a/lisparuga/game.scm
+++ b/lisparuga/game.scm
@@ -26,9 +26,13 @@
#:use-module (chickadee math vector)
#:use-module (chickadee render color)
#:use-module (chickadee render texture)
+ #:use-module (chickadee scripting)
+ #:use-module (ice-9 format)
+ #:use-module (lisparuga actor)
#:use-module (lisparuga asset)
#:use-module (lisparuga bullets)
#:use-module (lisparuga config)
+ #:use-module (lisparuga enemy)
#:use-module (lisparuga node)
#:use-module (lisparuga node-2d)
#:use-module (lisparuga player)
@@ -43,28 +47,109 @@
(define-asset clouds (load-image (scope-asset "images/clouds.png")))
(define-asset player-bullet-atlas
(load-tile-atlas (scope-asset "images/player-bullets.png") 16 16))
+(define-asset enemy-bullet-atlas
+ (load-tile-atlas (scope-asset "images/enemy-bullets.png") 24 24))
;; nodes needed:
-;; enemies
-;; enemy bullets
;; scrolling background
(define-class <game> (<node-2d>))
(define-method (on-boot (game <game>))
(let* ((player-bullets (make <bullet-field>
+ #:name 'player-bullets
+ #:rank 2
#:capacity 500
#:texture-atlas player-bullet-atlas))
(player (make-player player-bullets))
(enemy-bullets (make <bullet-field>
+ #:name 'enemy-bullets
+ #:rank 4
#:capacity 1000
- #:texture-atlas player-bullet-atlas)))
+ #:texture-atlas enemy-bullet-atlas))
+ (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
- enemy-bullets)))
+ (make <node-2d>
+ #:name 'enemies
+ #:rank 3)
+ enemy-bullets
+ ui)
+ ;; Setup UI elements
+ (attach-to ui
+ (make <label>
+ #:name 'score
+ #:position (vec2 2.0 226.0))
+ (make <label>
+ #:name 'chain
+ #:position (vec2 2.0 210.0))
+ (make <label>
+ #:name 'energy
+ #:position (vec2 2.0 18.0))
+ (make <label>
+ #:name 'lives
+ #:position (vec2 2.0 2.0)))
+ (update-ui game)
+ ;; Test enemy
+ (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))))
+
+(define (update-ui game)
+ (set! (text (& game ui score))
+ (format #f "~9,'0d" (score (& game player))))
+ (set! (text (& game ui chain))
+ (format #f "CHAIN ~a: ~a"
+ (let ((n (chain (& game player))))
+ (if (< n 9) (number->string n) "MAX"))
+ (list->string
+ (map (lambda (polarity)
+ (if (eq? polarity 'white)
+ #\W
+ #\B))
+ (chain-progress (& game player))))))
+ (set! (text (& game ui energy))
+ (format #f "E~d" (quotient (energy (& game player)) 10)))
+ (set! (text (& game ui lives))
+ (format #f "x~d" (max (- (lives (& game player)) 1) 0))))
+
+(define-method (update (game <game>) dt)
+ (let ((refresh-ui? #f)
+ (player (& game 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)
+ (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))))
+
+(define-method (spawn-enemy (game <game>) enemy)
+ (set! (bullet-field enemy) (& game enemy-bullets))
+ (attach-to (& game enemies) enemy))
(define-method (steer-player (game <game>) up? down? left? right?)
(steer (& game player) up? down? left? right?))
@@ -79,4 +164,5 @@
(toggle-polarity (& game player)))
(define-method (fire-player-homing-missiles (game <game>))
- (fire-homing-missiles (& game player)))
+ (fire-homing-missiles (& game player) (children (& game enemies)))
+ (update-ui game))