Add gems and the start of floor switches.
This commit is contained in:
parent
5fb33112d8
commit
ba7b9ea9d8
5 changed files with 142 additions and 36 deletions
46
game.scm
46
game.scm
|
@ -67,6 +67,7 @@
|
|||
(define audio:undo (load-sound-effect "undo"))
|
||||
(define audio:no (load-sound-effect "no"))
|
||||
(define audio:exit (load-sound-effect "exit"))
|
||||
(define audio:pickup (load-sound-effect "pickup"))
|
||||
|
||||
;; Game state
|
||||
(define *state* #f)
|
||||
|
@ -83,6 +84,7 @@
|
|||
load-level-2
|
||||
load-level-3))
|
||||
(define *level-idx* #f)
|
||||
(define *gems* #f)
|
||||
(define *level* #f)
|
||||
;; Latest representation of all actors in level
|
||||
(define *objects* #f)
|
||||
|
@ -113,7 +115,7 @@
|
|||
(set! *actormap* (make-whactormap))
|
||||
(clear-snapshots!)
|
||||
(with-goblins
|
||||
(set! *level* ((vector-ref levels idx)))
|
||||
(set! *level* ((vector-ref levels idx) (not (memq idx *gems*))))
|
||||
(update-objects!)))
|
||||
|
||||
(define (next-level!)
|
||||
|
@ -129,15 +131,22 @@
|
|||
;; Auto-save/load to local storage.
|
||||
(define (save-game!)
|
||||
(pk 'save)
|
||||
(local-storage-set! "cirkoban-level" (number->string *level-idx*)))
|
||||
(local-storage-set! "cirkoban-save"
|
||||
(call-with-output-string
|
||||
(lambda (port)
|
||||
(write (list *level-idx* *gems*) port)))))
|
||||
|
||||
(define (load-game!)
|
||||
(set! *level-idx*
|
||||
(match (local-storage-ref "cirkoban-level")
|
||||
("" 0)
|
||||
(str (string->number str))))
|
||||
(pk 'load *level-idx*)
|
||||
(load-level! *level-idx*))
|
||||
(let ((saved
|
||||
(match (local-storage-ref "cirkoban-save")
|
||||
("" '(0 ())) ; initial save state
|
||||
(str (call-with-input-string str read)))))
|
||||
(match saved
|
||||
((idx gems)
|
||||
(set! *level-idx* idx)
|
||||
(set! *gems* gems)
|
||||
(pk 'load *level-idx*)
|
||||
(load-level! *level-idx*)))))
|
||||
|
||||
(define (reset-game!)
|
||||
(set! *level-idx* 0)
|
||||
|
@ -151,7 +160,7 @@
|
|||
($ (level-player *level*) 'move dir)
|
||||
($ (level-actor *level*) 'tick)
|
||||
(define result
|
||||
(match (pk 'event ($ (level-player *level*) 'event))
|
||||
(match ($ (level-player *level*) 'event)
|
||||
(('bump)
|
||||
(media-play audio:bump)
|
||||
#f)
|
||||
|
@ -161,6 +170,10 @@
|
|||
(('exit)
|
||||
(media-play audio:exit)
|
||||
'next-level)
|
||||
(('gem)
|
||||
(media-play audio:pickup)
|
||||
(set! *gems* (cons *level-idx* *gems*))
|
||||
#f)
|
||||
(_ #f)))
|
||||
(update-objects!)
|
||||
result))
|
||||
|
@ -220,6 +233,12 @@
|
|||
(define (draw-clock-emitter pos)
|
||||
(draw-tile context tileset 48 (vec2-x pos) (vec2-y pos)))
|
||||
|
||||
(define (draw-floor-switch pos on?)
|
||||
(draw-tile context tileset (if on? 25 24) (vec2-x pos) (vec2-y pos)))
|
||||
|
||||
(define (draw-gem pos)
|
||||
(draw-tile context tileset 28 (vec2-x pos) (vec2-y pos)))
|
||||
|
||||
(define (draw-object obj)
|
||||
(match obj
|
||||
(#f #f)
|
||||
|
@ -227,7 +246,9 @@
|
|||
(('exit pos) (draw-exit pos))
|
||||
(('wall pos type) (draw-wall type pos))
|
||||
(('block pos type) (draw-block type pos))
|
||||
(('clock-emitter pos) (draw-clock-emitter pos))))
|
||||
(('clock-emitter pos) (draw-clock-emitter pos))
|
||||
(('floor-switch pos on?) (draw-floor-switch pos on?))
|
||||
(('gem pos) (draw-gem pos))))
|
||||
|
||||
(define (draw-background)
|
||||
(let* ((bv (level-background *level*))
|
||||
|
@ -282,7 +303,10 @@
|
|||
(move-player 'down))
|
||||
((string=? key key:undo)
|
||||
(rollback-snapshot!)
|
||||
(with-goblins (update-objects!)))))
|
||||
(with-goblins (update-objects!)))
|
||||
;; REMOVE BEFORE RELEASE!!!!
|
||||
((string=? key key:confirm)
|
||||
(next-level!))))
|
||||
('win
|
||||
(cond
|
||||
((string=? key key:confirm)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue