   {                                                         ``              `   `    ``               ÀÀ     ÀÆ  ` ```_         Ò  ",  ""  ""  "          w pfv po gffgVfgeegff     w  f& b'f&gVfgeegff                                                                                                                                                                                                                                                                                                                                                                                                                                        Å ÀÌÅ ÀÅÌ  Ì     pfv pFv pdt pfv pfv pVv peu pfv                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 pfv pFv pdt  g  W  g  p   p        ww pff gDfpffdpffwpUv pfu	>   	                                  À?                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       ÀÀ                           pwwwwww                                                                                                             gVfdfeftw                                                                                ÀÆ                          pfVFfVfFfew                                                                               `                          gdffdfeftw                                                                               ```                          gdvwwwww                                                                                                             gF                                                                                                                   gf                                                                                                                   WV                                                                                                                   ge                                                                                                                   gf                                                                                                                   gf                                                                                                                   GF                                                                                                                   gd                                                                                                                   gf                                                                                                                   gf                                                                                                                   WV                                                                                                                   ge ÀÀ                                                                                                                gf                                                                                                                  gf ÀÆ                                                                                                                GF `                                                                                                               gd```                                                 ``                                                            gf                                                                                                                   gf                                                                                                                   WV                                                                                                                   ge                                                                                                                   gf                                                                                                                   gf                                                                                                                   GF                                                                                                                  gd                                                                ``                                                gf                                                                                                                  pffv                                                                                                                  pVVv                                                                                               `                  pfev                                                                                               `                  pffv                                                                                                `                 ÷ö                                                                                              `                  gf                                                                                                                pw                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  `                                         ÀÀ                                                                        `                               Å                                                                                    `                            ÀÌÅ          ÀÆ                                                                       `                             ÀÅÌ          `                                                                                                     Ì         ```                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ``                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  `                                                                                                                     `                                                                                                                      `                                                                                                                  `                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     `                                                                                                                     `                                                                                                                      `                                                                                                                  `                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         `                                                                                                                     `                                                                                                                      `                                                                                                                  `                                                                                                                                                                                       - ;; title:   Adam's Fennel
;; author:  Michele <micampe@me.com>
;; version: 0.1
;; script:  fennel
;; strict:  true

(var t 0)

(local HEAD 257) ;; head
(local DEAD 258) ;; head
(local BODY 273) ;; body
(local TAIL 289) ;; tail
(local CORN 290) ;; corner
(local FENL 272) ;; fennel

(local width (/ 240 8))
(local height (/ 136 8))

(var speed 12)
(var alive? true)
(var paused? false)
(var fennel {})
(var flowers 0)
(local state {:dx 1 :dy 0 :dir 1})

(local head {:x (// width 2)
             :y (// height 2)
             :dir 1})
(local snake [head
              {:x (- head.x 1)
               :y head.y
               :dir 1}
              {:x (- head.x 2)
               :y head.y
               :dir 1}])

(for [_ 1 11]
  (mset (math.random (- width 1))
        (math.random (- height 1))
        (math.random 1 3)))

(fn inside? [a b]
  "test if a is inside any of the elments of the list b"
  (accumulate [inside false
               _ c (ipairs b) &until inside]
    (or inside (and (> a.x (- c.x 1))
                    (< a.x (+ c.x 1))
                    (> a.y (- c.y 1))
                    (< a.y (+ c.y 1))))))

(fn draw-spr [id x y ?dir ?flip]
  (let [x-off (case [?dir ?flip]
                [3 2] 1
                [1 2] -1
                [0 1] -1
                [2 1] 1
                _ 0)
        y-off (case [?dir ?flip]
                [3 2] 1
                [1 2] -1
                [0 1] 1
                [2 1] -1
                _ 0)]
    (spr id
         (+ 0 (* x 8) x-off)
         (+ 0 (* y 8) y-off)
         0 1 ?flip ?dir)))

(fn new-fennel []
  (let [fennel {:x (- (math.random width) 1)
                :y (- (math.random height) 1)}]
    (if (not (inside? fennel snake))
        fennel
        (new-fennel))))
(set fennel (new-fennel))

(fn draw-grid [color]
  (for [x 0 width]
    (line (+ 0 (* x 8)) 0
          (+ 0 (* x 8)) (+ 0 (* height 8))
          color))
  (for [y 0 height]
    (line 0 (+ 0 (* y 8))
          (+ 0 (* width 8)) (+ 0 (* y 8))
          color)))

(fn _G.TIC []
  ;; inputs
  (when (keyp 18)
    (reset))
  (when (keyp 16)
    (set paused? (not paused?)))

  (when (= 0 state.dy)
    (when (btnp 0)
      (do (set state.dy -1)
          (set state.dx 0)
          (set state.dir 0)))
    (when (btnp 1)
      (do (set state.dy 1)
          (set state.dx 0)
          (set state.dir 2))))
  (when (= 0 state.dx)
    (when (btnp 2)
      (do (set state.dy 0)
          (set state.dx -1)
          (set state.dir 3)))
    (when (btnp 3)
      (do (set state.dy 0)
          (set state.dx 1)
          (set state.dir 1))))

  ;; update
  (when (and alive? (not paused?) (= 0 (% t speed)))
    (let [[head] snake
          ate (inside? fennel [head])
          new-head {:x (+ head.x state.dx)
                    :y (+ head.y state.dy)
                    :dir state.dir}
          on-grass? (and (<= 0 new-head.x)
                     (< new-head.x width)
                     (<= 0 new-head.y)
                     (< new-head.y height))
          self? (inside? new-head snake)]
      (set alive? (and on-grass? (not self?)))
      (when alive?
        (table.insert snake 1 new-head)
        (if (fget (mget new-head.x new-head.y) 1)
            (set flowers (+ flowers 1)))
        (if ate
            (do
              (set fennel (new-fennel))
              (when (= 0 (% (- (length snake) 2) 4))
                (set speed (- speed 1))))
            (table.remove snake)))))

  ;; draw
  (cls 0)

  (map 0 0 240 136)
  (draw-grid 0)
  (rectb 0 0 240 136 (if alive? 1 2))

  (draw-spr FENL fennel.x fennel.y)

  (each [i v (ipairs snake)]
    (let [prev (. snake (- i 1))]
      (if (= i 1)
          (if alive?
              (draw-spr HEAD v.x v.y v.dir)
              (draw-spr DEAD v.x v.y v.dir))
          (= i (length snake))
          (draw-spr TAIL v.x v.y (if (= v.dir prev.dir)
                                     v.dir
                                     prev.dir))
          (if (= v.dir prev.dir)
              (draw-spr BODY v.x v.y v.dir)
              (draw-spr CORN v.x v.y v.dir (case [v.dir prev.dir]
                                             [3 2] 2
                                             [0 3] 1
                                             [2 1] 1
                                             [1 0] 2
                                             _ 0))))))

  (when paused?
    (print "PAUSED" 104 48 12))

  (when (not alive?)
    (print (.. "You ate " (- (length snake) 3) " fennels") 70 40 12)
    (when (> flowers 0)
      (print (.. "and smelled " flowers " flowers") 60 48 12))
    (print "Press R to try again" 64 64 12))

  (set t (+ t 1)))
