diff --git a/lang/en.json b/lang/en.json index b1441032..02ea41eb 100755 --- a/lang/en.json +++ b/lang/en.json @@ -486,14 +486,10 @@ "name": "Impenetrable", "description": "Once per short rest, when you would mark your last Hit Point, you can instead mark a Stress." }, - "magic": { - "name": "Magic", + "magical": { + "name": "Magical", "description": "You can't mark an Armor Slot to reduce physical damage." }, - "painful": { - "name": "Painful", - "description": "Each time you mark an Armor Slot, you must mark a Stress." - }, "physical": { "name": "Physical", "description": "You can't mark an Armor Slot to reduce magic damage." @@ -897,6 +893,10 @@ "name": "Scary", "description": "On a successful attack, the target must mark a Stress." }, + "selfCorrecting": { + "name": "Self Correcting", + "description": "When you roll a 1 on a damage die, it deals 6 damage instead." + }, "serrated": { "name": "Serrated", "description": "When you roll a 1 on a damage die, it deals 8 damage instead." diff --git a/module/applications/dialogs/damageReductionDialog.mjs b/module/applications/dialogs/damageReductionDialog.mjs index 3d33f2a3..0612089d 100644 --- a/module/applications/dialogs/damageReductionDialog.mjs +++ b/module/applications/dialogs/damageReductionDialog.mjs @@ -3,7 +3,7 @@ import { damageKeyToNumber, getDamageLabel } from '../../helpers/utils.mjs'; const { DialogV2, ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; export default class DamageReductionDialog extends HandlebarsApplicationMixin(ApplicationV2) { - constructor(resolve, reject, actor, damage) { + constructor(resolve, reject, actor, damage, damageType) { super({}); this.resolve = resolve; @@ -11,37 +11,46 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap this.actor = actor; this.damage = damage; - const maxArmorMarks = Math.min( - actor.system.armorScore - actor.system.armor.system.marks.value, - actor.system.rules.maxArmorMarked.total - ); + const canApplyArmor = actor.system.armorApplicableDamageTypes[damageType]; + const maxArmorMarks = canApplyArmor + ? Math.min( + actor.system.armorScore - actor.system.armor.system.marks.value, + actor.system.rules.damageReduction.maxArmorMarked.total + ) + : 0; const armor = [...Array(maxArmorMarks).keys()].reduce((acc, _) => { acc[foundry.utils.randomID()] = { selected: false }; return acc; }, {}); - const stress = [...Array(actor.system.rules.maxArmorMarked.stressExtra ?? 0).keys()].reduce((acc, _) => { - acc[foundry.utils.randomID()] = { selected: false }; - return acc; - }, {}); + const stress = [...Array(actor.system.rules.damageReduction.maxArmorMarked.stressExtra ?? 0).keys()].reduce( + (acc, _) => { + acc[foundry.utils.randomID()] = { selected: false }; + return acc; + }, + {} + ); this.marks = { armor, stress }; - this.availableStressReductions = Object.keys(actor.system.rules.stressDamageReduction).reduce((acc, key) => { - const dr = actor.system.rules.stressDamageReduction[key]; - if (dr.enabled) { - if (acc === null) acc = {}; + this.availableStressReductions = Object.keys(actor.system.rules.damageReduction.stressDamageReduction).reduce( + (acc, key) => { + const dr = actor.system.rules.damageReduction.stressDamageReduction[key]; + if (dr.enabled) { + if (acc === null) acc = {}; - const damage = damageKeyToNumber(key); - acc[damage] = { - cost: dr.cost, - selected: false, - from: getDamageLabel(damage), - to: getDamageLabel(damage - 1) - }; - } + const damage = damageKeyToNumber(key); + acc[damage] = { + cost: dr.cost, + selected: false, + from: getDamageLabel(damage), + to: getDamageLabel(damage - 1) + }; + } - return acc; - }, null); + return acc; + }, + null + ); } get title() { @@ -90,7 +99,8 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap context.armorScore = this.actor.system.armorScore; context.armorMarks = currentMarks; - context.basicMarksUsed = selectedArmorMarks.length === this.actor.system.rules.maxArmorMarked.total; + context.basicMarksUsed = + selectedArmorMarks.length === this.actor.system.rules.damageReduction.maxArmorMarked.total; const stressReductionStress = this.availableStressReductions ? stressReductions.reduce((acc, red) => acc + red.cost, 0) @@ -122,12 +132,15 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap getDamageInfo = () => { const selectedArmorMarks = Object.values(this.marks.armor).filter(x => x.selected); const selectedStressMarks = Object.values(this.marks.stress).filter(x => x.selected); - const stressReductions = Object.values(this.availableStressReductions ?? {}).filter(red => red.selected); + const stressReductions = this.availableStressReductions + ? Object.values(this.availableStressReductions).filter(red => red.selected) + : []; const currentMarks = this.actor.system.armor.system.marks.value + selectedArmorMarks.length + selectedStressMarks.length; - const currentDamage = - this.damage - selectedArmorMarks.length - selectedStressMarks.length - stressReductions.length; + const armorMarkReduction = + selectedArmorMarks.length * this.actor.system.rules.damageReduction.increasePerArmorMark; + const currentDamage = this.damage - armorMarkReduction - selectedStressMarks.length - stressReductions.length; return { selectedArmorMarks, selectedStressMarks, stressReductions, currentMarks, currentDamage }; }; @@ -216,11 +229,11 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap await super.close({}); } - static async armorStackQuery({actorId, damage}) { + static async armorStackQuery({ actorId, damage, type }) { return new Promise(async (resolve, reject) => { const actor = await fromUuid(actorId); - if(!actor || !actor?.isOwner) reject(); - new DamageReductionDialog(resolve, reject, actor, damage).render({ force: true }); - }) + if (!actor || !actor?.isOwner) reject(); + new DamageReductionDialog(resolve, reject, actor, damage, type).render({ force: true }); + }); } } diff --git a/module/applications/sheets/items/armor.mjs b/module/applications/sheets/items/armor.mjs index bb98c8c3..21fbfea8 100644 --- a/module/applications/sheets/items/armor.mjs +++ b/module/applications/sheets/items/armor.mjs @@ -35,7 +35,7 @@ export default class ArmorSheet extends DHBaseItemSheet { switch (partId) { case 'settings': - context.features = this.document.system.features.map(x => x.value); + context.features = this.document.system.armorFeatures.map(x => x.value); break; } @@ -47,6 +47,6 @@ export default class ArmorSheet extends DHBaseItemSheet { * @param {Array} selectedOptions - The currently selected tag objects. */ static async #onFeatureSelect(selectedOptions) { - await this.document.update({ 'system.features': selectedOptions.map(x => ({ value: x.value })) }); + await this.document.update({ 'system.armorFeatures': selectedOptions.map(x => ({ value: x.value })) }); } } diff --git a/module/applications/sheets/items/weapon.mjs b/module/applications/sheets/items/weapon.mjs index d5d09dab..77396998 100644 --- a/module/applications/sheets/items/weapon.mjs +++ b/module/applications/sheets/items/weapon.mjs @@ -33,7 +33,7 @@ export default class WeaponSheet extends DHBaseItemSheet { super._preparePartContext(partId, context); switch (partId) { case 'settings': - context.features = this.document.system.features.map(x => x.value); + context.features = this.document.system.weaponFeatures.map(x => x.value); context.systemFields.attack.fields = this.document.system.attack.schema.fields; break; } @@ -45,6 +45,6 @@ export default class WeaponSheet extends DHBaseItemSheet { * @param {Array} selectedOptions - The currently selected tag objects. */ static async #onFeatureSelect(selectedOptions) { - await this.document.update({ 'system.features': selectedOptions.map(x => ({ value: x.value })) }); + await this.document.update({ 'system.weaponFeatures': selectedOptions.map(x => ({ value: x.value })) }); } } diff --git a/module/applications/ui/chatLog.mjs b/module/applications/ui/chatLog.mjs index 0e2242d7..71532733 100644 --- a/module/applications/ui/chatLog.mjs +++ b/module/applications/ui/chatLog.mjs @@ -80,8 +80,8 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo actor.system.attack?._id === actionId ? actor.system.attack : item.system.attack?._id === actionId - ? item.system.attack - : item?.system?.actions?.find(a => a._id === actionId); + ? item.system.attack + : item?.system?.actions?.find(a => a._id === actionId); return action; } diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs index 64b856a0..282a8c9c 100644 --- a/module/config/generalConfig.mjs +++ b/module/config/generalConfig.mjs @@ -59,13 +59,13 @@ export const damageTypes = { id: 'physical', label: 'DAGGERHEART.CONFIG.DamageType.physical.name', abbreviation: 'DAGGERHEART.CONFIG.DamageType.physical.abbreviation', - icon: ["fa-hand-fist"] + icon: ['fa-hand-fist'] }, magical: { id: 'magical', label: 'DAGGERHEART.CONFIG.DamageType.magical.name', abbreviation: 'DAGGERHEART.CONFIG.DamageType.magical.abbreviation', - icon: ["fa-wand-sparkles"] + icon: ['fa-wand-sparkles'] } }; diff --git a/module/config/itemConfig.mjs b/module/config/itemConfig.mjs index 4cdd8125..cdc8a235 100644 --- a/module/config/itemConfig.mjs +++ b/module/config/itemConfig.mjs @@ -1,16 +1,29 @@ export const armorFeatures = { burning: { label: 'DAGGERHEART.CONFIG.ArmorFeature.burning.name', - description: 'DAGGERHEART.CONFIG.ArmorFeature.burning.description' + description: 'DAGGERHEART.CONFIG.ArmorFeature.burning.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.ArmorFeature.burning.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.burning.description', + img: 'icons/magic/fire/flame-burning-embers-yellow.webp' + } + ] }, channeling: { label: 'DAGGERHEART.CONFIG.ArmorFeature.channeling.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.channeling.description', effects: [ { + name: 'DAGGERHEART.CONFIG.ArmorFeature.channeling.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.channeling.description', + img: 'icons/magic/symbols/rune-sigil-horned-blue.webp', changes: [ { - key: 'system.bonuses.spellcast', + key: 'system.bonuses.roll.spellcast', mode: 2, value: '1' } @@ -23,6 +36,9 @@ export const armorFeatures = { description: 'DAGGERHEART.CONFIG.ArmorFeature.difficult.description', effects: [ { + name: 'DAGGERHEART.CONFIG.ArmorFeature.difficult.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.difficult.description', + img: 'icons/magic/control/buff-flight-wings-red.webp', changes: [ { key: 'system.traits.agility.bonus', @@ -68,6 +84,9 @@ export const armorFeatures = { description: 'DAGGERHEART.CONFIG.ArmorFeature.flexible.description', effects: [ { + name: 'DAGGERHEART.CONFIG.ArmorFeature.flexible.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.flexible.description', + img: 'icons/magic/movement/abstract-ribbons-red-orange.webp', changes: [ { key: 'system.evasion.bonus', @@ -80,13 +99,30 @@ export const armorFeatures = { }, fortified: { label: 'DAGGERHEART.CONFIG.ArmorFeature.fortified.name', - description: 'DAGGERHEART.CONFIG.ArmorFeature.fortified.description' + description: 'DAGGERHEART.CONFIG.ArmorFeature.fortified.description', + effects: [ + { + name: 'DAGGERHEART.CONFIG.ArmorFeature.fortified.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.fortified.description', + img: 'icons/magic/defensive/shield-barrier-glowing-blue.webp', + changes: [ + { + key: 'system.rules.damageReduction.increasePerArmorMark', + mode: 5, + value: '2' + } + ] + } + ] }, gilded: { label: 'DAGGERHEART.CONFIG.ArmorFeature.gilded.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.gilded.description', effects: [ { + name: 'DAGGERHEART.CONFIG.ArmorFeature.gilded.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.gilded.description', + img: 'icons/magic/control/control-influence-crown-gold.webp', changes: [ { key: 'system.traits.presence.bonus', @@ -102,6 +138,9 @@ export const armorFeatures = { description: 'DAGGERHEART.CONFIG.ArmorFeature.heavy.description', effects: [ { + name: 'DAGGERHEART.CONFIG.ArmorFeature.heavy.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.heavy.description', + img: 'icons/commodities/metal/ingot-worn-iron.webp', changes: [ { key: 'system.evasion.bonus', @@ -114,57 +153,223 @@ export const armorFeatures = { }, hopeful: { label: 'DAGGERHEART.CONFIG.ArmorFeature.hopeful.name', - description: 'DAGGERHEART.CONFIG.ArmorFeature.hopeful.description' + description: 'DAGGERHEART.CONFIG.ArmorFeature.hopeful.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.ArmorFeature.hopeful.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.hopeful.description', + img: 'icons/magic/holy/barrier-shield-winged-blue.webp' + } + ] }, impenetrable: { label: 'DAGGERHEART.CONFIG.ArmorFeature.impenetrable.name', - description: 'DAGGERHEART.CONFIG.ArmorFeature.impenetrable.description' + description: 'DAGGERHEART.CONFIG.ArmorFeature.impenetrable.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.ArmorFeature.impenetrable.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.impenetrable.description', + img: 'icons/magic/defensive/shield-barrier-flaming-pentagon-purple-orange.webp', + uses: { + max: 1, + recovery: 'shortRest', + value: 0 + }, + cost: [ + { + type: 'stress', + value: 1 + } + ] + } + ] }, - magic: { - label: 'DAGGERHEART.CONFIG.ArmorFeature.magic.name', - description: 'DAGGERHEART.CONFIG.ArmorFeature.magic.description' - }, - painful: { - label: 'DAGGERHEART.CONFIG.ArmorFeature.painful.name', - description: 'DAGGERHEART.CONFIG.ArmorFeature.painful.description' + magical: { + label: 'DAGGERHEART.CONFIG.ArmorFeature.magical.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.magical.description', + effects: [ + { + name: 'DAGGERHEART.CONFIG.ArmorFeature.magical.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.magical.description', + img: 'icons/magic/defensive/barrier-shield-dome-blue-purple.webp', + changes: [ + { + key: 'system.rules.damageReduction.magical', + mode: 5, + value: 1 + } + ] + } + ] }, physical: { label: 'DAGGERHEART.CONFIG.ArmorFeature.physical.name', - description: 'DAGGERHEART.CONFIG.ArmorFeature.physical.description' + description: 'DAGGERHEART.CONFIG.ArmorFeature.physical.description', + effects: [ + { + name: 'DAGGERHEART.CONFIG.ArmorFeature.physical.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.physical.description', + img: 'icons/commodities/stone/ore-pile-tan.webp', + changes: [ + { + key: 'system.rules.damageReduction.physical', + mode: 5, + value: 1 + } + ] + } + ] }, quiet: { label: 'DAGGERHEART.CONFIG.ArmorFeature.quiet.name', - description: 'DAGGERHEART.CONFIG.ArmorFeature.quiet.description' + description: 'DAGGERHEART.CONFIG.ArmorFeature.quiet.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.ArmorFeature.quiet.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.quiet.description', + img: 'icons/magic/perception/silhouette-stealth-shadow.webp' + } + ] }, reinforced: { label: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.name', - description: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.description' + description: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.description', + img: 'icons/magic/defensive/shield-barrier-glowing-triangle-green.webp', + effects: [ + { + name: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.description', + img: 'icons/magic/defensive/shield-barrier-glowing-triangle-green.webp', + changes: [ + { + key: 'system.bunuses.damageThresholds.major', + mode: 2, + value: '2' + }, + { + key: 'system.bunuses.damageThresholds.severe', + mode: 2, + value: '2' + } + ] + } + ] + } + ] }, resilient: { label: 'DAGGERHEART.CONFIG.ArmorFeature.resilient.name', - description: 'DAGGERHEART.CONFIG.ArmorFeature.resilient.description' + description: 'DAGGERHEART.CONFIG.ArmorFeature.resilient.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.ArmorFeature.resilient.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.resilient.description', + img: 'icons/magic/life/heart-cross-purple-orange.webp' + } + ] }, sharp: { label: 'DAGGERHEART.CONFIG.ArmorFeature.sharp.name', - description: 'DAGGERHEART.CONFIG.ArmorFeature.sharp.description' + description: 'DAGGERHEART.CONFIG.ArmorFeature.sharp.description', + actions: [ + { + type: 'damage', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.ArmorFeature.sharp.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.sharp.description', + img: 'icons/skills/melee/blade-tips-triple-bent-white.webp', + damage: { + parts: [ + { + type: 'physical', + value: { + custom: { + enabled: true, + formula: '1d4' + } + } + } + ] + } + } + ] }, shifting: { label: 'DAGGERHEART.CONFIG.ArmorFeature.shifting.name', - description: 'DAGGERHEART.CONFIG.ArmorFeature.shifting.description' + description: 'DAGGERHEART.CONFIG.ArmorFeature.shifting.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.ArmorFeature.shifting.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.shifting.description', + img: 'icons/magic/defensive/illusion-evasion-echo-purple.webp', + cost: [ + { + type: 'stress', + value: 1 + } + ] + } + ] }, timeslowing: { label: 'DAGGERHEART.CONFIG.ArmorFeature.timeslowing.name', - description: 'DAGGERHEART.CONFIG.ArmorFeature.timeslowing.description' + description: 'DAGGERHEART.CONFIG.ArmorFeature.timeslowing.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.ArmorFeature.timeslowing.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.timeslowing.description', + img: 'icons/magic/time/hourglass-brown-orange.webp' + } + ] }, truthseeking: { label: 'DAGGERHEART.CONFIG.ArmorFeature.truthseeking.name', - description: 'DAGGERHEART.CONFIG.ArmorFeature.truthseeking.description' + description: 'DAGGERHEART.CONFIG.ArmorFeature.truthseeking.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.ArmorFeature.truthseeking.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.truthseeking.description', + img: 'icons/magic/perception/orb-crystal-ball-scrying-blue.webp' + } + ] }, veryheavy: { label: 'DAGGERHEART.CONFIG.ArmorFeature.veryHeavy.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.veryHeavy.description', effects: [ { + name: 'DAGGERHEART.CONFIG.ArmorFeature.veryHeavy.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.veryHeavy.description', + img: 'icons/commodities/metal/ingot-stamped-steel.webp', changes: [ { key: 'system.evasion.bonus', @@ -182,7 +387,21 @@ export const armorFeatures = { }, warded: { label: 'DAGGERHEART.CONFIG.ArmorFeature.warded.name', - description: 'DAGGERHEART.CONFIG.ArmorFeature.warded.description' + description: 'DAGGERHEART.CONFIG.ArmorFeature.warded.description', + effects: [ + { + name: 'DAGGERHEART.CONFIG.ArmorFeature.warded.name', + description: 'DAGGERHEART.CONFIG.ArmorFeature.warded.description', + img: 'icons/magic/defensive/barrier-shield-dome-pink.webp', + changes: [ + { + key: 'system.bonuses.damageReduction.magical', + mode: 2, + value: '@system.armorScore' + } + ] + } + ] } }; @@ -196,7 +415,7 @@ export const weaponFeatures = { { key: 'system.bonuses.armorScore', mode: 2, - value: '@system.tier + 1' + value: 'ITEM.@system.tier + 1' } ] }, @@ -218,9 +437,9 @@ export const weaponFeatures = { { changes: [ { - key: 'system.bonuses.damage', + key: 'system.bonuses.damage.primaryWeapon.bonus', mode: 2, - value: 'system.levelData.levels.current' + value: '@system.levelData.levels.current' } ] } @@ -228,7 +447,25 @@ export const weaponFeatures = { }, bouncing: { label: 'DAGGERHEART.CONFIG.WeaponFeature.bouncing.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.bouncing.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.bouncing.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.bouncing.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.bouncing.description', + img: 'icons/skills/movement/ball-spinning-blue.webp', + cost: [ + { + type: 'stress', + value: 1, + scalable: true, + step: 1 + } + ] + } + ] }, brave: { label: 'DAGGERHEART.CONFIG.WeaponFeature.brave.name', @@ -248,7 +485,7 @@ export const weaponFeatures = { { key: 'system.damageThresholds.severe', mode: 2, - value: '3' + value: 'ITEM.@system.tier' } ] } @@ -256,7 +493,17 @@ export const weaponFeatures = { }, brutal: { label: 'DAGGERHEART.CONFIG.WeaponFeature.brutal.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.brutal.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.brutal.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.brutal.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.brutal.description', + img: 'icons/skills/melee/strike-dagger-blood-red.webp' + } + ] }, charged: { label: 'DAGGERHEART.CONFIG.WeaponFeature.charged.name', @@ -264,16 +511,31 @@ export const weaponFeatures = { actions: [ { type: 'effect', - name: 'DAGGERHEART.CONFIG.WeaponFeature.concussive.name', - img: 'icons/skills/melee/shield-damaged-broken-brown.webp', actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.charged.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.charged.description', + img: 'icons/magic/lightning/claws-unarmed-strike-teal.webp', cost: [ { type: 'stress', value: 1 } + ], + effects: [ + { + name: 'DAGGERHEART.CONFIG.WeaponFeature.charged.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.charged.description', + img: 'icons/magic/lightning/claws-unarmed-strike-teal.webp', + changes: [ + { + key: 'system.proficiency.bonus', + mode: 2, + value: '1' + } + ] + } ] - // Should add an effect with path system.proficiency.bonus +1 } ] }, @@ -282,10 +544,12 @@ export const weaponFeatures = { description: 'DAGGERHEART.CONFIG.WeaponFeature.concussive.description', actions: [ { - type: 'resource', - name: 'DAGGERHEART.CONFIG.WeaponFeature.concussive.name', - img: 'icons/skills/melee/shield-damaged-broken-brown.webp', + type: 'effect', actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.concussive.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.concussive.description', + img: 'icons/skills/melee/shield-block-bash-yellow.webp', cost: [ { type: 'hope', @@ -300,6 +564,9 @@ export const weaponFeatures = { description: 'DAGGERHEART.CONFIG.WeaponFeature.cumbersome.description', effects: [ { + name: 'DAGGERHEART.CONFIG.WeaponFeature.cumbersome.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.cumbersome.description', + img: 'icons/commodities/metal/mail-plate-steel.webp', changes: [ { key: 'system.traits.finesse.bonus', @@ -312,27 +579,70 @@ export const weaponFeatures = { }, deadly: { label: 'DAGGERHEART.CONFIG.WeaponFeature.deadly.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.deadly.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.deadly.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.deadly.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.deadly.description', + img: 'icons/skills/melee/strike-sword-dagger-runes-red.webp' + } + ] }, deflecting: { label: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.description' - // actions: [{ - // type: 'effect', - // name: 'DAGGERHEART.CONFIG.WeaponFeature.Deflecting.Name', - // img: 'icons/skills/melee/strike-flail-destructive-yellow.webp', - // actionType: 'reaction', - // cost: [{ - // type: 'armorSlot', // Needs armorSlot as type - // value: 1 - // }], - // }], + description: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.description', + img: 'icons/skills/melee/hand-grip-sword-strike-orange.webp', + cost: [ + { + type: 'armorStack', + value: 1 + } + ], + effects: [ + { + name: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.description', + img: 'icons/skills/melee/hand-grip-sword-strike-orange.webp', + changes: [ + { + key: 'system.evasion.bonus', + mode: 2, + value: '@system.armorScore' + } + ] + } + ] + } + ] }, destructive: { label: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.description', + img: 'icons/skills/melee/strike-flail-spiked-pink.webp' + } + ], effects: [ { + name: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.description', + img: 'icons/skills/melee/strike-flail-spiked-pink.webp', changes: [ { key: 'system.traits.agility.bonus', @@ -348,10 +658,12 @@ export const weaponFeatures = { description: 'DAGGERHEART.CONFIG.WeaponFeature.devastating.description', actions: [ { - type: 'resource', - name: 'DAGGERHEART.CONFIG.WeaponFeature.devastating.name', - img: 'icons/skills/melee/strike-flail-destructive-yellow.webp', + type: 'effect', actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.devastating.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.devastating.description', + img: 'icons/skills/melee/strike-flail-destructive-yellow.webp', cost: [ { type: 'stress', @@ -366,11 +678,19 @@ export const weaponFeatures = { description: 'DAGGERHEART.CONFIG.WeaponFeature.doubleDuty.description', effects: [ { + name: 'DAGGERHEART.CONFIG.WeaponFeature.doubleDuty.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.doubleDuty.description', + img: 'icons/skills/melee/sword-shield-stylized-white.webp', changes: [ { key: 'system.bonuses.armorScore', mode: 2, value: '1' + }, + { + key: 'system.bonuses.damage.primaryWeapon.bonus', + mode: 2, + value: '1' } ] } @@ -378,28 +698,60 @@ export const weaponFeatures = { }, doubledup: { label: 'DAGGERHEART.CONFIG.WeaponFeature.doubledUp.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.doubledUp.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.doubledUp.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.doubledUp.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.doubledUp.description', + img: 'icons/skills/melee/strike-slashes-orange.webp' + } + ] }, dueling: { label: 'DAGGERHEART.CONFIG.WeaponFeature.dueling.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.dueling.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.dueling.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.dueling.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.dueling.description', + img: 'icons/skills/melee/weapons-crossed-swords-pink.webp' + } + ] }, eruptive: { label: 'DAGGERHEART.CONFIG.WeaponFeature.eruptive.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.eruptive.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.eruptive.description', + actions: [ + { + type: 'effect', // Should prompt a dc 14 reaction save on adversaries + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.eruptive.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.eruptive.description', + img: 'icons/skills/melee/strike-hammer-destructive-blue.webp' + } + ] }, grappling: { label: 'DAGGERHEART.CONFIG.WeaponFeature.grappling.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.grappling.description', actions: [ { - type: 'resource', - name: 'DAGGERHEART.CONFIG.WeaponFeature.grappling.name', - img: 'icons/magic/control/debuff-chains-ropes-net-white.webp', + type: 'effect', actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.grappling.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.grappling.description', + img: 'icons/magic/control/debuff-chains-ropes-net-white.webp', cost: [ { - type: 'stress', + type: 'hope', value: 1 } ] @@ -408,7 +760,32 @@ export const weaponFeatures = { }, greedy: { label: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.description', + img: 'icons/commodities/currency/coins-crown-stack-gold.webp', + // Should cost handfull of gold, + effects: [ + { + name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.description', + img: 'icons/commodities/currency/coins-crown-stack-gold.webp', + changes: [ + { + key: 'system.proficiency.bonus', + mode: 2, + value: '1' + } + ] + } + ] + } + ] }, healing: { label: 'DAGGERHEART.CONFIG.WeaponFeature.healing.name', @@ -416,9 +793,10 @@ export const weaponFeatures = { actions: [ { type: 'healing', + actionType: 'action', + chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.healing.name', img: 'icons/magic/life/cross-beam-green.webp', - actionType: 'action', healing: { type: 'health', value: { @@ -436,6 +814,9 @@ export const weaponFeatures = { description: 'DAGGERHEART.CONFIG.WeaponFeature.heavy.description', effects: [ { + name: 'DAGGERHEART.CONFIG.WeaponFeature.heavy.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.heavy.description', + img: 'icons/commodities/metal/ingot-worn-iron.webp', changes: [ { key: 'system.evasion.bonus', @@ -448,37 +829,99 @@ export const weaponFeatures = { }, hooked: { label: 'DAGGERHEART.CONFIG.WeaponFeature.hooked.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.hooked.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.hooked.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.hooked.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.hooked.description', + img: 'icons/skills/melee/strike-chain-whip-blue.webp' + } + ] }, hot: { label: 'DAGGERHEART.CONFIG.WeaponFeature.hot.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.hot.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.hot.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.hot.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.hot.description', + img: 'icons/magic/fire/dagger-rune-enchant-flame-red.webp' + } + ] }, invigorating: { label: 'DAGGERHEART.CONFIG.WeaponFeature.invigorating.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.invigorating.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.invigorating.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.invigorating.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.invigorating.description', + img: 'icons/magic/life/heart-cross-green.webp' + } + ] }, lifestealing: { label: 'DAGGERHEART.CONFIG.WeaponFeature.lifestealing.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.lifestealing.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.lifestealing.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.lifestealing.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.lifestealing.description', + img: 'icons/magic/unholy/hand-claw-fire-blue.webp' + } + ] }, lockedon: { label: 'DAGGERHEART.CONFIG.WeaponFeature.lockedOn.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.lockedOn.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.lockedOn.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.lockedOn.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.lockedOn.description', + img: 'icons/skills/targeting/crosshair-arrowhead-blue.webp' + } + ] }, long: { label: 'DAGGERHEART.CONFIG.WeaponFeature.long.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.long.description' + // actions: [ + // { + // type: 'effect', + // actionType: 'action', + // chatDisplay: true, + // name: 'DAGGERHEART.CONFIG.WeaponFeature.long.name', + // description: 'DAGGERHEART.CONFIG.WeaponFeature.long.description', + // img: 'icons/skills/melee/strike-weapon-polearm-ice-blue.webp', + // } + // ] }, lucky: { label: 'DAGGERHEART.CONFIG.WeaponFeature.lucky.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.lucky.description', actions: [ { - type: 'resource', - name: 'DAGGERHEART.CONFIG.WeaponFeature.lucky.name', - img: 'icons/magic/control/buff-luck-fortune-green.webp', + type: 'effect', actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.lucky.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.lucky.description', + img: 'icons/magic/control/buff-luck-fortune-green.webp', cost: [ { type: 'stress', @@ -493,11 +936,24 @@ export const weaponFeatures = { description: 'DAGGERHEART.CONFIG.WeaponFeature.massive.description', effects: [ { + name: 'DAGGERHEART.CONFIG.WeaponFeature.massive.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.massive.description', + img: '', changes: [ { key: 'system.evasion.bonus', mode: 2, value: '-1' + }, + { + key: 'system.bonuses.damage.primaryWeapon.extraDice', + mode: 2, + value: '1' + }, + { + key: 'system.rules.weapon.dropLowestDamageDice', + mode: 5, + value: '1' } ] } @@ -508,10 +964,12 @@ export const weaponFeatures = { description: 'DAGGERHEART.CONFIG.WeaponFeature.painful.description', actions: [ { - type: 'resource', - name: 'DAGGERHEART.CONFIG.WeaponFeature.painful.name', - img: 'icons/skills/wounds/injury-face-impact-orange.webp', + type: 'effect', actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.painful.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.painful.description', + img: 'icons/skills/wounds/injury-face-impact-orange.webp', cost: [ { type: 'stress', @@ -524,17 +982,64 @@ export const weaponFeatures = { paired: { label: 'DAGGERHEART.CONFIG.WeaponFeature.paired.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.paired.description', - override: { - bonusDamage: 1 - } + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.paired.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.paired.description', + img: 'icons/skills/melee/strike-flail-spiked-red.webp' + } + ] }, parry: { label: 'DAGGERHEART.CONFIG.WeaponFeature.parry.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.parry.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.parry.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.parry.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.parry.description', + img: 'icons/skills/melee/shield-block-fire-orange.webp' + } + ] }, persuasive: { label: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.description', + img: 'icons/magic/control/hypnosis-mesmerism-eye.webp', + cost: [ + { + type: 'stress', + value: 1 + } + ], + effects: [ + { + name: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.description', + img: 'icons/magic/control/hypnosis-mesmerism-eye.webp', + changes: [ + { + key: 'system.traits.presence.bonus', + mode: 2, + value: '2' + } + ] + } + ] + } + ] }, pompous: { label: 'DAGGERHEART.CONFIG.WeaponFeature.pompous.name', @@ -542,18 +1047,50 @@ export const weaponFeatures = { }, powerful: { label: 'DAGGERHEART.CONFIG.WeaponFeature.powerful.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.powerful.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.powerful.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.powerful.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.powerful.description', + img: 'icons/magic/control/buff-flight-wings-runes-red-yellow.webp', + effects: [ + { + name: 'DAGGERHEART.CONFIG.WeaponFeature.powerful.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.powerful.description', + img: 'icons/magic/control/buff-flight-wings-runes-red-yellow.webp', + changes: [ + { + key: 'system.bonuses.damage.primaryWeapon.extraDice', + mode: 2, + value: '1' + }, + { + key: 'system.rules.weapon.dropLowestDamageDice', + mode: 5, + value: '1' + } + ] + } + ] + } + ] }, protective: { label: 'DAGGERHEART.CONFIG.WeaponFeature.protective.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.protective.description', effects: [ { + name: 'DAGGERHEART.CONFIG.WeaponFeature.protective.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.protective.description', + img: 'icons/skills/melee/shield-block-gray-orange.webp', changes: [ { key: 'system.bonuses.armorScore', mode: 2, - value: '@system.tier' + value: '1' } ] } @@ -564,10 +1101,12 @@ export const weaponFeatures = { description: 'DAGGERHEART.CONFIG.WeaponFeature.quick.description', actions: [ { - type: 'resource', - name: 'DAGGERHEART.CONFIG.WeaponFeature.quick.name', - img: 'icons/skills/movement/arrow-upward-yellow.webp', + type: 'effect', actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.quick.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.quick.description', + img: 'icons/skills/movement/arrow-upward-yellow.webp', cost: [ { type: 'stress', @@ -582,9 +1121,12 @@ export const weaponFeatures = { description: 'DAGGERHEART.CONFIG.WeaponFeature.reliable.description', effects: [ { + name: 'DAGGERHEART.CONFIG.WeaponFeature.reliable.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.reliable.description', + img: 'icons/skills/melee/strike-sword-slashing-red.webp', changes: [ { - key: 'system.bonuses.attack', + key: 'system.bonuses.roll.primaryWeapon.attack', mode: 2, value: 1 } @@ -594,7 +1136,17 @@ export const weaponFeatures = { }, reloading: { label: 'DAGGERHEART.CONFIG.WeaponFeature.reloading.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.reloading.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.reloading.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.reloading.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.reloading.description', + img: 'icons/weapons/ammunition/shot-round-blue.webp' + } + ] }, retractable: { label: 'DAGGERHEART.CONFIG.WeaponFeature.retractable.name', @@ -604,21 +1156,87 @@ export const weaponFeatures = { label: 'DAGGERHEART.CONFIG.WeaponFeature.returning.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.returning.description' }, + selfCorrecting: { + label: 'DAGGERHEART.CONFIG.WeaponFeature.selfCorrecting.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.selfCorrecting.description', + effects: [ + { + name: 'DAGGERHEART.CONFIG.WeaponFeature.selfCorrecting.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.selfCorrecting.description', + img: 'icons/weapons/ammunition/arrow-broadhead-glowing-orange.webp', + changes: [ + { + key: 'system.rules.damage.flipMinDiceValue', + mode: 5, + value: 1 + } + ] + } + ] + }, scary: { label: 'DAGGERHEART.CONFIG.WeaponFeature.scary.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.scary.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.scary.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.scary.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.scary.description', + img: 'icons/magic/death/skull-energy-light-purple.webp' + } + ] }, serrated: { label: 'DAGGERHEART.CONFIG.WeaponFeature.serrated.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.serrated.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.serrated.description', + effects: [ + { + name: 'DAGGERHEART.CONFIG.WeaponFeature.serrated.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.serrated.description', + img: 'icons/weapons/ammunition/arrow-broadhead-glowing-orange.webp', + changes: [ + { + key: 'system.rules.damage.flipMinDiceValue', + mode: 5, + value: 1 + } + ] + } + ] }, sharpwing: { label: 'DAGGERHEART.CONFIG.WeaponFeature.sharpwing.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.sharpwing.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.sharpwing.description', + effects: [ + { + name: 'DAGGERHEART.CONFIG.WeaponFeature.sharpwing.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.sharpwing.description', + img: 'icons/weapons/swords/sword-winged-pink.webp', + changes: [ + { + key: 'system.bonuses.damage.primaryWeapon.bonus', + mode: 2, + value: '@system.traits.agility.total' + } + ] + } + ] }, sheltering: { label: 'DAGGERHEART.CONFIG.WeaponFeature.sheltering.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.sheltering.description' + description: 'DAGGERHEART.CONFIG.WeaponFeature.sheltering.description', + actions: [ + { + type: 'effect', + actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.sheltering.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.sheltering.description', + img: 'icons/skills/melee/shield-block-gray-yellow.webp' + } + ] }, startling: { label: 'DAGGERHEART.CONFIG.WeaponFeature.startling.name', @@ -626,9 +1244,11 @@ export const weaponFeatures = { actions: [ { type: 'resource', - name: 'DAGGERHEART.CONFIG.WeaponFeature.startling.name', - img: 'icons/magic/control/fear-fright-mask-orange.webp', actionType: 'action', + chatDisplay: true, + name: 'DAGGERHEART.CONFIG.WeaponFeature.startling.name', + description: 'DAGGERHEART.CONFIG.WeaponFeature.startling.description', + img: 'icons/magic/control/fear-fright-mask-orange.webp', cost: [ { type: 'stress', @@ -644,12 +1264,12 @@ export const weaponFeatures = { }, versatile: { label: 'DAGGERHEART.CONFIG.WeaponFeature.versatile.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.versatile.description', - versatile: { - characterTrait: '', - range: '', - damage: '' - } + description: 'DAGGERHEART.CONFIG.WeaponFeature.versatile.description' + // versatile: { + // characterTrait: '', + // range: '', + // damage: '' + // } } }; diff --git a/module/data/action/attackAction.mjs b/module/data/action/attackAction.mjs index 9c1c49f8..d953416a 100644 --- a/module/data/action/attackAction.mjs +++ b/module/data/action/attackAction.mjs @@ -14,12 +14,12 @@ export default class DHAttackAction extends DHDamageAction { prepareData() { super.prepareData(); - if(!!this.item?.system?.attack) { + if (!!this.item?.system?.attack) { if (this.damage.includeBase) { const baseDamage = this.getParentDamage(); this.damage.parts.unshift(new DHDamageData(baseDamage)); } - if(this.roll.useDefault) { + if (this.roll.useDefault) { this.roll.trait = this.item.system.attack.roll.trait; this.roll.type = 'weapon'; } diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index ae0b7ccc..e193aefe 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -161,7 +161,7 @@ export default class DHBaseAction extends foundry.abstract.DataModel { updateSource['range'] = parent?.system?.attack?.range; updateSource['roll'] = { useDefault: true - } + }; } else { if (parent?.system?.trait) { updateSource['roll'] = { @@ -295,7 +295,7 @@ export default class DHBaseAction extends foundry.abstract.DataModel { } prepareTarget() { - if(!this.target?.type) return []; + if (!this.target?.type) return []; let targets; if (this.target?.type === CONFIG.DH.ACTIONS.targetTypes.self.id) targets = this.constructor.formatTarget(this.actor.token ?? this.actor.prototypeToken); @@ -337,7 +337,8 @@ export default class DHBaseAction extends foundry.abstract.DataModel { const resources = config.costs .filter(c => c.enabled !== false) .map(c => { - return { type: c.type, value: (c.total ?? c.value) * -1 }; + const resource = this.actor.system.resources[c.type]; + return { type: c.type, value: (c.total ?? c.value) * (resource.hasOwnProperty('maxTotal') ? 1 : -1) }; }); await this.actor.modifyResource(resources); @@ -382,15 +383,21 @@ export default class DHBaseAction extends foundry.abstract.DataModel { const realCosts = this.getRealCosts(costs), hasFearCost = realCosts.findIndex(c => c.type === 'fear'); if (hasFearCost > -1) { - const fearCost = realCosts.splice(hasFearCost, 1); + const fearCost = realCosts.splice(hasFearCost, 1)[0]; if ( !game.user.isGM || - fearCost[0].total > game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear) + fearCost.total > game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear) ) return false; } + + /* maxTotal is a sign that the resource is inverted, IE it counts upwards instead of down */ + const resources = this.actor.system.resources; return realCosts.reduce( - (a, c) => a && this.actor.system.resources[c.type]?.value >= (c.total ?? c.value), + (a, c) => + a && resources[c.type].hasOwnProperty('maxTotal') + ? resources[c.type].value + (c.total ?? c.value) <= resources[c.type].maxTotal + : resources[c.type]?.value >= (c.total ?? c.value), true ); } diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index daf63a79..93926d9a 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -100,12 +100,19 @@ export default class DhCharacter extends BaseDataActor { levelData: new fields.EmbeddedDataField(DhLevelData), bonuses: new fields.SchemaField({ armorScore: new fields.NumberField({ integer: true, initial: 0 }), + damageReduction: new fields.SchemaField({ + physical: new fields.NumberField({ integer: true, initial: 0 }), + magical: new fields.NumberField({ integer: true, initial: 0 }) + }), damageThresholds: new fields.SchemaField({ severe: new fields.NumberField({ integer: true, initial: 0 }), major: new fields.NumberField({ integer: true, initial: 0 }) }), roll: new fields.SchemaField({ attack: new fields.NumberField({ integer: true, initial: 0 }), + primaryWeapon: new fields.SchemaField({ + attack: new fields.NumberField({ integer: true, initial: 0 }) + }), spellcast: new fields.NumberField({ integer: true, initial: 0 }), action: new fields.NumberField({ integer: true, initial: 0 }), hopeOrFear: new fields.NumberField({ integer: true, initial: 0 }) @@ -113,20 +120,29 @@ export default class DhCharacter extends BaseDataActor { damage: new fields.SchemaField({ all: new fields.NumberField({ integer: true, initial: 0 }), physical: new fields.NumberField({ integer: true, initial: 0 }), - magic: new fields.NumberField({ integer: true, initial: 0 }) + magic: new fields.NumberField({ integer: true, initial: 0 }), + primaryWeapon: new fields.SchemaField({ + bonus: new fields.NumberField({ integer: true }), + extraDice: new fields.NumberField({ integer: true }) + }) }) }), companion: new ForeignDocumentUUIDField({ type: 'Actor', nullable: true, initial: null }), rules: new fields.SchemaField({ - maxArmorMarked: new fields.SchemaField({ - value: new fields.NumberField({ required: true, integer: true, initial: 1 }), - bonus: new fields.NumberField({ required: true, integer: true, initial: 0 }), - stressExtra: new fields.NumberField({ required: true, integer: true, initial: 0 }) - }), - stressDamageReduction: new fields.SchemaField({ - severe: stressDamageReductionRule(), - major: stressDamageReductionRule(), - minor: stressDamageReductionRule() + damageReduction: new fields.SchemaField({ + maxArmorMarked: new fields.SchemaField({ + value: new fields.NumberField({ required: true, integer: true, initial: 1 }), + bonus: new fields.NumberField({ required: true, integer: true, initial: 0 }), + stressExtra: new fields.NumberField({ required: true, integer: true, initial: 0 }) + }), + stressDamageReduction: new fields.SchemaField({ + severe: stressDamageReductionRule(), + major: stressDamageReductionRule(), + minor: stressDamageReductionRule() + }), + increasePerArmorMark: new fields.NumberField({ integer: true, initial: 1 }), + magical: new fields.BooleanField({ initial: false }), + physical: new fields.BooleanField({ initial: false }) }), strangePatterns: new fields.NumberField({ integer: true, @@ -135,6 +151,18 @@ export default class DhCharacter extends BaseDataActor { nullable: true, initial: null }), + weapon: new fields.SchemaField({ + /* Unimplemented + -> Should remove the lowest damage dice from weapon damage + -> Reflect this in the chat message somehow so players get feedback that their choice is helping them. + */ + dropLowestDamageDice: new fields.BooleanField({ initial: false }), + /* Unimplemented + -> Should flip any lowest possible dice rolls for weapon damage to highest + -> Reflect this in the chat message somehow so players get feedback that their choice is helping them. + */ + flipMinDiceValue: new fields.BooleanField({ intial: false }) + }), runeWard: new fields.BooleanField({ initial: false }) }) }; @@ -282,6 +310,13 @@ export default class DhCharacter extends BaseDataActor { ); } + get armorApplicableDamageTypes() { + return { + physical: !this.rules.damageReduction.magical, + magical: !this.rules.damageReduction.physical + }; + } + static async unequipBeforeEquip(itemToEquip) { const primary = this.primaryWeapon, secondary = this.secondaryWeapon; @@ -348,6 +383,7 @@ export default class DhCharacter extends BaseDataActor { } const armor = this.armor; + this.armorScore = this.armor ? this.armor.system.baseScore + (this.bonuses.armorScore ?? 0) : 0; // Bonuses to armorScore won't have been applied yet. Need to solve in documentPreparation somehow this.damageThresholds = { major: armor ? armor.system.baseThresholds.major + this.levelData.level.current @@ -372,9 +408,9 @@ export default class DhCharacter extends BaseDataActor { experience.total = experience.value + experience.bonus; } - this.rules.maxArmorMarked.total = this.rules.maxArmorMarked.value + this.rules.maxArmorMarked.bonus; + this.rules.damageReduction.maxArmorMarked.total = + this.rules.damageReduction.maxArmorMarked.value + this.rules.damageReduction.maxArmorMarked.bonus; - this.armorScore = this.armor ? this.armor.system.baseScore + (this.bonuses.armorScore ?? 0) : 0; this.resources.hitPoints.maxTotal = (this.class.value?.system?.hitPoints ?? 0) + this.resources.hitPoints.bonus; this.resources.stress.maxTotal = this.resources.stress.max + this.resources.stress.bonus; this.evasion.total = (this.class?.evasion ?? 0) + this.evasion.bonus; diff --git a/module/data/item/armor.mjs b/module/data/item/armor.mjs index 4e5a26e6..696a95a2 100644 --- a/module/data/item/armor.mjs +++ b/module/data/item/armor.mjs @@ -22,7 +22,7 @@ export default class DHArmor extends BaseDataItem { tier: new fields.NumberField({ required: true, integer: true, initial: 1, min: 1 }), equipped: new fields.BooleanField({ initial: false }), baseScore: new fields.NumberField({ integer: true, initial: 0 }), - features: new fields.ArrayField( + armorFeatures: new fields.ArrayField( new fields.SchemaField({ value: new fields.StringField({ required: true, @@ -44,25 +44,22 @@ export default class DHArmor extends BaseDataItem { }; } - get featureInfo() { - return this.feature ? CONFIG.DH.ITEM.armorFeatures[this.feature] : null; - } - async _preUpdate(changes, options, user) { const allowed = await super._preUpdate(changes, options, user); if (allowed === false) return false; - if (changes.system.features) { - const removed = this.features.filter(x => !changes.system.features.includes(x)); - const added = changes.system.features.filter(x => !this.features.includes(x)); + if (changes.system.armorFeatures) { + const removed = this.armorFeatures.filter(x => !changes.system.armorFeatures.includes(x)); + const added = changes.system.armorFeatures.filter(x => !this.armorFeatures.includes(x)); + const effectIds = []; + const actionIds = []; for (var feature of removed) { - for (var effectId of feature.effectIds) { - await this.parent.effects.get(effectId).delete(); - } - - changes.system.actions = this.actions.filter(x => !feature.actionIds.includes(x._id)); + effectIds.push(...feature.effectIds); + actionIds.push(...feature.actionIds); } + await this.parent.deleteEmbeddedDocuments('ActiveEffect', effectIds); + changes.system.actions = this.actions.filter(x => !actionIds.includes(x._id)); for (var feature of added) { const featureData = armorFeatures[feature.value]; diff --git a/module/data/item/weapon.mjs b/module/data/item/weapon.mjs index 3fb562e0..e1370395 100644 --- a/module/data/item/weapon.mjs +++ b/module/data/item/weapon.mjs @@ -10,7 +10,7 @@ export default class DHWeapon extends BaseDataItem { type: 'weapon', hasDescription: true, isQuantifiable: true, - isInventoryItem: true, + isInventoryItem: true // hasInitialAction: true }); } @@ -26,8 +26,7 @@ export default class DHWeapon extends BaseDataItem { //SETTINGS secondary: new fields.BooleanField({ initial: false }), burden: new fields.StringField({ required: true, choices: CONFIG.DH.GENERAL.burden, initial: 'oneHanded' }), - - features: new fields.ArrayField( + weaponFeatures: new fields.ArrayField( new fields.SchemaField({ value: new fields.StringField({ required: true, @@ -59,7 +58,7 @@ export default class DHWeapon extends BaseDataItem { { value: { multiplier: 'prof', - dice: "d8" + dice: 'd8' } } ] @@ -78,18 +77,20 @@ export default class DHWeapon extends BaseDataItem { const allowed = await super._preUpdate(changes, options, user); if (allowed === false) return false; - if (changes.system?.features) { - const removed = this.features.filter(x => !changes.system.features.includes(x)); - const added = changes.system.features.filter(x => !this.features.includes(x)); + if (changes.system?.weaponFeatures) { + const removed = this.weaponFeatures.filter(x => !changes.system.weaponFeatures.includes(x)); + const added = changes.system.weaponFeatures.filter(x => !this.weaponFeatures.includes(x)); + const removedEffectsUpdate = []; + const removedActionsUpdate = []; for (let weaponFeature of removed) { - for (var effectId of weaponFeature.effectIds) { - await this.parent.effects.get(effectId).delete(); - } - - changes.system.actions = this.actions.filter(x => !weaponFeature.actionIds.includes(x._id)); + removedEffectsUpdate.push(...weaponFeature.effectIds); + removedActionsUpdate.push(...weaponFeature.actionIds); } + await this.parent.deleteEmbeddedDocuments('ActiveEffect', removedEffectsUpdate); + changes.system.actions = this.actions.filter(x => !removedActionsUpdate.includes(x._id)); + for (let weaponFeature of added) { const featureData = CONFIG.DH.ITEM.weaponFeatures[weaponFeature.value]; if (featureData.effects?.length > 0) { @@ -102,17 +103,37 @@ export default class DHWeapon extends BaseDataItem { ]); weaponFeature.effectIds = embeddedItems.map(x => x.id); } + + const newActions = []; if (featureData.actions?.length > 0) { - const newActions = featureData.actions.map(action => { - const cls = actionsTypes[action.type]; - return new cls( - { ...action, _id: foundry.utils.randomID(), name: game.i18n.localize(action.name) }, - { parent: this } + for (let action of featureData.actions) { + const embeddedEffects = await this.parent.createEmbeddedDocuments( + 'ActiveEffect', + (action.effects ?? []).map(effect => ({ + ...effect, + transfer: false, + name: game.i18n.localize(effect.name), + description: game.i18n.localize(effect.description) + })) ); - }); - changes.system.actions = [...this.actions, ...newActions]; - weaponFeature.actionIds = newActions.map(x => x._id); + const cls = actionsTypes[action.type]; + newActions.push( + new cls( + { + ...action, + _id: foundry.utils.randomID(), + name: game.i18n.localize(action.name), + description: game.i18n.localize(action.description), + effects: embeddedEffects.map(x => ({ _id: x.id })) + }, + { parent: this } + ) + ); + } } + + changes.system.actions = [...this.actions, ...newActions]; + weaponFeature.actionIds = newActions.map(x => x._id); } } } diff --git a/module/documents/activeEffect.mjs b/module/documents/activeEffect.mjs index 65610e7c..1abc2d17 100644 --- a/module/documents/activeEffect.mjs +++ b/module/documents/activeEffect.mjs @@ -25,7 +25,11 @@ export default class DhActiveEffect extends ActiveEffect { } static applyField(model, change, field) { - change.value = Roll.safeEval(Roll.replaceFormulaData(change.value, change.effect.parent)); + const isItemTarget = change.value.toLowerCase().startsWith('item.'); + change.value = isItemTarget ? change.value.slice(5) : change.value; + change.value = Roll.safeEval( + Roll.replaceFormulaData(change.value, isItemTarget ? change.effect.parent : model) + ); super.applyField(model, change, field); } diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index cfe101fa..aba0e0fa 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -3,6 +3,7 @@ import { emitAsGM, emitAsOwner, GMUpdateEvent, socketEvent } from '../systemRegi import DamageReductionDialog from '../applications/dialogs/damageReductionDialog.mjs'; import { LevelOptionType } from '../data/levelTier.mjs'; import DHFeature from '../data/item/feature.mjs'; +import { damageKeyToNumber, getDamageKey } from '../helpers/utils.mjs'; export default class DhpActor extends Actor { /** @@ -455,14 +456,32 @@ export default class DhpActor extends Actor { cls.create(msg.toObject()); } - async takeDamage(damage, type) { - if (Hooks.call(`${CONFIG.DH.id}.preTakeDamage`, this, damage, type) === false) return null; + #canReduceDamage(hpDamage, type) { + const availableStress = this.system.resources.stress.maxTotal - this.system.resources.stress.value; + + const canUseArmor = + this.system.armor && + this.system.armor.system.marks.value < this.system.armorScore && + this.system.armorApplicableDamageTypes[type]; + const canUseStress = Object.keys(this.system.rules.damageReduction.stressDamageReduction).reduce((acc, x) => { + const rule = this.system.rules.damageReduction.stressDamageReduction[x]; + if (damageKeyToNumber(x) <= hpDamage) return acc || (rule.enabled && availableStress >= rule.cost); + return acc; + }, false); + + return canUseArmor || canUseStress; + } + + async takeDamage(baseDamage, type) { + if (Hooks.call(`${CONFIG.DH.id}.preTakeDamage`, this, baseDamage, type) === false) return null; if (this.type === 'companion') { await this.modifyResource([{ value: 1, type: 'stress' }]); return; } + const flatReduction = this.system.bonuses.damageReduction[type]; + const damage = Math.max(baseDamage - (flatReduction ?? 0), 0); const hpDamage = this.convertDamageToThreshold(damage); if (Hooks.call(`${CONFIG.DH.id}.postDamageTreshold`, this, hpDamage, damage, type) === false) return null; @@ -471,12 +490,12 @@ export default class DhpActor extends Actor { const updates = [{ value: hpDamage, type: 'hitPoints' }]; - if ( - this.type === 'character' && - this.system.armor && - this.system.armor.system.marks.value < this.system.armorScore - ) { - const armorStackResult = await this.owner.query('armorStack', { actorId: this.uuid, damage: hpDamage }); + if (this.type === 'character' && this.system.armor && this.#canReduceDamage(hpDamage, type)) { + const armorStackResult = await this.owner.query('armorStack', { + actorId: this.uuid, + damage: hpDamage, + type: type + }); if (armorStackResult) { const { modifiedDamage, armorSpent, stressSpent } = armorStackResult; updates.find(u => u.type === 'hitPoints').value = modifiedDamage; diff --git a/module/documents/item.mjs b/module/documents/item.mjs index 35b9e32f..db34fa49 100644 --- a/module/documents/item.mjs +++ b/module/documents/item.mjs @@ -90,10 +90,12 @@ export default class DHItem extends foundry.documents.Item { ok: { label: title, callback: (event, button, dialog) => { - Object.defineProperty(prevEvent, "shiftKey", { - get() { return event.shiftKey; }, + Object.defineProperty(prevEvent, 'shiftKey', { + get() { + return event.shiftKey; + } }); - return this.system.actionsList.find(a => a._id === button.form.elements.actionId.value) + return this.system.actionsList.find(a => a._id === button.form.elements.actionId.value); } } }); diff --git a/module/helpers/utils.mjs b/module/helpers/utils.mjs index e719b25e..0bb2088e 100644 --- a/module/helpers/utils.mjs +++ b/module/helpers/utils.mjs @@ -159,7 +159,8 @@ export const tagifyElement = (element, options, onChange, tagifyOptions = {}) => return { value: key, name: game.i18n.localize(option.label), - src: option.src + src: option.src, + description: option.description }; }), maxTags: maxTags, @@ -173,11 +174,12 @@ export const tagifyElement = (element, options, onChange, tagifyOptions = {}) => }, templates: { tag(tagData) { - return `
@@ -190,6 +192,8 @@ export const tagifyElement = (element, options, onChange, tagifyOptions = {}) => }); tagifyElement.on('add', event => { + if (event.detail.data.__isValid === 'not allowed') return; + const input = event.detail.tagify.DOM.originalInput; const currentList = input.value ? JSON.parse(input.value) : []; onChange([...currentList, event.detail.data], { option: event.detail.data.value, removed: false }, input); @@ -233,19 +237,23 @@ Roll.replaceFormulaData = function (formula, data = {}, { missing, warn = false return nativeReplaceFormulaData(formula, data, { missing, warn }); }; -export const getDamageLabel = damage => { +export const getDamageKey = damage => { switch (damage) { case 3: - return game.i18n.localize('DAGGERHEART.GENERAL.Damage.severe'); + return 'severe'; case 2: - return game.i18n.localize('DAGGERHEART.GENERAL.Damage.major'); + return 'major'; case 1: - return game.i18n.localize('DAGGERHEART.GENERAL.Damage.minor'); + return 'minor'; case 0: - return game.i18n.localize('DAGGERHEART.GENERAL.Damage.none'); + return 'none'; } }; +export const getDamageLabel = damage => { + return game.i18n.localize(`DAGGERHEART.GENERAL.Damage.${getDamageKey(damage)}`); +}; + export const damageKeyToNumber = key => { switch (key) { case 'severe': diff --git a/module/systemRegistration/socket.mjs b/module/systemRegistration/socket.mjs index b336a012..0037d99d 100644 --- a/module/systemRegistration/socket.mjs +++ b/module/systemRegistration/socket.mjs @@ -45,7 +45,13 @@ export const registerSocketHooks = () => { await game.settings.set( CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear, - Math.max(0, Math.min(game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).maxFear, data.update)) + Math.max( + 0, + Math.min( + game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).maxFear, + data.update + ) + ) ); /* Hooks.callAll(socketEvent.DhpFearUpdate); await game.socket.emit(`system.${CONFIG.DH.id}`, { action: socketEvent.DhpFearUpdate }); */ @@ -64,7 +70,7 @@ export const registerSocketHooks = () => { }; export const emitAsGM = async (eventName, callback, update, uuid = null) => { - if(!game.user.isGM) { + if (!game.user.isGM) { return await game.socket.emit(`system.${CONFIG.DH.id}`, { action: socketEvent.GMUpdate, data: { @@ -74,11 +80,11 @@ export const emitAsGM = async (eventName, callback, update, uuid = null) => { } }); } else return callback(update); -} +}; export const emitAsOwner = (eventName, userId, args) => { - if(userId === game.user.id) return; - if(!eventName || !userId) return false; + if (userId === game.user.id) return; + if (!eventName || !userId) return false; game.socket.emit(`system.${CONFIG.DH.id}`, { action: eventName, data: { @@ -87,4 +93,4 @@ export const emitAsOwner = (eventName, userId, args) => { } }); return false; -} \ No newline at end of file +}; diff --git a/styles/less/dialog/beastform/beastform-container.less b/styles/less/dialog/beastform/beastform-container.less index df930532..bf0d0cae 100644 --- a/styles/less/dialog/beastform/beastform-container.less +++ b/styles/less/dialog/beastform/beastform-container.less @@ -1,46 +1,46 @@ -@import '../../utils/colors.less'; - -.application.daggerheart.dh-style.views.beastform-selection { - .beastforms-container { - display: flex; - flex-direction: column; - gap: 4px; - - .beastforms-tier { - display: grid; - grid-template-columns: 1fr 1fr 1fr 1fr; - gap: 4px; - - .beastform-container { - position: relative; - display: flex; - justify-content: center; - border: 1px solid light-dark(@dark-blue, @golden); - border-radius: 6px; - cursor: pointer; - - &.inactive { - opacity: 0.4; - } - - img { - width: 100%; - border-radius: 6px; - } - - .beastform-title { - position: absolute; - top: 4px; - display: flex; - flex-wrap: wrap; - font-size: 16px; - margin: 0 4px; - border: 1px solid light-dark(@dark-blue, @golden); - border-radius: 6px; - color: light-dark(@beige, @dark); - background-image: url('../assets/parchments/dh-parchment-light.png'); - } - } - } - } -} +@import '../../utils/colors.less'; + +.application.daggerheart.dh-style.views.beastform-selection { + .beastforms-container { + display: flex; + flex-direction: column; + gap: 4px; + + .beastforms-tier { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + gap: 4px; + + .beastform-container { + position: relative; + display: flex; + justify-content: center; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + cursor: pointer; + + &.inactive { + opacity: 0.4; + } + + img { + width: 100%; + border-radius: 6px; + } + + .beastform-title { + position: absolute; + top: 4px; + display: flex; + flex-wrap: wrap; + font-size: 16px; + margin: 0 4px; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + color: light-dark(@beige, @dark); + background-image: url('../assets/parchments/dh-parchment-light.png'); + } + } + } + } +} diff --git a/styles/less/dialog/beastform/sheet.less b/styles/less/dialog/beastform/sheet.less index dd1dff24..bd757b87 100644 --- a/styles/less/dialog/beastform/sheet.less +++ b/styles/less/dialog/beastform/sheet.less @@ -1,21 +1,21 @@ -@import '../../utils/colors.less'; -@import '../../utils/mixin.less'; - -.appTheme({ - &.beastform-selection { - .beastforms-container .beastforms-tier .beastform-container .beastform-title { - background-image: url('../assets/parchments/dh-parchment-dark.png'); - } - } -}, {}); - -.application.daggerheart.dh-style.views.beastform-selection { - footer { - margin-top: 8px; - display: flex; - - button { - flex: 1; - } - } -} +@import '../../utils/colors.less'; +@import '../../utils/mixin.less'; + +.appTheme({ + &.beastform-selection { + .beastforms-container .beastforms-tier .beastform-container .beastform-title { + background-image: url('../assets/parchments/dh-parchment-dark.png'); + } + } +}, {}); + +.application.daggerheart.dh-style.views.beastform-selection { + footer { + margin-top: 8px; + display: flex; + + button { + flex: 1; + } + } +} diff --git a/styles/less/dialog/character-creation/creation-action-footer.less b/styles/less/dialog/character-creation/creation-action-footer.less index 29e08440..88a9b3c8 100644 --- a/styles/less/dialog/character-creation/creation-action-footer.less +++ b/styles/less/dialog/character-creation/creation-action-footer.less @@ -1,13 +1,13 @@ -.daggerheart.dh-style.dialog.character-creation { - .creation-action-footer { - display: flex; - align-items: center; - gap: 32px; - - button { - flex: 1; - height: 100%; - white-space: nowrap; - } - } -} +.daggerheart.dh-style.dialog.character-creation { + .creation-action-footer { + display: flex; + align-items: center; + gap: 32px; + + button { + flex: 1; + height: 100%; + white-space: nowrap; + } + } +} diff --git a/styles/less/dialog/character-creation/selections-container.less b/styles/less/dialog/character-creation/selections-container.less index 0a610435..643a5c29 100644 --- a/styles/less/dialog/character-creation/selections-container.less +++ b/styles/less/dialog/character-creation/selections-container.less @@ -1,325 +1,325 @@ -@import '../../utils/colors.less'; - -.daggerheart.dh-style.dialog.character-creation { - .main-selections-container { - display: flex; - flex-direction: column; - gap: 4px; - - .selections-container { - width: 140px; - display: flex; - flex-direction: column; - text-align: center; - - .card-preview-container { - border-color: light-dark(@dark-blue, @golden); - } - } - - .selections-outer-container { - display: flex; - justify-content: space-evenly; - height: 210px; - } - - .section-container { - border-radius: 8px; - border-color: light-dark(@dark-blue, @golden); - - legend { - margin-left: auto; - margin-right: auto; - font-size: 28px; - font-weight: bold; - padding: 0 8px; - } - - .section-inner-container { - position: relative; - border-radius: 8px; - border-color: light-dark(@dark-blue, @golden); - display: flex; - justify-content: center; - - legend { - font-size: 20px; - } - - .action-button { - position: absolute; - bottom: -8px; - height: 16px; - width: 110px; - min-height: unset; - border: 1px solid light-dark(@dark-blue, @golden); - color: light-dark(@beige, @beige); - background-color: light-dark(var(--color-warm-3), var(--color-warm-3)); - - &:hover { - background-color: light-dark(var(--color-warm-2), var(--color-warm-2)); - filter: drop-shadow(0 0 3px light-dark(var(--color-warm-2), var(--color-warm-2))); - } - } - } - } - - .traits-container { - text-align: center; - display: flex; - gap: 16px; - - .suggested-traits-container { - display: flex; - flex-wrap: wrap; - width: 176px; - gap: 4px; - margin-bottom: 8px; - - .suggested-trait-container { - width: 56px; - white-space: nowrap; - border: 1px solid light-dark(@dark-blue, @golden); - border-radius: 6px; - color: light-dark(@beige, @dark); - background-image: url('../assets/parchments/dh-parchment-light.png'); - } - } - - .traits-inner-container { - display: flex; - justify-content: space-evenly; - gap: 8px; - - .trait-container { - border: 1px solid light-dark(@dark-blue, @golden); - padding: 0 4px; - } - } - } - - .experiences-inner-container { - display: flex; - justify-content: space-evenly; - text-align: center; - - .experience-container { - position: relative; - display: flex; - align-items: center; - - .experience-description { - border-color: light-dark(@dark-blue, @golden); - padding-right: 24px; - } - - .experience-value { - position: absolute; - right: 0; - width: 22px; - border-left: 1px solid light-dark(@dark-blue, @golden); - height: 100%; - display: flex; - align-items: center; - justify-content: center; - } - } - } - - .creation-action-footer { - display: flex; - align-items: center; - gap: 32px; - - .footer-section { - display: flex; - align-items: center; - gap: 32px; - - nav { - flex: 1; - gap: 8px; - border: 0; - - a { - flex: 1; - text-align: center; - display: flex; - justify-content: center; - position: relative; - border: 1px solid light-dark(@dark-blue, @golden); - border-radius: 6px; - - .nav-section-text { - position: relative; - display: flex; - align-items: center; - } - - .finish-marker { - position: absolute; - align-self: center; - top: -10px; - padding: 4px; - border: 1px solid; - border-radius: 50%; - height: 20px; - width: 20px; - font-size: 14px; - display: flex; - align-items: center; - justify-content: center; - background-color: var(--color-cool-4); - content: ''; - - &.finished { - background-color: var(--color-warm-2); - } - } - - .descriptor { - position: absolute; - bottom: -8px; - font-size: 12px; - border-radius: 8px; - width: 56px; - text-align: center; - line-height: 1; - border: 1px solid light-dark(@dark-blue, @golden); - border-radius: 6px; - color: light-dark(@beige, @dark); - background-image: url(../assets/parchments/dh-parchment-light.png); - } - } - } - - button { - flex: 1; - height: 100%; - white-space: nowrap; - } - } - } - - .main-equipment-selection { - display: grid; - grid-template-columns: 1fr 2fr; - gap: 16px; - - &.triple { - grid-template-columns: 1fr 1fr 1fr; - } - } - - .equipment-selection { - display: flex; - flex-direction: column; - align-items: center; - gap: 8px; - border: 2px solid light-dark(@dark-blue, @golden); - border-radius: 8px; - - legend { - margin-left: auto; - margin-right: auto; - font-size: 28px; - font-weight: bold; - padding: 0 8px; - white-space: nowrap; - } - - .equipment-subsection { - display: flex; - align-items: start; - gap: 32px; - } - - .equipment-wrapper { - display: flex; - flex-direction: column; - align-items: center; - gap: 8px; - } - - .simple-equipment-container { - display: flex; - flex-direction: column; - justify-content: space-evenly; - gap: 8px; - height: 100%; - - .simple-equipment { - border: 1px solid light-dark(@dark-blue, @golden); - border-radius: 8px; - position: relative; - display: flex; - justify-content: center; - - &.selectable { - cursor: pointer; - } - - &.inactive { - opacity: 0.4; - } - - label { - position: absolute; - top: -8px; - font-size: 12px; - white-space: nowrap; - border: 1px solid light-dark(@dark-blue, @golden); - border-radius: 6px; - color: light-dark(@beige, @dark); - background-image: url('../assets/parchments/dh-parchment-light.png'); - padding: 0 2px; - } - - img { - width: 60px; - height: 60px; - border-radius: 8px; - } - } - } - - .suggestion-container { - position: relative; - display: flex; - justify-content: center; - height: min-content; - border: 2px solid light-dark(@dark-blue, @golden); - border-radius: 8px; - - legend { - margin-left: auto; - margin-right: auto; - font-size: 12px; - } - - .suggestion-inner-container { - position: relative; - display: flex; - justify-content: center; - align-items: center; - padding: 6px; - cursor: grab; - - &.taken { - opacity: 0.4; - } - - label { - position: absolute; - top: -2px; - font-size: 12px; - } - - img { - width: 120px; - } - } - } - } - } -} +@import '../../utils/colors.less'; + +.daggerheart.dh-style.dialog.character-creation { + .main-selections-container { + display: flex; + flex-direction: column; + gap: 4px; + + .selections-container { + width: 140px; + display: flex; + flex-direction: column; + text-align: center; + + .card-preview-container { + border-color: light-dark(@dark-blue, @golden); + } + } + + .selections-outer-container { + display: flex; + justify-content: space-evenly; + height: 210px; + } + + .section-container { + border-radius: 8px; + border-color: light-dark(@dark-blue, @golden); + + legend { + margin-left: auto; + margin-right: auto; + font-size: 28px; + font-weight: bold; + padding: 0 8px; + } + + .section-inner-container { + position: relative; + border-radius: 8px; + border-color: light-dark(@dark-blue, @golden); + display: flex; + justify-content: center; + + legend { + font-size: 20px; + } + + .action-button { + position: absolute; + bottom: -8px; + height: 16px; + width: 110px; + min-height: unset; + border: 1px solid light-dark(@dark-blue, @golden); + color: light-dark(@beige, @beige); + background-color: light-dark(var(--color-warm-3), var(--color-warm-3)); + + &:hover { + background-color: light-dark(var(--color-warm-2), var(--color-warm-2)); + filter: drop-shadow(0 0 3px light-dark(var(--color-warm-2), var(--color-warm-2))); + } + } + } + } + + .traits-container { + text-align: center; + display: flex; + gap: 16px; + + .suggested-traits-container { + display: flex; + flex-wrap: wrap; + width: 176px; + gap: 4px; + margin-bottom: 8px; + + .suggested-trait-container { + width: 56px; + white-space: nowrap; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + color: light-dark(@beige, @dark); + background-image: url('../assets/parchments/dh-parchment-light.png'); + } + } + + .traits-inner-container { + display: flex; + justify-content: space-evenly; + gap: 8px; + + .trait-container { + border: 1px solid light-dark(@dark-blue, @golden); + padding: 0 4px; + } + } + } + + .experiences-inner-container { + display: flex; + justify-content: space-evenly; + text-align: center; + + .experience-container { + position: relative; + display: flex; + align-items: center; + + .experience-description { + border-color: light-dark(@dark-blue, @golden); + padding-right: 24px; + } + + .experience-value { + position: absolute; + right: 0; + width: 22px; + border-left: 1px solid light-dark(@dark-blue, @golden); + height: 100%; + display: flex; + align-items: center; + justify-content: center; + } + } + } + + .creation-action-footer { + display: flex; + align-items: center; + gap: 32px; + + .footer-section { + display: flex; + align-items: center; + gap: 32px; + + nav { + flex: 1; + gap: 8px; + border: 0; + + a { + flex: 1; + text-align: center; + display: flex; + justify-content: center; + position: relative; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + + .nav-section-text { + position: relative; + display: flex; + align-items: center; + } + + .finish-marker { + position: absolute; + align-self: center; + top: -10px; + padding: 4px; + border: 1px solid; + border-radius: 50%; + height: 20px; + width: 20px; + font-size: 14px; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--color-cool-4); + content: ''; + + &.finished { + background-color: var(--color-warm-2); + } + } + + .descriptor { + position: absolute; + bottom: -8px; + font-size: 12px; + border-radius: 8px; + width: 56px; + text-align: center; + line-height: 1; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + color: light-dark(@beige, @dark); + background-image: url(../assets/parchments/dh-parchment-light.png); + } + } + } + + button { + flex: 1; + height: 100%; + white-space: nowrap; + } + } + } + + .main-equipment-selection { + display: grid; + grid-template-columns: 1fr 2fr; + gap: 16px; + + &.triple { + grid-template-columns: 1fr 1fr 1fr; + } + } + + .equipment-selection { + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + border: 2px solid light-dark(@dark-blue, @golden); + border-radius: 8px; + + legend { + margin-left: auto; + margin-right: auto; + font-size: 28px; + font-weight: bold; + padding: 0 8px; + white-space: nowrap; + } + + .equipment-subsection { + display: flex; + align-items: start; + gap: 32px; + } + + .equipment-wrapper { + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + } + + .simple-equipment-container { + display: flex; + flex-direction: column; + justify-content: space-evenly; + gap: 8px; + height: 100%; + + .simple-equipment { + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 8px; + position: relative; + display: flex; + justify-content: center; + + &.selectable { + cursor: pointer; + } + + &.inactive { + opacity: 0.4; + } + + label { + position: absolute; + top: -8px; + font-size: 12px; + white-space: nowrap; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + color: light-dark(@beige, @dark); + background-image: url('../assets/parchments/dh-parchment-light.png'); + padding: 0 2px; + } + + img { + width: 60px; + height: 60px; + border-radius: 8px; + } + } + } + + .suggestion-container { + position: relative; + display: flex; + justify-content: center; + height: min-content; + border: 2px solid light-dark(@dark-blue, @golden); + border-radius: 8px; + + legend { + margin-left: auto; + margin-right: auto; + font-size: 12px; + } + + .suggestion-inner-container { + position: relative; + display: flex; + justify-content: center; + align-items: center; + padding: 6px; + cursor: grab; + + &.taken { + opacity: 0.4; + } + + label { + position: absolute; + top: -2px; + font-size: 12px; + } + + img { + width: 120px; + } + } + } + } + } +} diff --git a/styles/less/dialog/character-creation/sheet.less b/styles/less/dialog/character-creation/sheet.less index 5ee3f9b2..ce12d056 100644 --- a/styles/less/dialog/character-creation/sheet.less +++ b/styles/less/dialog/character-creation/sheet.less @@ -1,27 +1,27 @@ -@import '../../utils/colors.less'; -@import '../../utils/mixin.less'; - -.appTheme({ - .character-creation { - .tab-navigation nav a .descriptor { - background-image: url('../assets/parchments/dh-parchment-dark.png'); - } - .main-selections-container { - .traits-container .suggested-traits-container .suggested-trait-container, - .creation-action-footer .footer-section nav a .descriptor, - .equipment-selection .simple-equipment-container .simple-equipment label { - background-image: url('../assets/parchments/dh-parchment-dark.png'); - } - } -} -}, {}); - -.daggerheart.dh-style.dialog.character-creation { - .window-content { - gap: 16px; - - .tab { - overflow-y: auto; - } - } -} +@import '../../utils/colors.less'; +@import '../../utils/mixin.less'; + +.appTheme({ + .character-creation { + .tab-navigation nav a .descriptor { + background-image: url('../assets/parchments/dh-parchment-dark.png'); + } + .main-selections-container { + .traits-container .suggested-traits-container .suggested-trait-container, + .creation-action-footer .footer-section nav a .descriptor, + .equipment-selection .simple-equipment-container .simple-equipment label { + background-image: url('../assets/parchments/dh-parchment-dark.png'); + } + } +} +}, {}); + +.daggerheart.dh-style.dialog.character-creation { + .window-content { + gap: 16px; + + .tab { + overflow-y: auto; + } + } +} diff --git a/styles/less/dialog/character-creation/tab-navigation.less b/styles/less/dialog/character-creation/tab-navigation.less index d951a7b2..dbf285f6 100644 --- a/styles/less/dialog/character-creation/tab-navigation.less +++ b/styles/less/dialog/character-creation/tab-navigation.less @@ -1,62 +1,62 @@ -@import '../../utils/colors.less'; - -.daggerheart.dh-style.dialog.character-creation { - .tab-navigation { - nav { - flex: 1; - - a { - flex: 1; - text-align: center; - display: flex; - justify-content: center; - position: relative; - - &.disabled { - opacity: 0.4; - } - - .nav-section-text { - position: relative; - display: flex; - align-items: center; - } - - .finish-marker { - position: absolute; - align-self: center; - top: -8px; - padding: 4px; - border: 1px solid; - border-radius: 50%; - height: 16px; - width: 16px; - font-size: 12px; - display: flex; - align-items: center; - justify-content: center; - background-color: var(--color-cool-4); - content: ''; - - &.active { - background-color: var(--color-warm-2); - } - } - - .descriptor { - position: absolute; - bottom: -8px; - font-size: 12px; - border-radius: 8px; - width: 56px; - text-align: center; - line-height: 1; - border: 1px solid light-dark(@dark-blue, @golden); - border-radius: 6px; - color: light-dark(@beige, @dark); - background-image: url(../assets/parchments/dh-parchment-light.png); - } - } - } - } -} +@import '../../utils/colors.less'; + +.daggerheart.dh-style.dialog.character-creation { + .tab-navigation { + nav { + flex: 1; + + a { + flex: 1; + text-align: center; + display: flex; + justify-content: center; + position: relative; + + &.disabled { + opacity: 0.4; + } + + .nav-section-text { + position: relative; + display: flex; + align-items: center; + } + + .finish-marker { + position: absolute; + align-self: center; + top: -8px; + padding: 4px; + border: 1px solid; + border-radius: 50%; + height: 16px; + width: 16px; + font-size: 12px; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--color-cool-4); + content: ''; + + &.active { + background-color: var(--color-warm-2); + } + } + + .descriptor { + position: absolute; + bottom: -8px; + font-size: 12px; + border-radius: 8px; + width: 56px; + text-align: center; + line-height: 1; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + color: light-dark(@beige, @dark); + background-image: url(../assets/parchments/dh-parchment-light.png); + } + } + } + } +} diff --git a/styles/less/dialog/damage-reduction/sheets.less b/styles/less/dialog/damage-reduction/sheets.less index 836a2b2f..b73d7518 100644 --- a/styles/less/dialog/damage-reduction/sheets.less +++ b/styles/less/dialog/damage-reduction/sheets.less @@ -1,7 +1,7 @@ -@import '../../utils/colors.less'; - -.daggerheart.views.damage-reduction { - .window-content { - padding: 8px 0; - } -} +@import '../../utils/colors.less'; + +.daggerheart.views.damage-reduction { + .window-content { + padding: 8px 0; + } +} diff --git a/styles/less/dialog/downtime/downtime-container.less b/styles/less/dialog/downtime/downtime-container.less index 9b2c842c..4e785e7b 100644 --- a/styles/less/dialog/downtime/downtime-container.less +++ b/styles/less/dialog/downtime/downtime-container.less @@ -1,81 +1,81 @@ -@import '../../utils/spacing.less'; -@import '../../utils/colors.less'; - -.daggerheart.views { - .downtime-container { - .downtime-header { - margin: 0; - color: light-dark(@dark-blue, @golden); - text-align: center; - } - - .activity-container { - display: flex; - align-items: center; - padding: 8px; - - .activity-title { - flex: 1; - display: flex; - align-items: center; - - .activity-title-text { - font-size: 24px; - font-weight: bold; - } - - .activity-image { - width: 80px; - position: relative; - display: flex; - justify-content: center; - margin-right: 8px; - border: 2px solid black; - border-radius: 50%; - cursor: pointer; - - .activity-select-label { - position: absolute; - top: -9px; - font-size: 14px; - border: 1px solid light-dark(@dark-blue, @golden); - border-radius: 6px; - color: light-dark(@beige, @dark); - background-image: url(../assets/parchments/dh-parchment-light.png); - padding: 0 8px; - line-height: 1; - font-weight: bold; - } - - img { - border-radius: 50%; - } - - &:hover, - &.selected { - filter: drop-shadow(0 0 6px gold); - } - } - - .custom-name-input { - font-size: 24px; - font-weight: bold; - padding: 0; - background: transparent; - color: rgb(239, 230, 216); - } - } - - .activity-body { - flex: 1; - font-style: italic; - } - } - } - - &.downtime { - .activity-text-area { - resize: none; - } - } -} +@import '../../utils/spacing.less'; +@import '../../utils/colors.less'; + +.daggerheart.views { + .downtime-container { + .downtime-header { + margin: 0; + color: light-dark(@dark-blue, @golden); + text-align: center; + } + + .activity-container { + display: flex; + align-items: center; + padding: 8px; + + .activity-title { + flex: 1; + display: flex; + align-items: center; + + .activity-title-text { + font-size: 24px; + font-weight: bold; + } + + .activity-image { + width: 80px; + position: relative; + display: flex; + justify-content: center; + margin-right: 8px; + border: 2px solid black; + border-radius: 50%; + cursor: pointer; + + .activity-select-label { + position: absolute; + top: -9px; + font-size: 14px; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + color: light-dark(@beige, @dark); + background-image: url(../assets/parchments/dh-parchment-light.png); + padding: 0 8px; + line-height: 1; + font-weight: bold; + } + + img { + border-radius: 50%; + } + + &:hover, + &.selected { + filter: drop-shadow(0 0 6px gold); + } + } + + .custom-name-input { + font-size: 24px; + font-weight: bold; + padding: 0; + background: transparent; + color: rgb(239, 230, 216); + } + } + + .activity-body { + flex: 1; + font-style: italic; + } + } + } + + &.downtime { + .activity-text-area { + resize: none; + } + } +} diff --git a/styles/less/dialog/index.less b/styles/less/dialog/index.less index ec3ef200..40280270 100644 --- a/styles/less/dialog/index.less +++ b/styles/less/dialog/index.less @@ -1,19 +1,19 @@ -@import './level-up/navigation-container.less'; -@import './level-up/selections-container.less'; -@import './level-up/sheet.less'; -@import './level-up/summary-container.less'; -@import './level-up/tiers-container.less'; - -@import './downtime/downtime-container.less'; - -@import './beastform/beastform-container.less'; -@import './beastform/sheet.less'; - -@import './character-creation/creation-action-footer.less'; -@import './character-creation/selections-container.less'; -@import './character-creation/sheet.less'; -@import './character-creation/tab-navigation.less'; - -@import './dice-roll/roll-selection.less'; -@import './damage-reduction/damage-reduction-container.less'; -@import './damage-reduction/sheets.less'; +@import './level-up/navigation-container.less'; +@import './level-up/selections-container.less'; +@import './level-up/sheet.less'; +@import './level-up/summary-container.less'; +@import './level-up/tiers-container.less'; + +@import './downtime/downtime-container.less'; + +@import './beastform/beastform-container.less'; +@import './beastform/sheet.less'; + +@import './character-creation/creation-action-footer.less'; +@import './character-creation/selections-container.less'; +@import './character-creation/sheet.less'; +@import './character-creation/tab-navigation.less'; + +@import './dice-roll/roll-selection.less'; +@import './damage-reduction/damage-reduction-container.less'; +@import './damage-reduction/sheets.less'; diff --git a/styles/less/dialog/level-up/navigation-container.less b/styles/less/dialog/level-up/navigation-container.less index b52abf20..142cf089 100644 --- a/styles/less/dialog/level-up/navigation-container.less +++ b/styles/less/dialog/level-up/navigation-container.less @@ -1,30 +1,30 @@ -.daggerheart.levelup { - .levelup-navigation-container { - display: flex; - align-items: center; - gap: 22px; - height: 36px; - - nav { - flex: 1; - - .levelup-tab-container { - display: flex; - align-items: center; - gap: 4px; - } - } - - .levelup-navigation-actions { - width: 306px; - display: flex; - justify-content: end; - gap: 16px; - margin-right: 4px; - - * { - width: calc(50% - 8px); - } - } - } -} +.daggerheart.levelup { + .levelup-navigation-container { + display: flex; + align-items: center; + gap: 22px; + height: 36px; + + nav { + flex: 1; + + .levelup-tab-container { + display: flex; + align-items: center; + gap: 4px; + } + } + + .levelup-navigation-actions { + width: 306px; + display: flex; + justify-content: end; + gap: 16px; + margin-right: 4px; + + * { + width: calc(50% - 8px); + } + } + } +} diff --git a/styles/less/dialog/level-up/selections-container.less b/styles/less/dialog/level-up/selections-container.less index b04a6182..182e2962 100644 --- a/styles/less/dialog/level-up/selections-container.less +++ b/styles/less/dialog/level-up/selections-container.less @@ -1,108 +1,108 @@ -.daggerheart.levelup { - .levelup-selections-container { - .achievement-experience-cards { - display: flex; - gap: 8px; - - .achievement-experience-card { - border: 1px solid; - border-radius: 4px; - padding-right: 4px; - font-size: 18px; - display: flex; - justify-content: space-between; - align-items: center; - gap: 4px; - - .achievement-experience-marker { - border: 1px solid; - border-radius: 50%; - height: 18px; - width: 18px; - display: flex; - align-items: center; - justify-content: center; - font-size: 12px; - } - } - } - - .levelup-card-selection { - display: flex; - flex-wrap: wrap; - gap: 40px; - - .card-preview-container { - width: calc(100% * (1 / 5)); - } - - .levelup-domains-selection-container { - display: flex; - flex-direction: column; - gap: 8px; - - .levelup-domain-selection-container { - display: flex; - flex-direction: column; - align-items: center; - flex: 1; - position: relative; - cursor: pointer; - - &.disabled { - pointer-events: none; - opacity: 0.4; - } - - .levelup-domain-label { - position: absolute; - text-align: center; - top: 4px; - background: grey; - padding: 0 12px; - border-radius: 6px; - } - - img { - height: 124px; - } - - .levelup-domain-selected { - position: absolute; - height: 54px; - width: 54px; - border-radius: 50%; - border: 2px solid; - font-size: 48px; - display: flex; - align-items: center; - justify-content: center; - background-image: url(../assets/parchments/dh-parchment-light.png); - color: var(--color-dark-5); - top: calc(50% - 29px); - - i { - position: relative; - right: 2px; - } - } - } - } - } - - .levelup-selections-title { - display: flex; - align-items: center; - gap: 4px; - } - - .levelup-radio-choices { - display: flex; - gap: 8px; - - label { - flex: 0; - } - } - } -} +.daggerheart.levelup { + .levelup-selections-container { + .achievement-experience-cards { + display: flex; + gap: 8px; + + .achievement-experience-card { + border: 1px solid; + border-radius: 4px; + padding-right: 4px; + font-size: 18px; + display: flex; + justify-content: space-between; + align-items: center; + gap: 4px; + + .achievement-experience-marker { + border: 1px solid; + border-radius: 50%; + height: 18px; + width: 18px; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + } + } + } + + .levelup-card-selection { + display: flex; + flex-wrap: wrap; + gap: 40px; + + .card-preview-container { + width: calc(100% * (1 / 5)); + } + + .levelup-domains-selection-container { + display: flex; + flex-direction: column; + gap: 8px; + + .levelup-domain-selection-container { + display: flex; + flex-direction: column; + align-items: center; + flex: 1; + position: relative; + cursor: pointer; + + &.disabled { + pointer-events: none; + opacity: 0.4; + } + + .levelup-domain-label { + position: absolute; + text-align: center; + top: 4px; + background: grey; + padding: 0 12px; + border-radius: 6px; + } + + img { + height: 124px; + } + + .levelup-domain-selected { + position: absolute; + height: 54px; + width: 54px; + border-radius: 50%; + border: 2px solid; + font-size: 48px; + display: flex; + align-items: center; + justify-content: center; + background-image: url(../assets/parchments/dh-parchment-light.png); + color: var(--color-dark-5); + top: calc(50% - 29px); + + i { + position: relative; + right: 2px; + } + } + } + } + } + + .levelup-selections-title { + display: flex; + align-items: center; + gap: 4px; + } + + .levelup-radio-choices { + display: flex; + gap: 8px; + + label { + flex: 0; + } + } + } +} diff --git a/styles/less/dialog/level-up/sheet.less b/styles/less/dialog/level-up/sheet.less index 77e7244d..2f89034c 100644 --- a/styles/less/dialog/level-up/sheet.less +++ b/styles/less/dialog/level-up/sheet.less @@ -1,37 +1,37 @@ -@import '../../utils/mixin.less'; - -.appTheme({}, { - &.levelup { - .tiers-container { - .tier-container { - background-image: url('../assets/parchments/dh-parchment-light.png'); - } - } - } -}); - -.daggerheart.levelup { - .window-content { - max-height: 960px; - overflow: auto; - } - - div[data-application-part='form'] { - display: flex; - flex-direction: column; - gap: 8px; - } - - section { - .section-container { - display: flex; - flex-direction: column; - gap: 8px; - margin-top: 8px; - } - } - - .levelup-footer { - display: flex; - } -} +@import '../../utils/mixin.less'; + +.appTheme({}, { + &.levelup { + .tiers-container { + .tier-container { + background-image: url('../assets/parchments/dh-parchment-light.png'); + } + } + } +}); + +.daggerheart.levelup { + .window-content { + max-height: 960px; + overflow: auto; + } + + div[data-application-part='form'] { + display: flex; + flex-direction: column; + gap: 8px; + } + + section { + .section-container { + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 8px; + } + } + + .levelup-footer { + display: flex; + } +} diff --git a/styles/less/dialog/level-up/summary-container.less b/styles/less/dialog/level-up/summary-container.less index fb221b07..fbaa783e 100644 --- a/styles/less/dialog/level-up/summary-container.less +++ b/styles/less/dialog/level-up/summary-container.less @@ -1,37 +1,37 @@ -.daggerheart.levelup { - .levelup-summary-container { - .level-achievements-container, - .level-advancements-container { - display: flex; - flex-direction: column; - gap: 8px; - - h2, - h3, - h4, - h5 { - margin: 0; - color: var(--color-text-secondary); - } - } - - .increase-container { - display: flex; - align-items: center; - gap: 4px; - font-size: 20px; - } - - .summary-selection-container { - display: flex; - gap: 8px; - - .summary-selection { - border: 2px solid; - border-radius: 6px; - padding: 0 4px; - font-size: 18px; - } - } - } -} +.daggerheart.levelup { + .levelup-summary-container { + .level-achievements-container, + .level-advancements-container { + display: flex; + flex-direction: column; + gap: 8px; + + h2, + h3, + h4, + h5 { + margin: 0; + color: var(--color-text-secondary); + } + } + + .increase-container { + display: flex; + align-items: center; + gap: 4px; + font-size: 20px; + } + + .summary-selection-container { + display: flex; + gap: 8px; + + .summary-selection { + border: 2px solid; + border-radius: 6px; + padding: 0 4px; + font-size: 18px; + } + } + } +} diff --git a/styles/less/dialog/level-up/tiers-container.less b/styles/less/dialog/level-up/tiers-container.less index e666b128..bf270fe9 100644 --- a/styles/less/dialog/level-up/tiers-container.less +++ b/styles/less/dialog/level-up/tiers-container.less @@ -1,65 +1,65 @@ -.daggerheart.levelup { - .tiers-container { - display: flex; - gap: 16px; - - .tier-container { - flex: 1; - display: flex; - flex-direction: column; - gap: 8px; - background-image: url('../assets/parchments/dh-parchment-dark.png'); - - &.inactive { - opacity: 0.4; - pointer-events: none; - } - - legend { - margin-left: auto; - margin-right: auto; - font-size: 22px; - font-weight: bold; - padding: 0 12px; - } - - .checkbox-group-container { - display: grid; - grid-template-columns: 1fr 3fr; - gap: 4px; - - .checkboxes-container { - display: flex; - justify-content: end; - gap: 4px; - - .checkbox-grouping-coontainer { - display: flex; - height: min-content; - - &.multi { - border: 2px solid grey; - padding: 2.4px 2.5px 0; - border-radius: 4px; - gap: 2px; - - .selection-checkbox { - margin-left: 0; - margin-right: 0; - } - } - - .selection-checkbox { - margin: 0; - } - } - } - - .checkbox-group-label { - font-size: 14px; - font-style: italic; - } - } - } - } -} +.daggerheart.levelup { + .tiers-container { + display: flex; + gap: 16px; + + .tier-container { + flex: 1; + display: flex; + flex-direction: column; + gap: 8px; + background-image: url('../assets/parchments/dh-parchment-dark.png'); + + &.inactive { + opacity: 0.4; + pointer-events: none; + } + + legend { + margin-left: auto; + margin-right: auto; + font-size: 22px; + font-weight: bold; + padding: 0 12px; + } + + .checkbox-group-container { + display: grid; + grid-template-columns: 1fr 3fr; + gap: 4px; + + .checkboxes-container { + display: flex; + justify-content: end; + gap: 4px; + + .checkbox-grouping-coontainer { + display: flex; + height: min-content; + + &.multi { + border: 2px solid grey; + padding: 2.4px 2.5px 0; + border-radius: 4px; + gap: 2px; + + .selection-checkbox { + margin-left: 0; + margin-right: 0; + } + } + + .selection-checkbox { + margin: 0; + } + } + } + + .checkbox-group-label { + font-size: 14px; + font-style: italic; + } + } + } + } +} diff --git a/styles/less/global/index.less b/styles/less/global/index.less index 461813c1..0559c7ff 100644 --- a/styles/less/global/index.less +++ b/styles/less/global/index.less @@ -1,14 +1,14 @@ -@import './sheet.less'; -@import './dialog.less'; -@import './elements.less'; -@import './tab-navigation.less'; -@import './tab-form-footer.less'; -@import './tab-actions.less'; -@import './tab-features.less'; -@import './tab-effects.less'; -@import './item-header.less'; -@import './feature-section.less'; -@import './inventory-item.less'; -@import './inventory-fieldset-items.less'; -@import './prose-mirror.less'; -@import './filter-menu.less'; +@import './sheet.less'; +@import './dialog.less'; +@import './elements.less'; +@import './tab-navigation.less'; +@import './tab-form-footer.less'; +@import './tab-actions.less'; +@import './tab-features.less'; +@import './tab-effects.less'; +@import './item-header.less'; +@import './feature-section.less'; +@import './inventory-item.less'; +@import './inventory-fieldset-items.less'; +@import './prose-mirror.less'; +@import './filter-menu.less'; diff --git a/styles/less/sheets-settings/adversary-settings/experiences.less b/styles/less/sheets-settings/adversary-settings/experiences.less index 36fe85cb..89a7c2d9 100644 --- a/styles/less/sheets-settings/adversary-settings/experiences.less +++ b/styles/less/sheets-settings/adversary-settings/experiences.less @@ -1,28 +1,28 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; - -.application.daggerheart.dh-style.dialog { - .tab.experiences { - .add-experience-btn { - width: 100%; - margin-bottom: 12px; - } - - .experience-list { - display: flex; - flex-direction: column; - gap: 10px; - - .experience-item { - display: grid; - grid-template-columns: 3fr 1fr 30px; - align-items: center; - gap: 5px; - - a { - text-align: center; - } - } - } - } -} +@import '../../utils/colors.less'; +@import '../../utils/fonts.less'; + +.application.daggerheart.dh-style.dialog { + .tab.experiences { + .add-experience-btn { + width: 100%; + margin-bottom: 12px; + } + + .experience-list { + display: flex; + flex-direction: column; + gap: 10px; + + .experience-item { + display: grid; + grid-template-columns: 3fr 1fr 30px; + align-items: center; + gap: 5px; + + a { + text-align: center; + } + } + } + } +} diff --git a/styles/less/sheets-settings/adversary-settings/sheet.less b/styles/less/sheets-settings/adversary-settings/sheet.less index 5fd80b60..b4b0683b 100644 --- a/styles/less/sheets-settings/adversary-settings/sheet.less +++ b/styles/less/sheets-settings/adversary-settings/sheet.less @@ -1,18 +1,18 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; - -.application.daggerheart.dh-style.dialog { - .tab { - &.details.active, - &.attack.active { - display: flex; - flex-direction: column; - gap: 16px; - } - - .fieldsets-section { - display: flex; - gap: 16px; - } - } -} +@import '../../utils/colors.less'; +@import '../../utils/fonts.less'; + +.application.daggerheart.dh-style.dialog { + .tab { + &.details.active, + &.attack.active { + display: flex; + flex-direction: column; + gap: 16px; + } + + .fieldsets-section { + display: flex; + gap: 16px; + } + } +} diff --git a/styles/less/sheets-settings/environment-settings/adversaries.less b/styles/less/sheets-settings/environment-settings/adversaries.less index a60314ff..ba8cc8e4 100644 --- a/styles/less/sheets-settings/environment-settings/adversaries.less +++ b/styles/less/sheets-settings/environment-settings/adversaries.less @@ -1,50 +1,50 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; - -.application.daggerheart.dh-style.dialog { - .tab.adversaries { - max-height: 450px; - overflow-y: auto; - scrollbar-width: thin; - scrollbar-color: light-dark(@dark-blue, @golden) transparent; - - .add-action-btn { - width: 100%; - margin-bottom: 12px; - } - - .category-container { - display: flex; - flex-direction: column; - align-items: start; - gap: 8px; - - .category-name { - display: flex; - align-items: center; - gap: 10px; - width: 100%; - } - - .adversaries-container { - display: flex; - flex-direction: column; - gap: 6px; - width: 100%; - } - } - - .adversaries-dragger { - display: flex; - align-items: center; - justify-content: center; - box-sizing: border-box; - width: 100%; - height: 40px; - border: 1px dashed light-dark(@dark-blue-50, @beige-50); - border-radius: 3px; - color: light-dark(@dark-blue-50, @beige-50); - font-family: @font-body; - } - } -} +@import '../../utils/colors.less'; +@import '../../utils/fonts.less'; + +.application.daggerheart.dh-style.dialog { + .tab.adversaries { + max-height: 450px; + overflow-y: auto; + scrollbar-width: thin; + scrollbar-color: light-dark(@dark-blue, @golden) transparent; + + .add-action-btn { + width: 100%; + margin-bottom: 12px; + } + + .category-container { + display: flex; + flex-direction: column; + align-items: start; + gap: 8px; + + .category-name { + display: flex; + align-items: center; + gap: 10px; + width: 100%; + } + + .adversaries-container { + display: flex; + flex-direction: column; + gap: 6px; + width: 100%; + } + } + + .adversaries-dragger { + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + width: 100%; + height: 40px; + border: 1px dashed light-dark(@dark-blue-50, @beige-50); + border-radius: 3px; + color: light-dark(@dark-blue-50, @beige-50); + font-family: @font-body; + } + } +} diff --git a/styles/less/sheets-settings/header.less b/styles/less/sheets-settings/header.less index 209037ef..6ac2663f 100644 --- a/styles/less/sheets-settings/header.less +++ b/styles/less/sheets-settings/header.less @@ -1,20 +1,20 @@ -@import '../utils/colors.less'; -@import '../utils/fonts.less'; - -.application.daggerheart.dh-style.dialog { - .window-content { - .dialog-header { - width: 100%; - padding-bottom: 16px; - h1 { - font-family: @font-subtitle; - font-style: normal; - font-weight: 700; - font-size: 24px; - margin: 0; - text-align: center; - color: light-dark(@dark-blue, @golden); - } - } - } -} +@import '../utils/colors.less'; +@import '../utils/fonts.less'; + +.application.daggerheart.dh-style.dialog { + .window-content { + .dialog-header { + width: 100%; + padding-bottom: 16px; + h1 { + font-family: @font-subtitle; + font-style: normal; + font-weight: 700; + font-size: 24px; + margin: 0; + text-align: center; + color: light-dark(@dark-blue, @golden); + } + } + } +} diff --git a/styles/less/sheets-settings/index.less b/styles/less/sheets-settings/index.less index 77fa6d94..e7818326 100644 --- a/styles/less/sheets-settings/index.less +++ b/styles/less/sheets-settings/index.less @@ -1,7 +1,7 @@ -@import './header.less'; -@import './adversary-settings/sheet.less'; -@import './adversary-settings/experiences.less'; -@import './adversary-settings/features.less'; - -@import './environment-settings/features.less'; -@import './environment-settings/adversaries.less'; \ No newline at end of file +@import './header.less'; +@import './adversary-settings/sheet.less'; +@import './adversary-settings/experiences.less'; +@import './adversary-settings/features.less'; + +@import './environment-settings/features.less'; +@import './environment-settings/adversaries.less'; diff --git a/styles/less/sheets/actors/adversary/header.less b/styles/less/sheets/actors/adversary/header.less index 9ba00355..a8646a0a 100644 --- a/styles/less/sheets/actors/adversary/header.less +++ b/styles/less/sheets/actors/adversary/header.less @@ -1,80 +1,80 @@ -@import '../../../utils/colors.less'; -@import '../../../utils/fonts.less'; - -.application.sheet.daggerheart.actor.dh-style.adversary { - .adversary-header-sheet { - padding: 0 15px; - padding-top: 36px; - width: 100%; - - .name-row { - display: flex; - gap: 5px; - align-items: center; - justify-content: space-between; - padding: 0; - padding-top: 5px; - padding-bottom: 8px; - flex: 1; - - input[type='text'] { - font-size: 32px; - height: 42px; - text-align: start; - border: 1px solid transparent; - outline: 2px solid transparent; - transition: all 0.3s ease; - - &:hover { - outline: 2px solid light-dark(@dark, @golden); - } - } - } - - .tags { - display: flex; - gap: 10px; - padding-bottom: 16px; - - .tag { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - padding: 3px 5px; - font-size: 12px; - font: @font-body; - - background: light-dark(@dark-15, @beige-15); - border: 1px solid light-dark(@dark, @beige); - border-radius: 3px; - } - - .label { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - font-size: 12px; - } - } - - .adversary-info { - display: flex; - flex-direction: column; - gap: 12px; - padding: 16px 0; - - .description, - .motives-and-tatics { - font-family: @font-body; - } - } - - .adversary-navigation { - display: flex; - gap: 8px; - align-items: center; - } - } -} +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; + +.application.sheet.daggerheart.actor.dh-style.adversary { + .adversary-header-sheet { + padding: 0 15px; + padding-top: 36px; + width: 100%; + + .name-row { + display: flex; + gap: 5px; + align-items: center; + justify-content: space-between; + padding: 0; + padding-top: 5px; + padding-bottom: 8px; + flex: 1; + + input[type='text'] { + font-size: 32px; + height: 42px; + text-align: start; + border: 1px solid transparent; + outline: 2px solid transparent; + transition: all 0.3s ease; + + &:hover { + outline: 2px solid light-dark(@dark, @golden); + } + } + } + + .tags { + display: flex; + gap: 10px; + padding-bottom: 16px; + + .tag { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + padding: 3px 5px; + font-size: 12px; + font: @font-body; + + background: light-dark(@dark-15, @beige-15); + border: 1px solid light-dark(@dark, @beige); + border-radius: 3px; + } + + .label { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-size: 12px; + } + } + + .adversary-info { + display: flex; + flex-direction: column; + gap: 12px; + padding: 16px 0; + + .description, + .motives-and-tatics { + font-family: @font-body; + } + } + + .adversary-navigation { + display: flex; + gap: 8px; + align-items: center; + } + } +} diff --git a/styles/less/sheets/actors/adversary/sheet.less b/styles/less/sheets/actors/adversary/sheet.less index baa80bb3..af7918c6 100644 --- a/styles/less/sheets/actors/adversary/sheet.less +++ b/styles/less/sheets/actors/adversary/sheet.less @@ -1,28 +1,28 @@ -@import '../../../utils/colors.less'; -@import '../../../utils/fonts.less'; - -.application.sheet.daggerheart.actor.dh-style.adversary { - .window-content { - display: grid; - grid-template-columns: 275px 1fr; - grid-template-rows: auto 1fr; - gap: 15px 0; - height: 100%; - width: 100%; - - .adversary-sidebar-sheet { - grid-row: 1 / span 2; - grid-column: 1; - } - - .adversary-header-sheet { - grid-row: 1; - grid-column: 2; - } - - .tab { - grid-row: 2; - grid-column: 2; - } - } -} +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; + +.application.sheet.daggerheart.actor.dh-style.adversary { + .window-content { + display: grid; + grid-template-columns: 275px 1fr; + grid-template-rows: auto 1fr; + gap: 15px 0; + height: 100%; + width: 100%; + + .adversary-sidebar-sheet { + grid-row: 1 / span 2; + grid-column: 1; + } + + .adversary-header-sheet { + grid-row: 1; + grid-column: 2; + } + + .tab { + grid-row: 2; + grid-column: 2; + } + } +} diff --git a/styles/less/sheets/actors/adversary/sidebar.less b/styles/less/sheets/actors/adversary/sidebar.less index 1dabf5ae..e50ba0c9 100644 --- a/styles/less/sheets/actors/adversary/sidebar.less +++ b/styles/less/sheets/actors/adversary/sidebar.less @@ -1,351 +1,351 @@ -@import '../../../utils/colors.less'; -@import '../../../utils/fonts.less'; -@import '../../../utils/mixin.less'; - -.appTheme({ - &.adversary { - .adversary-sidebar-sheet { - background-image: url('../assets/parchments/dh-parchment-dark.png'); - } - } -}, { - &.adversary { - .adversary-sidebar-sheet { - background: transparent; - } - } -}); - -.application.sheet.daggerheart.actor.dh-style.adversary { - .adversary-sidebar-sheet { - width: 275px; - min-width: 275px; - border-right: 1px solid light-dark(@dark-blue, @golden); - - .portrait { - position: relative; - border-bottom: 1px solid light-dark(@dark-blue, @golden); - cursor: pointer; - - img { - height: 235px; - width: 275px; - object-fit: cover; - } - - .death-roll-btn { - display: none; - } - - &.death-roll { - filter: grayscale(1); - - .death-roll-btn { - display: flex; - position: absolute; - top: 30%; - right: 30%; - font-size: 6rem; - color: @beige; - - &:hover { - text-shadow: 0 0 8px @beige; - } - } - } - } - - .threshold-section { - position: relative; - display: flex; - gap: 10px; - background-color: light-dark(transparent, @dark-blue); - color: light-dark(@dark-blue, @golden); - padding: 5px 10px; - border: 1px solid light-dark(@dark-blue, @golden); - border-radius: 6px; - align-items: center; - width: fit-content; - height: 30px; - margin-top: 16px; - - h4 { - font-size: 14px; - font-weight: bold; - text-transform: uppercase; - color: light-dark(@dark-blue, @golden); - - &.threshold-value { - color: light-dark(@dark, @beige); - } - } - - .threshold-legend { - position: absolute; - bottom: -21px; - color: light-dark(@golden, @dark-blue); - background-color: light-dark(@dark-blue, @golden); - padding: 3px; - justify-self: anchor-center; - border-radius: 0 0 3px 3px; - text-transform: capitalize; - } - - .hope-value { - display: flex; - cursor: pointer; - } - } - - .info-section { - position: relative; - display: flex; - flex-direction: column; - top: -20px; - gap: 16px; - margin-bottom: -10px; - - .resources-section { - display: flex; - justify-content: space-evenly; - - .status-bar { - position: relative; - width: 100px; - height: 40px; - justify-items: center; - - .status-label { - position: relative; - top: 40px; - height: 22px; - width: 79px; - clip-path: path('M0 0H79L74 16.5L39 22L4 16.5L0 0Z'); - background: light-dark(@dark-blue, @golden); - - h4 { - font-weight: bold; - text-align: center; - line-height: 18px; - color: light-dark(@beige, @dark-blue); - } - } - .status-value { - position: absolute; - display: flex; - padding: 0 6px; - font-size: 1.5rem; - align-items: center; - width: 100px; - height: 40px; - justify-content: center; - text-align: center; - z-index: 2; - color: @beige; - - input[type='number'] { - background: transparent; - font-size: 1.5rem; - width: 40px; - height: 30px; - text-align: center; - border: none; - outline: 2px solid transparent; - color: @beige; - - &.bar-input { - padding: 0; - color: @beige; - backdrop-filter: none; - background: transparent; - transition: all 0.3s ease; - - &:hover, - &:focus { - background: @semi-transparent-dark-blue; - backdrop-filter: blur(9.5px); - } - } - } - - .bar-label { - width: 40px; - } - } - .progress-bar { - position: absolute; - appearance: none; - width: 100px; - height: 40px; - border: 1px solid light-dark(@dark-blue, @golden); - border-radius: 6px; - z-index: 1; - background: @dark-blue; - - &::-webkit-progress-bar { - border: none; - background: @dark-blue; - border-radius: 6px; - } - &::-webkit-progress-value { - background: @gradient-hp; - border-radius: 6px; - } - &.stress-color::-webkit-progress-value { - background: @gradient-stress; - border-radius: 6px; - } - &::-moz-progress-bar { - background: @gradient-hp; - border-radius: 6px; - } - &.stress-color::-moz-progress-bar { - background: @gradient-stress; - border-radius: 6px; - } - } - } - } - - .status-section { - display: flex; - flex-wrap: wrap; - gap: 10px; - justify-content: center; - - .status-number { - justify-items: center; - - .status-value { - position: relative; - display: flex; - width: 50px; - height: 30px; - border: 1px solid light-dark(@dark-blue, @golden); - border-bottom: none; - border-radius: 6px 6px 0 0; - padding: 0 6px; - font-size: 1.2rem; - align-items: center; - justify-content: center; - background: light-dark(transparent, @dark-blue); - z-index: 2; - - &.armor-slots { - width: 80px; - height: 30px; - } - } - - .status-label { - padding: 2px 10px; - width: 100%; - border-radius: 3px; - background: light-dark(@dark-blue, @golden); - - h4 { - font-weight: bold; - text-align: center; - line-height: 18px; - font-size: 12px; - color: light-dark(@beige, @dark-blue); - } - } - } - } - } - - .items-sidebar-list { - display: flex; - flex-direction: column; - gap: 5px; - - .inventory-item { - padding: 0 10px; - } - } - - .attack-section { - .title { - display: flex; - gap: 15px; - align-items: center; - - h3 { - font-size: 20px; - } - } - .items-list { - display: flex; - flex-direction: column; - gap: 10px; - align-items: center; - } - } - - .experience-section { - margin-bottom: 20px; - - .title { - display: flex; - gap: 15px; - align-items: center; - - h3 { - font-size: 20px; - } - } - - .experience-list { - display: flex; - flex-direction: column; - gap: 5px; - width: 100%; - margin-top: 10px; - align-items: center; - - .experience-row { - display: flex; - gap: 5px; - width: 250px; - align-items: center; - justify-content: space-between; - - .experience-name { - width: 180px; - text-align: start; - font-size: 14px; - font-family: @font-body; - color: light-dark(@dark, @beige); - } - } - - .experience-value { - height: 25px; - width: 35px; - font-size: 14px; - font-family: @font-body; - color: light-dark(@dark, @beige); - align-content: center; - text-align: center; - background: url(../assets/svg/experience-shield.svg) no-repeat; - - .theme-light & { - background: url('../assets/svg/experience-shield-light.svg') no-repeat; - } - } - } - } - - .reaction-section { - display: flex; - padding: 0 10px; - margin-top: 20px; - width: 100%; - - button { - width: 100%; - } - } - } -} +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; +@import '../../../utils/mixin.less'; + +.appTheme({ + &.adversary { + .adversary-sidebar-sheet { + background-image: url('../assets/parchments/dh-parchment-dark.png'); + } + } +}, { + &.adversary { + .adversary-sidebar-sheet { + background: transparent; + } + } +}); + +.application.sheet.daggerheart.actor.dh-style.adversary { + .adversary-sidebar-sheet { + width: 275px; + min-width: 275px; + border-right: 1px solid light-dark(@dark-blue, @golden); + + .portrait { + position: relative; + border-bottom: 1px solid light-dark(@dark-blue, @golden); + cursor: pointer; + + img { + height: 235px; + width: 275px; + object-fit: cover; + } + + .death-roll-btn { + display: none; + } + + &.death-roll { + filter: grayscale(1); + + .death-roll-btn { + display: flex; + position: absolute; + top: 30%; + right: 30%; + font-size: 6rem; + color: @beige; + + &:hover { + text-shadow: 0 0 8px @beige; + } + } + } + } + + .threshold-section { + position: relative; + display: flex; + gap: 10px; + background-color: light-dark(transparent, @dark-blue); + color: light-dark(@dark-blue, @golden); + padding: 5px 10px; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + align-items: center; + width: fit-content; + height: 30px; + margin-top: 16px; + + h4 { + font-size: 14px; + font-weight: bold; + text-transform: uppercase; + color: light-dark(@dark-blue, @golden); + + &.threshold-value { + color: light-dark(@dark, @beige); + } + } + + .threshold-legend { + position: absolute; + bottom: -21px; + color: light-dark(@golden, @dark-blue); + background-color: light-dark(@dark-blue, @golden); + padding: 3px; + justify-self: anchor-center; + border-radius: 0 0 3px 3px; + text-transform: capitalize; + } + + .hope-value { + display: flex; + cursor: pointer; + } + } + + .info-section { + position: relative; + display: flex; + flex-direction: column; + top: -20px; + gap: 16px; + margin-bottom: -10px; + + .resources-section { + display: flex; + justify-content: space-evenly; + + .status-bar { + position: relative; + width: 100px; + height: 40px; + justify-items: center; + + .status-label { + position: relative; + top: 40px; + height: 22px; + width: 79px; + clip-path: path('M0 0H79L74 16.5L39 22L4 16.5L0 0Z'); + background: light-dark(@dark-blue, @golden); + + h4 { + font-weight: bold; + text-align: center; + line-height: 18px; + color: light-dark(@beige, @dark-blue); + } + } + .status-value { + position: absolute; + display: flex; + padding: 0 6px; + font-size: 1.5rem; + align-items: center; + width: 100px; + height: 40px; + justify-content: center; + text-align: center; + z-index: 2; + color: @beige; + + input[type='number'] { + background: transparent; + font-size: 1.5rem; + width: 40px; + height: 30px; + text-align: center; + border: none; + outline: 2px solid transparent; + color: @beige; + + &.bar-input { + padding: 0; + color: @beige; + backdrop-filter: none; + background: transparent; + transition: all 0.3s ease; + + &:hover, + &:focus { + background: @semi-transparent-dark-blue; + backdrop-filter: blur(9.5px); + } + } + } + + .bar-label { + width: 40px; + } + } + .progress-bar { + position: absolute; + appearance: none; + width: 100px; + height: 40px; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + z-index: 1; + background: @dark-blue; + + &::-webkit-progress-bar { + border: none; + background: @dark-blue; + border-radius: 6px; + } + &::-webkit-progress-value { + background: @gradient-hp; + border-radius: 6px; + } + &.stress-color::-webkit-progress-value { + background: @gradient-stress; + border-radius: 6px; + } + &::-moz-progress-bar { + background: @gradient-hp; + border-radius: 6px; + } + &.stress-color::-moz-progress-bar { + background: @gradient-stress; + border-radius: 6px; + } + } + } + } + + .status-section { + display: flex; + flex-wrap: wrap; + gap: 10px; + justify-content: center; + + .status-number { + justify-items: center; + + .status-value { + position: relative; + display: flex; + width: 50px; + height: 30px; + border: 1px solid light-dark(@dark-blue, @golden); + border-bottom: none; + border-radius: 6px 6px 0 0; + padding: 0 6px; + font-size: 1.2rem; + align-items: center; + justify-content: center; + background: light-dark(transparent, @dark-blue); + z-index: 2; + + &.armor-slots { + width: 80px; + height: 30px; + } + } + + .status-label { + padding: 2px 10px; + width: 100%; + border-radius: 3px; + background: light-dark(@dark-blue, @golden); + + h4 { + font-weight: bold; + text-align: center; + line-height: 18px; + font-size: 12px; + color: light-dark(@beige, @dark-blue); + } + } + } + } + } + + .items-sidebar-list { + display: flex; + flex-direction: column; + gap: 5px; + + .inventory-item { + padding: 0 10px; + } + } + + .attack-section { + .title { + display: flex; + gap: 15px; + align-items: center; + + h3 { + font-size: 20px; + } + } + .items-list { + display: flex; + flex-direction: column; + gap: 10px; + align-items: center; + } + } + + .experience-section { + margin-bottom: 20px; + + .title { + display: flex; + gap: 15px; + align-items: center; + + h3 { + font-size: 20px; + } + } + + .experience-list { + display: flex; + flex-direction: column; + gap: 5px; + width: 100%; + margin-top: 10px; + align-items: center; + + .experience-row { + display: flex; + gap: 5px; + width: 250px; + align-items: center; + justify-content: space-between; + + .experience-name { + width: 180px; + text-align: start; + font-size: 14px; + font-family: @font-body; + color: light-dark(@dark, @beige); + } + } + + .experience-value { + height: 25px; + width: 35px; + font-size: 14px; + font-family: @font-body; + color: light-dark(@dark, @beige); + align-content: center; + text-align: center; + background: url(../assets/svg/experience-shield.svg) no-repeat; + + .theme-light & { + background: url('../assets/svg/experience-shield-light.svg') no-repeat; + } + } + } + } + + .reaction-section { + display: flex; + padding: 0 10px; + margin-top: 20px; + width: 100%; + + button { + width: 100%; + } + } + } +} diff --git a/styles/less/sheets/actors/environment/header.less b/styles/less/sheets/actors/environment/header.less index 87be3314..e3ca0eec 100644 --- a/styles/less/sheets/actors/environment/header.less +++ b/styles/less/sheets/actors/environment/header.less @@ -1,140 +1,140 @@ -@import '../../../utils/colors.less'; -@import '../../../utils/fonts.less'; - -.application.sheet.daggerheart.actor.dh-style.environment { - .environment-header-sheet { - display: flex; - flex-direction: column; - justify-content: start; - text-align: center; - - .profile { - width: 100%; - height: 235px; - object-fit: cover; - mask-image: linear-gradient(0deg, transparent 0%, black 10%); - cursor: pointer; - } - - .item-container { - display: flex; - align-items: center; - position: relative; - top: -45px; - gap: 20px; - padding: 0 20px; - margin-bottom: -30px; - - .item-info { - display: flex; - flex-direction: column; - gap: 8px; - - .tags { - display: flex; - gap: 10px; - padding-bottom: 0; - - .tag { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - padding: 3px 5px; - font-size: 12px; - font: @font-body; - - background: light-dark(@dark-15, @beige-15); - border: 1px solid light-dark(@dark, @beige); - border-radius: 3px; - } - - .label { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - font-size: 12px; - } - } - } - - .status-number { - justify-items: center; - - .status-value { - position: relative; - display: flex; - width: 50px; - height: 30px; - border: 1px solid light-dark(@dark-blue, @golden); - border-bottom: none; - border-radius: 6px 6px 0 0; - padding: 0 6px; - font-size: 1.2rem; - align-items: center; - justify-content: center; - background: light-dark(transparent, @dark-blue); - z-index: 2; - - &.armor-slots { - width: 80px; - height: 30px; - } - } - - .status-label { - padding: 2px 10px; - width: 100%; - border-radius: 3px; - background: light-dark(@dark-blue, @golden); - - h4 { - font-weight: bold; - text-align: center; - line-height: 18px; - font-size: 12px; - color: light-dark(@beige, @dark-blue); - } - } - } - - .item-name { - input[type='text'] { - font-size: 32px; - height: 42px; - text-align: start; - transition: all 0.3s ease; - outline: 2px solid transparent; - border: 1px solid transparent; - - &:hover[type='text'], - &:focus[type='text'] { - box-shadow: none; - outline: 2px solid light-dark(@dark-blue, @golden); - } - } - } - } - - .environment-info { - display: flex; - flex-direction: column; - gap: 12px; - padding: 10px 20px; - - .description, - .impulses { - text-align: start; - font-family: @font-body; - } - } - - .environment-navigation { - display: flex; - gap: 20px; - align-items: center; - padding: 0 20px; - } - } -} +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; + +.application.sheet.daggerheart.actor.dh-style.environment { + .environment-header-sheet { + display: flex; + flex-direction: column; + justify-content: start; + text-align: center; + + .profile { + width: 100%; + height: 235px; + object-fit: cover; + mask-image: linear-gradient(0deg, transparent 0%, black 10%); + cursor: pointer; + } + + .item-container { + display: flex; + align-items: center; + position: relative; + top: -45px; + gap: 20px; + padding: 0 20px; + margin-bottom: -30px; + + .item-info { + display: flex; + flex-direction: column; + gap: 8px; + + .tags { + display: flex; + gap: 10px; + padding-bottom: 0; + + .tag { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + padding: 3px 5px; + font-size: 12px; + font: @font-body; + + background: light-dark(@dark-15, @beige-15); + border: 1px solid light-dark(@dark, @beige); + border-radius: 3px; + } + + .label { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-size: 12px; + } + } + } + + .status-number { + justify-items: center; + + .status-value { + position: relative; + display: flex; + width: 50px; + height: 30px; + border: 1px solid light-dark(@dark-blue, @golden); + border-bottom: none; + border-radius: 6px 6px 0 0; + padding: 0 6px; + font-size: 1.2rem; + align-items: center; + justify-content: center; + background: light-dark(transparent, @dark-blue); + z-index: 2; + + &.armor-slots { + width: 80px; + height: 30px; + } + } + + .status-label { + padding: 2px 10px; + width: 100%; + border-radius: 3px; + background: light-dark(@dark-blue, @golden); + + h4 { + font-weight: bold; + text-align: center; + line-height: 18px; + font-size: 12px; + color: light-dark(@beige, @dark-blue); + } + } + } + + .item-name { + input[type='text'] { + font-size: 32px; + height: 42px; + text-align: start; + transition: all 0.3s ease; + outline: 2px solid transparent; + border: 1px solid transparent; + + &:hover[type='text'], + &:focus[type='text'] { + box-shadow: none; + outline: 2px solid light-dark(@dark-blue, @golden); + } + } + } + } + + .environment-info { + display: flex; + flex-direction: column; + gap: 12px; + padding: 10px 20px; + + .description, + .impulses { + text-align: start; + font-family: @font-body; + } + } + + .environment-navigation { + display: flex; + gap: 20px; + align-items: center; + padding: 0 20px; + } + } +} diff --git a/styles/less/sheets/index.less b/styles/less/sheets/index.less index cbee35ac..89370ec6 100644 --- a/styles/less/sheets/index.less +++ b/styles/less/sheets/index.less @@ -1,23 +1,23 @@ -@import './actors/adversary/actions.less'; -@import './actors/adversary/header.less'; -@import './actors/adversary/sheet.less'; -@import './actors/adversary/sidebar.less'; - -@import './actors/character/biography.less'; -@import './actors/character/features.less'; -@import './actors/character/header.less'; -@import './actors/character/inventory.less'; -@import './actors/character/loadout.less'; -@import './actors/character/sheet.less'; -@import './actors/character/sidebar.less'; - -@import './actors/companion/details.less'; -@import './actors/companion/header.less'; -@import './actors/companion/sheet.less'; - -@import './actors/environment/header.less'; -@import './actors/environment/sheet.less'; - -@import './items/class.less'; -@import './items/domain-card.less'; -@import './items/feature.less'; +@import './actors/adversary/actions.less'; +@import './actors/adversary/header.less'; +@import './actors/adversary/sheet.less'; +@import './actors/adversary/sidebar.less'; + +@import './actors/character/biography.less'; +@import './actors/character/features.less'; +@import './actors/character/header.less'; +@import './actors/character/inventory.less'; +@import './actors/character/loadout.less'; +@import './actors/character/sheet.less'; +@import './actors/character/sidebar.less'; + +@import './actors/companion/details.less'; +@import './actors/companion/header.less'; +@import './actors/companion/sheet.less'; + +@import './actors/environment/header.less'; +@import './actors/environment/sheet.less'; + +@import './items/class.less'; +@import './items/domain-card.less'; +@import './items/feature.less'; diff --git a/styles/less/ui/chat/sheet.less b/styles/less/ui/chat/sheet.less index 683b91f1..58281690 100644 --- a/styles/less/ui/chat/sheet.less +++ b/styles/less/ui/chat/sheet.less @@ -1,33 +1,33 @@ -.chat-message { - .duality-modifiers, - .duality-result, - .dice-title { - display: none; - } -} - -fieldset.daggerheart.chat { - padding: 0; - border-left-width: 0; - border-right-width: 0; - border-bottom-width: 0; - legend { - display: flex; - align-items: center; - gap: 5px; - &:before, - &:after { - content: '\f0d8'; - font-family: 'Font Awesome 6 Pro'; - } - } - &.expanded { - legend:before, - legend:after { - content: '\f0d7'; - } - } - .daggerheart.chat { - margin-top: 5px; - } -} +.chat-message { + .duality-modifiers, + .duality-result, + .dice-title { + display: none; + } +} + +fieldset.daggerheart.chat { + padding: 0; + border-left-width: 0; + border-right-width: 0; + border-bottom-width: 0; + legend { + display: flex; + align-items: center; + gap: 5px; + &:before, + &:after { + content: '\f0d8'; + font-family: 'Font Awesome 6 Pro'; + } + } + &.expanded { + legend:before, + legend:after { + content: '\f0d7'; + } + } + .daggerheart.chat { + margin-top: 5px; + } +} diff --git a/styles/less/ui/chat/theme-colorful.less b/styles/less/ui/chat/theme-colorful.less index adbbc5ca..d9c4e08e 100644 --- a/styles/less/ui/chat/theme-colorful.less +++ b/styles/less/ui/chat/theme-colorful.less @@ -1,193 +1,193 @@ -@import '../../utils/colors.less'; -@import '../../utils/spacing.less'; - -.theme-colorful { - .chat-message.duality { - border-color: black; - padding: 8px 0 0 0; - fieldset.daggerheart.chat { - border-top-width: 0; - display: contents; - legend { - &:before, - &:after { - display: none; - } - } - } - .message-header { - color: var(--color-light-3); - padding: 0 8px; - } - &.hope { - background: linear-gradient(0, rgba(165, 42, 42, 0.6) 40px, rgba(0, 0, 0, 0.6)); - } - &.fear { - background: linear-gradient(0, @fearBackgroundEnd, @fearBackgroundStart); - } - &.critical { - background: linear-gradient(0, @criticalBackgroundEnd, @criticalBackgroundStart); - } - .chat-message header { - color: var(--color-light-3); - } - > * { - padding: 0 8px; - } - .message-content { - .duality-modifiers, - .duality-result, - .dice-title { - display: flex; - } - .duality-modifiers { - display: flex; - gap: 2px; - margin-bottom: 4px; - .duality-modifier { - padding: 2px; - border-radius: 6px; - border: 1px solid; - background: var(--color-dark-6); - font-size: 12px; - } - } - .dice-flavor { - color: var(--color-light-1); - text-shadow: 0 0 1px black; - border-bottom: 1px solid; - display: flex; - align-items: end; - justify-content: space-between; - padding: 0 8px; - margin: 0 -8px 2px; - font-weight: unset; - } - .dice-result { - .duality-modifiers { - display: flex; // Default => display: none; - gap: 2px; - margin-bottom: 4px; - .duality-modifier { - padding: 2px; - border-radius: 6px; - border: 1px solid; - background: var(--color-dark-6); - font-size: 12px; - } - } - .dice-formula, - > .dice-total, - .part-header { - display: none; - } - .dice-tooltip { - grid-template-rows: 1fr; - .wrapper { - .tooltip-part { - display: flex; - align-items: end; - gap: 0.25rem; - .dice { - .dice-rolls { - margin-bottom: 0; - &.duality { - li { - display: flex; - align-items: center; - justify-content: center; - position: relative; - background: unset; - line-height: unset; - font-weight: unset; - } - } - } - } - .duality-modifier { - display: flex; - margin-bottom: 6px; - color: var(--color-light-1); - text-shadow: 0 0 1px black; - font-size: var(--font-size-16); - } - } - } - } - .target-selection { - label { - color: var(--color-light-1); - } - } - .target-section { - margin: 4px 0; - border: 2px solid; - margin-top: 5px; - .dice-total { - box-shadow: unset; - border: unset; - border-radius: unset; - font-size: var(--font-size-18); - } - } - .dice-actions { - justify-content: space-between; - &.duality-alone { - justify-content: end; - margin-top: -20px; - } - > * { - display: flex; - color: var(--color-light-1); - text-shadow: 0 0 1px black; - font-weight: bold; - background: var(--color-dark-1); - padding: 4px; - border-color: black; - min-height: unset; - height: 26px; - flex: unset; - margin: 0; - } - .duality-action { - border-radius: 0 6px 0 0; - margin-left: -8px; - &.duality-action-effect { - border-top-left-radius: 6px; - margin-left: initial; - } - } - .duality-result { - border-radius: 6px 0 0 0; - margin-right: -8px; - } - } - .duality-result { - display: flex; - color: var(--color-light-1); - text-shadow: 0 0 1px black; - font-weight: bold; - background: var(--color-dark-1); - padding: 4px; - border-color: black; - min-height: unset; - height: 26px; - flex: unset; - margin: 0; - margin-left: auto; - align-self: center; - border-radius: 6px; - } - } - } - button { - &.inner-button { - color: var(--color-light-1); - text-shadow: 0 0 1px black; - font-weight: bold; - background: var(--color-dark-1); - border-color: black; - } - } - } -} +@import '../../utils/colors.less'; +@import '../../utils/spacing.less'; + +.theme-colorful { + .chat-message.duality { + border-color: black; + padding: 8px 0 0 0; + fieldset.daggerheart.chat { + border-top-width: 0; + display: contents; + legend { + &:before, + &:after { + display: none; + } + } + } + .message-header { + color: var(--color-light-3); + padding: 0 8px; + } + &.hope { + background: linear-gradient(0, rgba(165, 42, 42, 0.6) 40px, rgba(0, 0, 0, 0.6)); + } + &.fear { + background: linear-gradient(0, @fearBackgroundEnd, @fearBackgroundStart); + } + &.critical { + background: linear-gradient(0, @criticalBackgroundEnd, @criticalBackgroundStart); + } + .chat-message header { + color: var(--color-light-3); + } + > * { + padding: 0 8px; + } + .message-content { + .duality-modifiers, + .duality-result, + .dice-title { + display: flex; + } + .duality-modifiers { + display: flex; + gap: 2px; + margin-bottom: 4px; + .duality-modifier { + padding: 2px; + border-radius: 6px; + border: 1px solid; + background: var(--color-dark-6); + font-size: 12px; + } + } + .dice-flavor { + color: var(--color-light-1); + text-shadow: 0 0 1px black; + border-bottom: 1px solid; + display: flex; + align-items: end; + justify-content: space-between; + padding: 0 8px; + margin: 0 -8px 2px; + font-weight: unset; + } + .dice-result { + .duality-modifiers { + display: flex; // Default => display: none; + gap: 2px; + margin-bottom: 4px; + .duality-modifier { + padding: 2px; + border-radius: 6px; + border: 1px solid; + background: var(--color-dark-6); + font-size: 12px; + } + } + .dice-formula, + > .dice-total, + .part-header { + display: none; + } + .dice-tooltip { + grid-template-rows: 1fr; + .wrapper { + .tooltip-part { + display: flex; + align-items: end; + gap: 0.25rem; + .dice { + .dice-rolls { + margin-bottom: 0; + &.duality { + li { + display: flex; + align-items: center; + justify-content: center; + position: relative; + background: unset; + line-height: unset; + font-weight: unset; + } + } + } + } + .duality-modifier { + display: flex; + margin-bottom: 6px; + color: var(--color-light-1); + text-shadow: 0 0 1px black; + font-size: var(--font-size-16); + } + } + } + } + .target-selection { + label { + color: var(--color-light-1); + } + } + .target-section { + margin: 4px 0; + border: 2px solid; + margin-top: 5px; + .dice-total { + box-shadow: unset; + border: unset; + border-radius: unset; + font-size: var(--font-size-18); + } + } + .dice-actions { + justify-content: space-between; + &.duality-alone { + justify-content: end; + margin-top: -20px; + } + > * { + display: flex; + color: var(--color-light-1); + text-shadow: 0 0 1px black; + font-weight: bold; + background: var(--color-dark-1); + padding: 4px; + border-color: black; + min-height: unset; + height: 26px; + flex: unset; + margin: 0; + } + .duality-action { + border-radius: 0 6px 0 0; + margin-left: -8px; + &.duality-action-effect { + border-top-left-radius: 6px; + margin-left: initial; + } + } + .duality-result { + border-radius: 6px 0 0 0; + margin-right: -8px; + } + } + .duality-result { + display: flex; + color: var(--color-light-1); + text-shadow: 0 0 1px black; + font-weight: bold; + background: var(--color-dark-1); + padding: 4px; + border-color: black; + min-height: unset; + height: 26px; + flex: unset; + margin: 0; + margin-left: auto; + align-self: center; + border-radius: 6px; + } + } + } + button { + &.inner-button { + color: var(--color-light-1); + text-shadow: 0 0 1px black; + font-weight: bold; + background: var(--color-dark-1); + border-color: black; + } + } + } +} diff --git a/styles/less/ui/combat-sidebar/combat-sidebar.less b/styles/less/ui/combat-sidebar/combat-sidebar.less index e247e5b4..62da7233 100644 --- a/styles/less/ui/combat-sidebar/combat-sidebar.less +++ b/styles/less/ui/combat-sidebar/combat-sidebar.less @@ -1,6 +1,6 @@ -.combat-sidebar { - h4 { - margin: 0; - text-align: center; - } -} +.combat-sidebar { + h4 { + margin: 0; + text-align: center; + } +} diff --git a/styles/less/ui/combat-sidebar/combatant-controls.less b/styles/less/ui/combat-sidebar/combatant-controls.less index 4a3329d6..ee63a197 100644 --- a/styles/less/ui/combat-sidebar/combatant-controls.less +++ b/styles/less/ui/combat-sidebar/combatant-controls.less @@ -1,5 +1,5 @@ -.combat-sidebar { - .combatant-controls { - flex: 0; - } -} +.combat-sidebar { + .combatant-controls { + flex: 0; + } +} diff --git a/styles/less/ui/combat-sidebar/encounter-controls.less b/styles/less/ui/combat-sidebar/encounter-controls.less index 8a2981b5..58deaae8 100644 --- a/styles/less/ui/combat-sidebar/encounter-controls.less +++ b/styles/less/ui/combat-sidebar/encounter-controls.less @@ -1,48 +1,48 @@ -.combat-sidebar { - .encounter-controls.combat { - justify-content: space-between; - - .encounter-fear-controls { - display: flex; - align-items: center; - gap: 8px; - - .encounter-fear-dice-container { - display: flex; - gap: 2px; - - .encounter-control-fear-container { - display: flex; - position: relative; - align-items: center; - justify-content: center; - color: black; - - .dice { - height: 22px; - width: 22px; - } - - .encounter-control-fear { - position: absolute; - font-size: 16px; - } - - .encounter-control-counter { - position: absolute; - right: -10px; - color: var(--color-text-secondary); - } - } - } - - .encounter-countdowns { - color: var(--content-link-icon-color); - } - } - - .control-buttons { - width: min-content; - } - } -} +.combat-sidebar { + .encounter-controls.combat { + justify-content: space-between; + + .encounter-fear-controls { + display: flex; + align-items: center; + gap: 8px; + + .encounter-fear-dice-container { + display: flex; + gap: 2px; + + .encounter-control-fear-container { + display: flex; + position: relative; + align-items: center; + justify-content: center; + color: black; + + .dice { + height: 22px; + width: 22px; + } + + .encounter-control-fear { + position: absolute; + font-size: 16px; + } + + .encounter-control-counter { + position: absolute; + right: -10px; + color: var(--color-text-secondary); + } + } + } + + .encounter-countdowns { + color: var(--content-link-icon-color); + } + } + + .control-buttons { + width: min-content; + } + } +} diff --git a/styles/less/ui/combat-sidebar/spotlight-control.less b/styles/less/ui/combat-sidebar/spotlight-control.less index 2659cc90..b5efed7a 100644 --- a/styles/less/ui/combat-sidebar/spotlight-control.less +++ b/styles/less/ui/combat-sidebar/spotlight-control.less @@ -1,19 +1,19 @@ -.combat-sidebar { - .spotlight-control { - font-size: 26px; - - &:focus { - outline: none; - box-shadow: none; - } - - &.discrete:hover { - background: inherit; - } - - &.requesting { - filter: drop-shadow(0 0 3px gold); - color: var(--button-hover-text-color); - } - } -} +.combat-sidebar { + .spotlight-control { + font-size: 26px; + + &:focus { + outline: none; + box-shadow: none; + } + + &.discrete:hover { + background: inherit; + } + + &.requesting { + filter: drop-shadow(0 0 3px gold); + color: var(--button-hover-text-color); + } + } +} diff --git a/styles/less/ui/combat-sidebar/token-actions.less b/styles/less/ui/combat-sidebar/token-actions.less index 23be22e8..072381dd 100644 --- a/styles/less/ui/combat-sidebar/token-actions.less +++ b/styles/less/ui/combat-sidebar/token-actions.less @@ -1,48 +1,48 @@ -.combat-sidebar { - .token-actions { - align-self: stretch; - display: flex; - align-items: top; - justify-content: center; - gap: 16px; - - .action-tokens { - display: flex; - gap: 4px; - - .action-token { - height: 22px; - width: 22px; - border: 1px solid; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-size: 10px; - padding: 8px; - --button-size: 0; - - &.used { - opacity: 0.5; - background: transparent; - } - } - } - - button { - font-size: 22px; - height: 24px; - width: 24px; - - &.main { - background: var(--button-hover-background-color); - color: var(--button-hover-text-color); - border-color: var(--button-hover-border-color); - - &:hover { - filter: drop-shadow(0 0 3px var(--button-hover-text-color)); - } - } - } - } -} +.combat-sidebar { + .token-actions { + align-self: stretch; + display: flex; + align-items: top; + justify-content: center; + gap: 16px; + + .action-tokens { + display: flex; + gap: 4px; + + .action-token { + height: 22px; + width: 22px; + border: 1px solid; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 10px; + padding: 8px; + --button-size: 0; + + &.used { + opacity: 0.5; + background: transparent; + } + } + } + + button { + font-size: 22px; + height: 24px; + width: 24px; + + &.main { + background: var(--button-hover-background-color); + color: var(--button-hover-text-color); + border-color: var(--button-hover-border-color); + + &:hover { + filter: drop-shadow(0 0 3px var(--button-hover-text-color)); + } + } + } + } +} diff --git a/styles/less/ui/countdown/sheet.less b/styles/less/ui/countdown/sheet.less index 6a1d2394..1692773e 100644 --- a/styles/less/ui/countdown/sheet.less +++ b/styles/less/ui/countdown/sheet.less @@ -1,88 +1,88 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; -@import '../../utils/mixin.less'; - -.appTheme({}, { - &.countdown { - .minimized-view .mini-countdown-container { - background-image: url('../assets/parchments/dh-parchment-dark.png'); - } - } -}); - -.daggerheart.dh-style.countdown { - overflow: hidden; - - .window-content { - > div { - height: 100%; - - .expanded-view { - height: 100%; - display: flex; - flex-direction: column; - - .countdowns-menu { - display: flex; - gap: 8px; - - .flex { - flex: 1; - } - } - - .countdowns-container { - display: flex; - gap: 8px; - flex-wrap: wrap; - overflow: auto; - max-height: 100%; - - .countdown-fieldset { - width: 340px; - height: min-content; - position: relative; - - .ownership-button { - position: absolute; - top: 8px; - right: 8px; - font-size: 18px; - } - - .countdown-container { - display: flex; - align-items: center; - gap: 16px; - - img { - width: 150px; - height: 150px; - cursor: pointer; - - &.disabled { - cursor: initial; - } - } - - .countdown-inner-container { - display: flex; - flex-direction: column; - gap: 4px; - - .countdown-value-container { - display: flex; - gap: 4px; - - input { - max-width: 80px; - } - } - } - } - } - } - } - } - } -} +@import '../../utils/colors.less'; +@import '../../utils/fonts.less'; +@import '../../utils/mixin.less'; + +.appTheme({}, { + &.countdown { + .minimized-view .mini-countdown-container { + background-image: url('../assets/parchments/dh-parchment-dark.png'); + } + } +}); + +.daggerheart.dh-style.countdown { + overflow: hidden; + + .window-content { + > div { + height: 100%; + + .expanded-view { + height: 100%; + display: flex; + flex-direction: column; + + .countdowns-menu { + display: flex; + gap: 8px; + + .flex { + flex: 1; + } + } + + .countdowns-container { + display: flex; + gap: 8px; + flex-wrap: wrap; + overflow: auto; + max-height: 100%; + + .countdown-fieldset { + width: 340px; + height: min-content; + position: relative; + + .ownership-button { + position: absolute; + top: 8px; + right: 8px; + font-size: 18px; + } + + .countdown-container { + display: flex; + align-items: center; + gap: 16px; + + img { + width: 150px; + height: 150px; + cursor: pointer; + + &.disabled { + cursor: initial; + } + } + + .countdown-inner-container { + display: flex; + flex-direction: column; + gap: 4px; + + .countdown-value-container { + display: flex; + gap: 4px; + + input { + max-width: 80px; + } + } + } + } + } + } + } + } + } +} diff --git a/styles/less/ui/index.less b/styles/less/ui/index.less index 0227c26b..13e578b0 100644 --- a/styles/less/ui/index.less +++ b/styles/less/ui/index.less @@ -1,18 +1,18 @@ -@import './chat/chat.less'; -@import './chat/sheet.less'; -@import './chat/theme-colorful.less'; - -@import './combat-sidebar/combat-sidebar.less'; -@import './combat-sidebar/combatant-controls.less'; -@import './combat-sidebar/encounter-controls.less'; -@import './combat-sidebar/spotlight-control.less'; -@import './combat-sidebar/token-actions.less'; - -@import './countdown/countdown.less'; -@import './countdown/sheet.less'; - -@import './ownership-selection/ownership-selection.less'; - -@import './resources/resources.less'; - -@import './settings/settings.less'; +@import './chat/chat.less'; +@import './chat/sheet.less'; +@import './chat/theme-colorful.less'; + +@import './combat-sidebar/combat-sidebar.less'; +@import './combat-sidebar/combatant-controls.less'; +@import './combat-sidebar/encounter-controls.less'; +@import './combat-sidebar/spotlight-control.less'; +@import './combat-sidebar/token-actions.less'; + +@import './countdown/countdown.less'; +@import './countdown/sheet.less'; + +@import './ownership-selection/ownership-selection.less'; + +@import './resources/resources.less'; + +@import './settings/settings.less';