windstille.scm 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. (use-modules (oop goops))
  2. (load "helper.scm")
  3. (display "Windstille Startup Script\n")
  4. (define *game* 'windstille)
  5. (define *tile-size* 128)
  6. (define *windstille-datadir* "../../data/")
  7. (define *tileset* (tileset-create *tile-size*))
  8. (game-load-resources (string-append *windstille-datadir* "tiles.xml"))
  9. (define-class <windstille-level> ()
  10. (background #:init-value #f
  11. #:init-keyword #:background
  12. #:accessor wslv:background)
  13. (foreground #:init-value #f
  14. #:init-keyword #:foreground
  15. #:accessor wslv:foreground)
  16. (objects #:init-value #f
  17. #:init-keyword #:objects
  18. #:accessor wslv:objects))
  19. (define (windstille:load-tiles filename)
  20. (with-input-from-file filename
  21. (lambda ()
  22. (let* ((data (read))
  23. (ident (car data)))
  24. (cond ((equal? ident 'windstille-tiles)
  25. (for-each
  26. (lambda (el)
  27. (cond ((equal? (car el) 'tile)
  28. ;;(display (cdr el))(newline)
  29. (tileset-add-tile
  30. *tileset*
  31. (list (list 'id
  32. (get-value-from-tree '(id _) (cdr el) -1))
  33. (list 'image
  34. (or (get-value-from-tree '(image _) (cdr el) #f)
  35. (get-value-from-tree '(images _) (cdr el) "notile.png"))))
  36. ))))
  37. (cdr data)))
  38. (else
  39. (error "Not a windstille tileset")))))))
  40. (windstille:load-tiles (string-append *windstille-datadir* "tiles.scm"))
  41. (define (windstille:new-map width height)
  42. (display "Creating new level...\n")
  43. (let ((levelmap (windstille:create-levelmap width height)))
  44. (editor-map-activate levelmap)
  45. (add-buffer levelmap)))
  46. (define (windstille:create-levelmap width height)
  47. (let* ((m (editor-map-create))
  48. (foreground (editor-tilemap-create *tileset* width height *tile-size*))
  49. (background (editor-tilemap-create *tileset* width height *tile-size*))
  50. (objmap (editor-objmap-create))
  51. (level (make <windstille-level>
  52. #:objects objmap
  53. #:foreground foreground
  54. #:background background)))
  55. (editor-map-add-layer m background)
  56. (editor-map-add-layer m foreground)
  57. (editor-map-add-layer m objmap)
  58. (editor-map-set-metadata m level)
  59. (windstille:activate level)
  60. m))
  61. (define (windstille:create-levelmap-from-file filename)
  62. (let ((data (with-input-from-file filename
  63. (lambda () (cdr (read))))))
  64. (let ((width (get-value-from-tree '(properties width _) data
  65. (get-value-from-tree '(tilemap width _) data 20)))
  66. (height (get-value-from-tree '(properties height _) data
  67. (get-value-from-tree '(tilemap height _) data 15)))
  68. (foreground (get-value-from-tree '(tilemap data) data '()))
  69. (background (get-value-from-tree '(background-tilemap data) data '()))
  70. (objects (get-value-from-tree '(objects) data '())))
  71. ;; load level file and extract tiledata and w/h
  72. (let* ((m (editor-map-create))
  73. (tilemap (editor-tilemap-create *tileset* width height *tile-size*))
  74. (bg-tilemap (editor-tilemap-create *tileset* width height *tile-size*))
  75. (objmap (editor-objmap-create))
  76. (level (make <windstille-level>
  77. #:objects objmap
  78. #:foreground tilemap
  79. #:background bg-tilemap)))
  80. ;; FIXME: Replace this with windstille objects handling
  81. (for-each (lambda (el)
  82. (let ((x (car (get-value-from-tree '(pos) (cdr el) 0)))
  83. (y (cadr (get-value-from-tree '(pos) (cdr el) 0))))
  84. (case (car el)
  85. ((mriceblock)
  86. (objectmap-add-object objmap "sprites/mriceblock" x y '(mriceblock)))
  87. ((mrbomb)
  88. (objectmap-add-object objmap "sprites/mrbomb" x y '(mrbomb)))
  89. ((spawnpoint)
  90. (objectmap-add-object objmap "sprites/spawnpoint" x y '(outpost)))
  91. ((outpost)
  92. (objectmap-add-object objmap "sprites/outpost" x y '(spawnpoint)))
  93. )))
  94. objects)
  95. ;; set data to the tilemap
  96. (editor-tilemap-set-data tilemap foreground)
  97. (editor-tilemap-set-data bg-tilemap background)
  98. (editor-map-add-layer m bg-tilemap)
  99. (editor-map-add-layer m tilemap)
  100. (editor-map-add-layer m objmap)
  101. (editor-map-set-filename m filename)
  102. (editor-map-set-metadata m level)
  103. (windstille:activate level)
  104. m))))
  105. (define-method (windstille:activate (level <windstille-level>))
  106. (tilemap-paint-tool-set-tilemap (wslv:foreground level))
  107. (set! *tilemap* (wslv:foreground level))
  108. (editor-tilemap-set-current (wslv:foreground level))
  109. (tileset-set-current *tileset*)
  110. (tile-selector-set-tileset *tileselector* *tileset*))
  111. ;; EOF ;;