-
Notifications
You must be signed in to change notification settings - Fork 0
/
text-adventure.lisp
85 lines (69 loc) · 2.41 KB
/
text-adventure.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
; Define global variables here
; Note this variable's default value determines our starting location
(defparameter *location* 'living-room)
(defparameter *nodes*
'(
(living-room (you are in the living-room. A wizeard is snoring loudly on the couch.))
(garden (you are in a beautiful garden. there is a wall in front of you.))
(attic (you are in the attic. there is a giant welding torch in the corner.))))
(defparameter *edges*
'(
(living-room (garden west door) (attic upstairs ladder))
(garden (living-room east door))
(attic (living-room downstairs ladder))))
(defparameter *objects*
'(whiskey bucket frog chain))
(defparameter *object-locations*
'(
(whiskey living-room)
(bucket living-room)
(chain garden)
(frog garden)))
; User-defined functions here
(defun describe-location (location nodes)
(first (rest (assoc location nodes))))
(defun describe-path (edge)
`(there is a ,(caddr edge) going ,(cadr edge) from here.))
(defun describe-paths (location edges)
(apply #'append
(mapcar #'describe-path
(cdr (assoc location edges)))))
(defun objects-at (location objects object-locations)
(labels ((at-loc-p (obj)
(eq (cadr (assoc obj object-locations)) location)))
(remove-if-not #'at-loc-p objects)))
(defun describe-objects (location objects object-locations)
(labels ((describe-obj (obj)
`(you see a ,obj on the floor.)))
(apply #'append
(mapcar #' describe-obj
(objects-at location objects object-locations)))))
(defun look ()
(append
(describe-location *location* *nodes*)
(describe-paths *location* *edges*)
(describe-objects *location* *objects* *object-locations*)))
(defun walk (direction)
(let ((next (find direction
(cdr (assoc *location* *edges*))
:key #'cadr)))
(if next
(progn (setf *location* (car next))
(look))
'(you cannot go that way.))))
(defun pickup (object)
(cond
((member object (objects-at *location* *objects* *object-locations*))
(push (list object 'body) *object-locations*) `(you are now carrying the ,object))
(t '(you cannot get that.))))
(defun inventory ()
(cons 'items- (objects-at 'body *objects* *object-locations*)))
(defun game-repl ()
(let ((cmd (game-read)))
(unless (eq (car cmd) 'quit)
(game-print (game-eval cmd))
(game-repl))))
(defun game-read ()
(let ((cmd (read-from-string (concatenate 'string "(" (read-line) ")"))))
(flet ((quote-it (x) (list 'quote x)))
(cons (car cmd) (mapcar #'quote-it (cdr cmd))))))