various bugfixes + updated example
[lifp.git] / iflib.lisp
index 84b7b2b4de0ac8c4a9dbef7dd687271395cf3d72..0154b718e83198fb3af6b7c2042da93f41f87c8e 100644 (file)
 (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
@@ -91,7 +91,9 @@
 \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
          (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