aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2024-05-25 07:04:43 +0100
committerGene Pasquet <dev@etenil.net>2024-05-25 07:04:43 +0100
commitea6c66ebd5299f0b07352643ba533f74c83501c1 (patch)
tree1a64805cc03a84ac98a3f3e1d8082b6924aeda33
parent6003a9df9a93477e0279ec681b82ce826484ee4e (diff)
Add game menu!
-rw-r--r--TODO.org3
-rw-r--r--turbo.scm247
2 files changed, 170 insertions, 80 deletions
diff --git a/TODO.org b/TODO.org
index c458416..1ec191a 100644
--- a/TODO.org
+++ b/TODO.org
@@ -14,7 +14,8 @@
** DONE Display level on screen
** DONE Level up automatically
** DONE Add graphical speedometer (look at knight rider)
-** TODO Add start menu
+** DONE Add start menu
+** TODO Add help menu to display controls
** 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 d813518..fa9ffdc 100644
--- a/turbo.scm
+++ b/turbo.scm
@@ -88,7 +88,11 @@
;; TODO: nope, bug here somewhere!
(set-vehicle-active! (car vehicles) #t)
-(define game-over #f)
+(define game-started? #f)
+(define game-over? #f)
+(define show-credits? #f)
+(define menu-items (list 'new-game 'credits 'quit))
+(define menu-selection 0)
(define (vehicle-has-spawn-space? vehicle)
(define (vehicle-in-the-way? v)
@@ -182,6 +186,18 @@
(and vehicle-active?
(>= (- vehicle-length) (vec2-x (vehicle-position veh)))))
+(define (reset-game!)
+ (set! player-distance-travelled 0)
+ (set! level-difficulty 1)
+ (set-vehicle-position! player-car initial-player-position)
+ (set-player-speed! (level-min-speed))
+ (set! player-rotation 0)
+ (source-play engine-sound)
+ (for-each vehicle-reset-ahead vehicles)
+ ;; Reset all vehicles
+ (set! game-over? #f)
+ (set! game-started? #t))
+
;;;; Chickadee hooks
(set-source-volume! music 0.5)
@@ -190,65 +206,59 @@
(source-play engine-sound)
(define (update interval)
- (unless game-over
- (unless (player-on-road?)
- (off-road-player)
- (set! game-over #t))
-
-
- (set! player-distance-travelled (+ player-distance-travelled (* interval (vehicle-speed player-car))))
-
- ;; Increase level every 2 miles
- (when (and (< level-difficulty 20) (> (distance-in-miles) (* 2 level-difficulty)))
- (set! level-difficulty (+ 1 level-difficulty)))
-
- (let ((new-speed (+ (vehicle-speed player-car)
- (* player-current-acceleration interval))))
- (set-vehicle-speed! player-car (min player-max-speed
- (max (level-min-speed)
- new-speed))))
-
- (when (player-collides?)
- (off-road-player)
- ;; TODO: Think of different animation for this game over
- (set! game-over #t))
-
- (set! road-section-position
- (if (< road-section-position (- lane-length))
- (- (+ road-section-position lane-length) (* interval (vehicle-speed player-car)))
- (- road-section-position (* interval (vehicle-speed player-car)))))
-
- (set-vehicle-position! player-car (vec2+ (vehicle-position player-car)
- player-velocity))
-
- (for-each (lambda (veh)
- (vehicle-move! veh (vec2 (- (* interval (vehicle-speed- player-car veh))) 0)))
- (filter vehicle-active? vehicles))
-
- ;; Reset vehicles that have gone off screen
- (for-each vehicle-reset-ahead (filter vehicle-off-screen? vehicles))
-
- ;; Randomly respawn vehicles based on level difficulty
- (let ((challenge (- (round (/ 200 level-difficulty)) 9)))
- (when (= 0 (random challenge))
- (let* ((inactive-vehicles (filter vehicle-inactive? vehicles))
- (spawnable-vehicles (filter vehicle-has-spawn-space? inactive-vehicles)))
- (if (not (null? spawnable-vehicles))
- (set-vehicle-active! (list-ref
- spawnable-vehicles
- (random (length spawnable-vehicles)))
- #t)))))
- ;; End (unless game-over)
- ))
+ (unless game-over?
+ (unless (player-on-road?)
+ (off-road-player)
+ (set! game-over? #t))
+
+
+ (set! player-distance-travelled (+ player-distance-travelled (* interval (vehicle-speed player-car))))
+
+ ;; Increase level every 2 miles
+ (when (and (< level-difficulty 20) (> (distance-in-miles) (* 2 level-difficulty)))
+ (set! level-difficulty (+ 1 level-difficulty)))
+
+ (let ((new-speed (+ (vehicle-speed player-car)
+ (* player-current-acceleration interval))))
+ (set-vehicle-speed! player-car (min player-max-speed
+ (max (level-min-speed)
+ new-speed))))
+
+ (when (and game-started? (player-collides?))
+ (off-road-player)
+ ;; TODO: Think of different animation for this game over
+ (set! game-over? #t))
+
+ (set! road-section-position
+ (if (< road-section-position (- lane-length))
+ (- (+ road-section-position lane-length) (* interval (vehicle-speed player-car)))
+ (- road-section-position (* interval (vehicle-speed player-car)))))
+
+ (set-vehicle-position! player-car (vec2+ (vehicle-position player-car)
+ player-velocity))
+
+ (for-each (lambda (veh)
+ (vehicle-move! veh (vec2 (- (* interval (vehicle-speed- player-car veh))) 0)))
+ (filter vehicle-active? vehicles))
+
+ ;; Reset vehicles that have gone off screen
+ (for-each vehicle-reset-ahead (filter vehicle-off-screen? vehicles))
+
+ ;; Randomly respawn vehicles based on level difficulty
+ (let ((challenge (- (round (/ 200 level-difficulty)) 9)))
+ (when (= 0 (random challenge))
+ (let* ((inactive-vehicles (filter vehicle-inactive? vehicles))
+ (spawnable-vehicles (filter vehicle-has-spawn-space? inactive-vehicles)))
+ (if (not (null? spawnable-vehicles))
+ (set-vehicle-active! (list-ref
+ spawnable-vehicles
+ (random (length spawnable-vehicles)))
+ #t)))))
+ ;; End (unless game-over?)
+ ))
(define (draw alpha)
(draw-road road-section-position road-start-y road-num-lanes)
- (draw-text "Turbo Racer 3000!"
- (vec2 300.0 (- (window-height (current-window)) 25))
- #:font the-font
- #:scale (vec2 2 2))
-
- (draw-sprite (vehicle-sprite player-car) (vehicle-position player-car) #:rotation player-rotation)
(for-each (lambda (veh)
(draw-sprite (vehicle-sprite veh) (vehicle-position veh)))
@@ -259,6 +269,72 @@
(when (< (+ index (texture-width dash-background)) (window-width (current-window)))
(loop (+ index (texture-width dash-background)))))
+ (draw-sprite (vehicle-sprite player-car) (vehicle-position player-car) #:rotation player-rotation)
+ (unless game-started?
+ (let ((window-top (window-height (current-window))))
+ (if show-credits?
+ (let ((left-margin 60)
+ (top-start 125)
+ (gap 25))
+ (draw-text "TURBO RACER 3000!"
+ (vec2 left-margin (- window-top top-start))
+ #:font the-font
+ #:scale (vec2 4 4)
+ #:color red)
+ (draw-text "DEVELOPMENT: Gene Pasquet"
+ (vec2 left-margin (- window-top (+ top-start gap)))
+ #:font the-font
+ #:scale (vec2 2 2))
+ (draw-text "DESIGN: Owen Pasquet"
+ (vec2 left-margin (- window-top (+ top-start (* 2 gap))))
+ #:font the-font
+ #:scale (vec2 2 2))
+ (draw-text "PLAY TESTING: Owen Pasquet"
+ (vec2 left-margin (- window-top (+ top-start (* 3 gap))))
+ #:font the-font
+ #:scale (vec2 2 2))
+ (draw-text "MUSIC: Instrumental by Aries Beats"
+ (vec2 left-margin (- window-top (+ top-start (* 4 gap))))
+ #:font the-font
+ #:scale (vec2 2 2))
+ (draw-text "FONTS: Keshikan"
+ (vec2 left-margin (- window-top (+ top-start (* 5 gap))))
+ #:font the-font
+ #:scale (vec2 2 2))
+ (draw-text "SOUND: qubodup"
+ (vec2 left-margin (- window-top (+ top-start (* 6 gap))))
+ #:font the-font
+ #:scale (vec2 2 2))
+ (draw-text "BACK"
+ (vec2 250 (- window-top 330))
+ #:font the-font
+ #:scale (vec2 2 2)
+ #:color yellow)
+ )
+ (begin
+ ;; Draw the menu
+ (draw-text "TURBO RACER 3000!"
+ (vec2 60 (- window-top 125))
+ #:font the-font
+ #:scale (vec2 4 4)
+ #:color red)
+ (draw-text "NEW GAME"
+ (vec2 250 (- window-top 250))
+ #:font the-font
+ #:scale (vec2 2 2)
+ #:color (if (= menu-selection 0) yellow white))
+ (draw-text "CREDITS"
+ (vec2 250 (- window-top 270))
+ #:font the-font
+ #:scale (vec2 2 2)
+ #:color (if (= menu-selection 1) yellow white))
+ (draw-text "QUIT"
+ (vec2 250 (- window-top 330))
+ #:font the-font
+ #:scale (vec2 2 2)
+ #:color (if (= menu-selection 2) yellow white))))))
+
+
(draw-sprite dash-7seg-background (vec2 270 0))
(draw-sprite dash-7seg-background (vec2 324 0))
(draw-text (format #f "~5,1,,,'0f" (distance-in-miles))
@@ -270,6 +346,7 @@
#:font the-font
#:scale (vec2 2 2))
+
(draw-sprite dash-7seg-background (vec2 450 0))
(draw-sprite dash-7seg-background (vec2 503 0))
(draw-text (format #f "~5,1,,,'0f" (speed-in-mph))
@@ -293,7 +370,7 @@
#:font the-font
#:scale (vec2 2 2))
- (if game-over
+ (if game-over?
(draw-text "GAME OVER" (vec2 260 (/ (window-width (current-window)) 2))
#:font the-font
#:scale (vec2 2 2))))
@@ -301,30 +378,42 @@
(define (key-press key modifiers repeat?)
(cond
- ((eq? key 'w)
- (set! player-velocity (vec2 0 vehicle-steering-speed)))
- ((eq? key 's)
- (set! player-velocity (vec2 0 (- vehicle-steering-speed))))
- ((eq? key 'd)
+ ((or (eq? key 'w) (eq? key 'up))
+ (if game-started?
+ (set! player-velocity (vec2 0 vehicle-steering-speed))
+ (set! menu-selection (max 0 (- menu-selection 1)))))
+ ((or (eq? key 's) (eq? key 'down))
+ (if game-started?
+ (set! player-velocity (vec2 0 (- vehicle-steering-speed)))
+ (set! menu-selection (min (- (length menu-items) 1) (+ menu-selection 1)))))
+ ((or (eq? key 'd) (eq? key 'right))
(set! player-current-acceleration player-car-acceleration))
- ((eq? key 'a)
+ ((or (eq? key 'a) (eq? key 'left))
(set! player-current-acceleration player-car-deceleration))
((eq? key 'escape)
- (abort-game))
- ((and (eq? key 'return) game-over)
- (set! player-distance-travelled 0)
- (set! level-difficulty 1)
- (set-vehicle-position! player-car initial-player-position)
- (set-player-speed! (level-min-speed))
- (set! player-rotation 0)
- (source-play engine-sound)
- (for-each vehicle-reset-ahead vehicles)
- ;; Reset all vehicles
- (set! game-over #f))))
+ (set! game-started? #f))
+ ((and (eq? key 'return) game-over?)
+ (reset-game!))
+ ((and (eq? key 'return) (not game-started?))
+ (if show-credits?
+ (set! show-credits? #f)
+ (cond
+ ((= menu-selection 0)
+ (reset-game!))
+ ((= menu-selection 1)
+ (set! show-credits? #t))
+ ((= menu-selection 2)
+ (abort-game)))))))
(define (key-release key modifiers)
(cond
- ((or (eq? key 'a) (eq? key 'd))
- (set! player-current-acceleration 0)))
- (if (or (eq? key 'w) (eq? key 's))
- (set! player-velocity (vec2 0 0))))
+ ((or (eq? key 'a)
+ (eq? key 'd)
+ (eq? key 'left)
+ (eq? key 'right))
+ (set! player-current-acceleration 0))
+ ((or (eq? key 'w)
+ (eq? key 's)
+ (eq? key 'up)
+ (eq? key 'down))
+ (set! player-velocity (vec2 0 0)))))