A few weeks ago, Guillaume Lethuillier posted "The Myst Graph: A New Perspective on Myst":
Upon reflection, Myst has long been more analogous to a graph than a traditional linear game, owing to the relative freedom it affords players. This is particularly evident in its first release (Macintosh, 1993), which was composed of interconnected HyperCard cards.
It is now literally one. Here is Myst as a graph:
The second part of his post digs into his findings, including unreachable states which were left in the game.
That was awesome, and I twooted about it at the time. Now Guillaume has posted a third article, describing how he did it. Also the source code of the tool he used to make the graph!
There's some neat subtleties to how Cyan used Hypercard:
When the first card is pushed (push card
), the second card just backtracks to the first.
However, when the first card pushes another card (push card id {ID} of stack “{stack name}”
), a more complex transitive relationship emerges, making the player navigate from the first card to the pushed card through an intermediate card (which “pops” to the target card).
-- from "Creating the Graph Using DeMystify" (May 9)
This is all delightful, with only one problem: I am impatient and didn't want to wait six weeks for part three of Guillaume's post!
My goals were somewhat different from Guillaume's. I didn't want to build a graph; he already did that. I just wanted to browse the HyperTalk scripts. The Infocom source code has been wonderful for understanding the context of 1980s text games. I figure that Myst's source code would be just as great for 1990s graphical adventures.
So I, um, wrote my own HyperCard stack extractor.
(Of course I held off releasing it until today, the day after Guillaume released his source code. I'm impatient but I'm not a jerk.)
Guillaume's project uses stackimport, a C++ tool which parses HyperCard stacks and exports their data as XML. The stackimport tool was written by Uli Kusterer, one of the early pioneers of Myst code spelunking. (See this thread, originally posted to Twitter on 2021.)
However, even though I'm familiar with Uli and his GitHub page, I sort of totally missed the existence of stackimport. Whoops!
So I just wrote a Python script to do the same thing. Hey, at least I had fun.
As you see, the MystExtract repo contains all the extracted HyperTalk scripts as text files. I figure I'm already the guy with the archive of Infocom source code; I might as well host the Myst source code too.
To be clear, this is the original 1993 release of Myst for Macintosh. The 1994 Windows port was not based on HyperCard; it was reimplemented from scratch. And of course subsequent releases of Myst have used the Plasma engine (for RealMyst in 2000), then Unity, then Unreal.
Anybody can replicate this work, using either stackimport or my script. The original Mac Myst CD-ROM can be found at the Internet Archive. I used the hfsutils package to extract the files from the ISO disk image. Yes, I own the original Myst CD-ROM -- it's on a shelf right behind me, right next to the external CD drive that I never use any more either. The Archive ISO was easier.
Are there any surprises? Let me refer you to Jeff Barbi's Mysterium presentation last year, where he dug into the source code using HyperCard itself (on a Mac emulator). For example, Jeff refers to this bit of code, which insta-flips every marker switch if you option-click on the Dock marker switch. This is commented out for release (don't bother trying it!) but it was obviously handy for development and testing.
Feel free to browse around and look for more fun stuff!
And now I have to think about the possibility of doing a "Visible Myster", as a followup to the Visible Zorker. Play Myst in your browser, and watch the source code execute every time you take an action!
It's a neat idea. But I'm afraid it's not going to happen any time soon. Sorry! I've played fast and loose with the Infocom IP, but Cyan is a living company and they're making money from Myst right now. (And they do need the money, sadly.)
Anyway, a Visible Myster would be a ton more work. For the Zork project, I had a JavaScript Z-code interpreter ready to go. Are there JavaScript HyperCard interpreters? Well, this one turns up...
Hm. Maybe I should email Cyan and ask for their blessing.
(Yeah, I know, it would still be a ton of work even with a working interpreter to start with. For a start, I'd have to transcode those ancient Quicktime videos into something Web-playable. Animated GIFs? Do I care about sound? I might not care about sound.... Oh, gah, now I'm thinking about the problem.)