;;; ;;; Atlantis is a framework for creating multi-user dungeon worlds. ;;; This is the Common Lisp implementation. ;;; ;;; This is an ATL code-generating module to ease the world creation ;;; process for non-coders (and those too lazy to write more than ;;; necessary...). ;;; ;;; Licensed under the terms of the MIT license. ;;; author: Daniel Vedder ;;; date: 20/06/2015 ;;; (defun import-spreadsheet (spreadsheet atl-file) "Import and convert a spreadsheet (requires LibreOffice)" (let* ((ods-pathname (parse-namestring spreadsheet)) (csv-pathname (make-pathname :directory (pathname-directory ods-pathname) :name (pathname-name ods-pathname) :type "csv"))) ;; Convert the spreadsheet to csv (only works with clisp!) (ext:shell (format nil "libreoffice --headless --convert-to csv ~A~A~A" (namestring ods-pathname) " --outdir " (namestring (make-pathname :directory (pathname-directory ods-pathname))))) (csv-to-atl csv-pathname atl-file))) (defun csv-to-atl (csv-pathname atl-file &aux (atl-code "")) "Convert a csv file to ATL" (setf atl-code ";; This code has been automatically generated by the ;; Atlantis world creator.") (do* ((csv-file (load-text-file csv-pathname)) (line-nr 2 (1+ line-nr)) (object-type (read-from-string (first (split-string (first csv-file) #\,)))) (object-characteristics (split-string (second csv-file) #\,)) (line (nth line-nr csv-file) (nth line-nr csv-file)) (line-values (split-string line #\,) (split-string line #\,))) ((null line) NIL) ;; Start a new define-command (setf atl-code (format NIL "~A~&~%~A" atl-code (concatenate 'string "define-" (string-downcase (to-string object-type)) " " (to-string #\") (first line-values) (to-string #\")))) ;; Enter the value for each characteristic (dotimes (i (1- (length object-characteristics))) (setf atl-code (format NIL "~A~&~A" atl-code (concatenate 'string (to-string #\tab) (nth (1+ i) object-characteristics) " " (nth (1+ i) line-values)))))) ;; Write the generated code to file (with-open-file (atl atl-file :direction :output) (format atl "~A" atl-code))) (defun world-creator () "The UI for the functions in this module" (clear-screen) (format t "~&Welcome to the Atlantis world creator!") (format t "~&~%What do you want to do?") (case (choose-number-option '("Import a spreadsheet" "Nothing")) (0 (progn (format t "~&What OpenDocument spreadsheet do you want to import?") (input-string s) (format t "~&What ATL file do you want to export it to?") (input-string a) (import-spreadsheet s a) (if (y-or-n-p "Done. Create something else?") (world-creator) (start-menu)))) (1 (start-menu))))