Pogmap is a utility for helping ACTS play of my favourite wargame, Paths of Glory. I wrote it due to being unhappy with certain aspects of the premier POG mapping tool, CyberBoard.

Basically, pogmap generates a PostScript map from a text file that contains a log of game events. Here are some of the advantages of pogmap:

Note that pogmap is only meant as an accessory for playing. It doesn't know anything about the rules of the game, nor the cards. It only knows what areas and units exist, and tracks their current status.


To install pogmap, just download one of the packages below, and unpack it into your directory of choice. To run pogmap, perl needs to be installed on your computer (anything from version 5.005 up should be fine). If you're using Linux or MacOS X, perl is probably already installed, and you don't need to do anything. If you're using Windows, you'll need to download and install a Windows version of perl first.


To actually get any use of the produced maps you'll also need a PostScript viewer, for example GSView.


pogmap [--pdf] [--full|--season] [input files]

When pogmap is executed, it outputs a PostScript map for all input files given as arguments. If no inputs files are given, the current working directory is scanned for files matching *.log, which are then used as input. If the output file is newer than the input, the input file is skipped. If an input file contains errors, the execution stops immediately, and the error is reported.

If you have ps2pdf installed (ps2pdf is part of Ghostscript, and the --pdf switch is specified, pogmap will translate the PostScript map to PDF.

Giving the --full or --season command line switches turns on multipage mode, which outputs into the PostScript multiple maps, either after every impulse (with --full) or every season (with --season).

 $ perl pogmap 
 Handling alpenkorps.log -> 
 Handling gas+flame.log -> 
 Handling honved.log -> 
 $ perl pogmap --season gas+flame2.log gas+flame3.log 
 Skipping gas+flame2.log -> 
 Handling gas+flame3.log -> 
 $ perl pogmap gas+flame8.log 
 Handling gas+flame8.log -> 
 gas+flame8.log: Error on line 884 [ Venice: GE(18) => GEc. ]: 
 No '(GE18)' in 'Venice'

File format

The file format used by pogmapper is designed to be brief, easy to read, and easy to write. The format should be close enough to normal ACTS messages that only minor editing is needed when inserting the opponents moves. It's important to note, that pogmap is line-oriented, so a command can't be split across multiple lines.

You might want to read the example log first, and only refer to this document for the details that you don't understand.


Most commands need to know in which area the command is taking effect. The active area is set by starting the line with the name of the area, followed by a colon. Since typing some of the area names correctly isn't always easy (Przemysl, anyone?), pogmap does some fuzzy matching to fix spelling errors.

Example: All of the following set the active area to Przemysl 
 Przemysl: ... 
 Prezmysl: ...
 Prezmysll: ...
 Presmysl: ...
 Pezmysl: ...
 Prz: ...

If no area is set for a line, the behaviour depends on the command.


Many commands affect one or more units. Unit names follow the normal POG naming conventions, and are case sensitive. Flipped units are marked with parens. Multiple units can be specified by separating them with commas. Multiple identical units can be referred to as a group by prepending their amount to the unit name.

Example: Some valid unit specifications 
 GE9, GE(8) 
 (FR11), FRc, FR(c) 
 AUSc, (ANA) 3GE(c)
Example: Some invalid unit names 

Moving units

The -> command moves units (named on the left side of the arrow) from the currently active province into the target province (named on the right side of the arrow).

 Essen: GE1, GE2 -> Koblenz

The <- command moves units to the currently active province. As before, the units are named on left side of the arrow, but in this case their location is specified on the right side.

Example: The same effect as for the previous example
 Koblenz: GE1, GE2 <- Essen

As a convenience, if a source area wasn't set the units are moved from the deadbox (also known as "Elim:").

Example: The following commands are all equal 
 Elim: FRc, FRc -> RB 
 Elim: FRc -> RB 
 2FRc -> RB

Flipping units

Units are flipped using the + (flip to full-strength side) and - (flip to reduced side) commands. There used to be a "flip" command which could automatically determine what sort of flip was wanted, but it was too error-prone.

 Konigsberg: +GE(8), GE(c) 
 Verdun: -FR1, FR2, FRc

Killing units

Killing units (i.e. moving them into the eliminated box) can is done using the kill command.

 Belgrade: Kill SBc

If an army is killed using kill , it isn't replaced with an appropriate corps from the RB (since pogmap has no knowledge of which corps matches which army). For this purpose, use the => command.

Example: Move Nis AH(7) -> the Elim. box, and move an RB AHc -> Nis 
 Nis: AH(7) => AHc

To permanently eliminate an unit, use permanently eliminate.

 Brussels: Permanently eliminate BEF

New units

New units can be created onto the board or one of the boxes using the >> command.

 2BR >> RB 
 BR3 >> London


Trenches can be created to the active area using the APT1, APT2, CPT1 and CPT2 commands. You may optionally add a space between the P and T. A trench can be removed with the T0 command.

 Brussels: APT2 Metz: T0


The fort in the active are can be destroyed using the destroy command.

 Konigsberg: Destroy

Area ownership

The ownership of areas can be changed using the AP and CP commands. If there is no active area, the affected areas can be specified to the right of the command.

 Konigsberg: AP 
 CP Czestochowa, Lodz, Plock

Multiple commands

It's possible to enter multiple commands on one line, by separating them with a dot. All of the commands will affect the same area.

 Sedan: -FR9. Kill FRc. FR(9) -> Cambrai. FR3 -> Verdun


The setup command can be used for loading a scenario file, which sets up the units and trenches. Currently the only scenario is stdopen, which contains the standard POG 1914 scenario. If you want to add a new scenario, please contact me about the details.

 setup stdopen


If a line contains a # character, everything on the line after that character is ignored.

 Stettin: RU11 -> Berlin. # Yeeess!!!

Well, not completely ignored. In multipage mode, each page displays the first 25 comment lines that were encountered while generating the page. Also, comments are used for determining the current season; if a comment contains a number from 1914 to 1919, the season changes. In season mode, this also starts the output of a new page.

 # Winter 1915 

Empty lines

Lines that contain no text are ignored. The only effect is in full mode, where an empty line starts a new map page (but only if the state of the map had changed since the last page change).