Using menu item actions instead of type and payload

This commit is contained in:
Amy Grinn 2024-12-20 09:16:30 -05:00
parent b248ea72ad
commit b468bab159
No known key found for this signature in database
GPG key ID: 6B558BED1DCF3192

View file

@ -307,15 +307,21 @@
(page menu-state-page set-menu-state-page!) (page menu-state-page set-menu-state-page!)
(history menu-state-history set-menu-state-history!)) (history menu-state-history set-menu-state-history!))
(define-record-type <menu-item> (define (menu-action:submenu menu)
(_make-menu-item name type payload) (lambda ()
menu-item? (push-menu-history!)
(name menu-item-name) (set-menu! menu)
(type menu-item-type) (set-menu-index! -1)))
(payload menu-item-payload))
(define* (make-menu-item name type #:optional payload) (define (menu-action:load-level level)
(_make-menu-item name type payload)) (lambda ()
(hide-menu!)
(load-level! level)))
(define (menu-action:credits)
(hide-menu!)
(set! *level-last* *level-idx*)
(load-level! (vector-length levels)))
;; Menu constants ;; Menu constants
(define center (vec2 (* 10.0 tile-width) (* 7.0 tile-height))) (define center (vec2 (* 10.0 tile-width) (* 7.0 tile-height)))
@ -324,13 +330,13 @@
(let ((items (make-vector (vector-length levels)))) (let ((items (make-vector (vector-length levels))))
(do ((i 0 (1+ i))) (do ((i 0 (1+ i)))
((= i (vector-length levels))) ((= i (vector-length levels)))
(vector-set! items i (make-menu-item (string-append "Level " (number->string i)) (vector-set! items i (cons (string-append "Level " (number->string i))
'level i))) (menu-action:load-level i))))
(make-menu "Select Level" items))) (make-menu "Select Level" items)))
(define menu:main (define menu:main
(make-menu "Menu" (vector (make-menu-item "Select Level" (make-menu "Menu" (vector (cons "Select Level"
'menu menu:level-select) (menu-action:submenu menu:level-select))
(make-menu-item "Credits" 'credits)))) (cons "Credits" menu-action:credits))))
;; -1 for the index means 'Back' will be indicated first ;; -1 for the index means 'Back' will be indicated first
(define *menu* (make-menu-state menu:main -1 0 '())) (define *menu* (make-menu-state menu:main -1 0 '()))
@ -388,23 +394,9 @@
(set-menu-history! rest)))) (set-menu-history! rest))))
(define (menu-select!) (define (menu-select!)
(if (= (current-menu-index) -1) (if (= (current-menu-index) -1) ;; back button pressed
(pop-menu-history!) (pop-menu-history!)
(let* ((item (vector-ref (menu-items (current-menu)) (current-menu-index))) ((cdr (vector-ref (menu-items (current-menu)) (current-menu-index))))))
(type (menu-item-type item))
(payload (menu-item-payload item)))
(match type
('menu
(push-menu-history!)
(set-menu! payload)
(set-menu-index! -1))
('level
(hide-menu!)
(load-level! payload))
('credits
(hide-menu!)
(set! *level-last* *level-idx*)
(load-level! (vector-length levels)))))))
(define (reset-game!) (define (reset-game!)
(run-script (run-script
@ -805,9 +797,8 @@
(< (+ r r-page-offset) (1- num-items)))) (< (+ r r-page-offset) (1- num-items))))
"...") "...")
(else (else
(menu-item-name (car (vector-ref (menu-items (current-menu))
(vector-ref (menu-items (current-menu)) (+ r r-page-offset)))))
(+ r r-page-offset)))))
text-x (+ y text-offset-y))))))) text-x (+ y text-offset-y)))))))
(define (draw-level) (define (draw-level)