17 - Goblin racing toy.
joneworlds@mailbox.org

I borrowed  Pete's truck yesterday. I  had to shoo
away  a couple  of  gnomes sleeping  in the  front
seat, and then I go for  a grocery run down to the
Save-Mor. When I  get back, I swing  by Leanne and
her mom's unit to drop  off some food and naloxone
and stuff. Leanne is a super smart kid, and I wish
she  were  in  real  school. She  actually  has  a
working computer in their place, a real one with a
keyboard, and she's really  good with it from what
I can tell.  She knows I  go on the inter net some
times to post  things like this, and  so she gives
me this program she made to share with you all out
there. We  didn't have the right  cable to connect
my phone, so she had to write it out onto a couple
of sheets of notebook paper, and later I tapped it
all back into my phone.

And so here is her toy she made. I hope I typed it
all in right; some of  the pencil got smudged when
page 2 soaked up some  gnome piss from the seat of
Pete's truck  on the way  home.  Oh yeah,  and she
told me  to tell  you that it  runs in  "e-max". I
think that's what she said.

-

(defun lg-goblin-racing ()
  "racing"
  (interactive)
  (defun lg-goblin-racing-redraw ()
    (interactive)
    (let ((buffer-read-only nil))
      (erase-buffer)
      (dotimes (i (length racers))
        (if (= winner i)
            (insert "  winner  ")
          (insert "          "))
        (insert "|")
        (let ((place (plist-get (nth i racers) :place)))
          (dotimes (j (- length place))  (insert "."))
          (insert (plist-get (nth i racers) :symbol))
          (dotimes (j (- place 1)) (insert "."))
          (newline)))
      (insert "keys: r ... q")))
  (defun lg-goblin-run-race ()
    (interactive)
    (let ((out nil))
      (while (not out)
        (dotimes (i (length racers))
          (let ((racer (nth i racers)))
            (when (>= (random 10) 6)
              (plist-put racer :speed (+ 1 (random 4))))
            (when (= 0 (mod counter (plist-get racer :speed)))
              (plist-put racer :place (+ 1 (plist-get racer :place))))
            (when (= (plist-get racer :place) length)
              (setq winner i)
              (setq out t))))
        (setq counter (+ counter 1))
        (lg-goblin-racing-redraw)
        (when (not (sit-for 0.1)) (setq out t)))))
  (defun lg-goblin-racing-reset ()
    (set (make-local-variable 'winner) -1)
    (set (make-local-variable 'length) 40)
    (set (make-local-variable 'racers)
         (list
          (list :symbol 128127 :speed 2
                :place 1)
          (list :symbol 128127 :speed 2
                :place 1)
          (list :symbol 128127 :speed 2
                :place 1)
          (list :symbol 128127 :speed 2
                :place 1)))                    
    (set (make-local-variable 'counter ) 1)
    (lg-goblin-racing-redraw))    
  (define-derived-mode lg-goblin-racing-mode
    special-mode "lg-goblin-racing"
    "Special mode for racing toy."
    (setq cursor-type nil)    
    (lg-goblin-racing-reset))
  (setq lg-goblin-racing-mode-map
        (let ((map (make-sparse-keymap)))
          (define-key map "r"
            (lambda() (interactive)
              (lg-goblin-racing-reset)
              (lg-goblin-run-race)))
          map))
  (switch-to-buffer "*lg-goblin-racing*")
  (lg-goblin-racing-mode))

-