From 4ec1666a1df789531d40bb173b7ad540adf296b0 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Thu, 23 May 2024 14:05:13 -0400 Subject: [PATCH] Add end-game credits sequence. --- Makefile | 3 +- assets/fonts/AUTHORS | 3 ++ assets/fonts/monogram-extended.woff2 | Bin 0 -> 6528 bytes game.css | 7 +++ game.scm | 77 +++++++++++++++++++++++++-- modules/game/levels/credits.tmx | 26 +++++++++ 6 files changed, 110 insertions(+), 6 deletions(-) create mode 100644 assets/fonts/AUTHORS create mode 100644 assets/fonts/monogram-extended.woff2 create mode 100644 modules/game/levels/credits.tmx diff --git a/Makefile b/Makefile index 22fc356..ca421b3 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,8 @@ levels = \ modules/game/levels/level-1.scm \ modules/game/levels/level-2.scm \ modules/game/levels/level-3.scm \ - modules/game/levels/level-4.scm + modules/game/levels/level-4.scm \ + modules/game/levels/credits.scm game.wasm: game.scm $(modules) $(levels) guild compile-wasm -L modules -o $@ $< diff --git a/assets/fonts/AUTHORS b/assets/fonts/AUTHORS new file mode 100644 index 0000000..a7cc8cd --- /dev/null +++ b/assets/fonts/AUTHORS @@ -0,0 +1,3 @@ +Monogram font by datagoblin +https://datagoblin.itch.io/monogram +Licensed under CC0 diff --git a/assets/fonts/monogram-extended.woff2 b/assets/fonts/monogram-extended.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..11b362879381ac811b665ed7e09763e3b4be0f2c GIT binary patch literal 6528 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 literal 0 HcmV?d00001 diff --git a/game.css b/game.css index 5ff196f..da8f138 100644 --- a/game.css +++ b/game.css @@ -1,3 +1,10 @@ +@font-face { + font-family: 'monogram'; + src: url('assets/fonts/monogram-extended.woff2'); + font-weight: normal; + font-style: normal; +} + body { /* background-color: #000; */ margin: 0; diff --git a/game.scm b/game.scm index 77f8a8d..9f3f230 100644 --- a/game.scm +++ b/game.scm @@ -33,6 +33,7 @@ (game levels level-2) (game levels level-3) (game levels level-4) + (game levels credits) (game scripts) (game tileset) (goblins core) @@ -168,6 +169,15 @@ (set! *level* ((vector-ref levels idx) (collected-gem? idx))) (update-objects!))) +(define (load-credits!) + (set! *state* 'win) + (set! *actormap* (make-whactormap)) + (set-vec2-y! *credits-scroll* 0.0) + (clear-snapshots!) + (with-goblins + (set! *level* (load-credits #t)) + (update-objects!))) + (define (next-level!) (let ((idx (+ *level-idx* 1))) (pk 'next-level idx) @@ -177,10 +187,19 @@ (save-game!) (run-script (lambda () + (set! *state* 'interstitial) (show-effect! (make-fade-out+in-effect 1.0)) - (wait 30) ; ~half the effect time + (wait 30) ; ~half the effect time (load-level! idx)))) - (set! *state* 'win)))) + (begin + (run-script + (lambda () + (set! *level-idx* 0) + (save-game!) + (set! *state* 'interstitial) + (show-effect! (make-fade-out+in-effect 2.0)) + (wait 60) + (load-credits!))))))) ;; Auto-save/load to local storage. (define (save-game!) @@ -390,10 +409,58 @@ (define (draw-interstitial) (draw-level)) +(define *credits-scroll* (vec2 0.0 0.0)) +(define credits + #("Congratulations!" + #f + #f + "Cirkoban was made by the" + "Spritely Institute" + #f + "https://spritely.institute" + #f + "Programming" + #f + "David Thompson" + "Juliana Sims" + #f + "Art" + #f + "Christine Lemmer-Webber" + #f + "monogram font by datagoblin" + #f + #f + #f + #f + #f + #f + #f + #f + "Thank you for playing!")) +(define credits-line-spacing 16.0) +(define max-credits-scroll + (+ game-height (* (- (vector-length credits) 9) credits-line-spacing))) (define (draw-win) - (set-fill-color! context "#000000") - (set-text-align! context "left") - (fill-text context "OMG YOU DID IT WOW CONGRATS" 32.0 120.0)) + (draw-level) + (set-fill-color! context "#ffffff") + (set-text-align! context "center") + (set-font! context "bold 16px monogram") + (set-vec2-y! *credits-scroll* + (min (+ (vec2-y *credits-scroll*) 1.0) + max-credits-scroll)) + (let* ((x (* game-width 0.7)) + (lines-on-screen 15) + (scroll-y (vec2-y *credits-scroll*)) + ;; TODO: Only render the lines on screen. + (start 0) + (end (vector-length credits))) + (let lp ((i start) (y (- game-height scroll-y))) + (when (< i end) + (match (vector-ref credits i) + (#f #f) + (str (fill-text context str x y))) + (lp (1+ i) (+ y credits-line-spacing)))))) (define (draw prev-time) (clear-rect context 0.0 0.0 *canvas-width* *canvas-height*) diff --git a/modules/game/levels/credits.tmx b/modules/game/levels/credits.tmx new file mode 100644 index 0000000..405a139 --- /dev/null +++ b/modules/game/levels/credits.tmx @@ -0,0 +1,26 @@ + + + + + +150,211,91,111,150,150,149,131,131,109,210,150,110,191,210,91,131,109,211,131, +211,171,209,110,110,111,151,109,191,210,191,91,131,91,150,150,150,151,210,171, +130,189,151,211,189,170,209,191,151,211,189,171,150,110,111,189,131,210,210,129, +211,169,110,131,189,109,150,191,191,110,190,211,189,131,189,89,170,149,171,130, +169,110,81,82,83,83,84,91,91,171,210,150,189,91,150,189,171,110,169,210, +170,81,108,24,24,24,107,88,90,110,170,130,129,131,209,110,130,191,151,90, +210,85,24,24,24,24,24,86,191,170,109,110,169,150,191,189,210,149,110,151, +91,85,24,24,24,24,24,86,191,169,150,210,170,170,210,130,110,90,170,211, +89,85,24,24,24,24,24,86,131,109,190,150,131,129,131,209,169,189,91,151, +129,101,88,24,24,24,87,104,209,131,169,150,210,189,171,211,169,189,131,190, +111,189,101,102,102,103,104,110,91,150,189,190,211,170,150,170,171,169,130,109, +111,131,110,170,171,169,149,90,90,190,109,170,89,131,150,89,131,209,210,149, +171,189,189,189,111,210,131,171,129,190,209,150,90,191,150,209,151,169,209,90, +90,210,111,171,210,210,211,149,151,209,190,129,169,129,91,131,170,109,90,191, +170,190,210,131,109,210,131,90,131,211,111,130,89,191,169,110,190,109,211,170 + + + + + +