{if $charm->isAbstract()} {foreach from=$charm->getConcretizations() item=uri}
{/foreach} {/if}

{$charm->getName(true)}

{if $charm->isAbstract()}
{$ontology->getLabel('http://www.pipian.com/rdf/exalted/ontology#AbstractCharm')}
{/if}
{if $charm->getGenericType()}{if $charm->getExaltType()}{$ontology->getLabel($charm->getExaltType())}{/if}{$ontology->getLabel($charm->getGenericType())}{else}{$exalt.name}, {$stat.name}{/if}
{if !is_null($charm->getBrendanism())}
Brendanism: {$charm->getBrendanism()|escape}
{/if}
Cost: {if $charm->isPermanent()}—{if $charm->hasNonZeroCost()} ({/if}{/if}{foreach from=$charm->getCosts() item=cost name=cost}{if $smarty.foreach.cost.first}{/if}{if !$smarty.foreach.cost.first || !$smarty.foreach.cost.last}{if $smarty.foreach.cost.first}{/if}{/if}hasNonZeroCost() && (($smarty.foreach.cost.first && $cost->getEssenceMoteCost() > 0) || (!$smarty.foreach.cost.first && !$charm->hasConstantNonZeroWillpowerCost() && !$charm->hasConstantNonZeroEssenceMoteCost()))) || (!$charm->hasNonZeroCost() && !$charm->isPermanent())}>{$cost->getEssenceMoteCost()}{else} content="{$cost->getEssenceMoteCost()}">{/if}{if ($charm->hasNonZeroCost() && (($smarty.foreach.cost.first && $cost->getEssenceMoteCost() > 0) || (!$smarty.foreach.cost.first && !$charm->hasConstantNonZeroWillpowerCost() && !$charm->hasConstantNonZeroEssenceMoteCost()))) || (!$charm->hasNonZeroCost() && !$charm->isPermanent())}m{/if}{if $charm->hasNonZeroCost() && !$smarty.foreach.cost.last && $charm->hasConstantNonZeroWillpowerCost()}+{/if}{if $cost->getWillpowerCost() > 0 || (count($charm->getCosts()) > 1 && !$charm->hasConstantWillpowerCost())}{if $charm->hasNonZeroCost() && ($smarty.foreach.cost.first || (!$charm->hasConstantNonZeroWillpowerCost() && !$charm->hasConstantNonZeroEssenceMoteCost()))}, {/if}hasNonZeroCost() && ($smarty.foreach.cost.first || !$charm->hasConstantNonZeroWillpowerCost())}>{$cost->getWillpowerCost()}{else} content="{$cost->getWillpowerCost()}">{/if}{if $charm->hasNonZeroCost() && ($smarty.foreach.cost.first || !$charm->hasConstantNonZeroWillpowerCost())}wp{/if}{/if}{if $cost->getExperiencePointCost() > 0}{if $charm->hasNonZeroCost() && ($smarty.foreach.cost.first || !$charm->hasConstantNonZeroWillpowerCost())}, {/if}hasNonZeroCost() && ($smarty.foreach.cost.first || !$charm->hasConstantNonZeroWillpowerCost())}>{$cost->getExperiencePointCost()}{else} content="{$cost->getExperiencePointCost()}">{/if}{if $charm->hasNonZeroCost() && ($smarty.foreach.cost.first || !$charm->hasConstantNonZeroWillpowerCost())}xp{/if}{/if}{if $cost->getHealthLevelCost() > 0}{if $charm->hasNonZeroCost() && ($smarty.foreach.cost.first || !$charm->hasConstantNonZeroWillpowerCost())}, {/if}hasNonZeroCost() && ($smarty.foreach.cost.first || !$charm->hasConstantNonZeroWillpowerCost())}>{$cost->getHealthLevelCost()}{else} content="{$cost->getHealthLevelCost()}">{/if}{if $charm->hasNonZeroCost() && ($smarty.foreach.cost.first || !$charm->hasConstantNonZeroWillpowerCost())}hl{/if}{/if}{if $cost->hasEssenceRestriction()}getEssence())}property{else}rel{/if}="exalt:essence"{if !is_null($cost->getEssence())} datatype="xsd:integer" content="{$cost->getEssence()}">{else}>{if !is_null($cost->getMinimumEssence())}{/if}{/if}{/if}{if !$smarty.foreach.cost.first || !$smarty.foreach.cost.last}{if $smarty.foreach.cost.first}{/if}{/if}{if !$smarty.foreach.cost.last && !$charm->hasConstantNonZeroWillpowerCost() && $cost->getEssenceMoteCost() > 0} or {else}{if !$smarty.foreach.cost.last && $cost->getEssenceMoteCost() == 0}+{/if}{if !$cost->isPerInvocation() && $smarty.foreach.cost.last} {$ontology->getLabel($cost->getCostQuantum())}{/if}{/if}{if $smarty.foreach.cost.last}{/if}{/foreach}{if $charm->isPermanent() && $charm->hasNonZeroCost()}){/if}; Mins: {foreach from=$charm->getAbilities() key=property item=value}{$ontology->getLabel($property)} {$value}, {/foreach}Essence {$charm->getEssence()}; Type: <{if $ontology->getDescription($charm->getCharmType()) == ''}span{else}abbr{/if} rel="{if $charm->isAbstract()}rdfs:subClassOf{else}rdf:type{/if}" resource="{$charm->getCharmType()}"{if $ontology->getDescription($charm->getCharmType()) != ''} title="{$ontology->getDescription($charm->getCharmType())|escape}"{/if}>{$ontology->getLabel($charm->getCharmType())}getDescription($charm->getCharmType()) == ''}span{else}abbr{/if}>{if $charm->hasTypePropertyAfter() || count($charm->getSubtypes()) > 0} ({if !is_null($charm->getSpeed())}Speed {$charm->getSpeed()}{if $charm->hasTypePropertyAfter('speed')}, {/if}{/if}{if !is_null($charm->getLongTickSpeed())}Speed {$charm->getLongTickSpeed()} in long ticks{if $charm->hasTypePropertyAfter('longTickSpeed')}, {/if}{/if}{if !is_null($charm->getStep())}Step {if is_array($charm->getStep())}{foreach from=$charm->getStep() item=step name=step}{$step}{if !$smarty.foreach.step.last} or {/if}{/foreach}{else}{$charm->getStep()}{/if}{if $charm->hasTypePropertyAfter('step')}, {/if}{/if}{if !is_null($charm->getAttackerStep())}Step {if is_array($charm->getAttackerStep())}{foreach from=$charm->getAttackerStep() item=step name=step}{$step}{if !$smarty.foreach.step.last} or {/if}{/foreach}{else}{$charm->getAttackerStep()} for attacker{/if}{if $charm->hasTypePropertyAfter('attackerStep')}, {/if}{/if}{if !is_null($charm->getDefenderStep())}Step {if is_array($charm->getDefenderStep())}{foreach from=$charm->getDefenderStep() item=step name=step}{$step}{if !$smarty.foreach.step.last} or {/if}{/foreach}{else}{$charm->getDefenderStep()} for defender{/if}{if $charm->hasTypePropertyAfter('defenderStep')}, {/if}{/if}{if !is_null($charm->getDV())}DV {$charm->getDV()}{if count($charm->getSubtypes()) > 0}, {/if}{/if}{foreach from=$charm->getSubtypes() item=subtype name=subtype}<{if $ontology->getDescription($subtype) == ''}span{else}abbr{/if} rel="{if $charm->isAbstract()}rdfs:subClassOf{else}rdf:type{/if}" resource="{$subtype}"{if $ontology->getDescription($subtype) != ''} title="{$ontology->getDescription($subtype)|escape}"{/if}>{$ontology->getLabel($subtype)}getDescription($subtype) == ''}span{else}abbr{/if}>{if !$smarty.foreach.subtype.last}, {/if}{/foreach}){/if}
Keywords: {foreach from=$charm->getKeywords() item=keyword name=keyword}<{if $ontology->getDescription($keyword) == ''}span{else}abbr{/if} rel="{if $charm->isAbstract()}rdfs:subClassOf{else}rdf:type{/if}" resource="{$keyword}"{if $ontology->getDescription($keyword) != ''} title="{$ontology->getDescription($keyword)|escape}"{/if}>{$ontology->getLabel($keyword)}getDescription($keyword) == ''}span{else}abbr{/if}>{if !$smarty.foreach.keyword.last || count($charm->getMartialAbilities()) > 0 || count($charm->getMartialReadyAbilities()) > 0 || count($charm->getMergedCharms()) > 0 || !is_null($charm->getEnhancement()) || (!is_null($charm->getMirrorCharm()) && array_key_exists($charm->getMirrorCharm(), $charmsByURI))}, {/if}{foreachelse}{if count($charm->getMartialAbilities()) == 0 && count($charm->getMartialReadyAbilities()) == 0 && count($charm->getMergedCharms()) == 0 && is_null($charm->getEnhancement()) && (is_null($charm->getMirrorCharm()) || !array_key_exists($charm->getMirrorCharm(), $charmsByURI))}None{/if}{/foreach}{if count($charm->getMartialAbilities()) > 0}Martial{if count($charm->getMartialReadyAbilities()) > 0 || count($charm->getMergedCharms()) > 0 || !is_null($charm->getEnhancement()) || (!is_null($charm->getMirrorCharm()) && array_key_exists($charm->getMirrorCharm(), $charmsByURI))}, {/if}{/if}{if count($charm->getMartialReadyAbilities()) > 0}Martial-ready{if count($charm->getMergedCharms()) > 0 || !is_null($charm->getEnhancement()) || (!is_null($charm->getMirrorCharm()) && array_key_exists($charm->getMirrorCharm(), $charmsByURI))}, {/if}{/if}{if count($charm->getMergedCharms()) > 0}Merged{if !is_null($charm->getEnhancement()) || (!is_null($charm->getMirrorCharm()) && array_key_exists($charm->getMirrorCharm(), $charmsByURI))}, {/if}{/if}{if !is_null($charm->getEnhancement())}Enhanced{if !is_null($charm->getMirrorCharm()) && array_key_exists($charm->getMirrorCharm(), $charmsByURI)}, {/if}{/if}{if !is_null($charm->getMirrorCharm()) && array_key_exists($charm->getMirrorCharm(), $charmsByURI)}Mirror ({$charmsByURI[$charm->getMirrorCharm()]->getName()}){/if}
Duration: {if $charm->isPermanent() && is_null($charm->getDuration())}N/A{else}{$ontology->getLabel($charm->getDuration())}{/if}
Prerequisite Charms: {foreach from=$charm->getPrereqs() item=prereq name=prereq}{if count($prereq) == 1}{if $charmsByURI[$prereq[0]] instanceof ExcellencySet}{else}{if $charmsByURI[$prereq[0]] instanceof ExcellencySetPair}{else}{/if}{/if}{if $charmsByURI[$prereq[0]]->isAbstract()}Appropriate {/if}{$charmsByURI[$prereq[0]]->getName()}{if $charmsByURI[$prereq[0]] instanceof ExcellencySet}{else}{if $charmsByURI[$prereq[0]] instanceof ExcellencySetPair}{/if}{/if}{/if}{if !$smarty.foreach.prereq.last}, {/if}{foreachelse}None{/foreach}
Incompatible Charms: {foreach from=$charm->getIncompats() item=incompat name=incompat}{if count($incompat) == 1}{if $charmsByURI[$incompat[0]] instanceof ExcellencySet}{else}{if $charmsByURI[$incompat[0]] instanceof ExcellencySetPair}{else}{/if}{/if}{if $charmsByURI[$incompat[0]]->isAbstract()}Appropriate {/if}{$charmsByURI[$incompat[0]]->getName()}{if $charmsByURI[$incompat[0]] instanceof ExcellencySet}{else}{if $charmsByURI[$incompat[0]] instanceof ExcellencySetPair}{/if}{/if}{/if}{if !$smarty.foreach.incompat.last}, {/if}{foreachelse}None{/foreach}
{$charm->getTagline()}
{$charm->getDescription()}
{if !is_null($charm->getEnhancement())}

