Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
As far I understand only UI scripts will not work in HLO. This will affect the Pathfinder Community Pack.
This is logic you would have had to create using Authoring Kit logic totally outside of the HL editor. Mostly a "tab" uses a Configurable that is again created in the editor itself. These will "should" all work without issue.What are some examples of UI scripts? I have several custom data files for each campaign I've played in, ranging from items and feats, to a complex class/template addition to add an extra tab for structure without a class. Other then tricking the system into adding the extra class tab I don't think I have anything that affects the UI, but I've been wrong before. I had to rebuild most of my data files after v5 and I would prefer to isolate potential problems early this time.
<?xml version="1.0" encoding="UTF-8"?>
<document signature="Hero Lab Data">
<!--
Created by: Tim Shadow
Date: December 5, 2016
This is a community created sheet.
-->
<!-- Generate the text for a Maneuvers title label on the Manuevers printout -->
<procedure id="PoWManLbl" scripttype="label"><![CDATA[
var level as number
var desc as string
@text &= hero.actorname & " - Level " & level & " " & desc
]]></procedure>
<!-- NOTE: The global variable pwmanout can have the following values:
0 - output full descriptions
1 - output summaries
-->
<!-- Manuever lists -->
<portal
id="oManTbl"
style="outtable">
<output_table
component="PWManuever"
showtemplate="oManPick"
showpicks="yes"
varyheight="yes"
showsortset="SpellOut">
<list><![CDATA[
PathOfWar.Manuever & !Helper.Obsolete & !Helper.Helper
]]></list>
</output_table>
</portal>
<!-- Stances lists -->
<portal
id="oStanceTbl"
style="outtable">
<output_table
component="PWManuever"
showtemplate="oManPick"
showpicks="yes"
varyheight="yes"
showsortset="SpellOut">
<list><![CDATA[
PathOfWar.Stance & !Helper.Obsolete & !Helper.Helper
]]></list>
</output_table>
</portal>
<!-- Manuever and Stances Header -->
<template
id="omHeader"
name="Manuever and Stances Display Header"
compset="Totals">
<portal
id="text"
style="oNormal">
<output_label>
<labeltext><![CDATA[
foreach pick in hero from PWManList
@text = splice(@text,eachpick.field[name].text & " " & eachpick.field[cIL].value," / ")
nexteach
@text = splice(hero.actorname,@text,", ")
~& " " & chr(150) & " Maneuvers"
]]></labeltext>
</output_label>
</portal>
<position><![CDATA[
perform portal[text].centerhorz
height = portal[text].height
]]></position>
</template>
<!-- Maneuvers and Stances pick -->
<template
id="oManPick"
name="Output Maneuvers and Stances Table"
compset="PWManuever">
<portal
id="mName"
style="oSplTitle">
<output_label>
<labeltext><![CDATA[
@text = "{align left}{horz 15}" & tagnames[Ability.?] & " (" & tagnames[ClsCountAs.?] & ")"
]]></labeltext>
</output_label>
</portal>
<portal
id="mLevel"
style="oSplTitle">
<output_label>
<labeltext><![CDATA[
@text = tagnames[mLevel.?]
]]></labeltext>
</output_label>
</portal>
<portal
id="mText"
style="oSmall">
<output_label>
<labeltext><![CDATA[
~ TODO: Update this to use the new PWManSumm procedure once
~ we are not updating the Thing text.
@text = field[descript].text
]]></labeltext>
</output_label>
</portal>
<portal
id="mSummary"
style="oSmall">
<output_label>
<labeltext><![CDATA[
@text = field[abSumm].text
]]></labeltext>
</output_label>
</portal>
<position><![CDATA[
~ The level portal has centered text, so by adding twice the padding we
~ want, we get a small gap at it's right-hand side, so that the number
~ doesn't bump right against the edge of the grey section.
~ The name accomplishes the same thing with a horz element, but the level
~ seems to be ignoring horz's and spaces at the end of the text
portal[mLevel].width += 30
portal[mName].width = width - portal[mLevel].width
perform portal[mLevel].alignedge[right,0]
if (scenevalue[pwmanout] = 1) then
portal[mSummary].width = width
perform portal[mSummary].autoheight
perform portal[mSummary].alignrel[ttob,mName,10]
height = portal[mSummary].bottom + 30
portal[mText].visible = 0
else
portal[mText].width = width
perform portal[mText].autoheight
perform portal[mText].alignrel[ttob,mName,10]
height = portal[mText].bottom + 30
portal[mSummary].visible = 0
endif
]]></position>
</template>
<layout
id="oManeuvers">
<portalref portal="oManTbl"/>
<portalref portal="oStanceTbl"/>
<position><![CDATA[
perform portal[oManTbl].autoplace
perform portal[oStanceTbl].autoplace
]]></position>
</layout>
<layout
id="omHeader">
<templateref template="omHeader" thing="Totals" ispick="yes"/>
<position><![CDATA[
template[omHeader].width = width
perform template[omHeader].render
height = template[omHeader].bottom
]]></position>
</layout>
<sheet
id="shPWManDes"
name="Maneuvers Sheet (Description)"
spillover="yes">
<layoutref layout="oManeuvers" reference="left"/>
<layoutref layout="oManeuvers" reference="right"/>
<layoutref layout="omHeader"/>
<position><![CDATA[
~ Set our global variable to 'output description'
scenevalue[pwmanout] = 0
~ Setup the gap to be used between the various sections of the character sheet
autogap = 40
scenevalue[sectiongap] = autogap
layout[omHeader].width = width
perform layout[omHeader].render
layout[left].top = layout[omHeader].bottom + 40
layout[right].top = layout[omHeader].bottom + 40
~ Calculate the width of the two columns of the character sheet, leaving a
~ Suitable center gap between them
var colwidth as number
colwidth = (width - 50) / 2
~ Output the layout on the lefthand side with whatever information will fit
layout[left].width = colwidth
layout[left].height = height - layout[left].top
perform layout[left].render
~ Output the layout on the righthand side with whatever information will fit
layout[right].width = colwidth
layout[right].height = height - layout[right].top
layout[right].left = width - colwidth
perform layout[right].render
]]></position>
</sheet>
<sheet
id="shPWManSum"
name="Maneuvers Sheet (Summaries)"
spillover="yes">
<layoutref layout="oManeuvers" reference="left"/>
<layoutref layout="oManeuvers" reference="right"/>
<layoutref layout="omHeader"/>
<position><![CDATA[
~ Set our global variable to 'output summaries'
scenevalue[pwmanout] = 1
~setup the gap to be used between the various sections of the character sheet
autogap = 40
scenevalue[sectiongap] = autogap
layout[omHeader].width = width
perform layout[omHeader].render
layout[left].top = layout[omHeader].bottom + 40
layout[right].top = layout[omHeader].bottom + 40
~ Calculate the width of the two columns of the character sheet, leaving a
~ suitable center gap between them
var colwidth as number
colwidth = (width - 50) / 2
~ Output the layout on the lefthand side with whatever information will fit
layout[left].width = colwidth
layout[left].height = height - layout[left].top
perform layout[left].render
~ Output the layout on the righthand side with whatever information will fit
layout[right].width = colwidth
layout[right].height = height - layout[right].top
layout[right].left = width - colwidth
perform layout[right].render
]]></position>
</sheet>
</document>
One thing to keep in mind here is that we don't have a projected date as to when we'll have this stuff available for third-party devs to work with, so you shouldn't hinge too heavily on expecting it to happen in a useful timeframe. The actual work involved with the HLO templating is much less than with current HL, though, so any "conversion" stuff later from existing HL script should be fairly straightforward once you get the gist of it.One of the reasons I have been holding off doing a big fix for Path of War is I am hoping to only have to write the new UI tab one time.
// locales/en-US/maneuvers.json
{
"oManTbl": "Maneuvers",
"oStanceTbl": "Stances"
}
// templates/manuevers.xml
<?xml version="1.0" encoding="UTF-8"?>
<LayoutContainer>
<Iterate tagGroup="PWManList">
<Text align="center">
{~livename} {~textKey oManTbl} ({~field cIL})
</Text>
<LayoutContainer direction="horizontal">
<Iterate tableIds="oManTbl, oStanceTbl">
<SheetTable groupByTag="sLevel">
<template:item>
<TableCell align="left">
{~tags Ability} ({~tags ClsCountAs})
</TableCell>
<TableCell>{~tags mLevel}</TableCell>
<TableCell>{~field abSumm}</TableCell>
</template:item>
</SheetTable>
</Iterate>
</LayoutContainer>
</Iterate>
</LayoutContainer>
I guess I was hoping HL would get to the point where two different UI's would not be needed. With limited time I would really like to just write a UI once and use in both HLC/HLO but it sounds like that is not anytime soon.One thing to keep in mind here is that we don't have a projected date as to when we'll have this stuff available for third-party devs to work with, so you shouldn't hinge too heavily on expecting it to happen in a useful timeframe. The actual work involved with the HLO templating is much less than with current HL, though, so any "conversion" stuff later from existing HL script should be fairly straightforward once you get the gist of it.
[/QUOTE]Here's a quick, rough idea of the kind of thing it will look like. All subject to change, some of the stuff here isn't what we're currently doing, etc, but this is generally similar to what the current UI templates for HLO look like.
Code:// locales/en-US/maneuvers.json { "oManTbl": "Maneuvers", "oStanceTbl": "Stances" } // templates/manuevers.xml <?xml version="1.0" encoding="UTF-8"?> <LayoutContainer> <Iterate tagGroup="PWManList"> <Text align="center"> {~livename} {~textKey oManTbl} ({~field cIL}) </Text> <LayoutContainer direction="horizontal"> <Iterate tableIds="oManTbl, oStanceTbl"> <SheetTable groupByTag="sLevel"> <template:item> <TableCell align="left"> {~tags Ability} ({~tags ClsCountAs}) </TableCell> <TableCell>{~tags mLevel}</TableCell> <TableCell>{~field abSumm}</TableCell> </template:item> </SheetTable> </Iterate> </LayoutContainer> </Iterate> </LayoutContainer>
This would result in an arrangement with a "(whatever) Maneuvers (CL X)" header above two tables (arranged in a horizontal split on a large screen or sequentially on a small screen), each of which would have the appropriate header (automatically sourced from the file in the locales folder) and, for each pick, tag names for the ability and its level and the text of the ability summary field. No need to specify layout details, deal with text vs number field details, manually assemble string labels, etc.
The idea is to have something with easy text handling, declarative- rather than imperative-oriented, with minimal hassle dealing with loops and tables, and with anything beyond minimal layout control neither allowed nor needed (because of the need to reflow everything to fit on different screen sizes).
I guess I was hoping HL would get to the point where two different UI's would not be needed. With limited time I would really like to just write a UI once and use in both HLC/HLO but it sounds like that is not anytime soon.
Right now it's pretty simple: if you want Starfinder, get Hero Lab Online. If you want any other system, get Classic.I am new to Hero Lab and I am very curious as to which version I should get. It sounds almost like I would need to get a version that is purely for online use to be able to do anything with it. I am not always able to be online though— that or just not being in the mood to be— so is there a version I can use that has full functionality offline or what?
Right now it's pretty simple: if you want Starfinder, get Hero Lab Online. If you want any other system, get Classic.
Right now it's pretty simple: if you want Starfinder, get Hero Lab Online. If you want any other system, get Classic.
Is Classic a fully usable version for offline use?