Dead and forgotten

Drawers with bibliographic index cards of Paul Otlet’s “Universal Bibligraphical System”
Drawers with bibliographic index cards of Paul Otlet’s “Universal Bibligraphical System” – Wikimedia Commons

I’ve recently been playing Type Help.

In the game, there are a number of characters that inhabit different locations in the setting, and time is sliced up into chunks wherein each character performs some atomic scene.

In an effort to clarify my own understanding of the game, I’ve decided to create a diagram of the locations of the characters over time.

Location syntax

The game is divided into scenes, which are identified by a time-slice, an area code, and a list of scene participants. Time slices begin at 01 and end at 26, as far as I can tellThere are scenes marked with time-point 00, but these appear to be in some sense outwith the story, at time of writing. . A scene taking place at the fifth “moment”, located in a placed called the “Tower”, involving the third, fourth, and eight person, would be notated “05-TO-3-4-8”.

Automatic representation

So far, I have found these locations:

LIST
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
00-act-structure
00-audio-recovery
00-invitation
00-readme
00-references
01-BI-6-10
01-QU-1-11
01-ST-12
02-EN-1-6-7-10
02-KI-11
02-LI-5-8-9
03-AT-2-3
03-KI-10-11
03-LI-1-4-5-6-7-8-9
04-BI-6-9
04-KI-3-10-11
04-ST-1-5-8
05-DI-1-5
05-KI-8-10-11
06-ED-8-10
06-ST-1-11
07-DI-1-2-4-5-6-7-8-9
07-ED-10
07-KI-11
07-ST-3
08-DI-2-7-8-9
08-ED-4-10
08-KI-1-6
09-DI-1-3
09-VI-2-8
10-ED-8
10-LI-7-9
10-TO-1-4
11-BI-6-9
11-LI-1-7-8
26-EN-1

This is a lot! In order to avoid wasting timeNotably, one can avoid wasting time and in-so-doing spend more time achieving the same outcome. , I wanted to automate the procedure of converting location names to diagramma.

In order to do this, I wrote a script in Rust that ingests a list of location names, and constructs a Typst document that compiles to such a diagram.

This completely sucked. I spend about two-and-a-half hours on this, and despite having tons of fun with Rust’s single-file projectsExample usage here. , I ended up just producing a glorified spreadsheet, as using arrows from point-to-point were incredibly noisy and basically just uninterpretable.

Look at this mess:

Auto-generated timeline of Type Help

Epilogue

I also hit a bug in fletcher, the typst diagramming library I was using, where, as far as I can tell, when a node is created with both an explicit width and height, fletcher takes an early branch that computes size without resolving a shape.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#let measure-node-size(node) = {
  // width and height explicitly given
  if auto not in node.size {
    let (width, height) = node.size
    node.radius = vector-len((width/2, height/2))
    node.aspect = width/height
    // doesn’t set `node.shape`
  }

  // …

  // neither here
  if node.shape in (circle, "circle") { node.shape = shapes.circle }
  if node.shape in (rect, "rect") { node.shape = shapes.rect }

  node
}

Then, in resolve-node-enclosures, nodes that have enclose sets are asserted to be non-auto-shaped:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#let resolve-node-enclosures(nodes, ctx) = {
  let nodes = nodes.map(node => {
    // not an enclose node, leave as is
    if node.enclose.len() == 0 { return node }

    // …

    node.resolved-enclose = true
    assert(node.shape != auto) // bang!

    node
  })

  nodes
}

Setting all my enclosures to shape: rect fixed this, but it was sort of inscrutable.

I’m probably going to continue using this tool for playing the game, but it’s a lot less slick than I was envisioning. It’s still neat that this can be done, though!