retro-rpg/scripts/script-fu.scm

97 lines
2.8 KiB
Scheme

;; Utilities
(define (take count sequence)
(reverse
(let loop ((res '()) (rem sequence) (n count))
(if (or (null? rem) (= 0 n))
res
(loop (cons (car rem) res) (cdr rem) (- n 1))))))
(define (skip count sequence)
(let loop ((rem sequence) (n count))
(if (or (null? rem) (= 0 n))
rem
(loop (cdr rem) (- n 1)))))
(define (replace old new sequence)
(let ((n (length old)))
(let loop ((pre '())
(rem sequence))
(cond ((null? rem) (append (reverse pre) rem))
((equal? old (take n rem))
(append (reverse pre) new (skip n rem)))
(else (loop (cons (car rem) pre) (cdr rem)))))))
(define (string-replace old new string)
(list->string
(replace (string->list old)
(string->list new)
(string->list string))))
(define (foreach-image f)
(let* ((list-result (gimp-image-list))
(count (car list-result))
(ids (cadr list-result)))
(do ((i 0 (+ i 1)))
((>= i count))
(f (vector-ref ids i))))
(gimp-displays-flush))
(define (export-png image path)
(gimp-context-push)
(let* ((original-active-layer (car (gimp-image-get-active-drawable image)))
(temp-image (car (gimp-image-duplicate image)))
(merged-layer
(car (gimp-image-merge-visible-layers temp-image CLIP-TO-IMAGE))))
(file-png-save-defaults RUN-NONINTERACTIVE
temp-image merged-layer path path)
(gimp-image-delete temp-image)
(gimp-image-set-active-layer image original-active-layer))
(gimp-context-pop))
(define (active-image)
(vector-ref (cadr (gimp-image-list)) 0))
;; Cropping tree sprites
(define (crop-to-middle-sprite image)
(let* ((width (car (gimp-image-width image)))
(height (car (gimp-image-height image)))
(sprite-width (quotient width 3)))
(gimp-image-crop image sprite-width height sprite-width 0)
(gimp-displays-flush)))
(define (tree-sprite-export-path image)
(string-replace "originals/Cute_Fantasy/Trees" "sprites/trees"
(car (gimp-image-get-filename image))))
(define (export-tree-sprite image)
(export-png image (tree-sprite-export-path image)))
(define (crop-and-export-tree-sprite image)
(crop-to-middle-sprite image)
(export-tree-sprite image))
;; Exporting tileset
(define (xcf-basename image)
(string-replace ".xcf" "" (car (gimp-image-get-filename image))))
(define (export-tileset image frame-count)
(define (foreach-frame-layer f)
(let loop ((i 0))
(when (< i frame-count)
(let* ((name (number->string i))
(layer (car (gimp-image-get-layer-by-name image name))))
(f name layer))
(loop (+ i 1)))))
(let ((basename (xcf-basename image)))
(foreach-frame-layer
(lambda (name layer) (gimp-item-set-visible layer 0)))
(foreach-frame-layer
(lambda (name layer)
(gimp-item-set-visible layer 1)
(export-png image (string-append basename "-" name ".png"))
(gimp-item-set-visible layer 0))))
(gimp-displays-flush))