summaryrefslogtreecommitdiff
path: root/lisparuga/player.scm
diff options
context:
space:
mode:
Diffstat (limited to 'lisparuga/player.scm')
-rw-r--r--lisparuga/player.scm45
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))