Add <readable-desc> and use it
[mudsync.git] / worlds / bricabrac.scm
index c423051b8ad3395b383818c334cfc3082d5e0272..1035dd76173ff9187325478a6dba95538fa0643b 100644 (file)
       #:text (slot-ref actor 'read-text)))
 
 
+;; This one is just where reading is the same thing as looking
+;; at the description
+(define-class <readable-desc> (<gameobj>)
+  (commands
+   #:allocation #:each-subclass
+   #:init-thunk (build-commands
+                 ("read" ((direct-command cmd-look-at))))))
+
 ;; This one allows you to take from items that are proxied by it
 (define-actor <proxy-items> (<gameobj>)
   ((cmd-take-from take-from-proxy))
@@ -1290,7 +1298,7 @@ the paint, but the wires themselves seem to be unusually sturdy."
                        |  [8sync Hive] |======'  '-_____
                        ',      M      ,'
                         '.         @ .'                                  
-                          \\  @     /                    
+                          \\   @     /                    
                            '-__+__-'                
                             '.  @ .'
      .--------------.         \\ /
@@ -1356,7 +1364,10 @@ is a map detailing the layout of the underground structure."))
                            "into the room, then stands in front of the door."))))
           (make <exit>
             #:name "north"
-            #:to 'hive-entrance)))
+            #:to 'hive-entrance)
+          (make <exit>
+            #:name "east"
+            #:to 'federation-station)))
 
    ;; map
    ('underground-lab:map
@@ -1432,95 +1443,92 @@ 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."))))
-     (list
-      'async-museum:2016-progress-exhibit
-      <readable> 'async-museum
-      #:name "2016 Progress Exhibit"
-      #: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."))))
-     (list
-      'async-museum:8sync-and-fibers-exhibit
-      <readable> 'async-museum
-      #:name "8sync and Fibers Exhibit"
-      #: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."))))
-     (list
-      'async-museum:8sync-and-fibers-exhibit
-      <readable> 'async-museum
-      #:name "8sync and Fibers Exhibit"
-      #:goes-by '("8sync and fibers exhibit" "8sync exhibit" "fibers exhibit")
-      #:desc desc
-      #:read-text desc))
+   (list
+    'async-museum:2016-progress-exhibit
+    <readable-desc> 'async-museum
+    #:name "2016 Progress Exhibit"
+    #:goes-by '("2016 progress exhibit" "2016 progress" "2016 exhibit")
+    #: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:8sync-and-fibers-exhibit
+    <readable-desc> 'async-museum
+    #:name "8sync and Fibers Exhibit"
+    #:goes-by '("8sync and fibers exhibit" "8sync exhibit" "fibers exhibit")
+    #: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
+    <readable-desc> 'async-museum
+    #:name "8sync and Fibers Exhibit"
+    #:goes-by '("8sync and fibers exhibit" "8sync exhibit" "fibers exhibit")
+    #: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:suspendable-ports-exhibit
-    <gameobj> 'async-museum
+    <readable-desc> 'async-museum
     #:name "Suspendable Ports Exhibit"
     #:goes-by '("suspendable ports exhibit" "ports exhibit"
                 "suspendable exhibit" "suspendable ports" "ports")
@@ -1532,7 +1540,7 @@ as well as an exit leading to the south."))
       (p "Fibers, 8sync, and guile-a-sync now support suspendable ports.")))
    (list
     'async-museum:actor-model-exhibit
-    <gameobj> 'async-museum
+    <readable-desc> 'async-museum
     #:name "Actor Model Exhibit"
     #:goes-by '("actor model exhibit" "actor exhibit"
                 "actor model")
@@ -1639,7 +1647,176 @@ handle it!"
       "What a lousy scheduler we're using!  I hope someone upgrades
 that thing soon."))))
 
-;;; 
+;;; Inside the hive
+
+(define-actor <meta-message> (<readable>)
+  ((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)))))
+
+\f
+;;; Inside the Hive
+
+(define hive-inside
+  (lol
+   ('hive-inside
+    <room> #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 <exit>
+            #:name "south"
+            #:to 'hive-entrance)))
+   ;; hive actor
+   ;; TODO: Occasionally "fret" some noises, similar to the Clerk.
+   ('hive-inside:hive-actor
+    <chatty-npc> '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
+    <gameobj> '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
+    <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
+    <floor-panel> '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"))))
+
+\f
+;;; Federation Station
+(define federation-station
+  (lol
+   ('federation-station
+    <room> #f
+    #:name "Federation Station"
+    #:desc
+    '((p "This room has an unusual structure.  It's almost as if a starscape
+covered the walls and ceiling, but upon closer inspection you realize that
+these are all brightly glowing nodes with lines drawn between them.  They
+seem decentralized, and yet seem to be sharing information as if all one
+network.")
+      ;; @@: Maybe add the cork message board here?
+      (p "To the west is a door leading back to the underground laboratory."))
+    #:exits
+    (list (make <exit>
+            #:name "west"
+            #:to 'underground-lab)))
+   ;; nodes
+   ;; network
+   ;; activitypub poster
+   ;; conspiracy chart
+   ('federation-station:conspiracy-chart
+    <readable-desc> 'federation-station
+    #:name "a conspiracy chart"
+    #:goes-by '("conspiracy chart" "chart")
+    #:desc
+    '((p (i "\"IT'S ALL RELATED!\"") " shouts the over-exuberant conspiracy "
+         "chart. "
+         (i "\"ActivityPub?  Federation?  The actor model?  Scheme?  Text adventures? "
+            "MUDS????  What do these have in common?  Merely... EVERYTHING!\""))
+      (p "There are circles and lines drawn between all the items in red marker, "
+         "with scrawled notes annotating the theoretical relationships.  Is the "
+         "author of this poster mad, or onto something?  Perhaps a bit of both. "
+         "There's a lot written here, but here are some of the highlights:")
+      (p
+       (ul
+        (li (b "Scheme") " "
+            (a "http://cs.au.dk/~hosc/local/HOSC-11-4-pp399-404.pdf"
+               "was originally started ")
+            " to explore the " (b "actor model")
+            ". (It became more focused around studying the " (b "lambda calculus")
+            " very quickly, while also uncovering relationships between the two systems.)")
+        ;; Subject Predicate Object
+        (li "The " (a "https://www.w3.org/TR/activitypub/"
+                      (b "ActivityPub"))
+            " protocol for " (b "federation")
+            " uses the " (b "ActivityStreams") " format for serialization.  "
+            (b "Text adventures") " and " (b "MUDS")
+            " follow a similar structure to break down the commands of players.")
+        (li (b "Federation") " and the " (b "actor model") " both are related to "
+            "highly concurrent systems and both use message passing to communicate "
+            "between nodes.")
+        (li "Zork, the first major text adventure, used the " (b "MUDDLE") " "
+            "language as the basis for the Zork Interactive Language.  MUDDLE "
+            "is very " (b "Scheme") "-like and in fact was one of Scheme's predecessors. "
+            "And of course singleplayer text adventures like Zork were the "
+            "predecessors to MUDs.")
+        (li "In the 1990s, before the Web became big, " (b "MUDs")
+            " were an active topic of research, and there was strong interest "
+            (a "http://www.saraswat.org/desiderata.html"
+               "in building decentralized MUDs")
+            " similar to what is being "
+            "worked on for " (b "federation") ". "
+            "(See the network spaces desiderata document.)")))))
+
+   ;; goblin
+
+   ))
 
 \f
 ;;; Game
@@ -1648,7 +1825,8 @@ that thing soon."))))
 (define (game-spec)
   (append lobby grand-hallway smoking-parlor
           playroom break-room computer-room underground-lab
-          async-museum gift-shop hive-entrance))
+          async-museum gift-shop hive-entrance
+          hive-inside federation-station))
 
 ;; TODO: Provide command line args
 (define (run-game . args)