diff options
-rw-r--r-- | assets/images/control-panel.png | bin | 1132 -> 1219 bytes | |||
-rw-r--r-- | assets/images/control-panel.xcf | bin | 5179 -> 6385 bytes | |||
-rw-r--r-- | assets/images/door-lock.xcf | bin | 2119 -> 2119 bytes | |||
-rw-r--r-- | assets/images/door.png | bin | 1174 -> 1112 bytes | |||
-rw-r--r-- | assets/images/door.xcf | bin | 7031 -> 6671 bytes | |||
-rw-r--r-- | assets/images/fridge.png | bin | 874 -> 901 bytes | |||
-rw-r--r-- | assets/images/fridge.xcf | bin | 4325 -> 4421 bytes | |||
-rw-r--r-- | assets/images/notebook.png | bin | 1280 -> 704 bytes | |||
-rw-r--r-- | assets/images/notebook.xcf | bin | 2008 -> 1883 bytes | |||
-rw-r--r-- | assets/images/window.png | bin | 1272 -> 1753 bytes | |||
-rw-r--r-- | assets/images/window.xcf | bin | 48387 -> 7221 bytes | |||
-rw-r--r-- | assets/sounds/ambientmain_0.ogg | bin | 0 -> 1972219 bytes | |||
-rw-r--r-- | assets/sounds/blinding-lights.mp3 | bin | 0 -> 6299607 bytes | |||
-rw-r--r-- | assets/sounds/click1.wav | bin | 0 -> 16596 bytes | |||
-rw-r--r-- | assets/sounds/end-theme.mp3 | bin | 0 -> 814462 bytes | |||
-rw-r--r-- | assets/sounds/switch38.wav | bin | 0 -> 74804 bytes | |||
-rw-r--r-- | assets/sounds/switch6.wav | bin | 0 -> 61724 bytes | |||
-rw-r--r-- | game.scm | 248 |
18 files changed, 157 insertions, 91 deletions
diff --git a/assets/images/control-panel.png b/assets/images/control-panel.png Binary files differindex 15c8026..a8c851e 100644 --- a/assets/images/control-panel.png +++ b/assets/images/control-panel.png diff --git a/assets/images/control-panel.xcf b/assets/images/control-panel.xcf Binary files differindex 6da1bfb..74b1183 100644 --- a/assets/images/control-panel.xcf +++ b/assets/images/control-panel.xcf diff --git a/assets/images/door-lock.xcf b/assets/images/door-lock.xcf Binary files differindex 57d3e64..2435560 100644 --- a/assets/images/door-lock.xcf +++ b/assets/images/door-lock.xcf diff --git a/assets/images/door.png b/assets/images/door.png Binary files differindex 9c47ecb..f60679a 100644 --- a/assets/images/door.png +++ b/assets/images/door.png diff --git a/assets/images/door.xcf b/assets/images/door.xcf Binary files differindex 4f782ac..bd02332 100644 --- a/assets/images/door.xcf +++ b/assets/images/door.xcf diff --git a/assets/images/fridge.png b/assets/images/fridge.png Binary files differindex 652a1b2..c57cfd7 100644 --- a/assets/images/fridge.png +++ b/assets/images/fridge.png diff --git a/assets/images/fridge.xcf b/assets/images/fridge.xcf Binary files differindex f473f0e..15652e9 100644 --- a/assets/images/fridge.xcf +++ b/assets/images/fridge.xcf diff --git a/assets/images/notebook.png b/assets/images/notebook.png Binary files differindex aa93b20..adeb8ec 100644 --- a/assets/images/notebook.png +++ b/assets/images/notebook.png diff --git a/assets/images/notebook.xcf b/assets/images/notebook.xcf Binary files differindex db99898..3d52abb 100644 --- a/assets/images/notebook.xcf +++ b/assets/images/notebook.xcf diff --git a/assets/images/window.png b/assets/images/window.png Binary files differindex aba021e..d4fc02e 100644 --- a/assets/images/window.png +++ b/assets/images/window.png diff --git a/assets/images/window.xcf b/assets/images/window.xcf Binary files differindex ebf54b3..ba250f9 100644 --- a/assets/images/window.xcf +++ b/assets/images/window.xcf diff --git a/assets/sounds/ambientmain_0.ogg b/assets/sounds/ambientmain_0.ogg Binary files differnew file mode 100644 index 0000000..631301d --- /dev/null +++ b/assets/sounds/ambientmain_0.ogg diff --git a/assets/sounds/blinding-lights.mp3 b/assets/sounds/blinding-lights.mp3 Binary files differnew file mode 100644 index 0000000..8715184 --- /dev/null +++ b/assets/sounds/blinding-lights.mp3 diff --git a/assets/sounds/click1.wav b/assets/sounds/click1.wav Binary files differnew file mode 100644 index 0000000..ec55432 --- /dev/null +++ b/assets/sounds/click1.wav diff --git a/assets/sounds/end-theme.mp3 b/assets/sounds/end-theme.mp3 Binary files differnew file mode 100644 index 0000000..c8f8c50 --- /dev/null +++ b/assets/sounds/end-theme.mp3 diff --git a/assets/sounds/switch38.wav b/assets/sounds/switch38.wav Binary files differnew file mode 100644 index 0000000..64a0946 --- /dev/null +++ b/assets/sounds/switch38.wav diff --git a/assets/sounds/switch6.wav b/assets/sounds/switch6.wav Binary files differnew file mode 100644 index 0000000..449ab53 --- /dev/null +++ b/assets/sounds/switch6.wav @@ -1,4 +1,5 @@ (define-module (game) + #:use-module (chickadee audio) #:use-module (chickadee graphics color) #:use-module (chickadee graphics font) #:use-module (chickadee graphics texture) @@ -52,6 +53,11 @@ (define-asset monogram-font (load-font "assets/fonts/monogram_extended.ttf" 12)) (define-asset monogram-font-big (load-font "assets/fonts/monogram_extended.ttf" 24)) (define-asset old-fax-font (load-font "assets/fonts/old-fax.ttf" 12)) +(define-asset click-sound (load-audio "assets/sounds/click1.wav")) +(define-asset key-press-sound (load-audio "assets/sounds/switch6.wav")) +(define-asset device-sound (load-audio "assets/sounds/switch38.wav")) +(define-asset background-music (load-audio "assets/sounds/ambientmain_0.ogg" #:mode 'stream)) +(define-asset credits-music (load-audio "assets/sounds/end-theme.mp3" #:mode 'stream)) ;;; @@ -148,13 +154,24 @@ (click-channel #:accessor click-channel #:init-thunk make-channel) (terminal-locked? #:accessor terminal-locked? #:init-value #t) (terminal-channel #:accessor terminal-channel #:init-thunk make-channel) - (terminal-lines #:accessor terminal-lines #:init-form (make-ring-buffer 17))) + (terminal-lines #:accessor terminal-lines #:init-form (make-ring-buffer 17)) + (key-pad-locked? #:accessor key-pad-locked? #:init-value #t) + (audio-source #:accessor audio-source #:init-form (make-source #:loop? #t))) (define-method (subject-name (game <game>)) (if (subject-name-known? game) "The Wiremind" "??????")) +(define (play-click-sound) + (audio-play (asset-ref click-sound))) + +(define (play-key-press-sound) + (audio-play (asset-ref key-press-sound))) + +(define (play-device-sound) + (audio-play (asset-ref device-sound))) + (define-method (reset-game (game <game>)) (set! (subject-name-known? game) #f) (set! (has-fridge-key? game) #f) @@ -166,7 +183,8 @@ (set! (click-channel game) (make-channel)) (set! (terminal-locked? game) #t) (set! (terminal-channel game) (make-channel)) - (set! (terminal-lines game) (make-ring-buffer 17))) + (set! (terminal-lines game) (make-ring-buffer 17)) + (set! (key-pad-locked? game) #t)) (define-method (reboot (game <game>)) (reset-game game) @@ -179,6 +197,7 @@ (lambda (widget button) (if (eq? button 'left) (begin + (play-click-sound) (run-script node (proc)) #t) #f))) @@ -193,6 +212,7 @@ (() (set! (state game) 'dialog) (channel-get (click-channel game)) + (play-click-sound) (detach c) (set! (state game) old-state) #t) @@ -224,6 +244,7 @@ choices))))) (attach-to game choice-container) (let ((choice (channel-get choice-channel))) + (play-click-sound) (detach choice-container) (detach c) (set! (state game) old-state) @@ -425,8 +446,26 @@ (exit-term)) (("diagnostic" level) (diagnostic level)) + (("door" "status") + (log "door: locked") + (if (key-pad-locked? game) + (log "key pad: locked") + (log "key pad: unlocked")) + #t) + (("door" "unlock") + (when (key-pad-locked? game) + (log "authenticating...") + (refresh-output #f) + (sleep 30) + (log "user access granted") + (log "key pad activated")) + (log "input PIN to complete unlock sequence") + (log "user hint: circumference to diameter ratio") + (set! (key-pad-locked? game) #f) + #t) (("vent" "status") - (log "off")) + (log "off") + #t) (("vent" "toggle") (if (eq? (cartridge game) 'in-control-panel) (begin @@ -464,7 +503,9 @@ (log "login")) (refresh-output) (let loop () - (if (match (channel-get (terminal-channel game)) + (if (match (let ((key (channel-get (terminal-channel game)))) + (play-key-press-sound) + key) ('backspace (set! input (substring input 0 (max (- (string-length input) 1) 0))) #t) @@ -518,12 +559,9 @@ assignment. My colleagues find it honestly prefer taking notes this way. -If someone is reading this: Sorry -but I've signed too many NDAs to -take any chances with naming -actual people and places. - -;)" +This project is big. It will be a +career defining achievement if it +is successful." "Week 1 Subject has awoken and is slowly @@ -640,32 +678,30 @@ Then I wake up." "Week 7 It's clear what is happening now. -The subject has transcended my -interface and is communicating -with me directly. How do I know? -I was staring at the control panel -and a thought came to me: -\"<writeme>\" - -I didn't think that thought! It -was injected! It's theoretically +The subject has transcended our +interface and is injecting +thoughts directly into my +consciousness. It's theoretically possible, but the isochamber blocks all signals except for the -terminal interface. Did I make a -mistake? I need to turn this -around fast." +terminal interface. The only good +news is that it appears incapable +of reading my own thoughts. + +Did I make a fatal mistake? I +need to turn this around fast." "Week 8 I've failed. It's all over. The Directors shut it down. A member of the medical team removed a -small cartridge from the medical +small cartridge from the refrigerator, inserted it into the -control panel, and activated the -ventilation system via the -terminal. Subject's pulse -flatlined within minutes. I've -been given some time to pack up. +control panel, and typed some +command into the terminal. +Subject's pulse flatlined within +minutes. I've been given some +time alone to pack up. I may be a failure but shouldn't I feel better with that thing out of @@ -749,6 +785,57 @@ diz--")) (detach (& game notebook-group)) (set! (state game) old-state))) +(define (control-panel game) + (let ((old-state (state game))) + (set! (state game) 'control-panel) + (attach-to game + (make <sprite> + #:name 'background + #:texture darkness)) + (case (dialog game player-display-name + "> It's a control panel. What do you want to inspect?" + '(("Key pad" key-pad) + ("Receptacle" receptacle) + ("Nothing" nothing))) + ((key-pad) + (dialog game player-display-name + "> There's a key pad above an electronically locked tray.") + (when (dialog game player-display-name + "> Enter a code?" + '(("Yes" #t) + ("No" #f))) + (let ((g (& game explore-group))) + (detach g) + (if (string=? (pin-entry game) "181816") + (begin + (attach-to game g) + (dialog game player-display-name + "> It worked! The tray below opens to reveal a key inside.") + (dialog game player-display-name + "> You put the key in your pocket.") + (set! (has-fridge-key? game) #t)) + (begin + (attach-to game g) + (dialog game player-display-name + "> Hmm, that wasn't right.")))))) + ((receptacle) + (if (eq? (cartridge game) 'in-hand) + (begin + (dialog game player-display-name + "> There's an opening that is the same size as the cartridge you took from the +refrigerator.") + (when (dialog game player-display-name + "> Do you want to insert the cartridge?" + '(("Yes" #t) + ("No" #f))) + (dialog game player-display-name "> You insert the cartridge.") + (set! (cartridge game) 'in-control-panel))) + (dialog game player-display-name + "> There's an opening where something can be plugged in, but you're not sure +what.")))) + (detach (& game background)) + (set! (state game) old-state))) + (define-method (explore (game <game>)) (define (tint-all color) (set! (tint (& game explore-group room-background)) color) @@ -773,16 +860,19 @@ diz--")) (good-ending game) (bad-ending-1 game)))) (define (open-door) - (let ((g (& game explore-group))) - (detach g) - (if (string=? (pin-entry game) "314159") - (begin - (attach-to game g) - (end-game)) - (begin - (attach-to game g) - (dialog game player-display-name - "> Hmm, no luck."))))) + (if (key-pad-locked? game) + (dialog game player-display-name + "> The key pad doesn't seem to be working.") + (let ((g (& game explore-group))) + (detach g) + (if (string=? (pin-entry game) "314159") + (begin + (attach-to game g) + (end-game)) + (begin + (attach-to game g) + (dialog game player-display-name + "> Hmm, no luck.")))))) (define (inspect-door) (if (opened-notebook? game) (begin @@ -816,47 +906,10 @@ useful to you.") (terminal game) (attach-to game g))) (define (open-control-panel) - (case (dialog game player-display-name - "> It's a control panel. What do you want to inspect?" - '(("Key pad" key-pad) - ("Receptacle" receptacle) - ("Nothing" nothing))) - ((key-pad) - (dialog game player-display-name - "> There's a key pad above an electronically locked tray.") - (when (dialog game player-display-name - "> Enter a code?" - '(("Yes" #t) - ("No" #f))) - (let ((g (& game explore-group))) - (detach g) - (if (string=? (pin-entry game) "181816") - (begin - (attach-to game g) - (dialog game player-display-name - "> It worked! The tray below opens to reveal a key inside.") - (dialog game player-display-name - "> You put the key in your pocket.") - (set! (has-fridge-key? game) #t)) - (begin - (attach-to game g) - (dialog game player-display-name - "> Hmm, that wasn't right.")))))) - ((receptacle) - (if (eq? (cartridge game) 'in-hand) - (begin - (dialog game player-display-name - "> There's an opening that is the same size as the cartridge you took from the -refrigerator.") - (when (dialog game player-display-name - "> Do you want to insert the cartridge?" - '(("Yes" #t) - ("No" #f))) - (dialog game player-display-name "> You insert the cartridge.") - (set! (cartridge game) 'in-control-panel))) - (dialog game player-display-name - "> There's an opening where something can be plugged in, but you're not sure -what."))))) + (let ((g (& game explore-group))) + (detach g) + (control-panel game) + (attach-to game g))) (define (open-fridge) (if (has-fridge-key? game) (begin @@ -925,6 +978,11 @@ if you would just open the door.") (detach g) (notebook game) (attach-to game g))) + (define (run-on-left-click* game proc) + (run-on-left-click game + (lambda () + (play-device-sound) + (proc)))) (attach-to game (make <widget> #:name 'explore-group @@ -938,49 +996,51 @@ if you would just open the door.") #:texture door-lock-texture #:position (vec2 586.0 196.0) #:listeners - `((click . ,(run-on-left-click game open-door)))) + `((click . ,(run-on-left-click* game open-door)))) (make <device> #:name 'door #:rank 1 #:texture door-texture #:position (vec2 445.0 40.0) #:listeners - `((click . ,(run-on-left-click game inspect-door)))) + `((click . ,(run-on-left-click* game inspect-door)))) (make <device> #:name 'control-panel #:rank 1 #:texture control-panel-texture #:position (vec2 230.0 40.0) #:listeners - `((click . ,(run-on-left-click game open-control-panel)))) + `((click . ,(run-on-left-click* game open-control-panel)))) (make <device> #:name 'fridge #:rank 1 #:texture fridge-texture #:position (vec2 0.0 40.0) #:listeners - `((click . ,(run-on-left-click game open-fridge)))) + `((click . ,(run-on-left-click* game open-fridge)))) (make <device> #:name 'notebook #:rank 1 #:texture notebook-texture #:position (vec2 14.0 159.0) #:listeners - `((click . ,(run-on-left-click game open-notebook)))) + `((click . ,(run-on-left-click* game open-notebook)))) (make <device> #:name 'window #:rank 1 #:texture window-texture #:position (vec2 112.0 197.0) #:listeners - `((click . ,(run-on-left-click game inspect-window)))) + `((click . ,(run-on-left-click* game inspect-window)))) (make <device> #:name 'terminal #:rank 1 #:texture terminal-texture #:position (vec2 109.0 40.0) #:listeners - `((click . ,(run-on-left-click game open-terminal))))))) + `((click . ,(run-on-left-click* game open-terminal))))))) + (set-source-audio! (audio-source game) (asset-ref background-music)) + (source-play (audio-source game)) (fade-in)) (define-method (good-ending (game <game>)) @@ -1047,6 +1107,8 @@ time?") (set! (text (& game credits)) line) (sleep 120)) (set! (state game) 'credits) + (set-source-audio! (audio-source game) (asset-ref credits-music)) + (source-play (audio-source game)) (attach-to game (make <sprite> #:name 'background @@ -1060,16 +1122,20 @@ time?") #:position (vec2 (/ game-width 2.0) (/ game-height 2.0)))) (sleep 60) (credit "The Test Subject") - (credit "developed by David Thompson - https://dthompson.us") - (credit "made for the Spring Lisp Game Jam 2021 - https://itch.io/jam/spring-lisp-game-jam-2021") - (credit "monogram font by datagoblin (CC0) - https://datagoblin.itch.io/monogram") - (credit "old fax font by George Blackwell (CC-BY 4.0) - https://georgeblackwell.itch.io/old-fax") + (credit "developed by David Thompson (GPLv3) https://dthompson.us") + (credit "made for the Spring Lisp Game Jam 2021 https://itch.io/jam/spring-lisp-game-jam-2021") + (credit "monogram font by datagoblin (CC0) https://datagoblin.itch.io/monogram") + (credit "old fax font by George Blackwell (CC-BY 4.0) https://georgeblackwell.itch.io/old-fax") + (credit "UI sounds by Kenney (CC0) https://opengameart.org/content/51-ui-sound-effects-buttons-switches-and-clicks") + (credit "background music by brandon75689 (CC0) https://opengameart.org/content/tragic-ambient-main-menu") + (credit "credits music by tcarisland (CC-BY 4.0) https://opengameart.org/content/the-end") (if (>= (friendship game) 3) (credit "congratulations on reaching the true ending!") (credit "the true ending still awaits you...")) (credit "click to play again") (set! (first-playthrough? game) #f) (channel-get (click-channel game)) + (play-click-sound) (tween 120 white black (lambda (color) (set! (tint (& game background)) color)) @@ -1141,7 +1207,7 @@ time?") (define (launch-game) (boot-kernel (make <kernel> #:window-config (make <window-config> - #:title "Spring Lisp Game Jam 2021" + #:title "The Test Subject - Spring Lisp Game Jam 2021" #:width window-width #:height window-height)) (lambda () (make <game>)))) |