Invaderflut added by C-Keen on Thu Dec 29 15:55:04 2016

(use tcp srfi-1)

(define block-rows 5)
(define block-cols 6)
(define solid-black "000000")

(define (expand-row x y r color)
  (let ((expanded (concatenate (map (lambda (x) (list-tabulate block-size (lambda (_) x))) r))))
    (let loop ((x x)
               (y y)
               (e expanded)
               (res '()))
      (if (null? e)
          (reverse res)
          (loop (add1 x) y
                (cdr e)
                (cons (sprintf "PX ~a ~a ~a~%" x y (if (zero? (car e)) solid-black color)) res))))))

(define (expand-block x y b color)
  (let ((expanded (concatenate (map (lambda (r) (list-tabulate block-size (lambda (_) r))) b))))
    (let loop ((x x)
               (y y)
               (e expanded)
               (res '()))
      (if (null? e)
          (reverse (concatenate res))
          (loop x (add1 y)
                (cdr e)
                (cons (expand-row x y (car e) color) res))))))

(define (mirror grid)
  (map (lambda (lst)
         (append lst (cdr (reverse lst)))) grid))

(define (random-blocks)
  (mirror (list-tabulate block-rows
                         (lambda _
                           (list-tabulate (/ block-cols 2)
                                          (lambda _ (random 2)))))))

(define host (second (argv)))
(define port (string->number  (third (argv))))
(define block-size (string->number (fourth (argv))))

(define (random-color)
  (define (prefix n) (string-append (if (< n 16) "0" "") (number->string n 16)))
  (string-append (prefix (random 256)) (prefix (random 256)) (prefix (random 256))))

(receive (i o) (tcp-connect host port)
         (fprintf (current-error-port) "Asking for size... ")
         (fprintf o "SIZE~%~!")
         (let* ((size (string-split (read-line i)))
                (x (string->number (second size)))
                (y (string->number (third size))))
           (fprintf (current-error-port) "Size: ~a x ~a~%" x y)
           (let l ()
             (for-each
              (lambda (l)
                (display l o))
              (expand-block (random x) (random y) (random-blocks) (random-color)))
             (l))))