diff --git a/src/module/data/specialAbility.mjs b/src/module/data/specialAbility.mjs index bfadbd4d..bea1f928 100644 --- a/src/module/data/specialAbility.mjs +++ b/src/module/data/specialAbility.mjs @@ -71,6 +71,19 @@ export class SpecialAbilityDataModel extends BaseItem { } } + getActiveMod(options) { + if (this.isActive(options)) { + if (this.value && this.auswahl.find(p => p.name === this.value)) { + const auswahl = this.auswahl.find(p => p.name === this.value) + return auswahl.mod + } else { + this.mod + } + } else { + return [] + } + } + isActive(options) { const requirements = this.#getRequirements() @@ -78,88 +91,93 @@ export class SpecialAbilityDataModel extends BaseItem { let passes = true let mod = 0 - const flatActor = foundry.utils.flattenObject(this.parent.actor.system) - for (let requirement of requirements) { + if (this.parent?.actor) { + const flatActor = foundry.utils.flattenObject(this.parent.actor.system) + for (let requirement of requirements) { - let targetField = null + let targetField = null - if (requirement.attribute) { - targetField = flatActor?.[requirement.attribute.toLocaleLowerCase()] - } - if (requirement.talent) { - targetField = this.parent.actor.itemTypes["Skill"].find(p => p.name.toLocaleLowerCase() === requirement.talent.toLocaleLowerCase()).taw - } - if (requirement.minValue) { - passes = requirement.minValue <= targetField - if (!passes) console.log(`fails requirement ${requirement.attribute ?? requirement.talent} (${requirement.minValue} <= ${targetField})`) - } - if (requirement.maxValue) { - passes = targetField <= requirement.maxValue - if (!passes) console.log(`fails requirement ${requirement.attribute ?? requirement.talent} (${targetField} <= ${requirement.maxValue})`) - } - if (requirement.sonderfertigkeit) { - passes = this.parent.actor.itemTypes["SpecialAbility"].find(p => p.name === requirement.sonderfertigkeit) != undefined - if (!passes) console.log(`fails requirement ${requirement.sonderfertigkeit} (not in possession)`) - } - if (requirement["compare"]) { - const {ownAttribute, operation, targetAttribute} = requirement["compare"] - if (options.target) { - const flatTarget = foundry.utils.flattenObject(options.target.system) - const foreignTargetField = flatTarget[targetAttribute] - const ourTargetField = flatActor[ownAttribute] - switch (operation) { - case "lt": - passes = ourTargetField < foreignTargetField; - break; - case "lte": - passes = ourTargetField <= foreignTargetField; - break; - case "eq": - passes = ourTargetField == foreignTargetField; - break; - case "neq": - passes = ourTargetField != foreignTargetField; - break; - case "gte": - passes = ourTargetField >= foreignTargetField; - break; - case "gt": - passes = ourTargetField > foreignTargetField; - break; + if (requirement.attribute) { + targetField = flatActor?.[requirement.attribute.toLocaleLowerCase()] + } + if (requirement.talent) { + targetField = this.parent.actor.itemTypes["Skill"].find(p => p.name.toLocaleLowerCase() === requirement.talent.toLocaleLowerCase()).taw + } + if (requirement.minValue) { + passes = requirement.minValue <= targetField + if (!passes) console.debug(`fails requirement ${requirement.attribute ?? requirement.talent} (${requirement.minValue} <= ${targetField})`) + } + if (requirement.maxValue) { + passes = targetField <= requirement.maxValue + if (!passes) console.debug(`fails requirement ${requirement.attribute ?? requirement.talent} (${targetField} <= ${requirement.maxValue})`) + } + if (requirement.sonderfertigkeit) { // FIXME fails when it tries to self reference itself e.g. Ausweichen II has Ausweichen I as requirement + const regexp = /(\w*)\W?(\w*)?/ + const [variantName, baseAbility, level] = regexp.exec(requirement.sonderfertigkeit) + + passes = this.parent.actor.itemTypes["SpecialAbility"].find(p => p.name === baseAbility) != undefined + if (!passes) console.debug(`fails requirement ${requirement.sonderfertigkeit} (not in possession)`) + } + if (requirement["compare"]) { + const {ownAttribute, operation, targetAttribute} = requirement["compare"] + if (options.target) { + const flatTarget = foundry.utils.flattenObject(options.target.system) + const foreignTargetField = flatTarget[targetAttribute] + const ourTargetField = flatActor[ownAttribute] + switch (operation) { + case "lt": + passes = ourTargetField < foreignTargetField; + break; + case "lte": + passes = ourTargetField <= foreignTargetField; + break; + case "eq": + passes = ourTargetField == foreignTargetField; + break; + case "neq": + passes = ourTargetField != foreignTargetField; + break; + case "gte": + passes = ourTargetField >= foreignTargetField; + break; + case "gt": + passes = ourTargetField > foreignTargetField; + break; + } + if (!passes) { + console.debug(`fails compare requirement ${ownAttribute} ${operation} ${targetAttribute}`) + } + } else { + console.debug(`fails compare requirement as no target has been selected`) + return false // cant pass as we dont have a target } - if (!passes) { - console.log(`fails compare requirement ${ownAttribute} ${operation} ${targetAttribute}`) - } - } else { - console.log(`fails compare requirement as no target has been selected`) - return false // cant pass as we dont have a target + } + if (!passes) { + console.debug("fails atleast 1 requirement of ", this) + break } } - if (!passes) { - console.log("fails atleast 1 requirement of ", this) - break - } - } - console.log(this.name, "requirements", passes) - if (passes) { - if (options?.weapon) { - for (const waff of this.waffenLimit) { - if (waff.waffe) { - passes = options?.weapon?.name === waff.waffe ?? false - if (waff.mod) mod = waff.mod - if (passes) - break - } - if (waff.gruppe) { - passes = options?.skill?.name === waff.gruppe ?? false - if (waff.mod) mod = waff.mod - if (passes) - break + if (passes) { + if (options?.weapon) { + for (const waff of this.waffenLimit) { + if (waff.waffe) { + passes = options?.weapon?.name === waff.waffe ?? false + if (waff.mod) mod = waff.mod + if (passes) + break + } + if (waff.gruppe) { + passes = options?.skill?.name === waff.gruppe ?? false + if (waff.mod) mod = waff.mod + if (passes) + break + } } } } + + } - console.log("return value", {passes, mod}) return {passes, mod} } } diff --git a/src/module/sheets/character/advsf.mjs b/src/module/sheets/character/advsf.mjs index 018cbf53..878225e9 100644 --- a/src/module/sheets/character/advsf.mjs +++ b/src/module/sheets/character/advsf.mjs @@ -28,7 +28,7 @@ export default { actorData.itemTypes.SpecialAbility.forEach((item) => { context.specialAbilities.push({ id: item._id, - name: item.name, + name: item.system.value ? item.system.value : item.name, }); } ); diff --git a/src/module/sheets/specialAbilitySheet.mjs b/src/module/sheets/specialAbilitySheet.mjs index 42990926..f12dc7d7 100644 --- a/src/module/sheets/specialAbilitySheet.mjs +++ b/src/module/sheets/specialAbilitySheet.mjs @@ -4,7 +4,7 @@ export class SpecialAbilitySheet extends HandlebarsApplicationMixin(DocumentShee /** @inheritDoc */ static DEFAULT_OPTIONS = { - position: {width: 520, height: 480}, + position: {width: 520, height: 600}, classes: ['dsa41', 'sheet', 'item', 'specialability'], tag: 'form', form: { @@ -57,6 +57,20 @@ export class SpecialAbilitySheet extends HandlebarsApplicationMixin(DocumentShee context.flags = specialabilityData.flags; context.text = specialabilityData.system.text; context.aktionsText = specialabilityData.system.aktionsText; + context.hasChoices = context.system.auswahl.length > 0; + context.choices = {} + context.value = context.system.value + context.system.auswahl.forEach(a => { + context.choices[a.name] = a.name + }) + context.isActive = this.document.system.isActive()?.passes + context.mod = this.document.system.getActiveMod()?.map(mod => { + return { + name: mod.name, + value: mod.value > 0 ? "+" + mod.value : mod.value, + } + }) + context.hasModality = context.system.value != null return context; } diff --git a/src/module/xml-import/xml-import.mjs b/src/module/xml-import/xml-import.mjs index ee97067c..665984dd 100644 --- a/src/module/xml-import/xml-import.mjs +++ b/src/module/xml-import/xml-import.mjs @@ -321,7 +321,7 @@ export class XmlImport { #getAttributeJson(attributes, name) { let attribute = this.#filterAttribute(attributes, name) return { - start: parseInt(attribute.startwert), + start: parseInt(attribute.value), aktuell: parseInt(attribute.value), mod: parseInt(attribute.mod), } @@ -564,10 +564,21 @@ export class XmlImport { } specialAbilities.forEach((specialAbility) => { const compendiumOfSF = game.packs.get('DSA_4-1.sonderfertigkeiten'); - const sfId = compendiumOfSF?.index.find(sf => sf.name === specialAbility.name) + const regexp = /(\w*)\W?(\w*)?/ + const [variantName, baseAbility, level] = regexp.exec(specialAbility.name) + const sfId = compendiumOfSF?.index.find(sf => sf.name === baseAbility) if (sfId) { - compendiumOfSF.getDocument(sfId._id).then(sf => actor.createEmbeddedDocuments('Item', [sf])) + if (variantName) { + console.log(baseAbility + " to be imported as " + variantName) // TODO if baseAbility already imported, adjust its level instead of adding a new embeddedDocument + } + compendiumOfSF.getDocument(sfId._id).then(sf => { + actor.createEmbeddedDocuments('Item', [sf]).then(_ => { + actor.itemTypes["SpecialAbility"].find(p => p.name === baseAbility).update({ + "system.value": variantName + }) + }) + }) } else { actor.createEmbeddedDocuments('Item', [ new SpecialAbility({ diff --git a/src/style/molecules/_rows-and-columns.scss b/src/style/molecules/_rows-and-columns.scss new file mode 100644 index 00000000..a49678d8 --- /dev/null +++ b/src/style/molecules/_rows-and-columns.scss @@ -0,0 +1,19 @@ +.row { + display: flex; + flex-direction: row; + gap: 8px; + + > * { + flex: 1; + } +} + +.column { + display: flex; + flex-direction: column; + gap: 8px; + + > * { + flex: 1; + } +} \ No newline at end of file diff --git a/src/style/styles.scss b/src/style/styles.scss index 80d733a7..208a171a 100644 --- a/src/style/styles.scss +++ b/src/style/styles.scss @@ -6,6 +6,7 @@ @use "molecules/lists"; @use "molecules/attributes"; @use "molecules/sidebar-elements"; +@use "molecules/rows-and-columns"; @use "molecules/tabs"; @use "molecules/paperdoll"; diff --git a/src/templates/item/advantage/tab-advantage.hbs b/src/templates/item/advantage/tab-advantage.hbs index 2b11c313..543d1efa 100644 --- a/src/templates/item/advantage/tab-advantage.hbs +++ b/src/templates/item/advantage/tab-advantage.hbs @@ -1,11 +1,11 @@
-
- - - -
+
+
+ + +
{{#if hasModality}}
@@ -18,6 +18,7 @@ {{/if}}
{{/if}} +
+
- + +
+ {{#if hasModality}} +
+ + {{#if hasChoices}} + + {{else}} + + {{/if}} +
+ {{/if}}
@@ -29,7 +43,12 @@ {{{text}}}
+
+ {{#each mod}} + {{this.name}} {{this.value}} + {{/each}} +
-
\ No newline at end of file +
\ No newline at end of file