(defpackage :if-lib\r
(:use :common-lisp :if-basic-lib :if-console)\r
(:export :container :room :item :clothing :capacity\r
- :food :switchable\r
+ :food :switchable :door :predoor\r
:n-to :ne-to :e-to :se-to :s-to :sw-to :w-to :nw-to :in-to :out-to\r
- :u-to :d-to :cant-go\r
+ :u-to :d-to :cant-go :destination\r
:*intscope* :*outscope* :*location* :*trace-light* :*vowels*\r
:*score* :*gamestate* :*turns* :*dark*\r
- :add-to-scope :add-to-outscope :found-in :seen-from\r
+ :add-to-scope :add-to-outscope :found-in :seen-from :with-keys\r
:compass :dir-n :dir-ne :dir-e :dir-se :dir-s\r
:dir-sw :dir-w :dir-nw :dir-u :dir-d :dir-in :dir-out\r
:darkness :lit :transparent :passable\r
(defparameter *player* nil\r
"Current player object (will be initialised later)")\r
\r
-(declare-predicate add-to-scope add-to-outscope found-in seen-from)\r
-\r
+(declare-predicate add-to-scope add-to-outscope found-in seen-from\r
+ with-keys)\r
\r
;;Library file names\r
(defvar *library-file-if* "if.fas")\r
\r
;;SECTION 2: Library-defined classes and objects\r
\r
-(ifclass container () (capacity integer) (has :container))\r
+(ifclass predoor ()) ;;Can potentially be locked... \r
+\r
+(ifclass container (predoor) (capacity integer) (has :container))\r
(ifclass supporter () (capacity integer) (has :supporter))\r
\r
(ifclass room () (description string)\r
(n-to object) (ne-to object) (e-to object) (se-to object)\r
(s-to object) (sw-to object) (w-to object) (nw-to object)\r
(u-to object) (d-to object) (in-to object) (out-to object)\r
- (cant-go string)\r
+ ;(cant-go string) <- doesn't provide by default\r
(has :light :enterable))\r
\r
(ifclass item () (description string) (article string)\r
(look (look self)))\r
(has :~light))\r
\r
+(ifclass door (predoor scenery) (destination object) \r
+ (has :door :closed :openable))\r
+\r
+\r
+\r
;;Compass directions\r
(object compass ())\r
(object dir-n () "north" (name "north" "n") compass (property 'n-to))\r
\r
(defun transparent (obj)\r
"Whether the object is transparent"\r
- (or (has obj :container :open) \r
+ (or (and (has obj :container) (hasnt obj :closed)) \r
(has obj :supporter)\r
(has obj :transparent)\r
(eql obj *player*)))\r
(seep1 actor obj)))\r
\r
(defun passable (obj)\r
- (or (has obj :container :open)\r
+ (or (and (has obj :container) (hasnt obj :closed))\r
(has obj :supporter)\r
(eql obj *player*)))\r
\r
(defun print-inside (obj stream)\r
"Return the string containing the status of contents of the object"\r
(when (has obj :container)\r
- (if (or (has obj :open) (has obj :transparent))\r
+ (if (or (hasnt obj :closed) (has obj :transparent))\r
(if (children obj)\r
(progn (princ " (containing " stream) \r
(princ (list-contents obj) stream) \r
\r
(defun default-glance (obj)\r
"Default initial description of object"\r
- (format t "[Default glance for ~a]~%" obj)\r
+ ;;(format t "[Default glance for ~a]~%" obj)\r
(sprint "~a~%" \r
(with-output-to-string (out)\r
(princ "There is " out) (princ (print-name obj) out) \r