Doing the actions when selecting menu items

This commit is contained in:
Amy Grinn 2024-12-12 13:28:48 -05:00
parent dbca0ba6cf
commit c393ab50b3
No known key found for this signature in database
GPG key ID: 6B558BED1DCF3192

View file

@ -133,6 +133,8 @@
load-catboss-2
load-catboss-3))
(define *level-idx* #f)
;; Last level for restoring after visiting credits via the menu
(define *level-last* #f)
(define *gems* #f)
(define *level* #f)
;; Latest representation of all actors in level
@ -202,7 +204,7 @@
(define (collected-gem? idx)
(memq idx *gems*))
(define (load-level! idx)
(define (set-level! idx)
(set! *state* 'play)
(set! *actormap* (make-whactormap))
(clear-snapshots!)
@ -219,8 +221,7 @@
(set! *level* (load-credits #f))
(update-objects!)))
(define (next-level!)
(let ((idx (+ *level-idx* 1)))
(define (load-level! idx)
;; TODO: Maybe show a little achievement popup when all gems
;; are collected?
(when (with-goblins ($ (level-actor *level*) 'gem-collected?))
@ -235,7 +236,7 @@
(show-effect! (make-fade-out+in-effect 1.0 k))))
(set! *level-idx* idx)
(save-game!)
(load-level! idx))))
(set-level! idx))))
(begin
(run-script
(lambda ()
@ -249,7 +250,10 @@
;; text from showing up when resetting the game, set
;; level idx to non-zero during the credits.
(set! *level-idx* -1)
(load-credits!)))))))
(load-credits!))))))
(define (next-level!)
(load-level! (+ *level-idx* 1)))
;; Auto-save/load to local storage.
(define (save-game!)
@ -267,7 +271,7 @@
((idx gems)
(set! *level-idx* idx)
(set! *gems* gems)
(load-level! *level-idx*)
(set-level! *level-idx*)
(media-play audio:bg-music)))))
;; Menu types
@ -291,8 +295,8 @@
(do ((i 0 (1+ i)))
((= i (vector-length levels)))
(vector-set! items i (make-menu-item (string-append "Level " (number->string i))
'level
(vector-ref levels i))))
'level i)))
(make-menu "Select Level" items)))
(define menu:main
(make-menu "Menu" (vector (make-menu-item "Select Level"
@ -347,7 +351,14 @@
('menu
(set! *menu:history* (cons (cons *menu* *menu:index*) *menu:history*))
(set! *menu* payload)
(set! *menu:index* -1)))))))
(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!)
(run-script
@ -357,7 +368,7 @@
(lambda (k)
(show-effect! (make-fade-out+in-effect 2.0 k))))
(set! *level-idx* 0)
(load-level! 0))))
(set-level! 0))))
(define (emit-pickup-particles x y)
(run-script
@ -880,8 +891,7 @@
(fill-text context "A -> undo"
cx2 baseline))))
('win (draw-win)))
(when *menu*
(draw-menu))
(if *menu* (draw-menu))
(draw-current-effect 'post)
(request-animation-frame draw-callback)))
(define draw-callback (procedure->external draw))
@ -994,7 +1004,11 @@
('confirm (next-level!))
('menu (show-menu!))))
;; Pressing any bound input resets the game.
('win (reset-game!))))))
('win (cond
(*level-last*
(load-level! *level-last*)
(set! *level-last* #f))
(else (reset-game!))))))))
;; Canvas and event loop setup
(define canvas (get-element-by-id "canvas"))