Roll20 Traveller

Last modified date

Something that I did a lot of when running D&D and Pathfinder on Roll20 was write scripts to automate a lot of the work. Since I’ve started running Traveller, I’ve started doing the same thing – though Traveller is a much simpler system so it’s been a lot easier.

The scripts, which are completely unofficial, are available on GitHub here:

They will probably see continuous updates whilst I’m running Traveller and think of other things to add to them.

Firstly, I’m using a hex grid at a scale of 1 hex = 1m for my maps. I know that Mongoose Traveller suggests 1 hex = 1.5m, but that’s just a silly scale (presumably used for compatibility with D&D’s 1 square = 5ft). Hexes make it a bit harder to get the lighting maps right, but they’re much nicer for movement and ranges than squares are.

I’m using the standard Mongoose Traveller character sheets that are available on Roll 20, and these have buttons for making skill rolls and attacks, but these are cumbersome to use, especially for a GM trying to manage multiple characters and blind players where the sheets aren’t very accessible. So the main feature I’ve added is the ability to make skill checks and attacks from the chat box.

Skill Checks

You can select one or more tokens and make a skill check directly with an API command. The one or more is important, since it allows me to make rolls for multiple characters simultaneously.

You can also make a roll with no token selected – in this case, if you are not the GM, it will look for a token that you specifically have permission to control, and use that one. This allows someone who can’t see the tokens to be able to make rolls using them.

Firstly, you can list all your skills


This will display a list of all the skills you have displayed on your character sheet. Clicking on any of them will roll that skill with no modifiers, using the default characteristic defined for that skill.

Alternatively, you can directly make a skill roll.

!skill int recon
!skill i recon +2
!skill dex recon +

In turn, these commands will roll your Recon skill with Intellect, roll your recon skill with intellect with a +2 modifier, and roll your recon skill with dex using a boon (3d6, take the highest two). You can use +/- for boon and bane dice, and positive or negative modifiers, or a combination.

You can use any abbreviation of the characteristics, right down to a single letter. In the case of Education and Endurance, Education is matched first (in the case of ‘e’), since more skills use that characteristic.

Skill names can also be abbreviated, down to a single letter in some cases. Skills with specialisations are rolled all in one go – so you don’t need to specify the exact skill. For example:

!skill edu elec

will roll your Electronics skill, and show you all your specialisation levels together.

When matching skill names, they are always case insensitive. Exact matches are preferred over partial matches, then ‘starts with’ matches are tried and finally ‘contains in’ matches.

So “i” matches to “Investigate”, but “x” will match to “Explosives”. Due to an unfortunate similarity in skill names, “gun” matches to “Gunner” rather than the probably more common “Gun Combat”. You’ll need “gun c” or “combat” to match the latter.

So far, I’ve found that some players prefer the buttons on the character sheet, and some prefer typing the API commands – both are available for use. Personally, I find the typing quicker and more flexible.

Attack Rolls

Making attack rolls works in a similar process. There is a command to list all your attacks, which you can make by clicking on them or typing a command directly.


This lists all the attacks defined on your character sheet, together with some information about those attack types. You can then click on one to make a basic roll.

If you prefer typing, or want to automatically add modifiers or penalties, then you can do this in a similar way to skills.

!attack laser
!attack carbine +2
!attack laser carbine -4 +

The first will attack with your “Laser Pistol”, then second with your “Laser Carbine” at +2, and the third with your “Laser Carbine” at -4 but with a boon.

Your attack roll and damage will immediately displayed. Effect isn’t added to damage though – you’ll have to do that yourself.


Tracking damage is tricky in Traveller, since it’s not just a case of having a hit point total which goes down. Well, it is for creatures, but characters have a more complicated set of rules.

Damage comes off your END initially, then after that it comes off STR or DEX. When two characteristics are at zero, the character is unconscious. When all three are at zero, you’re dead.

The scripts also include some automation to handle this. It assumes END, STR and DEX are tracked on your three token values (Red, Green and Blue). Damage should always be applied to END (Red). The script automatically selects which characteristic to take the damage off.

  • If you have positive END, then the damage is first taken from END.
  • Otherwise, further damage is taken from either STR or DEX, based on the lowest one which can take the damage without going to zero.

So if you have a STR of 7 and a DEX of 9, then 6 damage would be taken from STR, but 8 damage would be taken from DEX. This prolongs the character going unconscious. Once two characteristics are at zero, the token is marked as being unconscious. When three are at zero, it is dead.

Status markers are used to show whether a token is injured (orange dot), unconscious (skull) or dead (red cross).

For now, I am ignoring damage to characteristics reducing skill rolls and the like. Combat currently seems dangerous enough as it is. Also, creatures don’t suffer penalties, because they have a separate Hits track.

Speaking of creatures – these are also catered for. A token which doesn’t have a max set on the blue or green token values is assumed to be a creature with a single Hits track. Damage off this will be tracked, and their current status (alive, unconscious or dead) will be shown as markers on their token.


Characters can take a reaction during a combat round, allowing them to dodge or parry attacks. Each reaction gives a -1 DM to their next set of actions. This means we need to keep track of how many reactions a token has taken.

A blue status marker is used to track this, and there is an API command to automatically modify it.

!react 0

By itself, !react will increment the current value of the marker, or set it to 1 if it isn’t currently set. If a value is given, then this is the value the marker is set to. Setting it to zero will clear it. I have a macro button to both increment and clear the marker.

Roll20 will only display values from 0 to 9, but if the value is 10 or higher it is still tracked – it just isn’t displayed.

If the token ever makes skill checks or attack rolls, then the current value of this marker will be subtracted as a penalty automatically. Hopefully, this will simplify tracking things in combat and stop myself and players forgetting what penalties to apply.

The downside of this particular penalty is that the character sheet won’t use it, so it will only be automatically applied when using the API scripts.


I’ve also written a simple Linux script to create tokens. Some of the tokens in the screenshots are from some paper minis products available on DriveThruRPG from El Cheapo Products. They are very cheap, and though they’re meant for printing out and cutting out into paper miniatures, the portrait packs are good for digital use.

Since each portrait is in roughly the same place on each page of the PDF, it was possible to script cropping, re-sizing and tokenizing each character image. It makes use of imagemagick to perform the graphics manipulation, and pdf2images to rip the images out of the PDF.

The script creates a 400px square portrait, plus a 140px token with a circular border automatically added. It needs a couple of base images to help create the token, but I’ve provided these as well. These can be uploaded directly to Roll20 for use in a game. The script and border images are available here:

If you have PDF tokens from another product, then the script should be easily modifiable to cope with different sizes and positions.

Samuel Penn

1 Response