Skip to content

Map filter examples

Recipes to start from. Each one is a working filter over the Lantern Coast, shown as the builder view you click together and as the expression view you can copy and paste. Choose which you’d like to see; the Guide remembers your choice on every page.

Each caption says how many nodes the filter shows out of how many are in scope. Drag the slider to see which nodes the filter hides.

Common recipes

Only people and places

Keep the player characters, the NPCs and the locations. Ships, clues, scenes and groups are hidden.

Only people and places

IN takes a list, so one condition covers every type you want to keep.

Builder The builder view of Include node.type IN ["player_character", "npc", "location"]
Expression
Include
node.type IN ["player_character", "npc", "location"]

Before Before, with the filters off: the map shows all 32 nodes. Filters: Include node.type IN ["player_character", "npc", "location"].
After After: Include node.type IN ["player_character", "npc", "location"]. Shows 15 of 32 nodes.
Shows 15 of 32 nodes

Everything tagged “Act 1”

Everything tagged Act 1

HAS tests for one whole tag, so this keeps every node tagged Act 1.

Builder The builder view of Include node.tags HAS "Act 1"
Expression
Include
node.tags HAS "Act 1"

Before Before, with the filters off: the map shows all 32 nodes. Filters: Include node.tags HAS "Act 1".
After After: Include node.tags HAS "Act 1". Shows 11 of 32 nodes.
Shows 11 of 32 nodes

Hide the player characters

This one is an Exclude: the map shows everything in scope except what matches.

Hide the player characters

Maren Holt and Tamsin Reeve are hidden. Player characters don’t draw a node of their own on the map, so the caption still counts every node and the visible change is small: the connections to and from them go. Every other node stays.

Builder The builder view of Exclude node.type = "player_character"
Expression
Exclude
node.type = "player_character"

Before Before, with the filters off: the map shows all 32 nodes. Filters: Exclude node.type = "player_character".
After After: Exclude node.type = "player_character". Shows 32 of 32 nodes.
Shows 32 of 32 nodes

Clues not yet given

Clues not yet given

A custom-field condition is false for a node of another type, so only clues can match. The players haven’t found Cut bell-rope, Lamp-oil receipts, Chalk marks on the quay or the Smuggler’s chart.

Builder The builder view of Include clue.given = "not_given"
Expression
Include
clue.given = "not_given"

Before Before, with the filters off: the map shows all 32 nodes. Filters: Include clue.given = "not_given".
After After: Include clue.given = "not_given". Shows 4 of 32 nodes.
Shows 4 of 32 nodes

Locations the party has visited

Locations the party has visited

Port Varrow, the Customs Warehouse, The Salted Anchor and The Teeth Lighthouse are marked visited.

Builder The builder view of Include location.visited = "visited"
Expression
Include
location.visited = "visited"

Before Before, with the filters off: the map shows all 32 nodes. Filters: Include location.visited = "visited".
After After: Include location.visited = "visited". Shows 4 of 32 nodes.
Shows 4 of 32 nodes

Everything around one character

The node itself, plus every neighbour.

Everything around Ines Calloway

connected_to tests the node at the far end of a connection, so Ines Calloway herself needs her own condition. Joined with OR, you get Ines and everyone and everything she’s connected to.

A name matches every node with that name. To pin the filter to one node, add a Node condition in the builder, pick the node, and copy the expression it prints, which names the node by id.

Builder The builder view of Include node.name = "Ines Calloway" OR connected_to(node.name = "Ines Calloway")
Expression
Include
node.name = "Ines Calloway" OR connected_to(node.name = "Ines Calloway")

Before Before, with the filters off: the map shows all 32 nodes. Filters: Include node.name = "Ines Calloway" OR connected_to(node.name = "Ines Calloway").
After After: Include node.name = "Ines Calloway" OR connected_to(node.name = "Ines Calloway"). Shows 3 of 32 nodes.
Shows 3 of 32 nodes

Loose ends

Loose ends: nodes with no connections

