aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2024-05-26 08:16:48 +0100
committerGene Pasquet <dev@etenil.net>2024-05-26 08:16:48 +0100
commit838ba7744fbc4360722e215d1869784d53febb1c (patch)
tree8fa018716b9d8495737227a5a2f2eba69eaac6ed
parent93e9c8bb9fbf4c4ad92f44344cebd594c216e046 (diff)
Add game winning logic
-rw-r--r--TODO.org8
-rw-r--r--turbo.scm58
2 files changed, 47 insertions, 19 deletions
diff --git a/TODO.org b/TODO.org
index f5f6146..c91d2af 100644
--- a/TODO.org
+++ b/TODO.org
@@ -16,10 +16,10 @@
** DONE Add graphical speedometer (look at knight rider)
** DONE Add start menu
** TODO Add help menu to display controls
-** TODO Add timer
-** TODO Trigger end game when reaching level 21
-*** TODO Add end-game screen
-*** TODO Convert timer to points
+** DONE Add timer
+** DONE Trigger end game when reaching level max
+*** DONE Add end-game screen
+*** DONE Convert timer to points
** TODO Add weapon to player car
*** TODO Make weapon a power-up
*** TODO Make weapon use limited (bullet? time?)
diff --git a/turbo.scm b/turbo.scm
index fa9ffdc..3bd3d99 100644
--- a/turbo.scm
+++ b/turbo.scm
@@ -41,6 +41,7 @@
(define player-car-deceleration -500)
(define player-current-acceleration 0)
(define player-distance-travelled 0)
+(define player-time-travelled 0)
(define (distance-in-miles)
(/ player-distance-travelled 12440))
@@ -48,6 +49,7 @@
(* (vehicle-speed player-car) 0.11187))
(define level-difficulty 1)
+(define max-level 20)
(define music-res (load-audio "music.ogg"))
(define music (make-source #:audio music-res #:loop? #t))
@@ -144,7 +146,7 @@
#t))
(define (level-min-speed)
- (+ player-min-speed (* (- level-difficulty 1) 18)))
+ (+ player-min-speed (* (- level-difficulty 1) 36)))
(define (set-player-speed! new-speed)
(let* ((min-speed (level-min-speed))
@@ -188,6 +190,7 @@
(define (reset-game!)
(set! player-distance-travelled 0)
+ (set! player-time-travelled 0)
(set! level-difficulty 1)
(set-vehicle-position! player-car initial-player-position)
(set-player-speed! (level-min-speed))
@@ -198,6 +201,9 @@
(set! game-over? #f)
(set! game-started? #t))
+(define (game-won?)
+ (and game-started? (> level-difficulty max-level)))
+
;;;; Chickadee hooks
(set-source-volume! music 0.5)
@@ -213,10 +219,14 @@
(set! player-distance-travelled (+ player-distance-travelled (* interval (vehicle-speed player-car))))
+ (set! player-time-travelled (+ player-time-travelled interval))
;; Increase level every 2 miles
- (when (and (< level-difficulty 20) (> (distance-in-miles) (* 2 level-difficulty)))
- (set! level-difficulty (+ 1 level-difficulty)))
+ (when (and (< level-difficulty max-level) (> (distance-in-miles) (* 2 level-difficulty)))
+ (set! level-difficulty (+ 1 level-difficulty)))
+
+ (if (game-won?)
+ (set! game-over? #t))
(let ((new-speed (+ (vehicle-speed player-car)
(* player-current-acceleration interval))))
@@ -245,7 +255,7 @@
(for-each vehicle-reset-ahead (filter vehicle-off-screen? vehicles))
;; Randomly respawn vehicles based on level difficulty
- (let ((challenge (- (round (/ 200 level-difficulty)) 9)))
+ (let ((challenge (- (round (/ (* max-level 10) level-difficulty)) 9)))
(when (= 0 (random challenge))
(let* ((inactive-vehicles (filter vehicle-inactive? vehicles))
(spawnable-vehicles (filter vehicle-has-spawn-space? inactive-vehicles)))
@@ -358,22 +368,39 @@
#:font the-font
#:scale (vec2 2 2))
- (draw-sprite dash-7seg-background
- (vec2 20 0)
- #:scale (vec2 0.5 1))
- (draw-text (format #f "~s" level-difficulty)
- (vec2 20.0 20.0)
+ (draw-sprite dash-7seg-background (vec2 20 0))
+ (draw-sprite dash-7seg-background (vec2 72 0))
+ (draw-text (format #f "~5,1,,,'0f" player-time-travelled)
+ (vec2 25 20)
#:font font-7-segments
#:color red)
- (draw-text "LVL"
- (vec2 60.0 12.0)
+ (draw-text "TIME"
+ (vec2 142 12)
#:font the-font
#:scale (vec2 2 2))
(if game-over?
- (draw-text "GAME OVER" (vec2 260 (/ (window-width (current-window)) 2))
- #:font the-font
- #:scale (vec2 2 2))))
+ (if (game-won?)
+ (let ((player-score (+ 10000 (* (- 900 player-time-travelled) 1000))))
+ (draw-text "THE END" (vec2 260 (/ (window-width (current-window)) 2))
+ #:font the-font
+ #:scale (vec2 2 2))
+ (draw-text (format #f "SCORE: ~,0f" player-score)
+ (vec2 200 (- (/ (window-width (current-window)) 2) 25))
+ #:font the-font
+ #:scale (vec2 2 2))
+ (draw-text "TRY AGAIN" (vec2 230 (- (/ (window-width (current-window)) 2) 100))
+ #:font the-font
+ #:scale (vec2 2 2)
+ #:color yellow))
+ (begin
+ (draw-text "GAME OVER" (vec2 260 (/ (window-width (current-window)) 2))
+ #:font the-font
+ #:scale (vec2 2 2))
+ (draw-text "TRY AGAIN" (vec2 260 (- (/ (window-width (current-window)) 2) 25))
+ #:font the-font
+ #:scale (vec2 2 2)
+ #:color yellow)))))
(define (key-press key modifiers repeat?)
@@ -391,7 +418,8 @@
((or (eq? key 'a) (eq? key 'left))
(set! player-current-acceleration player-car-deceleration))
((eq? key 'escape)
- (set! game-started? #f))
+ (set! game-over? #f)
+ (set! game-started? #f))
((and (eq? key 'return) game-over?)
(reset-game!))
((and (eq? key 'return) (not game-started?))