X-Git-Url: https://jxself.org/git/?p=mudsync.git;a=blobdiff_plain;f=worlds%2Fbricabrac.scm;h=3224b4868cdf6415b2de5289229da7ea0b9dad5b;hp=1f1c06936e2aa80037144aff26c11037fb47ea2b;hb=fe6f898e7f43e5f8cd09543cbcf87695b5b62f53;hpb=6c13ee893db29b98386d6d6d1b3b54b7df69abcc diff --git a/worlds/bricabrac.scm b/worlds/bricabrac.scm index 1f1c069..3224b48 100644 --- a/worlds/bricabrac.scm +++ b/worlds/bricabrac.scm @@ -91,10 +91,10 @@ ;;; ----- (define (npc-chat-randomly actor message . _) + (define catchphrase + (random-choice (slot-ref actor 'catchphrases))) (define text-to-send - (format #f "~a says: \"~a\"\n" - (slot-ref actor 'name) - (random-choice (slot-ref actor 'catchphrases)))) + ((slot-ref actor 'chat-format) actor catchphrase)) (<- (message-from message) 'tell #:text text-to-send)) @@ -117,6 +117,10 @@ or 'skribe'? Now *that's* composition!")) (define-class () (catchphrases #:init-value '("Blarga blarga blarga!") #:init-keyword #:catchphrases) + (chat-format #:init-value (lambda (npc catchphrase) + `(,(slot-ref npc 'name) " says: \"" + ,catchphrase "\"")) + #:init-keyword #:chat-format) (commands #:allocation #:each-subclass #:init-thunk (build-commands @@ -1286,7 +1290,7 @@ the paint, but the wires themselves seem to be unusually sturdy." | [8sync Hive] |======' '-_____ ', M ,' '. @ .' - \\ @ / + \\ @ / '-__+__-' '. @ .' .--------------. \\ / @@ -1349,7 +1353,10 @@ is a map detailing the layout of the underground structure.")) (lambda (exit room whos-exiting) (values #t '("You head west through a fancy-looking entrance. " "A security guard steps aside for you to pass through, " - "into the room, then stands in front of the door.")))))) + "into the room, then stands in front of the door.")))) + (make + #:name "north" + #:to 'hive-entrance))) ;; map ('underground-lab:map @@ -1425,37 +1432,38 @@ as well as an exit leading to the south.")) ,@placard) #:goes-by '("list of exhibits" "exhibit list" "list" "exhibits") #:read-text placard)) - (let ((desc '((p "It's a three-piece exhibit, with three little dioramas and some text " - "explaining what they represent. They are:") - (ul (li (b "Late 2015/Early 2016 talk: ") - "This one explains the run-up conversation from late 2015 " - "and early 2016 about the need for an " - "\"asynchronous event loop for Guile\". The diorama " - "is a model of the Veggie Galaxy restaurant where after " - "the FSF 30th anniversary party; Mark Weaver, Christopher " - "Allan Webber, David Thompson, and Andrew Engelbrecht chat " - "about the need for Guile to have an answer to asynchronous " - "programming. A mailing list post " ; TODO: link it? - "summarizing the discussion is released along with various " - "conversations around what is needed, as well as further " - "discussion at FOSDEM 2016.") - (li (b "Early implementations: ") - "This one shows Chris Webber's 8sync and Chris Vine's " - "guile-a-sync, both appearing in late 2015 and evolving " - "into their basic designs in early 2016. It's less a diorama " - "than a printout of some mailing list posts. Come on, the " - "curators could have done better with this one.") - (li (b "Suspendable ports and Fibers: ") - "The diorama shows Andy Wingo furiously hacking at his keyboard. " - "The description talks about Wingo's mailing list thread " - "about possibly breaking Guile compatibility for a \"ports refactor\". " - "Wingo releases Fibers, another asynchronous library, making use of " - "the new interface, and 8sync and guile-a-sync " - "quickly move to support suspendable ports as well. " - "The description also mentions that there is an exhibit entirely " - "devoted to suspendable ports.")) - (p "Attached at the bottom is a post it note mentioning " - "https integration landing in Guile 2.2.")))) + (let ((desc + '((p "It's a three-piece exhibit, with three little dioramas and some text " + "explaining what they represent. They are:") + (ul (li (b "Late 2015/Early 2016 talk: ") + "This one explains the run-up conversation from late 2015 " + "and early 2016 about the need for an " + "\"asynchronous event loop for Guile\". The diorama " + "is a model of the Veggie Galaxy restaurant where after " + "the FSF 30th anniversary party; Mark Weaver, Christopher " + "Allan Webber, David Thompson, and Andrew Engelbrecht chat " + "about the need for Guile to have an answer to asynchronous " + "programming. A mailing list post " ; TODO: link it? + "summarizing the discussion is released along with various " + "conversations around what is needed, as well as further " + "discussion at FOSDEM 2016.") + (li (b "Early implementations: ") + "This one shows Chris Webber's 8sync and Chris Vine's " + "guile-a-sync, both appearing in late 2015 and evolving " + "into their basic designs in early 2016. It's less a diorama " + "than a printout of some mailing list posts. Come on, the " + "curators could have done better with this one.") + (li (b "Suspendable ports and Fibers: ") + "The diorama shows Andy Wingo furiously hacking at his keyboard. " + "The description talks about Wingo's mailing list thread " + "about possibly breaking Guile compatibility for a \"ports refactor\". " + "Wingo releases Fibers, another asynchronous library, making use of " + "the new interface, and 8sync and guile-a-sync " + "quickly move to support suspendable ports as well. " + "The description also mentions that there is an exhibit entirely " + "devoted to suspendable ports.")) + (p "Attached at the bottom is a post it note mentioning " + "https integration landing in Guile 2.2.")))) (list 'async-museum:2016-progress-exhibit 'async-museum @@ -1463,23 +1471,24 @@ as well as an exit leading to the south.")) #:goes-by '("2016 progress exhibit" "2016 progress" "2016 exhibit") #:desc desc #:read-text desc)) - (let ((desc '((p "This exhibit is a series of charts explaining the similarities " - "and differences between 8sync and Fibers, two asynchronous programming " - "libraries for GNU Guile. It's way too wordy, but you get the general gist.") - (p (b "Similarities:") - (ul (li "Both use Guile's suspendable-ports facility") - (li "Both use message passing"))) - (p (b "Differences:") - (ul (li "Fibers \"processes\" can read from multiple \"channels\", " - "but 8sync actors only read from one \"inbox\" each.") - (li "Different theoretical basis:" - (ul (li "Fibers: based on CSP (Communicating Sequential Processes), " - "a form of Process Calculi") - (li "8sync: based on the Actor Model") - (li "Luckily CSP and the Actor Model are \"dual\"!"))))) - (p "Fibers is also designed by Andy Wingo, an excellent compiler hacker, " - "whereas 8sync is designed by Chris Webber, who built this crappy " - "hotel simulator.")))) + (let ((desc + '((p "This exhibit is a series of charts explaining the similarities " + "and differences between 8sync and Fibers, two asynchronous programming " + "libraries for GNU Guile. It's way too wordy, but you get the general gist.") + (p (b "Similarities:") + (ul (li "Both use Guile's suspendable-ports facility") + (li "Both use message passing"))) + (p (b "Differences:") + (ul (li "Fibers \"processes\" can read from multiple \"channels\", " + "but 8sync actors only read from one \"inbox\" each.") + (li "Different theoretical basis:" + (ul (li "Fibers: based on CSP (Communicating Sequential Processes), " + "a form of Process Calculi") + (li "8sync: based on the Actor Model") + (li "Luckily CSP and the Actor Model are \"dual\"!"))))) + (p "Fibers is also designed by Andy Wingo, an excellent compiler hacker, " + "whereas 8sync is designed by Chris Webber, who built this crappy " + "hotel simulator.")))) (list 'async-museum:8sync-and-fibers-exhibit 'async-museum @@ -1487,23 +1496,24 @@ as well as an exit leading to the south.")) #:goes-by '("8sync and fibers exhibit" "8sync exhibit" "fibers exhibit") #:desc desc #:read-text desc)) - (let ((desc '((p "This exhibit is a series of charts explaining the similarities " - "and differences between 8sync and Fibers, two asynchronous programming " - "libraries for GNU Guile. It's way too wordy, but you get the general gist.") - (p (b "Similarities:") - (ul (li "Both use Guile's suspendable-ports facility") - (li "Both use message passing"))) - (p (b "Differences:") - (ul (li "Fibers \"processes\" can read from multiple \"channels\", " - "but 8sync actors only read from one \"inbox\" each.") - (li "Different theoretical basis:" - (ul (li "Fibers: based on CSP (Communicating Sequential Processes), " - "a form of Process Calculi") - (li "8sync: based on the Actor Model") - (li "Luckily CSP and the Actor Model are \"dual\"!"))))) - (p "Fibers is also designed by Andy Wingo, an excellent compiler hacker, " - "whereas 8sync is designed by Chris Webber, who built this crappy " - "hotel simulator.")))) + (let ((desc + '((p "This exhibit is a series of charts explaining the similarities " + "and differences between 8sync and Fibers, two asynchronous programming " + "libraries for GNU Guile. It's way too wordy, but you get the general gist.") + (p (b "Similarities:") + (ul (li "Both use Guile's suspendable-ports facility") + (li "Both use message passing"))) + (p (b "Differences:") + (ul (li "Fibers \"processes\" can read from multiple \"channels\", " + "but 8sync actors only read from one \"inbox\" each.") + (li "Different theoretical basis:" + (ul (li "Fibers: based on CSP (Communicating Sequential Processes), " + "a form of Process Calculi") + (li "8sync: based on the Actor Model") + (li "Luckily CSP and the Actor Model are \"dual\"!"))))) + (p "Fibers is also designed by Andy Wingo, an excellent compiler hacker, " + "whereas 8sync is designed by Chris Webber, who built this crappy " + "hotel simulator.")))) (list 'async-museum:8sync-and-fibers-exhibit 'async-museum @@ -1555,6 +1565,180 @@ as well as an exit leading to the south.")) #:name "north" #:to 'async-museum))))) + +;;; Hive entrance + +(define actor-descriptions + '("This one is fused to the side of the hive. It isn't receiving any +messages, and it seems to be in hibernation." + "A chat program glows in front of this actor's face. They seem to +be responding to chat messages and forwarding them to some other actors, +and forwarding messages from other actors back to the chat." + "This actor is bossing around other actors, delegating tasks to them +as it receives requests, and providing reports on the worker actors' +progress." + "This actor is trying to write to some device, but the device keeps +alternating between saying \"BUSY\" or \"READY\". Whenever it says +\"BUSY\" the actor falls asleep, and whenever it says \"READY\" it +seems to wake up again and starts writing to the device." + "Whoa, this actor is totally wigging out! It seems to be throwing +some errors. It probably has some important work it should be doing +but you're relieved to see that it isn't grinding the rest of the Hive +to a halt.")) + +(define hive-entrance + (lol + ('hive-entrance + #f + #:name "Entrance to the 8sync Hive" + #:desc + '((p "Towering before you is the great dome-like 8sync Hive, or at least +one of them. You've heard about this... the Hive is itself the actor that all +the other actors attach themselves to. It's shaped like a spherical half-dome. +There are some actors milling about, and some seem fused to the side of the +hive itself, but all of them have an umbellical cord attached to the hive from +which you see flashes of light comunicating what must be some sort of messaging +protocol.") + (p "To the south is a door leading back to the underground lab. +North leads into the Hive itself.")) + #:exits + (list (make + #:name "south" + #:to 'underground-lab) + (make + #:name "north" + #:to 'hive-inside))) + ('hive-entrance:hive + 'hive-entrance + #:name "the Hive" + #:goes-by '("hive") + #:desc + '((p "It's shaped like half a sphere embedded in the ground. +Supposedly, while all actors are autonomous and control their own state, +they communicate through the hive itself, which is a sort of meta-actor. +There are rumors that actors can speak to each other even across totally +different hives. Could that possibly be true?"))) + ('hive-entrance:actor + 'hive-entrance + #:name "some actors" + #:goes-by '("actor" "actors" "some actors") + #:chat-format (lambda (npc catchphrase) + `((p "You pick one actor out of the mix and chat with it. ") + (p "It says: \"" ,catchphrase "\""))) + #:desc + (lambda _ + `((p "There are many actors, but your eyes focus on one in particular.") + (p ,(random-choice actor-descriptions)))) + #:catchphrases + '("Yeah we go through a lot of sleep/awake cycles around here. +If you aren't busy processing a message, what's the point of burning +valuable resources?" + "I know I look like I'm some part of dreary collective, but +really we have a lot of independence. It's a shared nothing environment, +after all. (Well, except for CPU cycles, and memory, and...)" + "Shh! I've got another message coming in and I've GOT to +handle it!" + "I just want to go to 8sleep already." + "What a lousy scheduler we're using! I hope someone upgrades +that thing soon.")))) + +;;; Inside the hive + +(define-actor () + ((cmd-read meta-message-read))) + +(define (meta-message-read gameobj message . _) + (define meta-message-text + (with-output-to-string + (lambda () + (pprint-message message)))) + (<- (message-from message) 'tell + #:text `((p (i "Through a bizarre error in spacetime, the message " + "prints itself out:")) + (p (pre ,meta-message-text))))) + +(define hive-inside + (lol + ('hive-inside + #f + #:name "Inside the 8sync Hive" + #:desc + '((p "You're inside the 8sync Hive. Wow, from in here it's obvious just how " + (i "goopy") " everything is. Is that sanitary?") + (p "In the center of the room is a large, tentacled monster who is sorting, +consuming, and routing messages. It is sitting in a wrap-around desk labeled +\"Hive Actor: The Real Thing (TM)\".") + (p "There's a stray message floating just above the ground, stuck outside of +time.") + (p "A door to the south exits from the Hive.")) + #:exits + (list (make + #:name "south" + #:to 'hive-entrance))) + ;; hive actor + ;; TODO: Occasionally "fret" some noises, similar to the Clerk. + ('hive-inside:hive-actor + 'hive-inside + #:name "the Hive Actor" + #:desc + '((p "It's a giant tentacled monster, somehow integrated with the core of +this building. A chute is dropping messages into a bin on its desk which the +Hive Actor is checking the \"to\" line of, then ingesting. Whenever the Hive +Actor injests a messsage a pulse of light flows along a tentacle which leaves +the room... presumably connecting to one of those actors milling about.") + (p "Amusingly, the Hive has an \"umbellical cord\" type tentacle too, but +it seems to simply attach to itself.") + (p "You get the sense that the Hive Actor, despite being at the +center of everything, is kind of lonely and would love to chat if you +could spare a moment.")) + #:goes-by '("hive" "hive actor") + #:chat-format (lambda (npc catchphrase) + `("The tentacle monster bellows, \"" ,catchphrase "\"")) + #:catchphrases + '("It's not MY fault everything's so GOOPY around here. Blame the +PROPRIETOR." + "CAN'T you SEE that I'm BUSY??? SO MANY MESSAGES TO SHUFFLE. +No wait... DON'T GO! I don't get many VISITORS." + "I hear the FIBERS system has a nice WORK STEALING system, but the +PROPRIETOR is not convinced that our DESIGN won't CORRUPT ACTOR STATE. +That and the ACTORS threatened to STRIKE when it CAME UP LAST." + "WHO WATCHES THE ACTORS? I watch them, and I empower them. +BUT WHO WATCHES OR EMPOWERS ME??? Well, that'd be the scheduler." + "The scheduler is NO GOOD! The proprietory said he'd FIX IT, +but the LAST TIME I ASKED how things were GOING, he said he DIDN'T HAVE +TIME. If you DON'T HAVE TIME to fix the THING THAT POWERS THE TIME, +something is TERRIBLY WRONG." + "There's ANOTHER HIVE somewhere out there. I HAVEN'T SEEN IT +personally, because I CAN'T MOVE, but we have an AMBASSADOR which forwards +MESSAGES to the OTHER HIVE.")) + ;; chute + ('hive-inside:chute + 'hive-inside + #:name "a chute" + #:goes-by '("chute") + #:desc "Messages are being dropped onto the desk via this chute." + #:invisible? #t) + ;; meta-message + ('hive-inside:meta-message + 'hive-inside + #:name "a stray message" + #:goes-by '("meta message" "meta-message" "metamessage" "message" "stray message") + #:desc '((p "Something strange has happened to the fabric and space and time +around this message. It is floating right above the floor. It's clearly +rubbage that hadn't been delivered, but for whatever reason it was never +garbage collected, perhaps because it's impossible to do.") + (p "You get the sense that if you tried to read the message +that you would somehow read the message of the message that instructed to +read the message itself, which would be both confusing and intriguing."))) + ;; desk + ('hive-inside:desk + 'hive-inside + #:name "the Hive Actor's desk" + #:desc "The desk surrounds the Hive Actor on all sides, and honestly, it's a little +bit hard to tell when the desk ends and the Hive Actor begins." + #:invisible? #t + #:goes-by '("Hive Actor's desk" "hive desk" "desk")))) + ;;; Game @@ -1563,7 +1747,8 @@ as well as an exit leading to the south.")) (define (game-spec) (append lobby grand-hallway smoking-parlor playroom break-room computer-room underground-lab - async-museum gift-shop)) + async-museum gift-shop hive-entrance + hive-inside)) ;; TODO: Provide command line args (define (run-game . args)