summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/main.el210
-rw-r--r--scripts/main.scm299
-rw-r--r--scripts/prompt.scm45
-rw-r--r--scripts/stage.scm0
-rw-r--r--scripts/structs.scm80
-rw-r--r--scripts/utils.scm8
6 files changed, 209 insertions, 433 deletions
diff --git a/scripts/main.el b/scripts/main.el
index 2c6c54d..92a50e1 100644
--- a/scripts/main.el
+++ b/scripts/main.el
@@ -1,3 +1,211 @@
+(defvar key-left 65361) ;; macroquad input code
+(defvar key-up 65362)
+(defvar key-right 65363)
+(defvar key-down 65364)
+
+(defvar gameover ())
+(defvar tile-size (list 18.0 24.0))
+(defvar subtile-width 5.0)
+(defvar subtile-height 7.0)
+
+(defvar player-direction ())
+(defvar player-body (list (list 3 2)))
+(defvar frame-timer-duration 0.3)
+(defvar frame-timer 0.0)
+(defvar fruit-tile (list 4 5))
+
+
+(defun is-tile-equal? (pos1 pos2)
+ (and (== (car pos1) (car pos2)) (== (cadr pos1) (cadr pos2)))
+ )
+
+(defun sum-pos (pos1 pos2)
+ (list (+ (car pos1) (car pos2)) (+ (cadr pos1) (cadr pos2)))
+ )
+
+(defun tile-to-pos (tile)
+ (list (* (car tile) (car tile-size)) (* (cadr tile) (cadr tile-size)))
+ )
+
+(defun draw-subtile (tile subtile)
+ (defvar offset (tile-to-pos tile))
+ (mq-draw-rectangle (+ (car offset) (+ (* subtile-width (car subtile)) (car subtile))) (+ (cadr offset) (+ (* subtile-height (cadr subtile)) (cadr subtile))) subtile-width subtile-height)
+ )
+
+(defun draw-fruit (tile)
+ (draw-subtile tile (list 1 0))
+ (draw-subtile tile (list 2 1))
+ (draw-subtile tile (list 1 2))
+ (draw-subtile tile (list 0 1))
+ )
+
+(defun draw-horizontal-line (tile)
+ (draw-subtile tile (list 0 1))
+ (draw-subtile tile (list 1 1))
+ (draw-subtile tile (list 2 1))
+ )
+
+(defun draw-vertical-line (tile)
+ (draw-subtile tile (list 1 0))
+ (draw-subtile tile (list 1 1))
+ (draw-subtile tile (list 1 2))
+ )
+
+(defun draw-corner-tl (tile)
+ (draw-subtile tile (list 1 1))
+ (draw-subtile tile (list 2 1))
+ (draw-subtile tile (list 1 2))
+ )
+
+(defun draw-corner-tr (tile)
+ (draw-subtile tile (list 1 1))
+ (draw-subtile tile (list 0 1))
+ (draw-subtile tile (list 1 2))
+ )
+
+(defun draw-corner-bl (tile)
+ (draw-subtile tile (list 1 1))
+ (draw-subtile tile (list 1 0))
+ (draw-subtile tile (list 2 1))
+ )
+
+(defun draw-corner-br (tile)
+ (draw-subtile tile (list 1 1))
+ (draw-subtile tile (list 1 0))
+ (draw-subtile tile (list 0 1))
+ )
+
+(defun draw-snake-tile (tile)
+ (defvar offset (tile-to-pos tile))
+ (mq-draw-rectangle (car offset) (cadr offset) (car tile-size) (cadr tile-size) 0.4)
+ (draw-subtile tile (list 0 0))
+ (draw-subtile tile (list 1 0))
+ (draw-subtile tile (list 2 0))
+ (draw-subtile tile (list 0 1))
+ (draw-subtile tile (list 1 1))
+ (draw-subtile tile (list 2 1))
+ (draw-subtile tile (list 0 2))
+ (draw-subtile tile (list 1 2))
+ (draw-subtile tile (list 2 2))
+ )
+
+(defun process-input ()
+ (if (mq-is-key-pressed key-left)
+ (setq player-direction key-left))
+ (if (mq-is-key-pressed key-right)
+ (setq player-direction key-right))
+ (if (mq-is-key-pressed key-up)
+ (setq player-direction key-up))
+ (if (mq-is-key-pressed key-down)
+ (setq player-direction key-down))
+ )
+
+(defun move-player-body (dir)
+ (setq player-body (move-player-body-aux player-body (sum-pos (car player-body) dir)))
+ )
+
+(defun move-player-body-aux (body pos)
+ (if (not (null (cdr body)))
+ (cons pos (move-player-body-aux (cdr body) (car body)))
+ (cons pos ()))
+ )
+
+(defun push-new-tile ()
+ (setq player-body (push-new-tile-aux player-body))
+ )
+
+(defun push-new-tile-aux (body)
+ (if (null (cdr body))
+ (list (car body) (car body))
+ (cons (car body) (push-new-tile-aux (cdr body)))
+ ))
+
+(defun check-collision-self ()
+ (if (null (cdr player-body))
+ ()
+ (check-collision-self-aux (cdr player-body) (car player-body)))
+ )
+
+(defun check-collision-self-aux (body pos)
+ (if (is-tile-equal? (car body) pos)
+ 1
+ (if (null (cdr body))
+ ()
+ (check-collision-self-aux (cdr body) pos))
+ )
+ )
+
+(defun process-frame ()
+ ;; Set frame timer to 0 (game is running at 60 FPS)
+ (setq frame-timer 0.0)
+
+ ;; Move player
+ (if (== player-direction key-left)
+ (move-player-body (list -1 0))
+ )
+
+ (if (== player-direction key-up)
+ (move-player-body (list 0 -1))
+ )
+
+ (if (== player-direction key-right)
+ (move-player-body (list 1 0))
+ )
+
+ (if (== player-direction key-down)
+ (move-player-body (list 0 1))
+ )
+
+ ;; Check collision with self
+ (if (check-collision-self)
+ (setq gameover 1))
+
+
+ ;; Check collision border
+ (if (or (<= (car (car player-body)) 2)
+ (>= (car (car player-body)) 31)
+ (<= (cadr (car player-body)) 1)
+ (>= (cadr (car player-body)) 22))
+ (setq gameover 1))
+
+ ;; Check collision with fruit
+ (if (is-tile-equal? (car player-body) fruit-tile)
+ (begin
+ (push-new-tile)
+ (setq fruit-tile (list (randi-range 3 30) (randi-range 2 21)))))
+ )
+
+
+(defun update (dt)
+ (process-input)
+
+ (setq frame-timer (+ frame-timer dt))
+ (if (and (not gameover) (> frame-timer frame-timer-duration))
+ (process-frame))
+
+
+ )
+
+
(defun draw ()
- (rq-draw-circle 50.0 50.0 40.0)
+ (mapcar (lambda (tile)
+ (draw-snake-tile tile))
+ player-body)
+
+ (mapcar (lambda (i)
+ (draw-vertical-line (list 2 i))
+ (draw-vertical-line (list 31 i)))
+ (range 2 22))
+
+ (mapcar (lambda (i)
+ (draw-horizontal-line (list i 1))
+ (draw-horizontal-line (list i 22)))
+ (range 3 31))
+
+ (draw-corner-tl (list 2 1))
+ (draw-corner-tr (list 31 1))
+ (draw-corner-bl (list 2 22))
+ (draw-corner-br (list 31 22))
+
+ (draw-fruit fruit-tile)
)
diff --git a/scripts/main.scm b/scripts/main.scm
deleted file mode 100644
index 9db17fc..0000000
--- a/scripts/main.scm
+++ /dev/null
@@ -1,299 +0,0 @@
-(load "./scripts/structs.scm")
-(load "./scripts/utils.scm")
-(load "./scripts/prompt.scm")
-(load "./scripts/gol.scm")
-
-(define current-stage-number 0)
-(define current-generation 0)
-(define current-pressed-key #f)
-(define starting-cells (list))
-(define trigger-level-reload #t)
-(define overlay-fade-time 0.0)
-(define is-advancing #f)
-
-
-(define stages (list (list '(1 . 0)
- '(1 . 1)
- '(0 . 0)
- '(0 . 1))
- (list '(0 . -1)
- '(1 . 0)
- '(0 . 1)
- '(-1 . 0))
- (list '(0 . 0)
- '(0 . 1)
- '(0 . 2))
- (list '(0 . 0)
- '(-1 . 0)
- '(0 . -1))
- (list '(1 . 0)
- '(0 . 1))
- (list '(2 . 0)
- '(1 . 0)
- '(1 . 1)
- '(0 . 1)
- '(0 . 2))
- (list '(-1 . -1)
- '(0 . -1)
- '(1 . 0)
- '(0 . 1)
- '(-1 . 1)
- '(-2 . 0))
- (list '(-1 . -1)
- '(0 . -1)
- '(1 . -1)
- '(-1 . 0)
- '(1 . 0)
- '(-1 . 1)
- '(0 . 1)
- '(1 . 1))
- (list '(0 . -1)
- '(0 . 0)
- '(0 . 1)
- '(1 . -1)
- '(1 . 0)
- '(1 . 1)
- '(2 . 0))
- ))
-
-(define (update-generation)
- (clear-cells)
- (set-cells-array starting-cells)
-
- (let loop ((times 0))
- (if (< times current-generation)
- (begin (run-step)
- (loop (+ times 1)))
- )
- )
- )
-
-(define (is-solution? l1)
- (define trigger #t)
- (for-each (lambda (c)
- (if (not (hash-table-ref current-cells c))
- (begin (set! trigger #f)))
- )
- (stages current-stage-number))
- (and trigger (eq? (length (stages current-stage-number)) (length (hash-table-keys current-cells))))
- )
-
-(define (update-game)
-
- (set! current-pressed-key (rl-get-key-pressed))
-
- (prompt-update)
-
- (if trigger-level-reload
- (begin (set! starting-cells (list))
- (clear-cells)
- (set-cells-array starting-cells)
- (set! trigger-level-reload #f)))
-
- (cond ((and (not prompt-active) (not is-advancing))
- (if (eq? current-pressed-key KEY_LEFT)
- (cond ((> current-generation 0)
- (set! current-generation (- current-generation 1))
- (update-generation)))
- )
-
- (if (eq? current-pressed-key KEY_RIGHT)
- (cond ((< current-generation 1)
- (set! current-generation (+ current-generation 1))
- (update-generation)))
- )
-
- ))
-
- (if (and (eq? current-generation 1) (not is-advancing))
- (if (is-solution? (stages current-stage-number))
- (begin (set! is-advancing #t)
- (set! overlay-fade-time 0.0))
- )
- )
-
- (if (and (rl-is-mouse-button-pressed) (eq? current-generation 0))
- (let ((mouse-pos (rl-get-mouse-position)))
- (define tile-x (floor ( / (- (mouse-pos 0) 275) 50)))
- (define tile-y (floor ( / (- (mouse-pos 1) 200) 50)))
- (if (and (>= tile-x -1)
- (<= tile-x 1)
- (>= tile-y -1)
- (<= tile-y 1))
- (begin (toggle-cell `(,tile-x . ,tile-y))
- (set! starting-cells (get-cells-list))))
- ))
-
- (if is-advancing
- (set! overlay-fade-time (+ overlay-fade-time (rl-get-frame-time)))
- (set! overlay-fade-time (- overlay-fade-time (rl-get-frame-time)))
- )
-
- (if (> overlay-fade-time 1.0)
- (begin (set! is-advancing #f)
- (clear-cells)
- (set! starting-cells (list))
- (set! current-generation 0)
- (set! current-stage-number (+ current-stage-number 1))
- )
- )
- )
-
-(define (update-end)
- (if is-advancing
- (set! overlay-fade-time (+ overlay-fade-time (rl-get-frame-time)))
- (set! overlay-fade-time (- overlay-fade-time (rl-get-frame-time)))
- )
- )
-
-(define (update)
- (if (>= current-stage-number (length stages))
- (update-end)
- (update-game)
- )
- )
-
-(define (draw-game)
- (rl-draw-rectangle 0 0 600 450 (make-color 255 255 255 255))
-
- (prompt-draw)
-
- (rl-draw-text (string-append "Level " (number->string current-stage-number)) 75 15 20 (make-color 0 0 0 255))
-
- (draw-cells)
-
- (draw-grid)
-
- (draw-generation)
-
- (define lerped-alpha (* 255.0 overlay-fade-time) )
- (if (< lerped-alpha 0.0)
- (set! lerped-alpha 0.0))
-
- (rl-draw-rectangle 0 0 600 450 (make-color 255 255 255 (floor lerped-alpha)))
- )
-
-(define (draw-end)
- (rl-draw-rectangle 0 0 600 450 (make-color 255 255 255 255))
-
- (rl-draw-text "The end! Thank you for playing :)" 38 200 30 (make-color 0 0 0 255))
-
- (rl-draw-text "Made with Raylib + S7 Scheme" 146 340 20 (make-color 0 0 0 255))
-
- (define lerped-alpha (* 255.0 overlay-fade-time) )
- (if (< lerped-alpha 0.0)
- (set! lerped-alpha 0.0))
-
- (rl-draw-rectangle 0 0 600 450 (make-color 255 255 255 (floor lerped-alpha)))
- )
-
-(define (draw-generation)
-
- (let loop ((times 0))
- (if (< times 2)
- (begin
- (rl-draw-rectangle (+ 75 (* times 40))
- 410
- 30
- 30
- (make-color 190 190 190 255))
- (if (eq? times current-generation)
- (rl-draw-rectangle (+ 80 (* times 40))
- 415
- 20
- 20
- (make-color 0 0 0 255)))
-
- (loop (+ times 1))
- )))
-
- )
-
-(define (draw)
- (if (>= current-stage-number (length stages))
- (draw-end)
- (draw-game)
- )
- )
-
-
-(define (draw-grid)
- (define cell-width 50)
- (define cell-height 50)
-
- (let loop ((times 10))
- (if (> times 0)
- (begin (rl-draw-line (+ (* times cell-width) (* cell-width 0.5))
- 50
- (+ (* times cell-width) (* cell-width 0.5))
- 400
- (make-color 200 200 200 255))
- (loop (- times 1)))
- )
- )
-
- (let loop ((times 8))
- (if (> times 0)
- (begin (rl-draw-line 75
- (* times cell-height)
- 525
- (* times cell-height)
- (make-color 200 200 200 255))
- (loop (- times 1)))
- )
- )
-
- (let loop ((times 4))
- (if (> times 0)
- (begin (rl-draw-line (+ (* times cell-width) 175)
- 150
- (+ (* times cell-width) 175)
- 300
- (make-color 0 0 0 255))
- (loop (- times 1)))
- )
- )
-
- (let loop ((times 4))
- (if (> times 0)
- (begin (rl-draw-line 225
- (+ (* times cell-height) 100)
- 375
- (+ (* times cell-height) 100)
- (make-color 0 0 0 255))
- (loop (- times 1)))
- )
- )
- )
-
-(define (draw-cells)
- (define cell-width 50)
- (define cell-height 50)
- (define cell-color (if (eq? current-generation 0)
- (make-color 190 100 255 255)
- (make-color 255 190 100 255)))
-
-
- (for-each (lambda (cell)
- (rl-draw-rectangle
- (+ (* (car cell) cell-width) (- 300 (* cell-width 0.5)) )
- (+ (* (cdr cell) cell-height) (- 225 (* cell-height 0.5)) )
- cell-width
- cell-height
- cell-color)
-
- ) (hash-table-keys current-cells))
-
-
- (for-each (lambda (cell)
- (rl-draw-rectangle
- (+ (* (car cell) 50) 290 )
- (+ (* (cdr cell) 50) 215 )
- 20
- 20
- (make-color 255 190 100 255))
-
- ) (stages current-stage-number))
-
-
- )
diff --git a/scripts/prompt.scm b/scripts/prompt.scm
deleted file mode 100644
index e78e5b3..0000000
--- a/scripts/prompt.scm
+++ /dev/null
@@ -1,45 +0,0 @@
-(define prompt-active #f)
-(define prompt-box (make-rect 0 0 800 20))
-(define prompt-text "")
-
-(define (prompt-update)
- (if (eq? current-pressed-key KEY_F1)
- (set! prompt-active (not prompt-active))
- )
-
- (if prompt-active
- (begin
- (let ((key (rl-get-char-pressed)))
- (cond ((and (>= key 32) (<= key 125))
- (set! prompt-text
- (string-append prompt-text (string (integer->char key)))))
- ))
-
- (if (rl-is-key-down KEY_ENTER)
- (begin
- (eval-string prompt-text)
- (set! prompt-text "")
- ))
-
- (if (eq? current-pressed-key KEY_BACKSPACE)
- (let ((n (string-length prompt-text)))
- (cond ((>= n 1)
- (set! prompt-text (substring prompt-text 0 (- n 1))))
- )))
-
- ))
-
- )
-
-(define (prompt-draw)
- (if prompt-active
- (begin
- (rl-draw-rectangle
- (rect-x prompt-box)
- (rect-y prompt-box)
- (rect-width prompt-box)
- (rect-height prompt-box)
- (make-color 190 100 255 255))
- (rl-draw-text prompt-text 0 0 20 (make-color 0 0 0 255))
- ))
- )
diff --git a/scripts/stage.scm b/scripts/stage.scm
deleted file mode 100644
index e69de29..0000000
--- a/scripts/stage.scm
+++ /dev/null
diff --git a/scripts/structs.scm b/scripts/structs.scm
deleted file mode 100644
index c3fa6ea..0000000
--- a/scripts/structs.scm
+++ /dev/null
@@ -1,80 +0,0 @@
-;; ============================================================
-;; define defstruct macro
-(define-macro (defstruct struct-name . fields)
- (let* ((name (if (list? struct-name) (car struct-name) struct-name))
- (sname (if (string? name) name (symbol->string name)))
-
- (fsname (if (list? struct-name)
- (let ((cname (assoc :conc-name (cdr struct-name))))
- (if cname
- (symbol->string (cadr cname))
- sname))
- sname))
-
- (make-name (if (list? struct-name)
- (let ((cname (assoc :constructor (cdr struct-name))))
- (if cname
- (cadr cname)
- (symbol "make-" sname)))
- (symbol "make-" sname)))
-
- (copy-name (if (list? struct-name)
- (let ((cname (assoc :copier (cdr struct-name))))
- (if cname
- (cadr cname)
- (symbol "copy-" sname)))
- (symbol "copy-" sname)))
-
- (field-names (map (lambda (n)
- (symbol->string (if (list? n) (car n) n)))
- fields))
-
- (field-types (map (lambda (field)
- (if (list? field)
- (apply (lambda* (val type read-only) type) (cdr field))
- #f))
- fields))
-
- (field-read-onlys (map (lambda (field)
- (if (list? field)
- (apply (lambda* (val type read-only) read-only) (cdr field))
- #f))
- fields)))
-
- `(begin
- (define ,(symbol sname "?")
- (lambda (obj)
- (and (vector? obj)
- (eq? (obj 0) ',(string->symbol sname)))))
-
- (define* (,make-name
- ,@(map (lambda (n)
- (if (and (list? n)
- (>= (length n) 2))
- (list (car n) (cadr n))
- (list n #f)))
- fields))
- (vector ',(string->symbol sname) ,@(map string->symbol field-names)))
-
- (define ,copy-name copy)
-
- ,@(map (let ((ctr 1))
- (lambda (n type read-only)
- (let ((val (if read-only
- `(define ,(symbol fsname "-" n)
- (lambda (arg) (arg ,ctr)))
- `(define ,(symbol fsname "-" n)
- (dilambda
- (lambda (arg) (arg ,ctr))
- (lambda (arg val) (set! (arg ,ctr) val)))))))
- (set! ctr (+ 1 ctr))
- val)))
- field-names field-types field-read-onlys))))
-
-
-;; ============================================================
-;; Structures
-
-(defstruct rect (x 0.0) (y 0.0) (width 0.0) (height 0.0))
-(defstruct point (x 0.0) (y 0.0))
-(defstruct stage (width 0) (height 0) (generations 0) (final-state #f))
diff --git a/scripts/utils.scm b/scripts/utils.scm
deleted file mode 100644
index 3348075..0000000
--- a/scripts/utils.scm
+++ /dev/null
@@ -1,8 +0,0 @@
-(define (is-point-inside-rect? point rect)
- (cond ((not (point? point)) #f)
- ((not (rect? rect)) #f)
- (else (and (>= (point-x point) (rect-x rect))
- (>= (point-y point) (rect-y rect))
- (<= (point-x point) (+ (rect-x rect) (rect-width rect)))
- (<= (point-y point) (+ (rect-y rect) (rect-height rect))))
- )))