Nodes with no connections at all: Old Hob and The Sandbar.

Builder The builder view of Include node.connection_count = 0
Expression
Include
node.connection_count = 0

Before Before, with the filters off: the map shows all 32 nodes. Filters: Include node.connection_count = 0.
After After: Include node.connection_count = 0. Shows 2 of 32 nodes.
Shows 2 of 32 nodes

Hubs

Hubs: five or more neighbours

Neighbour count counts distinct neighbours, so two connections to the same node count once. The busiest places on the coast, such as Port Varrow, are the ones left.

Builder The builder view of Include node.neighbor_count >= 5
Expression
Include
node.neighbor_count >= 5

Before Before, with the filters off: the map shows all 32 nodes. Filters: Include node.neighbor_count >= 5.
After After: Include node.neighbor_count >= 5. Shows 4 of 32 nodes.
Shows 4 of 32 nodes

Nodes not yet linked to any story beat

Nodes not yet linked to a story beat

IS EMPTY is true for a node with no story beats. Most of the map is still waiting for one.

Builder The builder view of Include node.story_beats IS EMPTY
Expression
Include
node.story_beats IS EMPTY

Before Before, with the filters off: the map shows all 32 nodes. Filters: Include node.story_beats IS EMPTY.
After After: Include node.story_beats IS EMPTY. Shows 17 of 32 nodes.
Shows 17 of 32 nodes

Advanced recipes

The nodes that at least three clues point at

Suppose you want the place the investigation keeps leading back to, along with the clues that point at it and everything those clues touch. Written in three named parts, it reads:

X = connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3)
C = node.type = "clue" AND connected_to(X, via: type = "Points to", direction: "out")
Include: C OR connected_to(C)
  • X is every node that at least three clues point at: it has at least three clue neighbours reached by an incoming “Points to” connection. In the fixture that’s the Chapel of St. Brine.
  • C is the clues that point at an X.
  • The Include keeps C itself, and every neighbour of a clue in C.

The expression view takes one expression, so the parts are written inside each other. The builder shows the same nesting.

The headline: what at least three clues point at, those clues, and their neighbours

The map shows the Chapel and its four clues, and the clues’ other neighbours: the Customs Warehouse, The Kestrel and the Anonymous note.

Builder The builder view of Include node.type = "clue" AND connected_to(connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3), via: type = "Points to", direction: "out") OR connected_to(node.type = "clue" AND connected_to(connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3), via: type = "Points to", direction: "out"))
Expression
Include
node.type = "clue" AND connected_to(connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3), via: type = "Points to", direction: "out") OR connected_to(node.type = "clue" AND connected_to(connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3), via: type = "Points to", direction: "out"))

Before Before, with the filters off: the map shows all 32 nodes. Filters: Include node.type = "clue" AND connected_to(connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3), via: type = "Points to", direction: "out") OR connected_to(node.type = "clue" AND connected_to(connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3), via: type = "Points to", direction: "out")).
After After: Include node.type = "clue" AND connected_to(connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3), via: type = "Points to", direction: "out") OR connected_to(node.type = "clue" AND connected_to(connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3), via: type = "Points to", direction: "out")). Shows 8 of 32 nodes.
Shows 8 of 32 nodes

This example uses exactly the three-step relationship limit: the Include’s connected_to(C), then C’s connected_to(X), then X’s connected_to(clue). A filter can’t go one step deeper.

The contrast: start from the target, not the clues

What if the last part started from X instead of C?

Include: X OR connected_to(X)

The contrast: the same target nodes and their own neighbours

Now the map shows the Chapel and its own neighbours: the four clues, Ines Calloway, Father Mott, Keeper Wren and the midnight vigil.

Builder The builder view of Include connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3) OR connected_to(connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3))
Expression
Include
connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3) OR connected_to(connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3))

Before Before, with the filters off: the map shows all 32 nodes. Filters: Include connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3) OR connected_to(connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3)).
After After: Include connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3) OR connected_to(connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3)). Shows 9 of 32 nodes.
Shows 9 of 32 nodes

