]> git.jsancho.org Git - gacela.git/blob - gacela_mobs.lisp
62e6e6cf2668a68866831b030226c28a553c47c5
[gacela.git] / gacela_mobs.lisp
1 ;;; Gacela, a GNU Common Lisp extension for fast games development
2 ;;; Copyright (C) 2009 by Javier Sancho Fernandez <jsf at jsancho dot org>
3 ;;;
4 ;;; This program is free software: you can redistribute it and/or modify
5 ;;; it under the terms of the GNU General Public License as published by
6 ;;; the Free Software Foundation, either version 3 of the License, or
7 ;;; (at your option) any later version.
8 ;;;
9 ;;; This program is distributed in the hope that it will be useful,
10 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 ;;; GNU General Public License for more details.
13 ;;;
14 ;;; You should have received a copy of the GNU General Public License
15 ;;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17
18 ;;; World of Mob
19
20 ;(in-package :gacela)
21
22 (defmacro makemob (name variables &rest methods)
23   `(let ,variables
24      (defun ,name (&rest args &aux (option (car args)))
25        ,(mob-options methods))))
26
27 (defun mob-options (methods)
28   )
29
30 (defmacro defmob (name variables &key init logic render)
31   `(let ((make-name ',(intern (concatenate 'string "MAKE-" (string name)))))
32      (setf (symbol-function make-name)
33            (makemob ,variables :init ,init :logic ,logic :render ,render))
34      make-name))
35
36 ;(defmacro makemob (variables &key init logic render)
37 ;  `(lambda
38 ;     ,(if (null variables) () (cons '&key variables))
39 ;     (mob-structure ,variables ,init ,logic ,render)))
40
41 (defmacro mob-structure (variables init logic render)
42   `(list
43     :init (lambda () ,init)
44     :logic (lambda () ,logic)
45     :render (lambda () ,render)
46     :context (lambda ()
47                ,(if variables
48                     `(mapcar #'list
49                              ',(mapcar #'car+ variables)
50                              (multiple-value-list
51                               (values-list ,(cons 'list (mapcar #'car+ variables)))))
52                   nil))))
53
54 (defun init-mob (mob)
55   (funcall (getf mob :init)))
56
57 (defun logic-mob (mob)
58   (funcall (getf mob :logic)))
59
60 (defun render-mob (mob)
61   (funcall (getf mob :render)))
62
63 (let (running-mobs mobs-to-add mobs-to-quit)
64   (defun mob-on (mob)
65     (push mob mobs-to-add))
66
67   (defun mob-off (mob)
68     (push mob mobs-to-quit)))