]> git.jsancho.org Git - gacela.git/blob - src/game.scm
More declarative way of making games
[gacela.git] / src / game.scm
1 ;;; Gacela, a GNU Guile extension for fast games development
2 ;;; Copyright (C) 2014 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 (define-module (gacela game)
19   #:use-module (gacela engine)
20   #:use-module (ice-9 vlist)
21   #:use-module (srfi srfi-1)
22   #:use-module (srfi srfi-9)
23   #:use-module (srfi srfi-9 gnu))
24
25
26 ;;; Working with entities
27
28 (define-record-type entity-type
29   (make-entity-record id components)
30   entity?
31   (id entity-id)
32   (game entity-game set-entity-game!)
33   (components entity-components set-entity-components!))
34
35 (set-record-type-printer! entity
36   (lambda (record port)
37     (format port "#<[entity ~a] ~a>"
38             (entity-id record)
39             (entity-components record))))
40
41 (define (entity . components)
42   (make-entity-record
43    (gensym)
44    #f
45    components))
46
47 (export entity
48         entity?
49         entity-id)
50
51
52 ;;; Game Definition
53
54 (define-record-type game-type
55   (make-game-record name entities)
56   game?
57   (name game-name set-game-name!)
58   (entities game-entities set-game-entities!))
59
60 (set-record-type-printer! game
61   (lambda (record port)
62     (format port "#<[Game: ~a] ~a>"
63             (game-name record)
64             (map
65              (lambda (id)
66                (cdr (vhash-assoc id (game-entities record))))
67              (vhash-fold
68               (lambda (key value result)
69                 (lset-union eqv? (list key) result))
70               '()
71               (game-entities record))))))
72
73 (define (game name . entities)
74   (make-game-record
75    name
76    (alist->vhash
77     (map (lambda (e) (cons (entity-id e) e))
78          entities))))
79
80 (export game
81         game?)
82
83
84 ;;; Working with games
85
86 (define (add-entity game entity)
87   #f)