The two maps differ because connected_to always starts from the node it’s applied to. In the headline, it starts from the clues, so you see the clues’ other neighbours: the Customs Warehouse, The Kestrel and the Anonymous note appear only there. In the contrast, it starts from the target, so the Chapel’s non-clue neighbours appear only here: Ines Calloway, Father Mott, Keeper Wren and the midnight vigil. The headline shows 8 nodes and the contrast 9.

Clues that point nowhere

Clues that point nowhere

true matches any neighbour, and via narrows the test to “Points to” connections leaving the clue. The Chalk marks and the Anonymous note have none. “Found in” and “Contradicts” connections don’t count.

Builder The builder view of Include node.type = "clue" AND NOT connected_to(true, via: type = "Points to", direction: "out")
Expression
Include
node.type = "clue" AND NOT connected_to(true, via: type = "Points to", direction: "out")

Before Before, with the filters off: the map shows all 32 nodes. Filters: Include node.type = "clue" AND NOT connected_to(true, via: type = "Points to", direction: "out").
After After: Include node.type = "clue" AND NOT connected_to(true, via: type = "Points to", direction: "out"). Shows 2 of 32 nodes.
Shows 2 of 32 nodes

NPCs at a place the party has visited

NPCs at a place the party has visited

The NPC has to be connected to a location whose Visited field says visited: Harbourmaster Corra Vane, Clerk Quill and Keeper Wren.

Builder The builder view of Include node.type = "npc" AND connected_to(location.visited = "visited")
Expression
Include
node.type = "npc" AND connected_to(location.visited = "visited")

Before Before, with the filters off: the map shows all 32 nodes. Filters: Include node.type = "npc" AND connected_to(location.visited = "visited").
After After: Include node.type = "npc" AND connected_to(location.visited = "visited"). Shows 3 of 32 nodes.
Shows 3 of 32 nodes

Include and Exclude together

Hide everything tagged “red herring”, unless it’s connected to a given clue.

Hide red herrings, unless a given clue is connected

Include keeps clues, NPCs and locations. Exclude then removes anything tagged red herring that has no given clue next to it. Ysolde Marsh and The Salted Anchor go; the Anonymous note stays, because it’s connected to The Drowned Bell, which the players have found.

Builder The builder view of Include node.type IN ["clue", "npc", "location"]; Exclude node.tags HAS "red herring" AND NOT connected_to(clue.given = "given")
Expression
Include
node.type IN ["clue", "npc", "location"]

Exclude
node.tags HAS "red herring" AND NOT connected_to(clue.given = "given")

Before Before, with the filters off: the map shows all 32 nodes. Filters: Include node.type IN ["clue", "npc", "location"]; Exclude node.tags HAS "red herring" AND NOT connected_to(clue.given = "given").
After After: Include node.type IN ["clue", "npc", "location"]; Exclude node.tags HAS "red herring" AND NOT connected_to(clue.given = "given"). Shows 21 of 32 nodes.
Shows 21 of 32 nodes

Ships by crew, seaworthiness and port of call

Large crews that aren't seaworthy and call at Port Varrow

All three conditions must hold: a crew of 50 or more, not seaworthy, and Port Varrow among the ports of call. Only The Great Cormorant qualifies.

Builder The builder view of Include ship.crew >= 50 AND ship.seaworthy = false AND ship.ports_of_call HAS "Port Varrow"
Expression
Include
ship.crew >= 50 AND ship.seaworthy = false AND ship.ports_of_call HAS "Port Varrow"

Before Before, with the filters off: the map shows all 32 nodes. Filters: Include ship.crew >= 50 AND ship.seaworthy = false AND ship.ports_of_call HAS "Port Varrow".
After After: Include ship.crew >= 50 AND ship.seaworthy = false AND ship.ports_of_call HAS "Port Varrow". Shows 1 of 32 nodes.
Shows 1 of 32 nodes