X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;ds=sidebyside;f=worlds%2Fbricabrac.scm;h=372515ede66d206292df8445bd660df71dd6c70d;hb=009fc4606e1a141fd182a38718b9954ecfdd62a5;hp=b2607be19a23b0fbb009d311a8223a61cd237488;hpb=126d9c593cc4c26082c972741ff69d3b147b7fcd;p=mudsync.git diff --git a/worlds/bricabrac.scm b/worlds/bricabrac.scm index b2607be..372515e 100644 --- a/worlds/bricabrac.scm +++ b/worlds/bricabrac.scm @@ -200,20 +200,44 @@ character.\n"))) (simple-dispatcher summoning-bell-actions*))) (define-mhandler (summoning-bell-cmd-ring bell message) + ;; Call back to actor who invoked this message handler + ;; and find out their name. We'll call *their* get-name message + ;; handler... meanwhile, this procedure suspends until we get + ;; their response. (define who-rang (message-ref (<-wait bell (message-from message) 'get-name) 'val)) + ;; Now we'll invoke the "tell" message handler on the player + ;; who rang us, displaying this text on their screen. + ;; This one just uses <- instead of <-wait, since we don't + ;; care when it's delivered; we're not following up on it. (<- bell (message-from message) 'tell #:text "*ring ring!* You ring the bell!\n") + ;; We also want everyone else in the room to "hear" the bell, + ;; but they get a different message since they aren't the ones + ;; ringing it. Notice here's where we make use of the invoker's + ;; name as extracted and assigned to the who-rang variable. + ;; Notice how we send this message to our "location", which + ;; forwards it to the rest of the occupants in the room. (<- bell (gameobj-loc bell) 'tell-room #:text (format #f "*ring ring!* ~a rings the bell!\n" who-rang) #:exclude (message-from message)) + ;; Now we perform the primary task of the bell, which is to summon + ;; the "clerk" character to the room. (This is configurable, + ;; so we dynamically look up their address.) + (<- bell (dyn-ref bell (slot-ref bell 'summons)) 'be-summoned + #:who-summoned (message-from message))) - (<- bell (dyn-ref bell (slot-ref bell 'summons)) 'be-summoned)) +(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 @@ -250,10 +274,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 'room:lobby @@ -333,7 +353,8 @@ room\", while a door to the west is labeled \"playroom\"." #:name "a statue" #:desc " The statue is of a serious-looking bearded man with long, flowing hair. The inscription says \"St. Ignucius\". - It has a large physical halo. It doesn't look like it would be hard to remove." + It has a large physical halo. Removing it is tempting, but it looks pretty +well fastened." #:goes-by '("statue" "st ignucius" "st. ignucius")))) @@ -355,7 +376,13 @@ if this room is intended for children or child-like adults." 'room:playroom #:name "cubey" #:takeable #t - #:desc " It's a little foam cube with googly eyes on it. So cute!"))) + #:desc " It's a little foam cube with googly eyes on it. So cute!") + ('thing:cuddles-plushie + 'room:playroom + #:name "a cuddles plushie" + #:goes-by '("plushie" "cuddles plushie" "cuddles") + #:takeable #t + #:desc " A warm and fuzzy cuddles plushie! It's a cuddlefish!"))) @@ -450,6 +477,13 @@ seat in the room, though." #:sit-phrase "hop on" #:sit-phrase-third-person "hops onto" #:sit-name "the bar stool") + ('npc:ford-prefect + '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 @@ -465,7 +499,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*)) @@ -475,6 +510,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 @@ -572,10 +608,10 @@ with tuition at where it is...")) (<- clerk (message-from message) 'tell #:text "The clerk says, \"Sorry, I'm on my break.\"\n")))) -(define-mhandler (clerk-act-be-summoned clerk message) +(define-mhandler (clerk-act-be-summoned clerk message who-summoned) (match (slot-ref clerk 'state) ('on-duty - (<- clerk (message-from message) 'tell + (<- clerk who-summoned 'tell #:text "The clerk tells you as politely as she can that she's already here, so there's no need to ring the bell.\n")) @@ -598,6 +634,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" @@ -626,39 +684,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