diff --git a/game.scm b/game.scm index b742345..f81e0a4 100644 --- a/game.scm +++ b/game.scm @@ -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"))