PCGen Functions

To provide output of PCGen characters we need to be able to access the character data and the output tags. In the FreeMarker documentation they talk about the data model, plus directives and functions. At this time, PCGen does not provide a data model, but instead provides a number of directives and functions that allow access to the character data. Current work is examining the provision of a data model to access characters.

A directive produces output to the output file, or controls the flow of the output process. FreeMarker directives start with <# while PCGen directives start with <@

A function allows a value to be extracting into a variable (or directly output). Both PCGen and FreeMarker functions are enclosed in ${ } . Functions may also be referred to directly wherever a formula or variable is used.


This tag evaluates a PCGen export token for the current character and returns the value as a string. It may be called as a directive (with a single parameter named 'tag') or as a function (with a single unnamed parameter).


<@pcstring tag="PLAYERNAME"/>
<@pcstring tag="CLASSABB.${class}"/>
<#if (pcstring('SPELLLISTCLASS.${class}')?length > 0)>present</#if>


This function allows character variable values to be exported to a FreeMarker template. It evaluates a variable for the current character and returns the value as a number.


<#assign numClasses=pcvar('countdistinct("CLASSES")')/>



The pcboolean function allows character boolean values to be exported to a FreeMarker template. It evaluates an export token for the current character and returns the value as a boolean.


<#if pcboolean('WEAPON.${weap}.ISTYPE.Double')>
<#if (pcboolean('VAR.HASFEAT:CMB Output')) >


The pchasvar function allows the presence of variables to be tested in the output sheet.


<#if pchasvar('Foo')>
<#if (pchasvar("Manifester") || pchasvar('PsychicWarriorManifester')) >


The loop directive provides a way to repeat content a certain number of times. Unlike the inbuilt list directive it can loop zero times.


In addition up to two loopvars may be specified. The first will be populated with the current index value of the loop and the second will be a boolean indicating if there are more iterations of the loop to go. We recommend that the second variable, if present, is named after the first variable with _has_next added. e.g. class, class_has_next. This is in order to match the list directive, which provides a similarly named variable automatically.


<@loop from=0 to=pcvar('countdistinct("CLASSES")')-1 ; class , class_has_next >
        <@pcstring tag="CLASSABB.${class}"/>
        <@pcstring tag="CLASS.${class}.LEVEL"/><#if class_has_next>,</#if>

might produce

Rog 11, Wiz 5


The equipsetloop directive provides a way to repeat content for each of a character's equipment sets.




  <b>Equipment Set : </b> ${pcstring("EQSET.NAME")}. Equipment:
  <@loop from=0 to=pcvar('COUNT[EQUIPMENT.MERGELOC]')-1 ; equip , equip_has_next >
    ${pcstring("EQ.MERGELOC.${equip}.NAME")}<#if equip_has_next>, </#if>
  </@loop><#lt><#-- Equipment -->

might produce

<b>Equipment Set : </b> Travelling Gear. Equipment: Backpack, Longsword, Traveller's Outfit<br/>
<b>Equipment Set : </b> Council. Equipment: Coin purse, Noble's Outfit, Rapier<br/>

FreeMarker Variables

PCGen also provides some in built variables which can be used in FreeMarker. These are referred to in the same way as any user defined variables.


This is the name of the current game mode.


<#if (gamemodename = "Modern" || gamemodename = "Darwins_World_2" || gamemodename = "Sidewinder") >