Enhancement: {$charm->getEnhancement()}

{/if} {if count($charm->getMartialAbilities()) > 0}

Martial: {foreach from=$charm->getMartialAbilities() item=ability name=ability}{$ontology->getLabel($ability)}{if !$smarty.foreach.ability.last}, {/if}{/foreach}.{if !is_null($charm->getMartialDescription())} {$charm->getMartialDescription()}{/if}

{/if} {if count($charm->getMartialReadyAbilities()) > 0}

Martial-ready: {foreach from=$charm->getMartialReadyAbilities() item=ability name=ability}{$ontology->getLabel($ability)}{if !$smarty.foreach.ability.last}, {/if}{/foreach}.{if !is_null($charm->getMartialReadyDescription())} {$charm->getMartialReadyDescription()}{/if}

{/if} {if count($charm->getMergedCharms()) > 0}

Merged: {foreach from=$charm->getMergedCharms() item=mergedCharm name=mergedCharm}{$charmsByURI[$mergedCharm]->getName()} ({$ontology->getLabel($charmsByURI[$mergedCharm]->getStatClass())}){if !$smarty.foreach.mergedCharm.last}, {/if}{/foreach}.

{/if} {if !is_null($charm->getErrata())}
{$charm->getErrata()}
{/if}
{$ontology->getShortTitle($charm->getSourceBook())}, p{if $charm->getPageStart() != $charm->getPageEnd()}p{/if}. {$charm->getPageStart()}{if $charm->getPageStart() != $charm->getPageEnd()}–{$charm->getPageEnd()}{else}{/if}{if !is_null($charm->getErrataPageStart())}, 2E Errata, p{if $charm->getErrataPageStart() != $charm->getErrataPageEnd()}p{/if}. {$charm->getErrataPageStart()}{if $charm->getErrataPageStart() != $charm->getErrataPageEnd()}–{$charm->getErrataPageEnd()}{else}{/if}{/if}{if !is_null($charm->getSecondPageStart())}, {$ontology->getShortTitle($charm->getSecondSourceBook())}, p{if $charm->getSecondPageStart() != $charm->getSecondPageEnd()}p{/if}. {$charm->getSecondPageStart()}{if $charm->getSecondPageStart() != $charm->getSecondPageEnd()}–{$charm->getSecondPageEnd()}{else}{/if}{/if}