diff options
Diffstat (limited to 'scripts/main.el')
-rw-r--r-- | scripts/main.el | 210 |
1 files changed, 209 insertions, 1 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) ) |