win/loss screens and music
This commit is contained in:
parent
6940b3816d
commit
277a040f5f
10 changed files with 273 additions and 25 deletions
77
modules/music.scm
Normal file
77
modules/music.scm
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
(module (bd music) *
|
||||||
|
(import scheme
|
||||||
|
(chicken base)
|
||||||
|
(chicken module)
|
||||||
|
(chicken foreign)
|
||||||
|
raylib
|
||||||
|
(imugi core)
|
||||||
|
foreigners
|
||||||
|
(srfi 69)
|
||||||
|
(srfi 99))
|
||||||
|
|
||||||
|
(foreign-declare "#include <raylib.h>")
|
||||||
|
|
||||||
|
(define-foreign-record-type (Music "struct Music")
|
||||||
|
(constructor: make-music)
|
||||||
|
(destructor: free-music))
|
||||||
|
|
||||||
|
(define load-music-stream
|
||||||
|
(foreign-lambda* Music ((c-string filepath))
|
||||||
|
"
|
||||||
|
Music * music = malloc(sizeof(Music));
|
||||||
|
*music = LoadMusicStream(filepath);
|
||||||
|
C_return(music);"))
|
||||||
|
|
||||||
|
(define unload-music-stream
|
||||||
|
(foreign-lambda* void ((Music music))
|
||||||
|
"
|
||||||
|
UnloadMusicStream(*music);
|
||||||
|
"))
|
||||||
|
|
||||||
|
(define play-music-stream
|
||||||
|
(foreign-lambda* void ((Music music))
|
||||||
|
"
|
||||||
|
PlayMusicStream(*music);
|
||||||
|
"))
|
||||||
|
|
||||||
|
(define update-music-stream
|
||||||
|
(foreign-lambda* void ((Music music))
|
||||||
|
"
|
||||||
|
UpdateMusicStream(*music);
|
||||||
|
"))
|
||||||
|
|
||||||
|
(define stop-music-stream
|
||||||
|
(foreign-lambda* void ((Music music))
|
||||||
|
"
|
||||||
|
StopMusicStream(*music);
|
||||||
|
"))
|
||||||
|
|
||||||
|
(define set-music-volume
|
||||||
|
(foreign-lambda* void ((Music music) (float volume))
|
||||||
|
"
|
||||||
|
SetMusicVolume(*music, volume);
|
||||||
|
"))
|
||||||
|
|
||||||
|
(define current-music #f)
|
||||||
|
(define current-music-path "")
|
||||||
|
|
||||||
|
(define-record-type <music-player>
|
||||||
|
(music-player path)
|
||||||
|
music-player?
|
||||||
|
(path music-player-path))
|
||||||
|
|
||||||
|
(define handle-music-players
|
||||||
|
(make-system
|
||||||
|
'handle-music-players
|
||||||
|
0
|
||||||
|
'entity
|
||||||
|
'(<music-player>)
|
||||||
|
(lambda (_ player)
|
||||||
|
(if (not (equal? current-music-path (music-player-path player)))
|
||||||
|
(begin (when current-music
|
||||||
|
(unload-music-stream current-music))
|
||||||
|
(set! current-music (load-music-stream (music-player-path player)))
|
||||||
|
(set! current-music-path (music-player-path player))
|
||||||
|
(play-music-stream current-music))
|
||||||
|
(update-music-stream current-music)))))
|
||||||
|
)
|
||||||
BIN
res/music/Fight.wav
Normal file
BIN
res/music/Fight.wav
Normal file
Binary file not shown.
BIN
res/music/Lose.wav
Normal file
BIN
res/music/Lose.wav
Normal file
Binary file not shown.
BIN
res/music/Main Menu.wav
Normal file
BIN
res/music/Main Menu.wav
Normal file
Binary file not shown.
BIN
res/music/Win.wav
Normal file
BIN
res/music/Win.wav
Normal file
Binary file not shown.
|
|
@ -11,6 +11,9 @@
|
||||||
(bd random)
|
(bd random)
|
||||||
(bd attack)
|
(bd attack)
|
||||||
(bd grid)
|
(bd grid)
|
||||||
|
(bd music)
|
||||||
|
(win-screen)
|
||||||
|
(lose-screen)
|
||||||
(srfi 1)
|
(srfi 1)
|
||||||
(srfi 99))
|
(srfi 99))
|
||||||
|
|
||||||
|
|
@ -34,29 +37,10 @@
|
||||||
(stance unit-stance set-unit-stance!))
|
(stance unit-stance set-unit-stance!))
|
||||||
|
|
||||||
(define player-unit
|
(define player-unit
|
||||||
(unit
|
'())
|
||||||
player
|
|
||||||
3
|
|
||||||
;; Place player
|
|
||||||
(vec (rand-int grid-size)
|
|
||||||
(rand-int grid-size))
|
|
||||||
(hand-direction 'mid 'right)
|
|
||||||
'mid))
|
|
||||||
|
|
||||||
(define enemy-unit
|
(define enemy-unit
|
||||||
(unit
|
'())
|
||||||
enemy
|
|
||||||
3
|
|
||||||
;; Place enemy
|
|
||||||
(let loop ()
|
|
||||||
(let ((p-x (rand-int grid-size))
|
|
||||||
(p-y (rand-int grid-size)))
|
|
||||||
(if (not (v= (vec p-x p-y)
|
|
||||||
(unit-pos player-unit)))
|
|
||||||
(vec p-x p-y)
|
|
||||||
(loop))))
|
|
||||||
(hand-direction 'mid 'left)
|
|
||||||
'mid))
|
|
||||||
|
|
||||||
(define-record-type <order>
|
(define-record-type <order>
|
||||||
(order movement attack stance)
|
(order movement attack stance)
|
||||||
|
|
@ -112,6 +96,14 @@
|
||||||
(else (rotate-pos (unit-hand-pos enemy-unit))))))
|
(else (rotate-pos (unit-hand-pos enemy-unit))))))
|
||||||
o))
|
o))
|
||||||
|
|
||||||
|
(define (win)
|
||||||
|
(display "Win!")
|
||||||
|
(newline))
|
||||||
|
|
||||||
|
(define (lose)
|
||||||
|
(display "Lose!")
|
||||||
|
(newline))
|
||||||
|
|
||||||
(define (attempt-attack attack-dir unit)
|
(define (attempt-attack attack-dir unit)
|
||||||
(display (unit-type unit))
|
(display (unit-type unit))
|
||||||
(newline)
|
(newline)
|
||||||
|
|
@ -125,7 +117,10 @@
|
||||||
(display (conc (unit-type unit) " hits!"))
|
(display (conc (unit-type unit) " hits!"))
|
||||||
(set-unit-health! target (- (unit-health target) 1))
|
(set-unit-health! target (- (unit-health target) 1))
|
||||||
(when (= 0 (unit-health target))
|
(when (= 0 (unit-health target))
|
||||||
(set! battle-state 'ended)))
|
(set! battle-state 'ended)
|
||||||
|
(if (eqv? player (unit-type target))
|
||||||
|
(lose)
|
||||||
|
(win))))
|
||||||
(display (conc (unit-type unit) " misses!")))
|
(display (conc (unit-type unit) " misses!")))
|
||||||
(newline)
|
(newline)
|
||||||
(set-unit-hand-pos! unit (opposite-pos attack-dir))))
|
(set-unit-hand-pos! unit (opposite-pos attack-dir))))
|
||||||
|
|
@ -163,7 +158,38 @@
|
||||||
(else empty))))))))))
|
(else empty))))))))))
|
||||||
|
|
||||||
(export arena)
|
(export arena)
|
||||||
(define (arena)
|
(define (arena menu-scene)
|
||||||
|
;; Reset state
|
||||||
|
(set! battle-state 'active)
|
||||||
|
(set! player-unit
|
||||||
|
(unit
|
||||||
|
player
|
||||||
|
3
|
||||||
|
;; Place player
|
||||||
|
(vec (rand-int grid-size)
|
||||||
|
(rand-int grid-size))
|
||||||
|
(hand-direction 'mid 'right)
|
||||||
|
'mid))
|
||||||
|
(set! enemy-unit
|
||||||
|
(unit
|
||||||
|
enemy
|
||||||
|
3
|
||||||
|
;; Place enemy
|
||||||
|
(let loop ()
|
||||||
|
(let ((p-x (rand-int grid-size))
|
||||||
|
(p-y (rand-int grid-size)))
|
||||||
|
(if (not (v= (vec p-x p-y)
|
||||||
|
(unit-pos player-unit)))
|
||||||
|
(vec p-x p-y)
|
||||||
|
(loop))))
|
||||||
|
(hand-direction 'mid 'left)
|
||||||
|
'mid))
|
||||||
|
|
||||||
|
(set! win (lambda ()
|
||||||
|
((win-screen arena menu-scene))))
|
||||||
|
(set! lose (lambda ()
|
||||||
|
((lose-screen arena menu-scene))))
|
||||||
|
|
||||||
(scene
|
(scene
|
||||||
push-actions
|
push-actions
|
||||||
process-dynamic-labels
|
process-dynamic-labels
|
||||||
|
|
@ -171,6 +197,11 @@
|
||||||
draw-labels
|
draw-labels
|
||||||
draw-grid
|
draw-grid
|
||||||
handle-buttons
|
handle-buttons
|
||||||
|
handle-music-players
|
||||||
|
|
||||||
|
(entity
|
||||||
|
(music-player
|
||||||
|
"../res/music/Fight.wav"))
|
||||||
|
|
||||||
;; Level heading
|
;; Level heading
|
||||||
(entity
|
(entity
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,11 @@
|
||||||
|
|
||||||
(register-action 'click 'mouse-press MOUSE_BUTTON_LEFT)
|
(register-action 'click 'mouse-press MOUSE_BUTTON_LEFT)
|
||||||
|
|
||||||
|
(init-audio-device)
|
||||||
|
|
||||||
((main-menu (lambda ()
|
((main-menu (lambda ()
|
||||||
(display "Loading game scene...")
|
(display "Loading game scene...")
|
||||||
(newline)
|
(newline)
|
||||||
((arena)))))
|
((arena main-menu)))))
|
||||||
|
|
||||||
(create-window))
|
(create-window))
|
||||||
|
|
|
||||||
66
src/lose-screen.scm
Normal file
66
src/lose-screen.scm
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
(module (lose-screen) ()
|
||||||
|
(import scheme
|
||||||
|
(chicken base)
|
||||||
|
(chicken module)
|
||||||
|
raylib
|
||||||
|
(imugi core)
|
||||||
|
(imugi input)
|
||||||
|
(imugi scene)
|
||||||
|
(imugi math)
|
||||||
|
(bd ui))
|
||||||
|
|
||||||
|
(export lose-screen)
|
||||||
|
(define (lose-screen arena-scene menu-scene)
|
||||||
|
(play-sound (load-sound "../res/music/Lose.wav"))
|
||||||
|
(scene
|
||||||
|
|
||||||
|
push-actions
|
||||||
|
draw-labels
|
||||||
|
handle-buttons
|
||||||
|
|
||||||
|
(entity
|
||||||
|
(title
|
||||||
|
(vec
|
||||||
|
0
|
||||||
|
(/ (cdr (*window-size*))
|
||||||
|
6))
|
||||||
|
"You have lost!"
|
||||||
|
centered: (cons #t #f)))
|
||||||
|
|
||||||
|
(entity
|
||||||
|
(button
|
||||||
|
;; Roughly centered.
|
||||||
|
;; these are ugly, hardcoded values.
|
||||||
|
(vec (- (/ (car (*window-size*))
|
||||||
|
2)
|
||||||
|
50)
|
||||||
|
(- (/ (car (*window-size*))
|
||||||
|
2)
|
||||||
|
100))
|
||||||
|
;; Nested footer text
|
||||||
|
(footer
|
||||||
|
(vec 0 0) ;; this vec doesn't matter, it's overwritten internally
|
||||||
|
"Play Again?")
|
||||||
|
(lambda ()
|
||||||
|
((arena-scene menu-scene)))))
|
||||||
|
|
||||||
|
(entity
|
||||||
|
(button
|
||||||
|
;; Roughly centered.
|
||||||
|
;; these are ugly, hardcoded values.
|
||||||
|
(vec (- (/ (car (*window-size*))
|
||||||
|
2)
|
||||||
|
50)
|
||||||
|
(- (/ (car (*window-size*))
|
||||||
|
2)
|
||||||
|
170))
|
||||||
|
;; Nested footer text
|
||||||
|
(footer
|
||||||
|
(vec 0 0) ;; this vec doesn't matter, it's overwritten internally
|
||||||
|
"Back to Menu")
|
||||||
|
(lambda ()
|
||||||
|
((menu-scene
|
||||||
|
(lambda ()
|
||||||
|
((arena-scene menu-scene))))))))))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
@ -6,7 +6,8 @@
|
||||||
(imugi input)
|
(imugi input)
|
||||||
(imugi scene)
|
(imugi scene)
|
||||||
(imugi math)
|
(imugi math)
|
||||||
(bd ui))
|
(bd ui)
|
||||||
|
(bd music))
|
||||||
|
|
||||||
(export main-menu)
|
(export main-menu)
|
||||||
(define (main-menu play-callback)
|
(define (main-menu play-callback)
|
||||||
|
|
@ -14,6 +15,11 @@
|
||||||
push-actions
|
push-actions
|
||||||
draw-labels
|
draw-labels
|
||||||
handle-buttons
|
handle-buttons
|
||||||
|
handle-music-players
|
||||||
|
|
||||||
|
(entity
|
||||||
|
(music-player
|
||||||
|
"../res/music/Main Menu.wav"))
|
||||||
|
|
||||||
;;; Text
|
;;; Text
|
||||||
;; Title
|
;; Title
|
||||||
|
|
|
||||||
66
src/win-screen.scm
Normal file
66
src/win-screen.scm
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
(module (win-screen) ()
|
||||||
|
(import scheme
|
||||||
|
(chicken base)
|
||||||
|
(chicken module)
|
||||||
|
raylib
|
||||||
|
(imugi core)
|
||||||
|
(imugi input)
|
||||||
|
(imugi scene)
|
||||||
|
(imugi math)
|
||||||
|
(bd ui))
|
||||||
|
|
||||||
|
(export win-screen)
|
||||||
|
(define (win-screen arena-scene menu-scene)
|
||||||
|
(play-sound (load-sound "../res/music/Win.wav"))
|
||||||
|
(scene
|
||||||
|
|
||||||
|
push-actions
|
||||||
|
draw-labels
|
||||||
|
handle-buttons
|
||||||
|
|
||||||
|
(entity
|
||||||
|
(title
|
||||||
|
(vec
|
||||||
|
0
|
||||||
|
(/ (cdr (*window-size*))
|
||||||
|
6))
|
||||||
|
"You have won!"
|
||||||
|
centered: (cons #t #f)))
|
||||||
|
|
||||||
|
(entity
|
||||||
|
(button
|
||||||
|
;; Roughly centered.
|
||||||
|
;; these are ugly, hardcoded values.
|
||||||
|
(vec (- (/ (car (*window-size*))
|
||||||
|
2)
|
||||||
|
50)
|
||||||
|
(- (/ (car (*window-size*))
|
||||||
|
2)
|
||||||
|
100))
|
||||||
|
;; Nested footer text
|
||||||
|
(footer
|
||||||
|
(vec 0 0) ;; this vec doesn't matter, it's overwritten internally
|
||||||
|
"Play Again?")
|
||||||
|
(lambda ()
|
||||||
|
((arena-scene menu-scene)))))
|
||||||
|
|
||||||
|
(entity
|
||||||
|
(button
|
||||||
|
;; Roughly centered.
|
||||||
|
;; these are ugly, hardcoded values.
|
||||||
|
(vec (- (/ (car (*window-size*))
|
||||||
|
2)
|
||||||
|
50)
|
||||||
|
(- (/ (car (*window-size*))
|
||||||
|
2)
|
||||||
|
170))
|
||||||
|
;; Nested footer text
|
||||||
|
(footer
|
||||||
|
(vec 0 0) ;; this vec doesn't matter, it's overwritten internally
|
||||||
|
"Back to Menu")
|
||||||
|
(lambda ()
|
||||||
|
((menu-scene
|
||||||
|
(lambda ()
|
||||||
|
((arena-scene menu-scene))))))))))
|
||||||
|
)
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue