Dozens and Dragons

making a plain text battlemap for lancer

battlemaps with tiled map editor

2025-02-06

WARNING: if you are one of my lancer townies, know there are minor spoilers herein for our current campaign

Contents

  1. Lancer is two games smooshed into one
  2. Starting with a oneshot
  3. Battlemap
  4. Links

Lancer is two games smooshed into one

So I’m kicking off a play-by-post campaign for Lancer, the mech-pilot space sci-fi fantasy roleplaying game. As far as I can tell, Lancer is actually two games smooshed together: 1) a lightweight, freeform, narrative roleplaying game; and 2) a grid-based, turn-based, tactical combat minigame.

It is basically a lightly themed D&D. Whichever one of the previous editions was focused on tactics. I don’t know, I’ve only played 5e.

The narrative game is easy enough to run in a play-by-post game. As a GM, I describe a situation and say WHAT DO YOU DO and the players narrate what their characters do. Maybe sometimes they roll dice to resolve risk.

digraph {
  GM -> Player [ label = "Describes the situation" ]
  Player -> World [ label = "Narrates what their character does" ]
  World -> GM [ label = "The situation has changed" ]
}
The Quintessential1 RPG Game Loop in dot notation2
GM GM Player Player GM->Player Describes the situation World World Player->World Narrates what their character does World->GM The situation has changed
The Quintessential RPG Game Loop: SVG Edition

The combat game is another story. In this medium more than others, this interrupts the game loop. Or at least, there is much more interpretation, litigation, and adjudication involved in deciding what the character can do to change the situation and impact the world. And this back-and-forth is very time consuming and painful in a slow-paced, async play-by-post game. It just gobbles up too much time. So I don’t know what I’m going to do about that.

That’s a procedural problem. How can we speed up rounds? How can we expedite rolls? How can we batch things together? How can we shorten the feedback loop? Can we reduce the mental overhead by getting rid of the map and just using theater of the mind? A matter of rules and procedures.

It’s a hard problem because I expect we’ll run combat as written maybe once and then abstract it somehow in order to save everybody time and keep the game on track. On the other hand, this is a mech-piloting game and nobody wants to deny these pilots the opportunity to pilot their mechs! Unfortunately they only really ever come into play during combat. Maybe that’s a solution: more narrative mech mechanics?

Starting with a oneshot

I found Oil, Water, & Blood on the Lancer One-shot Module Jam on itch. What a trove of resources! It’s what I’m running as the first scenario of the campaign. I think it is a nice example of how to create a module!

  1. Start with a setting (eco-conservation world), stat out a few NPCs (friends and enemies), and create an objective (stop the poachers; save the giant capybara)

  2. Include a little Bite-Sized Dungeon pointcrawl a la Traverse Fantasy

  3. Include an advancing clock mechanic with some consequences.

  4. Pick a sitrep from the lancer book (a gauntlet) for the combat encounter

It’s all very straightforward in execution, but also there is lots to play with and engage with!

Battlemap

In the meantime, I still expect us to run the combat minigame. At least once. Which calls for fine-tuned tactics, field control, areas of effect, cover, and more. Which means we need a battle map.

an image quilt of a bunch of screenshots of all the software and assets

Oil, Water, & Blood includes a great map. But I don’t feel like I can use it as is because the game I’m running is very plaintext forward. We are in fact playing by logging into on a remote server with no graphics and posting on a local message board. And chatting on irc. It’s all just words, words, words.

So the solution I’m imagining is a plain text hex map that I can update each turn and then post to the message board. A map where a player can be like, “Move me to space L12: I take soft cover and fire my rockets at the mech on space F6.”

So I grabbed cuddlyclover’s Fantasy Hex Tiles from itch and created a new tileset in Tiled, and then very roughly redrew the map from the module by hand. With this, I can export the map as an image in case I ever do want to redirect the game to an html page or something. And I can also export all the map data as json.

After writing some real quick and dirty javascript I was able to turn the json into a map.

  . . . " / / / / / / / / " " . . " " / / / / / /
 . . . . " " " " " " " " " . . . . , " " " " " "
  . . . . . . " , " , " . . . . o . . , , , . . .
 ~ . . . . . , , , , , . . . o o o . . . . . . .
  ~ . . . . . . . , . . . . . . . . . . . . . . .
 ~ . . , , . . . . . . . . . . . . . o o . . . ~
  ~ ~ , o o . . . . . . . . . . . . . o . . . ~ ~
 ~ ~ ~ ~ ~ . o o . . . . . . . . . . . . . ~ ~ ~
  " " ~ , ~ ~ o . . . . . . . . . . . . . ~ ~ ~ .
 / / " " , , ~ ~ . . . . . , . . . . . ~ ~ ~ . /
  / / / / " " . . ~ . . . , , / / / " . ~ ~ . . /
 / " " " " . " . ~ ~ . . , " / " " " ~ . / / / /
  " " " . . . . . . . ~ ~ . " " " " ~ ~ . / / / /
 " . . . . . . . . . ~ ~ . . . ~ ~ . . . . . / /
  . . . . . . . . . . . ~ ~ . . ~ ~ o o . . . . .
 . . . . . . . / . . . ~ ~ ~ ~ . . . . . . . . .
  . . . . . . / / . . . ~ ~ . . . . . . . . . . .
 . . . o . / / . . . . . ~ . . , . . . . . . . .
  . . o o . . / . . . . . ~ , , , " " . . . . . .
 . . o . . . . . . . . . ~ , , / " " " . . . . .
  . . . . . . . . o o . . ~ , , / / / " . . . . .
 . . . . . . . . o . . . ~ / / / / / . . . . . .
  . . . . . . . . . . . . ~ . . . / . . . . . . .
 . . . . . . . . . . . ~ ~ . . . . . . . . . . .
  . . . . . . . , . . . ~ . . . . . . . . . . . .
 . . . " " " , / , . . ~ . . . . . . . . . . . .
  . . . " " / / / / . . ~ . . . " . . . . , , . .
 . . . . / . / . . . . ~ . " " " " . . . , . . .
  . . . . . . . . . . . ~ . / / / / . . . . . . .
 . o o . . . . . . . . ~ . . / / / . . . . . . .
  . . o . . . . . . . . ~ . . . . . . . . . . . .
 . . . . . . . . . . . ~ . . . . . . o o . . . .
  o o . . . . . . . . . ~ . . . . . . o . . . . .
 o o . . . . . . . . . ~ . . . . . . . . . . . .

LEGEND
. - ground
, - tall grass (soft cover)
" - brush (height 1 hardcover)
o - boulder (height 1 hardcover)
/ - trees (height 2 hardcover)
~ - water (difficult terrain)

I think this will work okay.

Part of the javascript I wrote flattens layers. The clock mechanic I mentioned? It dictates whether the river is flooded or not, resulting in more or less difficult terrain. So there are two different water layers.

This means I can also create a Characters layer in Tiled and track PC and NPC movement there, export to json, and regenerate the map.

« older | 2025-02-06


  1. “Quintessential” means “Fifth Most Essential”↩︎

  2. https://sketchviz.com/graphviz-examples↩︎