fixed infinite recursion on clerk main loop
[mudsync.git] / worlds / bricabrac.scm
index fe158ff352d14f3b88831618adcd584b7ae83278..e0688d014ce18018613c29a71322e3131ba01ecb 100644 (file)
@@ -216,6 +216,13 @@ character.\n")))
       #:who-summoned (message-from message)))
 
 
+(define prefect-quotes
+  '("I'm a frood who really knows where my towel is!"
+    "On no account allow a Vogon to read poetry at you."
+    "Time is an illusion, lunchtime doubly so!"
+    "How can you have money if none of you produces anything?"
+    "On no account allow Arthur to request tea on this ship."))
+
 (define lobby
   (lol
    ('room:lobby
@@ -251,10 +258,6 @@ though the conversation may be a bit one sided."
                 "Chris Webber"  ; heh, did you rtfc?  or was it so obvious?
                 "hotel proprietor" "proprietor")
     #:catchphrases hotel-owner-grumps)
-   ;; NPC: desk clerk (comes when you ring the s)
-   ;;   impatient teenager, only stays around for a few minutes
-   ;;   complaining, then leaves.
-   
    ;; Object: Sign
    ('thing:lobby:sign
     <readable> 'room:lobby
@@ -361,7 +364,7 @@ if this room is intended for children or child-like adults."
    ('thing:cuddles-plushie
     <thing> 'room:playroom
     #:name "a cuddles plushie"
-    #:goes-by '("plushie" "cuddles plushie")
+    #:goes-by '("plushie" "cuddles plushie" "cuddles")
     #:takeable #t
     #:desc "  A warm and fuzzy cuddles plushie!  It's a cuddlefish!")))
 
@@ -458,6 +461,13 @@ seat in the room, though."
     #:sit-phrase "hop on"
     #:sit-phrase-third-person "hops onto"
     #:sit-name "the bar stool")
+   ('npc:ford-prefect
+    <chatty-npc> 'room:smoking-parlor
+    #:name "Ford Prefect"
+    #:desc "Just some guy, you know?"
+    #:goes-by '("Ford Prefect" "ford prefect"
+                "frood" "prefect" "ford")
+    #:catchphrases prefect-quotes)
 
    ;; TODO: Cigar dispenser
 
@@ -473,7 +483,8 @@ seat in the room, though."
    (direct-command "talk" 'cmd-chat)
    (direct-command "chat" 'cmd-chat)
    (direct-command "ask" 'cmd-ask-incomplete)
-   (prep-direct-command "ask" 'cmd-ask-about)))
+   (prep-direct-command "ask" 'cmd-ask-about)
+   (direct-command "dismiss" 'cmd-dismiss)))
 (define clerk-commands*
   (append clerk-commands thing-commands*))
 
@@ -483,6 +494,7 @@ seat in the room, though."
    (cmd-chat (wrap-apply clerk-cmd-chat))
    (cmd-ask-incomplete (wrap-apply clerk-cmd-ask-incomplete))
    (cmd-ask-about (wrap-apply clerk-cmd-ask))
+   (cmd-dismiss (wrap-apply clerk-cmd-dismiss))
    (update-loop (wrap-apply clerk-act-update-loop))
    (be-summoned (wrap-apply clerk-act-be-summoned))))
 (define clerk-actions* (append clerk-actions
@@ -606,6 +618,28 @@ feel free to ask me.  For example, 'ask clerk about changing name'.
 You can ask me about the following:
 " clerk-knows-about ".\"\n")))))
 
+(define-mhandler (clerk-cmd-dismiss clerk message)
+  (define player-name
+    (message-ref
+     (<-wait clerk (message-from message) 'get-name)
+     'val))
+  (match (slot-ref clerk 'state)
+    ('on-duty
+     (<- clerk (gameobj-loc clerk) 'tell-room
+         #:text
+         (format #f "\"Thanks ~a!\" says the clerk. \"I have somewhere I need to be.\"
+The clerk leaves the room in a hurry.\n"
+                 player-name)
+         #:exclude (actor-id clerk))
+     (gameobj-set-loc! clerk (dyn-ref clerk 'room:break-room))
+     (slot-set! clerk 'state 'slacking)
+     (<- clerk (gameobj-loc clerk) 'tell-room
+         #:text clerk-return-to-slacking-text
+         #:exclude (actor-id clerk)))
+    ('slacking
+     (<- clerk (message-from message) 'tell
+         #:text "The clerk sternly asks you to not be so dismissive.\n"))))
+
 (define clerk-slacking-texts
   '("The clerk takes a long drag on her cigarette.\n"
     "The clerk scrolls through text messages on her phone.\n"
@@ -634,39 +668,36 @@ attend to.\n")
 (define-mhandler (clerk-act-update-loop clerk message)
   (define (tell-room text)
     (<- clerk (gameobj-loc clerk) 'tell-room
-        #:text text))
-  (define (loop return)
-    (define (stop-if-destructed)
-      (if (slot-ref clerk 'destructed)
-          (return #f)))
-    (match (slot-ref clerk 'state)
-      ('slacking
-       (tell-room (random-choice clerk-slacking-texts))
-       (8sleep (+ (random 10) 10))
-       (stop-if-destructed)
-       (loop return))
-      ('on-duty
-       (if (> (slot-ref clerk 'patience) 0)
-           ;; Keep working but lose patience gradually
-           (begin
-             (tell-room (random-choice clerk-working-impatience-texts))
-             (slot-set! clerk 'patience (- (slot-ref clerk 'patience)
-                                           (+ (random 2) 1)))
-             (8sleep (+ (random 25) 20))
-             (stop-if-destructed)
-             (loop return))
-           ;; Back to slacking
-           (begin
-             (tell-room clerk-slack-excuse-text)
-             ;; back bto the break room
-             (gameobj-set-loc! clerk (pk 'break-room (dyn-ref clerk 'room:break-room)))
-             (tell-room clerk-return-to-slacking-text)
-             ;; annnnnd back to slacking
-             (slot-set! clerk 'state 'slacking)
-             (8sleep (+ (random 30) 15))
-             (stop-if-destructed)
-             (loop return))))))
-  (call/ec loop))
+        #:text text
+        #:exclude (actor-id clerk)))
+  (define (loop-if-not-destructed)
+    (if (not (slot-ref clerk 'destructed))
+        (<- clerk (actor-id clerk) 'update-loop)))
+  (match (slot-ref clerk 'state)
+    ('slacking
+     (tell-room (random-choice clerk-slacking-texts))
+     (8sleep (+ (random 10) 10))
+     (loop-if-not-destructed))
+    ('on-duty
+     (if (> (slot-ref clerk 'patience) 0)
+         ;; Keep working but lose patience gradually
+         (begin
+           (tell-room (random-choice clerk-working-impatience-texts))
+           (slot-set! clerk 'patience (- (slot-ref clerk 'patience)
+                                         (+ (random 2) 1)))
+           (8sleep (+ (random 25) 20))
+           (loop-if-not-destructed))
+         ;; Back to slacking
+         (begin
+           (tell-room clerk-slack-excuse-text)
+           ;; back bto the break room
+           (gameobj-set-loc! clerk (pk 'break-room (dyn-ref clerk 'room:break-room)))
+           (tell-room clerk-return-to-slacking-text)
+           ;; annnnnd back to slacking
+           (slot-set! clerk 'state 'slacking)
+           (8sleep (+ (random 30) 15))
+           (loop-if-not-destructed))))))
+
 
 (define break-room
   (lol