diff --git a/game.scm b/game.scm index 38a0c8e..4207ce8 100644 --- a/game.scm +++ b/game.scm @@ -326,6 +326,7 @@ 'menu menu:level-select) (make-menu-item "Credits" 'credits)))) +;; -1 for the index means 'Back' will be indicated first (define *menu* (make-menu-state menu:main -1 0 '())) (define (current-menu) @@ -750,45 +751,58 @@ (height (+ 2 ;; Menu title + back/ellipses (* 2 padding-y) ;; Padding (if (> num-items menu:max-items) - (1+ menu:max-items) + (1+ menu:max-items) ;; bottom ellipses num-items))) - (r-start (- -2 padding-y)) - (r-end (- (+ r-start height) padding-y)) - (gutter-x (- (vec2-x center) (* tile-width (1- (floor (/ width 2)))))) - (text-x (+ tile-width gutter-x))) - (let row ((r r-start) - (y (- (vec2-y center) (* tile-height (floor (/ height 2)))))) - ;; Draw menu background - (when (= r r-start) - (let ((x (- (vec2-x center) (* tile-width (floor (/ width 2))))) - (w (* tile-width width)) - (h (* tile-height height))) - (set-fill-color! context "#000") - (fill-rect context x y w h) - (set-stroke-color! context "blue") - (stroke-rect context x y w h))) - ;; Draw menu text - (let ((r-menu-index (- (+ r (* (current-menu-page) menu:max-items)) (current-menu-page)))) - (set-font! context "normal 16px monogram") - (set-fill-color! context "#fff") + (y-start (- (vec2-y center) (* tile-height + (floor (/ height 2))))) + (x-start (- (vec2-x center) (* tile-width + (floor (/ width 2)))))) + + ;; Draw menu background + (let ((w (* tile-width width)) + (h (* tile-height height))) + (set-fill-color! context "#000") + (fill-rect context x-start y-start w h) + (set-stroke-color! context "blue") + (stroke-rect context x-start y-start w h)) + + ;; Draw menu text + (set-font! context "normal 16px monogram") + (set-fill-color! context "#fff") + (let* (;; The first menu item is at index 0. The 'Back' or ellipses are + ;; directly above the first menu item at index -1. The menu title + ;; is above the 'Back' button and separated by the padding-y + (r-start (- -2 padding-y)) + ;; end of text + (r-end (- (+ r-start height) padding-y)) + ;; r will not take into account which page you are on + (r-page-offset (- (* (current-menu-page) menu:max-items) (current-menu-page))) + (gutter-x (+ tile-width x-start)) + (text-x (+ tile-width gutter-x))) + (do ((r r-start (1+ r)) (y y-start (+ tile-height y))) + ((or (>= r r-end) (>= (+ r r-page-offset) num-items))) + ;; Draw menu title (when (= r r-start) (set-text-align! context "center") - (fill-text context (menu-name (current-menu)) (vec2-x center) (+ y text-offset-y))) + (fill-text context (menu-name (current-menu)) + (vec2-x center) (+ y text-offset-y))) (set-text-align! context "left") - (when (= r-menu-index (current-menu-index)) + ;; indicator + (when (= (+ r r-page-offset) (current-menu-index)) (fill-text context "▸" gutter-x (+ y text-offset-y))) + ;; Menu items (when (>= r -1) (fill-text context (cond - ((= r-menu-index -1) "Back") - ((or (= r -1) (and (= r (1- r-end)) (< r-menu-index (1- num-items)))) + ((= (+ r r-page-offset) -1) "Back") + ((or (= r -1) (and (= r (1- r-end)) + (< (+ r r-page-offset) (1- num-items)))) "...") (else - (menu-item-name (vector-ref (menu-items (current-menu)) r-menu-index)))) - text-x (+ y text-offset-y))) - ;; Draw next row - (when (and (< (1+ r) r-end) (< (1+ r-menu-index) num-items)) - (row (1+ r) (+ y tile-height))))))) + (menu-item-name + (vector-ref (menu-items (current-menu)) + (+ r r-page-offset))))) + text-x (+ y text-offset-y))))))) (define (draw-level) (draw-background)