diff options
Diffstat (limited to 'lisparuga/player.scm')
-rw-r--r-- | lisparuga/player.scm | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/lisparuga/player.scm b/lisparuga/player.scm index 1265756..6a85cc4 100644 --- a/lisparuga/player.scm +++ b/lisparuga/player.scm @@ -54,12 +54,15 @@ fire-homing-missiles kill-maybe on-kill - add-energy)) + add-energy + reset)) (define-asset ship-atlas (load-tile-atlas (scope-asset "images/player.png") 24 24)) (define-asset shoot-sound (load-audio (scope-asset "sounds/player-shoot.wav"))) (define-asset missile-sound (load-audio (scope-asset "sounds/player-missile.wav"))) (define-asset death-sound (load-audio (scope-asset "sounds/player-death.wav"))) +(define-asset energy-max-sound (load-audio (scope-asset "sounds/energy-max.wav"))) +(define-asset max-chain-sound (load-audio (scope-asset "sounds/max-chain.wav"))) (define kill-hitbox (make-hitbox 'kill (make-rect -2.0 -2.0 4.0 4.0))) (define graze-hitbox (make-hitbox 'graze (make-rect -12.0 -12.0 24.0 24.0))) @@ -76,6 +79,20 @@ (shooting? #:accessor shooting? #:init-value #f) (shoot-time #:accessor shoot-time #:init-value 0)) +(define-method (reset (player <player>)) + (set! (polarity player) 'white) + (set-vec2! (velocity player) 0.0 0.0) + (set! (score player) 0) + (set! (lives player) 3) + (set! (energy player) 0) + (set! (chain player) 0) + (set! (chain-progress player) '()) + (set! (max-chain player) 0) + (set! (invincible? player) #f) + (set! (shooting? player) #f) + (set! (shoot-time player) 0) + (refresh-sprite player)) + (define-method (dead? (player <player>)) (zero? (lives player))) @@ -95,7 +112,7 @@ #:index 0 #:origin (vec2 12.0 12.0)))) -(define (shoot player ox) +(define-method (shoot (player <player>) ox) (let ((speed 8.0) (pos (position player)) (bullets (bullet-field player)) @@ -151,12 +168,16 @@ (vec2-mult! v (speed player)))) (define-method (start-shooting (player <player>)) - (set! (shooting? player) #t) - (set! (shoot-time player) 0)) + (unless (shooting? player) + (set! (shooting? player) #t) + (set! (shoot-time player) 0))) (define-method (stop-shooting (player <player>)) (set! (shooting? player) #f)) +(define-method (refresh-sprite (player <player>)) + (set! (index (& player ship)) (if (eq? (polarity player) 'white) 0 4))) + (define-method (toggle-polarity (player <player>)) (let ((old (polarity player))) ;; If polarity is none it means we are already switching so ignore @@ -168,8 +189,7 @@ (set! (polarity player) 'none) (sleep 7) (set! (polarity player) (if (eq? old 'white) 'black 'white)) - ;; Change sprite - (set! (index (& player ship)) (if (eq? old 'white) 4 0)))))) + (refresh-sprite player))))) (define-method (fire-homing-missiles (player <player>) enemies) (let* ((e (energy player)) @@ -247,7 +267,12 @@ #t)) (define-method (add-energy (player <player>) n) - (set! (energy player) (min (+ (energy player) n) 120))) + (let* ((old-energy (energy player)) + (new-energy (min (+ old-energy n) 120))) + (set! (energy player) new-energy) + (when (and (not (= old-energy new-energy)) + (= new-energy 120)) + (audio-play (asset-ref energy-max-sound))))) (define-method (kill-maybe (player <player>)) (unless (invincible? player) @@ -255,6 +280,8 @@ (let ((new-lives (max (- (lives player) 1) 0))) (set! (lives player) new-lives) (set! (energy player) 0) + (set! (chain-progress player) '()) + (set! (chain player) 0) (if (zero? new-lives) (begin ;; to stop the death events from happening over and over @@ -317,7 +344,9 @@ ;; - 7 Chain --- 6,400 points ;; - 8 Chain --- 12,800 points ;; - 9+ Chain -- 25,600 points - (* (expt 2 (- (min new-chain 9) 1)) 100))))) + (* (expt 2 (- (min new-chain 9) 1)) 100))) + (when (>= new-chain 9) + (audio-play (asset-ref max-chain-sound))))) ;; 1st or 2nd kill of the chain. ((or ('white) ('black) ('white 'white) ('black 'black)) (set! (chain-progress player) current-chain)) |