Compare commits

...

4 Commits

30 changed files with 243 additions and 56 deletions

View File

@ -20,12 +20,14 @@ import {SpecialAbilityDataModel} from "./module/data/specialAbility.mjs";
import {SpecialAbilitySheet} from "./module/sheets/specialAbilitySheet.mjs";
import {ActiveEffectSheet} from "./module/sheets/ActiveEffectSheet.mjs";
import {ActiveEffectDataModel} from "./module/data/activeeffect.mjs";
import {Trefferzone, Wunde, Zonenruestung, Zonenwunde} from "./module/data/Trefferzone.js";
async function preloadHandlebarsTemplates() {
return loadTemplates([
// ui partials.
'systems/DSA_4-1/templates/ui/partial-rollable-button.hbs',
'systems/DSA_4-1/templates/ui/partial-rollable-weaponskill-button.hbs',
'systems/DSA_4-1/templates/ui/partial-rollable-language-button.hbs',
'systems/DSA_4-1/templates/ui/partial-attribute-button.hbs',
'systems/DSA_4-1/templates/ui/partial-talent-editable.hbs',
'systems/DSA_4-1/templates/ui/partial-die.hbs',
@ -42,7 +44,11 @@ async function preloadHandlebarsTemplates() {
Hooks.once("init", () => {
game.DSA41 = {
rollItemMacro
rollItemMacro,
Zonenruestung,
Zonenwunde,
Trefferzone,
Wunde
}
// Configure custom Document implementations.

View File

@ -0,0 +1,30 @@
export const Trefferzone = {
ARM_LINKS: "armlinks",
ARM_RECHTS: "armrechts",
BEIN_LINKS: "beinlinks",
BEIN_RECHTS: "beinrechts",
BAUCH: "bauch",
KOPF: "kopf",
BRUST: "brust"
}
export const Zonenruestung = {
...Trefferzone,
WAFFE_LINKS: "links",
WAFFE_RECHTS: "rechts",
FERNKAMPF: "fernkampf",
MUNITION: "munition",
RUECKEN: "ruecken",
}
export const Zonenwunde = {
ARM_LINKS: "Wunde linker Arm",
ARM_RECHTS: "Wunde rechter Arm",
BEIN_LINKS: "Wunde rechtes Bein",
BEIN_RECHTS: "Wunde rechtes Bein",
BAUCH: "Bauchwunde",
KOPF: "Kopfwunde",
BRUST: "Brustwunde",
}
export const Wunde = "Wunde"

View File

@ -59,6 +59,7 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
aktuell: new NumberField({required: true, integer: true, initial: 0}),
mod: new NumberField({required: true, integer: true}),
}),
ws: new NumberField({required: true, integer: true, initial: 0}),
attribute: new SchemaField({
mu: new SchemaField({
start: new NumberField({required: true, integer: true}),
@ -138,7 +139,7 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
beinlinks: new NumberField({required: true, integer: true, initial: 0}),
beinrechts: new NumberField({required: true, integer: true, initial: 0}),
bauch: new NumberField({required: true, integer: true, initial: 0}),
torso: new NumberField({required: true, integer: true, initial: 0}),
brust: new NumberField({required: true, integer: true, initial: 0}),
kopf: new NumberField({required: true, integer: true, initial: 0}),
}),
heldenausruestung: new ArrayField(
@ -180,9 +181,6 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
}
async _onCreate(data, options, userId) {
console.log(data, 'onCreate');
}
static getSlots() {

View File

@ -10,7 +10,7 @@ export class SkillDataModel extends BaseItem {
gruppe: new StringField({required: true}),
taw: new NumberField({integer: true, initial: 0}),
at: new NumberField({required: false, integer: true, initial: 0}),
pa: new NumberField({required: false, integer: true, initial: 0}),
pa: new NumberField({required: false, integer: true, nullable: true, initial: 0}),
probe: new ArrayField(new StringField(), {exact: 3}), // References one of the eight attributes by name
voraussetzung: new SchemaField({
talent: new StringField({model: SkillDataModel}),

View File

@ -1,5 +1,6 @@
import {importCharacter} from "../xml-import/xml-import.mjs";
import {LiturgyData} from "../data/miracle/liturgydata.mjs";
import {Zonenruestung, Zonenwunde} from "../data/Trefferzone.js";
export class Character extends Actor {
@ -95,7 +96,7 @@ export class Character extends Actor {
if (game.settings.get("DSA_4-1", "optional_ruestungzonen")) {
systemData.rs = {
torso: 0,
brust: 0,
bauch: 0,
armlinks: 0,
armrechts: 0,
@ -113,7 +114,7 @@ export class Character extends Actor {
systemData.wunden.max = ko / 2;
if (game.settings.get("DSA_4-1", "optional_trefferzonen")) {
systemData.wunden.kopf = 0;
systemData.wunden.torso = 0;
systemData.wunden.brust = 0;
systemData.wunden.bauch = 0;
systemData.wunden.armlinks = 0;
systemData.wunden.armrechts = 0;
@ -121,6 +122,7 @@ export class Character extends Actor {
systemData.wunden.beinrechts = 0;
}
systemData.ws = ko / 2;
// map current set to RS and BE
@ -129,7 +131,7 @@ export class Character extends Actor {
if (ausruestung.brust) {
systemData.be += systemData.parent.items.get(ausruestung.brust).system.armorHandicap ?? 0
if (game.settings.get("DSA_4-1", "optional_ruestungzonen")) {
systemData.rs.torso = systemData.parent.items.get(ausruestung.brust).system.armorValue ?? 0
systemData.rs.brust = systemData.parent.items.get(ausruestung.brust).system.armorValue ?? 0
} else {
systemData.rs += systemData.parent.items.get(ausruestung.brust).system.armorValue ?? 0
}
@ -242,4 +244,62 @@ export class Character extends Actor {
return data;
}
/**
*
* @param amount
* @param zone either null or one of
* @returns {Promise<void>}
*/
async takeDamage(amount = null, zone = null) {
this.prepareDerivedData()
const playWithZoneArmor = game.settings.get("DSA_4-1", "optional_ruestungzonen")
const playWithWoundZones = game.settings.get("DSA_4-1", "optional_trefferzonen")
const previousLeP = this.system.lep.aktuell;
if (amount == null) {
// TODO show Dialog for entering damage amount (TP)
}
let armorReduction = 0
let setEquipped = this.system.setEquipped
let woundThreshold = this.system.ws
if (playWithZoneArmor) {
const armorId = this.system.heldenausruestung[setEquipped][Zonenruestung[zone]]
const zoneArmor = await this.items.find(p => p._id === armorId)
if (!zoneArmor) {
return console.error(`zone "${zone}" is not a valid value`)
}
armorReduction = zoneArmor.system.armorValue ?? 0
} else {
armorReduction = this.system.rs
}
let damage = amount - armorReduction
let wounds = damage / woundThreshold
let wound = null
if (playWithWoundZones) {
wound = await game.packs.get("DSA_4-1.Wounds").index.find(p => p.name === Zonenwunde[zone])
if (!wound) {
return console.error(`Wunden Dokument zu "${zone}" konnten nicht gefunden werden`)
}
} else {
wound = await game.packs.get("DSA_4-1.Wounds").index.find(p => p.name === Wunde)
if (!wound) {
return console.error(`Wunden Dokument zu "${Wunde}" konnten nicht gefunden werden`)
}
}
// TODO this doesnt work yet, wound documents wont get expanded
for (let i = 0; i < wounds; i++) {
await this.createEmbeddedDocuments('Item', [wound])
}
await this.update({system: {lep: {aktuell: previousLeP - damage}}})
}
}

View File

@ -94,10 +94,22 @@ export class CharacterSheet extends ActorSheet {
eigenschaft2: werte[1].name,
eigenschaft3: werte[2].name,
probe: `(${eigenschaften.join("/")})`,
id: item._id,
at: item.system.at,
pa: item.system.pa,
id: item._id,
komplexität: item.system.komplexität
};
if (talentGruppe === "Kampf") {
if (item.system.pa != null) { // has no parry value so it must be ranged talent (TODO: but it isnt as there can be combatstatistics which has no pa value assigned to)
obj.at = item.system.at + context.derived.at.aktuell
obj.pa = item.system.pa + context.derived.pa.aktuell
} else {
obj.at = item.system.at + context.derived.fk.aktuell
}
}
context.skills[talentGruppe].push(obj);
context.flatSkills.push(obj);
}
@ -379,7 +391,6 @@ export class CharacterSheet extends ActorSheet {
const fkitems = fernkampf.system.rangedSkills.map(async (skillInQuestion) => await this.object.items.getName(skillInQuestion))
fkitems.forEach(async skill => {
const obj = await skill
console.log(this.object.system.fk, obj.system.at);
context.attacks.push({
name: obj.name,
using: fernkampf.name,

View File

@ -74,7 +74,7 @@ function getJsonFromXML(dom) {
return jsonResult;
}
async function addSkillFromCompendiumByNameToActor(talentName, taw, actor) {
async function addSkillFromCompendiumByNameToActor(talentName, taw, actor, combatStatistics, attributes) {
const compendiumOfSkills = game.packs.get('DSA_4-1.talente');
const talentId = compendiumOfSkills.index.find(skill => skill.name === talentName)
if (talentId) {
@ -83,7 +83,21 @@ async function addSkillFromCompendiumByNameToActor(talentName, taw, actor) {
try {
const embeddedDocument = (await actor.createEmbeddedDocuments('Item', [talent]))[0]
embeddedDocument.update({system: {taw: taw}});
if (talent.system.gruppe === "Kampf") {
const atbasis = attributes.find(p => p.name === "at").value
const pabasis = attributes.find(p => p.name === "pa").value
const combatStatistic = combatStatistics.find(p => p.name === talent.name)
if (combatStatistic) { // melee with AT/PA values
let at = combatStatistic.at - atbasis ?? 0
let pa = combatStatistic.pa - pabasis ?? 0
console.log({system: {taw, at, pa}})
embeddedDocument.update({system: {taw, at, pa}});
} else { // ranged with only AT values which is equal to taw
embeddedDocument.update({system: {taw: taw, at: taw, pa: null}}); // at is already at raw taw and wasn't influenced by helden-software precalculations
}
} else {
embeddedDocument.update({system: {taw: taw, at: null, pa: null}}); // just regular talent with taw
}
} catch (error) {
console.error(`${talentName} not found in items`, error)
}
@ -171,7 +185,7 @@ function calculateBirthdate(json) {
return `${day}. ${month} ${year} BF`
}
function mapSkills(actor, held) {
function mapSkills(actor, held, kampfwerte) {
for (let talent in held.talentliste.talent) {
talent = held.talentliste.talent[talent]
@ -191,7 +205,8 @@ function mapSkills(actor, held) {
} else {
// proceed
addSkillFromCompendiumByNameToActor(talent.name, talent.value, actor)
const eigenschaften = held.eigenschaften.eigenschaft
addSkillFromCompendiumByNameToActor(talent.name, talent.value, actor, kampfwerte, eigenschaften)
}
}
}
@ -333,10 +348,6 @@ function mapRawJson(actor, rawJson) {
json.sonderfertigkeiten = specialAbilities
json.liturgien = liturgies
mapSkills(actor, held)
mapSpells(actor, held)
mapMiracles(actor, liturgies)
let combatValues = []
for (let combatValue in held.kampf.kampfwerte) {
combatValue = held.kampf.kampfwerte[combatValue]
@ -347,6 +358,11 @@ function mapRawJson(actor, rawJson) {
})
}
json.kampfwerte = combatValues
mapSkills(actor, held, combatValues)
mapSpells(actor, held)
mapMiracles(actor, liturgies)
let notes = []
for (let note in held.kommentare) {
note = held.kommentare[note]

View File

@ -1,5 +1,5 @@
{
"name": "Lesen und Schreiben Asdharia",
"name": "Lesen/Schreiben Asdharia",
"gruppe": "Sprachen",
"probe": [
"KL",

View File

@ -1,5 +1,5 @@
{
"name": "Lesen und Schreiben Chrmk",
"name": "Lesen/Schreiben Chrmk",
"gruppe": "Sprachen",
"probe": [
"KL",

View File

@ -1,5 +1,5 @@
{
"name": "Lesen und Schreiben Geheiligte Glyphen von Unau",
"name": "Lesen/Schreiben Geheiligte Glyphen von Unau",
"gruppe": "Sprachen",
"probe": [
"KL",

View File

@ -1,5 +1,5 @@
{
"name": "Lesen und Schreiben Hjaldingsche Runen",
"name": "Lesen/Schreiben Hjaldingsche Runen",
"gruppe": "Sprachen",
"probe": [
"KL",

View File

@ -1,5 +1,5 @@
{
"name": "Lesen und Schreiben Isdira",
"name": "Lesen/Schreiben Isdira",
"gruppe": "Sprachen",
"probe": [
"KL",

View File

@ -1,5 +1,5 @@
{
"name": "Lesen und Schreiben Kusliker Zeichen",
"name": "Lesen/Schreiben Kusliker Zeichen",
"gruppe": "Sprachen",
"probe": [
"KL",

View File

@ -1,5 +1,5 @@
{
"name": "Lesen und Schreiben Nanduria",
"name": "Lesen/Schreiben Nanduria",
"gruppe": "Sprachen",
"probe": [
"KL",

View File

@ -1,5 +1,5 @@
{
"name": "Lesen und Schreiben Rogolan",
"name": "Lesen/Schreiben Rogolan",
"gruppe": "Sprachen",
"probe": [
"KL",

View File

@ -1,5 +1,5 @@
{
"name": "Lesen und Schreiben Tulamidya",
"name": "Lesen/Schreiben Tulamidya",
"gruppe": "Sprachen",
"probe": [
"KL",

View File

@ -1,5 +1,5 @@
{
"name": "Lesen und Schreiben Ur-Tulamidya",
"name": "Lesen/Schreiben Urtulamidya",
"gruppe": "Sprachen",
"probe": [
"KL",

View File

@ -1,5 +1,5 @@
{
"name": "Lesen und Schreiben Zhayad",
"name": "Lesen/Schreiben Zhayad",
"gruppe": "Sprachen",
"probe": [
"KL",

View File

@ -1,5 +1,5 @@
{
"name": "Wunde Rechter Arm",
"name": "Wunde rechter Arm",
"notes": "Nur für das Spiel mit Trefferzonen gedacht.<br/>Eine Waffe oder andere Auswirkung hat eine Wunde am rechten Arm verursacht",
"unique": false,
"image": "icons/skills/wounds/bone-broken-knee-beam.webp",

View File

@ -1,5 +1,5 @@
{
"name": "Wunde Linker Arm",
"name": "Wunde linker Arm",
"notes": "Nur für das Spiel mit Trefferzonen gedacht.<br/>Eine Waffe oder andere Auswirkung hat eine Wunde am linken Arm verursacht",
"unique": false,
"image": "icons/skills/wounds/bone-broken-knee-beam.webp",

View File

@ -1,5 +1,5 @@
{
"name": "Wunde Rechtes Bein",
"name": "Wunde rechtes Bein",
"notes": "Nur für das Spiel mit Trefferzonen gedacht.<br/>Eine Waffe oder andere Auswirkung hat eine Wunde am rechten Bein verursacht",
"unique": false,
"image": "icons/skills/wounds/bone-broken-knee-beam.webp",

View File

@ -1,5 +1,5 @@
{
"name": "Wunde Linkes Bein",
"name": "Wunde linkes Bein",
"notes": "Nur für das Spiel mit Trefferzonen gedacht.<br/>Eine Waffe oder andere Auswirkung hat eine Wunde am linken Bein verursacht",
"unique": false,
"image": "icons/skills/wounds/bone-broken-knee-beam.webp",

View File

@ -5,7 +5,7 @@
"image": "icons/skills/wounds/bone-broken-knee-beam.webp",
"effects": [
{
"key": "system.wunden.torso",
"key": "system.wunden.brust",
"mode": 2,
"value": "1",
"priority": 10

View File

@ -411,7 +411,7 @@
left: 136px
}
&.torso {
&.brust {
top: 86px;
left: 110px;
}
@ -461,7 +461,7 @@
left: 136px
}
&.torso {
&.brust {
top: 120px;
left: 110px;
}

View File

@ -1,15 +1,27 @@
$nachteil-color: #555753ff;
$nachteil-text-color: #FFFF;
$liturgie-color: #edd400ff;
$liturgie-text-color: #000F;
$zauber-color: #3465a4ff;
$zauber-text-color: #000F;
$talent-color: #f57900ff;
$talent-text-color: #000F;
$kampftalent-color: #cc0000ff;
$kampftalent-text-color: #FFFF;
$talent-body-color: #16bd6c;
$talent-body-text-color: #000;
$talent-nature-color: #46800d;
$talent-nature-text-color: #000;
$talent-social-color: #ae9809;
$talent-social-text-color: #000;
$talent-knowledge-color: #d319ba;
$talent-knowledge-text-color: #000;
$talent-language-color: #573bbc;
$talent-language-text-color: #fff;
$talent-crafting-color: #ae6813;
$talent-crafting-text-color: #000;
$harm-fill-color: #ff0000ff;
$harm-border-color: #3c0000ff;

View File

@ -5,6 +5,10 @@
columns: 2;
column-gap: 20px;
.talent-group {
break-inside: avoid-column;
}
ul {
list-style-type: none;
padding-left: 0;

View File

@ -3,7 +3,6 @@
@use "_colours" as colour;
@use "_numbers" as numbers;
$rollable_colours: (
"nachteil": colour.$nachteil-color,
"talent": colour.$talent-color,
@ -17,6 +16,20 @@ $rollable_colours: (
"liturgie": colour.$liturgie-color,
"zauber": colour.$zauber-color,
);
$rollable_colours_font: (
"nachteil": colour.$nachteil-text-color,
"talent": colour.$talent-text-color,
"Körperlich": colour.$talent-body-text-color,
"Natur": colour.$talent-nature-text-color,
"Gesellschaft": colour.$talent-social-text-color,
"Wissen": colour.$talent-knowledge-text-color,
"Sprachen": colour.$talent-language-text-color,
"Handwerk": colour.$talent-crafting-text-color,
"kampf": colour.$kampftalent-text-color,
"liturgie": colour.$liturgie-text-color,
"zauber": colour.$zauber-text-color,
);
.dsa41.sheet.actor.character {
.block.rollable {
@ -152,10 +165,16 @@ $rollable_colours: (
@mixin coloring($name) {
$color: map.get($rollable_colours, $name);
$font_color: map.get($rollable_colours_font, $name);
.#{$name}.rollable {
.die {
stroke-width: 0.5;
span.value {
color: $font_color;
}
.border {
fill: colour.$rollable-die-border-color;
stroke: colour.$rollable-die-border-color;

View File

@ -310,14 +310,14 @@
<label>Lebensenergie:</label>
<input type="number" name="system.lep.aktuell" value="{{actor.system.lep.aktuell}}"/>
<span class="inline">von</span>
<input type="number" name="system.lep.max" value="{{actor.system.lep.max}}"/>
<input type="number" disabled value="{{actor.system.lep.max}}"/>
</div>
{{#if ausdauer}}
<div class="ausdauer">
<label>Ausdauerpunkte:</label>
<input type="number" name="system.aup.aktuell" value="{{actor.system.aup.aktuell}}"/>
<span class="inline">von</span>
<input type="number" name="system.aup.max" value="{{actor.system.aup.max}}"/>
<input type="number" disabled value="{{actor.system.aup.max}}"/>
</div>
{{/if}}
{{#if (not zonenruestung)}}
@ -371,7 +371,7 @@
</svg>
{{#if trefferzonen}}
<span class="wound kopf">{{derived.wunden.kopf}}</span>
<span class="wound torso">{{derived.wunden.torso}}</span>
<span class="wound brust">{{derived.wunden.brust}}</span>
<span class="wound armlinks">{{derived.wunden.armlinks}}</span>
<span class="wound armrechts">{{derived.wunden.armrechts}}</span>
<span class="wound bauch">{{derived.wunden.bauch}}</span>
@ -380,7 +380,7 @@
{{/if}}
{{#if zonenruestung}}
<span class="armor kopf">{{derived.rs.kopf}}</span>
<span class="armor torso">{{derived.rs.torso}}</span>
<span class="armor brust">{{derived.rs.brust}}</span>
<span class="armor armlinks">{{derived.rs.armlinks}}</span>
<span class="armor armrechts">{{derived.rs.armrechts}}</span>
<span class="armor bauch">{{derived.rs.bauch}}</span>
@ -393,7 +393,7 @@
</div>
<div class="tab skills" data-group="primary" data-tab="skills">
<div>
<div class="talent-group">
<h2>Kampftalente</h2>
<ul>
{{#each skills.Kampf}}
@ -403,7 +403,7 @@
{{/each}}
</ul>
</div>
<div>
<div class="talent-group">
<h2>Körperliche Talente</h2>
<ul>
<li>
@ -414,7 +414,7 @@
{{/each}}
</ul>
</div>
<div>
<div class="talent-group">
<h2>Gesellschaftliche Talente</h2>
<ul>
<li>
@ -425,7 +425,7 @@
{{/each}}
</ul>
</div>
<div>
<div class="talent-group">
<h2>Natur Talente</h2>
<ul>
<li>
@ -436,7 +436,7 @@
{{/each}}
</ul>
</div>
<div>
<div class="talent-group">
<h2>Wissenstalente</h2>
<ul>
<li>
@ -447,23 +447,23 @@
{{/each}}
</ul>
</div>
<div>
<div class="talent-group">
<h2>Schriften & Sprachen</h2>
<ul>
<li>
{{#each skills.Schriften}}
<li>
{{> "systems/DSA_4-1/templates/ui/partial-rollable-button.hbs" this}}
{{> "systems/DSA_4-1/templates/ui/partial-rollable-language-button.hbs" this}}
</li>
{{/each}}
{{#each skills.Schriften}}
{{#each skills.Sprachen}}
<li>
{{> "systems/DSA_4-1/templates/ui/partial-rollable-button.hbs" this}}
{{> "systems/DSA_4-1/templates/ui/partial-rollable-language-button.hbs" this}}
</li>
{{/each}}
</ul>
</div>
<div>
<div class="talent-group">
<h2>Handwerkliche Talente</h2>
<ul>
<li>
@ -544,11 +544,11 @@
<label>AsP:</label>
<input type="number" name="system.asp.aktuell" value="{{system.asp.aktuell}}"/>
<span class="inline">von</span>
{{derived.asp.max}}
<input type="number" disabled value="{{derived.asp.max}}"/>
</div>
<div class="mr">
<label>MR: </label>
{{derived.mr.aktuell}}
<input type="number" disabled value="{{derived.mr.aktuell}}"/>
</div>
</div>
@ -594,7 +594,7 @@
<label>KaP:</label>
<input type="number" name="system.kap.aktuell" value="{{system.kap.aktuell}}"/>
<span class="inline">von</span>
{{derived.kap.max}}
<input type="number" disabled value="{{derived.kap.max}}"/>
</div>
</div>

View File

@ -0,0 +1,29 @@
<div class="block rollable {{this.type}} {{this.gruppe}}" data-item-id="{{this.id}}" data-id="{{this.id}}"
data-taw="{{this.taw}}"
data-name="{{this.name}}" data-eigenschaft1="{{this.eigenschaft1}}" data-eigenschaft2="{{this.eigenschaft2}}"
data-eigenschaft3="{{this.eigenschaft3}}" data-rollEigenschaft1="{{this.rollEigenschaft1}}"
data-rollEigenschaft2="{{this.rollEigenschaft2}}" data-rollEigenschaft3="{{this.rollEigenschaft3}}">
<div class="die">
{{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }}
<span class="value">{{#if this.taw}}
{{this.taw}}
{{else}}
{{#if this.liturgiekenntnis}}
<img src="{{this.liturgiekenntnis}}"/>
{{/if}}
{{/if}}
</span>
</div>
<div class="container">
<span class="name" data-id="{{this.id}}">{{this.name}}</span>
<div class="werte">
<div class="eigenschaft"><span class="name">Komp</span><span
class="value">{{this.komplexität}}</span></div>
{{#each this.werte}}
<div class="eigenschaft"><span class="name">{{this.name}}</span><span
class="value">{{this.value}}</span></div>
{{/each}}
</div>
</div>
</div>

View File

@ -19,7 +19,9 @@
<div class="werte">
<div class="eigenschaft"><span class="name">AT</span><span class="value">{{this.at}}</span></div>
<div class="eigenschaft"><span class="name">PA</span><span class="value">{{this.pa}}</span></div>
{{#if this.pa}}
<div class="eigenschaft"><span class="name">PA</span><span class="value">{{this.pa}}</span></div>
{{/if}}
</div>
</div>
</div>