;;;; thankyoumario.lisp (defpackage #:thankyoumario (:use #:cl #:skippy #:nesfont)) (in-package #:thankyoumario) (defparameter *resource-base* (probe-file (merge-pathnames #p"../resources/" (or *compile-file-truename* *load-truename* *default-pathname-defaults*)))) (defun resource-file (file) (merge-pathnames file *resource-base*)) (defparameter *base-image* (load-data-stream (resource-file "base.gif"))) (defparameter *big-base-image* (load-data-stream (resource-file "base512.gif"))) (defparameter *font* (load-nesfont (resource-file "8x8.tym"))) (defparameter *big-font* (load-nesfont (resource-file "16x16.tym"))) (defstruct (point (:conc-name %p) (:constructor point (x y))) x y) (defparameter *name-point* (point 24 8)) (defparameter *title-point* (point 0 72)) (defparameter *lines-point* (point 40 104)) (defparameter *scale* 1) (defun px (point) (* (%px point) *scale*)) (defun py (point) (* (%py point) *scale*)) (defun add-image-at (frame ds point) (setf (left-position frame) (px point) (top-position frame) (py point)) (add-image frame ds)) (defun add-centered-at (frame ds y) (let ((x (truncate (- (width ds) (width frame)) 2))) (add-image-at frame ds (point x y)))) (defun composite-at (source target point) (composite source target :dx (px point) :dy (py point))) (defun draw-line-at (string target point) (let ((image (string-image string *font*))) (composite-at image target point))) (defun dumb-clone (image) (make-image :height (height image) :width (width image) :image-data (copy-seq (image-data image)))) (defun first-image (ds) (aref (images ds) 0)) (defun draw-name (name ds) (let ((padded-name (make-string 12 :initial-element #\Space))) (replace padded-name name) (draw-line-at padded-name (first-image ds) *name-point*))) (defun fresh-base () (make-data-stream :initial-images (list (dumb-clone (first-image *base-image*))) :width (width *base-image*) :height (height *base-image*) :color-table (color-table *base-image*))) (defun make-mario-image (&key (name "MARIO") (title "THANK YOU MARIO!") (lines '("BUT OUR PRINCESS IS IN" "ANOTHER CASTLE!")) output) (let ((ds (fresh-base)) (*default-delay-time* 1)) (draw-name name ds) (add-centered-at (string-image title *font*) ds (py *title-point*)) (add-delay 150 ds) (loop for (a b c d) on lines by #'cdddr for lines = (remove-if #'null (list a b c d)) for first = t then nil unless first do (add-image-at (blank-image 22 7 *font*) ds *lines-point*) (add-delay 25 ds) do (add-image-at (lines-image lines *font*) ds *lines-point*) (add-delay 500 ds)) (add-delay 1000 ds) (setf (loopingp ds) t) (output-data-stream ds output))) (defun make-doubled-mario-image (&rest args &key name title lines output) (declare (ignorable name title lines output)) (let ((*scale* 2) (*font* *big-font*) (*base-image* *big-base-image*)) (apply #'make-mario-image args)))