Advertisement
Guest User

Untitled

a guest
Mar 12th, 2012
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 6.10 KB | None | 0 0
  1. #lang racket
  2. (require xml)
  3. (require xml/path)
  4. (require racket/cmdline)
  5. (require racket/string)
  6.  
  7. (require (planet dherman/json:4:=0))
  8. (require (planet lizorkin/sxml:2:1/sxml))
  9.  
  10. (define verbose-mode (make-parameter #f))
  11. (define input-file-name (make-parameter "input.dam"))
  12. (define image-files-base-path (make-parameter "./images/"))
  13. (define output-directory (make-parameter "./output/"))
  14.  
  15. (define (trace text)
  16.   (cond [(verbose-mode)
  17.          (display text)
  18.          (display "\n")]))
  19.  
  20. ;TODO: Перетасовать спрайты так, что бы они соответствовали атласам
  21. (define (export-levels)
  22.   (let* ([output-directory-path (normalize-path (output-directory))]        
  23.          [dame-sxml (sxml:document (input-file-name))]
  24.          ;[sprite-atlas-list ((sxpath "project/spriteEntries/group/@name/text()") dame-sxml)]
  25.          [sprite-global-list ((sxpath "project/spriteEntries/group") dame-sxml)]
  26.          [layer-group-list ((sxpath "project/layers/group") dame-sxml)])
  27.     ;Clean output directory
  28.     (define (clean-output-directory)
  29.       (if (not (directory-exists? output-directory-path))
  30.           (make-directory output-directory-path)
  31.           (void)))
  32.     ;Test group export flag
  33.     (define (export-layer-group? group)
  34.       (equal? "true" (car ((sxpath "@exports/text()") group))))
  35.     ;Export group list as separate files
  36.     (define (export-layer-group-list layer-group-list)
  37.       (for-each
  38.        (lambda (group)
  39.          (let* ([group-name (car ((sxpath "@name/text()") group))]
  40.                 [level-path (build-path output-directory-path (string-append group-name ".json"))]
  41.                 [level-output-port (open-output-file level-path #:mode 'text #:exists 'replace)])
  42.            (define (get-layer-hasheq layer)
  43.              ;Sprite layer generator
  44.              (define (get-spritelayer-hasheq sprite-layer)
  45.                (let* ([sprite-list ((sxpath "sprite") layer)]
  46.                       [sprite-index-list (map (lambda (sprite) (car ((sxpath "@idx/text()") sprite))) sprite-list)]
  47.                       [sprite-indeces (make-hash)]
  48.                       [global-to-local-indeces (make-hash)]
  49.                       [local-index 0])
  50.                  ;Compress sprite indeces
  51.                  (for-each
  52.                   (lambda (sprite-index)                    
  53.                     (hash-set! sprite-indeces sprite-index #t))
  54.                   sprite-index-list)
  55.                  
  56.                  ;Generate spriteList
  57.                  (hash-for-each sprite-indeces
  58.                                 (lambda (key value)
  59.                                   (set! local-index (+ 1 local-index))
  60.                                   (hash-set! global-to-local-indeces key local-index)))
  61.                  
  62.                  ;Generate sprite name list
  63.                  (define layer-sprite-name-list
  64.                    (hash-map sprite-indeces
  65.                              (lambda
  66.                                  (key value)
  67.                                (car ((sxpath (string-append "sprite[@idx=\"" key "\"]/@name/text()")) sprite-global-list)))))
  68.                  
  69.                  ;Generate places
  70.                  (define sprite-places (append*
  71.                                         (map
  72.                                          (lambda (sprite index)
  73.                                            (let ([local-index (hash-ref global-to-local-indeces index)]
  74.                                                  [x (string->number (car ((sxpath "@x/text()") sprite)))]
  75.                                                  [y (string->number (car ((sxpath "@y/text()") sprite)))])
  76.                                              (list local-index x y)))
  77.                                          sprite-list sprite-index-list)))
  78.                  
  79.                  
  80.                  (trace global-to-local-indeces)
  81.                  `#hasheq(
  82.                           (type . "sprites")
  83.                           (places . ,sprite-places)
  84.                           (sprites . ,layer-sprite-name-list))))
  85.              
  86.              (let* ([layer-type (car layer)])
  87.                (match layer-type
  88.                  ;Export sprite layer
  89.                  ['spritelayer (get-spritelayer-hasheq layer)]
  90.                  ;Export map layer
  91.                  ['maplayer `#hasheq(
  92.                                      (type . "tiles")
  93.                                      (width . ,(car ((sxpath "@width/text()") layer)))
  94.                                      (height . ,(car ((sxpath "@height/text()") layer)))
  95.                                      (image . ,(car ((sxpath "@name/text()") layer)))
  96.                                      (tileWidth . ,(string->number (car ((sxpath "@tileWidth/text()") layer))))
  97.                                      (tileHeight . ,(string->number (car ((sxpath "@tileHeight/text()") layer))))
  98.                                      (tiles . ,(map string->number (regexp-split #rx"," (string-join ((sxpath "row/text()") layer) ",")))))]
  99.                  ;Export shape layer
  100.                  ['shapelayer #hasheq((type . "shapes"))]
  101.                  ;Export path layer
  102.                  ['pathlayer #hasheq((type . "paths"))])))
  103.            
  104.            (write-json
  105.             `#hasheq((name . ,group-name)
  106.                      (layers . ,(map get-layer-hasheq ((sxpath "spritelayer|maplayer|shapelayer|pathlayer[@exports=\"true\"]") group))))
  107.             level-output-port)
  108.            (trace group-name)
  109.            (close-output-port level-output-port)))
  110.        layer-group-list))
  111.    
  112.     (clean-output-directory)
  113.     (export-layer-group-list (filter export-layer-group? layer-group-list))
  114.     (trace "DONE")))
  115.  
  116.  
  117. (command-line
  118.  #:program "export"
  119.  #:once-each
  120.  [("-p") image-base "Chose path to images"
  121.          (image-files-base-path image-base)]
  122.  [("-i") in-file "Chose input DAME file (default input.dam)"
  123.          (input-file-name in-file)]
  124.  [("-v" "--verbose") "Export with verbose messages"
  125.                      (verbose-mode #t)]
  126.  [("-o") out-dir ""
  127.          (output-directory out-dir)]
  128.  #:args () (void)
  129.  (export-levels))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement