Using Vizon - a dependence mapper - to design puzzles

I’ve happened across what seems to me a very useful tool for plotting out the dependencies of puzzles: Vizon.

For this first part, I’ve left out all the syntax, for clarity.

You write a series of event statements, e.g. “get_crowbar”, “open_chest”, “get_treasure” etc. and link these with a series of depends_on statements. So the “get_treasure” event might have “depends_on open_chest” associated with it.

Vizon then parses those statements into a dependency chart: a series of bubbles each named after its event, with arrows pointing from the earlier events to those dependent on them. I realize that this is hardly necessary in the above example, but the event statements don’t have to be in any particular order: it’s the “depends_on” part that controls the ordering of the dependency chart.

So let’s make that trivial puzzle a bit less so. Let’s make a pair of rubber gloves necessary for gripping the crowbar, and also a strength potion that’s a separate solution.

So (with full syntax this time):

get_rubber_gloves : event {}

get_crowbar : event {}

use_crowbar : event { depends_on [] = get_crowbar, get_rubber_gloves; }

get_strength_potion : event {}

get_treasure: event { depends_on [] = open_chest; }

open_chest : event { depends_on [] = get_strength_potion, use_crowbar; logic_gate_type = or  }

And the tool will revise the dependency chart with arrows showing the direction of play necessary to solve the puzzle’s stages; in the case of opening the chest the arrows go to a big “OR” diamond.

All well and good; an excellent and useful tool, I think. But it doesn’t have a manual, and when I save it, Firefox tells me it’s saving a TADS 3 library file. I’ve looked on the if archive for Vizon and can’t find it. Useful as the tool is, I don’t want to spend hours working on puzzle dependencies using it, only to have all that work vanish when I close my browser!

Can anyone more IF or TADS3 savvy shed any light on the matter?

(For now, I’m simply saving the contents of the left pane as a text file.)

1 Like

I don’t have any relevant savvy, but the “I Agree” screen says “All user-entered data is stored locally, and not transmitted to, or stored on, the server. Backup to local textfile often.” Which makes it sound like it’s storing the thing in browser cookies (or local storage for the browser? here’s where I’m especially not savvy)–and also that saving the contents of the left pane as a text file is definitely what you should do!

I tried saving the chart from the bottom right link and it prompted me to save an .svg file, which didn’t have a default application to open it. I was able to open it in Firefox. That appears to be only the chart, not the dependencies that create the chart, though.

It looks like the dev also says you can tweet him for help at

This reminds me of @zarf’s tool PlotEx, which is in Python.

1 Like

Thanks @matt_weiner!

Having shut down, gone to bed and done other boringly non IF things, when I open my browser and point it at the site, bingo! All the test clauses I’d added were there. Looks like it works okay (I just don’t like not knowing how!)

Still, I reckon I owe the creator of this tool a big thank you: I’ve had thoughts for puzzles perking along with my coffee. :grin:

Ooo, Zarf. Always a good read. Thanks.

Skimming the documentation, it seems that PlotEx is a system for testing an already coded/part coded game. Vizon seems to be a tool designed to help me not shoot myself in the foot by doing a fancier version of putting the key to the locked box inside the box.

Vizon’s visual style also gives me a sense of when one path/strategy has a bunch of steps and another one very few, which I’m finding helpful. Not to mention the old “oops” doing that bypasses a problem when I didn’t mean it to thing.

These are the same problem. But PlotEx has no visual component, obviously.

It’s stored in localStorage, which allows web sites to store arbitrary named strings on your computer (up to 2-5MB per site). So it’s saved in your browser (unless you have browser extensions or settings that disable it). If you clear your browser’s cache/data/cookies/etc. you will lose it. If you switch to another device (or a different browser on the same device) your data won’t be there.

With those caveats, it’s an ok storage method. I’m guessing that it’s not set up to save more than one document, so if you’re working on multiple things you’ll want to copy the text of each and save it in files somewhere. Also it doesn’t necessarily save right away, but hitting the play button seems to update the saved version.

If you hit F12 it will bring up the developer tools and you should be able to find the values. In Chrome localStorage is under the Application tab, in Firefox it’s under Storage, on Edge it’s under Debugger. In Explorer you can choose the Console and type localStorage or localStorage['vison.editor.currentdocument'].

That was probably more than you wanted to know, but there it is in case anyone cares…


Thanks @JoshGrams, it’s useful to know, since I now realize that the data wouldn’t be included in my regular backups. I’ll make a habit of copy & pasting the left pane into a text document and keep it in the project file.

I don’t use Twitter, which is why I hadn’t discovered the fact before, but it seems this tool was written by Chris Ainsley (at least that’s the twitter page it links to) so I’d like to thank him too.

This is fascinating! I wasn’t aware of this tool before, thanks for sharing.

I’ve spent a lot of time noodling around with graphing stories, and ran into countless dead ends and frustrations. I’ve used GraphViz, both to “sketch out” ideas, and as an output generated from my actual story rule data.

The bottom line is that I want to see what the overall structure looks like, and see if there are any story problems without having to playtest a zillion variations. I have had some success to this end, but ultimately the graphs just end up being huge, confusing, and limited.

The write up about PlotEx touches on so many of the issues I’ve ran into, such as:

  • What is the best way to visualize it, in order to answer the posed questions?
  • How do you keep the size down (visually and computationally)?
  • What if you can take some actions in different orders? Do you need to graph out all of those possibilities? This adds too much noise.
  • What if you can repeat actions? Do you show every time you can repeat an action? Again, too much noise.
  • What about numeric stats that you need to bump up multiple times to reach the required level? What if you can do that via different action combinations? Do you graph all of the possibilities?
  • Should actions be nodes, or edges between nodes? Or should the state be the nodes, which means actions will repeat throughout the graph?

I really like some of the approaches in PlotEx:

  • Defining qualities as “positives” and looking at choices as “costs”
  • Grouping “free” actions
  • The valuable output isn’t the graph, it’s things like tests/queries you can ask or showing the diffs between possible playthroughs (very useful).
  • Math FTW (equivalence classes)

Remaining questions/thoughts:

  • I wonder if I could parse the rules data in my game system (Elm Narrative Engine) into a PlotEx script? My system represents states and queries and changes in a very similar way. However, I have qualities per entity in the world, rather than as global qualities. Would this work, or would I have to manually model my world model?
  • Is going down this route actually a helpful/feasible validation tool, especially when the number of states explode?
  • I’ve experimented with interactive graphs, where clicking a node highlights useful metrics about what leads to it, and where it could lead. This is challenging, but could be powerful. Some of the flags PlotEx takes are along this line, so it would be interesting to think about how they could be visually represented, or if that would be useful.

It’s exciting to see such good work around some of the things I have struggled with for so long. Thanks again for sharing the link, and thanks to @zarf for doing that work in the first place!