most of the async museum
[mudsync.git] / worlds / bricabrac.scm
index f6494e26a4e3b22159ffe2daa5086976f8f32137..476fb602c8de2c66e1b188ee75676b03f9cc8192 100644 (file)
@@ -337,6 +337,12 @@ and buttons and springs.  Some of them have wind-up knobs on them."
 You can imagine yourself joining a tea party using this set, around a
 nice table with some doilies, drinking some Earl Grey tea, hot.  Mmmm."
     #:goes-by '("tea set" "tea"))
+   ('lobby:cups
+    <cabinet-item> 'lobby
+    #:invisible? #t
+    #:name "cups from the tea set"
+    #:desc "They're chipped."
+    #:goes-by '("cups"))
    ('lobby:mustard-pot
     <cabinet-item> 'lobby
     #:invisible? #t
@@ -728,13 +734,14 @@ seat in the room, though."
     #:catchphrases prefect-quotes)
 
    ('smoking-parlor:no-smoking-sign
-    <gameobj> 'smoking-parlor
+    <readable> 'smoking-parlor
     #:invisible? #t
     #:name "No Smoking Sign"
     #:desc "This sign says \"No Smoking\" in big, red letters.
 It has some bits of bubble gum stuck to it... yuck."
-    #:goes-by '("no smoking sign" "sign"))
-
+    #:goes-by '("no smoking sign" "sign")
+    #:read-text "It says \"No Smoking\", just like you'd expect from
+a No Smoking sign.")
    ;; TODO: Cigar dispenser
    ))
 
@@ -1137,12 +1144,20 @@ the paint, but the wires themselves seem to be unusually sturdy."
                    (<- (message-from message) 'tell
                        #:text '("The computer is already running, and a program appears "
                                 "ready to run."
-                                "you mean to \"run the program on the computer\"")))))
+                                "you mean to \"run the program on the computer\""))))
+   (cmd-help-run-not-press
+    (lambda (gameobj message . _)
+      (<- (message-from message) 'tell
+          #:text '("You don't need to press / push / flip anything. "
+                   "You could " (i "run program on computer")
+                   " already if you wanted to.")))))
   (commands #:allocation #:each-subclass
             #:init-thunk (build-commands
                           ("run" ((prep-indir-command cmd-run-program
                                                       '("on"))
-                                  (direct-command cmd-run-what))))))
+                                  (direct-command cmd-run-what)))
+                          (("press" "push" "flip")
+                           ((prep-indir-command cmd-help-run-not-press))))))
 
 (define* (computer-run-program gameobj message
                                #:key direct-obj indir-obj preposition
@@ -1326,7 +1341,15 @@ is a map detailing the layout of the underground structure."))
             #:to 'computer-room
             #:traverse-check
             (lambda (exit room whos-exiting)
-              (values #t "You climb the spiral staircase.")))))
+              (values #t "You climb the spiral staircase.")))
+          (make <exit>
+            #:name "west"
+            #:to 'async-museum
+            #:traverse-check
+            (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."))))))
 
    ;; map
    ('underground-lab:map
@@ -1345,6 +1368,189 @@ is a map detailing the layout of the underground structure."))
     #:desc `((p "The sign says:")
              ,8sync-design-goals))))
 
+\f
+;;; guile async museum
+
+(define async-museum
+  (list
+   (list
+    'async-museum
+    <room> #f
+    #:name "Guile Asynchronous Museum"
+    #:desc '((p "You're in the Guile Asynchronous Museum.  There is a list of exhibits
+on the wall near the entrance.  Scattered around the room are the exhibits
+themselves, but it's difficult to pick them out.  Maybe you should read the list
+to orient yourself.")
+             (p "There is a door to the east, watched by a security guard,
+as well as an exit leading to the south."))
+    #:exits (list
+             (make <exit>
+               #:name "south"
+               #:to 'gift-shop)
+             (make <exit>
+               #:name "east"
+               #:to 'underground-lab
+               #:traverse-check
+               (lambda (exit room whos-exiting)
+                 (values #f '("The security guard stops you and tells you "
+                              "that the only exit is through the gift shop."))))))
+   (list
+    'async-museum:security-guard
+    <chatty-npc> 'async-museum
+    #:name "a security guard"
+    #:desc
+    '(p "The security guard is blocking the eastern entrance, where "
+        "you came in from.")
+    #:goes-by '("security guard" "guard" "security")
+    #:catchphrases '("It's hard standing here all day."
+                     "I just want to go home."
+                     "The exhibits are nice, but I've seen them all before."))
+   (let ((placard
+          `((p "Welcome to our humble museum!  The exhibits are listed below. "
+               (br)
+               "To look at one, simply type: " (i "look at <exhibit-name>"))
+            (p "Available exhibits:")
+            (ul ,@(map (lambda (exhibit)
+                         `(li ,exhibit))
+                       '("2016 Progress"
+                         "8sync and Fibers"
+                         "Suspendable Ports"
+                         "The Actor Model"))))))
+     (list
+      'async-museum:list-of-exhibits
+      <readable> 'async-museum
+      #:name "list of exhibits"
+      #:desc
+      `((p "It's a list of exibits in the room.  The placard says:")
+        ,@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:suspendable-ports-exhibit
+    <gameobj> 'async-museum
+    #:name "Suspendable Ports Exhibit"
+    #:goes-by '("suspendable ports exhibit" "ports exhibit"
+                "suspendable exhibit" "suspendable ports" "ports")
+    #:desc
+    '((p "Suspendable ports are a new feature in Guile 2.2, and allows code "
+         "that would normally block on IO to " (i "automatically") " suspend "
+         "to the scheduler until information is ready to be read/written!")
+      (p "Yow!  You might barely need to change your existing blocking code!")
+      (p "Fibers, 8sync, and guile-a-sync now support suspendable ports.")))
+   (list
+    'async-museum:actor-model-exhibit
+    <gameobj> 'async-museum
+    #:name "Actor Model Exhibit"
+    #:goes-by '("actor model exhibit" "actor exhibit"
+                "actor model")
+    #:desc
+    '((p "Here are some fact(oids) about the actor model!")
+      (ul (li "Originally the research goal of Scheme!  (message passing anecdote here)")
+          (li "foooo"))
+      ))
+   
+   ))
+
+(define gift-shop
+  (lol
+   ('gift-shop
+    <room> #f
+    #:name "Museum Gift Shop"
+    #:desc "foo"
+    #:exits (list
+             (make <exit>
+               #:name "northeast"
+               #:to 'underground-lab)
+             (make <exit>
+               #:name "north"
+               #:to 'async-museum)))))
+
 
 \f
 ;;; Game
@@ -1352,7 +1558,8 @@ is a map detailing the layout of the underground structure."))
 
 (define (game-spec)
   (append lobby grand-hallway smoking-parlor
-          playroom break-room computer-room underground-lab))
+          playroom break-room computer-room underground-lab
+          async-museum gift-shop))
 
 ;; TODO: Provide command line args
 (define (run-game . args)