diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 3ecb1f8c..2c6ec7e9 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -37,7 +37,7 @@ jobs: download: https://github.com/${{github.repository}}/releases/download/${{github.event.release.tag_name}}/system.zip # Create a zip file with all files required by the module to add to the release - - run: zip -r ./system.zip system.json README.md LICENSE build/daggerheart.js assets/ templates/ styles/daggerheart.css packs/ lang/ + - run: zip -r ./system.zip system.json README.md LICENSE build/daggerheart.js build/tagify.css styles/daggerheart.css assets/ templates/ packs/ lang/ # Create a release for this specific version - name: Update Release with Files diff --git a/README.md b/README.md index 760194f4..a5c7fe48 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ - [Overview](#overview) - [User Install Guide](#user-install) -- [Developer Setup](#developer-setup) +- [Developer Setup](#development-setup) - [Contribution Info](#contributing) ## Overview diff --git a/daggerheart.mjs b/daggerheart.mjs index a6676f19..da04334c 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -3,12 +3,12 @@ import * as applications from './module/applications/_module.mjs'; import * as models from './module/data/_module.mjs'; import * as documents from './module/documents/_module.mjs'; import RegisterHandlebarsHelpers from './module/helpers/handlebarsHelper.mjs'; -import { DhDualityRollEnricher, DhTemplateEnricher } from './module/enrichers/_module.mjs'; +import { enricherConfig, enricherRenderSetup } from './module/enrichers/_module.mjs'; import { getCommandTarget, rollCommandToJSON } from './module/helpers/utils.mjs'; -import { NarrativeCountdowns, registerCountdownApplicationHooks } from './module/applications/ui/countdowns.mjs'; +import { NarrativeCountdowns } from './module/applications/ui/countdowns.mjs'; import { DualityRollColor } from './module/data/settings/Appearance.mjs'; import { DHRoll, DualityRoll, D20Roll, DamageRoll, DualityDie } from './module/dice/_module.mjs'; -import { renderDualityButton } from './module/enrichers/DualityRollEnricher.mjs'; +import { enrichedDualityRoll, renderDualityButton } from './module/enrichers/DualityRollEnricher.mjs'; import { renderMeasuredTemplate } from './module/enrichers/TemplateEnricher.mjs'; import { registerCountdownHooks } from './module/data/countdowns.mjs'; import { @@ -18,6 +18,9 @@ import { } from './module/systemRegistration/_module.mjs'; import { placeables } from './module/canvas/_module.mjs'; import { registerRollDiceHooks } from './module/dice/dhRoll.mjs'; +import { registerDHActorHooks } from './module/documents/actor.mjs'; +import './node_modules/@yaireo/tagify/dist/tagify.css'; +import { renderDamageButton } from './module/enrichers/DamageEnricher.mjs'; Hooks.once('init', () => { CONFIG.DH = SYSTEM; @@ -27,23 +30,16 @@ Hooks.once('init', () => { documents }; - CONFIG.TextEditor.enrichers.push( - ...[ - { - pattern: /\[\[\/dr\s?(.*?)\]\]/g, - enricher: DhDualityRollEnricher - }, - { - pattern: /^@Template\[(.*)\]$/g, - enricher: DhTemplateEnricher - } - ] - ); + CONFIG.TextEditor.enrichers.push(...enricherConfig); - CONFIG.statusEffects = Object.values(SYSTEM.GENERAL.conditions).map(x => ({ - ...x, - name: game.i18n.localize(x.name) - })); + CONFIG.statusEffects = [ + ...CONFIG.statusEffects.filter(x => !['dead', 'unconscious'].includes(x.id)), + ...Object.values(SYSTEM.GENERAL.conditions).map(x => ({ + ...x, + name: game.i18n.localize(x.name), + systemEffect: true + })) + ]; CONFIG.Dice.daggerheart = { DualityDie: DualityDie, @@ -56,6 +52,14 @@ Hooks.once('init', () => { CONFIG.Dice.rolls = [...CONFIG.Dice.rolls, ...[DHRoll, DualityRoll, D20Roll, DamageRoll]]; CONFIG.MeasuredTemplate.objectClass = placeables.DhMeasuredTemplate; + const { DocumentSheetConfig } = foundry.applications.apps; + CONFIG.Token.documentClass = documents.DhToken; + CONFIG.Token.prototypeSheetClass = applications.sheetConfigs.DhPrototypeTokenConfig; + DocumentSheetConfig.unregisterSheet(TokenDocument, 'core', foundry.applications.sheets.TokenConfig); + DocumentSheetConfig.registerSheet(TokenDocument, SYSTEM.id, applications.sheetConfigs.DhTokenConfig, { + makeDefault: true + }); + CONFIG.Item.documentClass = documents.DHItem; //Registering the Item DataModel @@ -93,12 +97,12 @@ Hooks.once('init', () => { CONFIG.ActiveEffect.documentClass = documents.DhActiveEffect; CONFIG.ActiveEffect.dataModels = models.activeEffects.config; - foundry.applications.apps.DocumentSheetConfig.unregisterSheet( + DocumentSheetConfig.unregisterSheet( CONFIG.ActiveEffect.documentClass, 'core', foundry.applications.sheets.ActiveEffectConfig ); - foundry.applications.apps.DocumentSheetConfig.registerSheet( + DocumentSheetConfig.registerSheet( CONFIG.ActiveEffect.documentClass, SYSTEM.id, applications.sheetConfigs.ActiveEffectConfig, @@ -107,6 +111,8 @@ Hooks.once('init', () => { } ); + CONFIG.Token.hudClass = applications.hud.DHTokenHUD; + CONFIG.Combat.dataModels = { base: models.DhCombat }; @@ -119,9 +125,12 @@ Hooks.once('init', () => { CONFIG.ChatMessage.documentClass = documents.DhChatMessage; CONFIG.Canvas.rulerClass = placeables.DhRuler; + CONFIG.Canvas.layers.templates.layerClass = placeables.DhTemplateLayer; + CONFIG.Token.objectClass = placeables.DhTokenPlaceable; CONFIG.Combat.documentClass = documents.DhpCombat; CONFIG.ui.combat = applications.ui.DhCombatTracker; CONFIG.ui.chat = applications.ui.DhChatLog; + CONFIG.ui.hotbar = applications.ui.DhHotbar; CONFIG.Token.rulerClass = placeables.DhTokenRuler; CONFIG.ui.resources = applications.ui.DhFearTracker; @@ -152,40 +161,22 @@ Hooks.on('ready', () => { registerCountdownHooks(); socketRegistration.registerSocketHooks(); - registerCountdownApplicationHooks(); registerRollDiceHooks(); + registerDHActorHooks(); }); Hooks.once('dicesoniceready', () => {}); Hooks.on('renderChatMessageHTML', (_, element) => { - element - .querySelectorAll('.duality-roll-button') - .forEach(element => element.addEventListener('click', renderDualityButton)); - - element - .querySelectorAll('.measured-template-button') - .forEach(element => element.addEventListener('click', renderMeasuredTemplate)); + enricherRenderSetup(element); }); Hooks.on('renderJournalEntryPageProseMirrorSheet', (_, element) => { - element - .querySelectorAll('.duality-roll-button') - .forEach(element => element.addEventListener('click', renderDualityButton)); - - element - .querySelectorAll('.measured-template-button') - .forEach(element => element.addEventListener('click', renderMeasuredTemplate)); + enricherRenderSetup(element); }); Hooks.on('renderHandlebarsApplication', (_, element) => { - element - .querySelectorAll('.duality-roll-button') - .forEach(element => element.addEventListener('click', renderDualityButton)); - - element - .querySelectorAll('.measured-template-button') - .forEach(element => element.addEventListener('click', renderMeasuredTemplate)); + enricherRenderSetup(element); }); Hooks.on('chatMessage', (_, message) => { @@ -197,49 +188,21 @@ Hooks.on('chatMessage', (_, message) => { } const traitValue = rollCommand.trait?.toLowerCase(); - const advantageState = rollCommand.advantage ? true : rollCommand.disadvantage ? false : null; + const advantage = rollCommand.advantage + ? CONFIG.DH.ACTIONS.advandtageState.advantage.value + : rollCommand.disadvantage + ? CONFIG.DH.ACTIONS.advandtageState.disadvantage.value + : undefined; + const difficulty = rollCommand.difficulty; - // Target not required if an attribute is not used. - const target = traitValue ? getCommandTarget() : undefined; - if (target || !traitValue) { - new Promise(async (resolve, reject) => { - const trait = target ? target.system.traits[traitValue] : undefined; - if (traitValue && !trait) { - ui.notifications.error(game.i18n.localize('DAGGERHEART.UI.Notifications.attributeFaulty')); - reject(); - return; - } - - const title = traitValue - ? game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilityCheckTitle', { - ability: game.i18n.localize(SYSTEM.ACTOR.abilities[traitValue].label) - }) - : game.i18n.localize('DAGGERHEART.GENERAL.duality'); - - const config = { - title: title, - roll: { - trait: traitValue - }, - data: { - traits: { - [traitValue]: trait - } - }, - source: target, - hasSave: false, - dialog: { configure: false }, - evaluate: true, - advantage: rollCommand.advantage == true, - disadvantage: rollCommand.disadvantage == true - }; - - await CONFIG.Dice.daggerheart['DualityRoll'].build(config); - - resolve(); - }); - } + const target = getCommandTarget(); + const title = traitValue + ? game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilityCheckTitle', { + ability: game.i18n.localize(SYSTEM.ACTOR.abilities[traitValue].label) + }) + : game.i18n.localize('DAGGERHEART.GENERAL.duality'); + enrichedDualityRoll({ traitValue, target, difficulty, title, label: 'test', actionType: null, advantage }); return false; } }); diff --git a/lang/en.json b/lang/en.json index 857a9387..fc51a610 100755 --- a/lang/en.json +++ b/lang/en.json @@ -13,6 +13,9 @@ "armor": "Armor", "beastform": "Beastform" }, + "ActiveEffect": { + "beastform": "Beastform" + }, "Actor": { "character": "Character", "companion": "Companion", @@ -20,6 +23,9 @@ "environment": "Environment" } }, + "CONTROLS": { + "inFront": "In Front" + }, "DAGGERHEART": { "ACTIONS": { "Config": { @@ -30,8 +36,15 @@ } }, "Settings": { + "attackBonus": "Attack Bonus", + "attackName": "Attack Name", + "includeBase": { "label": "Include Item Damage" }, + "multiplier": "Multiplier", "resultBased": { "label": "Formula based on Hope/Fear result." + }, + "applyTo": { + "label": "Targeted Resource" } }, "TYPES": { @@ -96,9 +109,14 @@ "tier": { "label": "Tier" }, "type": { "label": "Type" } }, + "hordeDamage": "Horde Damage", "horderHp": "Horde/HP" }, "Character": { + "advantageSources": { + "label": "Advantage Sources", + "hint": "Add single words or short text as reminders and hints of what a character has advantage on." + }, "age": "Age", "companionFeatures": "Companion Features", "contextMenu": { @@ -107,7 +125,12 @@ "sendToChat": "Send To Chat", "toLoadout": "Send to Loadout", "toVault": "Send to Vault", - "unequip": "Unequip" + "unequip": "Unequip", + "useItem": "Use Item" + }, + "disadvantageSources": { + "label": "Disadvantage Sources", + "hint": "Add single words or short text as reminders and hints of what a character has disadvantage on." }, "faith": "Faith", "levelUp": "You can level up", @@ -129,7 +152,9 @@ "partner": { "label": "Partner" }, "resources": { "stress": { - "value": { "label": "Stress" } + "value": { "label": "Stress" }, + "currentStress": { "label": "Current Stress" }, + "maxStress": { "label": "Max Stress" } } } }, @@ -158,12 +183,25 @@ }, "APPLICATIONS": { "CharacterCreation": { + "setupTabs": { + "ancestry": "Ancestry", + "community": "Community", + "class": "Class", + "experience": "Experience", + "traits": "Traits", + "domainCards": "Domain Cards" + }, + "ancestryNamePlaceholder": "Your ancestry's name", + "buttonTitle": "Character Setup", "choice": "Choice", "finishCreation": "Finish Character Setup", "heritage": "Heritage", "initialExperiences": "Initial Experiences", + "mixedAncestry": "Mixed Ancestry", "newExperience": "New Experience..", "selectAncestry": "Select Ancestry", + "selectPrimaryAncestry": "Select Primary Ancestry", + "selectSecondaryAncestry": "Select Secondary Ancestry", "selectArmor": "Select Armor", "selectClass": "Select Class", "selectCommunity": "Select Community", @@ -171,6 +209,7 @@ "selectSecondaryWeapon": "Select Secondary Weapon", "selectSubclass": "Select Subclass", "startingItems": "Starting Items", + "story": "Story", "suggestedArmor": "Suggested Armor", "suggestedPrimaryWeapon": "Suggested Primary Weapon", "suggestedSecondaryWeapon": "Suggested Secondary Weapon", @@ -185,6 +224,16 @@ "requestingSpotlight": "Requesting The Spotlight", "requestSpotlight": "Request The Spotlight" }, + "ContextMenu": { + "disableEffect": "Disable Effect", + "enableEffect": "Enable Effect", + "equip": "Equip", + "sendToChat": "Send To Chat", + "toLoadout": "Send to Loadout", + "toVault": "Send to Vault", + "unequip": "Unequip", + "useItem": "Use Item" + }, "Countdown": { "addCountdown": "Add Countdown", "FIELDS": { @@ -213,6 +262,10 @@ "encounter": "Encounter" } }, + "DeleteConfirmation": { + "title": "Delete {type} - {name}", + "text": "Are you sure you want to delete {name}?" + }, "DamageReduction": { "armorMarks": "Armor Marks", "armorWithStress": "Spend 1 stress to use an extra mark", @@ -227,8 +280,9 @@ "title": "{actor} - Death Move" }, "Downtime": { - "downtimeHeader": "Downtime Moves ({current}/{max})", "longRest": { + "title": "Long Rest", + "moves": "Long Rest Moves ({current}/{max})", "clearStress": { "description": "Describe how you blow off steam or pull yourself together, and clear all marked Stress.", "name": "Clear Stress" @@ -245,7 +299,6 @@ "description": "Describe how you patch yourself up and remove all marked Hit Points. You may also do this on an ally instead.", "name": "Tend to Wounds" }, - "title": "Long Rest", "workOnAProject": { "description": "Establish or continue work on a project.", "name": "Work on a Project" @@ -253,6 +306,7 @@ }, "shortRest": { "title": "Short Rest", + "moves": "Short Rest Moves ({current}/{max})", "tendToWounds": { "name": "Tend to Wounds", "description": "Describe how you hastily patch yourself up, then clear a number of Hit Points equal to 1d4 + your tier. You can do this to an ally instead." @@ -269,6 +323,12 @@ "name": "Prepare", "description": "Describe how you prepare yourself for the path ahead, then gain a Hope. If you choose to Prepare with one or more members of your party, you each gain 2 Hope." } + }, + "takeDowntime": "Take Downtime" + }, + "HUD": { + "tokenHUD": { + "genericEffects": "Foundry Effects" } }, "Levelup": { @@ -374,6 +434,15 @@ "OwnershipSelection": { "title": "Ownership Selection - {name}", "default": "Default Ownership" + }, + "ResourceDice": { + "title": "{name} Resource", + "rerollDice": "Reroll Dice" + } + }, + "CLASS": { + "Feature": { + "rallyDice": "Bardic Rally Dice" } }, "CONFIG": { @@ -478,14 +547,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." @@ -527,14 +592,19 @@ "description": "You reduce incoming magic damage by your Armor Score before applying it to your damage thresholds." } }, + "BeastformType": { + "normal": "Normal", + "evolved": "Evolved", + "hybrid": "Hybrid" + }, "Burden": { "oneHanded": "One-Handed", "twoHanded": "Two-Handed" }, "Condition": { - "vulnerable": { - "name": "Vulnerable", - "description": "While a creature is Vulnerable, all rolls targeting them have advantage.\nA creature who is already Vulnerable can’t be made to take the condition again." + "dead": { + "name": "Dead", + "description": "The character is dead" }, "hidden": { "name": "Hidden", @@ -543,6 +613,14 @@ "restrained": { "name": "Restrained", "description": "When an effect makes a creature Restrained, it means they cannot move until this condition is cleared.\nThey can still take actions from their current position." + }, + "unconcious": { + "name": "Unconcious", + "description": "Your character can’t move or act while unconscious, they can’t be targeted by an attack." + }, + "vulnerable": { + "name": "Vulnerable", + "description": "While a creature is Vulnerable, all rolls targeting them have advantage.\nA creature who is already Vulnerable can’t be made to take the condition again." } }, "CountdownType": { @@ -620,8 +698,16 @@ "armorStack": { "name": "Armor Stack", "abbreviation": "AS" + }, + "fear": { + "name": "Fear", + "abbreviation": "FR" } }, + "ItemResourceType": { + "simple": "Simple", + "diceValue": "Dice Value" + }, "Range": { "self": { "name": "Self", @@ -655,11 +741,11 @@ } }, "RollTypes": { - "ability": { - "name": "Ability" + "trait": { + "name": "Trait" }, - "weapon": { - "name": "Weapon" + "attack": { + "name": "Attack" }, "spellcast": { "name": "SpellCast" @@ -668,6 +754,10 @@ "name": "Dice Set" } }, + "SelectAction": { + "selectType": "Select Action Type", + "selectAction": "Action Selection" + }, "Traits": { "agility": { "name": "Agility", @@ -727,7 +817,7 @@ "WeaponFeature": { "barrier": { "name": "Barrier", - "description": "+{armorScore} to Armor Score; -1 to Evasion" + "description": "Gain your character's Tier + 1 to Armor Score; -1 to Evasion" }, "bonded": { "name": "Bonded", @@ -843,7 +933,7 @@ }, "paired": { "name": "Paired", - "description": "+{bonusDamage} to primary weapon damage to targets within Melee range" + "description": "Add your character's Tier + 1 to primary weapon damage against targets within Melee range" }, "parry": { "name": "Parry", @@ -863,7 +953,7 @@ }, "protective": { "name": "Protective", - "description": "+{tier} to Armor Score" + "description": "Add your character's Tier to your Armor Score" }, "quick": { "name": "Quick", @@ -889,6 +979,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." @@ -908,10 +1002,6 @@ "timebending": { "name": "Timebending", "description": "You can choose the target of your attack after making your attack roll." - }, - "versatile": { - "name": "Versatile", - "description": "This weapon can also be used with these statistics—{characterTrait}, {range}, {damage}." } } }, @@ -941,6 +1031,10 @@ "stress": { "name": "Stress" } + }, + "Attachments": { + "attachHint": "Drop items here to attach them", + "transferHint": "If checked, this effect will be applied to any actor that owns this Effect's parent Item. The effect is always applied if this Item is attached to another one." } }, "GENERAL": { @@ -950,32 +1044,79 @@ }, "Advantage": { "full": "Advantage", + "plural": "Advantages", "short": "Adv" }, "Adversary": { "singular": "Adversary", "plural": "Adversaries" }, + "Bonuses": { + "rest": { + "shortRest": { + "shortRestMoves": { + "label": "Short Rest: Bonus Short Rest Moves", + "hint": "The number of extra Short Rest Moves the character can take during a Short Rest." + }, + "longRestMoves": { + "label": "Short Rest: Bonus Long Rest Moves", + "hint": "The number of extra Long Rest Moves the character can take during a Short Rest." + } + }, + "longRest": { + "shortRestMoves": { + "label": "Long Rest: Bonus Short Rest Moves", + "hint": "The number of extra Short Rest Moves the character can take during a Long Rest." + }, + "longRestMoves": { + "label": "Long Rest: Bonus Long Rest Moves", + "hint": "The number of extra Long Rest Moves the character can take during a Long Rest." + } + } + } + }, "Character": { "singular": "Character", "plural": "Characters" }, + "Cost": { + "single": "Cost", + "plural": "Costs" + }, "Damage": { "severe": "Severe", "major": "Major", "minor": "Minor", - "none": "None" + "none": "None", + "allDamage": "All Damage", + "physicalDamage": "Physical Damage", + "magicalDamage": "Magical Damage", + "primaryWeapon": "Primary Weapon Damage", + "secondaryWeapon": "Secondary Weapon Damage" + }, + "DamageResistance": { + "none": "None", + "resistance": "Resistance", + "immunity": "Immunity", + "physicalReduction": "Physical Damage Reduction", + "magicalReduction": "Magical Damage Reduction" }, "DamageThresholds": { "title": "Damage Thresholds", "minor": "Minor", "major": "Major", - "severe": "Severe" + "severe": "Severe", + "majorThreshold": "Major Damage Threshold", + "severeThreshold": "Severe Damage Threshold" }, "Dice": { "single": "Die", "plural": "Dice" }, + "Difficulty": { + "all": "Difficulty: all", + "reaction": "Difficulty: reaction" + }, "Disadvantage": { "full": "Disadvantage", "short": "Dis" @@ -985,39 +1126,39 @@ "plural": "Domains", "arcana": { "label": "Arcana", - "Description": "This is the domain of the innate or instinctual use of magic. Those who walk this path tap into the raw, enigmatic forces of the realms to manipulate both the elements and their own energy. Arcana offers wielders a volatile power, but it is incredibly potent when correctly channeled." + "description": "This is the domain of the innate or instinctual use of magic. Those who walk this path tap into the raw, enigmatic forces of the realms to manipulate both the elements and their own energy. Arcana offers wielders a volatile power, but it is incredibly potent when correctly channeled." }, "blade": { "label": "Blade", - "Description": "This is the domain of those who dedicate their lives to the mastery of weapons. Whether by blade, bow, or perhaps a more specialized arm, those who follow this path have the skill to cut short the lives of others. Blade requires study and dedication from its followers, in exchange for inexorable power over death." + "description": "This is the domain of those who dedicate their lives to the mastery of weapons. Whether by blade, bow, or perhaps a more specialized arm, those who follow this path have the skill to cut short the lives of others. Blade requires study and dedication from its followers, in exchange for inexorable power over death." }, "bone": { "label": "Bone", - "Description": "This is the domain of mastery of swiftness and tactical mastery. Practitioners of this domain have an uncanny control over their own physical abilities, and an eye for predicting the behaviors of others in combat. Bone grants its adherents unparalleled understanding of bodies and their movements in exchange for diligent training." + "description": "This is the domain of mastery of swiftness and tactical mastery. Practitioners of this domain have an uncanny control over their own physical abilities, and an eye for predicting the behaviors of others in combat. Bone grants its adherents unparalleled understanding of bodies and their movements in exchange for diligent training." }, "codex": { "label": "Codex", - "Description": "This is the domain of intensive magical study. Those who seek magical knowledge turn to the recipes of power recorded in books, on scrolls, etched into walls, or tattooed on bodies. Codex offers a commanding and versatile understanding of magic to those devotees who are willing to seek beyond the common knowledge." + "description": "This is the domain of intensive magical study. Those who seek magical knowledge turn to the recipes of power recorded in books, on scrolls, etched into walls, or tattooed on bodies. Codex offers a commanding and versatile understanding of magic to those devotees who are willing to seek beyond the common knowledge." }, "grace": { "label": "Grace", - "Description": "This is the domain of charisma. Through rapturous storytelling, clever charm, or a shroud of lies, those who channel this power define the realities of their adversaries, bending perception to their will. Grace offers its wielders raw magnetism and mastery over language." + "description": "This is the domain of charisma. Through rapturous storytelling, clever charm, or a shroud of lies, those who channel this power define the realities of their adversaries, bending perception to their will. Grace offers its wielders raw magnetism and mastery over language." }, "midnight": { "label": "Midnight", - "Description": "This is the domain of shadows and secrecy. Whether by clever tricks, or cloak of night those who channel these forces are practiced in that art of obscurity and there is nothing hidden they cannot reach. Midnight offers practitioners the incredible power to control and create enigmas." + "description": "This is the domain of shadows and secrecy. Whether by clever tricks, or cloak of night those who channel these forces are practiced in that art of obscurity and there is nothing hidden they cannot reach. Midnight offers practitioners the incredible power to control and create enigmas." }, "sage": { "label": "Sage", - "Description": "This is the domain of the natural world. Those who walk this path tap into the unfettered power of the earth and its creatures to unleash raw magic. Sage grants its adherents the vitality of a blooming flower and ferocity of a hungry predator." + "description": "This is the domain of the natural world. Those who walk this path tap into the unfettered power of the earth and its creatures to unleash raw magic. Sage grants its adherents the vitality of a blooming flower and ferocity of a hungry predator." }, "splendor": { "label": "Splendor", - "Description": "This is the domain of life. Through this magic, followers gain the ability to heal, though such power also grants the wielder some control over death. Splendor offers its disciples the magnificent ability to both give and end life." + "description": "This is the domain of life. Through this magic, followers gain the ability to heal, though such power also grants the wielder some control over death. Splendor offers its disciples the magnificent ability to both give and end life." }, "valor": { "label": "Valor", - "Description": "This is the domain of protection. Whether through attack or defense, those who choose this discipline channel formidable strength to protect their allies in battle. Valor offers great power to those who raise their shield in defense of others." + "description": "This is the domain of protection. Whether through attack or defense, those who choose this discipline channel formidable strength to protect their allies in battle. Valor offers great power to those who raise their shield in defense of others." } }, "Effect": { @@ -1028,15 +1169,73 @@ "single": "Experience", "plural": "Experiences" }, + "Healing": { + "healingAmount": "Healing Amount" + }, + "Modifier": { + "single": "Modifier", + "plural": "Modifiers" + }, "Neutral": { "full": "None", "short": "no" }, + "Range": { + "other": "Range Increase: Other", + "spell": "Range Increase: Spell", + "weapon": "Range Increase: Weapon" + }, "RefreshType": { "session": "Session", "shortrest": "Short Rest", "longrest": "Long Rest" }, + "Resource": { + "single": "Resource", + "plural": "Resources" + }, + "Roll": { + "attack": "Attack Roll", + "difficulty": "Roll (Difficulty {difficulty})", + "primaryWeaponAttack": "Primary Weapon Attack Roll", + "secondaryWeaponAttack": "Secondary Weapon Attack Roll", + "spellcast": "Spellcast Roll", + "trait": "Trait Roll", + "action": "Action Roll", + "reaction": "Reaction Roll" + }, + "Rules": { + "damageReduction": { + "increasePerArmorMark": { + "label": "Damage Reduction per Armor Slot", + "hint": "A used armor slot normally reduces damage by one step. This value increases the number of steps damage is reduced by." + }, + "maxArmorMarkedBonus": "Max Armor Used", + "maxArmorMarkedStress": { + "label": "Max Armor Used With Stress", + "hint": "If this value is set you can use up to that much stress to spend additional Armor Marks beyond your normal maximum." + }, + "stress": { + "severe": { + "label": "Stress Damage Reduction: Severe", + "hint": "The cost in stress you can pay to reduce severe damage down to major." + }, + "major": { + "label": "Stress Damage Reduction: Major", + "hint": "The cost in stress you can pay to reduce major damage down to minor." + }, + "minor": { + "label": "Stress Damage Reduction: Minor", + "hint": "The cost in stress you can pay to reduce minor damage to none." + } + } + }, + "attack": { + "damage": { + "value": { "label": "Base Attack: Damage" } + } + } + }, "Tabs": { "details": "Details", "attack": "Attack", @@ -1065,52 +1264,124 @@ "specialization": "Specialization", "mastery": "Mastery", "optional": "Optional", + "recovery": "Recovery", "setup": "Setup", - "equipment": "Equipment" - }, - "Tiers": { - "singular": "Tier", + "equipment": "Equipment", + "attachments": "Attachments", + "advanced": "Advanced", "tier1": "Tier 1", "tier2": "Tier 2", "tier3": "Tier 3", - "tier4": "Tier 4" + "tier4": "tier 4" + }, + "Tiers": { + "singular": "Tier", + "1": "Tier 1", + "2": "Tier 2", + "3": "Tier 3", + "4": "Tier 4" }, "Trait": { "single": "Trait", "plural": "Traits" }, + "actorName": "Actor Name", + "amount": "Amount", + "armorScore": "Armor Score", "activeEffects": "Active Effects", + "armorSlots": "Armor Slots", "attack": "Attack", "basics": "Basics", "bonus": "Bonus", "burden": "Burden", "check": "{check} Check", + "continue": "Continue", "criticalSuccess": "Critical Success", + "damage": "Damage", + "damageType": "Damage Type", "description": "Description", + "difficulty": "Difficulty", + "dropActorsHere": "Drop Actors here", "duality": "Duality", "dualityRoll": "Duality Roll", "enabled": "Enabled", "evasion": "Evasion", + "equipment": "Equipment", + "experience": { + "single": "Experience", + "plural": "Experiences" + }, + "failure": "Failure", "fear": "Fear", "features": "Features", - "hitPoints": "Hit Points", + "formula": "Formula", + "healing": "Healing", + "HitPoints": { + "single": "Hit Point", + "plural": "Hit Points", + "short": "HP" + }, "hope": "Hope", + "hordeHp": "Horde HP", + "identify": "Identity", + "imagePath": "Image Path", "inactiveEffects": "Inactive Effects", "inventory": "Inventory", "level": "Level", - "modifier": "Modifier", + "levelUp": "Level Up", + "loadout": "Loadout", + "max": "Max", "multiclass": "Multiclass", + "newCategory": "New Category", + "none": "None", + "partner": "Partner", + "proficiency": "Proficiency", "quantity": "Quantity", "range": "Range", + "recovery": "Recovery", + "resource": "Resource", + "roll": "Roll", + "rollAll": "Roll All", + "rollDamage": "Roll Damage", + "save": "Save", + "scalable": "Scalable", + "situationalBonus": "Situational Bonus", "stress": "Stress", + "success": "Success", "take": "Take", - "target": "Target", + "Target": { + "single": "Target", + "plural": "Targets" + }, "title": "Title", + "total": "Total", + "true": "True", "type": "Type", + "unarmed": "Unarmed", + "unarmedStrike": "Unarmed Strike", "unarmored": "Unarmored", - "use": "Use" + "use": "Use", + "used": "Used", + "uses": "Uses", + "value": "Value", + "withThing": "With {thing}" }, "ITEMS": { + "FIELDS": { + "resource": { + "amount": { "label": "Amount" }, + "dieFaces": { "label": "Die Faces" }, + "icon": { "label": "Icon" }, + "max": { "label": "Max" }, + "recovery": { "label": "Recovery" }, + "type": { "label": "Type" }, + "value": { "label": "Value" } + } + }, + "Ancestry": { + "primaryFeature": "Primary Feature", + "secondaryFeature": "Secondary Feature" + }, "Armor": { "baseScore": "Base Score", "baseThresholds": { @@ -1121,20 +1392,39 @@ }, "Beastform": { "FIELDS": { + "beastformType": { "label": "Beastform Type" }, "tier": { "label": "Tier" }, + "mainTrait": { "label": "Main Trait" }, "examples": { "label": "Examples" }, "advantageOn": { "label": "Gain Advantage On" }, "tokenImg": { "label": "Token Image" }, + "tokenRingImg": { "label": "Subject Texture" }, "tokenSize": { "placeholder": "Using character dimensions", "height": { "label": "Height" }, "width": { "label": "Width" } + }, + "evolved": { + "maximumTier": { "label": "Maximum Tier" }, + "mainTraitBonus": { "label": "Main Trait Bonus" } + }, + "hybrid": { + "beastformOptions": { "label": "Nr Beastforms" }, + "advantages": { "label": "Nr Advantages" }, + "features": { "label": "Nr Features" } } }, + "attackName": "Beast Attack", + "beastformEffect": "Beastform Transformation", "dialogTitle": "Beastform Selection", "tokenTitle": "Beastform Token", "transform": "Transform", - "beastformEffect": "Beastform Transformation" + "evolve": "Evolve", + "evolvedFeatureTitle": "Evolved", + "evolvedDrag": "Drag a form here to evolve it.", + "hybridize": "Hybridize", + "hybridizeFeatureTitle": "Hybrid Features", + "hybridizeDrag": "Drag a form here to hybridize it." }, "Class": { "hopeFeatures": "Hope Features", @@ -1155,8 +1445,8 @@ }, "DomainCard": { "type": "Type", - "foundation": "Foundation", "recallCost": "Recall Cost", + "foundationTitle": "Foundation", "specializationTitle": "Specialization", "masteryTitle": "Mastery" }, @@ -1164,6 +1454,7 @@ "spellcastingTrait": "Spellcasting Trait" }, "Weapon": { + "weaponType": "Weapon Type", "primaryWeapon": "Primary Weapon", "secondaryWeapon": "Secondary Weapon" } @@ -1171,7 +1462,8 @@ "SETTINGS": { "Appearance": { "FIELDS": { - "displayFear": { "label": "Fear Display" } + "displayFear": { "label": "Fear Display" }, + "showGenericStatusEffects": { "label": "Show Foundry Status Effects" } }, "fearDisplay": { "token": "Tokens", @@ -1185,17 +1477,18 @@ "hint": "Automatically increase the GM's fear pool on a fear duality roll result." }, "FIELDS": { - "hope": { - "label": "Hope", - "hint": "Automatically increase a character's hope on a hope duality roll result." + "hopeFear": { + "label": "Hope & Fear", + "gm": { "label": "GM" }, + "players": { "label": "Players" } }, "actionPoints": { "label": "Action Points", "hint": "Automatically give and take Action Points as combatants take their turns." }, - "countdowns": { - "label": "Countdowns", - "hint": "Automatically progress non-custom countdowns" + "hordeDamage": { + "label": "Automatic Horde Damage", + "hint": "Automatically active horde effect to lower damage when reaching half or lower HP." } } }, @@ -1226,6 +1519,7 @@ } }, "Menu": { + "title": "Daggerheart Game Settings", "automation": { "name": "Automation Settings", "label": "Configure Automation", @@ -1285,8 +1579,8 @@ }, "UI": { "Chat": { - "dualityRoll": { - "abilityCheckTitle": "{ability} Check" + "applyEffect": { + "title": "Apply Effects - {name}" }, "attackRoll": { "title": "Attack - {attack}", @@ -1302,25 +1596,28 @@ "hitTarget": "Hit Targets", "selectedTarget": "Selected" }, - "applyEffect": { - "title": "Apply Effects - {name}" - }, - "healingRoll": { - "title": "Heal - {healing}", - "heal": "Heal" - }, "deathMove": { "title": "Death Move" }, "domainCard": { "title": "Domain Card" }, + "dualityRoll": { + "abilityCheckTitle": "{ability} Check" + }, + "featureTitle": "Class Feature", "foundationCard": { "ancestryTitle": "Ancestry Card", "communityTitle": "Community Card", "subclassFeatureTitle": "Subclass Feature" }, - "featureTitle": "Class Feature" + "healingRoll": { + "title": "Heal - {healing}", + "heal": "Heal" + }, + "resourceRoll": { + "playerMessage": "{user} rerolled their {name}" + } }, "Notifications": { "adversaryMissing": "The linked adversary doesn't exist in the world.", @@ -1360,9 +1657,27 @@ "damageAlreadyNone": "The damage has already been reduced to none", "noAvailableArmorMarks": "You have no more available armor marks", "notEnoughStress": "You don't have enough stress", - "damageIgnore": "{character} did not take damage" + "damageIgnore": "{character} did not take damage", + "featureIsMissing": "Feature is missing", + "actionIsMissing": "Action is missing", + "attackIsMissing": "Attack is missing", + "unownedActionMacro": "Cannot make a Use macro for an Action not on your character", + "unownedAttackMacro": "Cannot make a Use macro for an Attack that doesn't belong to one of your characters", + "featureNotHope": "This feature is used as something else than a Hope feature and cannot be used here.", + "featureNotClass": "This feature is used as something else than a Class feature and cannot be used here.", + "featureNotPrimary": "This feature is used as something else than a Primary feature and cannot be used here.", + "featureNotSecondary": "This feature is used as something else than a Secondary feature and cannot be used here.", + "featureNotFoundation": "This feature is used as something else than a Foundation feature and cannot be used here.", + "featureNotSpecialization": "This feature is used as something else than a Specialization feature and cannot be used here.", + "featureNotMastery": "This feature is used as something else than a Mastery feature and cannot be used here.", + "beastformMissingEffect": "The Beastform is missing a Beastform Effect. Cannot be used.", + "beastformToManyAdvantages": "You cannot select any more advantages.", + "beastformToManyFeatures": "You cannot select any more features.", + "beastformEquipWeapon": "You cannot use weapons while in a Beastform." }, "Tooltip": { + "disableEffect": "Disable Effect", + "enableEffect": "Enable Effect", "openItemWorld": "Open Item World", "openActorWorld": "Open Actor World", "sendToChat": "Send to Chat", @@ -1371,7 +1686,10 @@ "unequip": "Unequip", "sendToVault": "Send to Vault", "sendToLoadout": "Send to Loadout", - "makeDeathMove": "Make a Death Move" + "makeDeathMove": "Make a Death Move", + "rangeAndTarget": "Range & Target", + "dragApplyEffect": "Drag effect to apply it to an actor", + "appliedEvenIfSuccessful": "Applied even if save succeeded" } } } diff --git a/module/applications/_module.mjs b/module/applications/_module.mjs index 82c2866c..d4ceb229 100644 --- a/module/applications/_module.mjs +++ b/module/applications/_module.mjs @@ -1,5 +1,6 @@ export * as characterCreation from './characterCreation/_module.mjs'; export * as dialogs from './dialogs/_module.mjs'; +export * as hud from './hud/_module.mjs'; export * as levelup from './levelup/_module.mjs'; export * as settings from './settings/_module.mjs'; export * as sheets from './sheets/_module.mjs'; diff --git a/module/applications/characterCreation/characterCreation.mjs b/module/applications/characterCreation/characterCreation.mjs index 71849f56..b8759cc5 100644 --- a/module/applications/characterCreation/characterCreation.mjs +++ b/module/applications/characterCreation/characterCreation.mjs @@ -11,13 +11,16 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl this.setup = { traits: this.character.system.traits, - ancestry: this.character.system.ancestry ?? {}, + ancestryName: '', + mixedAncestry: false, + primaryAncestry: this.character.system.ancestry ?? {}, + secondaryAncestry: {}, community: this.character.system.community ?? {}, class: this.character.system.class?.value ?? {}, subclass: this.character.system.class?.subclass ?? {}, experiences: { - [foundry.utils.randomID()]: { description: '', value: 2 }, - [foundry.utils.randomID()]: { description: '', value: 2 } + [foundry.utils.randomID()]: { name: '', value: 2 }, + [foundry.utils.randomID()]: { name: '', value: 2 } }, domainCards: { [foundry.utils.randomID()]: {}, @@ -47,12 +50,13 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl static DEFAULT_OPTIONS = { tag: 'form', classes: ['daggerheart', 'dialog', 'dh-style', 'character-creation'], - position: { width: 800, height: 'auto' }, + position: { width: 700, height: 'auto' }, actions: { viewCompendium: this.viewCompendium, viewItem: this.viewItem, useSuggestedTraits: this.useSuggestedTraits, equipmentChoice: this.equipmentChoice, + setupGoNext: this.setupGoNext, finish: this.finish }, form: { @@ -76,6 +80,12 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl static PARTS = { tabs: { template: 'systems/daggerheart/templates/characterCreation/tabs.hbs' }, setup: { template: 'systems/daggerheart/templates/characterCreation/tabs/setup.hbs' }, + ancestry: { template: 'systems/daggerheart/templates/characterCreation/setupTabs/ancestry.hbs' }, + community: { template: 'systems/daggerheart/templates/characterCreation/setupTabs/community.hbs' }, + class: { template: 'systems/daggerheart/templates/characterCreation/setupTabs/class.hbs' }, + traits: { template: 'systems/daggerheart/templates/characterCreation/setupTabs/traits.hbs' }, + experience: { template: 'systems/daggerheart/templates/characterCreation/setupTabs/experience.hbs' }, + domainCards: { template: 'systems/daggerheart/templates/characterCreation/setupTabs/domainCards.hbs' }, equipment: { template: 'systems/daggerheart/templates/characterCreation/tabs/equipment.hbs' }, // story: { template: 'systems/daggerheart/templates/characterCreation/tabs/story.hbs' }, footer: { template: 'systems/daggerheart/templates/characterCreation/footer.hbs' } @@ -107,6 +117,51 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl // } }; + static SETUPTABS = { + ancestry: { + active: true, + cssClass: '', + group: 'setup', + id: 'ancestry', + label: 'DAGGERHEART.APPLICATIONS.CharacterCreation.setupTabs.ancestry' + }, + community: { + active: false, + cssClass: '', + group: 'setup', + id: 'community', + label: 'DAGGERHEART.APPLICATIONS.CharacterCreation.setupTabs.community' + }, + class: { + active: false, + cssClass: '', + group: 'setup', + id: 'class', + label: 'DAGGERHEART.APPLICATIONS.CharacterCreation.setupTabs.class' + }, + traits: { + active: false, + cssClass: '', + group: 'setup', + id: 'traits', + label: 'DAGGERHEART.APPLICATIONS.CharacterCreation.setupTabs.traits' + }, + experience: { + active: false, + cssClass: '', + group: 'setup', + id: 'experience', + label: 'DAGGERHEART.APPLICATIONS.CharacterCreation.setupTabs.experience' + }, + domainCards: { + active: false, + cssClass: '', + group: 'setup', + id: 'domainCards', + label: 'DAGGERHEART.APPLICATIONS.CharacterCreation.setupTabs.domainCards' + } + }; + _getTabs(tabs) { for (const v of Object.values(tabs)) { v.active = this.tabGroups[v.group] ? this.tabGroups[v.group] === v.id : v.active; @@ -114,14 +169,16 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl switch (v.id) { case 'setup': + const ancestryFinished = this.setup.primaryAncestry.uuid; + const communityFinished = this.setup.community.uuid; const classFinished = this.setup.class.uuid && this.setup.subclass.uuid; - const heritageFinished = this.setup.ancestry.uuid && this.setup.community.uuid; const traitsFinished = Object.values(this.setup.traits).every(x => x.value !== null); - const experiencesFinished = Object.values(this.setup.experiences).every(x => x.description); + const experiencesFinished = Object.values(this.setup.experiences).every(x => x.name); const domainCardsFinished = Object.values(this.setup.domainCards).every(x => x.uuid); v.finished = + ancestryFinished && + communityFinished && classFinished && - heritageFinished && traitsFinished && experiencesFinished && domainCardsFinished; @@ -146,15 +203,44 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl return tabs; } + _getSetupTabs(tabs) { + for (const v of Object.values(tabs)) { + v.active = this.tabGroups[v.group] ? this.tabGroups[v.group] === v.id : v.active; + v.cssClass = v.active ? 'active' : ''; + + switch (v.id) { + case 'community': + v.disabled = this.setup.visibility < 2; + break; + case 'class': + v.disabled = this.setup.visibility < 3; + break; + case 'traits': + v.disabled = this.setup.visibility < 4; + break; + case 'experience': + v.disabled = this.setup.visibility < 5; + break; + case 'domainCards': + v.disabled = this.setup.visibility < 6; + break; + } + } + + return tabs; + } + changeTab(tab, group, options) { super.changeTab(tab, group, options); - for (var listTab of Object.keys(this.constructor.TABS)) { - const marker = options.navElement.querySelector(`a[data-action="tab"].${listTab} .finish-marker`); - if (listTab === tab) { - marker.classList.add('active'); - } else { - marker.classList.remove('active'); + if (group === 'primary') { + for (var listTab of Object.keys(this.constructor.TABS)) { + const marker = options.navElement.querySelector(`a[data-action="tab"].${listTab} .finish-marker`); + if (listTab === tab) { + marker.classList.add('active'); + } else { + marker.classList.remove('active'); + } } } } @@ -163,6 +249,11 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl super._attachPartListeners(partId, htmlElement, options); this._dragDrop.forEach(d => d.bind(htmlElement)); + + htmlElement.querySelectorAll('.mixed-ancestry-slider').forEach(element => { + element.addEventListener('input', this.mixedAncestryToggle.bind(this)); + element.addEventListener('click', this.mixedAncestryToggle.bind(this)); + }); } async _prepareContext(_options) { @@ -174,7 +265,30 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl async _preparePartContext(partId, context) { switch (partId) { + case 'footer': + context.isLastTab = this.tabGroups.setup === 'domainCards'; + switch (this.tabGroups.setup) { + case null: + case 'ancestry': + context.nextDisabled = this.setup.visibility === 1; + break; + case 'community': + context.nextDisabled = this.setup.visibility === 2; + break; + case 'class': + context.nextDisabled = this.setup.visibility === 3; + break; + case 'traits': + context.nextDisabled = this.setup.visibility === 4; + break; + case 'experience': + context.nextDisabled = this.setup.visibility === 5; + break; + } + + break; case 'setup': + context.setupTabs = this._getSetupTabs(this.constructor.SETUPTABS); const availableTraitModifiers = game.settings .get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew) .traitArray.map(trait => ({ key: trait, name: trait })); @@ -215,13 +329,13 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl context.experience = { values: this.setup.experiences, nrTotal: Object.keys(this.setup.experiences).length, - nrSelected: Object.values(this.setup.experiences).reduce( - (acc, exp) => acc + (exp.description ? 1 : 0), - 0 - ) + nrSelected: Object.values(this.setup.experiences).reduce((acc, exp) => acc + (exp.name ? 1 : 0), 0) }; - context.ancestry = { ...this.setup.ancestry, compendium: 'ancestries' }; + context.mixedAncestry = Number(this.setup.mixedAncestry); + context.ancestryName = this.setup.ancestryName; + context.primaryAncestry = { ...this.setup.primaryAncestry, compendium: 'ancestries' }; + context.secondaryAncestry = { ...this.setup.secondaryAncestry, compendium: 'ancestries' }; context.community = { ...this.setup.community, compendium: 'communities' }; context.class = { ...this.setup.class, compendium: 'classes' }; context.subclass = { ...this.setup.subclass, compendium: 'subclasses' }; @@ -278,18 +392,29 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl this.render(); } + mixedAncestryToggle(event) { + event.preventDefault(); + event.stopPropagation(); + this.setup.mixedAncestry = !this.setup.mixedAncestry; + if (!this.setup.mixedAncestry) this.setup.secondaryAncestry = {}; + + this.render(); + } + getUpdateVisibility() { switch (this.setup.visibility) { + case 6: + return 6; case 5: - return 5; + return Object.values(this.setup.experiences).every(x => x.name) ? 6 : 5; case 4: - return Object.values(this.setup.experiences).every(x => x.description) ? 5 : 4; + return Object.values(this.setup.traits).every(x => x.value !== null) ? 5 : 4; case 3: - return Object.values(this.setup.traits).every(x => x.value !== null) ? 4 : 3; + return this.setup.class.uuid && this.setup.subclass.uuid ? 4 : 3; case 2: - return this.setup.ancestry.uuid && this.setup.community.uuid ? 3 : 2; + return this.setup.community.uuid ? 3 : 2; case 1: - return this.setup.class.uuid && this.setup.subclass.uuid ? 2 : 1; + return this.setup.primaryAncestry.uuid ? 2 : 1; } } @@ -348,8 +473,44 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl this.render(); } + static setupGoNext() { + switch (this.setup.visibility) { + case 2: + this.tabGroups.setup = 'community'; + break; + case 3: + this.tabGroups.setup = 'class'; + break; + case 4: + this.tabGroups.setup = 'traits'; + break; + case 5: + this.tabGroups.setup = 'experience'; + break; + case 6: + this.tabGroups.setup = 'domainCards'; + break; + } + + this.render(); + } + static async finish() { - await this.character.createEmbeddedDocuments('Item', [this.setup.ancestry]); + const primaryAncestryFeature = this.setup.primaryAncestry.system.primaryFeature; + const secondaryAncestryFeature = this.setup.secondaryAncestry?.uuid + ? this.setup.secondaryAncestry.system.secondaryFeature + : this.setup.primaryAncestry.system.secondaryFeature; + + const ancestry = { + ...this.setup.primaryAncestry, + name: this.setup.ancestryName ?? this.setup.primaryAncestry.name, + system: { + ...this.setup.primaryAncestry.system, + features: [primaryAncestryFeature.uuid, secondaryAncestryFeature.uuid] + } + }; + + await this.character.createEmbeddedDocuments('Item', [ancestry]); await this.character.createEmbeddedDocuments('Item', [this.setup.community]); await this.character.createEmbeddedDocuments('Item', [this.setup.class]); await this.character.createEmbeddedDocuments('Item', [this.setup.subclass]); @@ -396,8 +557,15 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl async _onDrop(event) { const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); const item = await foundry.utils.fromUuid(data.uuid); - if (item.type === 'ancestry' && event.target.closest('.ancestry-card')) { - this.setup.ancestry = { + if (item.type === 'ancestry' && event.target.closest('.primary-ancestry-card')) { + this.setup.ancestryName = item.name; + this.setup.primaryAncestry = { + ...item, + effects: Array.from(item.effects).map(x => x.toObject()), + uuid: item.uuid + }; + } else if (item.type === 'ancestry' && event.target.closest('.secondary-ancestry-card')) { + this.setup.secondaryAncestry = { ...item, effects: Array.from(item.effects).map(x => x.toObject()), uuid: item.uuid diff --git a/module/applications/dialogs/_module.mjs b/module/applications/dialogs/_module.mjs index 82c6f17d..bbffb791 100644 --- a/module/applications/dialogs/_module.mjs +++ b/module/applications/dialogs/_module.mjs @@ -1,5 +1,4 @@ export { default as BeastformDialog } from './beastformDialog.mjs'; -export { default as costSelectionDialog } from './costSelectionDialog.mjs'; export { default as d20RollDialog } from './d20RollDialog.mjs'; export { default as DamageDialog } from './damageDialog.mjs'; export { default as DamageReductionDialog } from './damageReductionDialog.mjs'; @@ -7,3 +6,4 @@ export { default as DamageSelectionDialog } from './damageSelectionDialog.mjs'; export { default as DeathMove } from './deathMove.mjs'; export { default as Downtime } from './downtime.mjs'; export { default as OwnershipSelection } from './ownershipSelection.mjs'; +export { default as ResourceDiceDialog } from './resourceDiceDialog.mjs'; diff --git a/module/applications/dialogs/beastformDialog.mjs b/module/applications/dialogs/beastformDialog.mjs index 367311b0..3c35b542 100644 --- a/module/applications/dialogs/beastformDialog.mjs +++ b/module/applications/dialogs/beastformDialog.mjs @@ -1,67 +1,261 @@ const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; export default class BeastformDialog extends HandlebarsApplicationMixin(ApplicationV2) { - constructor(configData) { + constructor(configData, item) { super(); + this.item = item; + this.configData = configData; this.selected = null; + this.evolved = { form: null }; + this.hybrid = { forms: {}, advantages: {}, features: {} }; + + this._dragDrop = this._createDragDropHandlers(); } static DEFAULT_OPTIONS = { tag: 'form', - classes: ['daggerheart', 'views', 'dh-style', 'beastform-selection'], + classes: ['daggerheart', 'views', 'dialog', 'dh-style', 'beastform-selection'], position: { width: 600, height: 'auto' }, + window: { + icon: 'fa-solid fa-paw' + }, actions: { selectBeastform: this.selectBeastform, + toggleHybridFeature: this.toggleHybridFeature, + toggleHybridAdvantage: this.toggleHybridAdvantage, submitBeastform: this.submitBeastform }, form: { handler: this.updateBeastform, submitOnChange: true, submitOnClose: false - } + }, + dragDrop: [{ dragSelector: '.beastform-container', dropSelector: '.advanced-form-container' }] }; get title() { - return game.i18n.localize('DAGGERHEART.ITEMS.Beastform.dialogTitle'); + return this.item.name; } /** @override */ static PARTS = { - beastform: { - template: 'systems/daggerheart/templates/dialogs/beastformDialog.hbs' + header: { template: 'systems/daggerheart/templates/dialogs/beastform/header.hbs' }, + tabs: { template: 'systems/daggerheart/templates/dialogs/beastform/tabs.hbs' }, + beastformTier: { template: 'systems/daggerheart/templates/dialogs/beastform/beastformTier.hbs' }, + advanced: { template: 'systems/daggerheart/templates/dialogs/beastform/advanced.hbs' }, + footer: { template: 'systems/daggerheart/templates/dialogs/beastform/footer.hbs' } + }; + + /** @inheritdoc */ + static TABS = { + primary: { + tabs: [{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }], + initial: '1', + labelPrefix: 'DAGGERHEART.GENERAL.Tiers' } }; + changeTab(tab, group, options) { + super.changeTab(tab, group, options); + + this.render(); + } + + _createDragDropHandlers() { + return this.options.dragDrop.map(d => { + d.callbacks = { + dragstart: this._onDragStart.bind(this), + drop: this._onDrop.bind(this) + }; + return new foundry.applications.ux.DragDrop.implementation(d); + }); + } + + _attachPartListeners(partId, htmlElement, options) { + super._attachPartListeners(partId, htmlElement, options); + + this._dragDrop.forEach(d => d.bind(htmlElement)); + } + async _prepareContext(_options) { const context = await super._prepareContext(_options); - context.beastformTiers = game.items.reduce((acc, x) => { - const tier = CONFIG.DH.GENERAL.tiers[x.system.tier]; - if (x.type !== 'beastform' || tier.value > this.configData.tierLimit) return acc; + context.selected = this.selected; + context.selectedBeastformEffect = this.selected?.effects?.find?.(x => x.type === 'beastform'); - if (!acc[tier.value]) acc[tier.value] = { label: game.i18n.localize(tier.label), values: {} }; - acc[tier.value].values[x.uuid] = { selected: this.selected == x.uuid, value: x }; + context.evolved = this.evolved; + context.hybridForms = Object.keys(this.hybrid.forms).reduce((acc, formKey) => { + if (!this.hybrid.forms[formKey]) { + acc[formKey] = null; + } else { + const data = this.hybrid.forms[formKey].toObject(); + acc[formKey] = { + ...data, + system: { + ...data.system, + features: this.hybrid.forms[formKey].system.features.map(feature => ({ + ...feature.toObject(), + uuid: feature.uuid, + selected: Boolean(this.hybrid.features?.[formKey]?.[feature.uuid]) + })), + advantageOn: Object.keys(data.system.advantageOn).reduce((acc, key) => { + acc[key] = { + ...data.system.advantageOn[key], + selected: Boolean(this.hybrid.advantages?.[formKey]?.[key]) + }; + return acc; + }, {}) + } + }; + } return acc; - }, {}); // Also get from compendium when added - context.canSubmit = this.selected; + }, {}); + + const maximumDragTier = Math.max( + this.selected?.system?.evolved?.maximumTier ?? 0, + this.selected?.system?.hybrid?.maximumTier ?? 0 + ); + + const compendiumBeastforms = await game.packs.get(`daggerheart.beastforms`)?.getDocuments(); + const beastformTiers = [...(compendiumBeastforms ? compendiumBeastforms : []), ...game.items].reduce( + (acc, x) => { + const tier = CONFIG.DH.GENERAL.tiers[x.system.tier]; + if (x.type !== 'beastform' || tier.id > this.configData.tierLimit) return acc; + + if (!acc[tier.id]) acc[tier.id] = { label: game.i18n.localize(tier.label), values: {} }; + + acc[tier.id].values[x.uuid] = { + selected: this.selected?.uuid == x.uuid, + value: x, + draggable: + !['evolved', 'hybrid'].includes(x.system.beastformType) && maximumDragTier + ? x.system.tier <= maximumDragTier + : false + }; + + return acc; + }, + {} + ); + + context.tier = beastformTiers[this.tabGroups.primary]; + context.tierKey = this.tabGroups.primary; + + context.canSubmit = this.canSubmit(); return context; } + canSubmit() { + if (this.selected) { + switch (this.selected.system.beastformType) { + case 'normal': + return true; + case 'evolved': + return this.evolved.form; + case 'hybrid': + const selectedAdvantages = Object.values(this.hybrid.advantages).reduce( + (acc, form) => acc + Object.values(form).length, + 0 + ); + const selectedFeatures = Object.values(this.hybrid.features).reduce( + (acc, form) => acc + Object.values(form).length, + 0 + ); + + const advantagesSelected = selectedAdvantages === this.selected.system.hybrid.advantages; + const featuresSelected = selectedFeatures === this.selected.system.hybrid.features; + return advantagesSelected && featuresSelected; + } + } + + return false; + } + static updateBeastform(event, _, formData) { this.selected = foundry.utils.mergeObject(this.selected, formData.object); this.render(); } - static selectBeastform(_, target) { - this.selected = this.selected === target.dataset.uuid ? null : target.dataset.uuid; + static async selectBeastform(_, target) { + this.element.querySelectorAll('.beastform-container ').forEach(element => { + if (element.dataset.uuid === target.dataset.uuid && this.selected?.uuid !== target.dataset.uuid) { + element.classList.remove('inactive'); + } else { + element.classList.add('inactive'); + } + }); + + const uuid = this.selected?.uuid === target.dataset.uuid ? null : target.dataset.uuid; + this.selected = uuid ? await foundry.utils.fromUuid(uuid) : null; + + if (this.selected) { + if (this.selected.system.beastformType !== 'evolved') this.evolved.form = null; + if (this.selected.system.beastformType !== 'hybrid') { + this.hybrid.forms = {}; + this.hybrid.advantages = {}; + this.hybrid.features = {}; + } else { + this.hybrid.forms = [...Array(this.selected.system.hybrid.beastformOptions).keys()].reduce((acc, _) => { + acc[foundry.utils.randomID()] = null; + return acc; + }, {}); + } + } + + this.render(); + } + + static toggleHybridFeature(_, button) { + const current = this.hybrid.features[button.dataset.form]; + if (!current) this.hybrid.features[button.dataset.form] = {}; + + if (this.hybrid.features[button.dataset.form][button.id]) + delete this.hybrid.features[button.dataset.form][button.id]; + else { + const currentFeatures = Object.values(this.hybrid.features).reduce( + (acc, form) => acc + Object.values(form).length, + 0 + ); + if (currentFeatures === this.selected.system.hybrid.features) { + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.beastformToManyFeatures')); + return; + } + + const feature = this.hybrid.forms[button.dataset.form].system.features.find(x => x.uuid === button.id); + this.hybrid.features[button.dataset.form][button.id] = feature; + } + + this.render(); + } + + static toggleHybridAdvantage(_, button) { + const current = this.hybrid.advantages[button.dataset.form]; + if (!current) this.hybrid.advantages[button.dataset.form] = {}; + + if (this.hybrid.advantages[button.dataset.form][button.id]) + delete this.hybrid.advantages[button.dataset.form][button.id]; + else { + const currentAdvantages = Object.values(this.hybrid.advantages).reduce( + (acc, form) => acc + Object.values(form).length, + 0 + ); + if (currentAdvantages === this.selected.system.hybrid.advantages) { + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.beastformToManyAdvantages')); + return; + } + + const advantage = this.hybrid.forms[button.dataset.form].system.advantageOn[button.id]; + this.hybrid.advantages[button.dataset.form][button.id] = advantage; + } + this.render(); } @@ -71,14 +265,61 @@ export default class BeastformDialog extends HandlebarsApplicationMixin(Applicat /** @override */ _onClose(options = {}) { - if (!options.submitted) this.config = false; + if (!options.submitted) this.selected = null; } - static async configure(configData) { + static async configure(configData, item) { return new Promise(resolve => { - const app = new this(configData); - app.addEventListener('close', () => resolve(app.selected), { once: true }); + const app = new this(configData, item); + const featureItem = item; + app.addEventListener( + 'close', + () => resolve({ selected: app.selected, evolved: app.evolved, hybrid: app.hybrid, item: featureItem }), + { once: true } + ); app.render({ force: true }); }); } + + async _onDragStart(event) { + const target = event.currentTarget; + const abort = () => event.preventDefault(); + if (!this.selected) abort(); + + const draggedForm = await foundry.utils.fromUuid(target.dataset.uuid); + if (['evolved', 'hybrid'].includes(draggedForm.system.beastformType)) abort(); + + if (this.selected.system.beastformType === 'evolved') { + if (draggedForm.system.tier > this.selected.system.evolved.maximumTier) abort(); + } + if (this.selected.system.beastformType === 'hybrid') { + if (draggedForm.system.tier > this.selected.system.hybrid.maximumTier) abort(); + } + + event.dataTransfer.setData('text/plain', JSON.stringify(target.dataset)); + event.dataTransfer.setDragImage(target, 60, 0); + } + + async _onDrop(event) { + event.stopPropagation(); + const data = foundry.applications.ux.TextEditor.getDragEventData(event); + const item = await fromUuid(data.uuid); + if (!item) return; + + if (event.target.closest('.advanced-form-container.evolved')) { + this.evolved.form = item; + } else { + const hybridContainer = event.target.closest('.advanced-form-container.hybridized'); + if (hybridContainer) { + const existingId = Object.keys(this.hybrid.forms).find( + key => this.hybrid.forms[key]?.uuid === item.uuid + ); + if (existingId) this.hybrid.forms[existingId] = null; + + this.hybrid.forms[hybridContainer.id] = item; + } + } + + this.render(); + } } diff --git a/module/applications/dialogs/costSelectionDialog.mjs b/module/applications/dialogs/costSelectionDialog.mjs deleted file mode 100644 index 026aac46..00000000 --- a/module/applications/dialogs/costSelectionDialog.mjs +++ /dev/null @@ -1,66 +0,0 @@ -const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; - -export default class CostSelectionDialog extends HandlebarsApplicationMixin(ApplicationV2) { - constructor(costs, uses, action, resolve) { - super({}); - this.costs = costs; - this.uses = uses; - this.action = action; - this.resolve = resolve; - } - - static DEFAULT_OPTIONS = { - tag: 'form', - classes: ['daggerheart', 'views', 'damage-selection'], - position: { - width: 400, - height: 'auto' - }, - actions: { - sendCost: this.sendCost - }, - form: { - handler: this.updateForm, - submitOnChange: true, - closeOnSubmit: false - } - }; - - /** @override */ - static PARTS = { - costSelection: { - id: 'costSelection', - template: 'systems/daggerheart/templates/dialogs/dice-roll/costSelection.hbs' - } - }; - - /* -------------------------------------------- */ - - /** @inheritDoc */ - get title() { - return `Cost Options`; - } - - async _prepareContext(_options) { - const updatedCosts = this.action.calcCosts(this.costs), - updatedUses = this.action.calcUses(this.uses); - return { - costs: updatedCosts, - uses: updatedUses, - canUse: this.action.hasCost(updatedCosts) && this.action.hasUses(updatedUses) - }; - } - - static async updateForm(event, _, formData) { - const data = foundry.utils.expandObject(formData.object); - this.costs = foundry.utils.mergeObject(this.costs, data.costs); - this.uses = foundry.utils.mergeObject(this.uses, data.uses); - this.render(true); - } - - static sendCost(event) { - event.preventDefault(); - this.resolve({ costs: this.action.getRealCosts(this.costs), uses: this.uses }); - this.close(); - } -} diff --git a/module/applications/dialogs/d20RollDialog.mjs b/module/applications/dialogs/d20RollDialog.mjs index db15a7a3..53fc9d69 100644 --- a/module/applications/dialogs/d20RollDialog.mjs +++ b/module/applications/dialogs/d20RollDialog.mjs @@ -22,7 +22,7 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio id: 'roll-selection', classes: ['daggerheart', 'dialog', 'dh-style', 'views', 'roll-selection'], position: { - width: 550 + width: 'auto' }, window: { icon: 'fa-solid fa-dice' @@ -52,10 +52,6 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio rollSelection: { id: 'rollSelection', template: 'systems/daggerheart/templates/dialogs/dice-roll/rollSelection.hbs' - }, - costSelection: { - id: 'costSelection', - template: 'systems/daggerheart/templates/dialogs/dice-roll/costSelection.hbs' } }; @@ -63,9 +59,22 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio const context = await super._prepareContext(_options); context.rollConfig = this.config; context.hasRoll = !!this.config.roll; + context.canRoll = true; + context.selectedRollMode = this.config.selectedRollMode; + context.rollModes = Object.entries(CONFIG.Dice.rollModes).map(([action, { label, icon }]) => ({ + action, + label, + icon + })); + if (this.config.costs?.length) { const updatedCosts = this.action.calcCosts(this.config.costs); - context.costs = updatedCosts; + context.costs = updatedCosts.map(x => ({ + ...x, + label: x.keyIsID + ? this.action.parent.parent.name + : game.i18n.localize(CONFIG.DH.GENERAL.abilityCosts[x.key].label) + })); context.canRoll = this.action.hasCost(updatedCosts); this.config.data.scale = this.config.costs[0].total; } @@ -73,9 +82,10 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio context.uses = this.action.calcUses(this.config.uses); context.canRoll = context.canRoll && this.action.hasUses(context.uses); } - if(this.roll) { + if (this.roll) { context.roll = this.roll; context.rollType = this.roll?.constructor.name; + context.rallyDie = this.roll.rallyChoices; context.experiences = Object.keys(this.config.data.experiences).map(id => ({ id, ...this.config.data.experiences[id] @@ -84,7 +94,6 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio context.advantage = this.config.roll?.advantage; context.disadvantage = this.config.roll?.disadvantage; context.diceOptions = CONFIG.DH.GENERAL.diceTypes; - context.canRoll = true; context.isLite = this.config.roll?.lite; context.extraFormula = this.config.extraFormula; context.formula = this.roll.constructFormula(this.config); @@ -94,6 +103,8 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio static updateRollConfiguration(event, _, formData) { const { ...rest } = foundry.utils.expandObject(formData.object); + this.config.selectedRollMode = rest.selectedRollMode; + if (this.config.costs) { this.config.costs = foundry.utils.mergeObject(this.config.costs, rest.costs); } @@ -117,11 +128,6 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio } static selectExperience(_, button) { - /* if (this.config.experiences.find(x => x === button.dataset.key)) { - this.config.experiences = this.config.experiences.filter(x => x !== button.dataset.key); - } else { - this.config.experiences = [...this.config.experiences, button.dataset.key]; - } */ this.config.experiences = this.config.experiences.indexOf(button.dataset.key) > -1 ? this.config.experiences.filter(x => x !== button.dataset.key) diff --git a/module/applications/dialogs/damageDialog.mjs b/module/applications/dialogs/damageDialog.mjs index 442a1491..78452054 100644 --- a/module/applications/dialogs/damageDialog.mjs +++ b/module/applications/dialogs/damageDialog.mjs @@ -11,11 +11,14 @@ export default class DamageDialog extends HandlebarsApplicationMixin(Application static DEFAULT_OPTIONS = { tag: 'form', id: 'roll-selection', - classes: ['daggerheart', 'views', 'damage-selection'], + classes: ['daggerheart', 'dialog', 'dh-style', 'views', 'damage-selection'], position: { width: 400, height: 'auto' }, + window: { + icon: 'fa-solid fa-dice' + }, actions: { submitRoll: this.submitRoll }, @@ -34,17 +37,33 @@ export default class DamageDialog extends HandlebarsApplicationMixin(Application } }; + get title() { + return game.i18n.localize('DAGGERHEART.EFFECTS.ApplyLocations.damageRoll.name'); + } + async _prepareContext(_options) { const context = await super._prepareContext(_options); - context.title = this.config.title; - context.extraFormula = this.config.extraFormula; + context.config = CONFIG.DH; + context.title = this.config.title + ? this.config.title + : game.i18n.localize('DAGGERHEART.EFFECTS.ApplyLocations.damageRoll.name'); + // context.extraFormula = this.config.extraFormula; context.formula = this.roll.constructFormula(this.config); + context.directDamage = this.config.directDamage; + context.selectedRollMode = this.config.selectedRollMode; + context.rollModes = Object.entries(CONFIG.Dice.rollModes).map(([action, { label, icon }]) => ({ + action, + label, + icon + })); return context; } - static updateRollConfiguration(event, _, formData) { + static updateRollConfiguration(_event, _, formData) { const { ...rest } = foundry.utils.expandObject(formData.object); - this.config.extraFormula = rest.extraFormula; + foundry.utils.mergeObject(this.config.roll, rest.roll); + this.config.selectedRollMode = rest.selectedRollMode; + this.render(); } diff --git a/module/applications/dialogs/damageReductionDialog.mjs b/module/applications/dialogs/damageReductionDialog.mjs index 8a67ef98..3e3bde44 100644 --- a/module/applications/dialogs/damageReductionDialog.mjs +++ b/module/applications/dialogs/damageReductionDialog.mjs @@ -1,9 +1,9 @@ import { damageKeyToNumber, getDamageLabel } from '../../helpers/utils.mjs'; -const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; +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 = damageType.every(t => actor.system.armorApplicableDamageTypes[t] === true); + const maxArmorMarks = canApplyArmor + ? Math.min( + actor.system.armorScore - actor.system.armor.system.marks.value, + actor.system.rules.damageReduction.maxArmorMarked.value + ) + : 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.value; const stressReductionStress = this.availableStressReductions ? stressReductions.reduce((acc, red) => acc + red.cost, 0) @@ -100,7 +110,7 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap ? { value: this.actor.system.resources.stress.value + selectedStressMarks.length + stressReductionStress, - maxTotal: this.actor.system.resources.stress.maxTotal + max: this.actor.system.resources.stress.max } : null; @@ -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 }; }; @@ -184,7 +197,7 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap : 0; const currentStress = this.actor.system.resources.stress.value + selectedStressMarks.length + stressReductionStress; - if (currentStress + stressReduction.cost > this.actor.system.resources.stress.maxTotal) { + if (currentStress + stressReduction.cost > this.actor.system.resources.stress.max) { ui.notifications.info(game.i18n.localize('DAGGERHEART.UI.Notifications.notEnoughStress')); return; } @@ -210,9 +223,17 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap async close(fromSave) { if (!fromSave) { - this.reject(); + this.resolve(); } await super.close({}); } + + 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, type).render({ force: true }); + }); + } } diff --git a/module/applications/dialogs/damageSelectionDialog.mjs b/module/applications/dialogs/damageSelectionDialog.mjs index 5248e81d..547ba87c 100644 --- a/module/applications/dialogs/damageSelectionDialog.mjs +++ b/module/applications/dialogs/damageSelectionDialog.mjs @@ -23,7 +23,7 @@ export default class DamageSelectionDialog extends HandlebarsApplicationMixin(Ap static DEFAULT_OPTIONS = { tag: 'form', - classes: ['daggerheart', 'views', 'damage-selection'], + classes: ['daggerheart', 'dialog', 'dh-style', 'views', 'damage-selection'], position: { width: 400, height: 'auto' diff --git a/module/applications/dialogs/downtime.mjs b/module/applications/dialogs/downtime.mjs index 3966f7e4..163af03e 100644 --- a/module/applications/dialogs/downtime.mjs +++ b/module/applications/dialogs/downtime.mjs @@ -7,8 +7,23 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV this.actor = actor; this.shortrest = shortrest; - const options = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).restMoves; - this.moveData = shortrest ? options.shortRest : options.longRest; + this.moveData = foundry.utils.deepClone( + game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).restMoves + ); + this.nrChoices = { + shortRest: { + taken: 0, + max: + (shortrest ? this.moveData.shortRest.nrChoices : 0) + + actor.system.bonuses.rest[`${shortrest ? 'short' : 'long'}Rest`].shortMoves + }, + longRest: { + taken: 0, + max: + (!shortrest ? this.moveData.longRest.nrChoices : 0) + + actor.system.bonuses.rest[`${shortrest ? 'short' : 'long'}Rest`].longMoves + } + }; } get title() { @@ -17,8 +32,8 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV static DEFAULT_OPTIONS = { tag: 'form', - classes: ['daggerheart', 'views', 'downtime'], - position: { width: 680, height: 'auto' }, + classes: ['daggerheart', 'views', 'dh-style', 'dialog', 'downtime'], + position: { width: 'auto', height: 'auto' }, actions: { selectMove: this.selectMove, takeDowntime: this.takeDowntime @@ -29,7 +44,7 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV static PARTS = { application: { id: 'downtime', - template: 'systems/daggerheart/templates/dialogs/downtime.hbs' + template: 'systems/daggerheart/templates/dialogs/downtime/downtime.hbs' } }; @@ -37,46 +52,85 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV super._attachPartListeners(partId, htmlElement, options); htmlElement - .querySelectorAll('.activity-image') + .querySelectorAll('.activity-container') .forEach(element => element.addEventListener('contextmenu', this.deselectMove.bind(this))); } async _prepareContext(_options) { const context = await super._prepareContext(_options); + context.title = game.i18n.localize( + `DAGGERHEART.APPLICATIONS.Downtime.${this.shortrest ? 'shortRest' : 'longRest'}.title` + ); context.selectedActivity = this.selectedActivity; context.moveData = this.moveData; - context.nrCurrentChoices = Object.values(this.moveData.moves).reduce((acc, x) => acc + (x.selected ?? 0), 0); - context.disabledDowntime = context.nrCurrentChoices < context.moveData.nrChoices; + + const shortRestMovesSelected = this.#nrSelectedMoves('shortRest'); + const longRestMovesSelected = this.#nrSelectedMoves('longRest'); + context.nrChoices = { + ...this.nrChoices, + shortRest: { + ...this.nrChoices.shortRest, + current: this.nrChoices.shortRest.taken + shortRestMovesSelected + }, + longRest: { + ...this.nrChoices.longRest, + current: this.nrChoices.longRest.taken + longRestMovesSelected + } + }; + + context.shortRestMoves = this.nrChoices.shortRest.max > 0 ? this.moveData.shortRest : null; + context.longRestMoves = this.nrChoices.longRest.max > 0 ? this.moveData.longRest : null; + + context.disabledDowntime = shortRestMovesSelected === 0 && longRestMovesSelected === 0; return context; } - static selectMove(_, button) { - const nrSelected = Object.values(this.moveData.moves).reduce((acc, x) => acc + (x.selected ?? 0), 0); - if (nrSelected === this.moveData.nrChoices) { + static selectMove(_, target) { + const { category, move } = target.dataset; + + const nrSelected = this.#nrSelectedMoves(category); + + if (nrSelected + this.nrChoices[category].taken >= this.nrChoices[category].max) { ui.notifications.error(game.i18n.localize('DAGGERHEART.UI.Notifications.noMoreMoves')); return; } - const move = button.dataset.move; - this.moveData.moves[move].selected = this.moveData.moves[move].selected - ? this.moveData.moves[move].selected + 1 + this.moveData[category].moves[move].selected = this.moveData[category].moves[move].selected + ? this.moveData[category].moves[move].selected + 1 : 1; this.render(); } deselectMove(event) { - const move = event.currentTarget.dataset.move; - this.moveData.moves[move].selected = this.moveData.moves[move].selected - ? this.moveData.moves[move].selected - 1 + const button = event.target.closest('.activity-container'); + const { move, category } = button.dataset; + this.moveData[category].moves[move].selected = this.moveData[category].moves[move].selected + ? this.moveData[category].moves[move].selected - 1 : 0; this.render(); + + // On macOS with a single-button mouse (e.g. a laptop trackpad), + // right-click is triggered with ctrl+click, which triggers both a + // `contextmenu` event and a regular click event. We need to stop + // event propagation to prevent the click event from triggering the + // `selectMove` function and undoing the change we just made. + event.stopPropagation(); + + // Having stopped propagation, we're no longer subject to Foundry's + // default `contextmenu` handler, so we also have to prevent the + // default behaviour to prevent a context menu from appearing. + event.preventDefault(); } static async takeDowntime() { - const moves = Object.values(this.moveData.moves).filter(x => x.selected); + const moves = Object.values(this.moveData).flatMap(category => { + return Object.values(category.moves) + .filter(x => x.selected) + .flatMap(move => [...Array(move.selected).keys()].map(_ => move)); + }); const cls = getDocumentClass('ChatMessage'); const msg = new cls({ @@ -88,7 +142,7 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV content: await foundry.applications.handlebars.renderTemplate( 'systems/daggerheart/templates/ui/chat/downtime.hbs', { - title: `${this.actor.name} - ${game.i18n.localize(`DAGGERHEART.APPLICATIONS.Downtime.${this.shortRest ? 'shortRest' : 'longRest'}.title`)}`, + title: `${this.actor.name} - ${game.i18n.localize(`DAGGERHEART.APPLICATIONS.Downtime.${this.shortrest ? 'shortRest' : 'longRest'}.title`)}`, moves: moves } ) @@ -96,11 +150,33 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV cls.create(msg.toObject()); - this.close(); + // Reset selection and update number of taken moves + for (const [catName, category] of Object.entries(this.moveData)) { + for (const move of Object.values(category.moves)) { + if (move.selected > 0) { + this.nrChoices[catName].taken += move.selected; + move.selected = 0; + } + } + } + + // We can close the window when all moves are taken + if ( + this.nrChoices.shortRest.taken >= this.nrChoices.shortRest.max && + this.nrChoices.longRest.taken >= this.nrChoices.longRest.max + ) { + this.close(); + } else { + this.render(); + } } static async updateData(event, element, formData) { this.customActivity = foundry.utils.mergeObject(this.customActivity, formData.object); this.render(); } + + #nrSelectedMoves(category) { + return Object.values(this.moveData[category].moves).reduce((acc, x) => acc + (x.selected ?? 0), 0); + } } diff --git a/module/applications/dialogs/resourceDiceDialog.mjs b/module/applications/dialogs/resourceDiceDialog.mjs new file mode 100644 index 00000000..8205dee5 --- /dev/null +++ b/module/applications/dialogs/resourceDiceDialog.mjs @@ -0,0 +1,99 @@ +import { itemAbleRollParse } from '../../helpers/utils.mjs'; + +const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; + +export default class ResourceDiceDialog extends HandlebarsApplicationMixin(ApplicationV2) { + constructor(item, actor, options = {}) { + super(options); + + this.item = item; + this.actor = actor; + this.diceStates = foundry.utils.deepClone(item.system.resource.diceStates); + } + + static DEFAULT_OPTIONS = { + tag: 'form', + classes: ['daggerheart', 'dialog', 'dh-style', 'views', 'resource-dice'], + window: { + icon: 'fa-solid fa-dice' + }, + actions: { + rerollDice: this.rerollDice, + save: this.save + }, + form: { + handler: this.updateResourceDice, + submitOnChange: true, + submitOnClose: false + } + }; + + /** @override */ + static PARTS = { + resourceDice: { + id: 'resourceDice', + template: 'systems/daggerheart/templates/dialogs/dice-roll/resourceDice.hbs' + } + }; + + get title() { + return game.i18n.format('DAGGERHEART.APPLICATIONS.ResourceDice.title', { name: this.item.name }); + } + + async _prepareContext(_options) { + const context = await super._prepareContext(_options); + context.item = this.item; + context.actor = this.actor; + context.diceStates = this.diceStates; + + return context; + } + + static async updateResourceDice(event, _, formData) { + const { diceStates } = foundry.utils.expandObject(formData.object); + this.diceStates = Object.keys(diceStates).reduce((acc, key) => { + const resourceState = this.item.system.resource.diceStates[key]; + acc[key] = { ...diceStates[key], used: Boolean(resourceState?.used) }; + return acc; + }, {}); + + this.render(); + } + + static async save() { + this.rollValues = Object.values(this.diceStates); + this.close(); + } + + static async rerollDice() { + const max = itemAbleRollParse(this.item.system.resource.max, this.actor, this.item); + const diceFormula = `${max}${this.item.system.resource.dieFaces}`; + const roll = await new Roll(diceFormula).evaluate(); + if (game.modules.get('dice-so-nice')?.active) await game.dice3d.showForRoll(roll, game.user, true); + this.rollValues = roll.terms[0].results.map(x => ({ value: x.result, used: false })); + this.resetUsed = true; + + const cls = getDocumentClass('ChatMessage'); + const msg = new cls({ + user: game.user.id, + content: await foundry.applications.handlebars.renderTemplate( + 'systems/daggerheart/templates/ui/chat/resource-roll.hbs', + { + user: this.actor.name, + name: this.item.name + } + ) + }); + + cls.create(msg.toObject()); + this.close(); + } + + static async create(item, actor, options = {}) { + return new Promise(resolve => { + const app = new this(item, actor, options); + app.addEventListener('close', () => resolve(app.rollValues), { once: true }); + app.render({ force: true }); + }); + } +} diff --git a/module/applications/hud/_module.mjs b/module/applications/hud/_module.mjs new file mode 100644 index 00000000..92abe4e8 --- /dev/null +++ b/module/applications/hud/_module.mjs @@ -0,0 +1 @@ +export { default as DHTokenHUD } from './tokenHUD.mjs'; diff --git a/module/applications/hud/tokenHUD.mjs b/module/applications/hud/tokenHUD.mjs new file mode 100644 index 00000000..572b03f9 --- /dev/null +++ b/module/applications/hud/tokenHUD.mjs @@ -0,0 +1,84 @@ +export default class DHTokenHUD extends foundry.applications.hud.TokenHUD { + static DEFAULT_OPTIONS = { + classes: ['daggerheart'] + }; + + /** @override */ + static PARTS = { + hud: { + root: true, + template: 'systems/daggerheart/templates/hud/tokenHUD.hbs' + } + }; + + async _prepareContext(options) { + const context = await super._prepareContext(options); + context.systemStatusEffects = Object.keys(context.statusEffects).reduce((acc, key) => { + const effect = context.statusEffects[key]; + if (effect.systemEffect) acc[key] = effect; + + return acc; + }, {}); + + const useGeneric = game.settings.get( + CONFIG.DH.id, + CONFIG.DH.SETTINGS.gameSettings.appearance + ).showGenericStatusEffects; + context.genericStatusEffects = useGeneric + ? Object.keys(context.statusEffects).reduce((acc, key) => { + const effect = context.statusEffects[key]; + if (!effect.systemEffect) acc[key] = effect; + + return acc; + }, {}) + : null; + + return context; + } + + _getStatusEffectChoices() { + // Include all HUD-enabled status effects + const choices = {}; + for (const status of CONFIG.statusEffects) { + if ( + status.hud === false || + (foundry.utils.getType(status.hud) === 'Object' && + status.hud.actorTypes?.includes(this.document.actor.type) === false) + ) { + continue; + } + choices[status.id] = { + _id: status._id, + id: status.id, + systemEffect: status.systemEffect, + title: game.i18n.localize(status.name ?? /** @deprecated since v12 */ status.label), + src: status.img ?? /** @deprecated since v12 */ status.icon, + isActive: false, + isOverlay: false + }; + } + + // Update the status of effects which are active for the token actor + const activeEffects = this.actor?.effects || []; + for (const effect of activeEffects) { + for (const statusId of effect.statuses) { + const status = choices[statusId]; + if (!status) continue; + if (status._id) { + if (status._id !== effect.id) continue; + } else { + if (effect.statuses.size !== 1) continue; + } + status.isActive = true; + if (effect.getFlag('core', 'overlay')) status.isOverlay = true; + break; + } + } + + // Flag status CSS class + for (const status of Object.values(choices)) { + status.cssClass = [status.isActive ? 'active' : null, status.isOverlay ? 'overlay' : null].filterJoin(' '); + } + return choices; + } +} diff --git a/module/applications/levelup/characterLevelup.mjs b/module/applications/levelup/characterLevelup.mjs index 6dc6f4c3..d6bbe2db 100644 --- a/module/applications/levelup/characterLevelup.mjs +++ b/module/applications/levelup/characterLevelup.mjs @@ -223,8 +223,8 @@ export default class DhCharacterLevelUp extends LevelUpBase { context.achievements = { proficiency: { - old: this.actor.system.proficiency.total, - new: this.actor.system.proficiency.total + achivementProficiency, + old: this.actor.system.proficiency, + new: this.actor.system.proficiency + achivementProficiency, shown: achivementProficiency > 0 }, damageThresholds: { @@ -332,16 +332,16 @@ export default class DhCharacterLevelUp extends LevelUpBase { new: context.achievements.proficiency.new + (advancement.proficiency ?? 0) }, hitPoints: { - old: this.actor.system.resources.hitPoints.maxTotal, - new: this.actor.system.resources.hitPoints.maxTotal + (advancement.hitPoint ?? 0) + old: this.actor.system.resources.hitPoints.max, + new: this.actor.system.resources.hitPoints.max + (advancement.hitPoint ?? 0) }, stress: { - old: this.actor.system.resources.stress.maxTotal, - new: this.actor.system.resources.stress.maxTotal + (advancement.stress ?? 0) + old: this.actor.system.resources.stress.max, + new: this.actor.system.resources.stress.max + (advancement.stress ?? 0) }, evasion: { - old: this.actor.system.evasion.total, - new: this.actor.system.evasion.total + (advancement.evasion ?? 0) + old: this.actor.system.evasion, + new: this.actor.system.evasion + (advancement.evasion ?? 0) } }, traits: Object.keys(this.actor.system.traits).reduce((acc, traitKey) => { @@ -349,8 +349,8 @@ export default class DhCharacterLevelUp extends LevelUpBase { if (!acc) acc = {}; acc[traitKey] = { label: game.i18n.localize(abilities[traitKey].label), - old: this.actor.system.traits[traitKey].total, - new: this.actor.system.traits[traitKey].total + advancement.trait[traitKey] + old: this.actor.system.traits[traitKey].max, + new: this.actor.system.traits[traitKey].max + advancement.trait[traitKey] }; } return acc; diff --git a/module/applications/levelup/companionLevelup.mjs b/module/applications/levelup/companionLevelup.mjs index de411572..2fcc42a0 100644 --- a/module/applications/levelup/companionLevelup.mjs +++ b/module/applications/levelup/companionLevelup.mjs @@ -122,12 +122,12 @@ export default class DhCompanionLevelUp extends BaseLevelUp { context.advancements = { statistics: { stress: { - old: this.actor.system.resources.stress.maxTotal, - new: this.actor.system.resources.stress.maxTotal + (advancement.stress ?? 0) + old: this.actor.system.resources.stress.max, + new: this.actor.system.resources.stress.max + (advancement.stress ?? 0) }, evasion: { - old: this.actor.system.evasion.total, - new: this.actor.system.evasion.total + (advancement.evasion ?? 0) + old: this.actor.system.evasion, + new: this.actor.system.evasion + (advancement.evasion ?? 0) } }, experiences: diff --git a/module/applications/levelup/levelup.mjs b/module/applications/levelup/levelup.mjs index eb120ac5..141a0a06 100644 --- a/module/applications/levelup/levelup.mjs +++ b/module/applications/levelup/levelup.mjs @@ -128,7 +128,7 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) context.tabs.advancements.progress = { selected: selections, max: currentLevel.maxSelections }; context.showTabs = this.tabGroups.primary !== 'summary'; break; - const { current: currentActorLevel, changed: changedActorLevel } = this.actor.system.levelData.level; + const actorArmor = this.actor.system.armor; const levelKeys = Object.keys(this.levelup.levels); let achivementProficiency = 0; @@ -157,8 +157,8 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) context.achievements = { proficiency: { - old: this.actor.system.proficiency.total, - new: this.actor.system.proficiency.total + achivementProficiency, + old: this.actor.system.proficiency, + new: this.actor.system.proficiency + achivementProficiency, shown: achivementProficiency > 0 }, damageThresholds: { @@ -265,16 +265,16 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) new: context.achievements.proficiency.new + (advancement.proficiency ?? 0) }, hitPoints: { - old: this.actor.system.resources.hitPoints.maxTotal, - new: this.actor.system.resources.hitPoints.maxTotal + (advancement.hitPoint ?? 0) + old: this.actor.system.resources.hitPoints.max, + new: this.actor.system.resources.hitPoints.max + (advancement.hitPoint ?? 0) }, stress: { - old: this.actor.system.resources.stress.maxTotal, - new: this.actor.system.resources.stress.maxTotal + (advancement.stress ?? 0) + old: this.actor.system.resources.stress.max, + new: this.actor.system.resources.stress.max + (advancement.stress ?? 0) }, evasion: { - old: this.actor.system.evasion.total, - new: this.actor.system.evasion.total + (advancement.evasion ?? 0) + old: this.actor.system.evasion, + new: this.actor.system.evasion + (advancement.evasion ?? 0) } }, traits: Object.keys(this.actor.system.traits).reduce((acc, traitKey) => { @@ -282,8 +282,8 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) if (!acc) acc = {}; acc[traitKey] = { label: game.i18n.localize(abilities[traitKey].label), - old: this.actor.system.traits[traitKey].total, - new: this.actor.system.traits[traitKey].total + advancement.trait[traitKey] + old: this.actor.system.traits[traitKey].value, + new: this.actor.system.traits[traitKey].value + advancement.trait[traitKey] }; } return acc; diff --git a/module/applications/settings/appearanceSettings.mjs b/module/applications/settings/appearanceSettings.mjs index 006bab78..78f067c7 100644 --- a/module/applications/settings/appearanceSettings.mjs +++ b/module/applications/settings/appearanceSettings.mjs @@ -12,14 +12,17 @@ export default class DHAppearanceSettings extends HandlebarsApplicationMixin(App } get title() { - return game.i18n.localize('DAGGERHEART.SETTINGS.Menu.appearance.name'); + return game.i18n.localize('DAGGERHEART.SETTINGS.Menu.title'); } static DEFAULT_OPTIONS = { tag: 'form', id: 'daggerheart-appearance-settings', - classes: ['daggerheart', 'setting', 'dh-style'], + classes: ['daggerheart', 'dialog', 'dh-style', 'setting'], position: { width: '600', height: 'auto' }, + window: { + icon: 'fa-solid fa-gears' + }, actions: { reset: this.reset, save: this.save diff --git a/module/applications/settings/automationSettings.mjs b/module/applications/settings/automationSettings.mjs index 75105b16..489bae02 100644 --- a/module/applications/settings/automationSettings.mjs +++ b/module/applications/settings/automationSettings.mjs @@ -12,14 +12,17 @@ export default class DhAutomationSettings extends HandlebarsApplicationMixin(App } get title() { - return game.i18n.localize('DAGGERHEART.SETTINGS.Menu.automation.name'); + return game.i18n.localize('DAGGERHEART.SETTINGS.Menu.title'); } static DEFAULT_OPTIONS = { tag: 'form', id: 'daggerheart-automation-settings', - classes: ['daggerheart', 'setting', 'dh-style'], + classes: ['daggerheart', 'dh-style', 'dialog', 'setting'], position: { width: '600', height: 'auto' }, + window: { + icon: 'fa-solid fa-gears' + }, actions: { reset: this.reset, save: this.save diff --git a/module/applications/settings/components/settingsActionsView.mjs b/module/applications/settings/components/settingsActionsView.mjs index a905e824..f77c5fce 100644 --- a/module/applications/settings/components/settingsActionsView.mjs +++ b/module/applications/settings/components/settingsActionsView.mjs @@ -4,13 +4,14 @@ import DHActionConfig from '../../sheets-configs/action-config.mjs'; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; export default class DhSettingsActionView extends HandlebarsApplicationMixin(ApplicationV2) { - constructor(resolve, reject, title, name, img, description, actions) { + constructor(resolve, reject, title, name, icon, img, description, actions) { super({}); this.resolve = resolve; this.reject = reject; this.viewTitle = title; this.name = name; + this.icon = icon; this.img = img; this.description = description; this.actions = actions; @@ -23,7 +24,7 @@ export default class DhSettingsActionView extends HandlebarsApplicationMixin(App static DEFAULT_OPTIONS = { tag: 'form', classes: ['daggerheart', 'setting', 'dh-style'], - position: { width: '400', height: 'auto' }, + position: { width: 440, height: 'auto' }, actions: { editImage: this.onEditImage, addItem: this.addItem, @@ -46,6 +47,7 @@ export default class DhSettingsActionView extends HandlebarsApplicationMixin(App async _prepareContext(_options) { const context = await super._prepareContext(_options); context.name = this.name; + context.icon = this.icon; context.img = this.img; context.description = this.description; context.enrichedDescription = await foundry.applications.ux.TextEditor.enrichHTML(context.description); @@ -55,8 +57,9 @@ export default class DhSettingsActionView extends HandlebarsApplicationMixin(App } static async updateData(event, element, formData) { - const { name, img, description } = foundry.utils.expandObject(formData.object); + const { name, icon, description } = foundry.utils.expandObject(formData.object); this.name = name; + this.icon = icon; this.description = description; this.render(); @@ -65,6 +68,7 @@ export default class DhSettingsActionView extends HandlebarsApplicationMixin(App static async saveForm(event) { this.resolve({ name: this.name, + icon: this.icon, img: this.img, description: this.description, actions: this.actions diff --git a/module/applications/settings/homebrewSettings.mjs b/module/applications/settings/homebrewSettings.mjs index 08b4cf4e..d2861595 100644 --- a/module/applications/settings/homebrewSettings.mjs +++ b/module/applications/settings/homebrewSettings.mjs @@ -13,14 +13,17 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli } get title() { - return game.i18n.localize('DAGGERHEART.SETTINGS.Menu.homebrew.name'); + return game.i18n.localize('DAGGERHEART.SETTINGS.Menu.title'); } static DEFAULT_OPTIONS = { tag: 'form', id: 'daggerheart-homebrew-settings', - classes: ['daggerheart', 'setting', 'dh-style'], + classes: ['daggerheart', 'dh-style', 'dialog', 'setting'], position: { width: '600', height: 'auto' }, + window: { + icon: 'fa-solid fa-gears' + }, actions: { addItem: this.addItem, editItem: this.editItem, @@ -76,6 +79,7 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli reject, game.i18n.localize('DAGGERHEART.SETTINGS.Homebrew.downtimeMoves'), move.name, + move.icon, move.img, move.description, move.actions @@ -87,6 +91,7 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli await this.settings.updateSource({ [`restMoves.${type}.moves.${id}`]: { name: data.name, + icon: data.icon, img: data.img, description: data.description } diff --git a/module/applications/settings/rangeMeasurementSettings.mjs b/module/applications/settings/rangeMeasurementSettings.mjs index e9fd332e..410b2cbe 100644 --- a/module/applications/settings/rangeMeasurementSettings.mjs +++ b/module/applications/settings/rangeMeasurementSettings.mjs @@ -12,14 +12,17 @@ export default class DhRangeMeasurementSettings extends HandlebarsApplicationMix } get title() { - return game.i18n.localize('DAGGERHEART.SETTINGS.Menu.automation.name'); + return game.i18n.localize('DAGGERHEART.SETTINGS.Menu.title'); } static DEFAULT_OPTIONS = { tag: 'form', id: 'daggerheart-automation-settings', - classes: ['daggerheart', 'setting', 'dh-style'], + classes: ['daggerheart', 'dialog', 'dh-style', 'setting'], position: { width: '600', height: 'auto' }, + window: { + icon: 'fa-solid fa-gears' + }, actions: { reset: this.reset, save: this.save diff --git a/module/applications/settings/variantRuleSettings.mjs b/module/applications/settings/variantRuleSettings.mjs index 059e1726..3bc11a68 100644 --- a/module/applications/settings/variantRuleSettings.mjs +++ b/module/applications/settings/variantRuleSettings.mjs @@ -12,14 +12,17 @@ export default class DHVariantRuleSettings extends HandlebarsApplicationMixin(Ap } get title() { - return game.i18n.localize('DAGGERHEART.SETTINGS.Menu.variantRules.name'); + return game.i18n.localize('DAGGERHEART.SETTINGS.Menu.title'); } static DEFAULT_OPTIONS = { tag: 'form', id: 'daggerheart-appearance-settings', - classes: ['daggerheart', 'setting', 'dh-style'], + classes: ['daggerheart', 'dialog', 'dh-style', 'setting'], position: { width: '600', height: 'auto' }, + window: { + icon: 'fa-solid fa-gears' + }, actions: { reset: this.reset, save: this.save diff --git a/module/applications/sheets-configs/_module.mjs b/module/applications/sheets-configs/_module.mjs index e1ae8fe2..fafb1fcf 100644 --- a/module/applications/sheets-configs/_module.mjs +++ b/module/applications/sheets-configs/_module.mjs @@ -3,3 +3,5 @@ export { default as AdversarySettings } from './adversary-settings.mjs'; export { default as CompanionSettings } from './companion-settings.mjs'; export { default as EnvironmentSettings } from './environment-settings.mjs'; export { default as ActiveEffectConfig } from './activeEffectConfig.mjs'; +export { default as DhTokenConfig } from './token-config.mjs'; +export { default as DhPrototypeTokenConfig } from './prototype-token-config.mjs'; diff --git a/module/applications/sheets-configs/action-config.mjs b/module/applications/sheets-configs/action-config.mjs index 0beb8d79..3f915e41 100644 --- a/module/applications/sheets-configs/action-config.mjs +++ b/module/applications/sheets-configs/action-config.mjs @@ -56,10 +56,6 @@ export default class DHActionConfig extends DaggerheartSheet(ApplicationV2) { id: 'effect', template: 'systems/daggerheart/templates/sheets-settings/action-settings/effect.hbs' } - /* form: { - id: 'action', - template: 'systems/daggerheart/templates/config/action.hbs' - } */ }; static TABS = { @@ -111,13 +107,14 @@ export default class DHActionConfig extends DaggerheartSheet(ApplicationV2) { context.hasBaseDamage = !!this.action.parent.attack; context.getRealIndex = this.getRealIndex.bind(this); context.getEffectDetails = this.getEffectDetails.bind(this); + context.costOptions = this.getCostOptions(); context.disableOption = this.disableOption.bind(this); - context.isNPC = this.action.actor && this.action.actor.type !== 'character'; + context.isNPC = this.action.actor?.isNPC; context.hasRoll = this.action.hasRoll; const settingsTiers = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LevelTiers).tiers; context.tierOptions = [ - { key: 1, label: game.i18n.localize('DAGGERHEART.GENERAL.Tiers.tier1') }, + { key: 1, label: game.i18n.localize('DAGGERHEART.GENERAL.Tiers.1') }, ...Object.values(settingsTiers).map(x => ({ key: x.tier, label: x.name })) ]; @@ -129,8 +126,21 @@ export default class DHActionConfig extends DaggerheartSheet(ApplicationV2) { this.render(true); } - disableOption(index, options, choices) { - const filtered = foundry.utils.deepClone(options); + getCostOptions() { + const options = foundry.utils.deepClone(CONFIG.DH.GENERAL.abilityCosts); + const resource = this.action.parent.resource; + if (resource) { + options[this.action.parent.parent.id] = { + label: this.action.parent.parent.name, + group: 'TYPES.Actor.character' + }; + } + + return options; + } + + disableOption(index, costOptions, choices) { + const filtered = foundry.utils.deepClone(costOptions); Object.keys(filtered).forEach(o => { if (choices.find((c, idx) => c.type === o && index !== idx)) filtered[o].disabled = true; }); @@ -146,11 +156,19 @@ export default class DHActionConfig extends DaggerheartSheet(ApplicationV2) { return this.action.item.effects.get(id); } - _prepareSubmitData(event, formData) { + _prepareSubmitData(_event, formData) { const submitData = foundry.utils.expandObject(formData.object); for (const keyPath of this.constructor.CLEAN_ARRAYS) { const data = foundry.utils.getProperty(submitData, keyPath); - if (data) foundry.utils.setProperty(submitData, keyPath, Object.values(data)); + const dataValues = data ? Object.values(data) : []; + if (keyPath === 'cost') { + for (var value of dataValues) { + const item = this.action.parent.parent.id === value.key; + value.keyIsID = Boolean(item); + } + } + + if (data) foundry.utils.setProperty(submitData, keyPath, dataValues); } return submitData; } @@ -161,7 +179,7 @@ export default class DHActionConfig extends DaggerheartSheet(ApplicationV2) { container = foundry.utils.getProperty(this.action.parent, this.action.systemPath); let newActions; if (Array.isArray(container)) { - newActions = foundry.utils.getProperty(this.action.parent, this.action.systemPath).map(x => x.toObject()); // Find better way + newActions = foundry.utils.getProperty(this.action.parent, this.action.systemPath).map(x => x.toObject()); if (!newActions.findSplice(x => x._id === data._id, data)) newActions.push(data); } else newActions = data; diff --git a/module/applications/sheets-configs/activeEffectConfig.mjs b/module/applications/sheets-configs/activeEffectConfig.mjs index 6a629583..087b5b08 100644 --- a/module/applications/sheets-configs/activeEffectConfig.mjs +++ b/module/applications/sheets-configs/activeEffectConfig.mjs @@ -1,4 +1,24 @@ +import autocomplete from 'autocompleter'; + export default class DhActiveEffectConfig extends foundry.applications.sheets.ActiveEffectConfig { + constructor(options) { + super(options); + + const ignoredActorKeys = ['config', 'DhEnvironment']; + this.changeChoices = Object.keys(game.system.api.models.actors).reduce((acc, key) => { + if (!ignoredActorKeys.includes(key)) { + const model = game.system.api.models.actors[key]; + const attributes = CONFIG.Token.documentClass.getTrackedAttributes(model); + const group = game.i18n.localize(model.metadata.label); + const choices = CONFIG.Token.documentClass + .getTrackedAttributeChoices(attributes, model) + .map(x => ({ ...x, group: group })); + acc.push(...choices); + } + return acc; + }, []); + } + static DEFAULT_OPTIONS = { classes: ['daggerheart', 'sheet', 'dh-style'] }; @@ -27,36 +47,62 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac } }; + _attachPartListeners(partId, htmlElement, options) { + super._attachPartListeners(partId, htmlElement, options); + const changeChoices = this.changeChoices; + + htmlElement.querySelectorAll('.effect-change-input').forEach(element => { + autocomplete({ + input: element, + fetch: function (text, update) { + if (!text) { + update(changeChoices); + } else { + text = text.toLowerCase(); + var suggestions = changeChoices.filter(n => n.label.toLowerCase().includes(text)); + update(suggestions); + } + }, + render: function (item, search) { + const label = game.i18n.localize(item.label); + const matchIndex = label.toLowerCase().indexOf(search); + + const beforeText = label.slice(0, matchIndex); + const matchText = label.slice(matchIndex, matchIndex + search.length); + const after = label.slice(matchIndex + search.length, label.length); + + const element = document.createElement('li'); + element.innerHTML = `${beforeText}${matchText ? `${matchText}` : ''}${after}`; + if (item.hint) { + element.dataset.tooltip = game.i18n.localize(item.hint); + } + + return element; + }, + renderGroup: function (label) { + const itemElement = document.createElement('div'); + itemElement.textContent = game.i18n.localize(label); + return itemElement; + }, + onSelect: function (item) { + element.value = `system.${item.value}`; + }, + click: e => e.fetch(), + customize: function (_input, _inputRect, container) { + container.style.zIndex = foundry.applications.api.ApplicationV2._maxZ; + }, + minLength: 0 + }); + }); + } + async _preparePartContext(partId, context) { const partContext = await super._preparePartContext(partId, context); switch (partId) { case 'changes': - const fieldPaths = []; - const validFieldPath = fieldPath => this.validFieldPath(fieldPath, this.#unapplicablePaths); - context.document.parent.system.schema.apply(function () { - if (!(this instanceof foundry.data.fields.SchemaField)) { - if (validFieldPath(this.fieldPath)) { - fieldPaths.push(this.fieldPath); - } - } - }); - - context.fieldPaths = fieldPaths; - break; } return partContext; } - - #unapplicablePaths = ['story', 'pronouns', 'description']; - validFieldPath(fieldPath, unapplicablePaths) { - const splitPath = fieldPath.split('.'); - if (splitPath.length > 1 && unapplicablePaths.includes(splitPath[1])) return false; - - /* The current value of a resource should not be modified */ - if (new RegExp(/resources.*\.value/).exec(fieldPath)) return false; - - return true; - } } diff --git a/module/applications/sheets-configs/adversary-settings.mjs b/module/applications/sheets-configs/adversary-settings.mjs index d95e6129..57deea25 100644 --- a/module/applications/sheets-configs/adversary-settings.mjs +++ b/module/applications/sheets-configs/adversary-settings.mjs @@ -70,6 +70,18 @@ export default class DHAdversarySettings extends DHBaseActorSettings { * @type {ApplicationClickAction} */ static async #removeExperience(_, target) { + const experience = this.actor.system.experiences[target.dataset.experience]; + const confirmed = await foundry.applications.api.DialogV2.confirm({ + window: { + title: game.i18n.format('DAGGERHEART.APPLICATIONS.DeleteConfirmation.title', { + type: game.i18n.localize(`DAGGERHEART.GENERAL.Experience.single`), + name: experience.name + }) + }, + content: game.i18n.format('DAGGERHEART.APPLICATIONS.DeleteConfirmation.text', { name: experience.name }) + }); + if (!confirmed) return; + await this.actor.update({ [`system.experiences.-=${target.dataset.experience}`]: null }); } diff --git a/module/applications/sheets-configs/environment-settings.mjs b/module/applications/sheets-configs/environment-settings.mjs index d0ca897a..7a91b272 100644 --- a/module/applications/sheets-configs/environment-settings.mjs +++ b/module/applications/sheets-configs/environment-settings.mjs @@ -1,3 +1,4 @@ +import { getDocFromElement } from '../../helpers/utils.mjs'; import DHBaseActorSettings from '../sheets/api/actor-setting.mjs'; /**@typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction */ @@ -9,8 +10,7 @@ export default class DHEnvironmentSettings extends DHBaseActorSettings { actions: { addCategory: DHEnvironmentSettings.#addCategory, removeCategory: DHEnvironmentSettings.#removeCategory, - viewAdversary: this.#viewAdversary, - deleteAdversary: this.#deleteAdversary + deleteAdversary: DHEnvironmentSettings.#deleteAdversary }, dragDrop: [ { dragSelector: null, dropSelector: '.category-container' }, @@ -69,23 +69,30 @@ export default class DHEnvironmentSettings extends DHBaseActorSettings { await this.actor.update({ [`system.potentialAdversaries.-=${target.dataset.categoryId}`]: null }); } - static async #viewAdversary(_, button) { - const adversary = await foundry.utils.fromUuid(button.dataset.adversary); - if (!adversary) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.adversaryMissing')); - return; - } + /** + * + * @type {ApplicationClickAction} + * @returns + */ + static async #deleteAdversary(_event, target) { + const doc = getDocFromElement(target); + const { category } = target.dataset; + const path = `system.potentialAdversaries.${category}.adversaries`; - adversary.sheet.render({ force: true }); - } + const confirmed = await foundry.applications.api.DialogV2.confirm({ + window: { + title: game.i18n.format('DAGGERHEART.APPLICATIONS.DeleteConfirmation.title', { + type: game.i18n.localize('TYPES.Actor.adversary'), + name: doc.name + }) + }, + content: game.i18n.format('DAGGERHEART.APPLICATIONS.DeleteConfirmation.text', { name: doc.name }) + }); - static async #deleteAdversary(event, target) { - const adversaryKey = target.dataset.adversary; - const path = `system.potentialAdversaries.${target.dataset.potentialAdversary}.adversaries`; - console.log(target.dataset.potentialAdversar); - const newAdversaries = foundry.utils - .getProperty(this.actor, path) - .filter(x => x && (x?.uuid ?? x) !== adversaryKey); + if (!confirmed) return; + + const adversaries = foundry.utils.getProperty(this.actor, path); + const newAdversaries = adversaries.filter(a => a.uuid !== doc.uuid); await this.actor.update({ [path]: newAdversaries }); } diff --git a/module/applications/sheets-configs/prototype-token-config.mjs b/module/applications/sheets-configs/prototype-token-config.mjs new file mode 100644 index 00000000..24c9dabb --- /dev/null +++ b/module/applications/sheets-configs/prototype-token-config.mjs @@ -0,0 +1,20 @@ +export default class DhPrototypeTokenConfig extends foundry.applications.sheets.PrototypeTokenConfig { + /** @inheritDoc */ + async _prepareResourcesTab() { + const token = this.token; + const usesTrackableAttributes = !foundry.utils.isEmpty(CONFIG.Actor.trackableAttributes); + const attributeSource = + this.actor?.system instanceof foundry.abstract.DataModel && usesTrackableAttributes + ? this.actor?.type + : this.actor?.system; + const TokenDocument = foundry.utils.getDocumentClass('Token'); + const attributes = TokenDocument.getTrackedAttributes(attributeSource); + return { + barAttributes: TokenDocument.getTrackedAttributeChoices(attributes, attributeSource), + bar1: token.getBarAttribute?.('bar1'), + bar2: token.getBarAttribute?.('bar2'), + turnMarkerModes: DhPrototypeTokenConfig.TURN_MARKER_MODES, + turnMarkerAnimations: CONFIG.Combat.settings.turnMarkerAnimations + }; + } +} diff --git a/module/applications/sheets-configs/token-config.mjs b/module/applications/sheets-configs/token-config.mjs new file mode 100644 index 00000000..ee573e5d --- /dev/null +++ b/module/applications/sheets-configs/token-config.mjs @@ -0,0 +1,20 @@ +export default class DhTokenConfig extends foundry.applications.sheets.TokenConfig { + /** @inheritDoc */ + async _prepareResourcesTab() { + const token = this.token; + const usesTrackableAttributes = !foundry.utils.isEmpty(CONFIG.Actor.trackableAttributes); + const attributeSource = + this.actor?.system instanceof foundry.abstract.DataModel && usesTrackableAttributes + ? this.actor?.type + : this.actor?.system; + const TokenDocument = foundry.utils.getDocumentClass('Token'); + const attributes = TokenDocument.getTrackedAttributes(attributeSource); + return { + barAttributes: TokenDocument.getTrackedAttributeChoices(attributes, attributeSource), + bar1: token.getBarAttribute?.('bar1'), + bar2: token.getBarAttribute?.('bar2'), + turnMarkerModes: DhTokenConfig.TURN_MARKER_MODES, + turnMarkerAnimations: CONFIG.Combat.settings.turnMarkerAnimations + }; + } +} diff --git a/module/applications/sheets/actors/adversary.mjs b/module/applications/sheets/actors/adversary.mjs index 67f57781..f6324881 100644 --- a/module/applications/sheets/actors/adversary.mjs +++ b/module/applications/sheets/actors/adversary.mjs @@ -8,9 +8,7 @@ export default class AdversarySheet extends DHBaseActorSheet { position: { width: 660, height: 766 }, window: { resizable: true }, actions: { - reactionRoll: AdversarySheet.#reactionRoll, - useItem: this.useItem, - toChat: this.toChat + reactionRoll: AdversarySheet.#reactionRoll }, window: { resizable: true @@ -28,7 +26,7 @@ export default class AdversarySheet extends DHBaseActorSheet { /** @inheritdoc */ static TABS = { primary: { - tabs: [{ id: 'features' }, { id: 'notes' }, { id: 'effects' }], + tabs: [{ id: 'features' }, { id: 'effects' }, { id: 'notes' }], initial: 'features', labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } @@ -41,10 +39,63 @@ export default class AdversarySheet extends DHBaseActorSheet { return context; } - getItem(element) { - const itemId = (element.target ?? element).closest('[data-item-id]').dataset.itemId, - item = this.document.items.get(itemId); - return item; + /**@inheritdoc */ + async _preparePartContext(partId, context, options) { + context = await super._preparePartContext(partId, context, options); + switch (partId) { + case 'header': + await this._prepareHeaderContext(context, options); + break; + case 'notes': + await this._prepareNotesContext(context, options); + break; + } + return context; + } + + /** + * Prepare render context for the Biography part. + * @param {ApplicationRenderContext} context + * @param {ApplicationRenderOptions} options + * @returns {Promise} + * @protected + */ + async _prepareNotesContext(context, _options) { + const { system } = this.document; + const { TextEditor } = foundry.applications.ux; + + const paths = { + notes: 'notes' + }; + + for (const [key, path] of Object.entries(paths)) { + const value = foundry.utils.getProperty(system, path); + context[key] = { + field: system.schema.getField(path), + value, + enriched: await TextEditor.implementation.enrichHTML(value, { + secrets: this.document.isOwner, + relativeTo: this.document + }) + }; + } + } + + /** + * Prepare render context for the Header part. + * @param {ApplicationRenderContext} context + * @param {ApplicationRenderOptions} options + * @returns {Promise} + * @protected + */ + async _prepareHeaderContext(context, _options) { + const { system } = this.document; + const { TextEditor } = foundry.applications.ux; + + context.description = await TextEditor.implementation.enrichHTML(system.description, { + secrets: this.document.isOwner, + relativeTo: this.document + }); } /* -------------------------------------------- */ @@ -72,42 +123,4 @@ export default class AdversarySheet extends DHBaseActorSheet { this.actor.diceRoll(config); } - - /** - * - * @type {ApplicationClickAction} - */ - static async useItem(event) { - const action = this.getItem(event) ?? this.actor.system.attack; - action.use(event); - } - - /** - * - * @type {ApplicationClickAction} - */ - static async toChat(event, button) { - if (button?.dataset?.type === 'experience') { - const experience = this.document.system.experiences[button.dataset.uuid]; - const cls = getDocumentClass('ChatMessage'); - const systemData = { - name: game.i18n.localize('DAGGERHEART.GENERAL.Experience.single'), - description: `${experience.name} ${experience.total.signedString()}` - }; - const msg = new cls({ - type: 'abilityUse', - user: game.user.id, - system: systemData, - content: await foundry.applications.handlebars.renderTemplate( - 'systems/daggerheart/templates/ui/chat/ability-use.hbs', - systemData - ) - }); - - cls.create(msg.toObject()); - } else { - const item = this.getItem(event) ?? this.document.system.attack; - item.toChat(this.document.id); - } - } } diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index 02e693d7..4fe4b5e3 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -4,6 +4,7 @@ import { abilities } from '../../../config/actorConfig.mjs'; import DhCharacterlevelUp from '../../levelup/characterLevelup.mjs'; import DhCharacterCreation from '../../characterCreation/characterCreation.mjs'; import FilterMenu from '../../ux/filter-menu.mjs'; +import { getDocFromElement, itemAbleRollParse } from '../../../helpers/utils.mjs'; /**@typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction */ @@ -14,7 +15,6 @@ export default class CharacterSheet extends DHBaseActorSheet { classes: ['character'], position: { width: 850, height: 800 }, actions: { - triggerContextMenu: CharacterSheet.#triggerContextMenu, toggleVault: CharacterSheet.#toggleVault, rollAttribute: CharacterSheet.#rollAttribute, toggleHope: CharacterSheet.#toggleHope, @@ -23,17 +23,39 @@ export default class CharacterSheet extends DHBaseActorSheet { makeDeathMove: CharacterSheet.#makeDeathMove, levelManagement: CharacterSheet.#levelManagement, toggleEquipItem: CharacterSheet.#toggleEquipItem, - useItem: this.useItem, //TODO Fix this - toChat: this.toChat + toggleResourceDice: CharacterSheet.#toggleResourceDice, + handleResourceDice: CharacterSheet.#handleResourceDice, + useDowntime: this.useDowntime }, window: { resizable: true }, - dragDrop: [], + dragDrop: [ + { + dragSelector: '[data-item-id][draggable="true"]', + dropSelector: null + } + ], contextMenus: [ { - handler: CharacterSheet._getContextMenuOptions, - selector: '[data-item-id]', + handler: CharacterSheet.#getDomainCardContextOptions, + selector: '[data-item-uuid][data-type="domainCard"]', + options: { + parentClassHooks: false, + fixed: true + } + }, + { + handler: CharacterSheet.#getEquipamentContextOptions, + selector: '[data-item-uuid][data-type="armor"], [data-item-uuid][data-type="weapon"]', + options: { + parentClassHooks: false, + fixed: true + } + }, + { + handler: CharacterSheet.#getItemContextOptions, + selector: '[data-item-uuid][data-type="consumable"], [data-item-uuid][data-type="miscellaneous"]', options: { parentClassHooks: false, fixed: true @@ -85,6 +107,22 @@ export default class CharacterSheet extends DHBaseActorSheet { } }; + _attachPartListeners(partId, htmlElement, options) { + super._attachPartListeners(partId, htmlElement, options); + + htmlElement.querySelectorAll('.inventory-item-resource').forEach(element => { + element.addEventListener('change', this.updateItemResource.bind(this)); + }); + htmlElement.querySelectorAll('.inventory-item-quantity').forEach(element => { + element.addEventListener('change', this.updateItemQuantity.bind(this)); + }); + + // Add listener for armor marks input + htmlElement.querySelectorAll('.armor-marks-input').forEach(element => { + element.addEventListener('change', this.updateArmorMarks.bind(this)); + }); + } + /** @inheritDoc */ async _onRender(context, options) { await super._onRender(context, options); @@ -97,20 +135,6 @@ export default class CharacterSheet extends DHBaseActorSheet { this._createSearchFilter(); } - /* -------------------------------------------- */ - - getItem(element) { - const listElement = (element.target ?? element).closest('[data-item-id]'); - const itemId = listElement.dataset.itemId; - - switch (listElement.dataset.type) { - case 'effect': - return this.document.effects.get(itemId); - default: - return this.document.items.get(itemId); - } - } - /* -------------------------------------------- */ /* Prepare Context */ /* -------------------------------------------- */ @@ -160,98 +184,135 @@ export default class CharacterSheet extends DHBaseActorSheet { case 'sidebar': await this._prepareSidebarContext(context, options); break; + case 'biography': + await this._prepareBiographyContext(context, options); + break; } return context; } + /** + * Prepare render context for the Loadout part. + * @param {ApplicationRenderContext} context + * @param {ApplicationRenderOptions} options + * @returns {Promise} + * @protected + */ async _prepareLoadoutContext(context, _options) { - context.listView = game.user.getFlag(CONFIG.DH.id, CONFIG.DH.FLAGS.displayDomainCardsAsList); + context.cardView = !game.user.getFlag(CONFIG.DH.id, CONFIG.DH.FLAGS.displayDomainCardsAsList); } + /** + * Prepare render context for the Sidebar part. + * @param {ApplicationRenderContext} context + * @param {ApplicationRenderOptions} options + * @returns {Promise} + * @protected + */ async _prepareSidebarContext(context, _options) { context.isDeath = this.document.system.deathMoveViable; } + /** + * Prepare render context for the Biography part. + * @param {ApplicationRenderContext} context + * @param {ApplicationRenderOptions} options + * @returns {Promise} + * @protected + */ + async _prepareBiographyContext(context, _options) { + const { system } = this.document; + const { TextEditor } = foundry.applications.ux; + + const paths = { + background: 'biography.background', + connections: 'biography.connections' + }; + + for (const [key, path] of Object.entries(paths)) { + const value = foundry.utils.getProperty(system, path); + context[key] = { + field: system.schema.getField(path), + value, + enriched: await TextEditor.implementation.enrichHTML(value, { + secrets: this.document.isOwner, + relativeTo: this.document + }) + }; + } + } + /* -------------------------------------------- */ /* Context Menu */ /* -------------------------------------------- */ /** - * Get the set of ContextMenu options. + * Get the set of ContextMenu options for DomainCards. * @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance * @this {CharacterSheet} * @protected */ - static _getContextMenuOptions() { - /** - * Get the item from the element. - * @param {HTMLElement} el - * @returns {foundry.documents.Item?} - */ - const getItem = el => this.actor.items.get(el.closest('[data-item-id]')?.dataset.itemId); - - return [ + static #getDomainCardContextOptions() { + /**@type {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} */ + const options = [ { - name: 'DAGGERHEART.Sheets.PC.ContextMenu.UseItem', - icon: '', - condition: el => { - const item = getItem(el); - return !['class', 'subclass'].includes(item.type); - }, - callback: (button, event) => CharacterSheet.useItem.call(this, event, button) + name: 'toLoadout', + icon: 'fa-solid fa-arrow-up', + condition: target => getDocFromElement(target).system.inVault, + callback: target => getDocFromElement(target).update({ 'system.inVault': false }) }, { - name: 'DAGGERHEART.Sheets.PC.ContextMenu.Equip', - icon: '', - condition: el => { - const item = getItem(el); - return ['weapon', 'armor'].includes(item.type) && !item.system.equipped; - }, - callback: CharacterSheet.#toggleEquipItem.bind(this) - }, - { - name: 'DAGGERHEART.Sheets.PC.ContextMenu.Unequip', - icon: '', - condition: el => { - const item = getItem(el); - return ['weapon', 'armor'].includes(item.type) && item.system.equipped; - }, - callback: CharacterSheet.#toggleEquipItem.bind(this) - }, - { - name: 'DAGGERHEART.Sheets.PC.ContextMenu.ToLoadout', - icon: '', - condition: el => { - const item = getItem(el); - return ['domainCard'].includes(item.type) && item.system.inVault; - }, - callback: target => getItem(target).update({ 'system.inVault': false }) - }, - { - name: 'DAGGERHEART.Sheets.PC.ContextMenu.ToVault', - icon: '', - condition: el => { - const item = getItem(el); - return ['domainCard'].includes(item.type) && !item.system.inVault; - }, - callback: target => getItem(target).update({ 'system.inVault': true }) - }, - { - name: 'DAGGERHEART.Sheets.PC.ContextMenu.SendToChat', - icon: '', - callback: CharacterSheet.toChat.bind(this) - }, - { - name: 'DAGGERHEART.Sheets.PC.ContextMenu.Edit', - icon: '', - callback: target => getItem(target).sheet.render({ force: true }) - }, - { - name: 'DAGGERHEART.Sheets.PC.ContextMenu.Delete', - icon: '', - callback: el => getItem(el).delete() + name: 'toVault', + icon: 'fa-solid fa-arrow-down', + condition: target => !getDocFromElement(target).system.inVault, + callback: target => getDocFromElement(target).update({ 'system.inVault': true }) } - ]; + ].map(option => ({ + ...option, + name: `DAGGERHEART.APPLICATIONS.ContextMenu.${option.name}`, + icon: `` + })); + + return [...options, ...this._getContextMenuCommonOptions.call(this, { usable: true, toChat: true })]; + } + + /** + * Get the set of ContextMenu options for Armors and Weapons. + * @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance + * @this {CharacterSheet} + * @protected + */ + static #getEquipamentContextOptions() { + const options = [ + { + name: 'equip', + icon: 'fa-solid fa-hands', + condition: target => !getDocFromElement(target).system.equipped, + callback: (target, event) => CharacterSheet.#toggleEquipItem.call(this, event, target) + }, + { + name: 'unequip', + icon: 'fa-solid fa-hands', + condition: target => getDocFromElement(target).system.equipped, + callback: (target, event) => CharacterSheet.#toggleEquipItem.call(this, event, target) + } + ].map(option => ({ + ...option, + name: `DAGGERHEART.APPLICATIONS.ContextMenu.${option.name}`, + icon: `` + })); + + return [...options, ...this._getContextMenuCommonOptions.call(this, { usable: true, toChat: true })]; + } + + /** + * Get the set of ContextMenu options for Consumable and Miscellaneous. + * @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance + * @this {CharacterSheet} + * @protected + */ + static #getItemContextOptions() { + return this._getContextMenuCommonOptions.call(this, { usable: true, toChat: true }); } /* -------------------------------------------- */ /* Filter Tracking */ @@ -345,7 +406,7 @@ export default class CharacterSheet extends DHBaseActorSheet { this.#filteredItems.inventory.search.clear(); for (const li of html.querySelectorAll('.inventory-item')) { - const item = this.document.items.get(li.dataset.itemId); + const item = getDocFromElement(li); const matchesSearch = !query || foundry.applications.ux.SearchFilter.testQuery(rgx, item.name); if (matchesSearch) this.#filteredItems.inventory.search.add(item.id); const { menu } = this.#filteredItems.inventory; @@ -365,14 +426,14 @@ export default class CharacterSheet extends DHBaseActorSheet { this.#filteredItems.loadout.search.clear(); for (const li of html.querySelectorAll('.items-list .inventory-item, .card-list .card-item')) { - const item = this.document.items.get(li.dataset.itemId); + const item = getDocFromElement(li); const matchesSearch = !query || foundry.applications.ux.SearchFilter.testQuery(rgx, item.name); if (matchesSearch) this.#filteredItems.loadout.search.add(item.id); const { menu } = this.#filteredItems.loadout; li.hidden = !(menu.has(item.id) && matchesSearch); } } - + /* -------------------------------------------- */ /* Filter Menus */ /* -------------------------------------------- */ @@ -416,7 +477,7 @@ export default class CharacterSheet extends DHBaseActorSheet { this.#filteredItems.inventory.menu.clear(); for (const li of html.querySelectorAll('.inventory-item')) { - const item = this.document.items.get(li.dataset.itemId); + const item = getDocFromElement(li); const matchesMenu = filters.length === 0 || filters.some(f => foundry.applications.ux.SearchFilter.evaluateFilter(item, f)); @@ -437,7 +498,7 @@ export default class CharacterSheet extends DHBaseActorSheet { this.#filteredItems.loadout.menu.clear(); for (const li of html.querySelectorAll('.items-list .inventory-item, .card-list .card-item')) { - const item = this.document.items.get(li.dataset.itemId); + const item = getDocFromElement(li); const matchesMenu = filters.length === 0 || filters.some(f => foundry.applications.ux.SearchFilter.evaluateFilter(item, f)); @@ -448,6 +509,35 @@ export default class CharacterSheet extends DHBaseActorSheet { } } + /* -------------------------------------------- */ + /* Application Listener Actions */ + /* -------------------------------------------- */ + + async updateItemResource(event) { + const item = getDocFromElement(event.currentTarget); + if (!item) return; + + const max = item.system.resource.max ? itemAbleRollParse(item.system.resource.max, this.document, item) : null; + const value = max ? Math.min(Number(event.currentTarget.value), max) : event.currentTarget.value; + await item.update({ 'system.resource.value': value }); + } + + async updateItemQuantity(event) { + const item = getDocFromElement(event.currentTarget); + if (!item) return; + + await item.update({ 'system.quantity': event.currentTarget.value }); + } + + async updateArmorMarks(event) { + const armor = this.document.system.armor; + if (!armor) return; + + const maxMarks = this.document.system.armorScore; + const value = Math.min(Math.max(Number(event.currentTarget.value), 0), maxMarks); + await armor.update({ 'system.marks.value': value }); + } + /* -------------------------------------------- */ /* Application Clicks Actions */ /* -------------------------------------------- */ @@ -495,7 +585,7 @@ export default class CharacterSheet extends DHBaseActorSheet { const config = { event: event, title: `${game.i18n.localize('DAGGERHEART.GENERAL.dualityRoll')}: ${this.actor.name}`, - headerTitle: game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilitychecktitle', { + headerTitle: game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilityCheckTitle', { ability: abilityLabel }), roll: { @@ -505,13 +595,14 @@ export default class CharacterSheet extends DHBaseActorSheet { this.document.diceRoll(config); } + //TODO: redo toggleEquipItem method + /** * Toggles the equipped state of an item (armor or weapon). * @type {ApplicationClickAction} */ static async #toggleEquipItem(_event, button) { - //TODO: redo this - const item = this.actor.items.get(button.closest('[data-item-id]')?.dataset.itemId); + const item = getDocFromElement(button); if (!item) return; if (item.system.equipped) { await item.update({ 'system.equipped': false }); @@ -528,6 +619,12 @@ export default class CharacterSheet extends DHBaseActorSheet { await item.update({ 'system.equipped': true }); break; case 'weapon': + if (this.document.effects.find(x => x.type === 'beastform')) { + return ui.notifications.warn( + game.i18n.localize('DAGGERHEART.UI.Notifications.beastformEquipWeapon') + ); + } + await this.document.system.constructor.unequipBeforeEquip.bind(this.document.system)(item); await item.update({ 'system.equipped': true }); @@ -559,76 +656,69 @@ export default class CharacterSheet extends DHBaseActorSheet { * Toggles whether an item is stored in the vault. * @type {ApplicationClickAction} */ - static async #toggleVault(event, button) { - const docId = button.closest('[data-item-id]')?.dataset.itemId; - const doc = this.document.items.get(docId); + static async #toggleVault(_event, button) { + const doc = getDocFromElement(button); await doc?.update({ 'system.inVault': !doc.system.inVault }); } /** - * Trigger the context menu. + * Toggle the used state of a resource dice. * @type {ApplicationClickAction} */ - static #triggerContextMenu(event, _) { - return CONFIG.ux.ContextMenu.triggerContextMenu(event); + static async #toggleResourceDice(event, target) { + const item = getDocFromElement(target); + + const { dice } = event.target.closest('.item-resource').dataset; + const diceState = item.system.resource.diceStates[dice]; + + await item.update({ + [`system.resource.diceStates.${dice}.used`]: diceState ? !diceState.used : true + }); } /** - * Use a item + * Handle the roll values of resource dice. * @type {ApplicationClickAction} */ - static async useItem(event, button) { - const item = this.getItem(button); + static async #handleResourceDice(_, target) { + const item = getDocFromElement(target); if (!item) return; - // Should dandle its actions. Or maybe they'll be separate buttons as per an Issue on the board - if (item.type === 'feature') { - item.use(event); - } else if (item instanceof ActiveEffect) { - item.toChat(this); - } else { - const wasUsed = await item.use(event); - if (wasUsed && item.type === 'weapon') { - Hooks.callAll(CONFIG.DH.HOOKS.characterAttack, {}); - } - } + const rollValues = await game.system.api.applications.dialogs.ResourceDiceDialog.create(item, this.document); + if (!rollValues) return; + + await item.update({ + 'system.resource.diceStates': rollValues.reduce((acc, state, index) => { + acc[index] = { value: state.value, used: state.used }; + return acc; + }, {}) + }); } - /** - * Send item to Chat - * @type {ApplicationClickAction} - */ - static async toChat(event, button) { - if (button?.dataset?.type === 'experience') { - const experience = this.document.system.experiences[button.dataset.uuid]; - const cls = getDocumentClass('ChatMessage'); - const systemData = { - name: game.i18n.localize('DAGGERHEART.GENERAL.Experience.single'), - description: `${experience.name} ${experience.total < 0 ? experience.total : `+${experience.total}`}` - }; - const msg = new cls({ - type: 'abilityUse', - user: game.user.id, - system: systemData, - content: await foundry.applications.handlebars.renderTemplate( - 'systems/daggerheart/templates/ui/chat/ability-use.hbs', - systemData - ) - }); - - cls.create(msg.toObject()); - } else { - const item = this.getItem(event); - if (!item) return; - item.toChat(this.document.id); - } + static useDowntime(_, button) { + new game.system.api.applications.dialogs.Downtime(this.document, button.dataset.type === 'shortRest').render( + true + ); } - async _onDragStart(_, event) { + async _onDragStart(event) { + const item = getDocFromElement(event.target); + + const dragData = { + type: item.documentName, + uuid: item.uuid + }; + + event.dataTransfer.setData('text/plain', JSON.stringify(dragData)); + super._onDragStart(event); } async _onDrop(event) { + // Prevent event bubbling to avoid duplicate handling + event.preventDefault(); + event.stopPropagation(); + super._onDrop(event); this._onDropItem(event, TextEditor.getDragEventData(event)); } diff --git a/module/applications/sheets/actors/companion.mjs b/module/applications/sheets/actors/companion.mjs index 042a4bfa..87cfda27 100644 --- a/module/applications/sheets/actors/companion.mjs +++ b/module/applications/sheets/actors/companion.mjs @@ -6,11 +6,7 @@ export default class DhCompanionSheet extends DHBaseActorSheet { static DEFAULT_OPTIONS = { classes: ['actor', 'companion'], position: { width: 300 }, - actions: { - viewActor: this.viewActor, - useItem: this.useItem, - toChat: this.toChat - } + actions: {} }; static PARTS = { @@ -29,52 +25,4 @@ export default class DhCompanionSheet extends DHBaseActorSheet { labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } }; - - /* -------------------------------------------- */ - /* Application Clicks Actions */ - /* -------------------------------------------- */ - - static async viewActor(_, button) { - const target = button.closest('[data-item-uuid]'); - const actor = await foundry.utils.fromUuid(target.dataset.itemUuid); - if (!actor) return; - - actor.sheet.render(true); - } - - getAction(element) { - const itemId = (element.target ?? element).closest('[data-item-id]').dataset.itemId, - item = this.document.system.actions.find(x => x.id === itemId); - return item; - } - - static async useItem(event) { - const action = this.getAction(event) ?? this.actor.system.attack; - action.use(event); - } - - static async toChat(event, button) { - if (button?.dataset?.type === 'experience') { - const experience = this.document.system.experiences[button.dataset.uuid]; - const cls = getDocumentClass('ChatMessage'); - const systemData = { - name: game.i18n.localize('DAGGERHEART.GENERAL.Experience.single'), - description: `${experience.name} ${experience.total < 0 ? experience.total : `+${experience.total}`}` - }; - const msg = new cls({ - type: 'abilityUse', - user: game.user.id, - system: systemData, - content: await foundry.applications.handlebars.renderTemplate( - 'systems/daggerheart/templates/ui/chat/ability-use.hbs', - systemData - ) - }); - - cls.create(msg.toObject()); - } else { - const item = this.getAction(event) ?? this.document.system.attack; - item.toChat(this.document.id); - } - } } diff --git a/module/applications/sheets/actors/environment.mjs b/module/applications/sheets/actors/environment.mjs index 188d24b4..7a9c92ac 100644 --- a/module/applications/sheets/actors/environment.mjs +++ b/module/applications/sheets/actors/environment.mjs @@ -9,10 +9,7 @@ export default class DhpEnvironment extends DHBaseActorSheet { position: { width: 500 }, - actions: { - useItem: this.useItem, - toChat: this.toChat - }, + actions: {}, dragDrop: [{ dragSelector: '.action-section .inventory-item', dropSelector: null }] }; @@ -35,47 +32,67 @@ export default class DhpEnvironment extends DHBaseActorSheet { } }; - /* -------------------------------------------- */ - - getItem(element) { - const itemId = (element.target ?? element).closest('[data-item-id]').dataset.itemId, - item = this.document.items.get(itemId); - return item; + /**@inheritdoc */ + async _preparePartContext(partId, context, options) { + context = await super._preparePartContext(partId, context, options); + switch (partId) { + case 'header': + await this._prepareHeaderContext(context, options); + break; + case 'notes': + await this._prepareNotesContext(context, options); + break; + } + return context; } - /* -------------------------------------------- */ - /* Application Clicks Actions */ - /* -------------------------------------------- */ - /** - * - * @type {ApplicationClickAction} + * Prepare render context for the Biography part. + * @param {ApplicationRenderContext} context + * @param {ApplicationRenderOptions} options + * @returns {Promise} + * @protected */ - async viewAdversary(_, button) { - const target = button.closest('[data-item-uuid]'); - const adversary = await foundry.utils.fromUuid(target.dataset.itemUuid); - if (!adversary) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.adversaryMissing')); - return; - } + async _prepareNotesContext(context, _options) { + const { system } = this.document; + const { TextEditor } = foundry.applications.ux; - adversary.sheet.render({ force: true }); - } + const paths = { + notes: 'notes' + }; - static async useItem(event, button) { - const action = this.getItem(event); - if (!action) { - await this.viewAdversary(event, button); - } else { - action.use(event); + for (const [key, path] of Object.entries(paths)) { + const value = foundry.utils.getProperty(system, path); + context[key] = { + field: system.schema.getField(path), + value, + enriched: await TextEditor.implementation.enrichHTML(value, { + secrets: this.document.isOwner, + relativeTo: this.document + }) + }; } } - static async toChat(event) { - const item = this.getItem(event); - item.toChat(this.document.id); + /** + * Prepare render context for the Header part. + * @param {ApplicationRenderContext} context + * @param {ApplicationRenderOptions} options + * @returns {Promise} + * @protected + */ + async _prepareHeaderContext(context, _options) { + const { system } = this.document; + const { TextEditor } = foundry.applications.ux; + + context.description = await TextEditor.implementation.enrichHTML(system.description, { + secrets: this.document.isOwner, + relativeTo: this.document + }); } + /* -------------------------------------------- */ + async _onDragStart(event) { const item = event.currentTarget.closest('.inventory-item'); diff --git a/module/applications/sheets/api/_modules.mjs b/module/applications/sheets/api/_modules.mjs index cb7eee62..e6caece1 100644 --- a/module/applications/sheets/api/_modules.mjs +++ b/module/applications/sheets/api/_modules.mjs @@ -1,5 +1,6 @@ export { default as DHApplicationMixin } from './application-mixin.mjs'; export { default as DHBaseItemSheet } from './base-item.mjs'; export { default as DHHeritageSheet } from './heritage-sheet.mjs'; +export { default as DHItemAttachmentSheet } from './item-attachment-sheet.mjs'; export { default as DHBaseActorSheet } from './base-actor.mjs'; export { default as DHBaseActorSettings } from './actor-setting.mjs'; diff --git a/module/applications/sheets/api/actor-setting.mjs b/module/applications/sheets/api/actor-setting.mjs index 50e2b0a9..79aa1c37 100644 --- a/module/applications/sheets/api/actor-setting.mjs +++ b/module/applications/sheets/api/actor-setting.mjs @@ -42,9 +42,12 @@ export default class DHBaseActorSettings extends DHApplicationMixin(DocumentShee /**@inheritdoc */ async _prepareContext(options) { const context = await super._prepareContext(options); - context.systemFields.attack.fields = this.actor.system.attack.schema.fields; context.isNPC = this.actor.isNPC; + if (context.systemFields.attack) { + context.systemFields.attack.fields = this.actor.system.attack.schema.fields; + } + return context; } } diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index d0ef63d6..6597f130 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -1,5 +1,10 @@ const { HandlebarsApplicationMixin } = foundry.applications.api; -import { tagifyElement } from '../../../helpers/utils.mjs'; +import { getDocFromElement, tagifyElement } from '../../../helpers/utils.mjs'; +import DHActionConfig from '../../sheets-configs/action-config.mjs'; + +/** + * @typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction + */ /** * @typedef {object} DragDropConfig @@ -71,11 +76,34 @@ export default function DHApplicationMixin(Base) { static DEFAULT_OPTIONS = { classes: ['daggerheart', 'sheet', 'dh-style'], actions: { + triggerContextMenu: DHSheetV2.#triggerContextMenu, createDoc: DHSheetV2.#createDoc, editDoc: DHSheetV2.#editDoc, - deleteDoc: DHSheetV2.#deleteDoc + deleteDoc: DHSheetV2.#deleteDoc, + toChat: DHSheetV2.#toChat, + useItem: DHSheetV2.#useItem, + useAction: DHSheetV2.#useAction, + toggleEffect: DHSheetV2.#toggleEffect, + toggleExtended: DHSheetV2.#toggleExtended }, - contextMenus: [], + contextMenus: [ + { + handler: DHSheetV2.#getEffectContextOptions, + selector: '[data-item-uuid][data-type="effect"]', + options: { + parentClassHooks: false, + fixed: true + } + }, + { + handler: DHSheetV2.#getActionContextOptions, + selector: '[data-item-uuid][data-type="action"]', + options: { + parentClassHooks: false, + fixed: true + } + } + ], dragDrop: [], tagifyConfigs: [] }; @@ -99,6 +127,27 @@ export default function DHApplicationMixin(Base) { this._createTagifyElements(this.options.tagifyConfigs); } + /* -------------------------------------------- */ + /* Sync Parts */ + /* -------------------------------------------- */ + + /**@inheritdoc */ + _syncPartState(partId, newElement, priorElement, state) { + super._syncPartState(partId, newElement, priorElement, state); + for (const el of priorElement.querySelectorAll('.extensible.extended')) { + const { actionId, itemUuid } = el.parentElement.dataset; + const selector = `${actionId ? `[data-action-id="${actionId}"]` : `[data-item-uuid="${itemUuid}"]`} .extensible`; + const newExtensible = newElement.querySelector(selector); + + if (!newExtensible) continue; + newExtensible.classList.add('extended'); + const descriptionElement = newExtensible.querySelector('.invetory-description'); + if (descriptionElement) { + this.#prepareInventoryDescription(newExtensible, descriptionElement); + } + } + } + /* -------------------------------------------- */ /* Tags */ /* -------------------------------------------- */ @@ -185,12 +234,146 @@ export default function DHApplicationMixin(Base) { /* -------------------------------------------- */ /** - * Get the set of ContextMenu options which should be used for journal entry pages in the sidebar. - * @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} + * Get the set of ContextMenu options for DomainCards. + * @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance + * @this {CharacterSheet} * @protected */ - _getEntryContextOptions() { - return []; + static #getEffectContextOptions() { + /**@type {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} */ + const options = [ + { + name: 'disableEffect', + icon: 'fa-solid fa-lightbulb', + condition: target => !getDocFromElement(target).disabled, + callback: target => getDocFromElement(target).update({ disabled: true }) + }, + { + name: 'enableEffect', + icon: 'fa-regular fa-lightbulb', + condition: target => getDocFromElement(target).disabled, + callback: target => getDocFromElement(target).update({ disabled: false }) + } + ].map(option => ({ + ...option, + name: `DAGGERHEART.APPLICATIONS.ContextMenu.${option.name}`, + icon: `` + })); + + return [...options, ...this._getContextMenuCommonOptions.call(this, { toChat: true })]; + } + + /** + * Get the set of ContextMenu options for Actions. + * @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance + * @this {DHSheetV2} + * @protected + */ + static #getActionContextOptions() { + /**@type {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} */ + const getAction = target => { + const { actionId } = target.closest('[data-action-id]').dataset; + const { actions, attack } = this.document.system; + return attack?.id === actionId ? attack : actions?.find(a => a.id === actionId); + }; + + const options = [ + { + name: 'DAGGERHEART.APPLICATIONS.ContextMenu.useItem', + icon: 'fa-solid fa-burst', + condition: + this.document instanceof foundry.documents.Actor || + (this.document instanceof foundry.documents.Item && this.document.parent), + callback: (target, event) => getAction(target).use(event) + }, + { + name: 'DAGGERHEART.APPLICATIONS.ContextMenu.sendToChat', + icon: 'fa-solid fa-message', + callback: target => getAction(target).toChat(this.document.id) + }, + { + name: 'CONTROLS.CommonEdit', + icon: 'fa-solid fa-pen-to-square', + callback: target => new DHActionConfig(getAction(target)).render({ force: true }) + }, + { + name: 'CONTROLS.CommonDelete', + icon: 'fa-solid fa-trash', + condition: target => { + const { actionId } = target.closest('[data-action-id]').dataset; + const { attack } = this.document.system; + return attack?.id !== actionId; + }, + callback: async target => { + const action = getAction(target); + const confirmed = await foundry.applications.api.DialogV2.confirm({ + window: { + title: game.i18n.format('DAGGERHEART.APPLICATIONS.DeleteConfirmation.title', { + type: game.i18n.localize(`DAGGERHEART.GENERAL.Action.single`), + name: action.name + }) + }, + content: game.i18n.format('DAGGERHEART.APPLICATIONS.DeleteConfirmation.text', { + name: action.name + }) + }); + if (!confirmed) return; + + return this.document.update({ + 'system.actions': this.document.system.actions.filter(a => a.id !== action.id) + }); + } + } + ].map(option => ({ + ...option, + icon: `` + })); + + return options; + } + + /** + * Get the set of ContextMenu options. + * @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance + */ + _getContextMenuCommonOptions({ usable = false, toChat = false, deletable = true }) { + const options = [ + { + name: 'CONTROLS.CommonEdit', + icon: 'fa-solid fa-pen-to-square', + callback: target => getDocFromElement(target).sheet.render({ force: true }) + } + ]; + + if (usable) + options.unshift({ + name: 'DAGGERHEART.APPLICATIONS.ContextMenu.useItem', + icon: 'fa-solid fa-burst', + callback: (target, event) => getDocFromElement(target).use(event) + }); + + if (toChat) + options.unshift({ + name: 'DAGGERHEART.APPLICATIONS.ContextMenu.sendToChat', + icon: 'fa-solid fa-message', + callback: target => getDocFromElement(target).toChat(this.document.id) + }); + + if (deletable) + options.push({ + name: 'CONTROLS.CommonDelete', + icon: 'fa-solid fa-trash', + callback: (target, event) => { + const doc = getDocFromElement(target); + if (event.shiftKey) return doc.delete(); + else return doc.deleteDialog(); + } + }); + + return options.map(option => ({ + ...option, + icon: `` + })); } /* -------------------------------------------- */ @@ -207,50 +390,233 @@ export default function DHApplicationMixin(Base) { return context; } + /* -------------------------------------------- */ + /* Prepare Descriptions */ + /* -------------------------------------------- */ + + /** + * Prepares and enriches an inventory item or action description for display. + * @param {HTMLElement} extensibleElement - The parent element containing the description. + * @param {HTMLElement} descriptionElement - The element where the enriched description will be rendered. + * @returns {Promise} + */ + async #prepareInventoryDescription(extensibleElement, descriptionElement) { + const parent = extensibleElement.closest('[data-item-uuid], [data-action-id]'); + const { actionId, itemUuid } = parent?.dataset || {}; + if (!actionId && !itemUuid) return; + + const doc = itemUuid + ? getDocFromElement(extensibleElement) + : this.document.system.attack?.id === actionId + ? this.document.system.attack + : this.document.system.actions?.find(a => a.id === actionId); + if (!doc) return; + + const description = doc.system?.description ?? doc.description; + const isAction = !!actionId; + descriptionElement.innerHTML = await foundry.applications.ux.TextEditor.implementation.enrichHTML( + description, + { + relativeTo: isAction ? doc.parent : doc, + rollData: doc.getRollData?.(), + secrets: isAction ? doc.parent.isOwner : doc.isOwner + } + ); + } + /* -------------------------------------------- */ /* Application Clicks Actions */ /* -------------------------------------------- */ /** * Create an embedded document. - * @param {PointerEvent} event - The originating click event - * @param {HTMLElement} button - The capturing HTML element which defines the [data-action="removeAction"] + * @type {ApplicationClickAction} */ - static async #createDoc(event, button) { - const { documentClass, type } = button.dataset; - console.log(documentClass, type); - const parent = this.document; + static async #createDoc(event, target) { + const { documentClass, type, inVault, disabled } = target.dataset; + const parentIsItem = this.document.documentName === 'Item'; + const parent = parentIsItem && documentClass === 'Item' ? null : this.document; - const cls = getDocumentClass(documentClass); - return await cls.createDocuments( - [ + if (type === 'action') { + const { type: actionType } = + (await foundry.applications.api.DialogV2.input({ + window: { title: 'Select Action Type' }, + classes: ['daggerheart', 'dh-style'], + content: await foundry.applications.handlebars.renderTemplate( + 'systems/daggerheart/templates/actionTypes/actionType.hbs', + { + types: CONFIG.DH.ACTIONS.actionTypes, + itemName: game.i18n.localize('DAGGERHEART.CONFIG.SelectAction.selectAction') + } + ), + ok: { + label: game.i18n.format('DOCUMENT.Create', { + type: game.i18n.localize('DAGGERHEART.GENERAL.Action.single') + }) + } + })) ?? {}; + if (!actionType) return; + const cls = game.system.api.models.actions.actionsTypes[actionType]; + const action = new cls( { - name: cls.defaultName({ type, parent }), - type + _id: foundry.utils.randomID(), + type: actionType, + name: game.i18n.localize(CONFIG.DH.ACTIONS.actionTypes[actionType].name), + ...cls.getSourceConfig(this.document) + }, + { + parent: this.document } - ], - { parent, renderSheet: !event.shiftKey } - ); + ); + await this.document.update({ 'system.actions': [...this.document.system.actions, action] }); + await new DHActionConfig(this.document.system.actions[this.document.system.actions.length - 1]).render({ + force: true + }); + return action; + } else { + const cls = getDocumentClass(documentClass); + const data = { + name: cls.defaultName({ type, parent }), + type + }; + if (inVault) data['system.inVault'] = true; + if (disabled) data.disabled = true; + + const doc = await cls.create(data, { parent, renderSheet: !event.shiftKey }); + if (parentIsItem && type === 'feature') { + await this.document.update({ + 'system.features': this.document.system.toObject().features.concat(doc.uuid) + }); + } + return doc; + } } /** * Renders an embedded document. - * @param {PointerEvent} event - The originating click event - * @param {HTMLElement} button - The capturing HTML element which defines the [data-action="removeAction"] + * @type {ApplicationClickAction} */ - static #editDoc(_event, button) { - const { type, docId } = button.dataset; - this.document.getEmbeddedDocument(type, docId, { strict: true }).sheet.render({ force: true }); + static #editDoc(_event, target) { + const doc = getDocFromElement(target); + if (doc) return doc.sheet.render({ force: true }); + + // TODO: REDO this + const { actionId } = target.closest('[data-action-id]').dataset; + const { actions, attack } = this.document.system; + const action = attack?.id === actionId ? attack : actions?.find(a => a.id === actionId); + new DHActionConfig(action).render({ force: true }); } /** * Delete an embedded document. - * @param {PointerEvent} _event - The originating click event - * @param {HTMLElement} button - The capturing HTML element which defines the [data-action="removeAction"] + * @type {ApplicationClickAction} */ - static async #deleteDoc(_event, button) { - const { type, docId } = button.dataset; - await this.document.getEmbeddedDocument(type, docId, { strict: true }).delete(); + static async #deleteDoc(event, target) { + const doc = getDocFromElement(target); + + if (doc) { + if (event.shiftKey) return doc.delete(); + else return await doc.deleteDialog(); + } + + // TODO: REDO this + const { actionId } = target.closest('[data-action-id]').dataset; + const { actions, attack } = this.document.system; + if (attack?.id === actionId) return; + const action = actions.find(a => a.id === actionId); + + if (!event.shiftKey) { + const confirmed = await foundry.applications.api.DialogV2.confirm({ + window: { + title: game.i18n.format('DAGGERHEART.APPLICATIONS.DeleteConfirmation.title', { + type: game.i18n.localize(`DAGGERHEART.GENERAL.Action.single`), + name: action.name + }) + }, + content: game.i18n.format('DAGGERHEART.APPLICATIONS.DeleteConfirmation.text', { name: action.name }) + }); + if (!confirmed) return; + } + + return await this.document.update({ + 'system.actions': actions.filter(a => a.id !== action.id) + }); + } + + /** + * Send item to Chat + * @type {ApplicationClickAction} + */ + static async #toChat(_event, target) { + let doc = getDocFromElement(target); + + // TODO: REDO this + if (!doc) { + const { actionId } = target.closest('[data-action-id]').dataset; + const { actions, attack } = this.document.system; + doc = attack?.id === actionId ? attack : actions?.find(a => a.id === actionId); + } + return doc.toChat(this.document.id); + } + + /** + * Use a item + * @type {ApplicationClickAction} + */ + static async #useItem(event, target) { + let doc = getDocFromElement(target); + // TODO: REDO this + if (!doc) { + const { actionId } = target.closest('[data-action-id]').dataset; + const { actions, attack } = this.document.system; + doc = attack?.id === actionId ? attack : actions?.find(a => a.id === actionId); + if (this.document instanceof foundry.documents.Item && !this.document.parent) return; + } + + await doc.use(event); + } + + /** + * Use a item + * @type {ApplicationClickAction} + */ + static async #useAction(event, target) { + const doc = getDocFromElement(target); + const { actionId } = target.closest('[data-action-id]').dataset; + const { actions, attack } = doc.system; + const action = attack?.id === actionId ? attack : actions?.find(a => a.id === actionId); + await action.use(event, doc); + } + + /** + * Toggle a ActiveEffect + * @type {ApplicationClickAction} + */ + static async #toggleEffect(_, target) { + const doc = getDocFromElement(target); + await doc.update({ disabled: !doc.disabled }); + } + + /** + * Trigger the context menu. + * @type {ApplicationClickAction} + */ + static #triggerContextMenu(event, _) { + return CONFIG.ux.ContextMenu.triggerContextMenu(event); + } + + /** + * Toggle the 'extended' class on the .extensible element inside inventory-item-content + * @type {ApplicationClickAction} + * @this {DHSheetV2} + */ + static async #toggleExtended(_, target) { + const container = target.closest('.inventory-item'); + const extensible = container?.querySelector('.extensible'); + const t = extensible?.classList.toggle('extended'); + + const descriptionElement = extensible?.querySelector('.invetory-description'); + if (t && !!descriptionElement) this.#prepareInventoryDescription(extensible, descriptionElement); } } diff --git a/module/applications/sheets/api/base-actor.mjs b/module/applications/sheets/api/base-actor.mjs index 7102fa1c..346a0ab6 100644 --- a/module/applications/sheets/api/base-actor.mjs +++ b/module/applications/sheets/api/base-actor.mjs @@ -21,11 +21,24 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { submitOnChange: true }, actions: { - openSettings: DHBaseActorSheet.#openSettings + openSettings: DHBaseActorSheet.#openSettings, + sendExpToChat: DHBaseActorSheet.#sendExpToChat }, - dragDrop: [] + contextMenus: [ + { + handler: DHBaseActorSheet.#getFeatureContextOptions, + selector: '[data-item-uuid][data-type="feature"]', + options: { + parentClassHooks: false, + fixed: true + } + } + ], + dragDrop: [{ dragSelector: '.inventory-item[data-type="attack"]', dropSelector: null }] }; + /* -------------------------------------------- */ + /**@type {typeof DHBaseActorSettings}*/ #settingSheet; @@ -35,6 +48,10 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { return (this.#settingSheet ??= SheetClass ? new SheetClass({ document: this.document }) : null); } + /* -------------------------------------------- */ + /* Prepare Context */ + /* -------------------------------------------- */ + /**@inheritdoc */ async _prepareContext(_options) { const context = await super._prepareContext(_options); @@ -42,6 +59,54 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { return context; } + /**@inheritdoc */ + async _preparePartContext(partId, context, options) { + context = await super._preparePartContext(partId, context, options); + switch (partId) { + case 'effects': + await this._prepareEffectsContext(context, options); + break; + } + return context; + } + + /** + * Prepare render context for the Effect part. + * @param {ApplicationRenderContext} context + * @param {ApplicationRenderOptions} options + * @returns {Promise} + * @protected + */ + async _prepareEffectsContext(context, _options) { + context.effects = { + actives: [], + inactives: [] + }; + + for (const effect of this.actor.allApplicableEffects()) { + const list = effect.active ? context.effects.actives : context.effects.inactives; + list.push(effect); + } + } + + /* -------------------------------------------- */ + /* Context Menu */ + /* -------------------------------------------- */ + + /** + * Get the set of ContextMenu options for Features. + * @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance + * @this {DHSheetV2} + * @protected + */ + static #getFeatureContextOptions() { + return this._getContextMenuCommonOptions.call(this, { usable: true, toChat: true }); + } + + /* -------------------------------------------- */ + /* Application Clicks Actions */ + /* -------------------------------------------- */ + /** * Open the Actor Setting Sheet * @type {ApplicationClickAction} @@ -49,4 +114,50 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { static async #openSettings() { await this.settingSheet.render({ force: true }); } + + /** + * Send Experience to Chat + * @type {ApplicationClickAction} + */ + static async #sendExpToChat(_, button) { + const experience = this.document.system.experiences[button.dataset.id]; + + const systemData = { + name: game.i18n.localize('DAGGERHEART.GENERAL.Experience.single'), + description: `${experience.name} ${experience.value.signedString()}` + }; + + foundry.documents.ChatMessage.implementation.create({ + type: 'abilityUse', + user: game.user.id, + system: systemData, + content: await foundry.applications.handlebars.renderTemplate( + 'systems/daggerheart/templates/ui/chat/ability-use.hbs', + systemData + ) + }); + } + + /* -------------------------------------------- */ + /* Application Drag/Drop */ + /* -------------------------------------------- */ + + /** + * On dragStart on the item. + * @param {DragEvent} event - The drag event + */ + async _onDragStart(event) { + const attackItem = event.currentTarget.closest('.inventory-item[data-type="attack"]'); + + if (attackItem) { + const attackData = { + type: 'Attack', + actorUuid: this.document.uuid, + img: this.document.system.attack.img, + fromInternal: true + }; + event.dataTransfer.setData('text/plain', JSON.stringify(attackData)); + event.dataTransfer.setDragImage(attackItem.querySelector('img'), 60, 0); + } + } } diff --git a/module/applications/sheets/api/base-item.mjs b/module/applications/sheets/api/base-item.mjs index f9d52025..1888be9e 100644 --- a/module/applications/sheets/api/base-item.mjs +++ b/module/applications/sheets/api/base-item.mjs @@ -1,4 +1,4 @@ -import DHActionConfig from '../../sheets-configs/action-config.mjs'; +import { getDocFromElement } from '../../../helpers/utils.mjs'; import DHApplicationMixin from './application-mixin.mjs'; const { ItemSheetV2 } = foundry.applications.sheets; @@ -15,20 +15,31 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { static DEFAULT_OPTIONS = { classes: ['item'], position: { width: 600 }, + window: { resizable: true }, form: { submitOnChange: true }, actions: { - addAction: DHBaseItemSheet.#addAction, - editAction: DHBaseItemSheet.#editAction, removeAction: DHBaseItemSheet.#removeAction, addFeature: DHBaseItemSheet.#addFeature, - editFeature: DHBaseItemSheet.#editFeature, - removeFeature: DHBaseItemSheet.#removeFeature + deleteFeature: DHBaseItemSheet.#deleteFeature, + addResource: DHBaseItemSheet.#addResource, + removeResource: DHBaseItemSheet.#removeResource }, dragDrop: [ { dragSelector: null, dropSelector: '.tab.features .drop-section' }, - { dragSelector: '.feature-item', dropSelector: null } + { dragSelector: '.feature-item', dropSelector: null }, + { dragSelector: '.action-item', dropSelector: null } + ], + contextMenus: [ + { + handler: DHBaseItemSheet.#getFeatureContextOptions, + selector: '[data-item-uuid][data-type="feature"]', + options: { + parentClassHooks: false, + fixed: true + } + } ] }; @@ -37,7 +48,7 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { /** @inheritdoc */ static TABS = { primary: { - tabs: [{ id: 'description' }, { id: 'settings' }, { id: 'actions' }], + tabs: [{ id: 'description' }, { id: 'settings' }, { id: 'actions' }, { id: 'effects' }], initial: 'description', labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } @@ -48,8 +59,8 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { /* -------------------------------------------- */ /**@inheritdoc */ - async _preparePartContext(partId, context) { - await super._preparePartContext(partId, context); + async _preparePartContext(partId, context, options) { + await super._preparePartContext(partId, context, options); const { TextEditor } = foundry.applications.ux; switch (partId) { @@ -61,77 +72,78 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { secrets: this.item.isOwner }); break; + case 'effects': + await this._prepareEffectsContext(context, options); + break; + case 'features': + context.isGM = game.user.isGM; + break; } return context; } - /* -------------------------------------------- */ - /* Application Clicks Actions */ - /* -------------------------------------------- */ - /** - * Render a dialog prompting the user to select an action type. - * - * @returns {Promise} An object containing the selected action type. + * Prepare render context for the Effect part. + * @param {ApplicationRenderContext} context + * @param {ApplicationRenderOptions} options + * @returns {Promise} + * @protected */ - static async selectActionType() { - const content = await foundry.applications.handlebars.renderTemplate( - 'systems/daggerheart/templates/actionTypes/actionType.hbs', - { types: CONFIG.DH.ACTIONS.actionTypes } - ), - title = 'Select Action Type'; + async _prepareEffectsContext(context, _options) { + context.effects = { + actives: [], + inactives: [] + }; - return foundry.applications.api.DialogV2.prompt({ - window: { title }, - content, - ok: { - label: title, - callback: (event, button, dialog) => button.form.elements.type.value - } - }); - } - - /** - * Add a new action to the item, prompting the user for its type. - * @type {ApplicationClickAction} - */ - static async #addAction(_event, _button) { - const actionType = await DHBaseItemSheet.selectActionType(); - if (!actionType) return; - try { - const cls = - game.system.api.models.actions.actionsTypes[actionType] ?? - game.system.api.models.actions.actionsTypes.attack, - action = new cls( - { - _id: foundry.utils.randomID(), - type: actionType, - name: game.i18n.localize(CONFIG.DH.ACTIONS.actionTypes[actionType].name), - ...cls.getSourceConfig(this.document) - }, - { - parent: this.document - } - ); - await this.document.update({ 'system.actions': [...this.document.system.actions, action] }); - await new DHActionConfig(this.document.system.actions[this.document.system.actions.length - 1]).render({ - force: true - }); - } catch (error) { - console.log(error); + for (const effect of this.item.effects) { + const list = effect.active ? context.effects.actives : context.effects.inactives; + list.push(effect); } } + /* -------------------------------------------- */ + /* Context Menu */ + /* -------------------------------------------- */ + /** - * Edit an existing action on the item - * @type {ApplicationClickAction} + * Get the set of ContextMenu options for Features. + * @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance + * @this {DHSheetV2} + * @protected */ - static async #editAction(_event, button) { - const action = this.document.system.actions[button.dataset.index]; - await new DHActionConfig(action).render({ force: true }); + static #getFeatureContextOptions() { + const options = this._getContextMenuCommonOptions({ usable: true, toChat: true, deletable: false }); + options.push({ + name: 'CONTROLS.CommonDelete', + icon: '', + callback: async target => { + const feature = getDocFromElement(target); + if (!feature) return; + const confirmed = await foundry.applications.api.DialogV2.confirm({ + window: { + title: game.i18n.format('DAGGERHEART.APPLICATIONS.DeleteConfirmation.title', { + type: game.i18n.localize(`TYPES.Item.feature`), + name: feature.name + }) + }, + content: game.i18n.format('DAGGERHEART.APPLICATIONS.DeleteConfirmation.text', { + name: feature.name + }) + }); + if (!confirmed) return; + await this.document.update({ + 'system.features': this.document.system.toObject().features.filter(uuid => uuid !== feature.uuid) + }); + } + }); + return options; } + /* -------------------------------------------- */ + /* Application Clicks Actions */ + /* -------------------------------------------- */ + /** * Remove an action from the item. * @type {ApplicationClickAction} @@ -139,6 +151,21 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { static async #removeAction(event, button) { event.stopPropagation(); const actionIndex = button.closest('[data-index]').dataset.index; + const action = this.document.system.actions[actionIndex]; + + if (!event.shiftKey) { + const confirmed = await foundry.applications.api.DialogV2.confirm({ + window: { + title: game.i18n.format('DAGGERHEART.APPLICATIONS.DeleteConfirmation.title', { + type: game.i18n.localize(`DAGGERHEART.GENERAL.Action.single`), + name: action.name + }) + }, + content: game.i18n.format('DAGGERHEART.APPLICATIONS.DeleteConfirmation.text', { name: action.name }) + }); + if (!confirmed) return; + } + await this.document.update({ 'system.actions': this.document.system.actions.filter((_, index) => index !== Number.parseInt(actionIndex)) }); @@ -148,43 +175,49 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { * Add a new feature to the item, prompting the user for its type. * @type {ApplicationClickAction} */ - static async #addFeature(_event, _button) { - const feature = await game.items.documentClass.create({ - type: 'feature', - name: game.i18n.format('DOCUMENT.New', { type: game.i18n.localize('TYPES.Item.feature') }) + static async #addFeature(_, target) { + const { type } = target.dataset; + const cls = foundry.documents.Item.implementation; + const feature = await cls.create({ + 'type': 'feature', + 'name': cls.defaultName({ type: 'feature' }), + 'system.subType': CONFIG.DH.ITEM.featureSubTypes[type] }); await this.document.update({ - 'system.features': [...this.document.system.features.filter(x => x).map(x => x.uuid), feature.uuid] + 'system.features': [...this.document.system.features, feature].map(f => f.uuid) }); } - /** - * Edit an existing feature on the item - * @type {ApplicationClickAction} - */ - static async #editFeature(_event, button) { - const target = button.closest('.feature-item'); - const feature = this.document.system.features.find(x => x?.id === target.id); - if (!feature) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.notifications.featureIsMissing')); - return; - } - - feature.sheet.render(true); - } - /** * Remove a feature from the item. * @type {ApplicationClickAction} */ - static async #removeFeature(event, button) { - event.stopPropagation(); - const target = button.closest('.feature-item'); - + static async #deleteFeature(_, target) { + const feature = getDocFromElement(target); + if (!feature) return ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureIsMissing')); + await feature.update({ 'system.subType': null }); await this.document.update({ - 'system.features': this.document.system.features - .filter(feature => feature && feature.id !== target.id) - .map(x => x.uuid) + 'system.features': this.document.system.features.map(x => x.uuid).filter(uuid => uuid !== feature.uuid) + }); + } + + /** + * Add a resource to the item. + * @type {ApplicationClickAction} + */ + static async #addResource() { + await this.document.update({ + 'system.resource': { type: 'simple', value: 0 } + }); + } + + /** + * Remove the resource from the item. + * @type {ApplicationClickAction} + */ + static async #removeResource() { + await this.document.update({ + 'system.resource': null }); } @@ -202,13 +235,30 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { if (featureItem) { const feature = this.document.system.features.find(x => x?.id === featureItem.id); if (!feature) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.notifications.featureIsMissing')); + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureIsMissing')); return; } const featureData = { type: 'Item', data: { ...feature.toObject(), _id: null }, fromInternal: true }; event.dataTransfer.setData('text/plain', JSON.stringify(featureData)); event.dataTransfer.setDragImage(featureItem.querySelector('img'), 60, 0); + } else { + const actionItem = event.currentTarget.closest('.action-item'); + if (actionItem) { + const action = this.document.system.actions[actionItem.dataset.index]; + if (!action) { + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.actionIsMissing')); + return; + } + + const actionData = { + type: 'Action', + data: { ...action.toObject(), id: action.id, itemUuid: this.document.uuid }, + fromInternal: true + }; + event.dataTransfer.setData('text/plain', JSON.stringify(actionData)); + event.dataTransfer.setDragImage(actionItem.querySelector('img'), 60, 0); + } } } diff --git a/module/applications/sheets/api/heritage-sheet.mjs b/module/applications/sheets/api/heritage-sheet.mjs index 349da194..8ac8d7d6 100644 --- a/module/applications/sheets/api/heritage-sheet.mjs +++ b/module/applications/sheets/api/heritage-sheet.mjs @@ -10,10 +10,6 @@ export default class DHHeritageSheet extends DHBaseItemSheet { static PARTS = { tabs: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }, description: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-description.hbs' }, - feature: { - template: 'systems/daggerheart/templates/sheets/global/tabs/tab-features.hbs', - scrollable: ['.feature'] - }, effects: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-effects.hbs', scrollable: ['.effects'] diff --git a/module/applications/sheets/api/item-attachment-sheet.mjs b/module/applications/sheets/api/item-attachment-sheet.mjs new file mode 100644 index 00000000..e9c3994c --- /dev/null +++ b/module/applications/sheets/api/item-attachment-sheet.mjs @@ -0,0 +1,85 @@ +export default function ItemAttachmentSheet(Base) { + return class extends Base { + static DEFAULT_OPTIONS = { + ...super.DEFAULT_OPTIONS, + dragDrop: [ + ...(super.DEFAULT_OPTIONS.dragDrop || []), + { dragSelector: null, dropSelector: '.attachments-section' } + ], + actions: { + ...super.DEFAULT_OPTIONS.actions, + removeAttachment: this.#removeAttachment + } + }; + + static PARTS = { + ...super.PARTS, + attachments: { + template: 'systems/daggerheart/templates/sheets/global/tabs/tab-attachments.hbs', + scrollable: ['.attachments'] + } + }; + + static TABS = { + ...super.TABS, + primary: { + ...super.TABS?.primary, + tabs: [...(super.TABS?.primary?.tabs || []), { id: 'attachments' }], + initial: super.TABS?.primary?.initial || 'description', + labelPrefix: super.TABS?.primary?.labelPrefix || 'DAGGERHEART.GENERAL.Tabs' + } + }; + + async _preparePartContext(partId, context) { + await super._preparePartContext(partId, context); + + if (partId === 'attachments') { + context.attachedItems = await prepareAttachmentContext(this.document); + } + + return context; + } + + async _onDrop(event) { + const data = TextEditor.getDragEventData(event); + + const attachmentsSection = event.target.closest('.attachments-section'); + if (!attachmentsSection) return super._onDrop(event); + + event.preventDefault(); + event.stopPropagation(); + + const item = await Item.implementation.fromDropData(data); + if (!item) return; + + // Call the data model's public method + await this.document.system.addAttachment(item); + } + + static async #removeAttachment(event, target) { + // Call the data model's public method + await this.document.system.removeAttachment(target.dataset.uuid); + } + + async _preparePartContext(partId, context) { + await super._preparePartContext(partId, context); + + if (partId === 'attachments') { + // Keep this simple UI preparation in the mixin + const attachedUUIDs = this.document.system.attached; + context.attachedItems = await Promise.all( + attachedUUIDs.map(async uuid => { + const item = await fromUuid(uuid); + return { + uuid: uuid, + name: item?.name || 'Unknown Item', + img: item?.img || 'icons/svg/item-bag.svg' + }; + }) + ); + } + + return context; + } + }; +} diff --git a/module/applications/sheets/items/ancestry.mjs b/module/applications/sheets/items/ancestry.mjs index 3636ea62..fc0b8a52 100644 --- a/module/applications/sheets/items/ancestry.mjs +++ b/module/applications/sheets/items/ancestry.mjs @@ -3,12 +3,80 @@ import DHHeritageSheet from '../api/heritage-sheet.mjs'; export default class AncestrySheet extends DHHeritageSheet { /**@inheritdoc */ static DEFAULT_OPTIONS = { - classes: ['ancestry'] + classes: ['ancestry'], + actions: { + editFeature: AncestrySheet.#editFeature, + removeFeature: AncestrySheet.#removeFeature + }, + dragDrop: [{ dragSelector: null, dropSelector: '.tab.features .drop-section' }] }; /**@inheritdoc */ static PARTS = { header: { template: 'systems/daggerheart/templates/sheets/items/ancestry/header.hbs' }, - ...super.PARTS + ...super.PARTS, + features: { template: 'systems/daggerheart/templates/sheets/items/ancestry/features.hbs' } }; + + /* -------------------------------------------- */ + /* Application Clicks Actions */ + /* -------------------------------------------- */ + + /** + * Edit an existing feature on the item + * @type {ApplicationClickAction} + */ + static async #editFeature(_event, button) { + const target = button.closest('.feature-item'); + const feature = this.document.system[`${target.dataset.type}Feature`]; + if (!feature || Object.keys(feature).length === 0) { + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureIsMissing')); + return; + } + + feature.sheet.render(true); + } + + /** + * Remove a feature from the item. + * @type {ApplicationClickAction} + */ + static async #removeFeature(event, button) { + event.stopPropagation(); + const target = button.closest('.feature-item'); + const feature = this.document.system[`${target.dataset.type}Feature`]; + + if (feature) await feature.update({ 'system.subType': null }); + await this.document.update({ + 'system.features': this.document.system.features.filter(x => x && x.uuid !== feature.uuid).map(x => x.uuid) + }); + } + + /* -------------------------------------------- */ + /* Application Drag/Drop */ + /* -------------------------------------------- */ + + /** + * On drop on the item. + * @param {DragEvent} event - The drag event + */ + async _onDrop(event) { + event.stopPropagation(); + const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); + + const item = await fromUuid(data.uuid); + if (item?.type === 'feature') { + const subType = event.target.closest('.primary-feature') ? 'primary' : 'secondary'; + if (item.system.subType && item.system.subType !== CONFIG.DH.ITEM.featureSubTypes[subType]) { + const error = subType === 'primary' ? 'featureNotPrimary' : 'featureNotSecondary'; + ui.notifications.warn(game.i18n.localize(`DAGGERHEART.UI.Notifications.${error}`)); + return; + } + + await item.update({ 'system.subType': subType }); + await this.document.update({ + 'system.features': [...this.document.system.features.map(x => x.uuid), item.uuid] + }); + } + } } diff --git a/module/applications/sheets/items/armor.mjs b/module/applications/sheets/items/armor.mjs index bb98c8c3..bdc482c3 100644 --- a/module/applications/sheets/items/armor.mjs +++ b/module/applications/sheets/items/armor.mjs @@ -1,10 +1,10 @@ import DHBaseItemSheet from '../api/base-item.mjs'; +import ItemAttachmentSheet from '../api/item-attachment-sheet.mjs'; -export default class ArmorSheet extends DHBaseItemSheet { +export default class ArmorSheet extends ItemAttachmentSheet(DHBaseItemSheet) { /**@inheritdoc */ static DEFAULT_OPTIONS = { classes: ['armor'], - dragDrop: [{ dragSelector: null, dropSelector: null }], tagifyConfigs: [ { selector: '.features-input', @@ -26,7 +26,12 @@ export default class ArmorSheet extends DHBaseItemSheet { settings: { template: 'systems/daggerheart/templates/sheets/items/armor/settings.hbs', scrollable: ['.settings'] - } + }, + effects: { + template: 'systems/daggerheart/templates/sheets/global/tabs/tab-effects.hbs', + scrollable: ['.effects'] + }, + ...super.PARTS }; /**@inheritdoc */ @@ -35,7 +40,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 +52,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/beastform.mjs b/module/applications/sheets/items/beastform.mjs index e3b72d01..8894b694 100644 --- a/module/applications/sheets/items/beastform.mjs +++ b/module/applications/sheets/items/beastform.mjs @@ -1,4 +1,5 @@ import DHBaseItemSheet from '../api/base-item.mjs'; +import Tagify from '@yaireo/tagify'; export default class BeastformSheet extends DHBaseItemSheet { /**@inheritdoc */ @@ -15,6 +16,7 @@ export default class BeastformSheet extends DHBaseItemSheet { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-features.hbs', scrollable: ['.features'] }, + advanced: { template: 'systems/daggerheart/templates/sheets/items/beastform/advanced.hbs' }, effects: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-effects.hbs', scrollable: ['.effects'] @@ -23,16 +25,77 @@ export default class BeastformSheet extends DHBaseItemSheet { static TABS = { primary: { - tabs: [{ id: 'settings' }, { id: 'features' }, { id: 'effects' }], + tabs: [{ id: 'settings' }, { id: 'features' }, { id: 'advanced' }, { id: 'effects' }], initial: 'settings', labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } }; + _attachPartListeners(partId, htmlElement, options) { + super._attachPartListeners(partId, htmlElement, options); + + const advantageOnInput = htmlElement.querySelector('.advantageon-input'); + if (advantageOnInput) { + const tagifyElement = new Tagify(advantageOnInput, { + tagTextProp: 'name', + templates: { + tag(tagData) { + return ` + +
+ ${tagData[this.settings.tagTextProp] || tagData.value} + ${tagData.src ? `` : ''} +
+
`; + } + } + }); + tagifyElement.on('add', this.advantageOnAdd.bind(this)); + tagifyElement.on('remove', this.advantageOnRemove.bind(this)); + } + } + /**@inheritdoc */ - async _preparePartContext(partId, context) { - await super._preparePartContext(partId, context); + async _preparePartContext(partId, context, options) { + await super._preparePartContext(partId, context, options); + + switch (partId) { + case 'settings': + context.advantageOn = JSON.stringify( + Object.keys(context.document.system.advantageOn).map(key => ({ + value: key, + name: context.document.system.advantageOn[key].value + })) + ); + break; + case 'effects': + context.effects.actives = context.effects.actives.map(effect => { + const data = effect.toObject(); + data.id = effect.id; + if (effect.type === 'beastform') data.mandatory = true; + + return data; + }); + break; + } return context; } + + async advantageOnAdd(event) { + await this.document.update({ + [`system.advantageOn.${foundry.utils.randomID()}`]: { value: event.detail.data.value } + }); + } + + async advantageOnRemove(event) { + await this.document.update({ + [`system.advantageOn.-=${event.detail.data.value}`]: null + }); + } } diff --git a/module/applications/sheets/items/class.mjs b/module/applications/sheets/items/class.mjs index c7b84340..1520844b 100644 --- a/module/applications/sheets/items/class.mjs +++ b/module/applications/sheets/items/class.mjs @@ -9,11 +9,7 @@ export default class ClassSheet extends DHBaseItemSheet { position: { width: 700 }, actions: { removeItemFromCollection: ClassSheet.#removeItemFromCollection, - removeSuggestedItem: ClassSheet.#removeSuggestedItem, - viewDoc: ClassSheet.#viewDoc, - addFeature: this.addFeature, - editFeature: this.editFeature, - deleteFeature: this.deleteFeature + removeSuggestedItem: ClassSheet.#removeSuggestedItem }, tagifyConfigs: [ { @@ -46,13 +42,17 @@ export default class ClassSheet extends DHBaseItemSheet { settings: { template: 'systems/daggerheart/templates/sheets/items/class/settings.hbs', scrollable: ['.settings'] + }, + effects: { + template: 'systems/daggerheart/templates/sheets/global/tabs/tab-effects.hbs', + scrollable: ['.effects'] } }; /** @inheritdoc */ static TABS = { primary: { - tabs: [{ id: 'description' }, { id: 'features' }, { id: 'settings' }], + tabs: [{ id: 'description' }, { id: 'features' }, { id: 'settings' }, { id: 'effects' }], initial: 'description', labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } @@ -78,6 +78,7 @@ export default class ClassSheet extends DHBaseItemSheet { /* -------------------------------------------- */ async _onDrop(event) { + event.stopPropagation(); const data = TextEditor.getDragEventData(event); const item = await fromUuid(data.uuid); const target = event.target.closest('fieldset.drop-section'); @@ -85,6 +86,28 @@ export default class ClassSheet extends DHBaseItemSheet { await this.document.update({ 'system.subclasses': [...this.document.system.subclasses.map(x => x.uuid), item.uuid] }); + } else if (item.type === 'feature') { + if (target.classList.contains('hope-feature')) { + if (item.system.subType && item.system.subType !== CONFIG.DH.ITEM.featureSubTypes.hope) { + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureNotHope')); + return; + } + + await item.update({ 'system.subType': CONFIG.DH.ITEM.featureSubTypes.hope }); + await this.document.update({ + 'system.features': [...this.document.system.features.map(x => x.uuid), item.uuid] + }); + } else if (target.classList.contains('class-feature')) { + if (item.system.subType && item.system.subType !== CONFIG.DH.ITEM.featureSubTypes.class) { + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureNotClass')); + return; + } + + await item.update({ 'system.subType': CONFIG.DH.ITEM.featureSubTypes.class }); + await this.document.update({ + 'system.features': [...this.document.system.features.map(x => x.uuid), item.uuid] + }); + } } else if (item.type === 'weapon') { if (target.classList.contains('primary-weapon-section')) { if (!this.document.system.characterGuide.suggestedPrimaryWeapon && !item.system.secondary) @@ -144,7 +167,7 @@ export default class ClassSheet extends DHBaseItemSheet { static async #removeItemFromCollection(_event, element) { const { uuid, target } = element.dataset; const prop = foundry.utils.getProperty(this.document.system, target); - await this.document.update({ [target]: prop.filter(i => i.uuid !== uuid) }); + await this.document.update({ [`system.${target}`]: prop.filter(i => i.uuid !== uuid) }); } /** @@ -156,56 +179,4 @@ export default class ClassSheet extends DHBaseItemSheet { const { target } = element.dataset; await this.document.update({ [`system.characterGuide.${target}`]: null }); } - - /** - * Open the sheet of a item by UUID. - * @param {PointerEvent} _event - - * @param {HTMLElement} button - */ - static async #viewDoc(_event, button) { - const doc = await fromUuid(button.dataset.uuid); - doc.sheet.render({ force: true }); - } - - getActionPath(type) { - return type === 'hope' ? 'hopeFeatures' : 'classFeatures'; - } - - static async addFeature(_, target) { - const actionPath = this.getActionPath(target.dataset.type); - const feature = await game.items.documentClass.create({ - type: 'feature', - name: game.i18n.format('DOCUMENT.New', { type: game.i18n.localize('TYPES.Item.feature') }) - }); - await this.document.update({ - [`system.${actionPath}`]: [ - ...this.document.system[actionPath].filter(x => x).map(x => x.uuid), - feature.uuid - ] - }); - } - - static async editFeature(_, button) { - const target = button.closest('.feature-item'); - const actionPath = this.getActionPath(button.dataset.type); - const feature = this.document.system[actionPath].find(x => x?.id === target.dataset.featureId); - if (!feature) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.notifications.featureIsMissing')); - return; - } - - feature.sheet.render(true); - } - - static async deleteFeature(event, button) { - event.stopPropagation(); - const target = button.closest('.feature-item'); - const actionPath = this.getActionPath(button.dataset.type); - - await this.document.update({ - [`system.${actionPath}`]: this.document.system[actionPath] - .filter(feature => feature && feature.id !== target.dataset.featureId) - .map(x => x.uuid) - }); - } } diff --git a/module/applications/sheets/items/community.mjs b/module/applications/sheets/items/community.mjs index 92c3731e..3650dec6 100644 --- a/module/applications/sheets/items/community.mjs +++ b/module/applications/sheets/items/community.mjs @@ -9,6 +9,10 @@ export default class CommunitySheet extends DHHeritageSheet { /**@inheritdoc */ static PARTS = { header: { template: 'systems/daggerheart/templates/sheets/items/community/header.hbs' }, - ...super.PARTS + ...super.PARTS, + features: { + template: 'systems/daggerheart/templates/sheets/global/tabs/tab-features.hbs', + scrollable: ['.feature'] + } }; } diff --git a/module/applications/sheets/items/consumable.mjs b/module/applications/sheets/items/consumable.mjs index f6fb1ba5..de09744c 100644 --- a/module/applications/sheets/items/consumable.mjs +++ b/module/applications/sheets/items/consumable.mjs @@ -19,6 +19,10 @@ export default class ConsumableSheet extends DHBaseItemSheet { settings: { template: 'systems/daggerheart/templates/sheets/items/consumable/settings.hbs', scrollable: ['.settings'] + }, + effects: { + template: 'systems/daggerheart/templates/sheets/global/tabs/tab-effects.hbs', + scrollable: ['.effects'] } }; } diff --git a/module/applications/sheets/items/feature.mjs b/module/applications/sheets/items/feature.mjs index a54c3bcb..fcbec97f 100644 --- a/module/applications/sheets/items/feature.mjs +++ b/module/applications/sheets/items/feature.mjs @@ -1,5 +1,3 @@ -import { actionsTypes } from '../../../data/action/_module.mjs'; -import DHActionConfig from '../../sheets-configs/action-config.mjs'; import DHBaseItemSheet from '../api/base-item.mjs'; export default class FeatureSheet extends DHBaseItemSheet { @@ -7,13 +5,7 @@ export default class FeatureSheet extends DHBaseItemSheet { static DEFAULT_OPTIONS = { id: 'daggerheart-feature', classes: ['feature'], - position: { height: 600 }, - window: { resizable: true }, - actions: { - addAction: FeatureSheet.#addAction, - editAction: FeatureSheet.#editAction, - removeAction: FeatureSheet.#removeAction - } + actions: {} }; /**@override */ @@ -21,6 +13,7 @@ export default class FeatureSheet extends DHBaseItemSheet { header: { template: 'systems/daggerheart/templates/sheets/items/feature/header.hbs' }, tabs: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }, description: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-description.hbs' }, + settings: { template: 'systems/daggerheart/templates/sheets/items/feature/settings.hbs' }, actions: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-actions.hbs', scrollable: ['.actions'] @@ -34,97 +27,9 @@ export default class FeatureSheet extends DHBaseItemSheet { /**@override */ static TABS = { primary: { - tabs: [{ id: 'description' }, { id: 'actions' }, { id: 'effects' }], + tabs: [{ id: 'description' }, { id: 'settings' }, { id: 'actions' }, { id: 'effects' }], initial: 'description', labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } }; - - /* -------------------------------------------- */ - - /**@inheritdoc */ - async _prepareContext(_options) { - const context = await super._prepareContext(_options); - - return context; - } - - /* -------------------------------------------- */ - /* Application Clicks Actions */ - /* -------------------------------------------- */ - - /** - * Render a dialog prompting the user to select an action type. - * - * @returns {Promise} An object containing the selected action type. - */ - static async selectActionType() { - const content = await foundry.applications.handlebars.renderTemplate( - 'systems/daggerheart/templates/actionTypes/actionType.hbs', - { types: CONFIG.DH.ACTIONS.actionTypes } - ), - title = 'Select Action Type'; - - return foundry.applications.api.DialogV2.prompt({ - window: { title }, - content, - ok: { - label: title, - callback: (event, button, dialog) => button.form.elements.type.value - } - }); - } - - /** - * Add a new action to the item, prompting the user for its type. - * @param {PointerEvent} _event - The originating click event - * @param {HTMLElement} _button - The capturing HTML element which defines the [data-action="addAction"] - */ - static async #addAction(_event, _button) { - const actionType = await FeatureSheet.selectActionType(); - if (!actionType) return; - try { - const cls = actionsTypes[actionType] ?? actionsTypes.attack, - action = new cls( - { - _id: foundry.utils.randomID(), - type: actionType, - name: game.i18n.localize(CONFIG.DH.ACTIONS.actionTypes[actionType].name), - ...cls.getSourceConfig(this.document) - }, - { - parent: this.document - } - ); - await this.document.update({ 'system.actions': [...this.document.system.actions, action] }); - await new DHActionConfig(this.document.system.actions[this.document.system.actions.length - 1]).render({ - force: true - }); - } catch (error) { - console.log(error); - } - } - - /** - * Edit an existing action on the item - * @param {PointerEvent} _event - The originating click event - * @param {HTMLElement} button - The capturing HTML element which defines the [data-action="editAction"] - */ - static async #editAction(_event, button) { - const action = this.document.system.actions[button.dataset.index]; - await new DHActionConfig(action).render({ force: true }); - } - - /** - * Remove an action from the item. - * @param {PointerEvent} event - The originating click event - * @param {HTMLElement} button - The capturing HTML element which defines the [data-action="removeAction"] - */ - static async #removeAction(event, button) { - event.stopPropagation(); - const actionIndex = button.closest('[data-index]').dataset.index; - await this.document.update({ - 'system.actions': this.document.system.actions.filter((_, index) => index !== Number.parseInt(actionIndex)) - }); - } } diff --git a/module/applications/sheets/items/miscellaneous.mjs b/module/applications/sheets/items/miscellaneous.mjs index 62df4e8c..0b4b3139 100644 --- a/module/applications/sheets/items/miscellaneous.mjs +++ b/module/applications/sheets/items/miscellaneous.mjs @@ -19,6 +19,10 @@ export default class MiscellaneousSheet extends DHBaseItemSheet { settings: { template: 'systems/daggerheart/templates/sheets/items/miscellaneous/settings.hbs', scrollable: ['.settings'] + }, + effects: { + template: 'systems/daggerheart/templates/sheets/global/tabs/tab-effects.hbs', + scrollable: ['.effects'] } }; } diff --git a/module/applications/sheets/items/subclass.mjs b/module/applications/sheets/items/subclass.mjs index 7761dcbc..585bd6cb 100644 --- a/module/applications/sheets/items/subclass.mjs +++ b/module/applications/sheets/items/subclass.mjs @@ -6,11 +6,7 @@ export default class SubclassSheet extends DHBaseItemSheet { classes: ['subclass'], position: { width: 600 }, window: { resizable: false }, - actions: { - addFeature: this.addFeature, - editFeature: this.editFeature, - deleteFeature: this.deleteFeature - } + actions: {} }; /**@override */ @@ -25,53 +21,29 @@ export default class SubclassSheet extends DHBaseItemSheet { settings: { template: 'systems/daggerheart/templates/sheets/items/subclass/settings.hbs', scrollable: ['.settings'] + }, + effects: { + template: 'systems/daggerheart/templates/sheets/global/tabs/tab-effects.hbs', + scrollable: ['.effects'] } }; /** @inheritdoc */ static TABS = { primary: { - tabs: [{ id: 'description' }, { id: 'features' }, { id: 'settings' }], + tabs: [{ id: 'description' }, { id: 'features' }, { id: 'settings' }, { id: 'effects' }], initial: 'description', labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } }; - static async addFeature(_, target) { - const feature = await game.items.documentClass.create({ - type: 'feature', - name: game.i18n.format('DOCUMENT.New', { type: game.i18n.localize('TYPES.Item.feature') }) - }); - await this.document.update({ - [`system.${target.dataset.type}`]: feature.uuid - }); - } - - static async editFeature(_, button) { - const feature = this.document.system[button.dataset.type]; - if (!feature) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.notifications.featureIsMissing')); - return; - } - - feature.sheet.render(true); - } - - static async deleteFeature(event, button) { - event.stopPropagation(); - - await this.document.update({ - [`system.${button.dataset.type}`]: null - }); - } - async _onDragStart(event) { const featureItem = event.currentTarget.closest('.drop-section'); if (featureItem) { const feature = this.document.system[featureItem.dataset.type]; if (!feature) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.notifications.featureIsMissing')); + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureIsMissing')); return; } @@ -82,18 +54,45 @@ export default class SubclassSheet extends DHBaseItemSheet { } async _onDrop(event) { + event.stopPropagation(); + const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); if (data.fromInternal) return; const item = await fromUuid(data.uuid); - if (item?.type === 'feature') { - const dropSection = event.target.closest('.drop-section'); - if (this.document.system[dropSection.dataset.type]) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.notifications.featureIsFull')); - return; - } + const target = event.target.closest('fieldset.drop-section'); + if (item.type === 'feature') { + if (target.dataset.type === 'foundation') { + if (item.system.subType && item.system.subType !== CONFIG.DH.ITEM.featureSubTypes.foundation) { + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureNotFoundation')); + return; + } - await this.document.update({ [`system.${dropSection.dataset.type}`]: item.uuid }); + await item.update({ 'system.subType': CONFIG.DH.ITEM.featureSubTypes.foundation }); + await this.document.update({ + 'system.features': [...this.document.system.features.map(x => x.uuid), item.uuid] + }); + } else if (target.dataset.type === 'specialization') { + if (item.system.subType && item.system.subType !== CONFIG.DH.ITEM.featureSubTypes.specialization) { + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureNotSpecialization')); + return; + } + + await item.update({ 'system.subType': CONFIG.DH.ITEM.featureSubTypes.specialization }); + await this.document.update({ + 'system.features': [...this.document.system.features.map(x => x.uuid), item.uuid] + }); + } else if (target.dataset.type === 'mastery') { + if (item.system.subType && item.system.subType !== CONFIG.DH.ITEM.featureSubTypes.mastery) { + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureNotMastery')); + return; + } + + await item.update({ 'system.subType': CONFIG.DH.ITEM.featureSubTypes.mastery }); + await this.document.update({ + 'system.features': [...this.document.system.features.map(x => x.uuid), item.uuid] + }); + } } } } diff --git a/module/applications/sheets/items/weapon.mjs b/module/applications/sheets/items/weapon.mjs index d5d09dab..2533287b 100644 --- a/module/applications/sheets/items/weapon.mjs +++ b/module/applications/sheets/items/weapon.mjs @@ -1,6 +1,7 @@ import DHBaseItemSheet from '../api/base-item.mjs'; +import ItemAttachmentSheet from '../api/item-attachment-sheet.mjs'; -export default class WeaponSheet extends DHBaseItemSheet { +export default class WeaponSheet extends ItemAttachmentSheet(DHBaseItemSheet) { /**@inheritdoc */ static DEFAULT_OPTIONS = { classes: ['weapon'], @@ -25,15 +26,20 @@ export default class WeaponSheet extends DHBaseItemSheet { settings: { template: 'systems/daggerheart/templates/sheets/items/weapon/settings.hbs', scrollable: ['.settings'] - } + }, + effects: { + template: 'systems/daggerheart/templates/sheets/global/tabs/tab-effects.hbs', + scrollable: ['.effects'] + }, + ...super.PARTS }; /**@inheritdoc */ async _preparePartContext(partId, context) { - super._preparePartContext(partId, context); + await 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 +51,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/_module.mjs b/module/applications/ui/_module.mjs index f1c32840..6a17a61e 100644 --- a/module/applications/ui/_module.mjs +++ b/module/applications/ui/_module.mjs @@ -2,3 +2,4 @@ export { default as DhChatLog } from './chatLog.mjs'; export { default as DhCombatTracker } from './combatTracker.mjs'; export * as DhCountdowns from './countdowns.mjs'; export { default as DhFearTracker } from './fearTracker.mjs'; +export { default as DhHotbar } from './hotbar.mjs'; diff --git a/module/applications/ui/chatLog.mjs b/module/applications/ui/chatLog.mjs index 4de02755..26db4d76 100644 --- a/module/applications/ui/chatLog.mjs +++ b/module/applications/ui/chatLog.mjs @@ -1,6 +1,6 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLog { - constructor() { - super(); + constructor(options) { + super(options); this.targetTemplate = { activeLayer: undefined, @@ -83,15 +83,15 @@ 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; } onRollDamage = async (event, message) => { event.stopPropagation(); const actor = await this.getActor(message.system.source.actor); - if (!actor || !game.user.isGM) return true; + if (game.user.character?.id !== actor.id && !game.user.isGM) return true; if (message.system.source.item && message.system.source.action) { const action = this.getAction(actor, message.system.source.item, message.system.source.action); if (!action || !action?.rollDamage) return; @@ -190,7 +190,6 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo ui.notifications.info(game.i18n.localize('DAGGERHEART.UI.Notifications.attackTargetDoesNotExist')); return; } - game.canvas.pan(token); }; @@ -212,13 +211,25 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo } if (targets.length === 0) - ui.notifications.info(game.i18n.localize('DAGGERHEART.UI.Notifications.noTargetsSelected')); - for (let target of targets) { - let damage = message.system.roll.total; - if (message.system.onSave && message.system.targets.find(t => t.id === target.id)?.saved?.success === true) - damage = Math.ceil(damage * (CONFIG.DH.ACTIONS.damageOnSave[message.system.onSave]?.mod ?? 1)); + return ui.notifications.info(game.i18n.localize('DAGGERHEART.UI.Notifications.noTargetsSelected')); - await target.actor.takeDamage(damage, message.system.roll.type); + for (let target of targets) { + let damages = foundry.utils.deepClone(message.system.damage?.roll ?? message.system.roll); + if ( + message.system.onSave && + message.system.targets.find(t => t.id === target.id)?.saved?.success === true + ) { + const mod = CONFIG.DH.ACTIONS.damageOnSave[message.system.onSave]?.mod ?? 1; + Object.entries(damages).forEach(([k, v]) => { + v.total = 0; + v.parts.forEach(part => { + part.total = Math.ceil(part.total * mod); + v.total += part.total; + }); + }); + } + + target.actor.takeDamage(damages); } }; @@ -227,10 +238,10 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo const targets = Array.from(game.user.targets); if (targets.length === 0) - ui.notifications.info(game.i18n.localize('DAGGERHEART.UI.Notifications.noTargetsSelected')); + return ui.notifications.info(game.i18n.localize('DAGGERHEART.UI.Notifications.noTargetsSelected')); for (var target of targets) { - await target.actor.takeHealing([{ value: message.system.roll.total, type: message.system.roll.type }]); + target.actor.takeHealing(message.system.roll); } }; @@ -289,53 +300,54 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo await actor.useAction(action); }; - actionUseButton = async (_, message) => { + actionUseButton = async (event, message) => { + const { moveIndex, actionIndex } = event.currentTarget.dataset; const parent = await foundry.utils.fromUuid(message.system.actor); - const actionType = Object.values(message.system.moves)[0].actions[0]; - const cls = CONFIG.DH.ACTIONS.actionTypes[actionType.type]; + const actionType = message.system.moves[moveIndex].actions[actionIndex]; + const cls = game.system.api.models.actions.actionsTypes[actionType.type]; const action = new cls( { ...actionType, _id: foundry.utils.randomID(), name: game.i18n.localize(actionType.name) }, - { parent: parent } + { parent: parent.system } ); - action.use(); + action.use(event); }; //Reroll Functionality - rerollEvent = async(event,message)=> { - let DieTerm=foundry.dice.terms.Die; + rerollEvent = async (event, message) => { + let DieTerm = foundry.dice.terms.Die; let dicetype = event.target.value; - let originalRoll_parsed=message.rolls.map(roll => JSON.parse(roll))[0]; - console.log("Parsed Map:",originalRoll_parsed); - let originalRoll=Roll.fromData(originalRoll_parsed); + let originalRoll_parsed = message.rolls.map(roll => JSON.parse(roll))[0]; + console.log('Parsed Map:', originalRoll_parsed); + let originalRoll = Roll.fromData(originalRoll_parsed); let diceIndex; - console.log("Dice to reroll is:",dicetype,", and the message id is:",message._id,originalRoll_parsed); - console.log("Original Roll Terms:",originalRoll.terms); - switch(dicetype){ - case "hope": { - diceIndex=0; //Hope Die + console.log('Dice to reroll is:', dicetype, ', and the message id is:', message._id, originalRoll_parsed); + console.log('Original Roll Terms:', originalRoll.terms); + switch (dicetype) { + case 'hope': { + diceIndex = 0; //Hope Die break; - }; - case "fear" :{ - diceIndex=2; //Fear Die + } + case 'fear': { + diceIndex = 2; //Fear Die break; - }; - default: - ui.notifications.warn("Invalid Dice type selected."); + } + default: + ui.notifications.warn('Invalid Dice type selected.'); break; } - let rollClone=originalRoll.clone(); - let rerolledTerm=originalRoll.terms[diceIndex]; - console.log("originalRoll:",originalRoll,"rerolledTerm",rerolledTerm); + let rollClone = originalRoll.clone(); + let rerolledTerm = originalRoll.terms[diceIndex]; + console.log('originalRoll:', originalRoll, 'rerolledTerm', rerolledTerm); if (!(rerolledTerm instanceof DieTerm)) { - ui.notifications.error("Selected term is not a die."); + ui.notifications.error('Selected term is not a die.'); return; } - await rollClone.reroll({allowStrings:true})[diceIndex]; + await rollClone.reroll({ allowStrings: true })[diceIndex]; console.log(rollClone); - await rollClone.evaluate({allowStrings:true}); + await rollClone.evaluate({ allowStrings: true }); console.log(rollClone.result); - /* + /* const confirm = await foundry.applications.api.DialogV2.confirm({ window: { title: 'Confirm Reroll' }, content: `

You have rerolled your ${dicetype} die to ${rollClone.result}.

Apply this new roll?

` @@ -343,5 +355,5 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo if (!confirm) return; rollClone.toMessage({flavor: 'Selective reroll applied for ${dicetype}.'}); console.log("Updated Roll",rollClone);*/ - } + }; } diff --git a/module/applications/ui/combatTracker.mjs b/module/applications/ui/combatTracker.mjs index f9f49ad1..b3348fe2 100644 --- a/module/applications/ui/combatTracker.mjs +++ b/module/applications/ui/combatTracker.mjs @@ -66,6 +66,11 @@ export default class DhCombatTracker extends foundry.applications.sidebar.tabs.C } async setCombatantSpotlight(combatantId) { + const update = { + system: { + 'spotlight.requesting': false + } + }; const combatant = this.viewed.combatants.get(combatantId); const toggleTurn = this.viewed.combatants.contents @@ -73,10 +78,18 @@ export default class DhCombatTracker extends foundry.applications.sidebar.tabs.C .map(x => x.id) .indexOf(combatantId); - if (this.viewed.turn !== toggleTurn) Hooks.callAll(CONFIG.DH.HOOKS.spotlight, {}); + if (this.viewed.turn !== toggleTurn) { + const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns; + await updateCountdowns(CONFIG.DH.GENERAL.countdownTypes.spotlight.id); + + const autoPoints = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).actionPoints; + if (autoPoints) { + update.system.actionTokens = Math.max(combatant.system.actionTokens - 1, 0); + } + } await this.viewed.update({ turn: this.viewed.turn === toggleTurn ? null : toggleTurn }); - await combatant.update({ 'system.spotlight.requesting': false }); + await combatant.update(update); } static async requestSpotlight(_, target) { diff --git a/module/applications/ui/countdowns.mjs b/module/applications/ui/countdowns.mjs index c229cda1..5e3ad1ab 100644 --- a/module/applications/ui/countdowns.mjs +++ b/module/applications/ui/countdowns.mjs @@ -1,4 +1,3 @@ -import { countdownTypes } from '../../config/generalConfig.mjs'; import { GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs'; import constructHTMLButton from '../../helpers/utils.mjs'; import OwnershipSelection from '../dialogs/ownershipSelection.mjs'; @@ -328,43 +327,29 @@ export class EncounterCountdowns extends Countdowns { }; } -export const registerCountdownApplicationHooks = () => { - const updateCountdowns = async shouldProgress => { - if (game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).countdowns) { - const countdownSetting = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns); - for (let countdownCategoryKey in countdownSetting) { - const countdownCategory = countdownSetting[countdownCategoryKey]; - for (let countdownKey in countdownCategory.countdowns) { - const countdown = countdownCategory.countdowns[countdownKey]; - - if (shouldProgress(countdown)) { - await countdownSetting.updateSource({ - [`${countdownCategoryKey}.countdowns.${countdownKey}.progress.current`]: - countdown.progress.current - 1 - }); - await game.settings.set( - CONFIG.DH.id, - CONFIG.DH.SETTINGS.gameSettings.Countdowns, - countdownSetting - ); - foundry.applications.instances.get(`${countdownCategoryKey}-countdowns`)?.render(); - } +export async function updateCountdowns(progressType) { + const countdownSetting = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns); + const update = Object.keys(countdownSetting).reduce((update, typeKey) => { + return foundry.utils.mergeObject( + update, + Object.keys(countdownSetting[typeKey].countdowns).reduce((acc, countdownKey) => { + const countdown = countdownSetting[typeKey].countdowns[countdownKey]; + if (countdown.progress.current > 0 && countdown.progress.type.value === progressType) { + acc[`${typeKey}.countdowns.${countdownKey}.progress.current`] = countdown.progress.current - 1; } - } - } - }; - Hooks.on(CONFIG.DH.HOOKS.characterAttack, async () => { - updateCountdowns(countdown => { - return ( - countdown.progress.type.value === countdownTypes.characterAttack.id && countdown.progress.current > 0 - ); - }); - }); + return acc; + }, {}) + ); + }, {}); - Hooks.on(CONFIG.DH.HOOKS.spotlight, async () => { - updateCountdowns(countdown => { - return countdown.progress.type.value === countdownTypes.spotlight.id && countdown.progress.current > 0; - }); + await countdownSetting.updateSource(update); + await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns, countdownSetting); + + const data = { refreshType: RefreshType.Countdown }; + await game.socket.emit(`system.${CONFIG.DH.id}`, { + action: socketEvent.Refresh, + data }); -}; + Hooks.callAll(socketEvent.Refresh, data); +} diff --git a/module/applications/ui/hotbar.mjs b/module/applications/ui/hotbar.mjs new file mode 100644 index 00000000..9d102c6c --- /dev/null +++ b/module/applications/ui/hotbar.mjs @@ -0,0 +1,129 @@ +export default class DhHotbar extends foundry.applications.ui.Hotbar { + constructor(options) { + super(options); + + this.setupHooks(); + } + + static async useItem(uuid) { + const item = await fromUuid(uuid); + if (!item) { + return ui.notifications.warn('WARNING.ObjectDoesNotExist', { + format: { + name: game.i18n.localize('Document'), + identifier: uuid + } + }); + } + + await item.use({}); + } + + static async useAction(itemUuid, actionId) { + const item = await foundry.utils.fromUuid(itemUuid); + if (!item) { + return ui.notifications.warn('WARNING.ObjectDoesNotExist', { + format: { + name: game.i18n.localize('Document'), + identifier: itemUuid + } + }); + } + + const action = item.system.actions.find(x => x.id === actionId); + if (!action) { + return ui.notifications.warn('DAGGERHEART.UI.Notifications.actionIsMissing'); + } + + await action.use({}); + } + + static async useAttack(actorUuid) { + const actor = await foundry.utils.fromUuid(actorUuid); + if (!actor) { + return ui.notifications.warn('WARNING.ObjectDoesNotExist', { + format: { + name: game.i18n.localize('Document'), + identifier: actorUuid + } + }); + } + + const attack = actor.system.attack; + if (!attack) { + return ui.notifications.warn('DAGGERHEART.UI.Notifications.attackIsMissing'); + } + + await attack.use({}); + } + + setupHooks() { + Hooks.on('hotbarDrop', (bar, data, slot) => { + if (data.type === 'Item') { + const item = foundry.utils.fromUuidSync(data.uuid); + if (item.uuid.startsWith('Compendium') || !item.isOwned || !item.isOwner) return true; + + switch (item.type) { + case 'ancestry': + case 'community': + case 'class': + case 'subclass': + return true; + default: + this.createItemMacro(item, slot); + return false; + } + } else if (data.type === 'Action') { + const item = foundry.utils.fromUuidSync(data.data.itemUuid); + if (item.uuid.startsWith('Compendium')) return true; + if (!item.isOwned || !item.isOwner) { + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.unownedActionMacro')); + return false; + } + + this.createActionMacro(data, slot); + return false; + } else if (data.type === 'Attack') { + const actor = foundry.utils.fromUuidSync(data.actorUuid); + if (actor.uuid.startsWith('Compendium')) return true; + if (!actor.isOwner) { + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.unownedAttackMacro')); + return false; + } + + this.createAttackMacro(data, slot); + return false; + } + }); + } + + async createItemMacro(data, slot) { + const macro = await Macro.implementation.create({ + name: data.name, + type: CONST.MACRO_TYPES.SCRIPT, + img: data.img, + command: `await game.system.api.applications.ui.DhHotbar.useItem("${data.uuid}");` + }); + await game.user.assignHotbarMacro(macro, slot); + } + + async createActionMacro(data, slot) { + const macro = await Macro.implementation.create({ + name: data.data.name, + type: CONST.MACRO_TYPES.SCRIPT, + img: data.data.img, + command: `await game.system.api.applications.ui.DhHotbar.useAction("${data.data.itemUuid}", "${data.data.id}");` + }); + await game.user.assignHotbarMacro(macro, slot); + } + + async createAttackMacro(data, slot) { + const macro = await Macro.implementation.create({ + name: data.name, + type: CONST.MACRO_TYPES.SCRIPT, + img: data.img, + command: `await game.system.api.applications.ui.DhHotbar.useAttack("${data.actorUuid}");` + }); + await game.user.assignHotbarMacro(macro, slot); + } +} diff --git a/module/applications/ux/contextMenu.mjs b/module/applications/ux/contextMenu.mjs index a913c450..09454848 100644 --- a/module/applications/ux/contextMenu.mjs +++ b/module/applications/ux/contextMenu.mjs @@ -100,7 +100,7 @@ export default class DHContextMenu extends foundry.applications.ux.ContextMenu { event.preventDefault(); event.stopPropagation(); const { clientX, clientY } = event; - const selector = '[data-item-id]'; + const selector = '[data-item-uuid]'; const target = event.target.closest(selector) ?? event.currentTarget.closest(selector); target?.dispatchEvent( new PointerEvent('contextmenu', { diff --git a/module/canvas/placeables/_module.mjs b/module/canvas/placeables/_module.mjs index 1da3a1e9..78242839 100644 --- a/module/canvas/placeables/_module.mjs +++ b/module/canvas/placeables/_module.mjs @@ -1,3 +1,5 @@ export { default as DhMeasuredTemplate } from './measuredTemplate.mjs'; export { default as DhRuler } from './ruler.mjs'; +export { default as DhTemplateLayer } from './templateLayer.mjs'; +export { default as DhTokenPlaceable } from './token.mjs'; export { default as DhTokenRuler } from './tokenRuler.mjs'; diff --git a/module/canvas/placeables/templateLayer.mjs b/module/canvas/placeables/templateLayer.mjs new file mode 100644 index 00000000..551a06cc --- /dev/null +++ b/module/canvas/placeables/templateLayer.mjs @@ -0,0 +1,116 @@ +export default class DhTemplateLayer extends foundry.canvas.layers.TemplateLayer { + static prepareSceneControls() { + const sc = foundry.applications.ui.SceneControls; + return { + name: 'templates', + order: 2, + title: 'CONTROLS.GroupMeasure', + icon: 'fa-solid fa-ruler-combined', + visible: game.user.can('TEMPLATE_CREATE'), + onChange: (event, active) => { + if (active) canvas.templates.activate(); + }, + onToolChange: () => canvas.templates.setAllRenderFlags({ refreshState: true }), + tools: { + circle: { + name: 'circle', + order: 1, + title: 'CONTROLS.MeasureCircle', + icon: 'fa-regular fa-circle', + toolclip: { + src: 'toolclips/tools/measure-circle.webm', + heading: 'CONTROLS.MeasureCircle', + items: sc.buildToolclipItems(['create', 'move', 'edit', 'hide', 'delete']) + } + }, + cone: { + name: 'cone', + order: 2, + title: 'CONTROLS.MeasureCone', + icon: 'fa-solid fa-angle-left', + toolclip: { + src: 'toolclips/tools/measure-cone.webm', + heading: 'CONTROLS.MeasureCone', + items: sc.buildToolclipItems(['create', 'move', 'edit', 'hide', 'delete', 'rotate']) + } + }, + inFront: { + name: 'inFront', + order: 3, + title: 'CONTROLS.inFront', + icon: 'fa-solid fa-eye', + toolclip: { + src: 'toolclips/tools/measure-cone.webm', + heading: 'CONTROLS.inFront', + items: sc.buildToolclipItems(['create', 'move', 'edit', 'hide', 'delete', 'rotate']) + } + }, + rect: { + name: 'rect', + order: 4, + title: 'CONTROLS.MeasureRect', + icon: 'fa-regular fa-square', + toolclip: { + src: 'toolclips/tools/measure-rect.webm', + heading: 'CONTROLS.MeasureRect', + items: sc.buildToolclipItems(['create', 'move', 'edit', 'hide', 'delete', 'rotate']) + } + }, + ray: { + name: 'ray', + order: 5, + title: 'CONTROLS.MeasureRay', + icon: 'fa-solid fa-up-down', + toolclip: { + src: 'toolclips/tools/measure-ray.webm', + heading: 'CONTROLS.MeasureRay', + items: sc.buildToolclipItems(['create', 'move', 'edit', 'hide', 'delete', 'rotate']) + } + }, + clear: { + name: 'clear', + order: 6, + title: 'CONTROLS.MeasureClear', + icon: 'fa-solid fa-trash', + visible: game.user.isGM, + onChange: () => canvas.templates.deleteAll(), + button: true + } + }, + activeTool: 'circle' + }; + } + + _onDragLeftStart(event) { + const interaction = event.interactionData; + + // Snap the origin to the grid + if (!event.shiftKey) interaction.origin = this.getSnappedPoint(interaction.origin); + + // Create a pending MeasuredTemplateDocument + const tool = game.activeTool === 'inFront' ? 'cone' : game.activeTool; + const previewData = { + user: game.user.id, + t: tool, + x: interaction.origin.x, + y: interaction.origin.y, + sort: Math.max(this.getMaxSort() + 1, 0), + distance: 1, + direction: 0, + fillColor: game.user.color || '#FF0000', + hidden: event.altKey + }; + const defaults = CONFIG.MeasuredTemplate.defaults; + if (game.activeTool === 'cone') previewData.angle = defaults.angle; + else if (game.activeTool === 'inFront') previewData.angle = 180; + else if (game.activeTool === 'ray') previewData.width = defaults.width * canvas.dimensions.distance; + const cls = foundry.utils.getDocumentClass('MeasuredTemplate'); + const doc = new cls(previewData, { parent: canvas.scene }); + + // Create a preview MeasuredTemplate object + const template = new this.constructor.placeableClass(doc); + doc._object = template; + interaction.preview = this.preview.addChild(template); + template.draw(); + } +} diff --git a/module/canvas/placeables/token.mjs b/module/canvas/placeables/token.mjs new file mode 100644 index 00000000..967df0f8 --- /dev/null +++ b/module/canvas/placeables/token.mjs @@ -0,0 +1,36 @@ +export default class DhTokenPlaceable extends foundry.canvas.placeables.Token { + /** @inheritDoc */ + async _drawEffects() { + this.effects.renderable = false; + + // Clear Effects Container + this.effects.removeChildren().forEach(c => c.destroy()); + this.effects.bg = this.effects.addChild(new PIXI.Graphics()); + this.effects.bg.zIndex = -1; + this.effects.overlay = null; + + // Categorize effects + const activeEffects = this.actor ? Array.from(this.actor.effects).filter(x => !x.disabled) : []; + const overlayEffect = activeEffects.findLast(e => e.img && e.getFlag('core', 'overlay')); + + // Draw effects + const promises = []; + for (const [i, effect] of activeEffects.entries()) { + if (!effect.img) continue; + const promise = + effect === overlayEffect + ? this._drawOverlay(effect.img, effect.tint) + : this._drawEffect(effect.img, effect.tint); + promises.push( + promise.then(e => { + if (e) e.zIndex = i; + }) + ); + } + await Promise.allSettled(promises); + + this.effects.sortChildren(); + this.effects.renderable = true; + this.renderFlags.set({ refreshEffects: true }); + } +} diff --git a/module/config/_module.mjs b/module/config/_module.mjs index 88003595..99069dda 100644 --- a/module/config/_module.mjs +++ b/module/config/_module.mjs @@ -4,7 +4,6 @@ export * as domainConfig from './domainConfig.mjs'; export * as effectConfig from './effectConfig.mjs'; export * as flagsConfig from './flagsConfig.mjs'; export * as generalConfig from './generalConfig.mjs'; -export * as hooksConfig from './hooksConfig.mjs'; export * as itemConfig from './itemConfig.mjs'; export * as settingsConfig from './settingsConfig.mjs'; export * as systemConfig from './system.mjs'; diff --git a/module/config/actorConfig.mjs b/module/config/actorConfig.mjs index 7a179308..edf3a9f3 100644 --- a/module/config/actorConfig.mjs +++ b/module/config/actorConfig.mjs @@ -1,5 +1,6 @@ export const abilities = { agility: { + id: 'agility', label: 'DAGGERHEART.CONFIG.Traits.agility.name', verbs: [ 'DAGGERHEART.CONFIG.Traits.agility.verb.sprint', @@ -8,6 +9,7 @@ export const abilities = { ] }, strength: { + id: 'strength', label: 'DAGGERHEART.CONFIG.Traits.strength.name', verbs: [ 'DAGGERHEART.CONFIG.Traits.strength.verb.lift', @@ -16,6 +18,7 @@ export const abilities = { ] }, finesse: { + id: 'finesse', label: 'DAGGERHEART.CONFIG.Traits.finesse.name', verbs: [ 'DAGGERHEART.CONFIG.Traits.finesse.verb.control', @@ -24,6 +27,7 @@ export const abilities = { ] }, instinct: { + id: 'instinct', label: 'DAGGERHEART.CONFIG.Traits.instinct.name', verbs: [ 'DAGGERHEART.CONFIG.Traits.instinct.verb.perceive', @@ -32,6 +36,7 @@ export const abilities = { ] }, presence: { + id: 'presence', label: 'DAGGERHEART.CONFIG.Traits.presence.name', verbs: [ 'DAGGERHEART.CONFIG.Traits.presence.verb.charm', @@ -40,6 +45,7 @@ export const abilities = { ] }, knowledge: { + id: 'knowledge', label: 'DAGGERHEART.CONFIG.Traits.knowledge.name', verbs: [ 'DAGGERHEART.CONFIG.Traits.knowledge.verb.recall', @@ -113,7 +119,7 @@ export const adversaryTypes = { }, social: { id: 'social', - label: 'DAGGERHEART.CONFIG.AdversaryTypee.social.label', + label: 'DAGGERHEART.CONFIG.AdversaryType.social.label', description: 'DAGGERHEART.ACTORS.Adversary.social.description' }, solo: { @@ -411,7 +417,7 @@ export const levelupData = { }; export const subclassFeatureLabels = { - 1: 'DAGGERHEART.ITEMS.DomainCard.foundation', + 1: 'DAGGERHEART.ITEMS.DomainCard.foundationTitle', 2: 'DAGGERHEART.ITEMS.DomainCard.specializationTitle', 3: 'DAGGERHEART.ITEMS.DomainCard.masteryTitle' }; diff --git a/module/config/domainConfig.mjs b/module/config/domainConfig.mjs index 6c8b8bfd..2387e00f 100644 --- a/module/config/domainConfig.mjs +++ b/module/config/domainConfig.mjs @@ -3,55 +3,55 @@ export const domains = { id: 'arcana', label: 'DAGGERHEART.GENERAL.Domain.arcana.label', src: 'systems/daggerheart/assets/icons/domains/arcana.svg', - description: 'DAGGERHEART.GENERAL.Domain.Arcana' + description: 'DAGGERHEART.GENERAL.Domain.arcana.description' }, blade: { id: 'blade', label: 'DAGGERHEART.GENERAL.Domain.blade.label', src: 'systems/daggerheart/assets/icons/domains/blade.svg', - description: 'DAGGERHEART.GENERAL.Domain.Blade' + description: 'DAGGERHEART.GENERAL.Domain.blade.description' }, bone: { id: 'bone', label: 'DAGGERHEART.GENERAL.Domain.bone.label', src: 'systems/daggerheart/assets/icons/domains/bone.svg', - description: 'DAGGERHEART.GENERAL.Domain.Bone' + description: 'DAGGERHEART.GENERAL.Domain.bone.description' }, codex: { id: 'codex', label: 'DAGGERHEART.GENERAL.Domain.codex.label', src: 'systems/daggerheart/assets/icons/domains/codex.svg', - description: 'DAGGERHEART.GENERAL.Domain.Codex' + description: 'DAGGERHEART.GENERAL.Domain.codex.description' }, grace: { id: 'grace', label: 'DAGGERHEART.GENERAL.Domain.grace.label', src: 'systems/daggerheart/assets/icons/domains/grace.svg', - description: 'DAGGERHEART.GENERAL.Domain.Grace' + description: 'DAGGERHEART.GENERAL.Domain.grace.description' }, midnight: { id: 'midnight', label: 'DAGGERHEART.GENERAL.Domain.midnight.label', src: 'systems/daggerheart/assets/icons/domains/midnight.svg', - description: 'DAGGERHEART.GENERAL.Domain.Midnight' + description: 'DAGGERHEART.GENERAL.Domain.midnight.description' }, sage: { id: 'sage', label: 'DAGGERHEART.GENERAL.Domain.sage.label', src: 'systems/daggerheart/assets/icons/domains/sage.svg', - description: 'DAGGERHEART.GENERAL.Domain.Sage' + description: 'DAGGERHEART.GENERAL.Domain.sage.description' }, splendor: { id: 'splendor', label: 'DAGGERHEART.GENERAL.Domain.splendor.label', src: 'systems/daggerheart/assets/icons/domains/splendor.svg', - description: 'DAGGERHEART.GENERAL.Domain.Splendor' + description: 'DAGGERHEART.GENERAL.Domain.splendor.description' }, valor: { id: 'valor', label: 'DAGGERHEART.GENERAL.Domain.valor.label', src: 'systems/daggerheart/assets/icons/domains/valor.svg', - description: 'DAGGERHEART.GENERAL.Domain.Valor' + description: 'DAGGERHEART.GENERAL.Domain.valor.description' } }; diff --git a/module/config/flagsConfig.mjs b/module/config/flagsConfig.mjs index 252863f1..64a36fdf 100644 --- a/module/config/flagsConfig.mjs +++ b/module/config/flagsConfig.mjs @@ -7,3 +7,5 @@ export const encounterCountdown = { simple: 'countdown-encounter-simple', position: 'countdown-encounter-position' }; + +export const itemAttachmentSource = 'attachmentSource'; diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs index 64b856a0..390435b4 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' } }; @@ -89,6 +89,11 @@ export const healingTypes = { id: 'armorStack', label: 'DAGGERHEART.CONFIG.HealingType.armorStack.name', abbreviation: 'DAGGERHEART.CONFIG.HealingType.armorStack.abbreviation' + }, + fear: { + id: 'fear', + label: 'DAGGERHEART.CONFIG.HealingType.fear.name', + abbreviation: 'DAGGERHEART.CONFIG.HealingType.fear.abbreviation' } }; @@ -110,6 +115,18 @@ export const conditions = { name: 'DAGGERHEART.CONFIG.Condition.restrained.name', icon: 'icons/magic/control/debuff-chains-shackle-movement-red.webp', description: 'DAGGERHEART.CONFIG.Condition.restrained.description' + }, + unconcious: { + id: 'unconcious', + name: 'DAGGERHEART.CONFIG.Condition.unconcious.name', + icon: 'icons/magic/control/sleep-bubble-purple.webp', + description: 'DAGGERHEART.CONFIG.Condition.unconcious.description' + }, + dead: { + id: 'dead', + name: 'DAGGERHEART.CONFIG.Condition.dead.name', + icon: 'icons/magic/death/grave-tombstone-glow-teal.webp', + description: 'DAGGERHEART.CONFIG.Condition.dead.description' } }; @@ -118,6 +135,7 @@ export const defaultRestOptions = { tendToWounds: { id: 'tendToWounds', name: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.shortRest.tendToWounds.name'), + icon: 'fa-solid fa-bandage', img: 'icons/magic/life/cross-worn-green.webp', description: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.shortRest.tendToWounds.description'), actions: [ @@ -127,11 +145,11 @@ export const defaultRestOptions = { img: 'icons/magic/life/cross-worn-green.webp', actionType: 'action', healing: { - type: 'health', + applyTo: healingTypes.hitPoints.id, value: { custom: { enabled: true, - formula: '1d4 + 1' // should be 1d4 + {tier}. How to use the roll param? + formula: '1d4 + @tier' } } } @@ -141,6 +159,7 @@ export const defaultRestOptions = { clearStress: { id: 'clearStress', name: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.shortRest.clearStress.name'), + icon: 'fa-regular fa-face-surprise', img: 'icons/magic/perception/eye-ringed-green.webp', description: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.shortRest.clearStress.description'), actions: [ @@ -150,11 +169,11 @@ export const defaultRestOptions = { img: 'icons/magic/perception/eye-ringed-green.webp', actionType: 'action', healing: { - type: 'stress', + applyTo: healingTypes.stress.id, value: { custom: { enabled: true, - formula: '1d4 + 1' // should be 1d4 + {tier}. How to use the roll param? + formula: '1d4 + @tier' } } } @@ -164,13 +183,31 @@ export const defaultRestOptions = { repairArmor: { id: 'repairArmor', name: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.shortRest.repairArmor.name'), + icon: 'fa-solid fa-hammer', img: 'icons/skills/trades/smithing-anvil-silver-red.webp', description: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.shortRest.repairArmor.description'), - actions: [] + actions: [ + { + type: 'healing', + name: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.shortRest.repairArmor.name'), + img: 'icons/skills/trades/smithing-anvil-silver-red.webp', + actionType: 'action', + healing: { + applyTo: healingTypes.armorStack.id, + value: { + custom: { + enabled: true, + formula: '1d4 + @tier' + } + } + } + } + ] }, prepare: { id: 'prepare', name: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.shortRest.prepare.name'), + icon: 'fa-solid fa-dumbbell', img: 'icons/skills/trades/academics-merchant-scribe.webp', description: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.shortRest.prepare.description'), actions: [] @@ -180,6 +217,7 @@ export const defaultRestOptions = { tendToWounds: { id: 'tendToWounds', name: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.longRest.tendToWounds.name'), + icon: 'fa-solid fa-bandage', img: 'icons/magic/life/cross-worn-green.webp', description: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.longRest.tendToWounds.description'), actions: [] @@ -187,6 +225,7 @@ export const defaultRestOptions = { clearStress: { id: 'clearStress', name: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.longRest.clearStress.name'), + icon: 'fa-regular fa-face-surprise', img: 'icons/magic/perception/eye-ringed-green.webp', description: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.longRest.clearStress.description'), actions: [] @@ -194,6 +233,7 @@ export const defaultRestOptions = { repairArmor: { id: 'repairArmor', name: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.longRest.repairArmor.name'), + icon: 'fa-solid fa-hammer', img: 'icons/skills/trades/smithing-anvil-silver-red.webp', description: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.longRest.repairArmor.description'), actions: [] @@ -201,6 +241,7 @@ export const defaultRestOptions = { prepare: { id: 'prepare', name: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.longRest.prepare.name'), + icon: 'fa-solid fa-dumbbell', img: 'icons/skills/trades/academics-merchant-scribe.webp', description: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.longRest.prepare.description'), actions: [] @@ -208,19 +249,12 @@ export const defaultRestOptions = { workOnAProject: { id: 'workOnAProject', name: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.longRest.workOnAProject.name'), + icon: 'fa-solid fa-diagram-project', img: 'icons/skills/social/thumbsup-approval-like.webp', description: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.longRest.workOnAProject.description'), actions: [] } - }), - custom: { - id: 'customActivity', - name: '', - img: 'icons/skills/trades/academics-investigation-puzzles.webp', - description: '', - namePlaceholder: 'DAGGERHEART.APPLICATIONS.Downtime.custom.namePlaceholder', - placeholder: 'DAGGERHEART.APPLICATIONS.Downtime.custom.placeholder' - } + }) }; export const deathMoves = { @@ -245,25 +279,21 @@ export const deathMoves = { }; export const tiers = { - tier1: { - id: 'tier1', - label: 'DAGGERHEART.GENERAL.Tiers.tier1', - value: 1 + 1: { + id: 1, + label: 'DAGGERHEART.GENERAL.Tiers.1' }, - tier2: { - id: 'tier2', - label: 'DAGGERHEART.GENERAL.Tiers.tier2', - value: 2 + 2: { + id: 2, + label: 'DAGGERHEART.GENERAL.Tiers.2' }, - tier3: { - id: 'tier3', - label: 'DAGGERHEART.GENERAL.Tiers.tier3', - value: 3 + 3: { + id: 3, + label: 'DAGGERHEART.GENERAL.Tiers.3' }, - tier4: { - id: 'tier4', - label: 'DAGGERHEART.GENERAL.Tiers.tier4', - value: 4 + 4: { + id: 4, + label: 'DAGGERHEART.GENERAL.Tiers.4' } }; @@ -366,31 +396,6 @@ export const abilityCosts = { label: 'Armor Stack', group: 'TYPES.Actor.character' }, - prayer: { - id: 'prayer', - label: 'Prayer Dice', - group: 'TYPES.Actor.character' - }, - favor: { - id: 'favor', - label: 'Favor Points', - group: 'TYPES.Actor.character' - }, - slayer: { - id: 'slayer', - label: 'Slayer Dice', - group: 'TYPES.Actor.character' - }, - tide: { - id: 'tide', - label: 'Tide', - group: 'TYPES.Actor.character' - }, - chaos: { - id: 'chaos', - label: 'Chaos', - group: 'TYPES.Actor.character' - }, fear: { id: 'fear', label: 'Fear', @@ -401,29 +406,29 @@ export const abilityCosts = { export const countdownTypes = { spotlight: { id: 'spotlight', - label: 'DAGGERHEART.CONFIG.CountdownTypes.Spotlight' + label: 'DAGGERHEART.CONFIG.CountdownType.spotlight' }, characterAttack: { id: 'characterAttack', - label: 'DAGGERHEART.CONFIG.CountdownTypes.CharacterAttack' + label: 'DAGGERHEART.CONFIG.CountdownType.characterAttack' }, custom: { id: 'custom', - label: 'DAGGERHEART.CONFIG.CountdownTypes.Custom' + label: 'DAGGERHEART.CONFIG.CountdownType.custom' } }; export const rollTypes = { - weapon: { - id: 'weapon', - label: 'DAGGERHEART.CONFIG.RollTypes.weapon.name' + attack: { + id: 'attack', + label: 'DAGGERHEART.CONFIG.RollTypes.attack.name' }, spellcast: { id: 'spellcast', label: 'DAGGERHEART.CONFIG.RollTypes.spellcast.name' }, - ability: { - id: 'ability', - label: 'DAGGERHEART.CONFIG.RollTypes.ability.name' + trait: { + id: 'trait', + label: 'DAGGERHEART.CONFIG.RollTypes.trait.name' }, diceSet: { id: 'diceSet', diff --git a/module/config/hooksConfig.mjs b/module/config/hooksConfig.mjs deleted file mode 100644 index 8410c0de..00000000 --- a/module/config/hooksConfig.mjs +++ /dev/null @@ -1,4 +0,0 @@ -export const hooks = { - characterAttack: 'characterAttackHook', - spotlight: 'spotlightHook' -}; diff --git a/module/config/itemConfig.mjs b/module/config/itemConfig.mjs index 4cdd8125..9deed7f1 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,39 +36,42 @@ 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', + key: 'system.traits.agility.value', mode: 2, value: '-1' }, { - key: 'system.traits.strength.bonus', + key: 'system.traits.strength.value', mode: 2, value: '-1' }, { - key: 'system.traits.finesse.bonus', + key: 'system.traits.finesse.value', mode: 2, value: '-1' }, { - key: 'system.traits.instinct.bonus', + key: 'system.traits.instinct.value', mode: 2, value: '-1' }, { - key: 'system.traits.presence.bonus', + key: 'system.traits.presence.value', mode: 2, value: '-1' }, { - key: 'system.traits.knowledge.bonus', + key: 'system.traits.knowledge.value', mode: 2, value: '-1' }, { - key: 'system.evasion.bonus', + key: 'system.evasion', mode: 2, value: '-1' } @@ -68,9 +84,12 @@ 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', + key: 'system.evasion', mode: 2, value: '1' } @@ -80,16 +99,33 @@ 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', + key: 'system.traits.presence.value', mode: 2, value: '1' } @@ -102,9 +138,12 @@ 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', + key: 'system.evasion', mode: 2, value: '-1' } @@ -114,65 +153,231 @@ 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', + key: 'system.evasion', mode: 2, value: '-2' }, { - key: 'system.traits.agility.bonus', + key: 'system.traits.agility.value', mode: 2, value: '-1' } @@ -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.resistance.magical.reduction', + mode: 2, + value: '@system.armorScore' + } + ] + } + ] } }; @@ -194,16 +413,16 @@ export const weaponFeatures = { { changes: [ { - key: 'system.bonuses.armorScore', + key: 'system.armorScore', mode: 2, - value: '@system.tier + 1' + value: 'ITEM.@system.tier + 1' } ] }, { changes: [ { - key: 'system.evasion.bonus', + key: 'system.evasion', mode: 2, value: '-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.level.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', @@ -237,7 +474,7 @@ export const weaponFeatures = { { changes: [ { - key: 'system.evasion.bonus', + key: 'system.evasion', mode: 2, value: '-1' } @@ -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', + 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,9 +564,12 @@ 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', + key: 'system.traits.finesse.value', mode: 2, value: '-1' } @@ -312,30 +579,73 @@ 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', + 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', + key: 'system.traits.agility.value', mode: 2, value: '-1' } @@ -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,9 +678,17 @@ 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', + key: 'system.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', + 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,9 +814,12 @@ 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', + key: 'system.evasion', mode: 2, value: '-1' } @@ -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', + key: 'system.evasion', 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.value', + 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', + key: 'system.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.value' + } + ] + } + ] }, 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', @@ -641,15 +1261,6 @@ export const weaponFeatures = { timebending: { label: 'DAGGERHEART.CONFIG.WeaponFeature.timebending.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.timebending.description' - }, - versatile: { - label: 'DAGGERHEART.CONFIG.WeaponFeature.versatile.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.versatile.description', - versatile: { - characterTrait: '', - range: '', - damage: '' - } } }; @@ -700,6 +1311,16 @@ export const featureTypes = { } }; +export const featureSubTypes = { + primary: 'primary', + secondary: 'secondary', + hope: 'hope', + class: 'class', + foundation: 'foundation', + specialization: 'specialization', + mastery: 'mastery' +}; + export const actionTypes = { passive: { id: 'passive', @@ -714,3 +1335,29 @@ export const actionTypes = { label: 'DAGGERHEART.CONFIG.ActionType.reaction' } }; + +export const itemResourceTypes = { + simple: { + id: 'simple', + label: 'DAGGERHEART.CONFIG.ItemResourceType.simple' + }, + diceValue: { + id: 'diceValue', + label: 'DAGGERHEART.CONFIG.ItemResourceType.diceValue' + } +}; + +export const beastformTypes = { + normal: { + id: 'normal', + label: 'DAGGERHEART.CONFIG.BeastformType.normal' + }, + evolved: { + id: 'evolved', + label: 'DAGGERHEART.CONFIG.BeastformType.evolved' + }, + hybrid: { + id: 'hybrid', + label: 'DAGGERHEART.CONFIG.BeastformType.hybrid' + } +}; diff --git a/module/config/system.mjs b/module/config/system.mjs index 6ad0e689..e72667b1 100644 --- a/module/config/system.mjs +++ b/module/config/system.mjs @@ -3,7 +3,6 @@ import * as DOMAIN from './domainConfig.mjs'; import * as ACTOR from './actorConfig.mjs'; import * as ITEM from './itemConfig.mjs'; import * as SETTINGS from './settingsConfig.mjs'; -import { hooks as HOOKS } from './hooksConfig.mjs'; import * as EFFECTS from './effectConfig.mjs'; import * as ACTIONS from './actionConfig.mjs'; import * as FLAGS from './flagsConfig.mjs'; @@ -17,7 +16,6 @@ export const SYSTEM = { ACTOR, ITEM, SETTINGS, - HOOKS, EFFECTS, ACTIONS, FLAGS diff --git a/module/data/action/actionDice.mjs b/module/data/action/actionDice.mjs index 8b5bbe40..1d2b204b 100644 --- a/module/data/action/actionDice.mjs +++ b/module/data/action/actionDice.mjs @@ -76,11 +76,7 @@ export class DHActionDiceData extends foundry.abstract.DataModel { }; } - getFormula(actor) { - /* const multiplier = this.multiplier === 'flat' ? this.flatMultiplier : actor.system[this.multiplier]?.total; - return this.custom.enabled - ? this.custom.formula - : `${multiplier ?? 1}${this.dice}${this.bonus ? (this.bonus < 0 ? ` - ${Math.abs(this.bonus)}` : ` + ${this.bonus}`) : ''}`; */ + getFormula() { const multiplier = this.multiplier === 'flat' ? this.flatMultiplier : `@${this.multiplier}`, bonus = this.bonus ? (this.bonus < 0 ? ` - ${Math.abs(this.bonus)}` : ` + ${this.bonus}`) : ''; return this.custom.enabled ? this.custom.formula : `${multiplier ?? 1}${this.dice}${bonus}`; @@ -91,25 +87,25 @@ export class DHDamageField extends fields.SchemaField { constructor(options, context = {}) { const damageFields = { parts: new fields.ArrayField(new fields.EmbeddedDataField(DHDamageData)), - includeBase: new fields.BooleanField({ initial: false }) + includeBase: new fields.BooleanField({ + initial: false, + label: 'DAGGERHEART.ACTIONS.Settings.includeBase.label' + }) }; - // if (hasBase) damageFields.includeBase = new fields.BooleanField({ initial: true }); super(damageFields, options, context); } } -export class DHDamageData extends foundry.abstract.DataModel { +export class DHResourceData extends foundry.abstract.DataModel { /** @override */ static defineSchema() { return { - // ...super.defineSchema(), - base: new fields.BooleanField({ initial: false, readonly: true, label: 'Base' }), - type: new fields.StringField({ - choices: CONFIG.DH.GENERAL.damageTypes, - initial: 'physical', - label: 'Type', - nullable: false, - required: true + applyTo: new fields.StringField({ + choices: CONFIG.DH.GENERAL.healingTypes, + required: true, + blank: false, + initial: CONFIG.DH.GENERAL.healingTypes.hitPoints.id, + label: 'DAGGERHEART.ACTIONS.Settings.applyTo.label' }), resultBased: new fields.BooleanField({ initial: false, @@ -120,3 +116,24 @@ export class DHDamageData extends foundry.abstract.DataModel { }; } } + +export class DHDamageData extends DHResourceData { + /** @override */ + static defineSchema() { + return { + ...super.defineSchema(), + base: new fields.BooleanField({ initial: false, readonly: true, label: 'Base' }), + type: new fields.SetField( + new fields.StringField({ + choices: CONFIG.DH.GENERAL.damageTypes, + initial: 'physical', + nullable: false, + required: true + }), + { + label: 'Type' + } + ) + }; + } +} diff --git a/module/data/action/attackAction.mjs b/module/data/action/attackAction.mjs index 9c1c49f8..e17c0e9d 100644 --- a/module/data/action/attackAction.mjs +++ b/module/data/action/attackAction.mjs @@ -5,7 +5,7 @@ export default class DHAttackAction extends DHDamageAction { static extraSchemas = [...super.extraSchemas, ...['roll', 'save']]; static getRollType(parent) { - return parent.type === 'weapon' ? 'weapon' : 'spellcast'; + return parent.type === 'weapon' ? 'attack' : 'spellcast'; } get chatTemplate() { @@ -14,14 +14,14 @@ 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'; + this.roll.type = 'attack'; } } } @@ -37,4 +37,17 @@ export default class DHAttackAction extends DHDamageAction { base: true }; } + + async use(event, ...args) { + const result = await super.use(event, args); + + const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns; + await updateCountdowns(CONFIG.DH.GENERAL.countdownTypes.characterAttack.id); + + return result; + } + + // get modifiers() { + // return []; + // } } diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index ae0b7ccc..ad442951 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -1,4 +1,4 @@ -import { DHActionDiceData, DHActionRollData, DHDamageData, DHDamageField } from './actionDice.mjs'; +import { DHActionDiceData, DHActionRollData, DHDamageData, DHDamageField, DHResourceData } from './actionDice.mjs'; import DhpActor from '../../documents/actor.mjs'; import D20RollDialog from '../../applications/dialogs/d20RollDialog.mjs'; @@ -35,12 +35,12 @@ export default class DHBaseAction extends foundry.abstract.DataModel { }), cost: new fields.ArrayField( new fields.SchemaField({ - type: new fields.StringField({ - choices: CONFIG.DH.GENERAL.abilityCosts, + key: new fields.StringField({ nullable: false, required: true, initial: 'hope' }), + keyIsID: new fields.BooleanField(), value: new fields.NumberField({ nullable: true, initial: 1 }), scalable: new fields.BooleanField({ initial: false }), step: new fields.NumberField({ nullable: true, initial: null }) @@ -96,21 +96,7 @@ export default class DHBaseAction extends foundry.abstract.DataModel { onSave: new fields.BooleanField({ initial: false }) }) ), - healing: new fields.SchemaField({ - type: new fields.StringField({ - choices: CONFIG.DH.GENERAL.healingTypes, - required: true, - blank: false, - initial: CONFIG.DH.GENERAL.healingTypes.hitPoints.id, - label: 'Healing' - }), - resultBased: new fields.BooleanField({ - initial: false, - label: 'DAGGERHEART.ACTIONS.Settings.resultBased.label' - }), - value: new fields.EmbeddedDataField(DHActionDiceData), - valueAlt: new fields.EmbeddedDataField(DHActionDiceData) - }), + healing: new fields.EmbeddedDataField(DHResourceData), beastform: new fields.SchemaField({ tierAccess: new fields.SchemaField({ exact: new fields.NumberField({ integer: true, nullable: true, initial: null }) @@ -150,18 +136,18 @@ export default class DHBaseAction extends foundry.abstract.DataModel { } static getRollType(parent) { - return 'ability'; + return 'trait'; } static getSourceConfig(parent) { const updateSource = {}; updateSource.img ??= parent?.img ?? parent?.system?.img; - if (parent?.type === 'weapon') { + if (parent?.type === 'weapon' && this === game.system.api.models.actions.actionsTypes.attack) { updateSource['damage'] = { includeBase: true }; updateSource['range'] = parent?.system?.attack?.range; updateSource['roll'] = { useDefault: true - } + }; } else { if (parent?.system?.trait) { updateSource['roll'] = { @@ -177,18 +163,12 @@ export default class DHBaseAction extends foundry.abstract.DataModel { } getRollData(data = {}) { + if (!this.actor) return null; const actorData = this.actor.getRollData(false); - // Remove when included directly in Actor getRollData - actorData.prof = actorData.proficiency?.value ?? 1; - actorData.cast = actorData.spellcast?.value ?? 1; + // Add Roll results to RollDatas actorData.result = data.roll?.total ?? 1; - /* actorData.scale = data.costs?.length - ? data.costs.reduce((a, c) => { - a[c.type] = c.value; - return a; - }, {}) - : 1; */ + actorData.scale = data.costs?.length // Right now only return the first scalable cost. ? (data.costs.find(c => c.scalable)?.total ?? 1) : 1; @@ -198,6 +178,8 @@ export default class DHBaseAction extends foundry.abstract.DataModel { } async use(event, ...args) { + if (!this.actor) throw new Error("An Action can't be used outside of an Actor context."); + const isFastForward = event.shiftKey || (!this.hasRoll && !this.hasSave); // Prepare base Config const initConfig = this.initActionConfig(event); @@ -211,7 +193,7 @@ export default class DHBaseAction extends foundry.abstract.DataModel { // Prepare Costs const costsConfig = this.prepareCost(); - if (isFastForward && !this.hasCost(costsConfig)) + if (isFastForward && !(await this.hasCost(costsConfig))) return ui.notifications.warn("You don't have the resources to use that action."); // Prepare Uses @@ -234,7 +216,6 @@ export default class DHBaseAction extends foundry.abstract.DataModel { if (Hooks.call(`${CONFIG.DH.id}.preUseAction`, this, config) === false) return; // Display configuration window if necessary - // if (config.dialog?.configure && this.requireConfigurationDialog(config)) { if (this.requireConfigurationDialog(config)) { config = await D20RollDialog.configure(null, config); if (!config) return; @@ -275,7 +256,8 @@ export default class DHBaseAction extends foundry.abstract.DataModel { hasDamage: !!this.damage?.parts?.length, hasHealing: !!this.healing, hasEffect: !!this.effects?.length, - hasSave: this.hasSave + hasSave: this.hasSave, + selectedRollMode: game.settings.get('core', 'rollMode') }; } @@ -285,7 +267,7 @@ export default class DHBaseAction extends foundry.abstract.DataModel { prepareCost() { const costs = this.cost?.length ? foundry.utils.deepClone(this.cost) : []; - return costs; + return this.calcCosts(costs); } prepareUse() { @@ -295,7 +277,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); @@ -315,7 +297,7 @@ export default class DHBaseAction extends foundry.abstract.DataModel { prepareRoll() { const roll = { - modifiers: [], + modifiers: this.modifiers, trait: this.roll?.trait, label: 'Attack', type: this.actionType, @@ -334,10 +316,26 @@ export default class DHBaseAction extends foundry.abstract.DataModel { } async consume(config) { + const usefulResources = foundry.utils.deepClone(this.actor.system.resources); + for (var cost of config.costs) { + if (cost.keyIsID) { + usefulResources[cost.key] = { + value: cost.value, + target: this.parent.parent, + keyIsID: true + }; + } + } const resources = config.costs .filter(c => c.enabled !== false) .map(c => { - return { type: c.type, value: (c.total ?? c.value) * -1 }; + const resource = usefulResources[c.key]; + return { + key: c.key, + value: (c.total ?? c.value) * (resource.isReversed ? 1 : -1), + target: resource.target, + keyIsID: resource.keyIsID + }; }); await this.actor.modifyResource(resources); @@ -353,6 +351,13 @@ export default class DHBaseAction extends foundry.abstract.DataModel { get hasRoll() { return !!this.roll?.type || !!this.roll?.bonus; } + + get modifiers() { + if (!this.actor) return []; + const modifiers = []; + /** Placeholder for specific bonuses **/ + return modifiers; + } /* ROLL */ /* SAVE */ @@ -378,23 +383,46 @@ export default class DHBaseAction extends foundry.abstract.DataModel { }); } - hasCost(costs) { + async getResources(costs) { + const actorResources = this.actor.system.resources; + const itemResources = {}; + for (var itemResource of costs) { + if (itemResource.keyIsID) { + itemResources[itemResource.key] = { + value: this.parent.resource.value ?? 0 + }; + } + } + + return { + ...actorResources, + ...itemResources + }; + } + + /* COST */ + async hasCost(costs) { const realCosts = this.getRealCosts(costs), - hasFearCost = realCosts.findIndex(c => c.type === 'fear'); + hasFearCost = realCosts.findIndex(c => c.key === '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; } + + /* isReversed is a sign that the resource is inverted, IE it counts upwards instead of down */ + const resources = await this.getResources(realCosts); return realCosts.reduce( - (a, c) => a && this.actor.system.resources[c.type]?.value >= (c.total ?? c.value), + (a, c) => + a && resources[c.key].isReversed + ? resources[c.key].value + (c.total ?? c.value) <= resources[c.key].max + : resources[c.key]?.value >= (c.total ?? c.value), true ); } - /* COST */ /* USES */ calcUses(uses) { @@ -409,7 +437,6 @@ export default class DHBaseAction extends foundry.abstract.DataModel { if (!uses) return true; return (uses.hasOwnProperty('enabled') && !uses.enabled) || uses.value + 1 <= uses.max; } - /* USES */ /* TARGET */ isTargetFriendly(target) { @@ -432,7 +459,7 @@ export default class DHBaseAction extends foundry.abstract.DataModel { name: actor.actor.name, img: actor.actor.img, difficulty: actor.actor.system.difficulty, - evasion: actor.actor.system.evasion?.total + evasion: actor.actor.system.evasion }; } /* TARGET */ diff --git a/module/data/action/beastformAction.mjs b/module/data/action/beastformAction.mjs index 98d8053f..bb926dac 100644 --- a/module/data/action/beastformAction.mjs +++ b/module/data/action/beastformAction.mjs @@ -10,10 +10,12 @@ export default class DhBeastformAction extends DHBaseAction { const abort = await this.handleActiveTransformations(); if (abort) return; - const beastformUuid = await BeastformDialog.configure(beastformConfig); - if (!beastformUuid) return; + const item = args[0]; - await this.transform(beastformUuid); + const { selected, evolved, hybrid } = await BeastformDialog.configure(beastformConfig, item); + if (!selected) return; + + await this.transform(selected, evolved, hybrid); } prepareBeastformConfig(config) { @@ -29,21 +31,48 @@ export default class DhBeastformAction extends DHBaseAction { }; } - async transform(beastformUuid) { - const beastform = await foundry.utils.fromUuid(beastformUuid); - this.actor.createEmbeddedDocuments('Item', [beastform.toObject()]); + async transform(selectedForm, evolvedData, hybridData) { + const formData = evolvedData?.form ? evolvedData.form.toObject() : selectedForm.toObject(); + const beastformEffect = formData.effects.find(x => x.type === 'beastform'); + if (!beastformEffect) { + ui.notifications.error('DAGGERHEART.UI.Notifications.beastformMissingEffect'); + return; + } + + if (evolvedData?.form) { + const evolvedForm = selectedForm.effects.find(x => x.type === 'beastform'); + if (!evolvedForm) { + ui.notifications.error('DAGGERHEART.UI.Notifications.beastformMissingEffect'); + return; + } + + beastformEffect.changes = [...beastformEffect.changes, ...evolvedForm.changes]; + formData.system.features = [...formData.system.features, ...selectedForm.system.features.map(x => x.uuid)]; + } + + if (selectedForm.system.beastformType === CONFIG.DH.ITEM.beastformTypes.hybrid.id) { + formData.system.advantageOn = Object.values(hybridData.advantages).reduce((advantages, formCategory) => { + Object.keys(formCategory).forEach(advantageKey => { + advantages[advantageKey] = formCategory[advantageKey]; + }); + return advantages; + }, {}); + formData.system.features = [ + ...formData.system.features, + ...Object.values(hybridData.features).flatMap(x => Object.keys(x)) + ]; + } + + this.actor.createEmbeddedDocuments('Item', [formData]); } async handleActiveTransformations() { const beastformEffects = this.actor.effects.filter(x => x.type === 'beastform'); - if (beastformEffects.length > 0) { - for (let effect of beastformEffects) { - await effect.delete(); - } - - return true; - } - - return false; + const existingEffects = beastformEffects.length > 0; + await this.actor.deleteEmbeddedDocuments( + 'ActiveEffect', + beastformEffects.map(x => x.id) + ); + return existingEffects; } } diff --git a/module/data/action/damageAction.mjs b/module/data/action/damageAction.mjs index 2dd88af4..988e1844 100644 --- a/module/data/action/damageAction.mjs +++ b/module/data/action/damageAction.mjs @@ -1,3 +1,4 @@ +import { setsEqual } from '../../helpers/utils.mjs'; import DHBaseAction from './baseAction.mjs'; export default class DHDamageAction extends DHBaseAction { @@ -6,33 +7,63 @@ export default class DHDamageAction extends DHBaseAction { getFormulaValue(part, data) { let formulaValue = part.value; if (this.hasRoll && part.resultBased && data.system.roll.result.duality === -1) return part.valueAlt; + + const isAdversary = this.actor.type === 'adversary'; + if (isAdversary && this.actor.system.type === CONFIG.DH.ACTOR.adversaryTypes.horde.id) { + const hasHordeDamage = this.actor.effects.find( + x => x.name === game.i18n.localize('DAGGERHEART.CONFIG.AdversaryType.horde.label') + ); + if (hasHordeDamage) return part.valueAlt; + } + return formulaValue; } + formatFormulas(formulas, systemData) { + const formattedFormulas = []; + formulas.forEach(formula => { + if (isNaN(formula.formula)) + formula.formula = Roll.replaceFormulaData(formula.formula, this.getRollData(systemData)); + const same = formattedFormulas.find( + f => setsEqual(f.damageTypes, formula.damageTypes) && f.applyTo === formula.applyTo + ); + if (same) same.formula += ` + ${formula.formula}`; + else formattedFormulas.push(formula); + }); + return formattedFormulas; + } + async rollDamage(event, data) { - let formula = this.damage.parts.map(p => this.getFormulaValue(p, data).getFormula(this.actor)).join(' + '); + const systemData = data.system ?? data; - if (!formula || formula == '') return; - let roll = { formula: formula, total: formula }, - bonusDamage = []; + let formulas = this.damage.parts.map(p => ({ + formula: this.getFormulaValue(p, data).getFormula(this.actor), + damageTypes: p.applyTo === 'hitPoints' && !p.type.size ? new Set(['physical']) : p.type, + applyTo: p.applyTo + })); - if (isNaN(formula)) formula = Roll.replaceFormulaData(formula, this.getRollData(data.system ?? data)); + if (!formulas.length) return; + + formulas = this.formatFormulas(formulas, systemData); const config = { - title: game.i18n.format('DAGGERHEART.UI.Chat.damageRoll.title', { damage: this.name }), - roll: { formula }, - targets: data.system?.targets.filter(t => t.hit) ?? data.targets, + title: game.i18n.format('DAGGERHEART.UI.Chat.damageRoll.title', { damage: game.i18n.localize(this.name) }), + roll: formulas, + targets: systemData.targets.filter(t => t.hit) ?? data.targets, hasSave: this.hasSave, - isCritical: data.system?.roll?.isCritical ?? false, - source: data.system?.source, + isCritical: systemData.roll?.isCritical ?? false, + source: systemData.source, + data: this.getRollData(), event }; if (this.hasSave) config.onSave = this.save.damageMod; if (data.system) { config.source.message = data._id; config.directDamage = false; + } else { + config.directDamage = true; } - roll = CONFIG.Dice.daggerheart.DamageRoll.build(config); + return CONFIG.Dice.daggerheart.DamageRoll.build(config); } } diff --git a/module/data/action/healingAction.mjs b/module/data/action/healingAction.mjs index 26e53817..b7cc4a75 100644 --- a/module/data/action/healingAction.mjs +++ b/module/data/action/healingAction.mjs @@ -15,28 +15,34 @@ export default class DHHealingAction extends DHBaseAction { } async rollHealing(event, data) { - let formulaValue = this.getFormulaValue(data), - formula = formulaValue.getFormula(this.actor); - - if (!formula || formula == '') return; - let roll = { formula: formula, total: formula }, - bonusDamage = []; + const systemData = data.system ?? data; + let formulas = [ + { + formula: this.getFormulaValue(data).getFormula(this.actor), + applyTo: this.healing.applyTo + } + ]; const config = { title: game.i18n.format('DAGGERHEART.UI.Chat.healingRoll.title', { - healing: game.i18n.localize(CONFIG.DH.GENERAL.healingTypes[this.healing.type].label) + healing: game.i18n.localize(CONFIG.DH.GENERAL.healingTypes[this.healing.applyTo].label) }), - roll: { formula }, + roll: formulas, targets: (data.system?.targets ?? data.targets).filter(t => t.hit), messageType: 'healing', - type: this.healing.type, + source: systemData.source, + data: this.getRollData(), event }; - roll = CONFIG.Dice.daggerheart.DamageRoll.build(config); + return CONFIG.Dice.daggerheart.DamageRoll.build(config); } get chatTemplate() { return 'systems/daggerheart/templates/ui/chat/healing-roll.hbs'; } + + get modifiers() { + return []; + } } diff --git a/module/data/activeEffect/beastformEffect.mjs b/module/data/activeEffect/beastformEffect.mjs index 3aa25bef..4e6fa104 100644 --- a/module/data/activeEffect/beastformEffect.mjs +++ b/module/data/activeEffect/beastformEffect.mjs @@ -10,6 +10,11 @@ export default class BeastformEffect extends foundry.abstract.TypeDataModel { base64: false, nullable: true }), + tokenRingImg: new fields.FilePathField({ + initial: 'icons/svg/mystery-man.svg', + categories: ['IMAGE'], + base64: false + }), tokenSize: new fields.SchemaField({ height: new fields.NumberField({ integer: true, nullable: true }), width: new fields.NumberField({ integer: true, nullable: true }) @@ -21,6 +26,13 @@ export default class BeastformEffect extends foundry.abstract.TypeDataModel { }; } + async _onCreate() { + if (this.parent.parent?.type === 'character') { + this.parent.parent.system.primaryWeapon?.update?.({ 'system.equipped': false }); + this.parent.parent.system.secondayWeapon?.update?.({ 'system.equipped': false }); + } + } + async _preDelete() { if (this.parent.parent.type === 'character') { const update = { @@ -28,6 +40,11 @@ export default class BeastformEffect extends foundry.abstract.TypeDataModel { width: this.characterTokenData.tokenSize.width, texture: { src: this.characterTokenData.tokenImg + }, + ring: { + subject: { + texture: this.characterTokenData.tokenRingImg + } } }; diff --git a/module/data/actor/adversary.mjs b/module/data/actor/adversary.mjs index 9bb5d5f8..7360e42f 100644 --- a/module/data/actor/adversary.mjs +++ b/module/data/actor/adversary.mjs @@ -1,12 +1,7 @@ import DHAdversarySettings from '../../applications/sheets-configs/adversary-settings.mjs'; import ActionField from '../fields/actionField.mjs'; import BaseDataActor from './base.mjs'; - -const resourceField = () => - new foundry.data.fields.SchemaField({ - value: new foundry.data.fields.NumberField({ initial: 0, integer: true }), - max: new foundry.data.fields.NumberField({ initial: 0, integer: true }) - }); +import { resourceField, bonusField } from '../fields/actorField.mjs'; export default class DhpAdversary extends BaseDataActor { static LOCALIZATION_PREFIXES = ['DAGGERHEART.ACTORS.Adversary']; @@ -22,28 +17,44 @@ export default class DhpAdversary extends BaseDataActor { static defineSchema() { const fields = foundry.data.fields; return { - tier: new fields.StringField({ + ...super.defineSchema(), + tier: new fields.NumberField({ required: true, + integer: true, choices: CONFIG.DH.GENERAL.tiers, - initial: CONFIG.DH.GENERAL.tiers.tier1.id + initial: CONFIG.DH.GENERAL.tiers[1].id }), type: new fields.StringField({ required: true, choices: CONFIG.DH.ACTOR.adversaryTypes, initial: CONFIG.DH.ACTOR.adversaryTypes.standard.id }), - description: new fields.StringField(), motivesAndTactics: new fields.StringField(), notes: new fields.HTMLField(), difficulty: new fields.NumberField({ required: true, initial: 1, integer: true }), - hordeHp: new fields.NumberField({ required: true, initial: 1, integer: true }), + hordeHp: new fields.NumberField({ + required: true, + initial: 1, + integer: true, + label: 'DAGGERHEART.GENERAL.hordeHp' + }), damageThresholds: new fields.SchemaField({ - major: new fields.NumberField({ required: true, initial: 0, integer: true }), - severe: new fields.NumberField({ required: true, initial: 0, integer: true }) + major: new fields.NumberField({ + required: true, + initial: 0, + integer: true, + label: 'DAGGERHEART.GENERAL.DamageThresholds.majorThreshold' + }), + severe: new fields.NumberField({ + required: true, + initial: 0, + integer: true, + label: 'DAGGERHEART.GENERAL.DamageThresholds.severeThreshold' + }) }), resources: new fields.SchemaField({ - hitPoints: resourceField(), - stress: resourceField() + hitPoints: resourceField(0, 'DAGGERHEART.GENERAL.HitPoints.plural', true), + stress: resourceField(0, 'DAGGERHEART.GENERAL.stress', true) }), attack: new ActionField({ initial: { @@ -58,11 +69,12 @@ export default class DhpAdversary extends BaseDataActor { amount: 1 }, roll: { - type: 'weapon' + type: 'attack' }, damage: { parts: [ { + type: ['physical'], value: { multiplier: 'flat' } @@ -74,13 +86,18 @@ export default class DhpAdversary extends BaseDataActor { experiences: new fields.TypedObjectField( new fields.SchemaField({ name: new fields.StringField(), - total: new fields.NumberField({ required: true, integer: true, initial: 1 }) + value: new fields.NumberField({ required: true, integer: true, initial: 1 }) }) ), bonuses: new fields.SchemaField({ - difficulty: new fields.SchemaField({ - all: new fields.NumberField({ integer: true, initial: 0 }), - reaction: new fields.NumberField({ integer: true, initial: 0 }) + roll: new fields.SchemaField({ + attack: bonusField('DAGGERHEART.GENERAL.Roll.attack'), + action: bonusField('DAGGERHEART.GENERAL.Roll.action'), + reaction: bonusField('DAGGERHEART.GENERAL.Roll.reaction') + }), + damage: new fields.SchemaField({ + physical: bonusField('DAGGERHEART.GENERAL.Damage.physicalDamage'), + magical: bonusField('DAGGERHEART.GENERAL.Damage.magicalDamage') }) }) }; @@ -93,4 +110,37 @@ export default class DhpAdversary extends BaseDataActor { get features() { return this.parent.items.filter(x => x.type === 'feature'); } + + async _preUpdate(changes, options, user) { + const allowed = await super._preUpdate(changes, options, user); + if (allowed === false) return false; + + if (this.type === CONFIG.DH.ACTOR.adversaryTypes.horde.id) { + if (changes.system?.resources?.hitPoints?.value) { + const halfHP = Math.ceil(this.resources.hitPoints.max / 2); + const newHitPoints = changes.system.resources.hitPoints.value; + const previouslyAboveHalf = this.resources.hitPoints.value < halfHP; + const loweredBelowHalf = previouslyAboveHalf && newHitPoints >= halfHP; + const raisedAboveHalf = !previouslyAboveHalf && newHitPoints < halfHP; + if (loweredBelowHalf) { + await this.parent.createEmbeddedDocuments('ActiveEffect', [ + { + name: game.i18n.localize('DAGGERHEART.CONFIG.AdversaryType.horde.label'), + img: 'icons/magic/movement/chevrons-down-yellow.webp', + disabled: !game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation) + .hordeDamage + } + ]); + } else if (raisedAboveHalf) { + const hordeEffects = this.parent.effects.filter( + x => x.name === game.i18n.localize('DAGGERHEART.CONFIG.AdversaryType.horde.label') + ); + await this.parent.deleteEmbeddedDocuments( + 'ActiveEffect', + hordeEffects.map(x => x.id) + ); + } + } + } + } } diff --git a/module/data/actor/base.mjs b/module/data/actor/base.mjs index 1b90968d..19de7b06 100644 --- a/module/data/actor/base.mjs +++ b/module/data/actor/base.mjs @@ -1,4 +1,11 @@ -import DHBaseActorSettings from "../../applications/sheets/api/actor-setting.mjs"; +import DHBaseActorSettings from '../../applications/sheets/api/actor-setting.mjs'; + +const resistanceField = reductionLabel => + new foundry.data.fields.SchemaField({ + resistance: new foundry.data.fields.BooleanField({ initial: false }), + immunity: new foundry.data.fields.BooleanField({ initial: false }), + reduction: new foundry.data.fields.NumberField({ integer: true, initial: 0, label: reductionLabel }) + }); /** * Describes metadata about the actor data model type @@ -16,6 +23,7 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel { type: 'base', isNPC: true, settingSheet: null, + hasResistances: true }; } @@ -27,10 +35,15 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel { /** @inheritDoc */ static defineSchema() { const fields = foundry.data.fields; + const schema = {}; - return { - description: new fields.HTMLField({ required: true, nullable: true }) - }; + if (this.metadata.isNPC) schema.description = new fields.HTMLField({ required: true, nullable: true }); + if (this.metadata.hasResistances) + schema.resistance = new fields.SchemaField({ + physical: resistanceField('DAGGERHEART.GENERAL.DamageResistance.physicalReduction'), + magical: resistanceField('DAGGERHEART.GENERAL.DamageResistance.magicalReduction') + }); + return schema; } /** diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index 1dfbd015..34a1f525 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -1,35 +1,18 @@ import { burden } from '../../config/generalConfig.mjs'; -import ActionField from '../fields/actionField.mjs'; import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs'; import DhLevelData from '../levelData.mjs'; import BaseDataActor from './base.mjs'; - -const attributeField = () => - new foundry.data.fields.SchemaField({ - value: new foundry.data.fields.NumberField({ initial: null, integer: true }), - bonus: new foundry.data.fields.NumberField({ initial: 0, integer: true }), - tierMarked: new foundry.data.fields.BooleanField({ initial: false }) - }); - -const resourceField = max => - new foundry.data.fields.SchemaField({ - value: new foundry.data.fields.NumberField({ initial: 0, integer: true }), - bonus: new foundry.data.fields.NumberField({ initial: 0, integer: true }), - max: new foundry.data.fields.NumberField({ initial: max, integer: true }) - }); - -const stressDamageReductionRule = () => - new foundry.data.fields.SchemaField({ - enabled: new foundry.data.fields.BooleanField({ required: true, initial: false }), - cost: new foundry.data.fields.NumberField({ integer: true }) - }); +import { attributeField, resourceField, stressDamageReductionRule, bonusField } from '../fields/actorField.mjs'; +import ActionField from '../fields/actionField.mjs'; export default class DhCharacter extends BaseDataActor { + static LOCALIZATION_PREFIXES = ['DAGGERHEART.ACTORS.Character']; + static get metadata() { return foundry.utils.mergeObject(super.metadata, { label: 'TYPES.Actor.character', type: 'character', - isNPC: false, + isNPC: false }); } @@ -37,36 +20,43 @@ export default class DhCharacter extends BaseDataActor { const fields = foundry.data.fields; return { + ...super.defineSchema(), resources: new fields.SchemaField({ - hitPoints: new fields.SchemaField({ - value: new foundry.data.fields.NumberField({ initial: 0, integer: true }), - bonus: new foundry.data.fields.NumberField({ initial: 0, integer: true }) - }), - stress: resourceField(6), - hope: resourceField(6), - tokens: new fields.ObjectField(), - dice: new fields.ObjectField() + hitPoints: resourceField(0, 'DAGGERHEART.GENERAL.HitPoints.plural', true), + stress: resourceField(6, 'DAGGERHEART.GENERAL.stress', true), + hope: resourceField(6, 'DAGGERHEART.GENERAL.hope') }), traits: new fields.SchemaField({ - agility: attributeField(), - strength: attributeField(), - finesse: attributeField(), - instinct: attributeField(), - presence: attributeField(), - knowledge: attributeField() + agility: attributeField('DAGGERHEART.CONFIG.Traits.agility.name'), + strength: attributeField('DAGGERHEART.CONFIG.Traits.strength.name'), + finesse: attributeField('DAGGERHEART.CONFIG.Traits.finesse.name'), + instinct: attributeField('DAGGERHEART.CONFIG.Traits.instinct.name'), + presence: attributeField('DAGGERHEART.CONFIG.Traits.presence.name'), + knowledge: attributeField('DAGGERHEART.CONFIG.Traits.knowledge.name') }), - proficiency: new fields.SchemaField({ - value: new fields.NumberField({ initial: 1, integer: true }), - bonus: new fields.NumberField({ initial: 0, integer: true }) + proficiency: new fields.NumberField({ + initial: 1, + integer: true, + label: 'DAGGERHEART.GENERAL.proficiency' }), - evasion: new fields.SchemaField({ - bonus: new fields.NumberField({ initial: 0, integer: true }) + evasion: new fields.NumberField({ initial: 0, integer: true, label: 'DAGGERHEART.GENERAL.evasion' }), + armorScore: new fields.NumberField({ integer: true, initial: 0, label: 'DAGGERHEART.GENERAL.armorScore' }), + damageThresholds: new fields.SchemaField({ + severe: new fields.NumberField({ + integer: true, + initial: 0, + label: 'DAGGERHEART.GENERAL.DamageThresholds.majorThreshold' + }), + major: new fields.NumberField({ + integer: true, + initial: 0, + label: 'DAGGERHEART.GENERAL.DamageThresholds.severeThreshold' + }) }), experiences: new fields.TypedObjectField( new fields.SchemaField({ name: new fields.StringField(), - value: new fields.NumberField({ integer: true, initial: 0 }), - bonus: new fields.NumberField({ integer: true, initial: 0 }) + value: new fields.NumberField({ integer: true, initial: 0 }) }) ), gold: new fields.SchemaField({ @@ -78,7 +68,7 @@ export default class DhCharacter extends BaseDataActor { scars: new fields.TypedObjectField( new fields.SchemaField({ name: new fields.StringField({}), - description: new fields.HTMLField() + description: new fields.StringField() }) ), biography: new fields.SchemaField({ @@ -98,43 +88,174 @@ export default class DhCharacter extends BaseDataActor { value: new ForeignDocumentUUIDField({ type: 'Item', nullable: true }), subclass: new ForeignDocumentUUIDField({ type: 'Item', nullable: true }) }), + attack: new ActionField({ + initial: { + name: 'Attack', + img: 'icons/skills/melee/unarmed-punch-fist-yellow-red.webp', + _id: foundry.utils.randomID(), + systemPath: 'attack', + type: 'attack', + range: 'melee', + target: { + type: 'any', + amount: 1 + }, + roll: { + type: 'attack', + trait: 'strength' + }, + damage: { + parts: [ + { + type: ['physical'], + value: { + custom: { + enabled: true, + formula: '@system.rules.attack.damage.value' + } + } + } + ] + } + } + }), + advantageSources: new fields.ArrayField(new fields.StringField(), { + label: 'DAGGERHEART.ACTORS.Character.advantageSources.label', + hint: 'DAGGERHEART.ACTORS.Character.advantageSources.hint' + }), + disadvantageSources: new fields.ArrayField(new fields.StringField(), { + label: 'DAGGERHEART.ACTORS.Character.disadvantageSources.label', + hint: 'DAGGERHEART.ACTORS.Character.disadvantageSources.hint' + }), levelData: new fields.EmbeddedDataField(DhLevelData), bonuses: new fields.SchemaField({ - armorScore: 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 }), - spellcast: new fields.NumberField({ integer: true, initial: 0 }), - action: new fields.NumberField({ integer: true, initial: 0 }), - hopeOrFear: new fields.NumberField({ integer: true, initial: 0 }) + attack: bonusField('DAGGERHEART.GENERAL.Roll.attack'), + spellcast: bonusField('DAGGERHEART.GENERAL.Roll.spellcast'), + trait: bonusField('DAGGERHEART.GENERAL.Roll.trait'), + action: bonusField('DAGGERHEART.GENERAL.Roll.action'), + reaction: bonusField('DAGGERHEART.GENERAL.Roll.reaction'), + primaryWeapon: bonusField('DAGGERHEART.GENERAL.Roll.primaryWeaponAttack'), + secondaryWeapon: bonusField('DAGGERHEART.GENERAL.Roll.secondaryWeaponAttack') }), 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 }) + physical: bonusField('DAGGERHEART.GENERAL.Damage.physicalDamage'), + magical: bonusField('DAGGERHEART.GENERAL.Damage.magicalDamage'), + primaryWeapon: bonusField('DAGGERHEART.GENERAL.Damage.primaryWeapon'), + secondaryWeapon: bonusField('DAGGERHEART.GENERAL.Damage.secondaryWeapon') + }), + healing: bonusField('DAGGERHEART.GENERAL.Healing.healingAmount'), + range: new fields.SchemaField({ + weapon: new fields.NumberField({ + integer: true, + initial: 0, + label: 'DAGGERHEART.GENERAL.Range.weapon' + }), + spell: new fields.NumberField({ + integer: true, + initial: 0, + label: 'DAGGERHEART.GENERAL.Range.spell' + }), + other: new fields.NumberField({ + integer: true, + initial: 0, + label: 'DAGGERHEART.GENERAL.Range.other' + }) + }), + rally: new fields.ArrayField(new fields.StringField(), { + label: 'DAGGERHEART.CLASS.Feature.rallyDice' + }), + rest: new fields.SchemaField({ + shortRest: new fields.SchemaField({ + shortMoves: new fields.NumberField({ + required: true, + integer: true, + min: 0, + initial: 0, + label: 'DAGGERHEART.GENERAL.Bonuses.rest.shortRest.shortRestMoves.label', + hint: 'DAGGERHEART.GENERAL.Bonuses.rest.shortRest.shortRestMoves.hint' + }), + longMoves: new fields.NumberField({ + required: true, + integer: true, + min: 0, + initial: 0, + label: 'DAGGERHEART.GENERAL.Bonuses.rest.shortRest.longRestMoves.label', + hint: 'DAGGERHEART.GENERAL.Bonuses.rest.shortRest.longRestMoves.hint' + }) + }), + longRest: new fields.SchemaField({ + shortMoves: new fields.NumberField({ + required: true, + integer: true, + min: 0, + initial: 0, + label: 'DAGGERHEART.GENERAL.Bonuses.rest.longRest.shortRestMoves.label', + hint: 'DAGGERHEART.GENERAL.Bonuses.rest.longRest.shortRestMoves.hint' + }), + longMoves: new fields.NumberField({ + required: true, + integer: true, + min: 0, + initial: 0, + label: 'DAGGERHEART.GENERAL.Bonuses.rest.longRest.longRestMoves.label', + hint: 'DAGGERHEART.GENERAL.Bonuses.rest.longRest.longRestMoves.hint' + }) + }) }) }), 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 }) + damageReduction: new fields.SchemaField({ + maxArmorMarked: new fields.SchemaField({ + value: new fields.NumberField({ + required: true, + integer: true, + initial: 1, + label: 'DAGGERHEART.GENERAL.Rules.damageReduction.maxArmorMarkedBonus' + }), + stressExtra: new fields.NumberField({ + required: true, + integer: true, + initial: 0, + label: 'DAGGERHEART.GENERAL.Rules.damageReduction.maxArmorMarkedStress.label', + hint: 'DAGGERHEART.GENERAL.Rules.damageReduction.maxArmorMarkedStress.hint' + }) + }), + stressDamageReduction: new fields.SchemaField({ + severe: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.severe'), + major: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.major'), + minor: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.minor') + }), + increasePerArmorMark: new fields.NumberField({ + integer: true, + initial: 1, + label: 'DAGGERHEART.GENERAL.Rules.damageReduction.increasePerArmorMark.label', + hint: 'DAGGERHEART.GENERAL.Rules.damageReduction.increasePerArmorMark.hint' + }), + magical: new fields.BooleanField({ initial: false }), + physical: new fields.BooleanField({ initial: false }) }), - stressDamageReduction: new fields.SchemaField({ - severe: stressDamageReductionRule(), - major: stressDamageReductionRule(), - minor: stressDamageReductionRule() + attack: new fields.SchemaField({ + damage: new fields.SchemaField({ + value: new fields.StringField({ + required: true, + initial: '@profd4', + label: 'DAGGERHEART.GENERAL.Rules.attack.damage.value.label' + }) + }) }), - strangePatterns: new fields.NumberField({ - integer: true, - min: 1, - max: 12, - 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 }) }) @@ -169,6 +290,11 @@ export default class DhCharacter extends BaseDataActor { return !this.class.value || !this.class.subclass; } + get spellcastModifier() { + const subClasses = this.parent.items.filter(x => x.type === 'subclass') ?? []; + return Math.max(subClasses?.map(sc => this.traits[sc.system.spellcastingTrait]?.value)); + } + get spellcastingModifiers() { return { main: this.class.subclass?.system?.spellcastingTrait, @@ -198,6 +324,24 @@ export default class DhCharacter extends BaseDataActor { return this.parent.items.find(x => x.type === 'armor' && x.system.equipped); } + get activeBeastform() { + return this.parent.effects.find(x => x.type === 'beastform'); + } + + get usedUnarmed() { + const primaryWeaponEquipped = this.primaryWeapon?.system?.equipped; + const secondaryWeaponEquipped = this.secondaryWeapon?.system?.equipped; + return !primaryWeaponEquipped && !secondaryWeaponEquipped + ? { + ...this.attack, + id: this.attack.id, + name: this.activeBeastform ? 'DAGGERHEART.ITEMS.Beastform.attackName' : this.attack.name, + img: this.activeBeastform ? 'icons/creatures/claws/claw-straight-brown.webp' : this.attack.img, + actor: this.parent + } + : null; + } + get sheetLists() { const ancestryFeatures = [], communityFeatures = [], @@ -207,23 +351,23 @@ export default class DhCharacter extends BaseDataActor { features = []; for (let item of this.parent.items) { - if (item.system.type === CONFIG.DH.ITEM.featureTypes.ancestry.id) { + if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.ancestry.id) { ancestryFeatures.push(item); - } else if (item.system.type === CONFIG.DH.ITEM.featureTypes.community.id) { + } else if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.community.id) { communityFeatures.push(item); - } else if (item.system.type === CONFIG.DH.ITEM.featureTypes.class.id) { + } else if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.class.id) { classFeatures.push(item); - } else if (item.system.type === CONFIG.DH.ITEM.featureTypes.subclass.id) { + } else if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.subclass.id) { const subclassState = this.class.subclass.system.featureState; - const identifier = item.system.identifier; + const subType = item.system.subType; if ( - identifier === 'foundationFeature' || - (identifier === 'specializationFeature' && subclassState >= 2) || - (identifier === 'masterFeature' && subclassState >= 3) + subType === CONFIG.DH.ITEM.featureSubTypes.foundation || + (subType === CONFIG.DH.ITEM.featureSubTypes.specialization && subclassState >= 2) || + (subType === CONFIG.DH.ITEM.featureSubTypes.mastery && subclassState >= 3) ) { subclassFeatures.push(item); } - } else if (item.system.type === CONFIG.DH.ITEM.featureTypes.companion.id) { + } else if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.companion.id) { companionFeatures.push(item); } else if (item.type === 'feature' && !item.system.type) { features.push(item); @@ -278,9 +422,14 @@ export default class DhCharacter extends BaseDataActor { } get deathMoveViable() { - return ( - this.resources.hitPoints.maxTotal > 0 && this.resources.hitPoints.value >= this.resources.hitPoints.maxTotal - ); + return this.resources.hitPoints.max > 0 && this.resources.hitPoints.value >= this.resources.hitPoints.max; + } + + get armorApplicableDamageTypes() { + return { + physical: !this.rules.damageReduction.magical, + magical: !this.rules.damageReduction.physical + }; } static async unequipBeforeEquip(itemToEquip) { @@ -306,6 +455,8 @@ export default class DhCharacter extends BaseDataActor { } prepareBaseData() { + this.evasion = this.class.value?.system?.evasion ?? 0; + const currentLevel = this.levelData.level.current; const currentTier = currentLevel === 1 @@ -316,32 +467,32 @@ export default class DhCharacter extends BaseDataActor { for (let levelKey in this.levelData.levelups) { const level = this.levelData.levelups[levelKey]; - this.proficiency.bonus += level.achievements.proficiency; + this.proficiency += level.achievements.proficiency; for (let selection of level.selections) { switch (selection.type) { case 'trait': selection.data.forEach(data => { - this.traits[data].bonus += 1; + this.traits[data].value += 1; this.traits[data].tierMarked = selection.tier === currentTier; }); break; case 'hitPoint': - this.resources.hitPoints.bonus += selection.value; + this.resources.hitPoints.max += selection.value; break; case 'stress': - this.resources.stress.bonus += selection.value; + this.resources.stress.max += selection.value; break; case 'evasion': - this.evasion.bonus += selection.value; + this.evasion += selection.value; break; case 'proficiency': - this.proficiency.bonus = selection.value; + this.proficiency = selection.value; break; case 'experience': Object.keys(this.experiences).forEach(key => { const experience = this.experiences[key]; - experience.bonus += selection.value; + experience.value += selection.value; }); break; } @@ -349,6 +500,7 @@ export default class DhCharacter extends BaseDataActor { } const armor = this.armor; + this.armorScore = armor ? armor.system.baseScore : 0; this.damageThresholds = { major: armor ? armor.system.baseThresholds.major + this.levelData.level.current @@ -357,38 +509,19 @@ export default class DhCharacter extends BaseDataActor { ? armor.system.baseThresholds.severe + this.levelData.level.current : this.levelData.level.current * 2 }; + this.resources.hope.max -= Object.keys(this.scars).length; + this.resources.hitPoints.max = this.class.value?.system?.hitPoints ?? 0; } prepareDerivedData() { - this.resources.hope.max -= Object.keys(this.scars).length; - this.resources.hope.value = Math.min(this.resources.hope.value, this.resources.hope.max); - - for (var traitKey in this.traits) { - var trait = this.traits[traitKey]; - trait.total = (trait.value ?? 0) + trait.bonus; - } - - for (var experienceKey in this.experiences) { - var experience = this.experiences[experienceKey]; - experience.total = experience.value + experience.bonus; - } - - this.rules.maxArmorMarked.total = this.rules.maxArmorMarked.value + this.rules.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; - this.proficiency.total = this.proficiency.value + this.proficiency.bonus; + const baseHope = this.resources.hope.value + (this.companion?.system?.resources?.hope ?? 0); + this.resources.hope.value = Math.min(baseHope, this.resources.hope.max); } getRollData() { const data = super.getRollData(); return { ...data, - ...this.resources.tokens, - ...this.resources.dice, - ...this.bonuses, tier: this.tier, level: this.levelData.level.current }; diff --git a/module/data/actor/companion.mjs b/module/data/actor/companion.mjs index 1203cc96..b7774284 100644 --- a/module/data/actor/companion.mjs +++ b/module/data/actor/companion.mjs @@ -4,6 +4,7 @@ import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs'; import ActionField from '../fields/actionField.mjs'; import { adjustDice, adjustRange } from '../../helpers/utils.mjs'; import DHCompanionSettings from '../../applications/sheets-configs/companion-settings.mjs'; +import { resourceField, bonusField } from '../fields/actorField.mjs'; export default class DhCompanion extends BaseDataActor { static LOCALIZATION_PREFIXES = ['DAGGERHEART.ACTORS.Companion']; @@ -12,6 +13,7 @@ export default class DhCompanion extends BaseDataActor { return foundry.utils.mergeObject(super.metadata, { label: 'TYPES.Actor.companion', type: 'companion', + isNPC: false, settingSheet: DHCompanionSettings }); } @@ -20,24 +22,23 @@ export default class DhCompanion extends BaseDataActor { const fields = foundry.data.fields; return { + ...super.defineSchema(), partner: new ForeignDocumentUUIDField({ type: 'Actor' }), resources: new fields.SchemaField({ - stress: new fields.SchemaField({ - value: new fields.NumberField({ initial: 0, integer: true }), - bonus: new fields.NumberField({ initial: 0, integer: true }), - max: new fields.NumberField({ initial: 3, integer: true }) - }), - hope: new fields.NumberField({ initial: 0, integer: true }) + stress: resourceField(3, 'DAGGERHEART.GENERAL.stress', true), + hope: new fields.NumberField({ initial: 0, integer: true, label: 'DAGGERHEART.GENERAL.hope' }) }), - evasion: new fields.SchemaField({ - value: new fields.NumberField({ required: true, min: 1, initial: 10, integer: true }), - bonus: new fields.NumberField({ initial: 0, integer: true }) + evasion: new fields.NumberField({ + required: true, + min: 1, + initial: 10, + integer: true, + label: 'DAGGERHEART.GENERAL.evasion' }), experiences: new fields.TypedObjectField( new fields.SchemaField({ name: new fields.StringField({}), - value: new fields.NumberField({ integer: true, initial: 0 }), - bonus: new fields.NumberField({ integer: true, initial: 0 }) + value: new fields.NumberField({ integer: true, initial: 0 }) }), { initial: { @@ -59,17 +60,16 @@ export default class DhCompanion extends BaseDataActor { amount: 1 }, roll: { - type: 'weapon', - bonus: 0, - trait: 'instinct' + type: 'attack', + bonus: 0 }, damage: { parts: [ { - multiplier: 'flat', + type: ['physical'], value: { dice: 'd6', - multiplier: 'flat' + multiplier: 'prof' } } ] @@ -77,20 +77,22 @@ export default class DhCompanion extends BaseDataActor { } }), actions: new fields.ArrayField(new ActionField()), - levelData: new fields.EmbeddedDataField(DhLevelData) + levelData: new fields.EmbeddedDataField(DhLevelData), + bonuses: new fields.SchemaField({ + damage: new fields.SchemaField({ + physical: bonusField('DAGGERHEART.GENERAL.Damage.physicalDamage'), + magical: bonusField('DAGGERHEART.GENERAL.Damage.magicalDamage') + }) + }) }; } - get traits() { - return { - instinct: { total: this.attack.roll.bonus } - }; + get proficiency() { + return this.partner?.system?.proficiency ?? 1; } prepareBaseData() { - const partnerSpellcastingModifier = this.partner?.system?.spellcastingModifiers?.main; - const spellcastingModifier = this.partner?.system?.traits?.[partnerSpellcastingModifier]?.total; - this.attack.roll.bonus = spellcastingModifier ?? 0; // Needs to expand on which modifier it is that should be used because of multiclassing; + this.attack.roll.bonus = this.partner?.system?.spellcastModifier ?? 0; for (let levelKey in this.levelData.levelups) { const level = this.levelData.levelups[levelKey]; @@ -107,15 +109,15 @@ export default class DhCompanion extends BaseDataActor { } break; case 'stress': - this.resources.stress.bonus += selection.value; + this.resources.stress.max += selection.value; break; case 'evasion': - this.evasion.bonus += selection.value; + this.evasion += selection.value; break; case 'experience': Object.keys(this.experiences).forEach(key => { const experience = this.experiences[key]; - experience.bonus += selection.value; + experience.value += selection.value; }); break; } @@ -123,20 +125,6 @@ export default class DhCompanion extends BaseDataActor { } } - prepareDerivedData() { - for (var experienceKey in this.experiences) { - var experience = this.experiences[experienceKey]; - experience.total = experience.value + experience.bonus; - } - - if (this.partner) { - this.partner.system.resources.hope.max += this.resources.hope; - } - - this.resources.stress.maxTotal = this.resources.stress.max + this.resources.stress.bonus; - this.evasion.total = this.evasion.value + this.evasion.bonus; - } - async _preDelete() { if (this.partner) { await this.partner.update({ 'system.companion': null }); diff --git a/module/data/actor/environment.mjs b/module/data/actor/environment.mjs index 76990e88..e9a484b3 100644 --- a/module/data/actor/environment.mjs +++ b/module/data/actor/environment.mjs @@ -9,20 +9,22 @@ export default class DhEnvironment extends BaseDataActor { return foundry.utils.mergeObject(super.metadata, { label: 'TYPES.Actor.environment', type: 'environment', - settingSheet: DHEnvironmentSettings + settingSheet: DHEnvironmentSettings, + hasResistances: false }); } static defineSchema() { const fields = foundry.data.fields; return { - tier: new fields.StringField({ + ...super.defineSchema(), + tier: new fields.NumberField({ required: true, + integer: true, choices: CONFIG.DH.GENERAL.tiers, - initial: CONFIG.DH.GENERAL.tiers.tier1.id + initial: CONFIG.DH.GENERAL.tiers[1].id }), type: new fields.StringField({ choices: CONFIG.DH.ACTOR.environmentTypes }), - description: new fields.StringField(), impulses: new fields.StringField(), difficulty: new fields.NumberField({ required: true, initial: 11, integer: true }), potentialAdversaries: new fields.TypedObjectField( diff --git a/module/data/countdowns.mjs b/module/data/countdowns.mjs index e9649f6e..34e8b790 100644 --- a/module/data/countdowns.mjs +++ b/module/data/countdowns.mjs @@ -102,7 +102,7 @@ class DhCountdown extends foundry.abstract.DataModel { value: new fields.StringField({ required: true, choices: CONFIG.DH.GENERAL.countdownTypes, - initial: CONFIG.DH.GENERAL.countdownTypes.spotlight.id, + initial: CONFIG.DH.GENERAL.countdownTypes.custom.id, label: 'DAGGERHEART.APPLICATIONS.Countdown.FIELDS.countdowns.element.progress.type.value.label' }), label: new fields.StringField({ @@ -132,7 +132,13 @@ class DhCountdown extends foundry.abstract.DataModel { export const registerCountdownHooks = () => { Hooks.on(socketEvent.Refresh, ({ refreshType, application }) => { if (refreshType === RefreshType.Countdown) { - foundry.applications.instances.get(application)?.render(); + if (application) { + foundry.applications.instances.get(application)?.render(); + } else { + foundry.applications.instances.get('narrative-countdowns')?.render(); + foundry.applications.instances.get('encounter-countdowns')?.render(); + } + return false; } }); diff --git a/module/data/fields/actorField.mjs b/module/data/fields/actorField.mjs new file mode 100644 index 00000000..0b1113fb --- /dev/null +++ b/module/data/fields/actorField.mjs @@ -0,0 +1,32 @@ +const fields = foundry.data.fields; + +const attributeField = label => + new fields.SchemaField({ + value: new fields.NumberField({ initial: 0, integer: true, label }), + tierMarked: new fields.BooleanField({ initial: false }) + }); + +const resourceField = (max = 0, label, reverse = false) => + new fields.SchemaField({ + value: new fields.NumberField({ initial: 0, integer: true, label }), + max: new fields.NumberField({ initial: max, integer: true }), + isReversed: new fields.BooleanField({ initial: reverse }) + }); + +const stressDamageReductionRule = localizationPath => + new fields.SchemaField({ + enabled: new fields.BooleanField({ required: true, initial: false }), + cost: new fields.NumberField({ + integer: true, + label: `${localizationPath}.label`, + hint: `${localizationPath}.hint` + }) + }); + +const bonusField = label => + new fields.SchemaField({ + bonus: new fields.NumberField({ integer: true, initial: 0, label: `${game.i18n.localize(label)} Value` }), + dice: new fields.ArrayField(new fields.StringField(), { label: `${game.i18n.localize(label)} Dice` }) + }); + +export { attributeField, resourceField, stressDamageReductionRule, bonusField }; diff --git a/module/data/item/_module.mjs b/module/data/item/_module.mjs index a29d1595..bed18eb5 100644 --- a/module/data/item/_module.mjs +++ b/module/data/item/_module.mjs @@ -1,5 +1,6 @@ import DHAncestry from './ancestry.mjs'; import DHArmor from './armor.mjs'; +import DHAttachableItem from './attachableItem.mjs'; import DHClass from './class.mjs'; import DHCommunity from './community.mjs'; import DHConsumable from './consumable.mjs'; @@ -13,6 +14,7 @@ import DHBeastform from './beastform.mjs'; export { DHAncestry, DHArmor, + DHAttachableItem, DHClass, DHCommunity, DHConsumable, @@ -27,6 +29,7 @@ export { export const config = { ancestry: DHAncestry, armor: DHArmor, + attachableItem: DHAttachableItem, class: DHClass, community: DHCommunity, consumable: DHConsumable, diff --git a/module/data/item/ancestry.mjs b/module/data/item/ancestry.mjs index 463fe6c1..71b7683d 100644 --- a/module/data/item/ancestry.mjs +++ b/module/data/item/ancestry.mjs @@ -18,4 +18,20 @@ export default class DHAncestry extends BaseDataItem { features: new ForeignDocumentUUIDArrayField({ type: 'Item' }) }; } + + get primaryFeature() { + return ( + this.features.find(x => x?.system?.subType === CONFIG.DH.ITEM.featureSubTypes.primary) ?? + (this.features.filter(x => !x).length > 0 ? {} : null) + ); + } + + get secondaryFeature() { + return ( + this.features.find(x => x?.system?.subType === CONFIG.DH.ITEM.featureSubTypes.secondary) ?? + (this.features.filter(x => !x || x.system.subType === CONFIG.DH.ITEM.featureSubTypes.primary).length > 1 + ? {} + : null) + ); + } } diff --git a/module/data/item/armor.mjs b/module/data/item/armor.mjs index 4e5a26e6..8522c8fc 100644 --- a/module/data/item/armor.mjs +++ b/module/data/item/armor.mjs @@ -1,15 +1,15 @@ -import BaseDataItem from './base.mjs'; +import AttachableItem from './attachableItem.mjs'; import ActionField from '../fields/actionField.mjs'; import { armorFeatures } from '../../config/itemConfig.mjs'; +import { actionsTypes } from '../action/_module.mjs'; -export default class DHArmor extends BaseDataItem { +export default class DHArmor extends AttachableItem { /** @inheritDoc */ static get metadata() { return foundry.utils.mergeObject(super.metadata, { label: 'TYPES.Item.armor', type: 'armor', hasDescription: true, - isQuantifiable: true, isInventoryItem: true }); } @@ -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,28 @@ export default class DHArmor extends BaseDataItem { }; } - get featureInfo() { - return this.feature ? CONFIG.DH.ITEM.armorFeatures[this.feature] : null; + get customActions() { + return this.actions.filter( + action => !this.armorFeatures.some(feature => feature.actionIds.includes(action.id)) + ); } 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/attachableItem.mjs b/module/data/item/attachableItem.mjs new file mode 100644 index 00000000..d2ef8d22 --- /dev/null +++ b/module/data/item/attachableItem.mjs @@ -0,0 +1,160 @@ +import BaseDataItem from './base.mjs'; + +export default class AttachableItem extends BaseDataItem { + static defineSchema() { + const fields = foundry.data.fields; + return { + ...super.defineSchema(), + attached: new fields.ArrayField(new fields.DocumentUUIDField({ type: 'Item', nullable: true })) + }; + } + + async _preUpdate(changes, options, user) { + const allowed = await super._preUpdate(changes, options, user); + if (allowed === false) return false; + + // Handle equipped status changes for attachment effects + if (changes.system?.equipped !== undefined && changes.system.equipped !== this.equipped) { + await this.#handleAttachmentEffectsOnEquipChange(changes.system.equipped); + } + } + + async #handleAttachmentEffectsOnEquipChange(newEquippedStatus) { + const actor = this.parent.parent?.type === 'character' ? this.parent.parent : this.parent.parent?.parent; + const parentType = this.parent.type; + + if (!actor || !this.attached?.length) { + return; + } + + if (newEquippedStatus) { + // Item is being equipped - add attachment effects + for (const attachedUuid of this.attached) { + const attachedItem = await fromUuid(attachedUuid); + if (attachedItem && attachedItem.effects.size > 0) { + await this.#copyAttachmentEffectsToActor({ + attachedItem, + attachedUuid, + parentType + }); + } + } + } else { + // Item is being unequipped - remove attachment effects + await this.#removeAllAttachmentEffects(parentType); + } + } + + async #copyAttachmentEffectsToActor({ attachedItem, attachedUuid, parentType }) { + const actor = this.parent.parent; + if (!actor || !attachedItem.effects.size > 0 || !this.equipped) { + return []; + } + + const effectsToCreate = []; + for (const effect of attachedItem.effects) { + const effectData = effect.toObject(); + effectData.origin = `${this.parent.uuid}:${attachedUuid}`; + + const attachmentSource = { + itemUuid: attachedUuid, + originalEffectId: effect.id + }; + attachmentSource[`${parentType}Uuid`] = this.parent.uuid; + + effectData.flags = { + ...effectData.flags, + [CONFIG.DH.id]: { + ...effectData.flags?.[CONFIG.DH.id], + [CONFIG.DH.FLAGS.itemAttachmentSource]: attachmentSource + } + }; + effectsToCreate.push(effectData); + } + + if (effectsToCreate.length > 0) { + return await actor.createEmbeddedDocuments('ActiveEffect', effectsToCreate); + } + + return []; + } + + async #removeAllAttachmentEffects(parentType) { + const actor = this.parent.parent; + if (!actor) return; + + const parentUuidProperty = `${parentType}Uuid`; + const effectsToRemove = actor.effects.filter(effect => { + const attachmentSource = effect.getFlag(CONFIG.DH.id, CONFIG.DH.FLAGS.itemAttachmentSource); + return attachmentSource && attachmentSource[parentUuidProperty] === this.parent.uuid; + }); + + if (effectsToRemove.length > 0) { + await actor.deleteEmbeddedDocuments( + 'ActiveEffect', + effectsToRemove.map(e => e.id) + ); + } + } + + /** + * Public method for adding an attachment + */ + async addAttachment(droppedItem) { + const newUUID = droppedItem.uuid; + + if (this.attached.includes(newUUID)) { + ui.notifications.warn(`${droppedItem.name} is already attached to this ${this.parent.type}.`); + return; + } + + const updatedAttached = [...this.attached, newUUID]; + await this.parent.update({ + 'system.attached': updatedAttached + }); + + // Copy effects if equipped + if (this.equipped && droppedItem.effects.size > 0) { + await this.#copyAttachmentEffectsToActor({ + attachedItem: droppedItem, + attachedUuid: newUUID, + parentType: this.parent.type + }); + } + } + + /** + * Public method for removing an attachment + */ + async removeAttachment(attachedUuid) { + await this.parent.update({ + 'system.attached': this.attached.filter(uuid => uuid !== attachedUuid) + }); + + // Remove effects + await this.#removeAttachmentEffects(attachedUuid); + } + + async #removeAttachmentEffects(attachedUuid) { + const actor = this.parent.parent; + if (!actor) return; + + const parentType = this.parent.type; + const parentUuidProperty = `${parentType}Uuid`; + const effectsToRemove = actor.effects.filter(effect => { + const attachmentSource = effect.getFlag(CONFIG.DH.id, CONFIG.DH.FLAGS.itemAttachmentSource); + return ( + attachmentSource && + attachmentSource[parentUuidProperty] === this.parent.uuid && + attachmentSource.itemUuid === attachedUuid + ); + }); + + if (effectsToRemove.length > 0) { + await actor.deleteEmbeddedDocuments( + 'ActiveEffect', + effectsToRemove.map(e => e.id) + ); + } + } +} diff --git a/module/data/item/base.mjs b/module/data/item/base.mjs index 9358a6b3..24e5e0cc 100644 --- a/module/data/item/base.mjs +++ b/module/data/item/base.mjs @@ -11,12 +11,15 @@ const fields = foundry.data.fields; export default class BaseDataItem extends foundry.abstract.TypeDataModel { + static LOCALIZATION_PREFIXES = ['DAGGERHEART.ITEMS']; + /** @returns {ItemDataModelMetadata}*/ static get metadata() { return { label: 'Base Item', type: 'base', hasDescription: false, + hasResource: false, isQuantifiable: false, isInventoryItem: false }; @@ -33,6 +36,36 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel { if (this.metadata.hasDescription) schema.description = new fields.HTMLField({ required: true, nullable: true }); + if (this.metadata.hasResource) { + schema.resource = new fields.SchemaField( + { + type: new fields.StringField({ + choices: CONFIG.DH.ITEM.itemResourceTypes, + initial: CONFIG.DH.ITEM.itemResourceTypes.simple + }), + value: new fields.NumberField({ integer: true, min: 0, initial: 0 }), + max: new fields.StringField({ nullable: true, initial: null }), + icon: new fields.StringField(), + recovery: new fields.StringField({ + choices: CONFIG.DH.GENERAL.refreshTypes, + initial: null, + nullable: true + }), + diceStates: new fields.TypedObjectField( + new fields.SchemaField({ + value: new fields.NumberField({ integer: true, initial: 1, min: 1 }), + used: new fields.BooleanField({ initial: false }) + }) + ), + dieFaces: new fields.StringField({ + choices: CONFIG.DH.GENERAL.diceTypes, + initial: CONFIG.DH.GENERAL.diceTypes.d4 + }) + }, + { nullable: true, initial: null } + ); + } + if (this.metadata.isQuantifiable) schema.quantity = new fields.NumberField({ integer: true, initial: 1, min: 0, required: true }); @@ -62,28 +95,27 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel { return data; } - /**@inheritdoc */ async _preCreate(data, options, user) { // Skip if no initial action is required or actions already exist - if (!this.metadata.hasInitialAction || !foundry.utils.isEmpty(this.actions)) return; + if (this.metadata.hasInitialAction && foundry.utils.isEmpty(this.actions)) { + const metadataType = this.metadata.type; + const actionType = { weapon: 'attack' }[metadataType]; + const ActionClass = game.system.api.models.actions.actionsTypes[actionType]; - const metadataType = this.metadata.type; - const actionType = { weapon: 'attack' }[metadataType]; - const ActionClass = game.system.api.models.actions.actionsTypes[actionType]; + const action = new ActionClass( + { + _id: foundry.utils.randomID(), + type: actionType, + name: game.i18n.localize(CONFIG.DH.ACTIONS.actionTypes[actionType].name), + ...ActionClass.getSourceConfig(this.parent) + }, + { + parent: this.parent + } + ); - const action = new ActionClass( - { - _id: foundry.utils.randomID(), - type: actionType, - name: game.i18n.localize(CONFIG.DH.ACTIONS.actionTypes[actionType].name), - ...ActionClass.getSourceConfig(this.parent) - }, - { - parent: this.parent - } - ); - - this.updateSource({ actions: [action] }); + this.updateSource({ actions: [action] }); + } } _onCreate(data) { @@ -95,7 +127,7 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel { ...feature, system: { ...feature.system, - type: this.parent.type, + originItemType: this.parent.type, originId: data._id, identifier: feature.identifier } diff --git a/module/data/item/beastform.mjs b/module/data/item/beastform.mjs index 2eb871ec..226504df 100644 --- a/module/data/item/beastform.mjs +++ b/module/data/item/beastform.mjs @@ -3,7 +3,7 @@ import ForeignDocumentUUIDArrayField from '../fields/foreignDocumentUUIDArrayFie import BaseDataItem from './base.mjs'; export default class DHBeastform extends BaseDataItem { - static LOCALIZATION_PREFIXES = ['DAGGERHEART.Sheets.Beastform']; + static LOCALIZATION_PREFIXES = ['DAGGERHEART.ITEMS.Beastform']; /** @inheritDoc */ static get metadata() { @@ -19,23 +19,65 @@ export default class DHBeastform extends BaseDataItem { const fields = foundry.data.fields; return { ...super.defineSchema(), - tier: new fields.StringField({ + beastformType: new fields.StringField({ required: true, + choices: CONFIG.DH.ITEM.beastformTypes, + initial: CONFIG.DH.ITEM.beastformTypes.normal.id + }), + tier: new fields.NumberField({ + required: true, + integer: true, choices: CONFIG.DH.GENERAL.tiers, - initial: CONFIG.DH.GENERAL.tiers.tier1.id + initial: CONFIG.DH.GENERAL.tiers[1].id }), tokenImg: new fields.FilePathField({ initial: 'icons/svg/mystery-man.svg', categories: ['IMAGE'], base64: false }), + tokenRingImg: new fields.FilePathField({ + initial: 'icons/svg/mystery-man.svg', + categories: ['IMAGE'], + base64: false + }), tokenSize: new fields.SchemaField({ height: new fields.NumberField({ integer: true, min: 1, initial: null, nullable: true }), width: new fields.NumberField({ integer: true, min: 1, initial: null, nullable: true }) }), + mainTrait: new fields.StringField({ + required: true, + choices: CONFIG.DH.ACTOR.abilities, + initial: CONFIG.DH.ACTOR.abilities.agility.id + }), examples: new fields.StringField(), - advantageOn: new fields.ArrayField(new fields.StringField()), - features: new ForeignDocumentUUIDArrayField({ type: 'Item' }) + advantageOn: new fields.TypedObjectField( + new fields.SchemaField({ + value: new fields.StringField() + }) + ), + features: new ForeignDocumentUUIDArrayField({ type: 'Item' }), + evolved: new fields.SchemaField({ + maximumTier: new fields.NumberField({ + integer: true, + choices: CONFIG.DH.GENERAL.tiers + }), + mainTraitBonus: new fields.NumberField({ + required: true, + integer: true, + min: 0, + initial: 0 + }) + }), + hybrid: new fields.SchemaField({ + maximumTier: new fields.NumberField({ + integer: true, + choices: CONFIG.DH.GENERAL.tiers, + label: 'DAGGERHEART.ITEMS.Beastform.FIELDS.evolved.maximumTier.label' + }), + beastformOptions: new fields.NumberField({ required: true, integer: true, initial: 2, min: 2 }), + advantages: new fields.NumberField({ required: true, integer: true, initial: 2, min: 2 }), + features: new fields.NumberField({ required: true, integer: true, initial: 2, min: 2 }) + }) }; } @@ -56,40 +98,64 @@ export default class DHBeastform extends BaseDataItem { 'Item', this.features.map(x => x.toObject()) ); - const effects = await this.parent.parent.createEmbeddedDocuments( + + const extraEffects = await this.parent.parent.createEmbeddedDocuments( 'ActiveEffect', - this.parent.effects.map(x => x.toObject()) + this.parent.effects.filter(x => x.type !== 'beastform').map(x => x.toObject()) ); - await this.parent.parent.createEmbeddedDocuments('ActiveEffect', [ - { - type: 'beastform', - name: game.i18n.localize('DAGGERHEART.ITEMS.Beastform.beastformEffect'), - img: 'icons/creatures/abilities/paw-print-pair-purple.webp', - system: { - isBeastform: true, - characterTokenData: { - tokenImg: this.parent.parent.prototypeToken.texture.src, - tokenSize: { - height: this.parent.parent.prototypeToken.height, - width: this.parent.parent.prototypeToken.width - } - }, - advantageOn: this.advantageOn, - featureIds: features.map(x => x.id), - effectIds: effects.map(x => x.id) + const beastformEffect = this.parent.effects.find(x => x.type === 'beastform'); + await beastformEffect.updateSource({ + changes: [ + ...beastformEffect.changes, + { + key: 'system.advantageSources', + mode: 2, + value: Object.values(this.advantageOn) + .map(x => x.value) + .join(', ') } + ], + system: { + characterTokenData: { + tokenImg: this.parent.parent.prototypeToken.texture.src, + tokenRingImg: this.parent.parent.prototypeToken.ring.subject.texture, + tokenSize: { + height: this.parent.parent.prototypeToken.height, + width: this.parent.parent.prototypeToken.width + } + }, + advantageOn: this.advantageOn, + featureIds: features.map(x => x.id), + effectIds: extraEffects.map(x => x.id) } - ]); + }); + + await this.parent.parent.createEmbeddedDocuments('ActiveEffect', [beastformEffect.toObject()]); await updateActorTokens(this.parent.parent, { height: this.tokenSize.height, width: this.tokenSize.width, texture: { src: this.tokenImg + }, + ring: { + subject: { + texture: this.tokenRingImg + } } }); return false; } + + _onCreate() { + this.parent.createEmbeddedDocuments('ActiveEffect', [ + { + type: 'beastform', + name: game.i18n.localize('DAGGERHEART.ITEMS.Beastform.beastformEffect'), + img: 'icons/creatures/abilities/paw-print-pair-purple.webp' + } + ]); + } } diff --git a/module/data/item/class.mjs b/module/data/item/class.mjs index 4d951ed4..4016a4c7 100644 --- a/module/data/item/class.mjs +++ b/module/data/item/class.mjs @@ -24,11 +24,10 @@ export default class DHClass extends BaseDataItem { integer: true, min: 1, initial: 5, - label: 'DAGGERHEART.GENERAL.hitPoints' + label: 'DAGGERHEART.GENERAL.HitPoints.plural' }), evasion: new fields.NumberField({ initial: 0, integer: true, label: 'DAGGERHEART.GENERAL.evasion' }), - hopeFeatures: new ForeignDocumentUUIDArrayField({ type: 'Item' }), - classFeatures: new ForeignDocumentUUIDArrayField({ type: 'Item' }), + features: new ForeignDocumentUUIDArrayField({ type: 'Item' }), subclasses: new ForeignDocumentUUIDArrayField({ type: 'Item', required: false }), inventory: new fields.SchemaField({ take: new ForeignDocumentUUIDArrayField({ type: 'Item', required: false }), @@ -52,12 +51,18 @@ export default class DHClass extends BaseDataItem { }; } - get hopeFeature() { - return this.hopeFeatures.length > 0 ? this.hopeFeatures[0] : null; + get hopeFeatures() { + return ( + this.features.filter(x => x?.system?.subType === CONFIG.DH.ITEM.featureSubTypes.hope) ?? + (this.features.filter(x => !x).length > 0 ? {} : null) + ); } - get features() { - return [...this.hopeFeatures.filter(x => x), ...this.classFeatures.filter(x => x)]; + get classFeatures() { + return ( + this.features.filter(x => x?.system?.subType === CONFIG.DH.ITEM.featureSubTypes.class) ?? + (this.features.filter(x => !x).length > 0 ? {} : null) + ); } async _preCreate(data, options, user) { diff --git a/module/data/item/domainCard.mjs b/module/data/item/domainCard.mjs index 3451a14a..df60b9d1 100644 --- a/module/data/item/domainCard.mjs +++ b/module/data/item/domainCard.mjs @@ -7,7 +7,8 @@ export default class DHDomainCard extends BaseDataItem { return foundry.utils.mergeObject(super.metadata, { label: 'TYPES.Item.domainCard', type: 'domainCard', - hasDescription: true + hasDescription: true, + hasResource: true }); } @@ -28,7 +29,6 @@ export default class DHDomainCard extends BaseDataItem { required: true, initial: CONFIG.DH.DOMAIN.cardTypes.ability.id }), - foundation: new fields.BooleanField({ initial: false }), inVault: new fields.BooleanField({ initial: false }), actions: new fields.ArrayField(new ActionField()) }; diff --git a/module/data/item/feature.mjs b/module/data/item/feature.mjs index a5b5cb3c..62b955e9 100644 --- a/module/data/item/feature.mjs +++ b/module/data/item/feature.mjs @@ -7,7 +7,8 @@ export default class DHFeature extends BaseDataItem { return foundry.utils.mergeObject(super.metadata, { label: 'TYPES.Item.feature', type: 'feature', - hasDescription: true + hasDescription: true, + hasResource: true }); } @@ -16,10 +17,33 @@ export default class DHFeature extends BaseDataItem { const fields = foundry.data.fields; return { ...super.defineSchema(), - type: new fields.StringField({ choices: CONFIG.DH.ITEM.featureTypes, nullable: true, initial: null }), + originItemType: new fields.StringField({ + choices: CONFIG.DH.ITEM.featureTypes, + nullable: true, + initial: null + }), + subType: new fields.StringField({ choices: CONFIG.DH.ITEM.featureSubTypes, nullable: true, initial: null }), originId: new fields.StringField({ nullable: true, initial: null }), identifier: new fields.StringField(), actions: new fields.ArrayField(new ActionField()) }; } + + get spellcastingModifier() { + let traitValue = 0; + if (this.actor && this.originId && ['class', 'subclass'].includes(this.originItemType)) { + if (this.originItemType === 'subclass') { + traitValue = + this.actor.system.traits[this.actor.items.get(this.originId).system.spellcastingTrait]?.value ?? 0; + } else { + const subclass = + this.actor.system.multiclass.value?.id === this.originId + ? this.actor.system.multiclass.subclass + : this.actor.system.class.subclass; + traitValue = this.actor.system.traits[subclass.system.spellcastingTrait]?.value ?? 0; + } + } + + return traitValue; + } } diff --git a/module/data/item/subclass.mjs b/module/data/item/subclass.mjs index 3c47841d..e0a76092 100644 --- a/module/data/item/subclass.mjs +++ b/module/data/item/subclass.mjs @@ -1,4 +1,4 @@ -import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs'; +import ForeignDocumentUUIDArrayField from '../fields/foreignDocumentUUIDArrayField.mjs'; import BaseDataItem from './base.mjs'; export default class DHSubclass extends BaseDataItem { @@ -22,20 +22,22 @@ export default class DHSubclass extends BaseDataItem { nullable: true, initial: null }), - foundationFeature: new ForeignDocumentUUIDField({ type: 'Item' }), - specializationFeature: new ForeignDocumentUUIDField({ type: 'Item' }), - masteryFeature: new ForeignDocumentUUIDField({ type: 'Item' }), + features: new ForeignDocumentUUIDArrayField({ type: 'Item' }), featureState: new fields.NumberField({ required: true, initial: 1, min: 1 }), isMulticlass: new fields.BooleanField({ initial: false }) }; } - get features() { - return [ - { ...this.foundationFeature.toObject(), identifier: 'foundationFeature' }, - { ...this.specializationFeature.toObject(), identifier: 'specializationFeature' }, - { ...this.masteryFeature.toObject(), identifier: 'masteryFeature' } - ]; + get foundationFeatures() { + return this.features.filter(x => x.system.subType === CONFIG.DH.ITEM.featureSubTypes.foundation); + } + + get specializationFeatures() { + return this.features.filter(x => x.system.subType === CONFIG.DH.ITEM.featureSubTypes.specialization); + } + + get masteryFeatures() { + return this.features.filter(x => x.system.subType === CONFIG.DH.ITEM.featureSubTypes.mastery); } async _preCreate(data, options, user) { diff --git a/module/data/item/weapon.mjs b/module/data/item/weapon.mjs index 3fb562e0..0d0c7f76 100644 --- a/module/data/item/weapon.mjs +++ b/module/data/item/weapon.mjs @@ -1,16 +1,15 @@ -import BaseDataItem from './base.mjs'; +import AttachableItem from './attachableItem.mjs'; import { actionsTypes } from '../action/_module.mjs'; import ActionField from '../fields/actionField.mjs'; -export default class DHWeapon extends BaseDataItem { +export default class DHWeapon extends AttachableItem { /** @inheritDoc */ static get metadata() { return foundry.utils.mergeObject(super.metadata, { label: 'TYPES.Item.weapon', type: 'weapon', hasDescription: true, - isQuantifiable: true, - isInventoryItem: true, + isInventoryItem: true // hasInitialAction: true }); } @@ -26,8 +25,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, @@ -52,14 +50,15 @@ export default class DHWeapon extends BaseDataItem { }, roll: { trait: 'agility', - type: 'weapon' + type: 'attack' }, damage: { parts: [ { + type: ['physical'], value: { multiplier: 'prof', - dice: "d8" + dice: 'd8' } } ] @@ -74,22 +73,30 @@ export default class DHWeapon extends BaseDataItem { return [this.attack, ...this.actions]; } + get customActions() { + return this.actions.filter( + action => !this.weaponFeatures.some(feature => feature.actionIds.includes(action.id)) + ); + } + 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?.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 +109,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/data/levelData.mjs b/module/data/levelData.mjs index 2432a313..669077ee 100644 --- a/module/data/levelData.mjs +++ b/module/data/levelData.mjs @@ -43,7 +43,12 @@ export default class DhLevelData extends foundry.abstract.DataModel { data: new fields.ArrayField(new fields.StringField({ required: true })), secondaryData: new fields.TypedObjectField(new fields.StringField({ required: true })), itemUuid: new fields.DocumentUUIDField({ required: true }), - featureIds: new fields.ArrayField(new fields.StringField()) + features: new fields.ArrayField( + new fields.SchemaField({ + onPartner: new fields.BooleanField(), + id: new fields.StringField() + }) + ) }) ) }) @@ -51,10 +56,6 @@ export default class DhLevelData extends foundry.abstract.DataModel { }; } - get actions() { - return Object.values(this.levelups).flatMap(level => level.selections.flatMap(s => s.actions)); - } - get canLevelUp() { return this.level.current < this.level.changed; } diff --git a/module/data/levelTier.mjs b/module/data/levelTier.mjs index b037d921..e9e8d47b 100644 --- a/module/data/levelTier.mjs +++ b/module/data/levelTier.mjs @@ -70,7 +70,8 @@ export const CompanionLevelOptionType = { { name: 'DAGGERHEART.APPLICATIONS.Levelup.actions.creatureComfort.name', img: 'icons/magic/life/heart-cross-purple-orange.webp', - description: 'DAGGERHEART.APPLICATIONS.Levelup.actions.creatureComfort.description' + description: 'DAGGERHEART.APPLICATIONS.Levelup.actions.creatureComfort.description', + toPartner: true } ] }, @@ -81,7 +82,8 @@ export const CompanionLevelOptionType = { { name: 'DAGGERHEART.APPLICATIONS.Levelup.actions.armored.name', img: 'icons/equipment/shield/kite-wooden-oak-glow.webp', - description: 'DAGGERHEART.APPLICATIONS.Levelup.actions.armored.description' + description: 'DAGGERHEART.APPLICATIONS.Levelup.actions.armored.description', + toPartner: true } ] }, @@ -100,7 +102,8 @@ export const CompanionLevelOptionType = { { name: 'DAGGERHEART.APPLICATIONS.Levelup.actions.bonded.name', img: 'icons/magic/life/heart-red-blue.webp', - description: 'DAGGERHEART.APPLICATIONS.Levelup.actions.bonded.description' + description: 'DAGGERHEART.APPLICATIONS.Levelup.actions.bonded.description', + toPartner: true } ] }, diff --git a/module/data/settings/Appearance.mjs b/module/data/settings/Appearance.mjs index 8b04f558..d8b4c687 100644 --- a/module/data/settings/Appearance.mjs +++ b/module/data/settings/Appearance.mjs @@ -40,6 +40,10 @@ export default class DhAppearance extends foundry.abstract.DataModel { outline: new fields.ColorField({ required: true, initial: '#ffffff' }), edge: new fields.ColorField({ required: true, initial: '#000000' }) }) + }), + showGenericStatusEffects: new fields.BooleanField({ + initial: true, + label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.showGenericStatusEffects.label' }) }; } diff --git a/module/data/settings/Automation.mjs b/module/data/settings/Automation.mjs index 4e375919..63377b26 100644 --- a/module/data/settings/Automation.mjs +++ b/module/data/settings/Automation.mjs @@ -1,23 +1,28 @@ export default class DhAutomation extends foundry.abstract.DataModel { - static LOCALIZATION_PREFIXES = ['DAGGERHEART.SETTINGS.Automation']; // Doesn't work for some reason - static defineSchema() { const fields = foundry.data.fields; return { - hope: new fields.BooleanField({ - required: true, - initial: false, - label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.hope.label' - }), // Label need to be updated into something like "Duality Roll Auto Gain" + a hint + hopeFear: new fields.SchemaField({ + gm: new fields.BooleanField({ + required: true, + initial: false, + label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.hopeFear.gm.label' + }), + players: new fields.BooleanField({ + required: true, + initial: false, + label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.hopeFear.players.label' + }) + }), actionPoints: new fields.BooleanField({ required: true, initial: false, label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.actionPoints.label' }), - countdowns: new fields.BooleanField({ - requireD: true, - initial: false, - label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.countdowns.label' + hordeDamage: new fields.BooleanField({ + required: true, + initial: true, + label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.hordeDamage.label' }) }; } diff --git a/module/data/settings/Homebrew.mjs b/module/data/settings/Homebrew.mjs index ead5a09f..008cd73c 100644 --- a/module/data/settings/Homebrew.mjs +++ b/module/data/settings/Homebrew.mjs @@ -54,6 +54,7 @@ export default class DhHomebrew extends foundry.abstract.DataModel { moves: new fields.TypedObjectField( new fields.SchemaField({ name: new fields.StringField({ required: true }), + icon: new fields.StringField({ required: true }), img: new fields.FilePathField({ initial: 'icons/magic/life/cross-worn-green.webp', categories: ['IMAGE'], @@ -70,6 +71,7 @@ export default class DhHomebrew extends foundry.abstract.DataModel { moves: new fields.TypedObjectField( new fields.SchemaField({ name: new fields.StringField({ required: true }), + icon: new fields.StringField({ required: true }), img: new fields.FilePathField({ initial: 'icons/magic/life/cross-worn-green.webp', categories: ['IMAGE'], diff --git a/module/data/settings/RangeMeasurement.mjs b/module/data/settings/RangeMeasurement.mjs index 71fb7787..552963f0 100644 --- a/module/data/settings/RangeMeasurement.mjs +++ b/module/data/settings/RangeMeasurement.mjs @@ -2,7 +2,7 @@ export default class DhRangeMeasurement extends foundry.abstract.DataModel { static defineSchema() { const fields = foundry.data.fields; return { - enabled: new fields.BooleanField({ required: true, initial: false, label: 'DAGGERHEART.GENERAL.enabled' }), + enabled: new fields.BooleanField({ required: true, initial: true, label: 'DAGGERHEART.GENERAL.enabled' }), melee: new fields.NumberField({ required: true, initial: 5, label: 'DAGGERHEART.CONFIG.Range.melee.name' }), veryClose: new fields.NumberField({ required: true, diff --git a/module/dice/d20Roll.mjs b/module/dice/d20Roll.mjs index c344231f..95cba5ca 100644 --- a/module/dice/d20Roll.mjs +++ b/module/dice/d20Roll.mjs @@ -1,5 +1,4 @@ import D20RollDialog from '../applications/dialogs/d20RollDialog.mjs'; -import { setDiceSoNiceForDualityRoll } from '../helpers/utils.mjs'; import DHRoll from './dhRoll.mjs'; export default class D20Roll extends DHRoll { @@ -40,11 +39,13 @@ export default class D20Roll extends DHRoll { } get hasAdvantage() { - return this.options.roll.advantage === this.constructor.ADV_MODE.ADVANTAGE; + const adv = this.options.roll.advantage.type ?? this.options.roll.advantage; + return adv === this.constructor.ADV_MODE.ADVANTAGE; } get hasDisadvantage() { - return this.options.roll.advantage === this.constructor.ADV_MODE.DISADVANTAGE; + const adv = this.options.roll.advantage.type ?? this.options.roll.advantage; + return adv === this.constructor.ADV_MODE.DISADVANTAGE; } static applyKeybindings(config) { @@ -75,7 +76,6 @@ export default class D20Roll extends DHRoll { } constructFormula(config) { - // this.terms = []; this.createBaseDice(); this.configureModifiers(); this.resetFormula(); @@ -92,22 +92,20 @@ export default class D20Roll extends DHRoll { configureModifiers() { this.applyAdvantage(); - this.applyBaseBonus(); + + this.baseTerms = foundry.utils.deepClone(this.dice); + + this.options.roll.modifiers = this.applyBaseBonus(); this.options.experiences?.forEach(m => { if (this.options.data.experiences?.[m]) this.options.roll.modifiers.push({ label: this.options.data.experiences[m].name, - value: this.options.data.experiences[m].total ?? this.options.data.experiences[m].value + value: this.options.data.experiences[m].value }); }); - this.options.roll.modifiers?.forEach(m => { - this.terms.push(...this.formatModifier(m.value)); - }); - - this.baseTerms = foundry.utils.deepClone(this.terms); - + this.addModifiers(); if (this.options.extraFormula) { this.terms.push( new foundry.dice.terms.OperatorTerm({ operator: '+' }), @@ -126,42 +124,37 @@ export default class D20Roll extends DHRoll { } applyBaseBonus() { - this.options.roll.modifiers = []; - if (!this.options.roll.bonus) return; - this.options.roll.modifiers.push({ - label: 'Bonus to Hit', - value: this.options.roll.bonus - // value: Roll.replaceFormulaData('@attackBonus', this.data) - }); - } + const modifiers = []; - static async buildEvaluate(roll, config = {}, message = {}) { - if (config.evaluate !== false) await roll.evaluate(); - const advantageState = - config.roll.advantage == this.ADV_MODE.ADVANTAGE - ? true - : config.roll.advantage == this.ADV_MODE.DISADVANTAGE - ? false - : null; - this.postEvaluate(roll, config); + if (this.options.roll.bonus) + modifiers.push({ + label: 'Bonus to Hit', + value: this.options.roll.bonus + }); + + modifiers.push(...this.getBonus(`roll.${this.options.type}`, `${this.options.type?.capitalize()} Bonus`)); + modifiers.push( + ...this.getBonus(`roll.${this.options.roll.type}`, `${this.options.roll.type?.capitalize()} Bonus`) + ); + + return modifiers; } static postEvaluate(roll, config = {}) { - super.postEvaluate(roll, config); + const data = super.postEvaluate(roll, config); if (config.targets?.length) { config.targets.forEach(target => { const difficulty = config.roll.difficulty ?? target.difficulty ?? target.evasion; target.hit = this.isCritical || roll.total >= difficulty; }); - } else if (config.roll.difficulty) - config.roll.success = roll.isCritical || roll.total >= config.roll.difficulty; - config.roll.advantage = { + } else if (config.roll.difficulty) data.success = roll.isCritical || roll.total >= config.roll.difficulty; + data.advantage = { type: config.roll.advantage, dice: roll.dAdvantage?.denomination, value: roll.dAdvantage?.total }; - config.roll.isCritical = roll.isCritical; - config.roll.extra = roll.dice + data.isCritical = roll.isCritical; + data.extra = roll.dice .filter(d => !roll.baseTerms.includes(d)) .map(d => { return { @@ -169,7 +162,8 @@ export default class D20Roll extends DHRoll { value: d.total }; }); - config.roll.modifierTotal = this.calculateTotalModifiers(roll); + data.modifierTotal = this.calculateTotalModifiers(roll); + return data; } resetFormula() { diff --git a/module/dice/damageRoll.mjs b/module/dice/damageRoll.mjs index d9c4a61e..34fe77d7 100644 --- a/module/dice/damageRoll.mjs +++ b/module/dice/damageRoll.mjs @@ -10,23 +10,120 @@ export default class DamageRoll extends DHRoll { static DefaultDialog = DamageDialog; - static async postEvaluate(roll, config = {}) { - super.postEvaluate(roll, config); - config.roll.type = config.type; - config.roll.modifierTotal = this.calculateTotalModifiers(roll); + static async buildEvaluate(roll, config = {}, message = {}) { + if (config.evaluate !== false) { + for (const roll of config.roll) await roll.roll.evaluate(); + } + roll._evaluated = true; + const parts = config.roll.map(r => this.postEvaluate(r)); + config.roll = this.unifyDamageRoll(parts); + } + + static postEvaluate(roll, config = {}) { + return { + ...roll, + ...super.postEvaluate(roll.roll, config), + damageTypes: [...(roll.damageTypes ?? [])], + roll: roll.roll, + type: config.type, + modifierTotal: this.calculateTotalModifiers(roll.roll) + }; + } + + static async buildPost(roll, config, message) { + await super.buildPost(roll, config, message); if (config.source?.message) { const chatMessage = ui.chat.collection.get(config.source.message); chatMessage.update({ 'system.damage': config }); } } - constructFormula(config) { - super.constructFormula(config); - if (config.isCritical) { - const tmpRoll = new Roll(this._formula)._evaluateSync({ maximize: true }), - criticalBonus = tmpRoll.total - this.constructor.calculateTotalModifiers(tmpRoll); - this.terms.push(...this.formatModifier(criticalBonus)); + static unifyDamageRoll(rolls) { + const unified = {}; + rolls.forEach(r => { + const resource = unified[r.applyTo] ?? { formula: '', total: 0, parts: [] }; + resource.formula += `${resource.formula !== '' ? ' + ' : ''}${r.formula}`; + resource.total += r.total; + resource.parts.push(r); + unified[r.applyTo] = resource; + }); + return unified; + } + + static formatGlobal(rolls) { + let formula, total; + const applyTo = new Set(rolls.flatMap(r => r.applyTo)); + if (applyTo.size > 1) { + const data = {}; + rolls.forEach(r => { + if (data[r.applyTo]) { + data[r.applyTo].formula += ` + ${r.formula}`; + data[r.applyTo].total += r.total; + } else { + data[r.applyTo] = { + formula: r.formula, + total: r.total + }; + } + }); + formula = Object.entries(data).reduce((a, [k, v]) => a + ` ${k}: ${v.formula}`, ''); + total = Object.entries(data).reduce((a, [k, v]) => a + ` ${k}: ${v.total}`, ''); + } else { + formula = rolls.map(r => r.formula).join(' + '); + total = rolls.reduce((a, c) => a + c.total, 0); } - return (this._formula = this.constructor.getFormula(this.terms)); + return { formula, total }; + } + + applyBaseBonus(part) { + const modifiers = [], + type = this.options.messageType ?? 'damage', + options = part ?? this.options; + + modifiers.push(...this.getBonus(`${type}`, `${type.capitalize()} Bonus`)); + options.damageTypes?.forEach(t => { + modifiers.push(...this.getBonus(`${type}.${t}`, `${t.capitalize()} ${type.capitalize()} Bonus`)); + }); + const weapons = ['primaryWeapon', 'secondaryWeapon']; + weapons.forEach(w => { + if (this.options.source.item && this.options.source.item === this.data[w]?.id) + modifiers.push(...this.getBonus(`${type}.${w}`, 'Weapon Bonus')); + }); + + return modifiers; + } + + constructFormula(config) { + this.options.roll.forEach(part => { + part.roll = new Roll(Roll.replaceFormulaData(part.formula, config.data)); + this.constructFormulaPart(config, part); + }); + return this.options.roll; + } + + constructFormulaPart(config, part) { + part.roll.terms = Roll.parse(part.roll.formula, config.data); + + if (part.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id) { + part.modifiers = this.applyBaseBonus(part); + this.addModifiers(part); + part.modifiers?.forEach(m => { + part.roll.terms.push(...this.formatModifier(m.value)); + }); + } + + if (part.extraFormula) { + part.roll.terms.push( + new foundry.dice.terms.OperatorTerm({ operator: '+' }), + ...this.constructor.parse(part.extraFormula, this.options.data) + ); + } + + if (config.isCritical && part.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id) { + const tmpRoll = Roll.fromTerms(part.roll.terms)._evaluateSync({ maximize: true }), + criticalBonus = tmpRoll.total - this.constructor.calculateTotalModifiers(tmpRoll); + part.roll.terms.push(...this.formatModifier(criticalBonus)); + } + return (part.roll._formula = this.constructor.getFormula(part.roll.terms)); } } diff --git a/module/dice/dhRoll.mjs b/module/dice/dhRoll.mjs index c3918a13..c50c126a 100644 --- a/module/dice/dhRoll.mjs +++ b/module/dice/dhRoll.mjs @@ -4,6 +4,7 @@ export default class DHRoll extends Roll { baseTerms = []; constructor(formula, data, options) { super(formula, data, options); + if (!this.data || !Object.keys(this.data).length) this.data = options.data; } static messageType = 'adversaryRoll'; @@ -46,7 +47,7 @@ export default class DHRoll extends Roll { static async buildEvaluate(roll, config = {}, message = {}) { if (config.evaluate !== false) await roll.evaluate(); - this.postEvaluate(roll, config); + config.roll = this.postEvaluate(roll, config); } static async buildPost(roll, config, message) { @@ -56,25 +57,27 @@ export default class DHRoll extends Roll { // Create Chat Message if (config.source?.message) { - } else { - const messageData = {}; - config.message = await this.toMessage(roll, config); - } + if (Object.values(config.roll)?.length) { + const pool = foundry.dice.terms.PoolTerm.fromRolls( + Object.values(config.roll).flatMap(r => r.parts.map(p => p.roll)) + ); + roll = Roll.fromTerms([pool]); + } + if (game.modules.get('dice-so-nice')?.active) await game.dice3d.showForRoll(roll, game.user, true); + } else config.message = await this.toMessage(roll, config); } static postEvaluate(roll, config = {}) { - if (!config.roll) config.roll = {}; - config.roll.total = roll.total; - config.roll.formula = roll.formula; - config.roll.dice = []; - roll.dice.forEach(d => { - config.roll.dice.push({ + return { + total: roll.total, + formula: roll.formula, + dice: roll.dice.map(d => ({ dice: d.denomination, total: d.total, formula: d.formula, results: d.results - }); - }); + })) + }; } static async toMessage(roll, config) { @@ -86,7 +89,7 @@ export default class DHRoll extends Roll { system: config, rolls: [roll] }; - return await cls.create(msg); + return await cls.create(msg, { rollMode: config.selectedRollMode }); } static applyKeybindings(config) { @@ -99,11 +102,45 @@ export default class DHRoll extends Roll { } formatModifier(modifier) { - const numTerm = modifier < 0 ? '-' : '+'; - return [ - new foundry.dice.terms.OperatorTerm({ operator: numTerm }), - new foundry.dice.terms.NumericTerm({ number: Math.abs(modifier) }) - ]; + if (Array.isArray(modifier)) { + return [ + new foundry.dice.terms.OperatorTerm({ operator: '+' }), + ...this.constructor.parse(modifier.join(' + '), this.options.data) + ]; + } else { + const numTerm = modifier < 0 ? '-' : '+'; + return [ + new foundry.dice.terms.OperatorTerm({ operator: numTerm }), + new foundry.dice.terms.NumericTerm({ number: Math.abs(modifier) }) + ]; + } + } + + applyBaseBonus() { + return []; + } + + addModifiers(roll) { + roll = roll ?? this.options.roll; + roll.modifiers?.forEach(m => { + this.terms.push(...this.formatModifier(m.value)); + }); + } + + getBonus(path, label) { + const bonus = foundry.utils.getProperty(this.data.bonuses, path), + modifiers = []; + if (bonus?.bonus) + modifiers.push({ + label: label, + value: bonus?.bonus + }); + if (bonus?.dice?.length) + modifiers.push({ + label: label, + value: bonus?.dice + }); + return modifiers; } getFaces(faces) { @@ -113,6 +150,9 @@ export default class DHRoll extends Roll { constructFormula(config) { this.terms = Roll.parse(this.options.roll.formula, config.data); + this.options.roll.modifiers = this.applyBaseBonus(); + this.addModifiers(); + if (this.options.extraFormula) { this.terms.push( new foundry.dice.terms.OperatorTerm({ operator: '+' }), @@ -138,8 +178,10 @@ export default class DHRoll extends Roll { export const registerRollDiceHooks = () => { Hooks.on(`${CONFIG.DH.id}.postRollDuality`, async (config, message) => { + const hopeFearAutomation = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).hopeFear; if ( - !game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).hope || + !config.source?.actor || + (game.user.isGM ? !hopeFearAutomation.gm : !hopeFearAutomation.players) || config.roll.type === 'reaction' ) return; @@ -147,13 +189,18 @@ export const registerRollDiceHooks = () => { const actor = await fromUuid(config.source.actor), updates = []; if (!actor) return; - if (config.roll.isCritical || config.roll.result.duality === 1) updates.push({ type: 'hope', value: 1 }); - if (config.roll.isCritical) updates.push({ type: 'stress', value: -1 }); - if (config.roll.result.duality === -1) updates.push({ type: 'fear', value: 1 }); + if (config.roll.isCritical || config.roll.result.duality === 1) updates.push({ key: 'hope', value: 1 }); + if (config.roll.isCritical) updates.push({ key: 'stress', value: -1 }); + if (config.roll.result.duality === -1) updates.push({ key: 'fear', value: 1 }); - if (updates.length) actor.modifyResource(updates); + if (updates.length) { + const target = actor.system.partner ?? actor; + if (!['dead', 'unconcious'].some(x => actor.statuses.has(x))) { + target.modifyResource(updates); + } + } - if (!config.roll.hasOwnProperty('success') && !config.targets.length) return; + if (!config.roll.hasOwnProperty('success') && !config.targets?.length) return; const rollResult = config.roll.success || config.targets.some(t => t.hit), looseSpotlight = !rollResult || config.roll.result.duality === -1; diff --git a/module/dice/dualityRoll.mjs b/module/dice/dualityRoll.mjs index 4d0e99a3..142f21e8 100644 --- a/module/dice/dualityRoll.mjs +++ b/module/dice/dualityRoll.mjs @@ -1,11 +1,15 @@ import D20RollDialog from '../applications/dialogs/d20RollDialog.mjs'; import D20Roll from './d20Roll.mjs'; +import { setDiceSoNiceForDualityRoll } from '../helpers/utils.mjs'; export default class DualityRoll extends D20Roll { _advantageFaces = 6; + _advantageNumber = 1; + _rallyIndex; constructor(formula, data = {}, options = {}) { super(formula, data, options); + this.rallyChoices = this.setRallyChoices(); } static messageType = 'dualityRoll'; @@ -50,6 +54,33 @@ export default class DualityRoll extends D20Roll { this._advantageFaces = this.getFaces(faces); } + get advantageNumber() { + return this._advantageNumber; + } + + set advantageNumber(value) { + this._advantageNumber = Number(value); + } + + setRallyChoices() { + return this.data?.parent?.effects.reduce((a, c) => { + const change = c.changes.find(ch => ch.key === 'system.bonuses.rally'); + if (change) a.push({ value: c.id, label: change.value }); + return a; + }, []); + } + + get dRally() { + if (!this.rallyFaces) return null; + if (this.hasDisadvantage || this.hasAdvantage) return this.dice[3]; + else return this.dice[2]; + } + + get rallyFaces() { + const rallyChoice = this.rallyChoices?.find(r => r.value === this._rallyIndex)?.label; + return rallyChoice ? this.getFaces(rallyChoice) : null; + } + get isCritical() { if (!this.dHope._evaluated || !this.dFear._evaluated) return; return this.dHope.total === this.dFear.total; @@ -65,10 +96,6 @@ export default class DualityRoll extends D20Roll { return this.dHope.total < this.dFear.total; } - get hasBarRally() { - return null; - } - get totalLabel() { const label = this.withHope ? 'DAGGERHEART.GENERAL.hope' @@ -80,7 +107,6 @@ export default class DualityRoll extends D20Roll { } static getHooks(hooks) { - return [...(hooks ?? []), 'Duality']; } @@ -98,49 +124,66 @@ export default class DualityRoll extends D20Roll { } applyAdvantage() { - const dieFaces = this.advantageFaces, - bardRallyFaces = this.hasBarRally, - advDie = new foundry.dice.terms.Die({ faces: dieFaces }); - if (this.hasAdvantage || this.hasDisadvantage || bardRallyFaces) - this.terms.push(new foundry.dice.terms.OperatorTerm({ operator: this.hasDisadvantage ? '-' : '+' })); - if (bardRallyFaces) { - const rallyDie = new foundry.dice.terms.Die({ faces: bardRallyFaces }); - if (this.hasAdvantage) { - this.terms.push( - new foundry.dice.terms.PoolTerm({ - terms: [advDie.formula, rallyDie.formula], - modifiers: ['kh'] - }) - ); - } else if (this.hasDisadvantage) { - this.terms.push(advDie, new foundry.dice.terms.OperatorTerm({ operator: '+' }), rallyDie); - } - } else if (this.hasAdvantage || this.hasDisadvantage) this.terms.push(advDie); + if (this.hasAdvantage || this.hasDisadvantage) { + const dieFaces = this.advantageFaces, + advDie = new foundry.dice.terms.Die({ faces: dieFaces, number: this.advantageNumber }); + if (this.advantageNumber > 1) advDie.modifiers = ['kh']; + this.terms.push( + new foundry.dice.terms.OperatorTerm({ operator: this.hasDisadvantage ? '-' : '+' }), + advDie + ); + } + if (this.rallyFaces) + this.terms.push( + new foundry.dice.terms.OperatorTerm({ operator: this.hasDisadvantage ? '-' : '+' }), + new foundry.dice.terms.Die({ faces: this.rallyFaces }) + ); } applyBaseBonus() { - this.options.roll.modifiers = []; - if (!this.options.roll.trait) return; - this.options.roll.modifiers.push({ - label: `DAGGERHEART.CONFIG.Traits.${this.options.roll.trait}.name`, - value: Roll.replaceFormulaData(`@traits.${this.options.roll.trait}.total`, this.data) + const modifiers = super.applyBaseBonus(); + + if (this.options.roll.trait && this.data.traits[this.options.roll.trait]) + modifiers.unshift({ + label: `DAGGERHEART.CONFIG.Traits.${this.options.roll.trait}.name`, + value: this.data.traits[this.options.roll.trait].value + }); + + const weapons = ['primaryWeapon', 'secondaryWeapon']; + weapons.forEach(w => { + if (this.options.source.item && this.options.source.item === this.data[w]?.id) + modifiers.push(...this.getBonus(`roll.${w}`, 'Weapon Bonus')); }); + + return modifiers; } static postEvaluate(roll, config = {}) { - super.postEvaluate(roll, config); - config.roll.hope = { + const data = super.postEvaluate(roll, config); + + data.hope = { dice: roll.dHope.denomination, value: roll.dHope.total }; - config.roll.fear = { + data.fear = { dice: roll.dFear.denomination, value: roll.dFear.total }; - config.roll.result = { + data.rally = { + dice: roll.dRally?.denomination, + value: roll.dRally?.total + }; + data.result = { duality: roll.withHope ? 1 : roll.withFear ? -1 : 0, total: roll.dHope.total + roll.dFear.total, label: roll.totalLabel }; + + if (roll._rallyIndex && roll.data?.parent) + roll.data.parent.deleteEmbeddedDocuments('ActiveEffect', [roll._rallyIndex]); + + setDiceSoNiceForDualityRoll(roll, data.advantage.type); + + return data; } } diff --git a/module/documents/_module.mjs b/module/documents/_module.mjs index 4dfa6264..540b06c1 100644 --- a/module/documents/_module.mjs +++ b/module/documents/_module.mjs @@ -3,4 +3,5 @@ export { default as DHItem } from './item.mjs'; export { default as DhpCombat } from './combat.mjs'; export { default as DhActiveEffect } from './activeEffect.mjs'; export { default as DhChatMessage } from './chatMessage.mjs'; +export { default as DhToken } from './token.mjs'; export { default as DhTooltipManager } from './tooltipManager.mjs'; diff --git a/module/documents/activeEffect.mjs b/module/documents/activeEffect.mjs index 65610e7c..6c4545b1 100644 --- a/module/documents/activeEffect.mjs +++ b/module/documents/activeEffect.mjs @@ -1,16 +1,46 @@ +import { itemAbleRollParse } from '../helpers/utils.mjs'; + export default class DhActiveEffect extends ActiveEffect { get isSuppressed() { - if (['weapon', 'armor'].includes(this.parent.type)) { + // If this is a copied effect from an attachment, never suppress it + // (These effects have attachmentSource metadata) + if (this.flags?.daggerheart?.attachmentSource) { + return false; + } + + // Then apply the standard suppression rules + if (['weapon', 'armor'].includes(this.parent?.type)) { return !this.parent.system.equipped; } - if (this.parent.type === 'domainCard') { + if (this.parent?.type === 'domainCard') { return this.parent.system.inVault; } return super.isSuppressed; } + /** + * Check if the parent item is currently attached to another item + * @returns {boolean} + */ + get isAttached() { + if (!this.parent || !this.parent.parent) return false; + + // Check if this item's UUID is in any actor's armor or weapon attachment lists + const actor = this.parent.parent; + if (!actor || !actor.items) return false; + + return actor.items.some(item => { + return ( + (item.type === 'armor' || item.type === 'weapon') && + item.system?.attached && + Array.isArray(item.system.attached) && + item.system.attached.includes(this.parent.uuid) + ); + }); + } + async _preCreate(data, options, user) { const update = {}; if (!data.img) { @@ -25,10 +55,24 @@ export default class DhActiveEffect extends ActiveEffect { } static applyField(model, change, field) { - change.value = Roll.safeEval(Roll.replaceFormulaData(change.value, change.effect.parent)); + change.value = this.effectSafeEval(itemAbleRollParse(change.value, model, change.effect.parent)); super.applyField(model, change, field); } + /* Altered Foundry safeEval to allow non-numeric returns */ + static effectSafeEval(expression) { + let result; + try { + // eslint-disable-next-line no-new-func + const evl = new Function('sandbox', `with (sandbox) { return ${expression}}`); + result = evl(Roll.MATH_PROXY); + } catch (err) { + return expression; + } + + return result; + } + async toChat(origin) { const cls = getDocumentClass('ChatMessage'); const systemData = { diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index b48d8c26..490f53eb 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -1,10 +1,19 @@ -import DamageSelectionDialog from '../applications/dialogs/damageSelectionDialog.mjs'; -import { GMUpdateEvent, socketEvent } from '../systemRegistration/socket.mjs'; +import { emitAsGM, GMUpdateEvent } from '../systemRegistration/socket.mjs'; import DamageReductionDialog from '../applications/dialogs/damageReductionDialog.mjs'; import { LevelOptionType } from '../data/levelTier.mjs'; import DHFeature from '../data/item/feature.mjs'; +import { damageKeyToNumber } from '../helpers/utils.mjs'; -export default class DhpActor extends foundry.documents.Actor { +export default class DhpActor extends Actor { + /** + * Return the first Actor active owner. + */ + get owner() { + const user = + this.hasPlayerOwner && game.users.players.find(u => this.testUserPermission(u, 'OWNER') && u.active); + if (!user) return game.user.isGM ? game.user : null; + return user; + } /** * Whether this actor is an NPC. @@ -52,7 +61,7 @@ export default class DhpActor extends foundry.documents.Actor { return acc; }, {}); - const featureIds = []; + const features = []; const domainCards = []; const experiences = []; const subclassFeatureState = { class: null, multiclass: null }; @@ -65,7 +74,7 @@ export default class DhpActor extends foundry.documents.Actor { const advancementCards = level.selections.filter(x => x.type === 'domainCard').map(x => x.itemUuid); domainCards.push(...achievementCards, ...advancementCards); experiences.push(...Object.keys(level.achievements.experiences)); - featureIds.push(...level.selections.flatMap(x => x.featureIds)); + features.push(...level.selections.flatMap(x => x.features)); const subclass = level.selections.find(x => x.type === 'subclass'); if (subclass) { @@ -79,8 +88,11 @@ export default class DhpActor extends foundry.documents.Actor { multiclass = level.selections.find(x => x.type === 'multiclass'); }); - for (let featureId of featureIds) { - this.items.get(featureId).delete(); + for (let feature of features) { + if (feature.onPartner && !this.system.partner) continue; + + const document = feature.onPartner ? this.system.partner : this; + document.items.get(feature.id)?.delete(); } if (experiences.length > 0) { @@ -144,7 +156,6 @@ export default class DhpActor extends foundry.documents.Actor { } async levelUp(levelupData) { - const actions = []; const levelups = {}; for (var levelKey of Object.keys(levelupData)) { const level = levelupData[levelKey]; @@ -228,7 +239,9 @@ export default class DhpActor extends foundry.documents.Actor { ...featureData, description: game.i18n.localize(featureData.description) }); - const embeddedItem = await this.createEmbeddedDocuments('Item', [ + + const document = featureData.toPartner && this.system.partner ? this.system.partner : this; + const embeddedItem = await document.createEmbeddedDocuments('Item', [ { ...featureData, name: game.i18n.localize(featureData.name), @@ -236,9 +249,13 @@ export default class DhpActor extends foundry.documents.Actor { system: feature } ]); - addition.checkbox.featureIds = !addition.checkbox.featureIds - ? [embeddedItem[0].id] - : [...addition.checkbox.featureIds, embeddedItem[0].id]; + const newFeature = { + onPartner: Boolean(featureData.toPartner && this.system.partner), + id: embeddedItem[0].id + }; + addition.checkbox.features = !addition.checkbox.features + ? [newFeature] + : [...addition.checkbox.features, newFeature]; } selections.push(addition.checkbox); @@ -308,7 +325,6 @@ export default class DhpActor extends foundry.documents.Actor { await this.update({ system: { - actions: [...this.system.actions, ...actions], levelData: { level: { current: this.system.levelData.level.changed @@ -353,185 +369,211 @@ export default class DhpActor extends foundry.documents.Actor { } getRollData() { - return this.system; + const rollData = super.getRollData(); + rollData.system = this.system.getRollData(); + rollData.prof = this.system.proficiency ?? 1; + rollData.cast = this.system.spellcastModifier ?? 1; + return rollData; } - formatRollModifier(roll) { - const modifier = roll.modifier !== null ? Number.parseInt(roll.modifier) : null; - return modifier !== null - ? [ - { - value: modifier, - label: roll.label - ? modifier >= 0 - ? `${roll.label} +${modifier}` - : `${roll.label} ${modifier}` - : null, - title: roll.label - } - ] - : []; + #canReduceDamage(hpDamage, type) { + const availableStress = this.system.resources.stress.max - this.system.resources.stress.value; + + const canUseArmor = + this.system.armor && + this.system.armor.system.marks.value < this.system.armorScore && + type.every(t => this.system.armorApplicableDamageTypes[t] === true); + 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 damageRoll(title, damage, targets, shiftKey) { - let rollString = damage.value; - let bonusDamage = damage.bonusDamage?.filter(x => x.initiallySelected) ?? []; - if (!shiftKey) { - const dialogClosed = new Promise((resolve, _) => { - new DamageSelectionDialog(rollString, bonusDamage, resolve).render(true); - }); - const result = await dialogClosed; - bonusDamage = result.bonusDamage; - rollString = result.rollString; + async takeDamage(damages) { + if (Hooks.call(`${CONFIG.DH.id}.preTakeDamage`, this, damages) === false) return null; - const automateHope = await game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation.Hope); - if (automateHope && result.hopeUsed) { - await this.update({ - 'system.resources.hope.value': this.system.resources.hope.value - result.hopeUsed - }); - } - } - - const roll = new Roll(rollString); - let rollResult = await roll.evaluate(); - - const dice = []; - const modifiers = []; - for (var i = 0; i < rollResult.terms.length; i++) { - const term = rollResult.terms[i]; - if (term.faces) { - dice.push({ - type: `d${term.faces}`, - rolls: term.results.map(x => x.result), - total: term.results.reduce((acc, x) => acc + x.result, 0) - }); - } else if (term.operator) { - } else if (term.number) { - const operator = i === 0 ? '' : rollResult.terms[i - 1].operator; - modifiers.push({ value: term.number, operator: operator }); - } - } - - const cls = getDocumentClass('ChatMessage'); - const systemData = { - title: game.i18n.format('DAGGERHEART.UI.Chat.damageRoll.title', { damage: title }), - roll: rollString, - damage: { - total: rollResult.total, - type: damage.type - }, - dice: dice, - modifiers: modifiers, - targets: targets - }; - const msg = new cls({ - type: 'damageRoll', - user: game.user.id, - sound: CONFIG.sounds.dice, - system: systemData, - content: await foundry.applications.handlebars.renderTemplate( - 'systems/daggerheart/templates/ui/chat/damage-roll.hbs', - systemData - ), - rolls: [roll] - }); - - cls.create(msg.toObject()); - } - - async takeDamage(damage, type) { if (this.type === 'companion') { - await this.modifyResource([{ value: 1, type: 'stress' }]); + await this.modifyResource([{ value: 1, key: 'stress' }]); return; } - const hpDamage = - damage >= this.system.damageThresholds.severe - ? 3 - : damage >= this.system.damageThresholds.major - ? 2 - : damage >= this.system.damageThresholds.minor - ? 1 - : 0; + const updates = []; - if ( - this.type === 'character' && - this.system.armor && - this.system.armor.system.marks.value < this.system.armorScore - ) { - new Promise((resolve, reject) => { - new DamageReductionDialog(resolve, reject, this, hpDamage).render(true); - }) - .then(async ({ modifiedDamage, armorSpent, stressSpent }) => { - const resources = [ - { value: modifiedDamage, type: 'hitPoints' }, - ...(armorSpent ? [{ value: armorSpent, type: 'armorStack' }] : []), - ...(stressSpent ? [{ value: stressSpent, type: 'stress' }] : []) - ]; - await this.modifyResource(resources); - }) - .catch(() => { - const cls = getDocumentClass('ChatMessage'); - const msg = new cls({ - user: game.user.id, - content: game.i18n.format('DAGGERHEART.UI.Notifications.damageIgnore', { - character: this.name - }) - }); - cls.create(msg.toObject()); + Object.entries(damages).forEach(([key, damage]) => { + damage.parts.forEach(part => { + if (part.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id) + part.total = this.calculateDamage(part.total, part.damageTypes); + const update = updates.find(u => u.key === key); + if (update) { + update.value += part.total; + update.damageTypes.add(...new Set(part.damageTypes)); + } else updates.push({ value: part.total, key, damageTypes: new Set(part.damageTypes) }); + }); + }); + + if (Hooks.call(`${CONFIG.DH.id}.postCalculateDamage`, this, damages) === false) return null; + + if (!updates.length) return; + + const hpDamage = updates.find(u => u.key === CONFIG.DH.GENERAL.healingTypes.hitPoints.id); + if (hpDamage) { + hpDamage.value = this.convertDamageToThreshold(hpDamage.value); + if ( + this.type === 'character' && + this.system.armor && + this.#canReduceDamage(hpDamage.value, hpDamage.damageTypes) + ) { + const armorStackResult = await this.owner.query('armorStack', { + actorId: this.uuid, + damage: hpDamage.value, + type: [...hpDamage.damageTypes] }); - } else { - await this.modifyResource([{ value: hpDamage, type: 'hitPoints' }]); + if (armorStackResult) { + const { modifiedDamage, armorSpent, stressSpent } = armorStackResult; + updates.find(u => u.key === 'hitPoints').value = modifiedDamage; + updates.push( + ...(armorSpent ? [{ value: armorSpent, key: 'armorStack' }] : []), + ...(stressSpent ? [{ value: stressSpent, key: 'stress' }] : []) + ); + } + } } + + updates.forEach( + u => + (u.value = + u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false ? u.value * -1 : u.value) + ); + + await this.modifyResource(updates); + + if (Hooks.call(`${CONFIG.DH.id}.postTakeDamage`, this, damages) === false) return null; + } + + calculateDamage(baseDamage, type) { + if (this.canResist(type, 'immunity')) return 0; + if (this.canResist(type, 'resistance')) baseDamage = Math.ceil(baseDamage / 2); + + const flatReduction = this.getDamageTypeReduction(type); + const damage = Math.max(baseDamage - (flatReduction ?? 0), 0); + + return damage; + } + + canResist(type, resistance) { + if (!type) return 0; + return type.every(t => this.system.resistance[t]?.[resistance] === true); + } + + getDamageTypeReduction(type) { + if (!type) return 0; + const reduction = Object.entries(this.system.resistance).reduce( + (a, [index, value]) => (type.includes(index) ? Math.min(value.reduction, a) : a), + Infinity + ); + return reduction === Infinity ? 0 : reduction; } async takeHealing(resources) { - resources.forEach(r => (r.value *= -1)); - await this.modifyResource(resources); + const updates = Object.entries(resources).map(([key, value]) => ({ + key: key, + value: !(key === 'fear' || this.system?.resources?.[key]?.isReversed === false) + ? value.total * -1 + : value.total + })); + await this.modifyResource(updates); } async modifyResource(resources) { if (!resources.length) return; - let updates = { actor: { target: this, resources: {} }, armor: { target: this.system.armor, resources: {} } }; + + if (resources.find(r => r.type === 'stress')) this.convertStressDamageToHP(resources); + let updates = { + actor: { target: this, resources: {} }, + armor: { target: this.system.armor, resources: {} }, + items: {} + }; resources.forEach(r => { - switch (r.type) { - case 'fear': - ui.resources.updateFear( - game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear) + r.value - ); - break; - case 'armorStack': - updates.armor.resources['system.marks.value'] = Math.max( - Math.min(this.system.armor.system.marks.value + r.value, this.system.armorScore), - 0 - ); - break; - default: - updates.actor.resources[`system.resources.${r.type}.value`] = Math.max( - Math.min( - this.system.resources[r.type].value + r.value, - this.system.resources[r.type].maxTotal ?? this.system.resources[r.type].max - ), - 0 - ); - break; + if (r.keyIsID) { + updates.items[r.key] = { + target: r.target, + resources: { + 'system.resource.value': r.target.system.resource.value + r.value + } + }; + } else { + switch (r.key) { + case 'fear': + ui.resources.updateFear( + game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear) + r.value + ); + break; + case 'armorStack': + updates.armor.resources['system.marks.value'] = Math.max( + Math.min(this.system.armor.system.marks.value + r.value, this.system.armorScore), + 0 + ); + break; + default: + updates.actor.resources[`system.resources.${r.key}.value`] = Math.max( + Math.min(this.system.resources[r.key].value + r.value, this.system.resources[r.key].max), + 0 + ); + break; + } } }); - Object.values(updates).forEach(async u => { - if (Object.keys(u.resources).length > 0) { - if (game.user.isGM) { - await u.target.update(u.resources); - } else { - await game.socket.emit(`system.${CONFIG.DH.id}`, { - action: socketEvent.GMUpdate, - data: { - action: GMUpdateEvent.UpdateDocument, - uuid: u.target.uuid, - update: u.resources - } - }); + Object.keys(updates).forEach(async key => { + const u = updates[key]; + if (key === 'items') { + Object.values(u).forEach(async item => { + await emitAsGM( + GMUpdateEvent.UpdateDocument, + item.target.update.bind(item.target), + item.resources, + item.target.uuid + ); + }); + } else { + if (Object.keys(u.resources).length > 0) { + await emitAsGM( + GMUpdateEvent.UpdateDocument, + u.target.update.bind(u.target), + u.resources, + u.target.uuid + ); } } }); } + + convertDamageToThreshold(damage) { + return damage >= this.system.damageThresholds.severe + ? 3 + : damage >= this.system.damageThresholds.major + ? 2 + : damage >= this.system.damageThresholds.minor + ? 1 + : 0; + } + + convertStressDamageToHP(resources) { + const stressDamage = resources.find(r => r.type === 'stress'), + newValue = this.system.resources.stress.value + stressDamage.value; + if (newValue <= this.system.resources.stress.max) return; + const hpDamage = resources.find(r => r.type === 'hitPoints'); + if (hpDamage) hpDamage.value++; + else + resources.push({ + type: 'hitPoints', + value: 1 + }); + } } + +export const registerDHActorHooks = () => { + CONFIG.queries.armorStack = DamageReductionDialog.armorStackQuery; +}; diff --git a/module/documents/chatMessage.mjs b/module/documents/chatMessage.mjs index ef76d18f..46f95633 100644 --- a/module/documents/chatMessage.mjs +++ b/module/documents/chatMessage.mjs @@ -1,10 +1,10 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage { async renderHTML() { if (this.system.messageTemplate) - this.content = await foundry.applications.handlebars.renderTemplate( - this.system.messageTemplate, - this.system - ); + this.content = await foundry.applications.handlebars.renderTemplate(this.system.messageTemplate, { + ...this.system, + _source: this.system._source + }); /* We can change to fully implementing the renderHTML function if needed, instead of augmenting it. */ const html = await super.renderHTML(); @@ -37,4 +37,15 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage { e.setAttribute('data-use-perm', document.testUserPermission(game.user, 'OWNER')); }); } + + async _preCreate(data, options, user) { + options.speaker = ChatMessage.getSpeaker(); + const rollActorOwner = data.rolls?.[0]?.data?.parent?.owner; + if (rollActorOwner) { + data.author = rollActorOwner ? rollActorOwner.id : data.author; + await this.updateSource({ author: rollActorOwner ?? user }); + } + + return super._preCreate(data, options, rollActorOwner ?? user); + } } diff --git a/module/documents/item.mjs b/module/documents/item.mjs index 35b9e32f..6c3732db 100644 --- a/module/documents/item.mjs +++ b/module/documents/item.mjs @@ -80,20 +80,26 @@ export default class DHItem extends foundry.documents.Item { async selectActionDialog(prevEvent) { const content = await foundry.applications.handlebars.renderTemplate( 'systems/daggerheart/templates/dialogs/actionSelect.hbs', - { actions: this.system.actionsList } + { + actions: this.system.actionsList, + itemName: this.name + } ), - title = 'Select Action'; + title = game.i18n.localize('DAGGERHEART.CONFIG.SelectAction.selectAction'); return foundry.applications.api.DialogV2.prompt({ window: { title }, + classes: ['daggerheart', 'dh-style'], content, 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/documents/token.mjs b/module/documents/token.mjs new file mode 100644 index 00000000..a8105eb2 --- /dev/null +++ b/module/documents/token.mjs @@ -0,0 +1,73 @@ +export default class DHToken extends TokenDocument { + /** + * Inspect the Actor data model and identify the set of attributes which could be used for a Token Bar. + * @param {object} attributes The tracked attributes which can be chosen from + * @returns {object} A nested object of attribute choices to display + */ + static getTrackedAttributeChoices(attributes, model) { + attributes = attributes || this.getTrackedAttributes(); + const barGroup = game.i18n.localize('TOKEN.BarAttributes'); + const valueGroup = game.i18n.localize('TOKEN.BarValues'); + + const bars = attributes.bar.map(v => { + const a = v.join('.'); + const modelLabel = model ? game.i18n.localize(model.schema.getField(`${a}.value`).label) : null; + return { group: barGroup, value: a, label: modelLabel ? modelLabel : a }; + }); + bars.sort((a, b) => a.label.compare(b.label)); + + const invalidAttributes = [ + 'gold', + 'levelData', + 'actions', + 'biography', + 'class', + 'multiclass', + 'companion', + 'notes', + 'partner', + 'description', + 'impulses', + 'tier', + 'type' + ]; + const values = attributes.value.reduce((acc, v) => { + const a = v.join('.'); + if (invalidAttributes.some(x => a.startsWith(x))) return acc; + + const field = model ? model.schema.getField(a) : null; + const modelLabel = field ? game.i18n.localize(field.label) : null; + const hint = field ? game.i18n.localize(field.hint) : null; + acc.push({ group: valueGroup, value: a, label: modelLabel ? modelLabel : a, hint: hint }); + + return acc; + }, []); + values.sort((a, b) => a.label.compare(b.label)); + + return bars.concat(values); + } + + static _getTrackedAttributesFromSchema(schema, _path = []) { + const attributes = { bar: [], value: [] }; + for (const [name, field] of Object.entries(schema.fields)) { + const p = _path.concat([name]); + if (field instanceof foundry.data.fields.NumberField) attributes.value.push(p); + if (field instanceof foundry.data.fields.StringField) attributes.value.push(p); + if (field instanceof foundry.data.fields.ArrayField) attributes.value.push(p); + const isSchema = field instanceof foundry.data.fields.SchemaField; + const isModel = field instanceof foundry.data.fields.EmbeddedDataField; + + if (isSchema || isModel) { + const schema = isModel ? field.model.schema : field; + const isBar = schema.has && schema.has('value') && schema.has('max'); + if (isBar) attributes.bar.push(p); + else { + const inner = this.getTrackedAttributes(schema, p); + attributes.bar.push(...inner.bar); + attributes.value.push(...inner.value); + } + } + } + return attributes; + } +} diff --git a/module/documents/tooltipManager.mjs b/module/documents/tooltipManager.mjs index b780dfa9..8e1c729e 100644 --- a/module/documents/tooltipManager.mjs +++ b/module/documents/tooltipManager.mjs @@ -1,16 +1,130 @@ export default class DhTooltipManager extends foundry.helpers.interaction.TooltipManager { async activate(element, options = {}) { + const { TextEditor } = foundry.applications.ux; + let html = options.html; - if (element.dataset.tooltip.startsWith('#item#')) { - const item = await foundry.utils.fromUuid(element.dataset.tooltip.slice(6)); + if (element.dataset.tooltip?.startsWith('#item#')) { + const splitValues = element.dataset.tooltip.slice(6).split('#action#'); + const itemUuid = splitValues[0]; + const actionId = splitValues.length > 1 ? splitValues[1] : null; + + const baseItem = await foundry.utils.fromUuid(itemUuid); + const item = actionId ? baseItem.system.actions.find(x => x.id === actionId) : baseItem; if (item) { + const type = actionId ? 'action' : item.type; + const description = await TextEditor.enrichHTML(item.system.description); + for (let feature of item.system.features) { + feature.system.enrichedDescription = await TextEditor.enrichHTML(feature.system.description); + } + html = await foundry.applications.handlebars.renderTemplate( - `systems/daggerheart/templates/ui/tooltip/${item.type}.hbs`, - item + `systems/daggerheart/templates/ui/tooltip/${type}.hbs`, + { + item: item, + description: description, + config: CONFIG.DH + } ); + + this.tooltip.innerHTML = html; + options.direction = this._determineItemTooltipDirection(element); + } + } else { + const attack = element.dataset.tooltip?.startsWith('#attack#'); + if (attack) { + const actorUuid = element.dataset.tooltip.slice(8); + const actor = await foundry.utils.fromUuid(actorUuid); + const attack = actor.system.attack; + + const description = await TextEditor.enrichHTML(attack.description); + html = await foundry.applications.handlebars.renderTemplate( + `systems/daggerheart/templates/ui/tooltip/attack.hbs`, + { + attack: attack, + description: description, + parent: actor, + config: CONFIG.DH + } + ); + + this.tooltip.innerHTML = html; + } + + const shortRest = element.dataset.tooltip?.startsWith('#shortRest#'); + const longRest = element.dataset.tooltip?.startsWith('#longRest#'); + if (shortRest || longRest) { + const key = element.dataset.tooltip.slice(shortRest ? 11 : 10); + const downtimeOptions = shortRest + ? CONFIG.DH.GENERAL.defaultRestOptions.shortRest() + : CONFIG.DH.GENERAL.defaultRestOptions.longRest(); + + const move = downtimeOptions[key]; + const description = await TextEditor.enrichHTML(move.description); + html = await foundry.applications.handlebars.renderTemplate( + `systems/daggerheart/templates/ui/tooltip/downtime.hbs`, + { + move: move, + description: description + } + ); + + this.tooltip.innerHTML = html; + options.direction = this._determineItemTooltipDirection( + element, + this.constructor.TOOLTIP_DIRECTIONS.RIGHT + ); + } + + const isAdvantage = element.dataset.tooltip?.startsWith('#advantage#'); + const isDisadvantage = element.dataset.tooltip?.startsWith('#disadvantage#'); + if (isAdvantage || isDisadvantage) { + const actorUuid = element.dataset.tooltip.slice(isAdvantage ? 11 : 14); + const actor = await foundry.utils.fromUuid(actorUuid); + + if (actor) { + html = await foundry.applications.handlebars.renderTemplate( + `systems/daggerheart/templates/ui/tooltip/advantage.hbs`, + { + sources: isAdvantage ? actor.system.advantageSources : actor.system.disadvantageSources + } + ); + + this.tooltip.innerHTML = html; + } } } super.activate(element, { ...options, html: html }); } + + _determineItemTooltipDirection(element, prefered = this.constructor.TOOLTIP_DIRECTIONS.LEFT) { + const pos = element.getBoundingClientRect(); + const dirs = this.constructor.TOOLTIP_DIRECTIONS; + switch (prefered) { + case this.constructor.TOOLTIP_DIRECTIONS.LEFT: + return dirs[ + pos.x - this.tooltip.offsetWidth < 0 + ? this.constructor.TOOLTIP_DIRECTIONS.DOWN + : this.constructor.TOOLTIP_DIRECTIONS.LEFT + ]; + case this.constructor.TOOLTIP_DIRECTIONS.UP: + return dirs[ + pos.y - this.tooltip.offsetHeight < 0 + ? this.constructor.TOOLTIP_DIRECTIONS.RIGHT + : this.constructor.TOOLTIP_DIRECTIONS.UP + ]; + case this.constructor.TOOLTIP_DIRECTIONS.RIGHT: + return dirs[ + pos.x + this.tooltip.offsetWidth > document.body.clientWidth + ? this.constructor.TOOLTIP_DIRECTIONS.DOWN + : this.constructor.TOOLTIP_DIRECTIONS.RIGHT + ]; + case this.constructor.TOOLTIP_DIRECTIONS.DOWN: + return dirs[ + pos.y + this.tooltip.offsetHeight > document.body.clientHeight + ? this.constructor.TOOLTIP_DIRECTIONS.LEFT + : this.constructor.TOOLTIP_DIRECTIONS.DOWN + ]; + } + } } diff --git a/module/enrichers/DamageEnricher.mjs b/module/enrichers/DamageEnricher.mjs new file mode 100644 index 00000000..918edc39 --- /dev/null +++ b/module/enrichers/DamageEnricher.mjs @@ -0,0 +1,80 @@ +export default function DhDamageEnricher(match, _options) { + const parts = match[1].split('|').map(x => x.trim()); + + let value = null, + type = null; + + parts.forEach(part => { + const split = part.split(':').map(x => x.toLowerCase().trim()); + if (split.length === 2) { + switch (split[0]) { + case 'value': + value = split[1]; + break; + case 'type': + type = split[1]; + break; + } + } + }); + + if (!value || !value) return match[0]; + + return getDamageMessage(value, type, match[0]); +} + +function getDamageMessage(damage, type, defaultElement) { + const typeIcons = type + .replace('[', '') + .replace(']', '') + .split(',') + .map(x => x.trim()) + .map(x => { + return CONFIG.DH.GENERAL.damageTypes[x]?.icon ?? null; + }) + .filter(x => x); + + if (!typeIcons.length) return defaultElement; + + const iconNodes = typeIcons.map(x => ``).join(''); + + const dualityElement = document.createElement('span'); + dualityElement.innerHTML = ` + + `; + + return dualityElement; +} + +export const renderDamageButton = async event => { + const button = event.currentTarget, + value = button.dataset.value, + type = button.dataset.type + .replace('[', '') + .replace(']', '') + .split(',') + .map(x => x.trim()); + + const config = { + event: event, + title: game.i18n.localize('Damage Roll'), + data: { bonuses: [] }, + source: {}, + roll: [ + { + formula: value, + applyTo: CONFIG.DH.GENERAL.healingTypes.hitPoints.id, + type: type + } + ] + }; + + CONFIG.Dice.daggerheart.DamageRoll.build(config); +}; diff --git a/module/enrichers/DualityRollEnricher.mjs b/module/enrichers/DualityRollEnricher.mjs index 094a6948..dde82a48 100644 --- a/module/enrichers/DualityRollEnricher.mjs +++ b/module/enrichers/DualityRollEnricher.mjs @@ -8,7 +8,7 @@ export default function DhDualityRollEnricher(match, _options) { return getDualityMessage(roll); } -export function getDualityMessage(roll) { +function getDualityMessage(roll) { const traitLabel = roll.trait && abilities[roll.trait] ? game.i18n.format('DAGGERHEART.GENERAL.check', { @@ -21,19 +21,34 @@ export function getDualityMessage(roll) { ? game.i18n.localize(abilities[roll.trait].label) : game.i18n.localize('DAGGERHEART.GENERAL.duality'); + const advantage = roll.advantage + ? CONFIG.DH.ACTIONS.advandtageState.advantage.value + : roll.disadvantage + ? CONFIG.DH.ACTIONS.advandtageState.disadvantage.value + : undefined; + const advantageLabel = + advantage === CONFIG.DH.ACTIONS.advandtageState.advantage.value + ? 'Advantage' + : advantage === CONFIG.DH.ACTIONS.advandtageState.disadvantage.value + ? 'Disadvantage' + : undefined; + const dualityElement = document.createElement('span'); dualityElement.innerHTML = ` `; @@ -43,16 +58,39 @@ export function getDualityMessage(roll) { export const renderDualityButton = async event => { const button = event.currentTarget, traitValue = button.dataset.trait?.toLowerCase(), - target = getCommandTarget(); + target = getCommandTarget(), + difficulty = button.dataset.difficulty, + advantage = button.dataset.advantage ? Number(button.dataset.advantage) : undefined; + + await enrichedDualityRoll( + { + traitValue, + target, + difficulty, + title: button.dataset.title, + label: button.dataset.label, + actionType: button.dataset.actionType, + advantage + }, + event + ); +}; + +export const enrichedDualityRoll = async ( + { traitValue, target, difficulty, title, label, actionType, advantage }, + event +) => { if (!target) return; const config = { - event: event, - title: button.dataset.title, + event: event ?? {}, + title: title, roll: { modifier: traitValue ? target.system.traits[traitValue].value : null, - label: button.dataset.label, - type: button.dataset.actionType ?? null // Need check + label: label, + difficulty: difficulty, + advantage, + type: actionType ?? null // Need check, }, chatMessage: { template: 'systems/daggerheart/templates/ui/chat/duality-roll.hbs' diff --git a/module/enrichers/EffectEnricher.mjs b/module/enrichers/EffectEnricher.mjs new file mode 100644 index 00000000..69b89ef2 --- /dev/null +++ b/module/enrichers/EffectEnricher.mjs @@ -0,0 +1,19 @@ +export default async function DhEffectEnricher(match, _options) { + const effect = await foundry.utils.fromUuid(match[1]); + if (!effect) return match[0]; + + const dualityElement = document.createElement('span'); + dualityElement.innerHTML = ` + + + ${effect.name} + + `; + + return dualityElement; +} diff --git a/module/enrichers/_module.mjs b/module/enrichers/_module.mjs index 1907f117..abfd8158 100644 --- a/module/enrichers/_module.mjs +++ b/module/enrichers/_module.mjs @@ -1,2 +1,43 @@ -export { default as DhDualityRollEnricher } from './DualityRollEnricher.mjs'; -export { default as DhTemplateEnricher } from './TemplateEnricher.mjs'; +import { default as DhDamageEnricher, renderDamageButton } from './DamageEnricher.mjs'; +import { default as DhDualityRollEnricher, renderDualityButton } from './DualityRollEnricher.mjs'; +import { default as DhEffectEnricher } from './EffectEnricher.mjs'; +import { default as DhTemplateEnricher, renderMeasuredTemplate } from './TemplateEnricher.mjs'; + +export { DhDamageEnricher, DhDualityRollEnricher, DhEffectEnricher, DhTemplateEnricher }; + +export const enricherConfig = [ + { + pattern: /^@Damage\[(.*)\]$/g, + enricher: DhDamageEnricher + }, + { + pattern: /\[\[\/dr\s?(.*?)\]\]/g, + enricher: DhDualityRollEnricher + }, + { + pattern: /^@Effect\[(.*)\]$/g, + enricher: DhEffectEnricher + }, + { + pattern: /^@Template\[(.*)\]$/g, + enricher: DhTemplateEnricher + } +]; + +export const enricherRenderSetup = element => { + element + .querySelectorAll('.enriched-damage-button') + .forEach(element => element.addEventListener('click', renderDamageButton)); + + element + .querySelectorAll('.duality-roll-button') + .forEach(element => element.addEventListener('click', renderDualityButton)); + + element + .querySelectorAll('.measured-template-button') + .forEach(element => element.addEventListener('click', renderMeasuredTemplate)); + + // element + // .querySelectorAll('.enriched-effect') + // .forEach(element => element.addEventListener('dragstart', dragEnrichedEffect)); +}; diff --git a/module/helpers/handlebarsHelper.mjs b/module/helpers/handlebarsHelper.mjs index 6db51225..0c919191 100644 --- a/module/helpers/handlebarsHelper.mjs +++ b/module/helpers/handlebarsHelper.mjs @@ -1,16 +1,26 @@ -import { getWidthOfText } from './utils.mjs'; +import { itemAbleRollParse } from './utils.mjs'; export default class RegisterHandlebarsHelpers { static registerHelpers() { Handlebars.registerHelper({ - times: this.times, - join: this.join, add: this.add, - subtract: this.subtract, includes: this.includes, - case: this.case + times: this.times, + damageFormula: this.damageFormula, + damageSymbols: this.damageSymbols, + rollParsed: this.rollParsed, + hasProperty: foundry.utils.hasProperty }); } + static add(a, b) { + const aNum = Number.parseInt(a); + const bNum = Number.parseInt(b); + return (Number.isNaN(aNum) ? 0 : aNum) + (Number.isNaN(bNum) ? 0 : bNum); + } + + static includes(list, item) { + return list.includes(item); + } static times(nr, block) { var accum = ''; @@ -18,30 +28,26 @@ export default class RegisterHandlebarsHelpers { return accum; } - static join(...options) { - return options.slice(0, options.length - 1); + static damageFormula(attack, actor) { + const traitTotal = actor.system.traits?.[attack.roll.trait]?.value; + const instances = [ + attack.damage.parts.map(x => Roll.replaceFormulaData(x.value.getFormula(), actor)).join(' + '), + traitTotal + ].filter(x => x); + + return instances.join(traitTotal > 0 ? ' + ' : ' - '); } - static add(a, b) { - const aNum = Number.parseInt(a); - const bNum = Number.parseInt(b); - return (Number.isNaN(aNum) ? 0 : aNum) + (Number.isNaN(bNum) ? 0 : bNum); + static damageSymbols(damageParts) { + const symbols = [...new Set(damageParts.reduce((a, c) => a.concat([...c.type]), []))].map( + p => CONFIG.DH.GENERAL.damageTypes[p].icon + ); + return new Handlebars.SafeString(Array.from(symbols).map(symbol => ``)); } - static subtract(a, b) { - const aNum = Number.parseInt(a); - const bNum = Number.parseInt(b); - return (Number.isNaN(aNum) ? 0 : aNum) - (Number.isNaN(bNum) ? 0 : bNum); - } - - static includes(list, item) { - return list.includes(item); - } - - static case(value, options) { - if (value == this.switch_value) { - this.switch_break = true; - return options.fn(this); - } + static rollParsed(value, actor, item, numerical) { + const isNumerical = typeof numerical === 'boolean' ? numerical : false; + const result = itemAbleRollParse(value, actor, item); + return isNumerical && !result ? 0 : result; } } diff --git a/module/helpers/utils.mjs b/module/helpers/utils.mjs index e719b25e..7e73695e 100644 --- a/module/helpers/utils.mjs +++ b/module/helpers/utils.mjs @@ -1,80 +1,10 @@ import { diceTypes, getDiceSoNicePresets, range } from '../config/generalConfig.mjs'; import Tagify from '@yaireo/tagify'; -export const loadCompendiumOptions = async compendiums => { - const compendiumValues = []; - - for (var compendium of compendiums) { - const values = await getCompendiumOptions(compendium); - compendiumValues.push(values); - } - - return compendiumValues; -}; - -const getCompendiumOptions = async compendium => { - const compendiumPack = await game.packs.get(compendium); - - const values = []; - for (var value of compendiumPack.index) { - const document = await compendiumPack.getDocument(value._id); - values.push(document); - } - - return values; -}; - -export const getWidthOfText = (txt, fontsize, allCaps, bold) => { - const text = allCaps ? txt.toUpperCase() : txt; - if (getWidthOfText.c === undefined) { - getWidthOfText.c = document.createElement('canvas'); - getWidthOfText.ctx = getWidthOfText.c.getContext('2d'); - } - var fontspec = `${bold ? 'bold' : ''} ${fontsize}px` + ' ' + 'Signika, sans-serif'; - if (getWidthOfText.ctx.font !== fontspec) getWidthOfText.ctx.font = fontspec; - - return getWidthOfText.ctx.measureText(text).width; -}; - -export const padArray = (arr, len, fill) => { - return arr.concat(Array(len).fill(fill)).slice(0, len); -}; - -export const getTier = (level, asNr) => { - switch (Math.floor((level + 1) / 3)) { - case 1: - return asNr ? 1 : 'tier1'; - case 2: - return asNr ? 2 : 'tier2'; - case 3: - return asNr ? 3 : 'tier3'; - default: - return asNr ? 0 : 'tier0'; - } -}; - export const capitalize = string => { return string.charAt(0).toUpperCase() + string.slice(1); }; -export const getPathValue = (path, entity, numeric) => { - const pathValue = foundry.utils.getProperty(entity, path); - if (pathValue) return numeric ? Number.parseInt(pathValue) : pathValue; - - return numeric ? Number.parseInt(path) : path; -}; - -export const generateId = (title, length) => { - const id = title - .split(' ') - .map((w, i) => { - const p = w.slugify({ replacement: '', strict: true }); - return i ? p.titleCase() : p; - }) - .join(''); - return Number.isNumeric(length) ? id.slice(0, length).padEnd(length, '0') : id; -}; - export function rollCommandToJSON(text) { if (!text) return {}; @@ -126,12 +56,10 @@ export const setDiceSoNiceForDualityRoll = (rollResult, advantageState) => { const diceSoNicePresets = getDiceSoNicePresets(); rollResult.dice[0].options = { appearance: diceSoNicePresets.hope }; rollResult.dice[1].options = { appearance: diceSoNicePresets.fear }; //diceSoNicePresets.fear; - if (rollResult.dice[2]) { - if (advantageState === true) { - rollResult.dice[2].options = { appearance: diceSoNicePresets.advantage }; - } else if (advantageState === false) { - rollResult.dice[2].options = { appearance: diceSoNicePresets.disadvantage }; - } + if (rollResult.dice[2] && advantageState) { + rollResult.dice[2].options = { + appearance: advantageState === 1 ? diceSoNicePresets.advantage : diceSoNicePresets.disadvantage + }; } }; @@ -159,7 +87,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 +102,12 @@ export const tagifyElement = (element, options, onChange, tagifyOptions = {}) => }, templates: { tag(tagData) { - return `
@@ -190,6 +120,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,30 +165,21 @@ Roll.replaceFormulaData = function (formula, data = {}, { missing, warn = false return nativeReplaceFormulaData(formula, data, { missing, warn }); }; +export const getDamageKey = damage => { + return ['none', 'minor', 'major', 'severe'][damage]; +}; + export const getDamageLabel = damage => { - switch (damage) { - case 3: - return game.i18n.localize('DAGGERHEART.GENERAL.Damage.severe'); - case 2: - return game.i18n.localize('DAGGERHEART.GENERAL.Damage.major'); - case 1: - return game.i18n.localize('DAGGERHEART.GENERAL.Damage.minor'); - case 0: - return game.i18n.localize('DAGGERHEART.GENERAL.Damage.none'); - } + return game.i18n.localize(`DAGGERHEART.GENERAL.Damage.${getDamageKey(damage)}`); }; export const damageKeyToNumber = key => { - switch (key) { - case 'severe': - return 3; - case 'major': - return 2; - case 'minor': - return 1; - case 'none': - return 0; - } + return { + none: 0, + minor: 1, + major: 2, + severe: 3 + }[key]; }; export default function constructHTMLButton({ @@ -306,3 +229,32 @@ export const updateActorTokens = async (actor, update) => { } } }; + +/** + * Retrieves a Foundry document associated with the nearest ancestor element + * that has a `data-item-uuid` attribute. + * @param {HTMLElement} element - The DOM element to start the search from. + * @returns {foundry.abstract.Document|null} The resolved document, or null if not found or invalid. + */ +export function getDocFromElement(element) { + const target = element.closest('[data-item-uuid]'); + return foundry.utils.fromUuidSync(target.dataset.itemUuid) ?? null; +} + +export const itemAbleRollParse = (value, actor, item) => { + if (!value) return value; + + const isItemTarget = value.toLowerCase().startsWith('item.'); + const slicedValue = isItemTarget ? value.slice(5) : value; + try { + return Roll.replaceFormulaData(slicedValue, isItemTarget ? item : actor); + } catch (_) { + return ''; + } +}; + +export const arraysEqual = (a, b) => + a.length === b.length && + [...new Set([...a, ...b])].every(v => a.filter(e => e === v).length === b.filter(e => e === v).length); + +export const setsEqual = (a, b) => a.size === b.size && [...a].every(value => b.has(value)); diff --git a/module/systemRegistration/handlebars.mjs b/module/systemRegistration/handlebars.mjs index 75a5aff6..fc6decd3 100644 --- a/module/systemRegistration/handlebars.mjs +++ b/module/systemRegistration/handlebars.mjs @@ -1,10 +1,15 @@ export const preloadHandlebarsTemplates = async function () { + foundry.applications.handlebars.loadTemplates({ + 'daggerheart.inventory-items': + 'systems/daggerheart/templates/sheets/global/partials/inventory-fieldset-items-V2.hbs', + 'daggerheart.inventory-item': 'systems/daggerheart/templates/sheets/global/partials/inventory-item-V2.hbs' + }); return foundry.applications.handlebars.loadTemplates([ 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs', - 'systems/daggerheart/templates/sheets/global/partials/inventory-item.hbs', 'systems/daggerheart/templates/sheets/global/partials/action-item.hbs', 'systems/daggerheart/templates/sheets/global/partials/domain-card-item.hbs', - 'systems/daggerheart/templates/sheets/global/partials/inventory-fieldset-items.hbs', + 'systems/daggerheart/templates/sheets/global/partials/item-resource.hbs', + 'systems/daggerheart/templates/sheets/global/partials/resource-section.hbs', 'systems/daggerheart/templates/components/card-preview.hbs', 'systems/daggerheart/templates/levelup/parts/selectable-card-preview.hbs', 'systems/daggerheart/templates/sheets/global/partials/feature-section-item.hbs', @@ -22,6 +27,10 @@ export const preloadHandlebarsTemplates = async function () { 'systems/daggerheart/templates/actionTypes/beastform.hbs', 'systems/daggerheart/templates/settings/components/settings-item-line.hbs', 'systems/daggerheart/templates/ui/chat/parts/damage-chat.hbs', - 'systems/daggerheart/templates/ui/chat/parts/target-chat.hbs' + 'systems/daggerheart/templates/ui/chat/parts/target-chat.hbs', + 'systems/daggerheart/templates/ui/tooltip/parts/tooltipChips.hbs', + 'systems/daggerheart/templates/ui/tooltip/parts/tooltipTags.hbs', + 'systems/daggerheart/templates/dialogs/downtime/activities.hbs', + 'systems/daggerheart/templates/dialogs/dice-roll/costSelection.hbs' ]); }; diff --git a/module/systemRegistration/settings.mjs b/module/systemRegistration/settings.mjs index a4ed05c8..fea12acd 100644 --- a/module/systemRegistration/settings.mjs +++ b/module/systemRegistration/settings.mjs @@ -60,7 +60,7 @@ const registerMenuSettings = () => { }); game.settings.register(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement, { - scope: 'client', + scope: 'world', config: false, type: DhRangeMeasurement }); diff --git a/module/systemRegistration/socket.mjs b/module/systemRegistration/socket.mjs index d7f79df9..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 }); */ @@ -63,21 +69,28 @@ export const registerSocketHooks = () => { }); }; -export const emitAsGM = async (eventName, callback, args) => { - if(!game.user.isGM) { - return new Promise(async (resolve, reject) => { - try { - const response = await game.socket.emit(`system.${CONFIG.DH.id}`, { - action: socketEvent.GMUpdate, - data: { - action: eventName, - update: args - } - }); - resolve(response); - } catch (error) { - reject(error); +export const emitAsGM = async (eventName, callback, update, uuid = null) => { + if (!game.user.isGM) { + return await game.socket.emit(`system.${CONFIG.DH.id}`, { + action: socketEvent.GMUpdate, + data: { + action: eventName, + uuid, + update } - }) - } else return callback(args); -} + }); + } else return callback(update); +}; + +export const emitAsOwner = (eventName, userId, args) => { + if (userId === game.user.id) return; + if (!eventName || !userId) return false; + game.socket.emit(`system.${CONFIG.DH.id}`, { + action: eventName, + data: { + userId, + ...args + } + }); + return false; +}; diff --git a/package-lock.json b/package-lock.json index 7b1bed60..864d027c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,6 +6,7 @@ "": { "dependencies": { "@yaireo/tagify": "^4.17.9", + "autocompleter": "^9.3.2", "gulp": "^5.0.0", "gulp-less": "^5.0.0", "rollup": "^4.40.0" @@ -608,6 +609,11 @@ "node": ">= 10.13.0" } }, + "node_modules/autocompleter": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/autocompleter/-/autocompleter-9.3.2.tgz", + "integrity": "sha512-rLbf2TLGOD7y+gOS36ksrZdIsvoHa2KXc2A7503w+NBRPrcF73zzFeYBxEcV/iMPjaBH3jFhNIYObZ7zt1fkCQ==" + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", diff --git a/package.json b/package.json index d7b51dfd..a7dd69b9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "dependencies": { "@yaireo/tagify": "^4.17.9", + "autocompleter": "^9.3.2", "gulp": "^5.0.0", "gulp-less": "^5.0.0", "rollup": "^4.40.0" diff --git a/rollup.config.mjs b/rollup.config.mjs index b8868cb6..db900120 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -15,7 +15,7 @@ export default { path: './postcss.config.js' }, extensions: ['.css'], - extract: false + extract: 'tagify.css' }), commonjs({ include: /node_modules/, diff --git a/src/packs/class-features/folders_Rogue_AzwvgmcvToIUGYti.json b/src/packs/adversaries/folders_Tier_1_sxvlEwi25uAoB2C5.json similarity index 56% rename from src/packs/class-features/folders_Rogue_AzwvgmcvToIUGYti.json rename to src/packs/adversaries/folders_Tier_1_sxvlEwi25uAoB2C5.json index 2d94183a..1fe3770c 100644 --- a/src/packs/class-features/folders_Rogue_AzwvgmcvToIUGYti.json +++ b/src/packs/adversaries/folders_Tier_1_sxvlEwi25uAoB2C5.json @@ -1,10 +1,10 @@ { "type": "Item", "folder": null, - "name": "Rogue", + "name": "Tier 1", "color": null, "sorting": "a", - "_id": "AzwvgmcvToIUGYti", + "_id": "sxvlEwi25uAoB2C5", "description": "", "sort": 0, "flags": {}, @@ -12,12 +12,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "createdTime": 1748709700301, - "modifiedTime": 1748709700301, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" + "createdTime": 1752684226915, + "modifiedTime": 1752684226915, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" }, - "_key": "!folders!AzwvgmcvToIUGYti" + "_key": "!folders!sxvlEwi25uAoB2C5" } diff --git a/src/packs/class-features/folders_Bard_3QoIMKARHfRnBvQJ.json b/src/packs/adversaries/folders_Tier_2_OgzrmfH1ZbpljX7k.json similarity index 56% rename from src/packs/class-features/folders_Bard_3QoIMKARHfRnBvQJ.json rename to src/packs/adversaries/folders_Tier_2_OgzrmfH1ZbpljX7k.json index c9613739..add2018d 100644 --- a/src/packs/class-features/folders_Bard_3QoIMKARHfRnBvQJ.json +++ b/src/packs/adversaries/folders_Tier_2_OgzrmfH1ZbpljX7k.json @@ -1,10 +1,10 @@ { "type": "Item", "folder": null, - "name": "Bard", + "name": "Tier 2", "color": null, "sorting": "a", - "_id": "3QoIMKARHfRnBvQJ", + "_id": "OgzrmfH1ZbpljX7k", "description": "", "sort": 0, "flags": {}, @@ -12,12 +12,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "createdTime": 1748709671341, - "modifiedTime": 1748709671341, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" + "createdTime": 1752684230275, + "modifiedTime": 1752684230275, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" }, - "_key": "!folders!3QoIMKARHfRnBvQJ" + "_key": "!folders!OgzrmfH1ZbpljX7k" } diff --git a/src/packs/class-features/folders_Ranger_84neMcqoIRAoIvXP.json b/src/packs/adversaries/folders_Tier_3_wTI7nZkPhKxl7Wwq.json similarity index 56% rename from src/packs/class-features/folders_Ranger_84neMcqoIRAoIvXP.json rename to src/packs/adversaries/folders_Tier_3_wTI7nZkPhKxl7Wwq.json index c49048a2..4a22ae4c 100644 --- a/src/packs/class-features/folders_Ranger_84neMcqoIRAoIvXP.json +++ b/src/packs/adversaries/folders_Tier_3_wTI7nZkPhKxl7Wwq.json @@ -1,10 +1,10 @@ { "type": "Item", "folder": null, - "name": "Ranger", + "name": "Tier 3", "color": null, "sorting": "a", - "_id": "84neMcqoIRAoIvXP", + "_id": "wTI7nZkPhKxl7Wwq", "description": "", "sort": 0, "flags": {}, @@ -12,12 +12,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "createdTime": 1748709694559, - "modifiedTime": 1748709694559, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" + "createdTime": 1752684233122, + "modifiedTime": 1752684233122, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" }, - "_key": "!folders!84neMcqoIRAoIvXP" + "_key": "!folders!wTI7nZkPhKxl7Wwq" } diff --git a/src/packs/class-features/folders_Druid_l94HTIXSvdZG3zIh.json b/src/packs/adversaries/folders_Tier_4_7XHlANCPz18yvl5L.json similarity index 56% rename from src/packs/class-features/folders_Druid_l94HTIXSvdZG3zIh.json rename to src/packs/adversaries/folders_Tier_4_7XHlANCPz18yvl5L.json index 4a34b92f..cf068e44 100644 --- a/src/packs/class-features/folders_Druid_l94HTIXSvdZG3zIh.json +++ b/src/packs/adversaries/folders_Tier_4_7XHlANCPz18yvl5L.json @@ -1,10 +1,10 @@ { "type": "Item", "folder": null, - "name": "Druid", + "name": "Tier 4", "color": null, "sorting": "a", - "_id": "l94HTIXSvdZG3zIh", + "_id": "7XHlANCPz18yvl5L", "description": "", "sort": 0, "flags": {}, @@ -12,12 +12,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "createdTime": 1748709677349, - "modifiedTime": 1748709677349, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" + "createdTime": 1752684235596, + "modifiedTime": 1752684235596, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" }, - "_key": "!folders!l94HTIXSvdZG3zIh" + "_key": "!folders!7XHlANCPz18yvl5L" } diff --git a/src/packs/ancestries/ancestry_Clank_AzKMOIpXnCSLLDEB.json b/src/packs/ancestries/ancestry_Clank_AzKMOIpXnCSLLDEB.json deleted file mode 100644 index 0541310a..00000000 --- a/src/packs/ancestries/ancestry_Clank_AzKMOIpXnCSLLDEB.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "Clank", - "type": "ancestry", - "_id": "AzKMOIpXnCSLLDEB", - "img": "icons/svg/item-bag.svg", - "system": { - "description": "

Purposeful Design: Decide who made you and for what purpose. At character creation, choose one of your Experiences that best aligns with this purpose and gain a permanent +1 bonus to it.

Efficient: When you take a short rest, you can choose a long rest move instead of a short rest move.

", - "abilities": [] - }, - "effects": [], - "folder": null, - "sort": 100000, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747990113503, - "modifiedTime": 1747999445342, - "lastModifiedBy": "NqO2eQGMjrvUO6v9" - }, - "_key": "!items!AzKMOIpXnCSLLDEB" -} diff --git a/src/packs/ancestries/folders_Ancestry_Features_dSAccOl5ccgXPyje.json b/src/packs/ancestries/folders_Ancestry_Features_dSAccOl5ccgXPyje.json new file mode 100644 index 00000000..789ccbe4 --- /dev/null +++ b/src/packs/ancestries/folders_Ancestry_Features_dSAccOl5ccgXPyje.json @@ -0,0 +1,23 @@ +{ + "type": "Item", + "folder": null, + "name": "Ancestry Features", + "color": null, + "sorting": "a", + "_id": "dSAccOl5ccgXPyje", + "description": "", + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752680699271, + "modifiedTime": 1752680699271, + "lastModifiedBy": "binNpU8lWev6geDj" + }, + "_key": "!folders!dSAccOl5ccgXPyje" +} diff --git a/src/packs/beastforms/beastform_Agile_Scout_6tr99y6wHaJJYy3J.json b/src/packs/beastforms/beastform_Agile_Scout_6tr99y6wHaJJYy3J.json new file mode 100644 index 00000000..0885d9f3 --- /dev/null +++ b/src/packs/beastforms/beastform_Agile_Scout_6tr99y6wHaJJYy3J.json @@ -0,0 +1,160 @@ +{ + "name": "Agile Scout", + "type": "beastform", + "img": "icons/creatures/mammals/goat-horned-blue.webp", + "system": { + "beastformType": "normal", + "tier": 1, + "tokenImg": "icons/creatures/mammals/goat-horned-blue.webp", + "tokenRingImg": "icons/svg/mystery-man.svg", + "tokenSize": { + "height": null, + "width": null + }, + "mainTrait": "agility", + "advantageOn": { + "tXlf8FvWrgGqfaJu": { + "value": "deceit" + }, + "lp1gv9iNUCpC2Fli": { + "value": "locate" + }, + "GxDMKUpOeDHzyhAT": { + "value": "sneak" + } + }, + "features": [ + "Compendium.daggerheart.beastforms.Item.sef9mwD2eRLZ64oV", + "Compendium.daggerheart.beastforms.Item.9ryNrYWjNtOT6DXN" + ], + "evolved": { + "mainTraitBonus": 0 + }, + "hybrid": { + "beastformOptions": 2, + "advantages": 2, + "features": 2 + }, + "examples": "Fox, Mouse, Weasel, etc." + }, + "effects": [ + { + "type": "beastform", + "name": "Beastform Transformation", + "img": "icons/creatures/abilities/paw-print-pair-purple.webp", + "_id": "m098fyKkAjTFZ6UJ", + "system": { + "characterTokenData": { + "tokenImg": null, + "tokenRingImg": "icons/svg/mystery-man.svg", + "tokenSize": {} + }, + "advantageOn": [], + "featureIds": [], + "effectIds": [] + }, + "changes": [ + { + "key": "system.traits.agility.value", + "mode": 2, + "value": "1", + "priority": null + }, + { + "key": "system.evasion", + "mode": 2, + "value": "2", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "origin": null, + "tint": "#ffffff", + "transfer": true, + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "lastModifiedBy": null + }, + "_key": "!items.effects!6tr99y6wHaJJYy3J.m098fyKkAjTFZ6UJ" + }, + { + "type": "beastform", + "name": "Beastform Transformation", + "img": "icons/creatures/abilities/paw-print-pair-purple.webp", + "_id": "5mi9ku2R4paP579i", + "system": { + "characterTokenData": { + "tokenImg": null, + "tokenRingImg": "icons/svg/mystery-man.svg", + "tokenSize": {} + }, + "advantageOn": [], + "featureIds": [], + "effectIds": [] + }, + "changes": [], + "disabled": false, + "duration": { + "startTime": null, + "combat": null + }, + "description": "", + "origin": null, + "tint": "#ffffff", + "transfer": true, + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976985351, + "modifiedTime": 1752976985351, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_key": "!items.effects!6tr99y6wHaJJYy3J.5mi9ku2R4paP579i" + } + ], + "folder": null, + "ownership": { + "default": 0, + "k0gmQFlvrPvlTtbh": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976985346, + "modifiedTime": 1752976987362, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_id": "6tr99y6wHaJJYy3J", + "sort": 100000, + "_key": "!items!6tr99y6wHaJJYy3J" +} diff --git a/src/packs/beastforms/beastform_Household_Friend_uxBugKULjn7O1KQc.json b/src/packs/beastforms/beastform_Household_Friend_uxBugKULjn7O1KQc.json new file mode 100644 index 00000000..288afead --- /dev/null +++ b/src/packs/beastforms/beastform_Household_Friend_uxBugKULjn7O1KQc.json @@ -0,0 +1,166 @@ +{ + "name": "Household Friend", + "type": "beastform", + "img": "icons/creatures/mammals/cat-hunched-glowing-red.webp", + "system": { + "beastformType": "normal", + "tier": 1, + "tokenImg": "icons/creatures/mammals/cat-hunched-glowing-red.webp", + "tokenRingImg": "icons/svg/mystery-man.svg", + "tokenSize": { + "height": null, + "width": null + }, + "mainTrait": "instinct", + "advantageOn": { + "u0mzlWihDHITgh1x": { + "value": "climb" + }, + "m53oFXA2SA5jAjWc": { + "value": "locate" + }, + "XLPn5Egg9mIuLyVP": { + "value": "protect" + } + }, + "features": [ + "Compendium.daggerheart.beastforms.Item.0tlnxIxlIw2hl1UE", + "Compendium.daggerheart.beastforms.Item.9ryNrYWjNtOT6DXN" + ], + "evolved": { + "mainTraitBonus": 0 + }, + "hybrid": { + "beastformOptions": 2, + "advantages": 2, + "features": 2 + }, + "examples": "Cat, Dog, Rabbit, etc." + }, + "effects": [ + { + "type": "beastform", + "name": "Beastform Transformation", + "img": "icons/creatures/abilities/paw-print-pair-purple.webp", + "_id": "d25tcdgssnDvekKR", + "system": { + "characterTokenData": { + "tokenImg": null, + "tokenRingImg": "icons/svg/mystery-man.svg", + "tokenSize": {} + }, + "advantageOn": [], + "featureIds": [], + "effectIds": [] + }, + "changes": [ + { + "key": "system.rules.attack.trait", + "mode": 5, + "value": "instinct", + "priority": null + }, + { + "key": "system.rules.attack.range", + "mode": 5, + "value": "melee", + "priority": null + }, + { + "key": "system.rules.attack.damage.value", + "mode": 5, + "value": "1d8", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "origin": null, + "tint": "#ffffff", + "transfer": true, + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "lastModifiedBy": null + }, + "_key": "!items.effects!uxBugKULjn7O1KQc.d25tcdgssnDvekKR" + }, + { + "type": "beastform", + "name": "Beastform Transformation", + "img": "icons/creatures/abilities/paw-print-pair-purple.webp", + "_id": "idqGh9sm1zBLME1O", + "system": { + "characterTokenData": { + "tokenImg": null, + "tokenRingImg": "icons/svg/mystery-man.svg", + "tokenSize": {} + }, + "advantageOn": [], + "featureIds": [], + "effectIds": [] + }, + "changes": [], + "disabled": false, + "duration": { + "startTime": null, + "combat": null + }, + "description": "", + "origin": null, + "tint": "#ffffff", + "transfer": true, + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976986453, + "modifiedTime": 1752976986453, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_key": "!items.effects!uxBugKULjn7O1KQc.idqGh9sm1zBLME1O" + } + ], + "folder": null, + "ownership": { + "default": 0, + "k0gmQFlvrPvlTtbh": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976986449, + "modifiedTime": 1752976987362, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_id": "uxBugKULjn7O1KQc", + "sort": 300000, + "_key": "!items!uxBugKULjn7O1KQc" +} diff --git a/src/packs/beastforms/beastform_Legendary_Beast_mERwC7aMDoIKfZTf.json b/src/packs/beastforms/beastform_Legendary_Beast_mERwC7aMDoIKfZTf.json new file mode 100644 index 00000000..4588bc0a --- /dev/null +++ b/src/packs/beastforms/beastform_Legendary_Beast_mERwC7aMDoIKfZTf.json @@ -0,0 +1,154 @@ +{ + "name": "Legendary Beast", + "type": "beastform", + "img": "icons/creatures/magical/spirit-undead-horned-blue.webp", + "system": { + "beastformType": "evolved", + "tier": 3, + "tokenImg": "icons/creatures/magical/spirit-undead-horned-blue.webp", + "tokenRingImg": "icons/svg/mystery-man.svg", + "tokenSize": { + "height": null, + "width": null + }, + "mainTrait": "agility", + "advantageOn": {}, + "features": [], + "evolved": { + "mainTraitBonus": 1, + "maximumTier": 1 + }, + "hybrid": { + "beastformOptions": 2, + "advantages": 2, + "features": 2 + }, + "examples": "" + }, + "effects": [ + { + "type": "beastform", + "name": "Beastform Transformation", + "img": "icons/creatures/abilities/paw-print-pair-purple.webp", + "_id": "cKAoI5JqYOtGBscd", + "system": { + "characterTokenData": { + "tokenImg": null, + "tokenRingImg": "icons/svg/mystery-man.svg", + "tokenSize": {} + }, + "advantageOn": [], + "featureIds": [], + "effectIds": [] + }, + "changes": [ + { + "key": "system.bonuses.damage.physical.bonus", + "mode": 2, + "value": "6", + "priority": null + }, + { + "key": "system.bonuses.damage.magical.bonus", + "mode": 2, + "value": "6", + "priority": null + }, + { + "key": "system.evasion", + "mode": 2, + "value": "2", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "

Pick a Tier 1 Beastform option and become a larger, more powerful version of that creature. While you’re in this form, you retain all traits and features from the original form and gain the following bonuses:

  • - A +6 bonus to damage rolls

  • - A +1 bonus to the trait used by this form

  • - A +2 bonus to evasion

", + "origin": null, + "tint": "#ffffff", + "transfer": true, + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "lastModifiedBy": null + }, + "_key": "!items.effects!mERwC7aMDoIKfZTf.cKAoI5JqYOtGBscd" + }, + { + "type": "beastform", + "name": "Beastform Transformation", + "img": "icons/creatures/abilities/paw-print-pair-purple.webp", + "_id": "LltLvTqjhk9RseV8", + "system": { + "characterTokenData": { + "tokenImg": null, + "tokenRingImg": "icons/svg/mystery-man.svg", + "tokenSize": {} + }, + "advantageOn": [], + "featureIds": [], + "effectIds": [] + }, + "changes": [], + "disabled": false, + "duration": { + "startTime": null, + "combat": null + }, + "description": "", + "origin": null, + "tint": "#ffffff", + "transfer": true, + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976989252, + "modifiedTime": 1752976989252, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_key": "!items.effects!mERwC7aMDoIKfZTf.LltLvTqjhk9RseV8" + } + ], + "folder": null, + "ownership": { + "default": 0, + "k0gmQFlvrPvlTtbh": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976989245, + "modifiedTime": 1752976989245, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_id": "mERwC7aMDoIKfZTf", + "sort": 0, + "_key": "!items!mERwC7aMDoIKfZTf" +} diff --git a/src/packs/beastforms/beastform_Mighty_Strider_LF68kGAcOTZQ81GB.json b/src/packs/beastforms/beastform_Mighty_Strider_LF68kGAcOTZQ81GB.json new file mode 100644 index 00000000..04049a81 --- /dev/null +++ b/src/packs/beastforms/beastform_Mighty_Strider_LF68kGAcOTZQ81GB.json @@ -0,0 +1,166 @@ +{ + "name": "Mighty Strider", + "type": "beastform", + "img": "icons/creatures/mammals/bull-horned-blue.webp", + "system": { + "beastformType": "normal", + "tier": 2, + "tokenImg": "icons/creatures/mammals/bull-horned-blue.webp", + "tokenRingImg": "icons/svg/mystery-man.svg", + "tokenSize": { + "height": null, + "width": null + }, + "mainTrait": "agility", + "advantageOn": { + "Xxr01TwSerOS8qsd": { + "value": "leap" + }, + "cASut9AUij2Uf4zm": { + "value": "navigate" + }, + "XJie4FhCSwUCg9uN": { + "value": "sprint" + } + }, + "features": [ + "Compendium.daggerheart.beastforms.Item.YSolAjtv6Sfnai98", + "Compendium.daggerheart.beastforms.Item.P6tWFIZzXWyekw6r" + ], + "evolved": { + "mainTraitBonus": 0 + }, + "hybrid": { + "beastformOptions": 2, + "advantages": 2, + "features": 2 + }, + "examples": "Camel, Horse, Zebra, etc." + }, + "effects": [ + { + "type": "beastform", + "name": "Beastform Transformation", + "img": "icons/creatures/abilities/paw-print-pair-purple.webp", + "_id": "1KdhXARm6rg2fg22", + "system": { + "characterTokenData": { + "tokenImg": null, + "tokenRingImg": "icons/svg/mystery-man.svg", + "tokenSize": {} + }, + "advantageOn": [], + "featureIds": [], + "effectIds": [] + }, + "changes": [ + { + "key": "system.rules.attack.damage.value", + "mode": 5, + "value": "d8 + 1", + "priority": null + }, + { + "key": "system.rules.attack.trait", + "mode": 5, + "value": "agility", + "priority": null + }, + { + "key": "system.rules.attack.range", + "mode": 5, + "value": "melee", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "origin": null, + "tint": "#ffffff", + "transfer": true, + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "lastModifiedBy": null + }, + "_key": "!items.effects!LF68kGAcOTZQ81GB.1KdhXARm6rg2fg22" + }, + { + "type": "beastform", + "name": "Beastform Transformation", + "img": "icons/creatures/abilities/paw-print-pair-purple.webp", + "_id": "ngEREmS8hzNyshak", + "system": { + "characterTokenData": { + "tokenImg": null, + "tokenRingImg": "icons/svg/mystery-man.svg", + "tokenSize": {} + }, + "advantageOn": [], + "featureIds": [], + "effectIds": [] + }, + "changes": [], + "disabled": false, + "duration": { + "startTime": null, + "combat": null + }, + "description": "", + "origin": null, + "tint": "#ffffff", + "transfer": true, + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976987358, + "modifiedTime": 1752976987358, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_key": "!items.effects!LF68kGAcOTZQ81GB.ngEREmS8hzNyshak" + } + ], + "folder": null, + "ownership": { + "default": 0, + "k0gmQFlvrPvlTtbh": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976987354, + "modifiedTime": 1752976987362, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_id": "LF68kGAcOTZQ81GB", + "sort": 200000, + "_key": "!items!LF68kGAcOTZQ81GB" +} diff --git a/src/packs/beastforms/beastform_Mythic_Hybrid_VI1DyowECDCDdsC1.json b/src/packs/beastforms/beastform_Mythic_Hybrid_VI1DyowECDCDdsC1.json new file mode 100644 index 00000000..0117a189 --- /dev/null +++ b/src/packs/beastforms/beastform_Mythic_Hybrid_VI1DyowECDCDdsC1.json @@ -0,0 +1,148 @@ +{ + "name": "Mythic Hybrid", + "type": "beastform", + "img": "icons/creatures/magical/humanoid-silhouette-glowing-pink.webp", + "system": { + "beastformType": "hybrid", + "tier": 4, + "tokenImg": "icons/creatures/magical/humanoid-silhouette-glowing-pink.webp", + "tokenRingImg": "icons/svg/mystery-man.svg", + "tokenSize": { + "height": null, + "width": null + }, + "mainTrait": "strength", + "advantageOn": {}, + "features": [], + "evolved": { + "mainTraitBonus": 0 + }, + "hybrid": { + "beastformOptions": 3, + "advantages": 5, + "features": 3, + "maximumTier": 3 + }, + "examples": "" + }, + "effects": [ + { + "type": "beastform", + "name": "Beastform Transformation", + "img": "icons/creatures/abilities/paw-print-pair-purple.webp", + "_id": "dvqS0a0ur8xM2swY", + "system": { + "characterTokenData": { + "tokenImg": null, + "tokenRingImg": "icons/svg/mystery-man.svg", + "tokenSize": {} + }, + "advantageOn": [], + "featureIds": [], + "effectIds": [] + }, + "changes": [ + { + "key": "system.traits.strength.value", + "mode": 2, + "value": "3", + "priority": null + }, + { + "key": "system.evasion", + "mode": 2, + "value": "2", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "

To transform into this creature, mark 2 additional Stress. Choose any three Beastform options from Tiers 1–3. Choose a total of five advantages and three features from those options.

", + "origin": null, + "tint": "#ffffff", + "transfer": true, + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "lastModifiedBy": null + }, + "_key": "!items.effects!VI1DyowECDCDdsC1.dvqS0a0ur8xM2swY" + }, + { + "type": "beastform", + "name": "Beastform Transformation", + "img": "icons/creatures/abilities/paw-print-pair-purple.webp", + "_id": "xSMy4BO5PuqASEKW", + "system": { + "characterTokenData": { + "tokenImg": null, + "tokenRingImg": "icons/svg/mystery-man.svg", + "tokenSize": {} + }, + "advantageOn": [], + "featureIds": [], + "effectIds": [] + }, + "changes": [], + "disabled": false, + "duration": { + "startTime": null, + "combat": null + }, + "description": "", + "origin": null, + "tint": "#ffffff", + "transfer": true, + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976990470, + "modifiedTime": 1752976990470, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_key": "!items.effects!VI1DyowECDCDdsC1.xSMy4BO5PuqASEKW" + } + ], + "folder": null, + "ownership": { + "default": 0, + "k0gmQFlvrPvlTtbh": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976990466, + "modifiedTime": 1752976990466, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_id": "VI1DyowECDCDdsC1", + "sort": 0, + "_key": "!items!VI1DyowECDCDdsC1" +} diff --git a/src/packs/beastforms/feature_Agile_sef9mwD2eRLZ64oV.json b/src/packs/beastforms/feature_Agile_sef9mwD2eRLZ64oV.json new file mode 100644 index 00000000..70fd6e11 --- /dev/null +++ b/src/packs/beastforms/feature_Agile_sef9mwD2eRLZ64oV.json @@ -0,0 +1,34 @@ +{ + "type": "feature", + "name": "Agile", + "img": "icons/skills/movement/arrow-upward-blue.webp", + "system": { + "description": "

Your movement is silent, and you can spend a Hope to move up to Far range without rolling.

", + "resource": null, + "originItemType": null, + "subType": null, + "originId": null, + "actions": [] + }, + "effects": [], + "folder": "uU8bIoZvXge0rLaU", + "ownership": { + "default": 0, + "k0gmQFlvrPvlTtbh": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976877948, + "modifiedTime": 1752976906072, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_id": "sef9mwD2eRLZ64oV", + "sort": 100000, + "_key": "!items!sef9mwD2eRLZ64oV" +} diff --git a/src/packs/beastforms/feature_Carrier_YSolAjtv6Sfnai98.json b/src/packs/beastforms/feature_Carrier_YSolAjtv6Sfnai98.json new file mode 100644 index 00000000..0ecd47f5 --- /dev/null +++ b/src/packs/beastforms/feature_Carrier_YSolAjtv6Sfnai98.json @@ -0,0 +1,34 @@ +{ + "type": "feature", + "name": "Carrier", + "img": "icons/creatures/abilities/bull-head-horns-glowing.webp", + "system": { + "description": "

You can carry up to two willing allies with you when you move.

", + "resource": null, + "originItemType": null, + "subType": null, + "originId": null, + "actions": [] + }, + "effects": [], + "folder": "uU8bIoZvXge0rLaU", + "ownership": { + "default": 0, + "k0gmQFlvrPvlTtbh": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976866309, + "modifiedTime": 1752976907469, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_id": "YSolAjtv6Sfnai98", + "sort": 200000, + "_key": "!items!YSolAjtv6Sfnai98" +} diff --git a/src/packs/beastforms/feature_Companion_0tlnxIxlIw2hl1UE.json b/src/packs/beastforms/feature_Companion_0tlnxIxlIw2hl1UE.json new file mode 100644 index 00000000..d7f35b73 --- /dev/null +++ b/src/packs/beastforms/feature_Companion_0tlnxIxlIw2hl1UE.json @@ -0,0 +1,34 @@ +{ + "type": "feature", + "name": "Companion", + "img": "icons/magic/life/heart-hand-gold-green-light.webp", + "system": { + "description": "

When you Help an Ally, you can roll a d8 as your advantage die.

", + "resource": null, + "originItemType": null, + "subType": null, + "originId": null, + "actions": [] + }, + "effects": [], + "folder": "uU8bIoZvXge0rLaU", + "ownership": { + "default": 0, + "k0gmQFlvrPvlTtbh": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976848672, + "modifiedTime": 1752976908157, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_id": "0tlnxIxlIw2hl1UE", + "sort": 0, + "_key": "!items!0tlnxIxlIw2hl1UE" +} diff --git a/src/packs/beastforms/feature_Evolved_MG21w4u5wXSGZ5WB.json b/src/packs/beastforms/feature_Evolved_MG21w4u5wXSGZ5WB.json new file mode 100644 index 00000000..520283bb --- /dev/null +++ b/src/packs/beastforms/feature_Evolved_MG21w4u5wXSGZ5WB.json @@ -0,0 +1,34 @@ +{ + "type": "feature", + "name": "Evolved", + "img": "icons/creatures/abilities/dragon-breath-purple.webp", + "system": { + "description": "

Pick a Tier 1 Beastform option and become a larger, more powerful version of that creature. While you’re in this form, you retain all traits and features from the original form and gain the following bonuses:

  • A +6 bonus to damage rolls
  • A +1 bonus to the trait used by this form
  • A +2 bonus to Evasion
", + "resource": null, + "originItemType": null, + "subType": null, + "originId": null, + "actions": [] + }, + "effects": [], + "folder": "uU8bIoZvXge0rLaU", + "ownership": { + "default": 0, + "k0gmQFlvrPvlTtbh": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976852417, + "modifiedTime": 1752976908700, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_id": "MG21w4u5wXSGZ5WB", + "sort": 50000, + "_key": "!items!MG21w4u5wXSGZ5WB" +} diff --git a/src/packs/beastforms/feature_Fragile_9ryNrYWjNtOT6DXN.json b/src/packs/beastforms/feature_Fragile_9ryNrYWjNtOT6DXN.json new file mode 100644 index 00000000..beae6eb2 --- /dev/null +++ b/src/packs/beastforms/feature_Fragile_9ryNrYWjNtOT6DXN.json @@ -0,0 +1,34 @@ +{ + "type": "feature", + "name": "Fragile", + "img": "icons/magic/life/heart-broken-red.webp", + "system": { + "description": "

When you take Major or greater damage, you drop out of Beastform.

", + "resource": null, + "originItemType": null, + "subType": null, + "originId": null, + "actions": [] + }, + "effects": [], + "folder": "uU8bIoZvXge0rLaU", + "ownership": { + "default": 0, + "k0gmQFlvrPvlTtbh": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976855944, + "modifiedTime": 1752976909267, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_id": "9ryNrYWjNtOT6DXN", + "sort": 150000, + "_key": "!items!9ryNrYWjNtOT6DXN" +} diff --git a/src/packs/beastforms/feature_Trample_P6tWFIZzXWyekw6r.json b/src/packs/beastforms/feature_Trample_P6tWFIZzXWyekw6r.json new file mode 100644 index 00000000..9e1ca0c5 --- /dev/null +++ b/src/packs/beastforms/feature_Trample_P6tWFIZzXWyekw6r.json @@ -0,0 +1,34 @@ +{ + "type": "feature", + "name": "Trample", + "img": "icons/creatures/mammals/ox-bull-horned-glowing-orange.webp", + "system": { + "description": "

Mark a Stress to move up to Close range in a straight line and make an attack against all targets within Melee range of the line. Targets you succeed against take [[/r d8+1]] physical damage using your Proficiency and are temporarily Vulnerable.

", + "resource": null, + "originItemType": null, + "subType": null, + "originId": null, + "actions": [] + }, + "effects": [], + "folder": "uU8bIoZvXge0rLaU", + "ownership": { + "default": 0, + "k0gmQFlvrPvlTtbh": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976867812, + "modifiedTime": 1752976976609, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_id": "P6tWFIZzXWyekw6r", + "sort": -100000, + "_key": "!items!P6tWFIZzXWyekw6r" +} diff --git a/src/packs/beastforms/folders_Beastform_Features_uU8bIoZvXge0rLaU.json b/src/packs/beastforms/folders_Beastform_Features_uU8bIoZvXge0rLaU.json new file mode 100644 index 00000000..74cd56a6 --- /dev/null +++ b/src/packs/beastforms/folders_Beastform_Features_uU8bIoZvXge0rLaU.json @@ -0,0 +1,23 @@ +{ + "type": "Item", + "folder": null, + "name": "Beastform Features", + "color": null, + "sorting": "a", + "_id": "uU8bIoZvXge0rLaU", + "description": "", + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752976835537, + "modifiedTime": 1752976835537, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_key": "!folders!uU8bIoZvXge0rLaU" +} diff --git a/src/packs/class-features/feature_Arcane_Sense_D5HUGwdizhBVZ0RW.json b/src/packs/class-features/feature_Arcane_Sense_D5HUGwdizhBVZ0RW.json deleted file mode 100644 index cea142f2..00000000 --- a/src/packs/class-features/feature_Arcane_Sense_D5HUGwdizhBVZ0RW.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Arcane Sense", - "type": "feature", - "_id": "D5HUGwdizhBVZ0RW", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

You can sense the presence of magical people and objects within Close range.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "ncQG0s0ttAPObaeV", - "sort": 100000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748033779155, - "modifiedTime": 1748710066261, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!D5HUGwdizhBVZ0RW" -} diff --git a/src/packs/class-features/feature_Attack_of_Opportunity_VfUbJwGU4Cka0xLP.json b/src/packs/class-features/feature_Attack_of_Opportunity_VfUbJwGU4Cka0xLP.json deleted file mode 100644 index 2fe397cf..00000000 --- a/src/packs/class-features/feature_Attack_of_Opportunity_VfUbJwGU4Cka0xLP.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Attack of Opportunity", - "type": "feature", - "_id": "VfUbJwGU4Cka0xLP", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

When an adversary within Melee range attempts to leave that range, make a reaction roll using a trait of your choice against their Difficulty. Choose one effect on a success, or two if you critically succeed:

• They can’t move from where they are.

• You deal damage to them equal to your primary weapon’s damage.

• You move with them.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "3znRxBqsK0lOJhvJ", - "sort": 100000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748034185325, - "modifiedTime": 1748710073183, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!VfUbJwGU4Cka0xLP" -} diff --git a/src/packs/class-features/feature_Beastform_NkSKDXGNNiOUlFqm.json b/src/packs/class-features/feature_Beastform_NkSKDXGNNiOUlFqm.json deleted file mode 100644 index 2122e595..00000000 --- a/src/packs/class-features/feature_Beastform_NkSKDXGNNiOUlFqm.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Beastform", - "type": "feature", - "_id": "NkSKDXGNNiOUlFqm", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Mark a Stress to magically transform into a creature of your tier or lower from the Beastform list. You can drop out of this form at any time. While transformed, you can’t use weapons or cast spells from domain cards, but you can still use other features or abilities you have access to. Spells you cast before you transform stay active and last for their normal duration, and you can talk and communicate as normal. Additionally, you gain the Beastform’s features, add their Evasion bonus to your Evasion, and use the trait specified in their statistics for your attack. While you’re in a Beastform, your armor becomes part of your body and you mark Armor Slots as usual; when you drop out of a Beastform, those marked Armor Slots remain marked. If you mark your last Hit Point, you automatically drop out of this form.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "l94HTIXSvdZG3zIh", - "sort": 100000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748028817729, - "modifiedTime": 1748710083736, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!NkSKDXGNNiOUlFqm" -} diff --git a/src/packs/class-features/feature_Channel_Raw_Power_ovxuqhl01XZSwx2n.json b/src/packs/class-features/feature_Channel_Raw_Power_ovxuqhl01XZSwx2n.json deleted file mode 100644 index bd35d681..00000000 --- a/src/packs/class-features/feature_Channel_Raw_Power_ovxuqhl01XZSwx2n.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "Channel Raw Power", - "type": "feature", - "_id": "ovxuqhl01XZSwx2n", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": { - "type": "longRest" - }, - "multiclass": null, - "disabled": false, - "description": "

Once per long rest, you can place a domain card from your loadout into your vault and choose to either:

• Gain Hope equal to the level of the card.

• Enhance a spell that deals damage, gaining a bonus to your damage roll equal to twice the level of the card.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "ncQG0s0ttAPObaeV", - "sort": 200000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748033854379, - "modifiedTime": 1748710088872, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!ovxuqhl01XZSwx2n" -} diff --git a/src/packs/class-features/feature_Cloaked_TpaoHSJ3npjWiBOf.json b/src/packs/class-features/feature_Cloaked_TpaoHSJ3npjWiBOf.json deleted file mode 100644 index a4e53ffa..00000000 --- a/src/packs/class-features/feature_Cloaked_TpaoHSJ3npjWiBOf.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Cloaked", - "type": "feature", - "_id": "TpaoHSJ3npjWiBOf", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Any time you would be Hidden, you are instead Cloaked. In addition to the benefits of the Hidden condition, while Cloaked you remain unseen if you are stationary when an adversary moves to where they would normally see you. After you make an attack or end a move within line of sight of an adversary, you are no longer Cloaked.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "AzwvgmcvToIUGYti", - "sort": 100000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748032226905, - "modifiedTime": 1748710097141, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!TpaoHSJ3npjWiBOf" -} diff --git a/src/packs/class-features/feature_Combat_Training_elb6ZVertgu6OdKA.json b/src/packs/class-features/feature_Combat_Training_elb6ZVertgu6OdKA.json deleted file mode 100644 index 70f3c1f8..00000000 --- a/src/packs/class-features/feature_Combat_Training_elb6ZVertgu6OdKA.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Combat Training", - "type": "feature", - "_id": "elb6ZVertgu6OdKA", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

You ignore burden when equipping weapons. When you deal physical damage, you gain a bonus to your damage roll equal to your level.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "3znRxBqsK0lOJhvJ", - "sort": 200000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748034225886, - "modifiedTime": 1748710182918, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!elb6ZVertgu6OdKA" -} diff --git a/src/packs/class-features/feature_Evolution_bZxfyPTZ6rsakyA2.json b/src/packs/class-features/feature_Evolution_bZxfyPTZ6rsakyA2.json deleted file mode 100644 index 484da82c..00000000 --- a/src/packs/class-features/feature_Evolution_bZxfyPTZ6rsakyA2.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Evolution", - "type": "feature", - "_id": "bZxfyPTZ6rsakyA2", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Spend 3 Hope to transform into a Beastform without marking a Stress. When you do, choose one trait to raise by +1 until you drop out of that Beastform.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "l94HTIXSvdZG3zIh", - "sort": 200000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748028774087, - "modifiedTime": 1748710255976, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!bZxfyPTZ6rsakyA2" -} diff --git a/src/packs/class-features/feature_Frontline_Tank_ftUZznLFJ5xbcxcu.json b/src/packs/class-features/feature_Frontline_Tank_ftUZznLFJ5xbcxcu.json deleted file mode 100644 index a707e0f1..00000000 --- a/src/packs/class-features/feature_Frontline_Tank_ftUZznLFJ5xbcxcu.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Frontline Tank", - "type": "feature", - "_id": "ftUZznLFJ5xbcxcu", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Spend 3 Hope to clear 2 Armor Slots

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "imOcur5Zv8WcMHXz", - "sort": 100000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748030942761, - "modifiedTime": 1748710261406, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!ftUZznLFJ5xbcxcu" -} diff --git a/src/packs/class-features/feature_Hold_Them_Off_FSx2ojskU0pRE72g.json b/src/packs/class-features/feature_Hold_Them_Off_FSx2ojskU0pRE72g.json deleted file mode 100644 index 2cabfdd5..00000000 --- a/src/packs/class-features/feature_Hold_Them_Off_FSx2ojskU0pRE72g.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Hold Them Off", - "type": "feature", - "_id": "FSx2ojskU0pRE72g", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Spend 3 Hope when you succeed on an attack with a weapon to use that same roll against two additional adversaries within range of the attack

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "84neMcqoIRAoIvXP", - "sort": 100000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748030888304, - "modifiedTime": 1748710266972, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!FSx2ojskU0pRE72g" -} diff --git a/src/packs/class-features/feature_Life_Support_UZ9UjZArSJh6UHXG.json b/src/packs/class-features/feature_Life_Support_UZ9UjZArSJh6UHXG.json deleted file mode 100644 index 00f21865..00000000 --- a/src/packs/class-features/feature_Life_Support_UZ9UjZArSJh6UHXG.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Life Support", - "type": "feature", - "_id": "UZ9UjZArSJh6UHXG", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Spend 3 Hope to clear a Hit Point on an ally within Close range.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "aI54jXjBNrAOm7R8", - "sort": 100000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748033044907, - "modifiedTime": 1748710332116, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!UZ9UjZArSJh6UHXG" -} diff --git a/src/packs/class-features/feature_Make_a_Scene_Ddk0PAgwM4VLRbyY.json b/src/packs/class-features/feature_Make_a_Scene_Ddk0PAgwM4VLRbyY.json deleted file mode 100644 index 1f64caa9..00000000 --- a/src/packs/class-features/feature_Make_a_Scene_Ddk0PAgwM4VLRbyY.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Make a Scene", - "type": "feature", - "_id": "Ddk0PAgwM4VLRbyY", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Spend 3 Hope to temporarily Distract a target within Close range, giving them a -2 penalty to their Difficulty.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "3QoIMKARHfRnBvQJ", - "sort": 100000, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747991384366, - "modifiedTime": 1748710338024, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!Ddk0PAgwM4VLRbyY" -} diff --git a/src/packs/class-features/feature_Minor_Illusion_qFq7kynAZhbWTbT5.json b/src/packs/class-features/feature_Minor_Illusion_qFq7kynAZhbWTbT5.json deleted file mode 100644 index 2ce91d1f..00000000 --- a/src/packs/class-features/feature_Minor_Illusion_qFq7kynAZhbWTbT5.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Minor Illusion", - "type": "feature", - "_id": "qFq7kynAZhbWTbT5", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Make a Spellcast Roll (10). On a success, you create a minor visual illusion no larger than yourself within Close range. This illusion is convincing to anyone at Close range or farther.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "ncQG0s0ttAPObaeV", - "sort": 150000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748033817443, - "modifiedTime": 1748710347004, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!qFq7kynAZhbWTbT5" -} diff --git a/src/packs/class-features/feature_No_Mercy_t3tLoq4h9wgQD7E9.json b/src/packs/class-features/feature_No_Mercy_t3tLoq4h9wgQD7E9.json deleted file mode 100644 index afafb921..00000000 --- a/src/packs/class-features/feature_No_Mercy_t3tLoq4h9wgQD7E9.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "No Mercy", - "type": "feature", - "_id": "t3tLoq4h9wgQD7E9", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Spend 3 Hope to gain a +1 bonus to your attack rolls until your next rest.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "3znRxBqsK0lOJhvJ", - "sort": 150000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748034146678, - "modifiedTime": 1748710386929, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!t3tLoq4h9wgQD7E9" -} diff --git a/src/packs/class-features/feature_Not_This_Time_5msGbQyFwdwdFdYs.json b/src/packs/class-features/feature_Not_This_Time_5msGbQyFwdwdFdYs.json deleted file mode 100644 index 0667a293..00000000 --- a/src/packs/class-features/feature_Not_This_Time_5msGbQyFwdwdFdYs.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Not This Time", - "type": "feature", - "_id": "5msGbQyFwdwdFdYs", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "reaction", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Spend 3 Hope to force an adversary within Far range to reroll an attack or damage roll

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "8I0S9f458qu36qSW", - "sort": 100000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748034883014, - "modifiedTime": 1748710410194, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!5msGbQyFwdwdFdYs" -} diff --git a/src/packs/class-features/feature_Prayer_Dice_jXfGnLnU8PswJYJd.json b/src/packs/class-features/feature_Prayer_Dice_jXfGnLnU8PswJYJd.json deleted file mode 100644 index af0b3923..00000000 --- a/src/packs/class-features/feature_Prayer_Dice_jXfGnLnU8PswJYJd.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "Prayer Dice", - "type": "feature", - "_id": "jXfGnLnU8PswJYJd", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 6, - "numbers": {}, - "value": "d4" - } - }, - "refreshData": { - "type": "session" - }, - "multiclass": null, - "disabled": false, - "description": "

At the beginning of each session, roll a number of d4s equal to your subclass’s Spellcast trait and place them on this sheet in the space provided. These are your Prayer Dice. You can spend any number of Prayer Dice to aid yourself or an ally within Far range. You can use a spent die’s value to reduce incoming damage, add to a roll’s result after the roll is made, or gain Hope equal to the result. At the end of each session, clear all unspent Prayer Dice.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "aI54jXjBNrAOm7R8", - "sort": 200000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748033372327, - "modifiedTime": 1748710416279, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!jXfGnLnU8PswJYJd" -} diff --git a/src/packs/class-features/feature_Prestidigitation_ofBmJIn6NWxA0wPz.json b/src/packs/class-features/feature_Prestidigitation_ofBmJIn6NWxA0wPz.json deleted file mode 100644 index 7fda6182..00000000 --- a/src/packs/class-features/feature_Prestidigitation_ofBmJIn6NWxA0wPz.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Prestidigitation", - "type": "feature", - "_id": "ofBmJIn6NWxA0wPz", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

You can perform harmless, subtle magical effects at will. For example, you can change an object’s color, create a smell, light a candle, cause a tiny object to float, illuminate a room, or repair a small object.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "8I0S9f458qu36qSW", - "sort": 200000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748034934147, - "modifiedTime": 1748710421634, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!ofBmJIn6NWxA0wPz" -} diff --git a/src/packs/class-features/feature_Rally_8uORDWrXtNFzA00U.json b/src/packs/class-features/feature_Rally_8uORDWrXtNFzA00U.json deleted file mode 100644 index 1734a435..00000000 --- a/src/packs/class-features/feature_Rally_8uORDWrXtNFzA00U.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "Rally", - "type": "feature", - "_id": "8uORDWrXtNFzA00U", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {}, - "value": "d6" - } - }, - "refreshData": { - "type": "session" - }, - "multiclass": null, - "disabled": false, - "description": "

Once per session, describe how you rally the party and give yourself and each of your allies a Rally Die. At level 1, your Rally Die is a d6. A PC can spend their Rally Die to roll it, adding the result to their action roll, reaction roll, damage roll, or to clear a number of Stress equal to the result. At the end of each session, clear all unspent Rally Dice.

At level 5, your Rally Die increases to a d8.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "3QoIMKARHfRnBvQJ", - "sort": 200000, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747991484460, - "modifiedTime": 1748710434139, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!8uORDWrXtNFzA00U" -} diff --git a/src/packs/class-features/feature_Ranger_s_Focus_b4O4r2HPbWU8s59q.json b/src/packs/class-features/feature_Ranger_s_Focus_b4O4r2HPbWU8s59q.json deleted file mode 100644 index b12146b6..00000000 --- a/src/packs/class-features/feature_Ranger_s_Focus_b4O4r2HPbWU8s59q.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Ranger's Focus", - "type": "feature", - "_id": "b4O4r2HPbWU8s59q", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Spend a Hope and make an attack against a target. On a success, deal your attack’s normal damage and temporarily make the attack’s target your Focus. Until this feature ends or you make a different creature yourFocus, you gain the following benefits against your Focus:

• You know precisely what direction they are in.

• When you deal damage to them, they must mark a Stress.

• When you fail an attack against them, you can end your Ranger’s Focus feature to reroll your Duality Dice.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "84neMcqoIRAoIvXP", - "sort": 200000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748030780267, - "modifiedTime": 1748710475164, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!b4O4r2HPbWU8s59q" -} diff --git a/src/packs/class-features/feature_Rogue_s_Dodge_fPGn9JNV24nt1G9d.json b/src/packs/class-features/feature_Rogue_s_Dodge_fPGn9JNV24nt1G9d.json deleted file mode 100644 index a2b3dac4..00000000 --- a/src/packs/class-features/feature_Rogue_s_Dodge_fPGn9JNV24nt1G9d.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Rogue’s Dodge", - "type": "feature", - "_id": "fPGn9JNV24nt1G9d", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Spend 3 Hope to gain a +2 bonus to your Evasion until the next time an attack succeeds against you. Otherwise, this bonus lasts until your next rest.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "AzwvgmcvToIUGYti", - "sort": 200000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748032185608, - "modifiedTime": 1748710477647, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!fPGn9JNV24nt1G9d" -} diff --git a/src/packs/class-features/feature_Sneak_Attack_PhHOmsoYUDC42by6.json b/src/packs/class-features/feature_Sneak_Attack_PhHOmsoYUDC42by6.json deleted file mode 100644 index 322f33f2..00000000 --- a/src/packs/class-features/feature_Sneak_Attack_PhHOmsoYUDC42by6.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Sneak Attack", - "type": "feature", - "_id": "PhHOmsoYUDC42by6", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

When you succeed on an attack while Cloaked or while an ally is within Melee range of your target, add a number of d6s equal to your tier to your damage roll.

Level 1 is Tier 1

Levels 2–4 are Tier 2

Levels 5–7 are Tier 3

Levels 8–10 are Tier 4

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "AzwvgmcvToIUGYti", - "sort": 150000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748032274441, - "modifiedTime": 1748710492033, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!PhHOmsoYUDC42by6" -} diff --git a/src/packs/class-features/feature_Strange_Patterns_ONtJ7r2g6tN5q6Ga.json b/src/packs/class-features/feature_Strange_Patterns_ONtJ7r2g6tN5q6Ga.json deleted file mode 100644 index d637ce8c..00000000 --- a/src/packs/class-features/feature_Strange_Patterns_ONtJ7r2g6tN5q6Ga.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Strange Patterns", - "type": "feature", - "_id": "ONtJ7r2g6tN5q6Ga", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Choose a number between 1 and 12. When you roll that number on a Duality Die, gain a Hope or clear a Stress. You can change this number when you take a long rest.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "8I0S9f458qu36qSW", - "sort": 150000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748034976746, - "modifiedTime": 1748710516187, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!ONtJ7r2g6tN5q6Ga" -} diff --git a/src/packs/class-features/feature_Unstoppable_rlpNYKW18FX4Hw7t.json b/src/packs/class-features/feature_Unstoppable_rlpNYKW18FX4Hw7t.json deleted file mode 100644 index 8c46fc53..00000000 --- a/src/packs/class-features/feature_Unstoppable_rlpNYKW18FX4Hw7t.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "Unstoppable", - "type": "feature", - "_id": "rlpNYKW18FX4Hw7t", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": { - "type": "longRest" - }, - "multiclass": null, - "disabled": false, - "description": "

Once per long rest, you can become Unstoppable.

You gain an Unstoppable Die. At level 1, your Unstoppable Die is a [[d4]]. Place it on this sheet in the space provided, starting with the 1 value facing up. After you make a damage roll that deals 1 or more Hit Points to a target, increase the Unstoppable Die value by one. When the die’s value would exceed its maximum value or when the scene ends, remove the die and drop out of Unstoppable. At level 5, your Unstoppable Die increases to a d6.

While Unstoppable, you gain the following benefits:

• You reduce the severity of physical damage by one threshold (Severe to Major, Major to Minor, Minor to None).

• You add the current value of the Unstoppable Die to your damage roll.

• You can’t be Restrained or Vulnerable.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "imOcur5Zv8WcMHXz", - "sort": 200000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748030398960, - "modifiedTime": 1748710525532, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!rlpNYKW18FX4Hw7t" -} diff --git a/src/packs/class-features/feature_Volatile_Magic_J3TdB5ZsmyJ68rxZ.json b/src/packs/class-features/feature_Volatile_Magic_J3TdB5ZsmyJ68rxZ.json deleted file mode 100644 index f5e890f8..00000000 --- a/src/packs/class-features/feature_Volatile_Magic_J3TdB5ZsmyJ68rxZ.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Volatile Magic", - "type": "feature", - "_id": "J3TdB5ZsmyJ68rxZ", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Spend 3 Hope to reroll any number of your damage dice on an attack that deals magic damage.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "ncQG0s0ttAPObaeV", - "sort": 125000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748033750328, - "modifiedTime": 1748710593717, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!J3TdB5ZsmyJ68rxZ" -} diff --git a/src/packs/class-features/feature_Wildtouch_Dy0lco20C0Nk6yQo.json b/src/packs/class-features/feature_Wildtouch_Dy0lco20C0Nk6yQo.json deleted file mode 100644 index c50808d0..00000000 --- a/src/packs/class-features/feature_Wildtouch_Dy0lco20C0Nk6yQo.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Wildtouch", - "type": "feature", - "_id": "Dy0lco20C0Nk6yQo", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

You can perform harmless, subtle effects that involve nature—such as causing a flower to rapidly grow, summoning a slight gust of wind, or starting a campfire—at will.

", - "effects": {}, - "actions": [], - "type": "class" - }, - "effects": [], - "folder": "l94HTIXSvdZG3zIh", - "sort": 150000, - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748028880107, - "modifiedTime": 1748710640932, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!Dy0lco20C0Nk6yQo" -} diff --git a/src/packs/class-features/folders_Seraph_aI54jXjBNrAOm7R8.json b/src/packs/class-features/folders_Seraph_aI54jXjBNrAOm7R8.json deleted file mode 100644 index 232e538b..00000000 --- a/src/packs/class-features/folders_Seraph_aI54jXjBNrAOm7R8.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "Item", - "folder": null, - "name": "Seraph", - "color": null, - "sorting": "a", - "_id": "aI54jXjBNrAOm7R8", - "description": "", - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748709709654, - "modifiedTime": 1748709709654, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!folders!aI54jXjBNrAOm7R8" -} diff --git a/src/packs/class-features/folders_Sorcerer_ncQG0s0ttAPObaeV.json b/src/packs/class-features/folders_Sorcerer_ncQG0s0ttAPObaeV.json deleted file mode 100644 index 60b68e8e..00000000 --- a/src/packs/class-features/folders_Sorcerer_ncQG0s0ttAPObaeV.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "Item", - "folder": null, - "name": "Sorcerer", - "color": null, - "sorting": "a", - "_id": "ncQG0s0ttAPObaeV", - "description": "", - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748709715969, - "modifiedTime": 1748709715969, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!folders!ncQG0s0ttAPObaeV" -} diff --git a/src/packs/class-features/folders_Warrior_3znRxBqsK0lOJhvJ.json b/src/packs/class-features/folders_Warrior_3znRxBqsK0lOJhvJ.json deleted file mode 100644 index 1e9e1974..00000000 --- a/src/packs/class-features/folders_Warrior_3znRxBqsK0lOJhvJ.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "Item", - "folder": null, - "name": "Warrior", - "color": null, - "sorting": "a", - "_id": "3znRxBqsK0lOJhvJ", - "description": "", - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748709756134, - "modifiedTime": 1748709756134, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!folders!3znRxBqsK0lOJhvJ" -} diff --git a/src/packs/class-features/folders_Wizard_8I0S9f458qu36qSW.json b/src/packs/class-features/folders_Wizard_8I0S9f458qu36qSW.json deleted file mode 100644 index d660567b..00000000 --- a/src/packs/class-features/folders_Wizard_8I0S9f458qu36qSW.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "Item", - "folder": null, - "name": "Wizard", - "color": null, - "sorting": "a", - "_id": "8I0S9f458qu36qSW", - "description": "", - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748709931420, - "modifiedTime": 1748709931420, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!folders!8I0S9f458qu36qSW" -} diff --git a/src/packs/classes/class_Bard_yKicceU4LesCgKwF.json b/src/packs/classes/class_Bard_yKicceU4LesCgKwF.json deleted file mode 100644 index da5d8bfe..00000000 --- a/src/packs/classes/class_Bard_yKicceU4LesCgKwF.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "name": "Bard", - "type": "class", - "_id": "yKicceU4LesCgKwF", - "img": "systems/daggerheart/assets/icons/classes/bard.png", - "system": { - "domains": [ - "grace", - "codex" - ], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 - }, - "evasion": 10, - "features": [ - { - "name": "Make a Scene", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.Ddk0PAgwM4VLRbyY" - }, - { - "img": "icons/svg/item-bag.svg", - "name": "Rally", - "uuid": "Compendium.daggerheart.class-features.Item.8uORDWrXtNFzA00U" - } - ], - "subclasses": [ - { - "name": "Troubadour", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.subclasses.Item.T1iBO8i0xRF5c8Q2" - }, - { - "img": "icons/svg/item-bag.svg", - "name": "Wordsmith", - "uuid": "Compendium.daggerheart.subclasses.Item.FXT65YDVWFy85EI0" - } - ], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": { - "title": "", - "description": "" - } - }, - "characterGuide": { - "suggestedTraits": { - "agility": 0, - "strength": -1, - "finesse": 1, - "instinct": 0, - "presence": 2, - "knowledge": 1 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": { - "clothes": "", - "eyes": "", - "body": "", - "color": "", - "attitude": "" - }, - "backgroundQuestions": [ - "Who from your community taught you to have such confidence in yourself?", - "You were in love once. Who did you adore, and how did they hurt you?", - "You’ve always looked up to another bard. Who are they, and why do you idolize them?" - ], - "connections": [ - "What made you realize we were going to be such good friends?", - "What do I do that annoys you?", - "Why do you grab my hand at night?" - ] - }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946810798, - "modifiedTime": 1748029620943, - "lastModifiedBy": "ei8OkswTzyDp4IGC" - }, - "_key": "!items!yKicceU4LesCgKwF" -} diff --git a/src/packs/classes/class_Druid_HEh27jDQCJmnPsXH.json b/src/packs/classes/class_Druid_HEh27jDQCJmnPsXH.json deleted file mode 100644 index 5470f091..00000000 --- a/src/packs/classes/class_Druid_HEh27jDQCJmnPsXH.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "name": "Druid", - "type": "class", - "_id": "HEh27jDQCJmnPsXH", - "img": "systems/daggerheart/assets/icons/classes/druid.png", - "system": { - "domains": [ - "sage", - "arcana" - ], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 - }, - "evasion": 10, - "features": [ - { - "name": "Evolution", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.bZxfyPTZ6rsakyA2" - }, - { - "name": "Beastform", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.NkSKDXGNNiOUlFqm" - }, - { - "img": "icons/svg/item-bag.svg", - "name": "Wildtouch", - "uuid": "Compendium.daggerheart.class-features.Item.Dy0lco20C0Nk6yQo" - } - ], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": { - "title": "", - "description": "" - } - }, - "characterGuide": { - "suggestedTraits": { - "agility": 1, - "strength": 0, - "finesse": 1, - "instinct": 2, - "presence": -1, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": { - "clothes": "", - "eyes": "", - "body": "", - "color": "", - "attitude": "" - }, - "backgroundQuestions": [ - "Why was the community you grew up in so reliant on nature and its creatures?", - "Who was the first wild animal you bonded with? Why did your bond end?", - "Who has been trying to hunt you down? What do they want from you?" - ], - "connections": [ - "What did you confide in me that makes me leap into danger for you every time?", - "What animal do I say you remind me of?", - "What affectionate nickname have you given me?" - ] - }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946822837, - "modifiedTime": 1748029712119, - "lastModifiedBy": "ei8OkswTzyDp4IGC" - }, - "_key": "!items!HEh27jDQCJmnPsXH" -} diff --git a/src/packs/classes/class_Guardian_hyfigmrAoLxFPOW2.json b/src/packs/classes/class_Guardian_hyfigmrAoLxFPOW2.json deleted file mode 100644 index 6e1aacc6..00000000 --- a/src/packs/classes/class_Guardian_hyfigmrAoLxFPOW2.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "name": "Guardian", - "type": "class", - "_id": "hyfigmrAoLxFPOW2", - "img": "systems/daggerheart/assets/icons/classes/guardian.png", - "system": { - "domains": [ - "valor", - "blade" - ], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 - }, - "evasion": 9, - "features": [ - { - "name": "Frontline Tank", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.ftUZznLFJ5xbcxcu" - }, - { - "img": "icons/svg/item-bag.svg", - "name": "Unstoppable", - "uuid": "Compendium.daggerheart.class-features.Item.rlpNYKW18FX4Hw7t" - } - ], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": { - "title": "", - "description": "" - } - }, - "characterGuide": { - "suggestedTraits": { - "agility": 1, - "strength": 2, - "finesse": -1, - "instinct": 0, - "presence": 1, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": { - "clothes": "", - "eyes": "", - "body": "", - "color": "", - "attitude": "" - }, - "backgroundQuestions": [ - "Who from your community did you fail to protect, and why do you still think of them?", - "You’ve been tasked with protecting something important and delivering it somewhere dangerous. What is it, and where does it need to go?", - "You consider an aspect of yourself to be a weakness. What is it, and how has it affected you?" - ], - "connections": [ - "How did I save your life the first time we met", - "What small gift did you give me that you notice I always carry with me?", - "What lie have you told me about yourself that I absolutely believe?" - ] - }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946853583, - "modifiedTime": 1748030966166, - "lastModifiedBy": "ei8OkswTzyDp4IGC" - }, - "_key": "!items!hyfigmrAoLxFPOW2" -} diff --git a/src/packs/classes/class_Ranger_XoUsU9sCxEq8t3We.json b/src/packs/classes/class_Ranger_XoUsU9sCxEq8t3We.json deleted file mode 100644 index a620d4f8..00000000 --- a/src/packs/classes/class_Ranger_XoUsU9sCxEq8t3We.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "name": "Ranger", - "type": "class", - "_id": "XoUsU9sCxEq8t3We", - "img": "systems/daggerheart/assets/icons/classes/ranger.png", - "system": { - "domains": [ - "bone", - "sage" - ], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 - }, - "evasion": 12, - "features": [ - { - "name": "Hold Them Off", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.FSx2ojskU0pRE72g" - }, - { - "img": "icons/svg/item-bag.svg", - "name": "Ranger's Focus", - "uuid": "Compendium.daggerheart.class-features.Item.b4O4r2HPbWU8s59q" - } - ], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": { - "title": "", - "description": "" - } - }, - "characterGuide": { - "suggestedTraits": { - "agility": 2, - "strength": 0, - "finesse": 1, - "instinct": 1, - "presence": -1, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": { - "clothes": "", - "eyes": "", - "body": "", - "color": "", - "attitude": "" - }, - "backgroundQuestions": [ - "A terrible creature hurt your community, and you’ve vowed to hunt them down. What are they, and what unique trail or sign do they leave behind?", - "Your first kill almost killed you, too. What was it, and what part of you was never the same after that event?", - "You’ve traveled many dangerous lands, but what is the one place you refuse to go?" - ], - "connections": [ - "What friendly competition do we have?", - "Why do you act differently when we’re alone than when others are around?", - "What threat have you asked me to watch for, and why are you worried about it?" - ] - }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946878680, - "modifiedTime": 1748030921142, - "lastModifiedBy": "ei8OkswTzyDp4IGC" - }, - "_key": "!items!XoUsU9sCxEq8t3We" -} diff --git a/src/packs/classes/class_Rogue_V1a5AKCLe8qtoPlA.json b/src/packs/classes/class_Rogue_V1a5AKCLe8qtoPlA.json deleted file mode 100644 index 6a3021ca..00000000 --- a/src/packs/classes/class_Rogue_V1a5AKCLe8qtoPlA.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "name": "Rogue", - "type": "class", - "_id": "V1a5AKCLe8qtoPlA", - "img": "systems/daggerheart/assets/icons/classes/rogue.png", - "system": { - "domains": [ - "midnight", - "grace" - ], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 - }, - "evasion": 12, - "features": [ - { - "name": "Rogue’s Dodge", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.fPGn9JNV24nt1G9d" - }, - { - "name": "Cloaked", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.TpaoHSJ3npjWiBOf" - }, - { - "img": "icons/svg/item-bag.svg", - "name": "Sneak Attack", - "uuid": "Compendium.daggerheart.class-features.Item.PhHOmsoYUDC42by6" - } - ], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": { - "title": "", - "description": "" - } - }, - "characterGuide": { - "suggestedTraits": { - "agility": 1, - "strength": -1, - "finesse": 2, - "instinct": 0, - "presence": 1, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": { - "clothes": "", - "eyes": "", - "body": "", - "color": "", - "attitude": "" - }, - "backgroundQuestions": [ - "What did you get caught doing that got you exiled from your home community?", - "You used to have a different life, but you’ve tried to leave it behind. Who from your past is still chasing you?", - "Who from your past were you most sad to say goodbye to?" - ], - "connections": [ - "What did I recently convince you to do that got us both in trouble?", - "What have I discovered about your past that I hold secret from the others?", - "Who do you know from my past, and how have they influenced your feelings about me?" - ] - }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946902620, - "modifiedTime": 1748032307699, - "lastModifiedBy": "ei8OkswTzyDp4IGC" - }, - "_key": "!items!V1a5AKCLe8qtoPlA" -} diff --git a/src/packs/classes/class_Seraph_qW7yLIe87vd5bbto.json b/src/packs/classes/class_Seraph_qW7yLIe87vd5bbto.json deleted file mode 100644 index c16b086c..00000000 --- a/src/packs/classes/class_Seraph_qW7yLIe87vd5bbto.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "name": "Seraph", - "type": "class", - "_id": "qW7yLIe87vd5bbto", - "img": "systems/daggerheart/assets/icons/classes/seraph.png", - "system": { - "domains": [ - "splendor", - "valor" - ], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 - }, - "evasion": 9, - "features": [ - { - "name": "Life Support", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.UZ9UjZArSJh6UHXG" - }, - { - "img": "icons/svg/item-bag.svg", - "name": "Prayer Dice", - "uuid": "Compendium.daggerheart.class-features.Item.jXfGnLnU8PswJYJd" - } - ], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": { - "title": "", - "description": "" - } - }, - "characterGuide": { - "suggestedTraits": { - "agility": 0, - "strength": 2, - "finesse": 0, - "instinct": 1, - "presence": 1, - "knowledge": -1 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": { - "clothes": "", - "eyes": "", - "body": "", - "color": "", - "attitude": "" - }, - "backgroundQuestions": [ - "Which god did you devote yourself to? What incredible feat did they perform for you in a moment of desperation?", - "How did your appearance change after taking your oath?", - "In what strange or unique way do you communicate with your god?" - ], - "connections": [ - "What promise did you make me agree to, should you die on the battlefield?", - "Why do you ask me so many questions about my god?", - "You’ve told me to protect one member of our party above all others, even yourself. Who are they and why?" - ] - }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946916585, - "modifiedTime": 1748033639820, - "lastModifiedBy": "ei8OkswTzyDp4IGC" - }, - "_key": "!items!qW7yLIe87vd5bbto" -} diff --git a/src/packs/classes/class_Sorcerer_aacMxI9mOTmLO4cj.json b/src/packs/classes/class_Sorcerer_aacMxI9mOTmLO4cj.json deleted file mode 100644 index 4ff8cc29..00000000 --- a/src/packs/classes/class_Sorcerer_aacMxI9mOTmLO4cj.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "name": "Sorcerer", - "type": "class", - "_id": "aacMxI9mOTmLO4cj", - "img": "systems/daggerheart/assets/icons/classes/sorcerer.png", - "system": { - "domains": [ - "arcana", - "midnight" - ], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 - }, - "evasion": 10, - "features": [ - { - "name": "Volatile Magic", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.J3TdB5ZsmyJ68rxZ" - }, - { - "name": "Arcane Sense", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.D5HUGwdizhBVZ0RW" - }, - { - "name": "Minor Illusion", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.qFq7kynAZhbWTbT5" - }, - { - "img": "icons/svg/item-bag.svg", - "name": "Channel Raw Power", - "uuid": "Compendium.daggerheart.class-features.Item.ovxuqhl01XZSwx2n" - } - ], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": { - "title": "", - "description": "" - } - }, - "characterGuide": { - "suggestedTraits": { - "agility": 0, - "strength": -1, - "finesse": 1, - "instinct": 2, - "presence": 1, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": { - "clothes": "", - "eyes": "", - "body": "", - "color": "", - "attitude": "" - }, - "backgroundQuestions": [ - "What did you do that made the people in your community wary of you?", - "What mentor taught you to control your untamed magic, and why are they no longer able to guide you?", - "You have a deep fear you hide from everyone. What is it, and why does it scare you?" - ], - "connections": [ - "Why do you trust me so deeply?", - "What did I do that makes you cautious around me?", - "Why do we keep our shared past a secret?" - ] - }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946940010, - "modifiedTime": 1748033881134, - "lastModifiedBy": "ei8OkswTzyDp4IGC" - }, - "_key": "!items!aacMxI9mOTmLO4cj" -} diff --git a/src/packs/classes/class_Warrior_ishqAXCT8xLgEbBp.json b/src/packs/classes/class_Warrior_ishqAXCT8xLgEbBp.json deleted file mode 100644 index ef801938..00000000 --- a/src/packs/classes/class_Warrior_ishqAXCT8xLgEbBp.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "name": "Warrior", - "type": "class", - "_id": "ishqAXCT8xLgEbBp", - "img": "systems/daggerheart/assets/icons/classes/warrior.png", - "system": { - "domains": [ - "blade", - "bone" - ], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 - }, - "evasion": 11, - "features": [ - { - "name": "No Mercy", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.t3tLoq4h9wgQD7E9" - }, - { - "name": "Attack of Opportunity", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.VfUbJwGU4Cka0xLP" - }, - { - "img": "icons/svg/item-bag.svg", - "name": "Combat Training", - "uuid": "Compendium.daggerheart.class-features.Item.elb6ZVertgu6OdKA" - } - ], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": { - "title": "", - "description": "" - } - }, - "characterGuide": { - "suggestedTraits": { - "agility": 2, - "strength": 1, - "finesse": 0, - "instinct": 1, - "presence": -1, - "knowledge": 0 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": { - "clothes": "", - "eyes": "", - "body": "", - "color": "", - "attitude": "" - }, - "backgroundQuestions": [ - "Who taught you to fight, and why did they stay behind when you left home?", - "Somebody defeated you in battle years ago and left you to die. Who was it, and how did they betray you?", - "What legendary place have you always wanted to visit, and why is it so special?" - ], - "connections": [ - "We knew each other long before this party came together. How?", - "What mundane task do you usually help me with off the battlefield", - "What fear am I helping you overcome?" - ] - }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946965065, - "modifiedTime": 1748034254542, - "lastModifiedBy": "ei8OkswTzyDp4IGC" - }, - "_key": "!items!ishqAXCT8xLgEbBp" -} diff --git a/src/packs/classes/class_Wizard_uhj2mZPOC8nbIMTy.json b/src/packs/classes/class_Wizard_uhj2mZPOC8nbIMTy.json deleted file mode 100644 index c784eaae..00000000 --- a/src/packs/classes/class_Wizard_uhj2mZPOC8nbIMTy.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "name": "Wizard", - "type": "class", - "_id": "uhj2mZPOC8nbIMTy", - "img": "systems/daggerheart/assets/icons/classes/wizard.png", - "system": { - "domains": [ - "codex", - "splendor" - ], - "classItems": [], - "damageThresholds": { - "minor": 0, - "major": 0, - "severe": 0 - }, - "evasion": 11, - "features": [ - { - "name": "Not This Time", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.5msGbQyFwdwdFdYs" - }, - { - "name": "Prestidigitation", - "img": "icons/svg/item-bag.svg", - "uuid": "Compendium.daggerheart.class-features.Item.ofBmJIn6NWxA0wPz" - }, - { - "img": "icons/svg/item-bag.svg", - "name": "Strange Patterns", - "uuid": "Compendium.daggerheart.class-features.Item.ONtJ7r2g6tN5q6Ga" - } - ], - "subclasses": [], - "inventory": { - "take": [], - "choiceA": [], - "choiceB": [], - "extra": { - "title": "", - "description": "" - } - }, - "characterGuide": { - "suggestedTraits": { - "agility": -1, - "strength": 0, - "finesse": 0, - "instinct": 1, - "presence": 1, - "knowledge": 2 - }, - "suggestedPrimaryWeapon": null, - "suggestedSecondaryWeapon": null, - "suggestedArmor": null, - "characterDescription": { - "clothes": "", - "eyes": "", - "body": "", - "color": "", - "attitude": "" - }, - "backgroundQuestions": [ - "What responsibilities did your community once count on you for? How did you let them down?", - "You’ve spent your life searching for a book or object of great significance. What is it, and why is it so important to you", - "You have a powerful rival. Who are they, and why are you so determined to defeat them?" - ], - "connections": [ - "What favor have I asked of you that you’re not sure you can fulfill?", - "What weird hobby or strange fascination do we both share?", - "What secret about yourself have you entrusted only to me?" - ] - }, - "multiclass": null, - "description": "" - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747946791380, - "modifiedTime": 1748035008107, - "lastModifiedBy": "ei8OkswTzyDp4IGC" - }, - "_key": "!items!uhj2mZPOC8nbIMTy" -} diff --git a/src/packs/class-features/folders_Guardian_imOcur5Zv8WcMHXz.json b/src/packs/classes/folders_Class_Features_S4dTxJcuo1VW8o1E.json similarity index 55% rename from src/packs/class-features/folders_Guardian_imOcur5Zv8WcMHXz.json rename to src/packs/classes/folders_Class_Features_S4dTxJcuo1VW8o1E.json index 14542699..d6adfa2d 100644 --- a/src/packs/class-features/folders_Guardian_imOcur5Zv8WcMHXz.json +++ b/src/packs/classes/folders_Class_Features_S4dTxJcuo1VW8o1E.json @@ -1,10 +1,10 @@ { "type": "Item", "folder": null, - "name": "Guardian", + "name": "Class Features", "color": null, "sorting": "a", - "_id": "imOcur5Zv8WcMHXz", + "_id": "S4dTxJcuo1VW8o1E", "description": "", "sort": 0, "flags": {}, @@ -12,12 +12,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "createdTime": 1748709688824, - "modifiedTime": 1748709688824, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" + "createdTime": 1752680679705, + "modifiedTime": 1752680679705, + "lastModifiedBy": "binNpU8lWev6geDj" }, - "_key": "!folders!imOcur5Zv8WcMHXz" + "_key": "!folders!S4dTxJcuo1VW8o1E" } diff --git a/src/packs/communities/community_Highborne_8AcV556QwoIzkkea.json b/src/packs/communities/community_Highborne_8AcV556QwoIzkkea.json deleted file mode 100644 index cb8e9895..00000000 --- a/src/packs/communities/community_Highborne_8AcV556QwoIzkkea.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "Highborne", - "type": "community", - "_id": "8AcV556QwoIzkkea", - "img": "systems/daggerheart/assets/icons/communities/highborne.png", - "system": { - "description": "

Being part of a highborne community means you're accustomed to life of elegance, opulence, and prestige within the upper echelons of society. Traditionally, members of a highborne community possess incredible material wealth. While this can take a variety of forms depending on the community—including gold and other minerals, land, or controlling the means of production—this status always comes with power and influence. Highborne place great value on titles and possessions, and there is little social mobility within their ranks. Members of a highborne community often control the political and economic status of the areas in which they live due to their ability to influence people and the economy with their substantial wealth. The health and safety of the less affluent people who live in these locations often hinges on the ability of this highborne ruling class to prioritize the well-being of their subjects over profit.

Highborne are often amiable, candid, conniving, enterprising, ostentatious, and unflappable.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Privilege", - "uuid": "Compendium.daggerheart.community-features.Item.AgJiUvad5tgeam57" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940320728, - "modifiedTime": 1748487208088, - "lastModifiedBy": "c3xaFsDtL56heKoi" - }, - "_key": "!items!8AcV556QwoIzkkea" -} diff --git a/src/packs/communities/community_Loreborne_fgJHuCdoyXX4Q84O.json b/src/packs/communities/community_Loreborne_fgJHuCdoyXX4Q84O.json deleted file mode 100644 index 998f186d..00000000 --- a/src/packs/communities/community_Loreborne_fgJHuCdoyXX4Q84O.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "Loreborne", - "type": "community", - "_id": "fgJHuCdoyXX4Q84O", - "img": "systems/daggerheart/assets/icons/communities/loreborne.png", - "system": { - "description": "

Being part of a loreborne community means you’re from a society that favors strong academic or political prowess. Loreborne communities highly value knowledge, frequently in the form of historical preservation, political advancement, scientific study, skill development, or lore and mythology compilation. Most members of these communities research in institutions built in bastions of civilization, while some eclectic few thrive in gathering information from the natural world. Some may be isolationists, operating in smaller enclaves, schools, or guilds and following their own unique ethos. Others still wield their knowledge on a larger scale, making deft political maneuvers across governmental landscapes.

Loreborne are often direct, eloquent, inquisitive, patient,

rhapsodic, and witty.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Well-Read", - "uuid": "Compendium.daggerheart.community-features.Item.n2RA9iZNiVbGlxco" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940300210, - "modifiedTime": 1748487185921, - "lastModifiedBy": "c3xaFsDtL56heKoi" - }, - "_key": "!items!fgJHuCdoyXX4Q84O" -} diff --git a/src/packs/communities/community_Orderborne_Cg39GoSa6lxhXndW.json b/src/packs/communities/community_Orderborne_Cg39GoSa6lxhXndW.json deleted file mode 100644 index ed94308e..00000000 --- a/src/packs/communities/community_Orderborne_Cg39GoSa6lxhXndW.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "Orderborne", - "type": "community", - "_id": "Cg39GoSa6lxhXndW", - "img": "systems/daggerheart/assets/icons/communities/orderborne.png", - "system": { - "description": "

Being part of an orderborne community means you’re from a collective that focuses on discipline or faith, and you uphold a set of principles that reflect your experience there. Orderborne are frequently some of the most powerful among the surrounding communities.

By aligning the members of their society around a common value or goal, such as a god, doctrine, ethos, or even a shared business or trade, the ruling bodies of these enclaves are able to mobilize larger populations with less effort.

While orderborne communities take a variety of forms—some even profoundly pacifistic—perhaps the most feared are those that structure themselves around military prowess. In such a case, it’s not uncommon for orderborne to provide soldiers for hire to other cities or countries.

Orderborne are often ambitious, benevolent, pensive, prudent, sardonic, and stoic.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Dedicated", - "uuid": "Compendium.daggerheart.community-features.Item.ZiBpJxtDSsh6wY3h" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940332147, - "modifiedTime": 1748487117035, - "lastModifiedBy": "c3xaFsDtL56heKoi" - }, - "_key": "!items!Cg39GoSa6lxhXndW" -} diff --git a/src/packs/communities/community_Ridgeborne_DAQoNvVlc9w7NmZd.json b/src/packs/communities/community_Ridgeborne_DAQoNvVlc9w7NmZd.json deleted file mode 100644 index 4dfd104a..00000000 --- a/src/packs/communities/community_Ridgeborne_DAQoNvVlc9w7NmZd.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "Ridgeborne", - "type": "community", - "_id": "DAQoNvVlc9w7NmZd", - "img": "systems/daggerheart/assets/icons/communities/ridgeborne.png", - "system": { - "description": "

Being part of a ridgeborne community means you’ve called the rocky peaks and sharp cliffs of the mountainside home. Those who’ve lived in the mountains often consider themselves hardier than most because they’ve thrived among the most dangerous terrain many continents have to offer. These groups are adept at adaptation, developing unique technologies and equipment to move both people and products across difficult terrain. As such, ridgeborne grow up scrambling and climbing, making them sturdy and strong-willed. Ridgeborne localities appear in a variety of forms—some cities carve out entire cliff faces, others construct castles of stone, and still more live in small homes on windblown peaks. Outside forces often struggle to attack ridgeborne groups, as the small militias and large military forces of the mountains are adept at utilizing their high-ground advantage.

Ridgeborne are often bold, hardy, indomitable, loyal, reserved, and stubborn.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Steady", - "uuid": "Compendium.daggerheart.community-features.Item.Oky51ziMZp6bbuUQ" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940346633, - "modifiedTime": 1748487238072, - "lastModifiedBy": "c3xaFsDtL56heKoi" - }, - "_key": "!items!DAQoNvVlc9w7NmZd" -} diff --git a/src/packs/communities/community_Seaborne_ivrXToGxyuVdqZtG.json b/src/packs/communities/community_Seaborne_ivrXToGxyuVdqZtG.json deleted file mode 100644 index f7a25d5f..00000000 --- a/src/packs/communities/community_Seaborne_ivrXToGxyuVdqZtG.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "Seaborne", - "type": "community", - "_id": "ivrXToGxyuVdqZtG", - "img": "systems/daggerheart/assets/icons/communities/seaborne.png", - "system": { - "description": "

Being part of a seaborne community means you lived on or near a large body of water. Seaborne communities are built, both physically and culturally, around the specific waters they call home.

Some of these groups live along the shore, constructing ports for locals and travelers alike. These harbors function as centers of commerce, tourist attractions, or even just a safe place to lay down one’s head after weeks of travel. Other seaborne live on the water in small boats or large ships, with the idea of “home” comprising a ship and its crew, rather than any one landmass.

No matter their exact location, seaborne communities are closely tied to the ocean tides and the creatures who inhabit them. Seaborne learn to fish at a young age, and train from birth to hold their breath and swim in even the most tumultuous waters. Individuals from these groups are highly sought after for their sailing skills, and many become captains of vessels, whether within their own community, working for another, or even at the helm of a powerful naval operation.

Seaborne are often candid, cooperative, exuberant, fierce, resolute, and weathered.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Know the Tide", - "uuid": "Compendium.daggerheart.community-features.Item.0mdoYz7uZNWCcK5Z" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940375520, - "modifiedTime": 1748487248881, - "lastModifiedBy": "c3xaFsDtL56heKoi" - }, - "_key": "!items!ivrXToGxyuVdqZtG" -} diff --git a/src/packs/communities/community_Slyborne_rwsUCLenOkE9CS7v.json b/src/packs/communities/community_Slyborne_rwsUCLenOkE9CS7v.json deleted file mode 100644 index fe4fbec7..00000000 --- a/src/packs/communities/community_Slyborne_rwsUCLenOkE9CS7v.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "Slyborne", - "type": "community", - "_id": "rwsUCLenOkE9CS7v", - "img": "systems/daggerheart/assets/icons/communities/slyborne.png", - "system": { - "description": "

Being part of a slyborne community means you come from a group that operates outside the law, including all manner of criminals, grifters, and con artists. Members of slyborne communities are brought together by their disreputable goals and their clever means of achieving them. Many people in these communities have an array of unscrupulous skills: forging, thievery, smuggling, and violence. People of any social class can be slyborne, from those who have garnered vast wealth and influence to those without a coin to their name. To the outside eye, slyborne might appear to be ruffians with no loyalty, but these communities possess some of the strictest codes of honor which, when broken, can result in a terrifying end for the transgressor.

Slyborne are often calculating, clever, formidable, perceptive, shrewd, and tenacious.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Scoundrel", - "uuid": "Compendium.daggerheart.community-features.Item.5BUCiSPswsiB0RDW" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940388725, - "modifiedTime": 1748487260950, - "lastModifiedBy": "c3xaFsDtL56heKoi" - }, - "_key": "!items!rwsUCLenOkE9CS7v" -} diff --git a/src/packs/communities/community_Underborne_CXQN2zcQUIjUOx1i.json b/src/packs/communities/community_Underborne_CXQN2zcQUIjUOx1i.json deleted file mode 100644 index bad3379a..00000000 --- a/src/packs/communities/community_Underborne_CXQN2zcQUIjUOx1i.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "Underborne", - "type": "community", - "_id": "CXQN2zcQUIjUOx1i", - "img": "systems/daggerheart/assets/icons/communities/underborne.png", - "system": { - "description": "

Being part of an underborne community means you’re from a subterranean society. Many underborne live right beneath the cities and villages of other collectives, while some live much deeper. These communities range from small family groups in burrows to massive metropolises in caverns of stone. In many locales, underborne are recognized for their incredible boldness and skill that enable great feats of architecture and engineering. Underborne are regularly hired for their bravery, as even the least daring among them has likely encountered formidable belowground beasts, and learning to dispatch such creatures is common practice amongst these societies.

Because of the dangers of their environment, many underborne communities develop unique nonverbal languages that prove equally useful on the surface.

Underborne are often composed, elusive, indomitable, innovative, resourceful, and unpretentious.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Low-Light Living", - "uuid": "Compendium.daggerheart.community-features.Item.hX85YvTQcMzc25hW" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940403160, - "modifiedTime": 1748487269990, - "lastModifiedBy": "c3xaFsDtL56heKoi" - }, - "_key": "!items!CXQN2zcQUIjUOx1i" -} diff --git a/src/packs/communities/community_Wanderborne_DHB5uSzbBeJCJuvC.json b/src/packs/communities/community_Wanderborne_DHB5uSzbBeJCJuvC.json deleted file mode 100644 index 3a3f94f9..00000000 --- a/src/packs/communities/community_Wanderborne_DHB5uSzbBeJCJuvC.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "Wanderborne", - "type": "community", - "_id": "DHB5uSzbBeJCJuvC", - "img": "systems/daggerheart/assets/icons/communities/wanderborne.png", - "system": { - "description": "

Being part of a wanderborne community means you’ve lived as a nomad, forgoing a permanent home and experiencing a wide variety of cultures. Unlike many communities that are defined by their locale, wanderborne are defined by their traveling lifestyle. Because of their frequent migration, wanderborne put less value on the accumulation of material possessions in favor of acquiring information, skills, and connections. While some wanderborne are allied by a common ethos, such as a religion or a set of political or economic values, others come together after shared tragedy, such as the loss of their home or land. No matter the reason, the dangers posed by life on the road and the choice to continue down that road together mean that wanderborne are known for their unwavering loyalty.

Wanderborne are often inscrutable, magnanimous, mirthful, reliable, savvy, and unorthodox.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Nomadic Pack", - "uuid": "Compendium.daggerheart.community-features.Item.o3Q88Rws9Eb5ae5D" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940414913, - "modifiedTime": 1748487280155, - "lastModifiedBy": "c3xaFsDtL56heKoi" - }, - "_key": "!items!DHB5uSzbBeJCJuvC" -} diff --git a/src/packs/communities/community_Wildborne_jUzXIVyBx0mlIFWa.json b/src/packs/communities/community_Wildborne_jUzXIVyBx0mlIFWa.json deleted file mode 100644 index c6cda21b..00000000 --- a/src/packs/communities/community_Wildborne_jUzXIVyBx0mlIFWa.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "Wildborne", - "type": "community", - "_id": "jUzXIVyBx0mlIFWa", - "img": "systems/daggerheart/assets/icons/communities/wildborne.png", - "system": { - "description": "

Being part of a wildborne community means you lived deep within the forest. Wildborne communities are defined by their dedication to the conservation of their homelands, and many have strong religious or cultural ties to the fauna they live among.

This results in unique architectural and technological advancements that favor sustainability over short-term, high-yield results.

It is a hallmark of wildborne societies to integrate their villages and cities with the natural environment and avoid disturbing the lives of the plants and animals. While some construct their lodgings high in the branches of trees, others establish their homes on the ground beneath the forest canopy. It’s not uncommon for wildborne to remain reclusive and hidden within their woodland homes.

Wildborne are often hardy, loyal, nurturing, reclusive, sagacious, and vibrant.

", - "abilities": [ - { - "img": "icons/svg/item-bag.svg", - "name": "Lightfoot", - "uuid": "Compendium.daggerheart.community-features.Item.LY9c4DCgMcB1uEiv" - } - ] - }, - "effects": [], - "folder": null, - "sort": 0, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747940432585, - "modifiedTime": 1748487285826, - "lastModifiedBy": "c3xaFsDtL56heKoi" - }, - "_key": "!items!jUzXIVyBx0mlIFWa" -} diff --git a/src/packs/communities/folders_Community_Features_KA1VSGslxkbvVeMp.json b/src/packs/communities/folders_Community_Features_KA1VSGslxkbvVeMp.json new file mode 100644 index 00000000..42082b86 --- /dev/null +++ b/src/packs/communities/folders_Community_Features_KA1VSGslxkbvVeMp.json @@ -0,0 +1,23 @@ +{ + "type": "Item", + "folder": null, + "name": "Community Features", + "color": null, + "sorting": "a", + "_id": "KA1VSGslxkbvVeMp", + "description": "", + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752680707054, + "modifiedTime": 1752680707054, + "lastModifiedBy": "binNpU8lWev6geDj" + }, + "_key": "!folders!KA1VSGslxkbvVeMp" +} diff --git a/src/packs/community-features/feature_Dedicated_ZiBpJxtDSsh6wY3h.json b/src/packs/community-features/feature_Dedicated_ZiBpJxtDSsh6wY3h.json deleted file mode 100644 index 0655c73e..00000000 --- a/src/packs/community-features/feature_Dedicated_ZiBpJxtDSsh6wY3h.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "Dedicated", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "action", - "featureType": { - "type": "input", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {}, - "value": "d20" - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Record three sayings or values your upbringing instilled in you. Once per rest, when you describe how you’re embodying one of these principles through your current action, you can roll a d20 as your Hope Die.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008847578, - "modifiedTime": 1748008847578, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "ZiBpJxtDSsh6wY3h", - "sort": 0, - "_key": "!items!ZiBpJxtDSsh6wY3h" -} diff --git a/src/packs/community-features/feature_Know_the_Tide_0mdoYz7uZNWCcK5Z.json b/src/packs/community-features/feature_Know_the_Tide_0mdoYz7uZNWCcK5Z.json deleted file mode 100644 index a23aaa00..00000000 --- a/src/packs/community-features/feature_Know_the_Tide_0mdoYz7uZNWCcK5Z.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "Know the Tide", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

You can sense the ebb and flow of life. When you roll with Fear, place a token on your community card. You can hold a number of tokens equal to your level. Before you make an action roll, you can spend any number of these tokens to gain a +1 bonus to the roll for each token spent. At the end of each session, clear all unspent tokens.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008848585, - "modifiedTime": 1748008848585, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "0mdoYz7uZNWCcK5Z", - "sort": 0, - "_key": "!items!0mdoYz7uZNWCcK5Z" -} diff --git a/src/packs/community-features/feature_Lightfoot_LY9c4DCgMcB1uEiv.json b/src/packs/community-features/feature_Lightfoot_LY9c4DCgMcB1uEiv.json deleted file mode 100644 index faffa9fe..00000000 --- a/src/packs/community-features/feature_Lightfoot_LY9c4DCgMcB1uEiv.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "Lightfoot", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Your movement is naturally silent. You have advantage on rolls to move without being heard.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008849798, - "modifiedTime": 1748008849798, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "LY9c4DCgMcB1uEiv", - "sort": 0, - "_key": "!items!LY9c4DCgMcB1uEiv" -} diff --git a/src/packs/community-features/feature_Low_Light_Living_hX85YvTQcMzc25hW.json b/src/packs/community-features/feature_Low_Light_Living_hX85YvTQcMzc25hW.json deleted file mode 100644 index 6d5bb2d7..00000000 --- a/src/packs/community-features/feature_Low_Light_Living_hX85YvTQcMzc25hW.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "Low-Light Living", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

When you’re in an area with low light or heavy shadow, you have advantage on rolls to hide, investigate, or perceive details within that area.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008850934, - "modifiedTime": 1748008850934, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "hX85YvTQcMzc25hW", - "sort": 0, - "_key": "!items!hX85YvTQcMzc25hW" -} diff --git a/src/packs/community-features/feature_Nomadic_Pack_o3Q88Rws9Eb5ae5D.json b/src/packs/community-features/feature_Nomadic_Pack_o3Q88Rws9Eb5ae5D.json deleted file mode 100644 index 2af9f177..00000000 --- a/src/packs/community-features/feature_Nomadic_Pack_o3Q88Rws9Eb5ae5D.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "Nomadic Pack", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

Add a Nomadic Pack to your inventory. Once per session, you can spend a Hope to reach into this pack and pull out a mundane item that’s useful to your situation. Work with the GM to figure out what item you take out.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008852219, - "modifiedTime": 1748008852219, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "o3Q88Rws9Eb5ae5D", - "sort": 0, - "_key": "!items!o3Q88Rws9Eb5ae5D" -} diff --git a/src/packs/community-features/feature_Privilege_AgJiUvad5tgeam57.json b/src/packs/community-features/feature_Privilege_AgJiUvad5tgeam57.json deleted file mode 100644 index 200ccb61..00000000 --- a/src/packs/community-features/feature_Privilege_AgJiUvad5tgeam57.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "Privilege", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

You have advantage on rolls to consort with nobles, negotiate prices, or leverage your reputation to get what you want.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008853598, - "modifiedTime": 1748008853598, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "AgJiUvad5tgeam57", - "sort": 0, - "_key": "!items!AgJiUvad5tgeam57" -} diff --git a/src/packs/community-features/feature_Scoundrel_5BUCiSPswsiB0RDW.json b/src/packs/community-features/feature_Scoundrel_5BUCiSPswsiB0RDW.json deleted file mode 100644 index 13eb1e52..00000000 --- a/src/packs/community-features/feature_Scoundrel_5BUCiSPswsiB0RDW.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "Scoundrel", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

You have advantage on rolls to negotiate with criminals, detect lies, or find a safe place to hide.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008855001, - "modifiedTime": 1748008855001, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "5BUCiSPswsiB0RDW", - "sort": 0, - "_key": "!items!5BUCiSPswsiB0RDW" -} diff --git a/src/packs/community-features/feature_Steady_Oky51ziMZp6bbuUQ.json b/src/packs/community-features/feature_Steady_Oky51ziMZp6bbuUQ.json deleted file mode 100644 index 70f4c783..00000000 --- a/src/packs/community-features/feature_Steady_Oky51ziMZp6bbuUQ.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "Steady", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {} - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

You have advantage on rolls to traverse dangerous cliffs and ledges, navigate harsh environments, and use your survival knowledge.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008856287, - "modifiedTime": 1748008856287, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "Oky51ziMZp6bbuUQ", - "sort": 0, - "_key": "!items!Oky51ziMZp6bbuUQ" -} diff --git a/src/packs/community-features/feature_Well_Read_n2RA9iZNiVbGlxco.json b/src/packs/community-features/feature_Well_Read_n2RA9iZNiVbGlxco.json deleted file mode 100644 index db3e79e8..00000000 --- a/src/packs/community-features/feature_Well_Read_n2RA9iZNiVbGlxco.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "Well-Read", - "type": "feature", - "img": "icons/svg/item-bag.svg", - "system": { - "actionType": "passive", - "featureType": { - "type": "normal", - "data": { - "property": "spellcastingTrait", - "max": 1, - "numbers": {}, - "value": "d4" - } - }, - "refreshData": null, - "multiclass": null, - "disabled": false, - "description": "

You have advantage on rolls that involve the history, culture, or politics of a prominent person or place.

", - "effects": {}, - "actions": [], - "type": "community" - }, - "effects": [], - "folder": null, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748008857389, - "modifiedTime": 1748008857389, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "_id": "n2RA9iZNiVbGlxco", - "sort": 0, - "_key": "!items!n2RA9iZNiVbGlxco" -} diff --git a/src/packs/domains/folders_Arcana_jc1HbSpJmjAsq9GX.json b/src/packs/domains/folders_Arcana_jc1HbSpJmjAsq9GX.json index 97119cbc..7b23e2fc 100644 --- a/src/packs/domains/folders_Arcana_jc1HbSpJmjAsq9GX.json +++ b/src/packs/domains/folders_Arcana_jc1HbSpJmjAsq9GX.json @@ -3,7 +3,7 @@ "folder": null, "name": "Arcana", "color": "#562d6c", - "sorting": "a", + "sorting": "m", "_id": "jc1HbSpJmjAsq9GX", "description": "", "sort": 100000, @@ -12,12 +12,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1748717088692, - "modifiedTime": 1748717766758, - "lastModifiedBy": "WafZqd6qLGpBRGTt" + "modifiedTime": 1752681421845, + "lastModifiedBy": "YNJ4HgHtFrTI89mx" }, "_key": "!folders!jc1HbSpJmjAsq9GX" } diff --git a/src/packs/domains/folders_Blade_gXc5zPwSyZXqrC6D.json b/src/packs/domains/folders_Blade_gXc5zPwSyZXqrC6D.json index 0d1f8329..e778cb25 100644 --- a/src/packs/domains/folders_Blade_gXc5zPwSyZXqrC6D.json +++ b/src/packs/domains/folders_Blade_gXc5zPwSyZXqrC6D.json @@ -3,7 +3,7 @@ "folder": null, "name": "Blade", "color": "#923628", - "sorting": "a", + "sorting": "m", "_id": "gXc5zPwSyZXqrC6D", "description": "", "sort": 200000, @@ -12,12 +12,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1748717097962, - "modifiedTime": 1748717766758, - "lastModifiedBy": "WafZqd6qLGpBRGTt" + "modifiedTime": 1752681424426, + "lastModifiedBy": "YNJ4HgHtFrTI89mx" }, "_key": "!folders!gXc5zPwSyZXqrC6D" } diff --git a/src/packs/domains/folders_Bone_IMRfDo5DDrpniKKv.json b/src/packs/domains/folders_Bone_IMRfDo5DDrpniKKv.json index acf60d30..8c42be51 100644 --- a/src/packs/domains/folders_Bone_IMRfDo5DDrpniKKv.json +++ b/src/packs/domains/folders_Bone_IMRfDo5DDrpniKKv.json @@ -3,7 +3,7 @@ "folder": null, "name": "Bone", "color": "#656768", - "sorting": "a", + "sorting": "m", "_id": "IMRfDo5DDrpniKKv", "description": "", "sort": 300000, @@ -12,12 +12,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1748717103209, - "modifiedTime": 1748717766758, - "lastModifiedBy": "WafZqd6qLGpBRGTt" + "modifiedTime": 1752681427007, + "lastModifiedBy": "YNJ4HgHtFrTI89mx" }, "_key": "!folders!IMRfDo5DDrpniKKv" } diff --git a/src/packs/domains/folders_Codex_q9VsNwg9r0bTn2ll.json b/src/packs/domains/folders_Codex_q9VsNwg9r0bTn2ll.json index f2fb729a..b8213451 100644 --- a/src/packs/domains/folders_Codex_q9VsNwg9r0bTn2ll.json +++ b/src/packs/domains/folders_Codex_q9VsNwg9r0bTn2ll.json @@ -3,7 +3,7 @@ "folder": null, "name": "Codex", "color": "#1a315b", - "sorting": "a", + "sorting": "m", "_id": "q9VsNwg9r0bTn2ll", "description": "", "sort": 400000, @@ -12,12 +12,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1748717109630, - "modifiedTime": 1748717766758, - "lastModifiedBy": "WafZqd6qLGpBRGTt" + "modifiedTime": 1752681430282, + "lastModifiedBy": "YNJ4HgHtFrTI89mx" }, "_key": "!folders!q9VsNwg9r0bTn2ll" } diff --git a/src/packs/domains/folders_Grace_c380soh7Z1YAqzOT.json b/src/packs/domains/folders_Grace_c380soh7Z1YAqzOT.json index e2ac29a3..75a539c9 100644 --- a/src/packs/domains/folders_Grace_c380soh7Z1YAqzOT.json +++ b/src/packs/domains/folders_Grace_c380soh7Z1YAqzOT.json @@ -3,7 +3,7 @@ "folder": null, "name": "Grace", "color": "#7a3961", - "sorting": "a", + "sorting": "m", "_id": "c380soh7Z1YAqzOT", "description": "", "sort": 500000, @@ -12,12 +12,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1748717115983, - "modifiedTime": 1748717766758, - "lastModifiedBy": "WafZqd6qLGpBRGTt" + "modifiedTime": 1752681433948, + "lastModifiedBy": "YNJ4HgHtFrTI89mx" }, "_key": "!folders!c380soh7Z1YAqzOT" } diff --git a/src/packs/domains/folders_Level_10_7Cs44YADBTmmtCw6.json b/src/packs/domains/folders_Level_10_7Cs44YADBTmmtCw6.json index ccf312f8..808a8615 100644 --- a/src/packs/domains/folders_Level_10_7Cs44YADBTmmtCw6.json +++ b/src/packs/domains/folders_Level_10_7Cs44YADBTmmtCw6.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "7Cs44YADBTmmtCw6", "description": "", - "sort": 0, + "sort": 1000000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681455565 }, "_key": "!folders!7Cs44YADBTmmtCw6" } diff --git a/src/packs/domains/folders_Level_10_7pKKYgRQAKlQAksV.json b/src/packs/domains/folders_Level_10_7pKKYgRQAKlQAksV.json index c70c8b4d..95aa1bc7 100644 --- a/src/packs/domains/folders_Level_10_7pKKYgRQAKlQAksV.json +++ b/src/packs/domains/folders_Level_10_7pKKYgRQAKlQAksV.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "7pKKYgRQAKlQAksV", "description": "", - "sort": 0, + "sort": 1000000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681470475 }, "_key": "!folders!7pKKYgRQAKlQAksV" } diff --git a/src/packs/domains/folders_Level_10_8qr1Y2tW3vLwNZOg.json b/src/packs/domains/folders_Level_10_8qr1Y2tW3vLwNZOg.json index 644ba797..6e0e913d 100644 --- a/src/packs/domains/folders_Level_10_8qr1Y2tW3vLwNZOg.json +++ b/src/packs/domains/folders_Level_10_8qr1Y2tW3vLwNZOg.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "8qr1Y2tW3vLwNZOg", "description": "", - "sort": 0, + "sort": 1100000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681528546 }, "_key": "!folders!8qr1Y2tW3vLwNZOg" } diff --git a/src/packs/domains/folders_Level_10_D1MFCYakdFIKDmcD.json b/src/packs/domains/folders_Level_10_D1MFCYakdFIKDmcD.json index 1a395612..fda1a4e6 100644 --- a/src/packs/domains/folders_Level_10_D1MFCYakdFIKDmcD.json +++ b/src/packs/domains/folders_Level_10_D1MFCYakdFIKDmcD.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "D1MFCYakdFIKDmcD", "description": "", - "sort": 0, + "sort": 1000000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681584076 }, "_key": "!folders!D1MFCYakdFIKDmcD" } diff --git a/src/packs/domains/folders_Level_10_Hs6POmXKThDXQJBn.json b/src/packs/domains/folders_Level_10_Hs6POmXKThDXQJBn.json index 544cbe4f..0b355d75 100644 --- a/src/packs/domains/folders_Level_10_Hs6POmXKThDXQJBn.json +++ b/src/packs/domains/folders_Level_10_Hs6POmXKThDXQJBn.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "Hs6POmXKThDXQJBn", "description": "", - "sort": 0, + "sort": 900000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681484833 }, "_key": "!folders!Hs6POmXKThDXQJBn" } diff --git a/src/packs/domains/folders_Level_10_IIVaYseNJbA2ta1B.json b/src/packs/domains/folders_Level_10_IIVaYseNJbA2ta1B.json index 9554bc23..9f27401d 100644 --- a/src/packs/domains/folders_Level_10_IIVaYseNJbA2ta1B.json +++ b/src/packs/domains/folders_Level_10_IIVaYseNJbA2ta1B.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "IIVaYseNJbA2ta1B", "description": "", - "sort": 0, + "sort": 700000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681499124 }, "_key": "!folders!IIVaYseNJbA2ta1B" } diff --git a/src/packs/domains/folders_Level_10_nZr2hsu6Q6TlFXQn.json b/src/packs/domains/folders_Level_10_nZr2hsu6Q6TlFXQn.json index fffffa77..481bfa2d 100644 --- a/src/packs/domains/folders_Level_10_nZr2hsu6Q6TlFXQn.json +++ b/src/packs/domains/folders_Level_10_nZr2hsu6Q6TlFXQn.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "nZr2hsu6Q6TlFXQn", "description": "", - "sort": 0, + "sort": 1000000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681560360 }, "_key": "!folders!nZr2hsu6Q6TlFXQn" } diff --git a/src/packs/domains/folders_Level_10_pPzU9WOQNv3ckO1w.json b/src/packs/domains/folders_Level_10_pPzU9WOQNv3ckO1w.json index aac6635d..3862d063 100644 --- a/src/packs/domains/folders_Level_10_pPzU9WOQNv3ckO1w.json +++ b/src/packs/domains/folders_Level_10_pPzU9WOQNv3ckO1w.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "pPzU9WOQNv3ckO1w", "description": "", - "sort": 0, + "sort": 1000000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681545540 }, "_key": "!folders!pPzU9WOQNv3ckO1w" } diff --git a/src/packs/domains/folders_Level_10_wdhWWqWlPiBxtsvr.json b/src/packs/domains/folders_Level_10_wdhWWqWlPiBxtsvr.json index 06262533..2f663e1a 100644 --- a/src/packs/domains/folders_Level_10_wdhWWqWlPiBxtsvr.json +++ b/src/packs/domains/folders_Level_10_wdhWWqWlPiBxtsvr.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "wdhWWqWlPiBxtsvr", "description": "", - "sort": 0, + "sort": 1000000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681517285 }, "_key": "!folders!wdhWWqWlPiBxtsvr" } diff --git a/src/packs/domains/folders_Level_1_9Xc6KzNyjDtTGZkp.json b/src/packs/domains/folders_Level_1_9Xc6KzNyjDtTGZkp.json index 5fa8df48..938db4f2 100644 --- a/src/packs/domains/folders_Level_1_9Xc6KzNyjDtTGZkp.json +++ b/src/packs/domains/folders_Level_1_9Xc6KzNyjDtTGZkp.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "9Xc6KzNyjDtTGZkp", "description": "", - "sort": 0, + "sort": 100000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681470475 }, "_key": "!folders!9Xc6KzNyjDtTGZkp" } diff --git a/src/packs/domains/folders_Level_1_EJoXzO85rG5EiZsh.json b/src/packs/domains/folders_Level_1_EJoXzO85rG5EiZsh.json index ae5f9acb..9217a20b 100644 --- a/src/packs/domains/folders_Level_1_EJoXzO85rG5EiZsh.json +++ b/src/packs/domains/folders_Level_1_EJoXzO85rG5EiZsh.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "EJoXzO85rG5EiZsh", "description": "", - "sort": 0, + "sort": 100000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681545540 }, "_key": "!folders!EJoXzO85rG5EiZsh" } diff --git a/src/packs/domains/folders_Level_1_LlWJaBZOKh0Ot2kD.json b/src/packs/domains/folders_Level_1_LlWJaBZOKh0Ot2kD.json index 8b535a9f..8e95ba32 100644 --- a/src/packs/domains/folders_Level_1_LlWJaBZOKh0Ot2kD.json +++ b/src/packs/domains/folders_Level_1_LlWJaBZOKh0Ot2kD.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "LlWJaBZOKh0Ot2kD", "description": "", - "sort": 0, + "sort": 100000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681560360 }, "_key": "!folders!LlWJaBZOKh0Ot2kD" } diff --git a/src/packs/domains/folders_Level_1_PeeIjbkBv41613yZ.json b/src/packs/domains/folders_Level_1_PeeIjbkBv41613yZ.json index 7db9c3c5..c922aaea 100644 --- a/src/packs/domains/folders_Level_1_PeeIjbkBv41613yZ.json +++ b/src/packs/domains/folders_Level_1_PeeIjbkBv41613yZ.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "PeeIjbkBv41613yZ", "description": "", - "sort": 0, + "sort": 100000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681481088 }, "_key": "!folders!PeeIjbkBv41613yZ" } diff --git a/src/packs/domains/folders_Level_1_QpOL7jPbMBzH96qR.json b/src/packs/domains/folders_Level_1_QpOL7jPbMBzH96qR.json index dc5982e7..715bb74c 100644 --- a/src/packs/domains/folders_Level_1_QpOL7jPbMBzH96qR.json +++ b/src/packs/domains/folders_Level_1_QpOL7jPbMBzH96qR.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "QpOL7jPbMBzH96qR", "description": "", - "sort": 0, + "sort": 100000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681584076 }, "_key": "!folders!QpOL7jPbMBzH96qR" } diff --git a/src/packs/domains/folders_Level_1_nVCKcZkcoEivYJaF.json b/src/packs/domains/folders_Level_1_nVCKcZkcoEivYJaF.json index 2643f089..35d900eb 100644 --- a/src/packs/domains/folders_Level_1_nVCKcZkcoEivYJaF.json +++ b/src/packs/domains/folders_Level_1_nVCKcZkcoEivYJaF.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "nVCKcZkcoEivYJaF", "description": "", - "sort": 0, + "sort": 100000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681517285 }, "_key": "!folders!nVCKcZkcoEivYJaF" } diff --git a/src/packs/domains/folders_Level_1_o7kvw9NRGvDZSce2.json b/src/packs/domains/folders_Level_1_o7kvw9NRGvDZSce2.json index da59144c..18139555 100644 --- a/src/packs/domains/folders_Level_1_o7kvw9NRGvDZSce2.json +++ b/src/packs/domains/folders_Level_1_o7kvw9NRGvDZSce2.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "o7kvw9NRGvDZSce2", "description": "", - "sort": 0, + "sort": 100000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681455565 }, "_key": "!folders!o7kvw9NRGvDZSce2" } diff --git a/src/packs/domains/folders_Level_1_sCiN7DoysdKceIMd.json b/src/packs/domains/folders_Level_1_sCiN7DoysdKceIMd.json index b515ba55..e51846c2 100644 --- a/src/packs/domains/folders_Level_1_sCiN7DoysdKceIMd.json +++ b/src/packs/domains/folders_Level_1_sCiN7DoysdKceIMd.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "sCiN7DoysdKceIMd", "description": "", - "sort": 0, + "sort": 100000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681523539 }, "_key": "!folders!sCiN7DoysdKceIMd" } diff --git a/src/packs/domains/folders_Level_1_tqhasjtHBX0F20lN.json b/src/packs/domains/folders_Level_1_tqhasjtHBX0F20lN.json index 04e6bdd5..8bc43a0c 100644 --- a/src/packs/domains/folders_Level_1_tqhasjtHBX0F20lN.json +++ b/src/packs/domains/folders_Level_1_tqhasjtHBX0F20lN.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "tqhasjtHBX0F20lN", "description": "", - "sort": 0, + "sort": 100000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681499124 }, "_key": "!folders!tqhasjtHBX0F20lN" } diff --git a/src/packs/domains/folders_Level_2_2yh8wuYprOyswf0r.json b/src/packs/domains/folders_Level_2_2yh8wuYprOyswf0r.json index 70501166..8a8272a7 100644 --- a/src/packs/domains/folders_Level_2_2yh8wuYprOyswf0r.json +++ b/src/packs/domains/folders_Level_2_2yh8wuYprOyswf0r.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "2yh8wuYprOyswf0r", "description": "", - "sort": 0, + "sort": 200000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681560360 }, "_key": "!folders!2yh8wuYprOyswf0r" } diff --git a/src/packs/domains/folders_Level_2_Abn46nCQst6kpGeA.json b/src/packs/domains/folders_Level_2_Abn46nCQst6kpGeA.json index 7ad07a5f..5b1720b1 100644 --- a/src/packs/domains/folders_Level_2_Abn46nCQst6kpGeA.json +++ b/src/packs/domains/folders_Level_2_Abn46nCQst6kpGeA.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "Abn46nCQst6kpGeA", "description": "", - "sort": 0, + "sort": 150000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681524974 }, "_key": "!folders!Abn46nCQst6kpGeA" } diff --git a/src/packs/domains/folders_Level_2_Q9rmrfeKqcqBNnWc.json b/src/packs/domains/folders_Level_2_Q9rmrfeKqcqBNnWc.json index 1c9229a2..ccb0f8c9 100644 --- a/src/packs/domains/folders_Level_2_Q9rmrfeKqcqBNnWc.json +++ b/src/packs/domains/folders_Level_2_Q9rmrfeKqcqBNnWc.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "Q9rmrfeKqcqBNnWc", "description": "", - "sort": 0, + "sort": 200000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681481088 }, "_key": "!folders!Q9rmrfeKqcqBNnWc" } diff --git a/src/packs/domains/folders_Level_2_j9i2Q6Z7Z82udHn1.json b/src/packs/domains/folders_Level_2_j9i2Q6Z7Z82udHn1.json index 989c4cec..76b20c20 100644 --- a/src/packs/domains/folders_Level_2_j9i2Q6Z7Z82udHn1.json +++ b/src/packs/domains/folders_Level_2_j9i2Q6Z7Z82udHn1.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "j9i2Q6Z7Z82udHn1", "description": "", - "sort": 0, + "sort": 200000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681499124 }, "_key": "!folders!j9i2Q6Z7Z82udHn1" } diff --git a/src/packs/domains/folders_Level_2_o7t2fsAmRxKLoHrO.json b/src/packs/domains/folders_Level_2_o7t2fsAmRxKLoHrO.json index d0bd857d..7b7d4808 100644 --- a/src/packs/domains/folders_Level_2_o7t2fsAmRxKLoHrO.json +++ b/src/packs/domains/folders_Level_2_o7t2fsAmRxKLoHrO.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "o7t2fsAmRxKLoHrO", "description": "", - "sort": 0, + "sort": 200000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681470475 }, "_key": "!folders!o7t2fsAmRxKLoHrO" } diff --git a/src/packs/domains/folders_Level_2_pk4xXE8D3vTawrqj.json b/src/packs/domains/folders_Level_2_pk4xXE8D3vTawrqj.json index 048fb29d..6af2fb66 100644 --- a/src/packs/domains/folders_Level_2_pk4xXE8D3vTawrqj.json +++ b/src/packs/domains/folders_Level_2_pk4xXE8D3vTawrqj.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "pk4xXE8D3vTawrqj", "description": "", - "sort": 0, + "sort": 200000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681584076 }, "_key": "!folders!pk4xXE8D3vTawrqj" } diff --git a/src/packs/domains/folders_Level_2_pu3xD4rEkdfdAvGc.json b/src/packs/domains/folders_Level_2_pu3xD4rEkdfdAvGc.json index 3b00a7e7..59464076 100644 --- a/src/packs/domains/folders_Level_2_pu3xD4rEkdfdAvGc.json +++ b/src/packs/domains/folders_Level_2_pu3xD4rEkdfdAvGc.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "pu3xD4rEkdfdAvGc", "description": "", - "sort": 0, + "sort": 200000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681517285 }, "_key": "!folders!pu3xD4rEkdfdAvGc" } diff --git a/src/packs/domains/folders_Level_2_u8Yz2hUTaF3N2fFT.json b/src/packs/domains/folders_Level_2_u8Yz2hUTaF3N2fFT.json index 1364e716..783374ab 100644 --- a/src/packs/domains/folders_Level_2_u8Yz2hUTaF3N2fFT.json +++ b/src/packs/domains/folders_Level_2_u8Yz2hUTaF3N2fFT.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "u8Yz2hUTaF3N2fFT", "description": "", - "sort": 0, + "sort": 200000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681455565 }, "_key": "!folders!u8Yz2hUTaF3N2fFT" } diff --git a/src/packs/domains/folders_Level_2_xZrCYAd05ayNu1yW.json b/src/packs/domains/folders_Level_2_xZrCYAd05ayNu1yW.json index 3768acad..e9a40501 100644 --- a/src/packs/domains/folders_Level_2_xZrCYAd05ayNu1yW.json +++ b/src/packs/domains/folders_Level_2_xZrCYAd05ayNu1yW.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "xZrCYAd05ayNu1yW", "description": "", - "sort": 0, + "sort": 200000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681545540 }, "_key": "!folders!xZrCYAd05ayNu1yW" } diff --git a/src/packs/domains/folders_Level_3_7XeaYZPMB0SopAfo.json b/src/packs/domains/folders_Level_3_7XeaYZPMB0SopAfo.json index 15417ed9..6ae67cf4 100644 --- a/src/packs/domains/folders_Level_3_7XeaYZPMB0SopAfo.json +++ b/src/packs/domains/folders_Level_3_7XeaYZPMB0SopAfo.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "7XeaYZPMB0SopAfo", "description": "", - "sort": 0, + "sort": 300000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681499124 }, "_key": "!folders!7XeaYZPMB0SopAfo" } diff --git a/src/packs/domains/folders_Level_3_8ZfL09F8MiOEUzzw.json b/src/packs/domains/folders_Level_3_8ZfL09F8MiOEUzzw.json index a77a2f88..ba79f93a 100644 --- a/src/packs/domains/folders_Level_3_8ZfL09F8MiOEUzzw.json +++ b/src/packs/domains/folders_Level_3_8ZfL09F8MiOEUzzw.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "8ZfL09F8MiOEUzzw", "description": "", - "sort": 0, + "sort": 300000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681560360 }, "_key": "!folders!8ZfL09F8MiOEUzzw" } diff --git a/src/packs/domains/folders_Level_3_GhLhMfmSgGqS9bwU.json b/src/packs/domains/folders_Level_3_GhLhMfmSgGqS9bwU.json index 063a6e0d..35ce3d60 100644 --- a/src/packs/domains/folders_Level_3_GhLhMfmSgGqS9bwU.json +++ b/src/packs/domains/folders_Level_3_GhLhMfmSgGqS9bwU.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "GhLhMfmSgGqS9bwU", "description": "", - "sort": 0, + "sort": 300000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681517285 }, "_key": "!folders!GhLhMfmSgGqS9bwU" } diff --git a/src/packs/domains/folders_Level_3_Oo9EkkF7CDD3QZEG.json b/src/packs/domains/folders_Level_3_Oo9EkkF7CDD3QZEG.json index e6b677ab..0475a63e 100644 --- a/src/packs/domains/folders_Level_3_Oo9EkkF7CDD3QZEG.json +++ b/src/packs/domains/folders_Level_3_Oo9EkkF7CDD3QZEG.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "Oo9EkkF7CDD3QZEG", "description": "", - "sort": 0, + "sort": 300000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681584076 }, "_key": "!folders!Oo9EkkF7CDD3QZEG" } diff --git a/src/packs/domains/folders_Level_3_eR7sP5jQwfCLORUe.json b/src/packs/domains/folders_Level_3_eR7sP5jQwfCLORUe.json index 8aeb92a7..93800da2 100644 --- a/src/packs/domains/folders_Level_3_eR7sP5jQwfCLORUe.json +++ b/src/packs/domains/folders_Level_3_eR7sP5jQwfCLORUe.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "eR7sP5jQwfCLORUe", "description": "", - "sort": 0, + "sort": 300000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681481088 }, "_key": "!folders!eR7sP5jQwfCLORUe" } diff --git a/src/packs/domains/folders_Level_3_hoDIPBzwYPxiSXGU.json b/src/packs/domains/folders_Level_3_hoDIPBzwYPxiSXGU.json index ab5c1865..3c0d10f6 100644 --- a/src/packs/domains/folders_Level_3_hoDIPBzwYPxiSXGU.json +++ b/src/packs/domains/folders_Level_3_hoDIPBzwYPxiSXGU.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "hoDIPBzwYPxiSXGU", "description": "", - "sort": 0, + "sort": 175000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681526153 }, "_key": "!folders!hoDIPBzwYPxiSXGU" } diff --git a/src/packs/domains/folders_Level_3_mOv6BGhJAeGrzA84.json b/src/packs/domains/folders_Level_3_mOv6BGhJAeGrzA84.json index 8c2ca9f8..4e2a9f34 100644 --- a/src/packs/domains/folders_Level_3_mOv6BGhJAeGrzA84.json +++ b/src/packs/domains/folders_Level_3_mOv6BGhJAeGrzA84.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "mOv6BGhJAeGrzA84", "description": "", - "sort": 0, + "sort": 300000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681455565 }, "_key": "!folders!mOv6BGhJAeGrzA84" } diff --git a/src/packs/domains/folders_Level_3_uXGugK72AffddFdH.json b/src/packs/domains/folders_Level_3_uXGugK72AffddFdH.json index 3963e819..c57e63f7 100644 --- a/src/packs/domains/folders_Level_3_uXGugK72AffddFdH.json +++ b/src/packs/domains/folders_Level_3_uXGugK72AffddFdH.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "uXGugK72AffddFdH", "description": "", - "sort": 0, + "sort": 300000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681545540 }, "_key": "!folders!uXGugK72AffddFdH" } diff --git a/src/packs/domains/folders_Level_3_wWL9mV6i2EGX5xHS.json b/src/packs/domains/folders_Level_3_wWL9mV6i2EGX5xHS.json index 0fa120a9..84efe707 100644 --- a/src/packs/domains/folders_Level_3_wWL9mV6i2EGX5xHS.json +++ b/src/packs/domains/folders_Level_3_wWL9mV6i2EGX5xHS.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "wWL9mV6i2EGX5xHS", "description": "", - "sort": 0, + "sort": 300000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681470475 }, "_key": "!folders!wWL9mV6i2EGX5xHS" } diff --git a/src/packs/domains/folders_Level_4_1e5Sn8OXxEQ57GSD.json b/src/packs/domains/folders_Level_4_1e5Sn8OXxEQ57GSD.json index b18a545a..3b46d220 100644 --- a/src/packs/domains/folders_Level_4_1e5Sn8OXxEQ57GSD.json +++ b/src/packs/domains/folders_Level_4_1e5Sn8OXxEQ57GSD.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "1e5Sn8OXxEQ57GSD", "description": "", - "sort": 0, + "sort": 400000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681455565 }, "_key": "!folders!1e5Sn8OXxEQ57GSD" } diff --git a/src/packs/domains/folders_Level_4_3e8kCsLzLxiACJDb.json b/src/packs/domains/folders_Level_4_3e8kCsLzLxiACJDb.json index c6c37c44..ec28b419 100644 --- a/src/packs/domains/folders_Level_4_3e8kCsLzLxiACJDb.json +++ b/src/packs/domains/folders_Level_4_3e8kCsLzLxiACJDb.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "3e8kCsLzLxiACJDb", "description": "", - "sort": 0, + "sort": 400000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681481088 }, "_key": "!folders!3e8kCsLzLxiACJDb" } diff --git a/src/packs/domains/folders_Level_4_BJIiOIWAQUz5zuqo.json b/src/packs/domains/folders_Level_4_BJIiOIWAQUz5zuqo.json index f4feabe3..51cc633d 100644 --- a/src/packs/domains/folders_Level_4_BJIiOIWAQUz5zuqo.json +++ b/src/packs/domains/folders_Level_4_BJIiOIWAQUz5zuqo.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "BJIiOIWAQUz5zuqo", "description": "", - "sort": 0, + "sort": 400000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681545540 }, "_key": "!folders!BJIiOIWAQUz5zuqo" } diff --git a/src/packs/domains/folders_Level_4_WTdOLLkQyPdg0KWU.json b/src/packs/domains/folders_Level_4_WTdOLLkQyPdg0KWU.json index 8cc4455e..36bd9b1b 100644 --- a/src/packs/domains/folders_Level_4_WTdOLLkQyPdg0KWU.json +++ b/src/packs/domains/folders_Level_4_WTdOLLkQyPdg0KWU.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "WTdOLLkQyPdg0KWU", "description": "", - "sort": 0, + "sort": 187500, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681531244 }, "_key": "!folders!WTdOLLkQyPdg0KWU" } diff --git a/src/packs/domains/folders_Level_4_cOZgzLQRGNnBzsHT.json b/src/packs/domains/folders_Level_4_cOZgzLQRGNnBzsHT.json index e3fb6d91..5b7f3bf2 100644 --- a/src/packs/domains/folders_Level_4_cOZgzLQRGNnBzsHT.json +++ b/src/packs/domains/folders_Level_4_cOZgzLQRGNnBzsHT.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "cOZgzLQRGNnBzsHT", "description": "", - "sort": 0, + "sort": 400000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681584076 }, "_key": "!folders!cOZgzLQRGNnBzsHT" } diff --git a/src/packs/domains/folders_Level_4_rUGDM9JvGfhh9a2Y.json b/src/packs/domains/folders_Level_4_rUGDM9JvGfhh9a2Y.json index b95fccfa..2a777dba 100644 --- a/src/packs/domains/folders_Level_4_rUGDM9JvGfhh9a2Y.json +++ b/src/packs/domains/folders_Level_4_rUGDM9JvGfhh9a2Y.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "rUGDM9JvGfhh9a2Y", "description": "", - "sort": 0, + "sort": 400000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681499124 }, "_key": "!folders!rUGDM9JvGfhh9a2Y" } diff --git a/src/packs/domains/folders_Level_4_thP6nUk0nkrNcpXY.json b/src/packs/domains/folders_Level_4_thP6nUk0nkrNcpXY.json index a923dfa0..43a43018 100644 --- a/src/packs/domains/folders_Level_4_thP6nUk0nkrNcpXY.json +++ b/src/packs/domains/folders_Level_4_thP6nUk0nkrNcpXY.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "thP6nUk0nkrNcpXY", "description": "", - "sort": 0, + "sort": 400000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681517285 }, "_key": "!folders!thP6nUk0nkrNcpXY" } diff --git a/src/packs/domains/folders_Level_4_vAZKNDtAafd7HDWV.json b/src/packs/domains/folders_Level_4_vAZKNDtAafd7HDWV.json index 6dfea92f..f9440b6d 100644 --- a/src/packs/domains/folders_Level_4_vAZKNDtAafd7HDWV.json +++ b/src/packs/domains/folders_Level_4_vAZKNDtAafd7HDWV.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "vAZKNDtAafd7HDWV", "description": "", - "sort": 0, + "sort": 400000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681560360 }, "_key": "!folders!vAZKNDtAafd7HDWV" } diff --git a/src/packs/domains/folders_Level_4_yalAnCU3SndrYImF.json b/src/packs/domains/folders_Level_4_yalAnCU3SndrYImF.json index 9e68181d..c3588172 100644 --- a/src/packs/domains/folders_Level_4_yalAnCU3SndrYImF.json +++ b/src/packs/domains/folders_Level_4_yalAnCU3SndrYImF.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "yalAnCU3SndrYImF", "description": "", - "sort": 0, + "sort": 400000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681470475 }, "_key": "!folders!yalAnCU3SndrYImF" } diff --git a/src/packs/domains/folders_Level_5_6gA7SmNIblkMaYgr.json b/src/packs/domains/folders_Level_5_6gA7SmNIblkMaYgr.json index 4dc9f597..dcd919f7 100644 --- a/src/packs/domains/folders_Level_5_6gA7SmNIblkMaYgr.json +++ b/src/packs/domains/folders_Level_5_6gA7SmNIblkMaYgr.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "6gA7SmNIblkMaYgr", "description": "", - "sort": 0, + "sort": 500000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681517285 }, "_key": "!folders!6gA7SmNIblkMaYgr" } diff --git a/src/packs/domains/folders_Level_5_8erksbTp7ic6in4I.json b/src/packs/domains/folders_Level_5_8erksbTp7ic6in4I.json index 61b7f4f2..d726c6d4 100644 --- a/src/packs/domains/folders_Level_5_8erksbTp7ic6in4I.json +++ b/src/packs/domains/folders_Level_5_8erksbTp7ic6in4I.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "8erksbTp7ic6in4I", "description": "", - "sort": 0, + "sort": 193750, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681532576 }, "_key": "!folders!8erksbTp7ic6in4I" } diff --git a/src/packs/domains/folders_Level_5_BQ1L4EiwOs84Xysp.json b/src/packs/domains/folders_Level_5_BQ1L4EiwOs84Xysp.json index f76f64cf..9abfd232 100644 --- a/src/packs/domains/folders_Level_5_BQ1L4EiwOs84Xysp.json +++ b/src/packs/domains/folders_Level_5_BQ1L4EiwOs84Xysp.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "BQ1L4EiwOs84Xysp", "description": "", - "sort": 0, + "sort": 500000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681481088 }, "_key": "!folders!BQ1L4EiwOs84Xysp" } diff --git a/src/packs/domains/folders_Level_5_Emnx4o1DWGTVKoAg.json b/src/packs/domains/folders_Level_5_Emnx4o1DWGTVKoAg.json index dd07fbfd..d47108d4 100644 --- a/src/packs/domains/folders_Level_5_Emnx4o1DWGTVKoAg.json +++ b/src/packs/domains/folders_Level_5_Emnx4o1DWGTVKoAg.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "Emnx4o1DWGTVKoAg", "description": "", - "sort": 0, + "sort": 500000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681470475 }, "_key": "!folders!Emnx4o1DWGTVKoAg" } diff --git a/src/packs/domains/folders_Level_5_Jbw6Teaha6So9tym.json b/src/packs/domains/folders_Level_5_Jbw6Teaha6So9tym.json index a39039e4..faf5c3c1 100644 --- a/src/packs/domains/folders_Level_5_Jbw6Teaha6So9tym.json +++ b/src/packs/domains/folders_Level_5_Jbw6Teaha6So9tym.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "Jbw6Teaha6So9tym", "description": "", - "sort": 0, + "sort": 450000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681561395 }, "_key": "!folders!Jbw6Teaha6So9tym" } diff --git a/src/packs/domains/folders_Level_5_XDSp0FdiYDVO0tfw.json b/src/packs/domains/folders_Level_5_XDSp0FdiYDVO0tfw.json index b7a6dd48..fb274687 100644 --- a/src/packs/domains/folders_Level_5_XDSp0FdiYDVO0tfw.json +++ b/src/packs/domains/folders_Level_5_XDSp0FdiYDVO0tfw.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "XDSp0FdiYDVO0tfw", "description": "", - "sort": 0, + "sort": 500000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681584076 }, "_key": "!folders!XDSp0FdiYDVO0tfw" } diff --git a/src/packs/domains/folders_Level_5_ZZHIbaynhzVArA1p.json b/src/packs/domains/folders_Level_5_ZZHIbaynhzVArA1p.json index 74e995c9..979c57cb 100644 --- a/src/packs/domains/folders_Level_5_ZZHIbaynhzVArA1p.json +++ b/src/packs/domains/folders_Level_5_ZZHIbaynhzVArA1p.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "ZZHIbaynhzVArA1p", "description": "", - "sort": 0, + "sort": 500000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681545540 }, "_key": "!folders!ZZHIbaynhzVArA1p" } diff --git a/src/packs/domains/folders_Level_5_l387HKojhqcDAV0b.json b/src/packs/domains/folders_Level_5_l387HKojhqcDAV0b.json index 279e7d88..5d511b9b 100644 --- a/src/packs/domains/folders_Level_5_l387HKojhqcDAV0b.json +++ b/src/packs/domains/folders_Level_5_l387HKojhqcDAV0b.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "l387HKojhqcDAV0b", "description": "", - "sort": 0, + "sort": 500000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681455565 }, "_key": "!folders!l387HKojhqcDAV0b" } diff --git a/src/packs/domains/folders_Level_5_pDtffkb0SMv1O8pL.json b/src/packs/domains/folders_Level_5_pDtffkb0SMv1O8pL.json index 0ce4e669..e82949a4 100644 --- a/src/packs/domains/folders_Level_5_pDtffkb0SMv1O8pL.json +++ b/src/packs/domains/folders_Level_5_pDtffkb0SMv1O8pL.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "pDtffkb0SMv1O8pL", "description": "", - "sort": 0, + "sort": 450000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681500549 }, "_key": "!folders!pDtffkb0SMv1O8pL" } diff --git a/src/packs/domains/folders_Level_6_EiP5dLozOFZKIeWN.json b/src/packs/domains/folders_Level_6_EiP5dLozOFZKIeWN.json index 7017c7ce..8cdfbace 100644 --- a/src/packs/domains/folders_Level_6_EiP5dLozOFZKIeWN.json +++ b/src/packs/domains/folders_Level_6_EiP5dLozOFZKIeWN.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "EiP5dLozOFZKIeWN", "description": "", - "sort": 0, + "sort": 600000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681470475 }, "_key": "!folders!EiP5dLozOFZKIeWN" } diff --git a/src/packs/domains/folders_Level_6_FcMclsLDy86EicA6.json b/src/packs/domains/folders_Level_6_FcMclsLDy86EicA6.json index e87cbfdf..59e4094b 100644 --- a/src/packs/domains/folders_Level_6_FcMclsLDy86EicA6.json +++ b/src/packs/domains/folders_Level_6_FcMclsLDy86EicA6.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "FcMclsLDy86EicA6", "description": "", - "sort": 0, + "sort": 475000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681502395 }, "_key": "!folders!FcMclsLDy86EicA6" } diff --git a/src/packs/domains/folders_Level_6_OwsbTSWzKq2WJmQN.json b/src/packs/domains/folders_Level_6_OwsbTSWzKq2WJmQN.json index f6da2d63..2d8173ba 100644 --- a/src/packs/domains/folders_Level_6_OwsbTSWzKq2WJmQN.json +++ b/src/packs/domains/folders_Level_6_OwsbTSWzKq2WJmQN.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "OwsbTSWzKq2WJmQN", "description": "", - "sort": 0, + "sort": 475000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681562673 }, "_key": "!folders!OwsbTSWzKq2WJmQN" } diff --git a/src/packs/domains/folders_Level_6_VgADdqYn9nS9G1Us.json b/src/packs/domains/folders_Level_6_VgADdqYn9nS9G1Us.json index 82f700f7..16c445eb 100644 --- a/src/packs/domains/folders_Level_6_VgADdqYn9nS9G1Us.json +++ b/src/packs/domains/folders_Level_6_VgADdqYn9nS9G1Us.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "VgADdqYn9nS9G1Us", "description": "", - "sort": 0, + "sort": 600000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681517285 }, "_key": "!folders!VgADdqYn9nS9G1Us" } diff --git a/src/packs/domains/folders_Level_6_gqnmAgerh7HhNo7t.json b/src/packs/domains/folders_Level_6_gqnmAgerh7HhNo7t.json index fb478b05..55b84aa3 100644 --- a/src/packs/domains/folders_Level_6_gqnmAgerh7HhNo7t.json +++ b/src/packs/domains/folders_Level_6_gqnmAgerh7HhNo7t.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "gqnmAgerh7HhNo7t", "description": "", - "sort": 0, + "sort": 550000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681457358 }, "_key": "!folders!gqnmAgerh7HhNo7t" } diff --git a/src/packs/domains/folders_Level_6_nKCmeAn7ESsb4byE.json b/src/packs/domains/folders_Level_6_nKCmeAn7ESsb4byE.json index d52ef5a4..e8360bf1 100644 --- a/src/packs/domains/folders_Level_6_nKCmeAn7ESsb4byE.json +++ b/src/packs/domains/folders_Level_6_nKCmeAn7ESsb4byE.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "nKCmeAn7ESsb4byE", "description": "", - "sort": 0, + "sort": 600000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681584076 }, "_key": "!folders!nKCmeAn7ESsb4byE" } diff --git a/src/packs/domains/folders_Level_6_pYEavNqteiQepvvD.json b/src/packs/domains/folders_Level_6_pYEavNqteiQepvvD.json index ddc92a67..a63237d5 100644 --- a/src/packs/domains/folders_Level_6_pYEavNqteiQepvvD.json +++ b/src/packs/domains/folders_Level_6_pYEavNqteiQepvvD.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "pYEavNqteiQepvvD", "description": "", - "sort": 0, + "sort": 600000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681481088 }, "_key": "!folders!pYEavNqteiQepvvD" } diff --git a/src/packs/domains/folders_Level_6_u5Lq2kfC8LlDAGDC.json b/src/packs/domains/folders_Level_6_u5Lq2kfC8LlDAGDC.json index 097a0d00..8227afb8 100644 --- a/src/packs/domains/folders_Level_6_u5Lq2kfC8LlDAGDC.json +++ b/src/packs/domains/folders_Level_6_u5Lq2kfC8LlDAGDC.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "u5Lq2kfC8LlDAGDC", "description": "", - "sort": 0, + "sort": 550000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681547474 }, "_key": "!folders!u5Lq2kfC8LlDAGDC" } diff --git a/src/packs/domains/folders_Level_6_xuGz0QPNlkTOV0rV.json b/src/packs/domains/folders_Level_6_xuGz0QPNlkTOV0rV.json index c78eae18..4b94f340 100644 --- a/src/packs/domains/folders_Level_6_xuGz0QPNlkTOV0rV.json +++ b/src/packs/domains/folders_Level_6_xuGz0QPNlkTOV0rV.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "xuGz0QPNlkTOV0rV", "description": "", - "sort": 0, + "sort": 196875, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681533952 }, "_key": "!folders!xuGz0QPNlkTOV0rV" } diff --git a/src/packs/domains/folders_Level_7_HAGbPLHwm0UozDeG.json b/src/packs/domains/folders_Level_7_HAGbPLHwm0UozDeG.json index e5126eef..f120077d 100644 --- a/src/packs/domains/folders_Level_7_HAGbPLHwm0UozDeG.json +++ b/src/packs/domains/folders_Level_7_HAGbPLHwm0UozDeG.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "HAGbPLHwm0UozDeG", "description": "", - "sort": 0, + "sort": 700000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681470475 }, "_key": "!folders!HAGbPLHwm0UozDeG" } diff --git a/src/packs/domains/folders_Level_7_ML2JusN36oJoR8QA.json b/src/packs/domains/folders_Level_7_ML2JusN36oJoR8QA.json index 790f4afb..2850c4a7 100644 --- a/src/packs/domains/folders_Level_7_ML2JusN36oJoR8QA.json +++ b/src/packs/domains/folders_Level_7_ML2JusN36oJoR8QA.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "ML2JusN36oJoR8QA", "description": "", - "sort": 0, + "sort": 198438, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681534831 }, "_key": "!folders!ML2JusN36oJoR8QA" } diff --git a/src/packs/domains/folders_Level_7_W81LnTWzwmoaycTl.json b/src/packs/domains/folders_Level_7_W81LnTWzwmoaycTl.json index c9e73a93..1f5dacd2 100644 --- a/src/packs/domains/folders_Level_7_W81LnTWzwmoaycTl.json +++ b/src/packs/domains/folders_Level_7_W81LnTWzwmoaycTl.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "W81LnTWzwmoaycTl", "description": "", - "sort": 0, + "sort": 650000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681518169 }, "_key": "!folders!W81LnTWzwmoaycTl" } diff --git a/src/packs/domains/folders_Level_7_Z6oglw8LIOrtBcN6.json b/src/packs/domains/folders_Level_7_Z6oglw8LIOrtBcN6.json index 2c0c01ce..1705b312 100644 --- a/src/packs/domains/folders_Level_7_Z6oglw8LIOrtBcN6.json +++ b/src/packs/domains/folders_Level_7_Z6oglw8LIOrtBcN6.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "Z6oglw8LIOrtBcN6", "description": "", - "sort": 0, + "sort": 487500, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681563535 }, "_key": "!folders!Z6oglw8LIOrtBcN6" } diff --git a/src/packs/domains/folders_Level_7_bCjkysrofWPiZqNh.json b/src/packs/domains/folders_Level_7_bCjkysrofWPiZqNh.json index 19ed1f98..a472a860 100644 --- a/src/packs/domains/folders_Level_7_bCjkysrofWPiZqNh.json +++ b/src/packs/domains/folders_Level_7_bCjkysrofWPiZqNh.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "bCjkysrofWPiZqNh", "description": "", - "sort": 0, + "sort": 575000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681458374 }, "_key": "!folders!bCjkysrofWPiZqNh" } diff --git a/src/packs/domains/folders_Level_7_gEVGjjPrjqxxZkb5.json b/src/packs/domains/folders_Level_7_gEVGjjPrjqxxZkb5.json index 68c2f05b..7cc2eb64 100644 --- a/src/packs/domains/folders_Level_7_gEVGjjPrjqxxZkb5.json +++ b/src/packs/domains/folders_Level_7_gEVGjjPrjqxxZkb5.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "gEVGjjPrjqxxZkb5", "description": "", - "sort": 0, + "sort": 575000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681548701 }, "_key": "!folders!gEVGjjPrjqxxZkb5" } diff --git a/src/packs/domains/folders_Level_7_hh2vkggcAQ0QUE6C.json b/src/packs/domains/folders_Level_7_hh2vkggcAQ0QUE6C.json index 3bd611ed..80495f9e 100644 --- a/src/packs/domains/folders_Level_7_hh2vkggcAQ0QUE6C.json +++ b/src/packs/domains/folders_Level_7_hh2vkggcAQ0QUE6C.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "hh2vkggcAQ0QUE6C", "description": "", - "sort": 0, + "sort": 487500, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681503815 }, "_key": "!folders!hh2vkggcAQ0QUE6C" } diff --git a/src/packs/domains/folders_Level_7_i5iDLXMZLc0ckWI5.json b/src/packs/domains/folders_Level_7_i5iDLXMZLc0ckWI5.json index d0893613..cd1ca369 100644 --- a/src/packs/domains/folders_Level_7_i5iDLXMZLc0ckWI5.json +++ b/src/packs/domains/folders_Level_7_i5iDLXMZLc0ckWI5.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "i5iDLXMZLc0ckWI5", "description": "", - "sort": 0, + "sort": 650000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681482227 }, "_key": "!folders!i5iDLXMZLc0ckWI5" } diff --git a/src/packs/domains/folders_Level_7_kj3gwg5bmCqwFYze.json b/src/packs/domains/folders_Level_7_kj3gwg5bmCqwFYze.json index 83a04b1f..86e95007 100644 --- a/src/packs/domains/folders_Level_7_kj3gwg5bmCqwFYze.json +++ b/src/packs/domains/folders_Level_7_kj3gwg5bmCqwFYze.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "kj3gwg5bmCqwFYze", "description": "", - "sort": 0, + "sort": 700000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681584076 }, "_key": "!folders!kj3gwg5bmCqwFYze" } diff --git a/src/packs/domains/folders_Level_8_7O1tTswJMNdPgLsx.json b/src/packs/domains/folders_Level_8_7O1tTswJMNdPgLsx.json index b82cf2e4..cc14a272 100644 --- a/src/packs/domains/folders_Level_8_7O1tTswJMNdPgLsx.json +++ b/src/packs/domains/folders_Level_8_7O1tTswJMNdPgLsx.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "7O1tTswJMNdPgLsx", "description": "", - "sort": 0, + "sort": 700000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681517285 }, "_key": "!folders!7O1tTswJMNdPgLsx" } diff --git a/src/packs/domains/folders_Level_8_8bWpGblWODdf8mDR.json b/src/packs/domains/folders_Level_8_8bWpGblWODdf8mDR.json index ff26cb25..fe6135bf 100644 --- a/src/packs/domains/folders_Level_8_8bWpGblWODdf8mDR.json +++ b/src/packs/domains/folders_Level_8_8bWpGblWODdf8mDR.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "8bWpGblWODdf8mDR", "description": "", - "sort": 0, + "sort": 500000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681499124 }, "_key": "!folders!8bWpGblWODdf8mDR" } diff --git a/src/packs/domains/folders_Level_8_A00z8Q8B3aKApKzI.json b/src/packs/domains/folders_Level_8_A00z8Q8B3aKApKzI.json index cababd7b..6a82a99d 100644 --- a/src/packs/domains/folders_Level_8_A00z8Q8B3aKApKzI.json +++ b/src/packs/domains/folders_Level_8_A00z8Q8B3aKApKzI.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "A00z8Q8B3aKApKzI", "description": "", - "sort": 0, + "sort": 500000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681560360 }, "_key": "!folders!A00z8Q8B3aKApKzI" } diff --git a/src/packs/domains/folders_Level_8_FUzQxkv4gFc46SIs.json b/src/packs/domains/folders_Level_8_FUzQxkv4gFc46SIs.json index c3d2c6dd..64733042 100644 --- a/src/packs/domains/folders_Level_8_FUzQxkv4gFc46SIs.json +++ b/src/packs/domains/folders_Level_8_FUzQxkv4gFc46SIs.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "FUzQxkv4gFc46SIs", "description": "", - "sort": 0, + "sort": 800000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681584076 }, "_key": "!folders!FUzQxkv4gFc46SIs" } diff --git a/src/packs/domains/folders_Level_8_KmaX6wNBLzkFevaG.json b/src/packs/domains/folders_Level_8_KmaX6wNBLzkFevaG.json index 0eff3653..ca233ba0 100644 --- a/src/packs/domains/folders_Level_8_KmaX6wNBLzkFevaG.json +++ b/src/packs/domains/folders_Level_8_KmaX6wNBLzkFevaG.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "KmaX6wNBLzkFevaG", "description": "", - "sort": 0, + "sort": 600000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681455565 }, "_key": "!folders!KmaX6wNBLzkFevaG" } diff --git a/src/packs/domains/folders_Level_8_me7ywrVh38j6T8Sm.json b/src/packs/domains/folders_Level_8_me7ywrVh38j6T8Sm.json index 73ef44fa..8da0084f 100644 --- a/src/packs/domains/folders_Level_8_me7ywrVh38j6T8Sm.json +++ b/src/packs/domains/folders_Level_8_me7ywrVh38j6T8Sm.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "me7ywrVh38j6T8Sm", "description": "", - "sort": 0, + "sort": 800000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681470475 }, "_key": "!folders!me7ywrVh38j6T8Sm" } diff --git a/src/packs/domains/folders_Level_8_n7pgTBYSItMzCX0s.json b/src/packs/domains/folders_Level_8_n7pgTBYSItMzCX0s.json index a60bf86c..dd95882c 100644 --- a/src/packs/domains/folders_Level_8_n7pgTBYSItMzCX0s.json +++ b/src/packs/domains/folders_Level_8_n7pgTBYSItMzCX0s.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "n7pgTBYSItMzCX0s", "description": "", - "sort": 0, + "sort": 750000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681483315 }, "_key": "!folders!n7pgTBYSItMzCX0s" } diff --git a/src/packs/domains/folders_Level_8_qY4Zqc1Ch6p317uK.json b/src/packs/domains/folders_Level_8_qY4Zqc1Ch6p317uK.json index 5bb45c09..f33373f3 100644 --- a/src/packs/domains/folders_Level_8_qY4Zqc1Ch6p317uK.json +++ b/src/packs/domains/folders_Level_8_qY4Zqc1Ch6p317uK.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "qY4Zqc1Ch6p317uK", "description": "", - "sort": 0, + "sort": 587500, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681549490 }, "_key": "!folders!qY4Zqc1Ch6p317uK" } diff --git a/src/packs/domains/folders_Level_8_taM81THa8h6Bv2Xa.json b/src/packs/domains/folders_Level_8_taM81THa8h6Bv2Xa.json index e07ca233..dfb9779f 100644 --- a/src/packs/domains/folders_Level_8_taM81THa8h6Bv2Xa.json +++ b/src/packs/domains/folders_Level_8_taM81THa8h6Bv2Xa.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "taM81THa8h6Bv2Xa", "description": "", - "sort": 0, + "sort": 199219, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681535744 }, "_key": "!folders!taM81THa8h6Bv2Xa" } diff --git a/src/packs/domains/folders_Level_9_2rqOUxEglhhPKk2j.json b/src/packs/domains/folders_Level_9_2rqOUxEglhhPKk2j.json index 5cf348c0..6e22743f 100644 --- a/src/packs/domains/folders_Level_9_2rqOUxEglhhPKk2j.json +++ b/src/packs/domains/folders_Level_9_2rqOUxEglhhPKk2j.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "2rqOUxEglhhPKk2j", "description": "", - "sort": 0, + "sort": 200000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681523539 }, "_key": "!folders!2rqOUxEglhhPKk2j" } diff --git a/src/packs/domains/folders_Level_9_8DOVMjTtZFKtwX4p.json b/src/packs/domains/folders_Level_9_8DOVMjTtZFKtwX4p.json index 6b1aa18d..c3456341 100644 --- a/src/packs/domains/folders_Level_9_8DOVMjTtZFKtwX4p.json +++ b/src/packs/domains/folders_Level_9_8DOVMjTtZFKtwX4p.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "8DOVMjTtZFKtwX4p", "description": "", - "sort": 0, + "sort": 900000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681584076 }, "_key": "!folders!8DOVMjTtZFKtwX4p" } diff --git a/src/packs/domains/folders_Level_9_KwZYrsSUYnHiNtPl.json b/src/packs/domains/folders_Level_9_KwZYrsSUYnHiNtPl.json index a431dbc3..73b5ab46 100644 --- a/src/packs/domains/folders_Level_9_KwZYrsSUYnHiNtPl.json +++ b/src/packs/domains/folders_Level_9_KwZYrsSUYnHiNtPl.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "KwZYrsSUYnHiNtPl", "description": "", - "sort": 0, + "sort": 600000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681505029 }, "_key": "!folders!KwZYrsSUYnHiNtPl" } diff --git a/src/packs/domains/folders_Level_9_QYdeGsmVYIF34kZR.json b/src/packs/domains/folders_Level_9_QYdeGsmVYIF34kZR.json index e4da2c26..75671f95 100644 --- a/src/packs/domains/folders_Level_9_QYdeGsmVYIF34kZR.json +++ b/src/packs/domains/folders_Level_9_QYdeGsmVYIF34kZR.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "QYdeGsmVYIF34kZR", "description": "", - "sort": 0, + "sort": 900000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681470475 }, "_key": "!folders!QYdeGsmVYIF34kZR" } diff --git a/src/packs/domains/folders_Level_9_R5afi5bhq9ccnYY2.json b/src/packs/domains/folders_Level_9_R5afi5bhq9ccnYY2.json index a197a2bd..cbf3f378 100644 --- a/src/packs/domains/folders_Level_9_R5afi5bhq9ccnYY2.json +++ b/src/packs/domains/folders_Level_9_R5afi5bhq9ccnYY2.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "R5afi5bhq9ccnYY2", "description": "", - "sort": 0, + "sort": 600000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681545540 }, "_key": "!folders!R5afi5bhq9ccnYY2" } diff --git a/src/packs/domains/folders_Level_9_eg2vM8j9xhya9Rwa.json b/src/packs/domains/folders_Level_9_eg2vM8j9xhya9Rwa.json index 90316b38..5b63ab8c 100644 --- a/src/packs/domains/folders_Level_9_eg2vM8j9xhya9Rwa.json +++ b/src/packs/domains/folders_Level_9_eg2vM8j9xhya9Rwa.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "eg2vM8j9xhya9Rwa", "description": "", - "sort": 0, + "sort": 800000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681481088 }, "_key": "!folders!eg2vM8j9xhya9Rwa" } diff --git a/src/packs/domains/folders_Level_9_fucNnucgoUjbzvcA.json b/src/packs/domains/folders_Level_9_fucNnucgoUjbzvcA.json index 2ac8049c..d55c92ce 100644 --- a/src/packs/domains/folders_Level_9_fucNnucgoUjbzvcA.json +++ b/src/packs/domains/folders_Level_9_fucNnucgoUjbzvcA.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "fucNnucgoUjbzvcA", "description": "", - "sort": 0, + "sort": 800000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681455565 }, "_key": "!folders!fucNnucgoUjbzvcA" } diff --git a/src/packs/domains/folders_Level_9_sGCKwmomutMTv0Xs.json b/src/packs/domains/folders_Level_9_sGCKwmomutMTv0Xs.json index b74e3af2..b36fa92e 100644 --- a/src/packs/domains/folders_Level_9_sGCKwmomutMTv0Xs.json +++ b/src/packs/domains/folders_Level_9_sGCKwmomutMTv0Xs.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "sGCKwmomutMTv0Xs", "description": "", - "sort": 0, + "sort": 900000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681560360 }, "_key": "!folders!sGCKwmomutMTv0Xs" } diff --git a/src/packs/domains/folders_Level_9_yFcD1LOM3xKbkNYl.json b/src/packs/domains/folders_Level_9_yFcD1LOM3xKbkNYl.json index 5657860e..ef98abd9 100644 --- a/src/packs/domains/folders_Level_9_yFcD1LOM3xKbkNYl.json +++ b/src/packs/domains/folders_Level_9_yFcD1LOM3xKbkNYl.json @@ -6,16 +6,17 @@ "sorting": "a", "_id": "yFcD1LOM3xKbkNYl", "description": "", - "sort": 0, + "sort": 900000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "YNJ4HgHtFrTI89mx", + "modifiedTime": 1752681517285 }, "_key": "!folders!yFcD1LOM3xKbkNYl" } diff --git a/src/packs/domains/folders_Midnight_tgwSE1t5B0Ka10Xh.json b/src/packs/domains/folders_Midnight_tgwSE1t5B0Ka10Xh.json index 0efe962c..c4c4df1a 100644 --- a/src/packs/domains/folders_Midnight_tgwSE1t5B0Ka10Xh.json +++ b/src/packs/domains/folders_Midnight_tgwSE1t5B0Ka10Xh.json @@ -3,7 +3,7 @@ "folder": null, "name": "Midnight", "color": "#26252b", - "sorting": "a", + "sorting": "m", "_id": "tgwSE1t5B0Ka10Xh", "description": "", "sort": 600000, @@ -12,12 +12,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1748717122329, - "modifiedTime": 1748717766758, - "lastModifiedBy": "WafZqd6qLGpBRGTt" + "modifiedTime": 1752681436562, + "lastModifiedBy": "YNJ4HgHtFrTI89mx" }, "_key": "!folders!tgwSE1t5B0Ka10Xh" } diff --git a/src/packs/domains/folders_Sage_io1DZ9MMMDfuNf8b.json b/src/packs/domains/folders_Sage_io1DZ9MMMDfuNf8b.json index 7b7e9072..da55393e 100644 --- a/src/packs/domains/folders_Sage_io1DZ9MMMDfuNf8b.json +++ b/src/packs/domains/folders_Sage_io1DZ9MMMDfuNf8b.json @@ -3,7 +3,7 @@ "folder": null, "name": "Sage", "color": "#0a5932", - "sorting": "a", + "sorting": "m", "_id": "io1DZ9MMMDfuNf8b", "description": "", "sort": 700000, @@ -12,12 +12,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1748717128125, - "modifiedTime": 1748717766758, - "lastModifiedBy": "WafZqd6qLGpBRGTt" + "modifiedTime": 1752681438783, + "lastModifiedBy": "YNJ4HgHtFrTI89mx" }, "_key": "!folders!io1DZ9MMMDfuNf8b" } diff --git a/src/packs/domains/folders_Splendor_TL1TutmbeCVJ06nR.json b/src/packs/domains/folders_Splendor_TL1TutmbeCVJ06nR.json index 570b97ff..c0870ecf 100644 --- a/src/packs/domains/folders_Splendor_TL1TutmbeCVJ06nR.json +++ b/src/packs/domains/folders_Splendor_TL1TutmbeCVJ06nR.json @@ -3,7 +3,7 @@ "folder": null, "name": "Splendor", "color": "#c79b44", - "sorting": "a", + "sorting": "m", "_id": "TL1TutmbeCVJ06nR", "description": "", "sort": 800000, @@ -12,12 +12,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1748717133557, - "modifiedTime": 1748717766758, - "lastModifiedBy": "WafZqd6qLGpBRGTt" + "modifiedTime": 1752681441081, + "lastModifiedBy": "YNJ4HgHtFrTI89mx" }, "_key": "!folders!TL1TutmbeCVJ06nR" } diff --git a/src/packs/domains/folders_Valor_yPVeShe47ETIqs9q.json b/src/packs/domains/folders_Valor_yPVeShe47ETIqs9q.json index 7c8f426e..0a65d51f 100644 --- a/src/packs/domains/folders_Valor_yPVeShe47ETIqs9q.json +++ b/src/packs/domains/folders_Valor_yPVeShe47ETIqs9q.json @@ -3,7 +3,7 @@ "folder": null, "name": "Valor", "color": "#b07229", - "sorting": "a", + "sorting": "m", "_id": "yPVeShe47ETIqs9q", "description": "", "sort": 900000, @@ -12,12 +12,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.344", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1748717138700, - "modifiedTime": 1748717766758, - "lastModifiedBy": "WafZqd6qLGpBRGTt" + "modifiedTime": 1752681443619, + "lastModifiedBy": "YNJ4HgHtFrTI89mx" }, "_key": "!folders!yPVeShe47ETIqs9q" } diff --git a/src/packs/environments/folders_Tier_1_GQ0VnOLrKBIHR6Us.json b/src/packs/environments/folders_Tier_1_GQ0VnOLrKBIHR6Us.json new file mode 100644 index 00000000..04e5dc10 --- /dev/null +++ b/src/packs/environments/folders_Tier_1_GQ0VnOLrKBIHR6Us.json @@ -0,0 +1,23 @@ +{ + "type": "Item", + "folder": null, + "name": "Tier 1", + "color": null, + "sorting": "a", + "_id": "GQ0VnOLrKBIHR6Us", + "description": "", + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752684241225, + "modifiedTime": 1752684241225, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_key": "!folders!GQ0VnOLrKBIHR6Us" +} diff --git a/src/packs/environments/folders_Tier_2_XMeecO3IRvu5ck6F.json b/src/packs/environments/folders_Tier_2_XMeecO3IRvu5ck6F.json new file mode 100644 index 00000000..8457c30f --- /dev/null +++ b/src/packs/environments/folders_Tier_2_XMeecO3IRvu5ck6F.json @@ -0,0 +1,23 @@ +{ + "type": "Item", + "folder": null, + "name": "Tier 2", + "color": null, + "sorting": "a", + "_id": "XMeecO3IRvu5ck6F", + "description": "", + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752684244562, + "modifiedTime": 1752684244562, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_key": "!folders!XMeecO3IRvu5ck6F" +} diff --git a/src/packs/environments/folders_Tier_3_MfrIkJK12PAEfbPL.json b/src/packs/environments/folders_Tier_3_MfrIkJK12PAEfbPL.json new file mode 100644 index 00000000..3c0fd3b7 --- /dev/null +++ b/src/packs/environments/folders_Tier_3_MfrIkJK12PAEfbPL.json @@ -0,0 +1,23 @@ +{ + "type": "Item", + "folder": null, + "name": "Tier 3", + "color": null, + "sorting": "a", + "_id": "MfrIkJK12PAEfbPL", + "description": "", + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752684247120, + "modifiedTime": 1752684247120, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_key": "!folders!MfrIkJK12PAEfbPL" +} diff --git a/src/packs/environments/folders_Tier_4_IKumu5HTLqONLYqb.json b/src/packs/environments/folders_Tier_4_IKumu5HTLqONLYqb.json new file mode 100644 index 00000000..66442727 --- /dev/null +++ b/src/packs/environments/folders_Tier_4_IKumu5HTLqONLYqb.json @@ -0,0 +1,23 @@ +{ + "type": "Item", + "folder": null, + "name": "Tier 4", + "color": null, + "sorting": "a", + "_id": "IKumu5HTLqONLYqb", + "description": "", + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752684249751, + "modifiedTime": 1752684249751, + "lastModifiedBy": "k0gmQFlvrPvlTtbh" + }, + "_key": "!folders!IKumu5HTLqONLYqb" +} diff --git a/src/packs/items/armors/armor_Advanced_Chainmail_Armor_CsZ4X1gMhKrfK0B8.json b/src/packs/items/armors/armor_Advanced_Chainmail_Armor_CsZ4X1gMhKrfK0B8.json deleted file mode 100644 index 9edf9f4b..00000000 --- a/src/packs/items/armors/armor_Advanced_Chainmail_Armor_CsZ4X1gMhKrfK0B8.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Advanced Chainmail Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_3/advanced_chainmail_armor.png", - "system": { - "baseScore": 6, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "heavy", - "baseThresholds": { - "major": 13, - "severe": 31 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "rkSdPu86ybLz6aKF", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717648531, - "modifiedTime": 1748717654084, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "CsZ4X1gMhKrfK0B8", - "sort": 100000, - "_key": "!items!CsZ4X1gMhKrfK0B8" -} diff --git a/src/packs/items/armors/armor_Advanced_Full_Plate_Armor_1mJ37VQGgO7nGyaq.json b/src/packs/items/armors/armor_Advanced_Full_Plate_Armor_1mJ37VQGgO7nGyaq.json deleted file mode 100644 index 6ea43b45..00000000 --- a/src/packs/items/armors/armor_Advanced_Full_Plate_Armor_1mJ37VQGgO7nGyaq.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Full Plate Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_3/advanced_full_plate_armor.png", - "system": { - "baseScore": 6, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "baseThresholds": { - "major": 15, - "severe": 35 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "rkSdPu86ybLz6aKF", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717650229, - "modifiedTime": 1748717654084, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "1mJ37VQGgO7nGyaq", - "sort": 200000, - "_key": "!items!1mJ37VQGgO7nGyaq" -} diff --git a/src/packs/items/armors/armor_Advanced_Gambeson_Armor_0BAULrYPaX7tcoA4.json b/src/packs/items/armors/armor_Advanced_Gambeson_Armor_0BAULrYPaX7tcoA4.json deleted file mode 100644 index 6a9d1b52..00000000 --- a/src/packs/items/armors/armor_Advanced_Gambeson_Armor_0BAULrYPaX7tcoA4.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Gambeson Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_3/advanced_gambeson_armor.png", - "system": { - "baseScore": 5, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "baseThresholds": { - "major": 9, - "severe": 23 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "rkSdPu86ybLz6aKF", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717651189, - "modifiedTime": 1748717654084, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "0BAULrYPaX7tcoA4", - "sort": 600000, - "_key": "!items!0BAULrYPaX7tcoA4" -} diff --git a/src/packs/items/armors/armor_Advanced_Leather_Armor_wWecy3cm3cZzuG0o.json b/src/packs/items/armors/armor_Advanced_Leather_Armor_wWecy3cm3cZzuG0o.json deleted file mode 100644 index 97da18d8..00000000 --- a/src/packs/items/armors/armor_Advanced_Leather_Armor_wWecy3cm3cZzuG0o.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Advanced Leather Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_3/advanced_leather_armor.png", - "system": { - "baseScore": 5, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "", - "baseThresholds": { - "major": 11, - "severe": 27 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "rkSdPu86ybLz6aKF", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717652152, - "modifiedTime": 1748717654084, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "wWecy3cm3cZzuG0o", - "sort": 300000, - "_key": "!items!wWecy3cm3cZzuG0o" -} diff --git a/src/packs/items/armors/armor_Bellamoi_Fine_Armor_scTgxT4uMylqtoW0.json b/src/packs/items/armors/armor_Bellamoi_Fine_Armor_scTgxT4uMylqtoW0.json deleted file mode 100644 index 8ab8d188..00000000 --- a/src/packs/items/armors/armor_Bellamoi_Fine_Armor_scTgxT4uMylqtoW0.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Bellamoi Fine Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_3/bellamoi_fine_armor.png", - "system": { - "baseScore": 5, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "gilded", - "baseThresholds": { - "major": 11, - "severe": 27 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "rkSdPu86ybLz6aKF", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717653091, - "modifiedTime": 1748717654084, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "scTgxT4uMylqtoW0", - "sort": 500000, - "_key": "!items!scTgxT4uMylqtoW0" -} diff --git a/src/packs/items/armors/armor_Bladefare_Armor_kYj9YqqWEWTk7Of4.json b/src/packs/items/armors/armor_Bladefare_Armor_kYj9YqqWEWTk7Of4.json deleted file mode 100644 index 31d4d2c0..00000000 --- a/src/packs/items/armors/armor_Bladefare_Armor_kYj9YqqWEWTk7Of4.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Bladefare Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_3/bladefare_armor.png", - "system": { - "baseScore": 6, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "physical", - "baseThresholds": { - "major": 16, - "severe": 39 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "rkSdPu86ybLz6aKF", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717654075, - "modifiedTime": 1748717654084, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "kYj9YqqWEWTk7Of4", - "sort": 400000, - "_key": "!items!kYj9YqqWEWTk7Of4" -} diff --git a/src/packs/items/armors/armor_Chainmail_Armor_cihoaJXe1YfLaz60.json b/src/packs/items/armors/armor_Chainmail_Armor_cihoaJXe1YfLaz60.json deleted file mode 100644 index 398885dc..00000000 --- a/src/packs/items/armors/armor_Chainmail_Armor_cihoaJXe1YfLaz60.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Chainmail Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_1/chainmail_armor.png", - "system": { - "baseScore": 4, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "heavy", - "baseThresholds": { - "major": 7, - "severe": 15 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "h4QgrovjVZ1oee7O", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717625340, - "modifiedTime": 1748717625340, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "cihoaJXe1YfLaz60", - "sort": 0, - "_key": "!items!cihoaJXe1YfLaz60" -} diff --git a/src/packs/items/armors/armor_Channeling_Armor_plRn94qJi7WF2P2O.json b/src/packs/items/armors/armor_Channeling_Armor_plRn94qJi7WF2P2O.json deleted file mode 100644 index 8a334adb..00000000 --- a/src/packs/items/armors/armor_Channeling_Armor_plRn94qJi7WF2P2O.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Channeling Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_4/channeling_armor.png", - "system": { - "baseScore": 5, - "marks": { - "max": 6, - "value": 0 - }, - "baseThresholds": { - "major": 13, - "severe": 36 - }, - "description": "", - "feature": "channeling", - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "Hbjp64XzuyJs2hOs", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717665846, - "modifiedTime": 1748717674251, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "plRn94qJi7WF2P2O", - "sort": 500000, - "_key": "!items!plRn94qJi7WF2P2O" -} diff --git a/src/packs/items/armors/armor_Dragonscale_Armor_RL1AKA4VNuRnYiR3.json b/src/packs/items/armors/armor_Dragonscale_Armor_RL1AKA4VNuRnYiR3.json deleted file mode 100644 index e680afbe..00000000 --- a/src/packs/items/armors/armor_Dragonscale_Armor_RL1AKA4VNuRnYiR3.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Dragonscale Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_3/dragonscale_armor.png", - "system": { - "baseScore": 5, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "impenetrable", - "baseThresholds": { - "major": 11, - "severe": 27 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "rkSdPu86ybLz6aKF", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717655130, - "modifiedTime": 1748717655130, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "RL1AKA4VNuRnYiR3", - "sort": 0, - "_key": "!items!RL1AKA4VNuRnYiR3" -} diff --git a/src/packs/items/armors/armor_Dunamis_Silkchain_oTpJi31bKq4rut07.json b/src/packs/items/armors/armor_Dunamis_Silkchain_oTpJi31bKq4rut07.json deleted file mode 100644 index 959bfdaa..00000000 --- a/src/packs/items/armors/armor_Dunamis_Silkchain_oTpJi31bKq4rut07.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Dunamis Silkchain", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_4/dunamis_silkchain.png", - "system": { - "baseScore": 7, - "marks": { - "max": 6, - "value": 0 - }, - "baseThresholds": { - "major": 13, - "severe": 36 - }, - "description": "", - "feature": "timeslowing", - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "Hbjp64XzuyJs2hOs", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717666804, - "modifiedTime": 1748717674251, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "oTpJi31bKq4rut07", - "sort": 600000, - "_key": "!items!oTpJi31bKq4rut07" -} diff --git a/src/packs/items/armors/armor_Elundrian_Chain_Armor_ShMNcz0KBsToMC44.json b/src/packs/items/armors/armor_Elundrian_Chain_Armor_ShMNcz0KBsToMC44.json deleted file mode 100644 index 906004a5..00000000 --- a/src/packs/items/armors/armor_Elundrian_Chain_Armor_ShMNcz0KBsToMC44.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Elundrian Chain Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_2/elundrian_chain_armor.png", - "system": { - "baseScore": 4, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "warded", - "baseThresholds": { - "major": 9, - "severe": 21 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "hLn0v6ov6KuFgptu", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717633727, - "modifiedTime": 1748717641884, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "ShMNcz0KBsToMC44", - "sort": 600000, - "_key": "!items!ShMNcz0KBsToMC44" -} diff --git a/src/packs/items/armors/armor_Emberwoven_Armor_8sUPsWMhjQprt8yI.json b/src/packs/items/armors/armor_Emberwoven_Armor_8sUPsWMhjQprt8yI.json deleted file mode 100644 index 1467d1b5..00000000 --- a/src/packs/items/armors/armor_Emberwoven_Armor_8sUPsWMhjQprt8yI.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Emberwoven Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_4/emberwoven_armor.png", - "system": { - "baseScore": 6, - "marks": { - "max": 6, - "value": 0 - }, - "baseThresholds": { - "major": 13, - "severe": 36 - }, - "description": "", - "feature": "burning", - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "Hbjp64XzuyJs2hOs", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717667767, - "modifiedTime": 1748717674251, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "8sUPsWMhjQprt8yI", - "sort": 700000, - "_key": "!items!8sUPsWMhjQprt8yI" -} diff --git a/src/packs/items/armors/armor_Full_Fortified_Armor_mb5OFsUSlPEPb4wU.json b/src/packs/items/armors/armor_Full_Fortified_Armor_mb5OFsUSlPEPb4wU.json deleted file mode 100644 index fbd1b90c..00000000 --- a/src/packs/items/armors/armor_Full_Fortified_Armor_mb5OFsUSlPEPb4wU.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Full Fortified Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_4/full_fortified_armor.png", - "system": { - "baseScore": 4, - "marks": { - "max": 6, - "value": 0 - }, - "baseThresholds": { - "major": 15, - "severe": 40 - }, - "description": "", - "feature": "", - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "Hbjp64XzuyJs2hOs", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717668860, - "modifiedTime": 1748717674251, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "mb5OFsUSlPEPb4wU", - "sort": 800000, - "_key": "!items!mb5OFsUSlPEPb4wU" -} diff --git a/src/packs/items/armors/armor_Full_Plate_Armor_Vc3mfssiGZFQFuAf.json b/src/packs/items/armors/armor_Full_Plate_Armor_Vc3mfssiGZFQFuAf.json deleted file mode 100644 index 6db29aa2..00000000 --- a/src/packs/items/armors/armor_Full_Plate_Armor_Vc3mfssiGZFQFuAf.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Full Plate Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_1/full_plate_armor.png", - "system": { - "baseScore": 4, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "baseThresholds": { - "major": 8, - "severe": 17 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "h4QgrovjVZ1oee7O", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717626142, - "modifiedTime": 1748717626142, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "Vc3mfssiGZFQFuAf", - "sort": 0, - "_key": "!items!Vc3mfssiGZFQFuAf" -} diff --git a/src/packs/items/armors/armor_Gambeson_Armor_kGm7XO3LZDZWvSXq.json b/src/packs/items/armors/armor_Gambeson_Armor_kGm7XO3LZDZWvSXq.json deleted file mode 100644 index 36ab1dcf..00000000 --- a/src/packs/items/armors/armor_Gambeson_Armor_kGm7XO3LZDZWvSXq.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Gambeson Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_1/gambeson_armor.png", - "system": { - "baseScore": 3, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "baseThresholds": { - "major": 5, - "severe": 11 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "h4QgrovjVZ1oee7O", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717627046, - "modifiedTime": 1748717627052, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "kGm7XO3LZDZWvSXq", - "sort": 100000, - "_key": "!items!kGm7XO3LZDZWvSXq" -} diff --git a/src/packs/items/armors/armor_Harrowbone_Armor_uPpGA468Zi8TSQCd.json b/src/packs/items/armors/armor_Harrowbone_Armor_uPpGA468Zi8TSQCd.json deleted file mode 100644 index bf400295..00000000 --- a/src/packs/items/armors/armor_Harrowbone_Armor_uPpGA468Zi8TSQCd.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Harrowbone Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_2/harrowbone_armor.png", - "system": { - "baseScore": 4, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "baseThresholds": { - "major": 9, - "severe": 21 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "hLn0v6ov6KuFgptu", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717634731, - "modifiedTime": 1748717641884, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "uPpGA468Zi8TSQCd", - "sort": 700000, - "_key": "!items!uPpGA468Zi8TSQCd" -} diff --git a/src/packs/items/armors/armor_Improved_Chainmail_Armor_f0EfsoCmlg4cTIL1.json b/src/packs/items/armors/armor_Improved_Chainmail_Armor_f0EfsoCmlg4cTIL1.json deleted file mode 100644 index 623d1931..00000000 --- a/src/packs/items/armors/armor_Improved_Chainmail_Armor_f0EfsoCmlg4cTIL1.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Improved Chainmail Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_2/improved_chainmail_armor.png", - "system": { - "baseScore": 5, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "heavy", - "baseThresholds": { - "major": 11, - "severe": 24 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "hLn0v6ov6KuFgptu", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717635822, - "modifiedTime": 1748717641884, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "f0EfsoCmlg4cTIL1", - "sort": 900000, - "_key": "!items!f0EfsoCmlg4cTIL1" -} diff --git a/src/packs/items/armors/armor_Improved_Full_Plate_Armor_nHcz1Ed7FXokdeyu.json b/src/packs/items/armors/armor_Improved_Full_Plate_Armor_nHcz1Ed7FXokdeyu.json deleted file mode 100644 index a76b60eb..00000000 --- a/src/packs/items/armors/armor_Improved_Full_Plate_Armor_nHcz1Ed7FXokdeyu.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Full Plate Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_2/improved_full_plate_armor.png", - "system": { - "baseScore": 5, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "baseThresholds": { - "major": 13, - "severe": 28 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "hLn0v6ov6KuFgptu", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717636849, - "modifiedTime": 1748717641884, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "nHcz1Ed7FXokdeyu", - "sort": 800000, - "_key": "!items!nHcz1Ed7FXokdeyu" -} diff --git a/src/packs/items/armors/armor_Improved_Gambeson_Armor_dC5XHTRtqQvuTMef.json b/src/packs/items/armors/armor_Improved_Gambeson_Armor_dC5XHTRtqQvuTMef.json deleted file mode 100644 index 3e7b258d..00000000 --- a/src/packs/items/armors/armor_Improved_Gambeson_Armor_dC5XHTRtqQvuTMef.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Gambeson Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_2/improved_gambeson_armor.png", - "system": { - "baseScore": 4, - "marks": { - "max": 6, - "value": 0 - }, - "description": "

Flexible: +1 to Evasion

", - "baseThresholds": { - "major": 7, - "severe": 16 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "hLn0v6ov6KuFgptu", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717637819, - "modifiedTime": 1748717641884, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "dC5XHTRtqQvuTMef", - "sort": 100000, - "_key": "!items!dC5XHTRtqQvuTMef" -} diff --git a/src/packs/items/armors/armor_Improved_Leather_Armor_mQJ55Nd8ugzjGvWl.json b/src/packs/items/armors/armor_Improved_Leather_Armor_mQJ55Nd8ugzjGvWl.json deleted file mode 100644 index 42f32701..00000000 --- a/src/packs/items/armors/armor_Improved_Leather_Armor_mQJ55Nd8ugzjGvWl.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Improved Leather Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_2/improved_leather_armor.png", - "system": { - "baseScore": 4, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "", - "baseThresholds": { - "major": 9, - "severe": 20 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "hLn0v6ov6KuFgptu", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717638846, - "modifiedTime": 1748717641884, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "mQJ55Nd8ugzjGvWl", - "sort": 200000, - "_key": "!items!mQJ55Nd8ugzjGvWl" -} diff --git a/src/packs/items/armors/armor_Irontree_Breastplate_Armor_E6Ri6nwMtVOBedCy.json b/src/packs/items/armors/armor_Irontree_Breastplate_Armor_E6Ri6nwMtVOBedCy.json deleted file mode 100644 index a92ac2f2..00000000 --- a/src/packs/items/armors/armor_Irontree_Breastplate_Armor_E6Ri6nwMtVOBedCy.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Irontree Breastplate Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_2/irontree_breastplate_armor.png", - "system": { - "baseScore": 4, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "reinforced", - "baseThresholds": { - "major": 9, - "severe": 20 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "hLn0v6ov6KuFgptu", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717639903, - "modifiedTime": 1748717641884, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "E6Ri6nwMtVOBedCy", - "sort": 400000, - "_key": "!items!E6Ri6nwMtVOBedCy" -} diff --git a/src/packs/items/armors/armor_Leather_Armor_Fcz2Gg3V6O9whY8j.json b/src/packs/items/armors/armor_Leather_Armor_Fcz2Gg3V6O9whY8j.json deleted file mode 100644 index cfeeb371..00000000 --- a/src/packs/items/armors/armor_Leather_Armor_Fcz2Gg3V6O9whY8j.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Leather Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_1/leather_armor.png", - "system": { - "baseScore": 3, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "", - "baseThresholds": { - "major": 6, - "severe": 13 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "h4QgrovjVZ1oee7O", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717627937, - "modifiedTime": 1748717627943, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "Fcz2Gg3V6O9whY8j", - "sort": 50000, - "_key": "!items!Fcz2Gg3V6O9whY8j" -} diff --git a/src/packs/items/armors/armor_Legendary_Chainmail_Armor_MjVHoiFL4ooLY9YP.json b/src/packs/items/armors/armor_Legendary_Chainmail_Armor_MjVHoiFL4ooLY9YP.json deleted file mode 100644 index cbe6532c..00000000 --- a/src/packs/items/armors/armor_Legendary_Chainmail_Armor_MjVHoiFL4ooLY9YP.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Chainmail Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_4/legendary_chainmail_armor.png", - "system": { - "baseScore": 7, - "marks": { - "max": 6, - "value": 0 - }, - "baseThresholds": { - "major": 15, - "severe": 40 - }, - "description": "", - "feature": "heavy", - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "Hbjp64XzuyJs2hOs", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717669780, - "modifiedTime": 1748717674251, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "MjVHoiFL4ooLY9YP", - "sort": 1000000, - "_key": "!items!MjVHoiFL4ooLY9YP" -} diff --git a/src/packs/items/armors/armor_Legendary_Full_Plate_Armor_ZS7GwxrNThKZpD6l.json b/src/packs/items/armors/armor_Legendary_Full_Plate_Armor_ZS7GwxrNThKZpD6l.json deleted file mode 100644 index a7451c13..00000000 --- a/src/packs/items/armors/armor_Legendary_Full_Plate_Armor_ZS7GwxrNThKZpD6l.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "Legendary Full Plate Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_4/legendary_full_plate_armor.png", - "system": { - "baseScore": 7, - "marks": { - "max": 6, - "value": 0 - }, - "baseThresholds": { - "major": 17, - "severe": 44 - }, - "description": "", - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "Hbjp64XzuyJs2hOs", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717670992, - "modifiedTime": 1748717674251, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "ZS7GwxrNThKZpD6l", - "sort": 900000, - "_key": "!items!ZS7GwxrNThKZpD6l" -} diff --git a/src/packs/items/armors/armor_Legendary_Gambeson_Armor_VkRQZFSXkrLm0gQD.json b/src/packs/items/armors/armor_Legendary_Gambeson_Armor_VkRQZFSXkrLm0gQD.json deleted file mode 100644 index 77863f09..00000000 --- a/src/packs/items/armors/armor_Legendary_Gambeson_Armor_VkRQZFSXkrLm0gQD.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Gambeson Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_4/legendary_gambeson_armor.png", - "system": { - "baseScore": 6, - "marks": { - "max": 6, - "value": 0 - }, - "baseThresholds": { - "major": 11, - "severe": 32 - }, - "description": "", - "feature": "", - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "Hbjp64XzuyJs2hOs", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717671798, - "modifiedTime": 1748717674251, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "VkRQZFSXkrLm0gQD", - "sort": 100000, - "_key": "!items!VkRQZFSXkrLm0gQD" -} diff --git a/src/packs/items/armors/armor_Legendary_Leather_Armor_eWPVkncjAu9h6H0E.json b/src/packs/items/armors/armor_Legendary_Leather_Armor_eWPVkncjAu9h6H0E.json deleted file mode 100644 index e9d1e9df..00000000 --- a/src/packs/items/armors/armor_Legendary_Leather_Armor_eWPVkncjAu9h6H0E.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Leather Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_4/legendary_leather_armor.png", - "system": { - "baseScore": 6, - "marks": { - "max": 6, - "value": 0 - }, - "baseThresholds": { - "major": 13, - "severe": 36 - }, - "description": "", - "feature": "", - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "Hbjp64XzuyJs2hOs", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717672612, - "modifiedTime": 1748717674251, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "eWPVkncjAu9h6H0E", - "sort": 300000, - "_key": "!items!eWPVkncjAu9h6H0E" -} diff --git a/src/packs/items/armors/armor_Monett_s_Cloak_CDUbtl6zED5uhOsA.json b/src/packs/items/armors/armor_Monett_s_Cloak_CDUbtl6zED5uhOsA.json deleted file mode 100644 index 6e23a159..00000000 --- a/src/packs/items/armors/armor_Monett_s_Cloak_CDUbtl6zED5uhOsA.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Monett's Cloak", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_3/monetts_cloak.png", - "system": { - "baseScore": 6, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "magic", - "baseThresholds": { - "major": 16, - "severe": 39 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "rkSdPu86ybLz6aKF", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717656099, - "modifiedTime": 1748717656099, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "CDUbtl6zED5uhOsA", - "sort": 0, - "_key": "!items!CDUbtl6zED5uhOsA" -} diff --git a/src/packs/items/armors/armor_Rosewild_Armor_1d2XtD71WGMn1CNT.json b/src/packs/items/armors/armor_Rosewild_Armor_1d2XtD71WGMn1CNT.json deleted file mode 100644 index a748c1f3..00000000 --- a/src/packs/items/armors/armor_Rosewild_Armor_1d2XtD71WGMn1CNT.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Rosewild Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_2/rosewild_armor.png", - "system": { - "baseScore": 5, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "hopeful", - "baseThresholds": { - "major": 11, - "severe": 23 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "hLn0v6ov6KuFgptu", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717640881, - "modifiedTime": 1748717641884, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "1d2XtD71WGMn1CNT", - "sort": 500000, - "_key": "!items!1d2XtD71WGMn1CNT" -} diff --git a/src/packs/items/armors/armor_Runes_of_Fortification_HLiw7DTgSgY2F1rC.json b/src/packs/items/armors/armor_Runes_of_Fortification_HLiw7DTgSgY2F1rC.json deleted file mode 100644 index bc12a79f..00000000 --- a/src/packs/items/armors/armor_Runes_of_Fortification_HLiw7DTgSgY2F1rC.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Runes of Fortification", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_3/runes_of_fortification.png", - "system": { - "baseScore": 6, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "painful", - "baseThresholds": { - "major": 17, - "severe": 43 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "rkSdPu86ybLz6aKF", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717656973, - "modifiedTime": 1748717656973, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "HLiw7DTgSgY2F1rC", - "sort": 0, - "_key": "!items!HLiw7DTgSgY2F1rC" -} diff --git a/src/packs/items/armors/armor_Runetan_Floating_Armor_jQTUywiUZzoheULn.json b/src/packs/items/armors/armor_Runetan_Floating_Armor_jQTUywiUZzoheULn.json deleted file mode 100644 index d4b845ed..00000000 --- a/src/packs/items/armors/armor_Runetan_Floating_Armor_jQTUywiUZzoheULn.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Runetan Floating Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_2/runetan_floating_armor.png", - "system": { - "baseScore": 4, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "sharp", - "baseThresholds": { - "major": 9, - "severe": 20 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "hLn0v6ov6KuFgptu", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717641872, - "modifiedTime": 1748717641884, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "jQTUywiUZzoheULn", - "sort": 300000, - "_key": "!items!jQTUywiUZzoheULn" -} diff --git a/src/packs/items/armors/armor_Savior_Chainmail_S1jq3KXLHWw3OLgX.json b/src/packs/items/armors/armor_Savior_Chainmail_S1jq3KXLHWw3OLgX.json deleted file mode 100644 index e53a1d81..00000000 --- a/src/packs/items/armors/armor_Savior_Chainmail_S1jq3KXLHWw3OLgX.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Savior Chainmail", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_4/savior_chainmail.png", - "system": { - "baseScore": 8, - "marks": { - "max": 6, - "value": 0 - }, - "baseThresholds": { - "major": 18, - "severe": 48 - }, - "description": "", - "feature": "difficult", - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "Hbjp64XzuyJs2hOs", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717673454, - "modifiedTime": 1748717674251, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "S1jq3KXLHWw3OLgX", - "sort": 400000, - "_key": "!items!S1jq3KXLHWw3OLgX" -} diff --git a/src/packs/items/armors/armor_Spiked_Plate_Armor_TkNjxTz0IapYe0YU.json b/src/packs/items/armors/armor_Spiked_Plate_Armor_TkNjxTz0IapYe0YU.json deleted file mode 100644 index a12b5836..00000000 --- a/src/packs/items/armors/armor_Spiked_Plate_Armor_TkNjxTz0IapYe0YU.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Spiked Plate Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_3/spiked_plate_armor.png", - "system": { - "baseScore": 5, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "sharp", - "baseThresholds": { - "major": 10, - "severe": 25 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "rkSdPu86ybLz6aKF", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717657828, - "modifiedTime": 1748717657828, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "TkNjxTz0IapYe0YU", - "sort": 0, - "_key": "!items!TkNjxTz0IapYe0YU" -} diff --git a/src/packs/items/armors/armor_Tyris_Soft_Armor_4NRiIunReDbj9zoC.json b/src/packs/items/armors/armor_Tyris_Soft_Armor_4NRiIunReDbj9zoC.json deleted file mode 100644 index 3ee449ac..00000000 --- a/src/packs/items/armors/armor_Tyris_Soft_Armor_4NRiIunReDbj9zoC.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Tyris Soft Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_2/tyris_soft_armor.png", - "system": { - "baseScore": 5, - "marks": { - "max": 6, - "value": 0 - }, - "description": "", - "feature": "quiet", - "baseThresholds": { - "major": 8, - "severe": 18 - }, - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "hLn0v6ov6KuFgptu", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717642821, - "modifiedTime": 1748717642821, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "4NRiIunReDbj9zoC", - "sort": 0, - "_key": "!items!4NRiIunReDbj9zoC" -} diff --git a/src/packs/items/armors/armor_Veritas_Oal_Armor_1ByiV04ofK4TG5vR.json b/src/packs/items/armors/armor_Veritas_Oal_Armor_1ByiV04ofK4TG5vR.json deleted file mode 100644 index b8a17074..00000000 --- a/src/packs/items/armors/armor_Veritas_Oal_Armor_1ByiV04ofK4TG5vR.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Veritas Oal Armor", - "type": "armor", - "img": "systems/daggerheart/assets/icons/armor/tier_4/veritas_opal_armor.png", - "system": { - "baseScore": 6, - "marks": { - "max": 6, - "value": 0 - }, - "baseThresholds": { - "major": 13, - "severe": 36 - }, - "description": "", - "feature": "truthseeking", - "equipped": false, - "quantity": 1 - }, - "effects": [], - "folder": "Hbjp64XzuyJs2hOs", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717674241, - "modifiedTime": 1748717674251, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "1ByiV04ofK4TG5vR", - "sort": 200000, - "_key": "!items!1ByiV04ofK4TG5vR" -} diff --git a/src/packs/items/general/miscellaneous_Airblade_Charm_CyUH6pvP1rGhsMtQ.json b/src/packs/items/general/miscellaneous_Airblade_Charm_CyUH6pvP1rGhsMtQ.json deleted file mode 100644 index 78e8b48f..00000000 --- a/src/packs/items/general/miscellaneous_Airblade_Charm_CyUH6pvP1rGhsMtQ.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Airblade Charm", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/airblade_charm.png", - "system": { - "description": "

You can attach this charm to a weapon with a Melee range. Three times per rest, you can activate the charm and attack a target within Close range.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009147603, - "modifiedTime": 1748009147603, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "CyUH6pvP1rGhsMtQ", - "sort": 0, - "_key": "!items!CyUH6pvP1rGhsMtQ" -} diff --git a/src/packs/items/general/miscellaneous_Alistair_s_Torch_8ah8OiuUZnlg64g5.json b/src/packs/items/general/miscellaneous_Alistair_s_Torch_8ah8OiuUZnlg64g5.json deleted file mode 100644 index dd092bd9..00000000 --- a/src/packs/items/general/miscellaneous_Alistair_s_Torch_8ah8OiuUZnlg64g5.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Alistair’s Torch", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/alistairs_torch.png", - "system": { - "description": "

You can light this magic torch at will. The flame’s light fills a much larger space than it should, enough to illuminate a cave bright as day.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009146702, - "modifiedTime": 1748009146702, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "8ah8OiuUZnlg64g5", - "sort": 0, - "_key": "!items!8ah8OiuUZnlg64g5" -} diff --git a/src/packs/items/general/miscellaneous_Arcane_Cloak_R8ArJcZrYQzc5Y98.json b/src/packs/items/general/miscellaneous_Arcane_Cloak_R8ArJcZrYQzc5Y98.json deleted file mode 100644 index 7d6b2622..00000000 --- a/src/packs/items/general/miscellaneous_Arcane_Cloak_R8ArJcZrYQzc5Y98.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Arcane Cloak", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/arcane_cloak.png", - "system": { - "description": "

A creature with a Spellcast trait wearing this cloak can adjust its color, texture, and size at will.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009145941, - "modifiedTime": 1748009145941, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "R8ArJcZrYQzc5Y98", - "sort": 0, - "_key": "!items!R8ArJcZrYQzc5Y98" -} diff --git a/src/packs/items/general/miscellaneous_Arcane_Prism_vFLyAPu1v0dGf3G7.json b/src/packs/items/general/miscellaneous_Arcane_Prism_vFLyAPu1v0dGf3G7.json deleted file mode 100644 index b5ba7180..00000000 --- a/src/packs/items/general/miscellaneous_Arcane_Prism_vFLyAPu1v0dGf3G7.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Arcane Prism", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/arcane_prism.png", - "system": { - "description": "

Position this prism in a location of your choosing and activate it. All allies within Close range of it gain a +1 bonus to their Spellcast Rolls. While activated, the prism can’t be moved. Once the prism is deactivated, it can’t be activated again until your next long rest.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009144434, - "modifiedTime": 1748009144434, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "vFLyAPu1v0dGf3G7", - "sort": 0, - "_key": "!items!vFLyAPu1v0dGf3G7" -} diff --git a/src/packs/items/general/miscellaneous_Attune_Relic_O2Z6tdqzYYy3Yjeq.json b/src/packs/items/general/miscellaneous_Attune_Relic_O2Z6tdqzYYy3Yjeq.json deleted file mode 100644 index b78a59ba..00000000 --- a/src/packs/items/general/miscellaneous_Attune_Relic_O2Z6tdqzYYy3Yjeq.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Attune Relic", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/attune_relic.png", - "system": { - "description": "

You gain a +1 bonus to your Instinct. You can only carry one relic.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009143587, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "O2Z6tdqzYYy3Yjeq", - "sort": 400000, - "_key": "!items!O2Z6tdqzYYy3Yjeq" -} diff --git a/src/packs/items/general/miscellaneous_Bag_of_Ficklesand_NTYzGMkMzkh1tCT8.json b/src/packs/items/general/miscellaneous_Bag_of_Ficklesand_NTYzGMkMzkh1tCT8.json deleted file mode 100644 index a28a1f96..00000000 --- a/src/packs/items/general/miscellaneous_Bag_of_Ficklesand_NTYzGMkMzkh1tCT8.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Bag of Ficklesand", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/bag_of_ficklesand.png", - "system": { - "description": "

You can convince this small bag of sand to be much heavier or lighter with a successful Presence Roll (10). Additionally, on a successful Finesse Roll (10), you can blow a bit of sand into a target’s face to make them temporarily Vulnerable.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009142817, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "NTYzGMkMzkh1tCT8", - "sort": 700000, - "_key": "!items!NTYzGMkMzkh1tCT8" -} diff --git a/src/packs/items/general/miscellaneous_Belt_of_Unity_ZNltlkAdBfyStHfg.json b/src/packs/items/general/miscellaneous_Belt_of_Unity_ZNltlkAdBfyStHfg.json deleted file mode 100644 index c3a25174..00000000 --- a/src/packs/items/general/miscellaneous_Belt_of_Unity_ZNltlkAdBfyStHfg.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Belt of Unity", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/belt_of_unity.png", - "system": { - "description": "

Once per session, you can spend 5 Hope to lead a Tag Team Roll with three PCs instead of two.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009141974, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "ZNltlkAdBfyStHfg", - "sort": 600000, - "_key": "!items!ZNltlkAdBfyStHfg" -} diff --git a/src/packs/items/general/miscellaneous_Bloodstone_8k7Eoalz5bjjq5N8.json b/src/packs/items/general/miscellaneous_Bloodstone_8k7Eoalz5bjjq5N8.json deleted file mode 100644 index e65097b3..00000000 --- a/src/packs/items/general/miscellaneous_Bloodstone_8k7Eoalz5bjjq5N8.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Bloodstone", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/bloodstone.png", - "system": { - "description": "

You can attach this stone to a weapon that doesn’t already have a feature. The weapon gains the following feature.

Brutal: When you roll the maximum value on a damage die, roll an additional damage die.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009141115, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "8k7Eoalz5bjjq5N8", - "sort": 500000, - "_key": "!items!8k7Eoalz5bjjq5N8" -} diff --git a/src/packs/items/general/miscellaneous_Bolster_Relic_tlrEsXwEJuq1mdnT.json b/src/packs/items/general/miscellaneous_Bolster_Relic_tlrEsXwEJuq1mdnT.json deleted file mode 100644 index 6d99d325..00000000 --- a/src/packs/items/general/miscellaneous_Bolster_Relic_tlrEsXwEJuq1mdnT.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Bolster Relic", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/bolster_relic.png", - "system": { - "description": "

You gain a +1 bonus to your Strength. You can only carry one relic.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009140095, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "tlrEsXwEJuq1mdnT", - "sort": 300000, - "_key": "!items!tlrEsXwEJuq1mdnT" -} diff --git a/src/packs/items/general/miscellaneous_Box_of_Many_Goods_I5R0JkibkfDsz4ct.json b/src/packs/items/general/miscellaneous_Box_of_Many_Goods_I5R0JkibkfDsz4ct.json deleted file mode 100644 index df5c3e7d..00000000 --- a/src/packs/items/general/miscellaneous_Box_of_Many_Goods_I5R0JkibkfDsz4ct.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Box of Many Goods", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/box_of_many_goods.png", - "system": { - "description": "

Once per long rest, you can open this small box and roll a [[d12]]. On a result of 1–6, it’s empty. On a result of 7–10, it contains one random common consumable. On a result of 11–12, it contains two random common consumables.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009137689, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "I5R0JkibkfDsz4ct", - "sort": 200000, - "_key": "!items!I5R0JkibkfDsz4ct" -} diff --git a/src/packs/items/general/miscellaneous_Calming_Pendant_8apc52Pt4Zyq093R.json b/src/packs/items/general/miscellaneous_Calming_Pendant_8apc52Pt4Zyq093R.json deleted file mode 100644 index 6d6eb616..00000000 --- a/src/packs/items/general/miscellaneous_Calming_Pendant_8apc52Pt4Zyq093R.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Calming Pendant", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/calming_pendant.png", - "system": { - "description": "

When you would mark your last Stress, roll a [[d6]]. On a result of 5 or higher, don’t mark it.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009136803, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "8apc52Pt4Zyq093R", - "sort": 100000, - "_key": "!items!8apc52Pt4Zyq093R" -} diff --git a/src/packs/items/general/miscellaneous_Charging_Quiver_bOVsrjYXOWmup9uv.json b/src/packs/items/general/miscellaneous_Charging_Quiver_bOVsrjYXOWmup9uv.json deleted file mode 100644 index a7277f74..00000000 --- a/src/packs/items/general/miscellaneous_Charging_Quiver_bOVsrjYXOWmup9uv.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Charging Quiver", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/charging_quiver.png", - "system": { - "description": "

When you succeed on an attack with an arrow stored in this quiver, gain a bonus to the damage roll equal to your current tier.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009135914, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "bOVsrjYXOWmup9uv", - "sort": 1100000, - "_key": "!items!bOVsrjYXOWmup9uv" -} diff --git a/src/packs/items/general/miscellaneous_Charm_Relic_u3mroLAMlfRmiTBI.json b/src/packs/items/general/miscellaneous_Charm_Relic_u3mroLAMlfRmiTBI.json deleted file mode 100644 index dd44075c..00000000 --- a/src/packs/items/general/miscellaneous_Charm_Relic_u3mroLAMlfRmiTBI.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Charm Relic", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/charm_relic.png", - "system": { - "description": "

You gain a +1 bonus to your Presence. You can only carry one relic.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009134768, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "u3mroLAMlfRmiTBI", - "sort": 1500000, - "_key": "!items!u3mroLAMlfRmiTBI" -} diff --git a/src/packs/items/general/miscellaneous_Clay_Companion_tCBka1QANgZyXXMT.json b/src/packs/items/general/miscellaneous_Clay_Companion_tCBka1QANgZyXXMT.json deleted file mode 100644 index 75b70759..00000000 --- a/src/packs/items/general/miscellaneous_Clay_Companion_tCBka1QANgZyXXMT.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Clay Companion", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/clay_companion.png", - "system": { - "description": "

When you sculpt this ball of clay into a clay animal companion, it behaves as that animal. For example, a clay spider can spin clay webs, while a clay bird can fly. The clay companion retains memory and identity across different shapes, but they can adopt new mannerisms with each form.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009133288, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "tCBka1QANgZyXXMT", - "sort": 1400000, - "_key": "!items!tCBka1QANgZyXXMT" -} diff --git a/src/packs/items/general/miscellaneous_Companion_Case_fSYJAp9tFBUVSYcK.json b/src/packs/items/general/miscellaneous_Companion_Case_fSYJAp9tFBUVSYcK.json deleted file mode 100644 index 1e648b2f..00000000 --- a/src/packs/items/general/miscellaneous_Companion_Case_fSYJAp9tFBUVSYcK.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Companion Case", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/companion_case.png", - "system": { - "description": "

This case can fit a small animal companion. While the companion is inside, the animal and case are immune to all damage and harmful effects.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009132318, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "fSYJAp9tFBUVSYcK", - "sort": 1300000, - "_key": "!items!fSYJAp9tFBUVSYcK" -} diff --git a/src/packs/items/general/miscellaneous_Control_Relic_iZnHMmtt5k0F2uma.json b/src/packs/items/general/miscellaneous_Control_Relic_iZnHMmtt5k0F2uma.json deleted file mode 100644 index 142f9694..00000000 --- a/src/packs/items/general/miscellaneous_Control_Relic_iZnHMmtt5k0F2uma.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Control Relic", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/control_relic.png", - "system": { - "description": "

You gain a +1 bonus to your Finesse. You can only carry one relic.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009131234, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "iZnHMmtt5k0F2uma", - "sort": 1200000, - "_key": "!items!iZnHMmtt5k0F2uma" -} diff --git a/src/packs/items/general/miscellaneous_Corrector_Sprite_rPNgedgA8HdzVPlH.json b/src/packs/items/general/miscellaneous_Corrector_Sprite_rPNgedgA8HdzVPlH.json deleted file mode 100644 index 00e8ff3d..00000000 --- a/src/packs/items/general/miscellaneous_Corrector_Sprite_rPNgedgA8HdzVPlH.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Corrector Sprite", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/corrector_sprite.png", - "system": { - "description": "

This tiny sprite sits in the curve of your ear canal and whispers helpful advice during combat. Once per short rest, you can gain advantage on an attack roll.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009130261, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "rPNgedgA8HdzVPlH", - "sort": 1000000, - "_key": "!items!rPNgedgA8HdzVPlH" -} diff --git a/src/packs/items/general/miscellaneous_Dual_Flask_cUk6sSRdrpFPaiT7.json b/src/packs/items/general/miscellaneous_Dual_Flask_cUk6sSRdrpFPaiT7.json deleted file mode 100644 index 9ed58ef3..00000000 --- a/src/packs/items/general/miscellaneous_Dual_Flask_cUk6sSRdrpFPaiT7.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Dual Flask", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/dual_flask.png", - "system": { - "description": "

This flask can hold two different liquids. You can swap between them by flipping a small switch on the flask’s side.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009127730, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "cUk6sSRdrpFPaiT7", - "sort": 900000, - "_key": "!items!cUk6sSRdrpFPaiT7" -} diff --git a/src/packs/items/general/miscellaneous_Elusive_Amulet_qdBpDOgFI9iJX8bH.json b/src/packs/items/general/miscellaneous_Elusive_Amulet_qdBpDOgFI9iJX8bH.json deleted file mode 100644 index 392160c3..00000000 --- a/src/packs/items/general/miscellaneous_Elusive_Amulet_qdBpDOgFI9iJX8bH.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Elusive Amulet", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/elusive_amulet.png", - "system": { - "description": "

Once per long rest, you can activate this amulet to become Hidden until you move. While Hidden in this way, you remain unseen even if an adversary moves to where they would normally see you.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009126524, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "qdBpDOgFI9iJX8bH", - "sort": 800000, - "_key": "!items!qdBpDOgFI9iJX8bH" -} diff --git a/src/packs/items/general/miscellaneous_Empty_Chest_bmPjeLeLb6Bq6vtf.json b/src/packs/items/general/miscellaneous_Empty_Chest_bmPjeLeLb6Bq6vtf.json deleted file mode 100644 index be3c08e2..00000000 --- a/src/packs/items/general/miscellaneous_Empty_Chest_bmPjeLeLb6Bq6vtf.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Empty Chest", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/empty_chest.png", - "system": { - "description": "

This magical chest appears empty. When you speak a specific trigger word or action and open the chest, you can see the items stored within it.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009125466, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "bmPjeLeLb6Bq6vtf", - "sort": 1900000, - "_key": "!items!bmPjeLeLb6Bq6vtf" -} diff --git a/src/packs/items/general/miscellaneous_Enlighten_Relic_v7tdq3aM5UsHD8tx.json b/src/packs/items/general/miscellaneous_Enlighten_Relic_v7tdq3aM5UsHD8tx.json deleted file mode 100644 index 550bd9b7..00000000 --- a/src/packs/items/general/miscellaneous_Enlighten_Relic_v7tdq3aM5UsHD8tx.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Enlighten Relic", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/enlighten_relic.png", - "system": { - "description": "

You gain a +1 bonus to your Knowledge. You can only carry one relic.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009124593, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "v7tdq3aM5UsHD8tx", - "sort": 2300000, - "_key": "!items!v7tdq3aM5UsHD8tx" -} diff --git a/src/packs/items/general/miscellaneous_Fire_Jar_aXYUZQ7hoOKBct12.json b/src/packs/items/general/miscellaneous_Fire_Jar_aXYUZQ7hoOKBct12.json deleted file mode 100644 index c76ac321..00000000 --- a/src/packs/items/general/miscellaneous_Fire_Jar_aXYUZQ7hoOKBct12.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Fire Jar", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/fire_jar.png", - "system": { - "description": "

You can pour out the strange liquid contents of this jar to instantly produce fire. The contents regenerate when you take a long rest.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009123524, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "aXYUZQ7hoOKBct12", - "sort": 2200000, - "_key": "!items!aXYUZQ7hoOKBct12" -} diff --git a/src/packs/items/general/miscellaneous_Flickerfly_Pendant_QVDGEg42teRurSXp.json b/src/packs/items/general/miscellaneous_Flickerfly_Pendant_QVDGEg42teRurSXp.json deleted file mode 100644 index 1730c144..00000000 --- a/src/packs/items/general/miscellaneous_Flickerfly_Pendant_QVDGEg42teRurSXp.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Flickerfly Pendant", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/flickerfly_pendant.png", - "system": { - "description": "

While you carry this pendant, your weapons with a Melee range that deal physical damage have a gossamer sheen and can attack targets within Very Close range.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009122655, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "QVDGEg42teRurSXp", - "sort": 2100000, - "_key": "!items!QVDGEg42teRurSXp" -} diff --git a/src/packs/items/general/miscellaneous_Gecko_Gloves_16z0fAO99LLOO1Px.json b/src/packs/items/general/miscellaneous_Gecko_Gloves_16z0fAO99LLOO1Px.json deleted file mode 100644 index 682639e3..00000000 --- a/src/packs/items/general/miscellaneous_Gecko_Gloves_16z0fAO99LLOO1Px.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Gecko Gloves", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/gecko_gloves.png", - "system": { - "description": "

You can climb up vertical surfaces and across ceilings.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009121448, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "16z0fAO99LLOO1Px", - "sort": 2000000, - "_key": "!items!16z0fAO99LLOO1Px" -} diff --git a/src/packs/items/general/miscellaneous_Gem_of_Alacrity_WpIffLlgTd3v7lFR.json b/src/packs/items/general/miscellaneous_Gem_of_Alacrity_WpIffLlgTd3v7lFR.json deleted file mode 100644 index d314f5db..00000000 --- a/src/packs/items/general/miscellaneous_Gem_of_Alacrity_WpIffLlgTd3v7lFR.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Gem of Alacrity", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/gem_of_alacrity.png", - "system": { - "description": "

You can attach this gem to a weapon, allowing you to use your Agility when making an attack with that weapon.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009120525, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "WpIffLlgTd3v7lFR", - "sort": 1800000, - "_key": "!items!WpIffLlgTd3v7lFR" -} diff --git a/src/packs/items/general/miscellaneous_Gem_of_Audacity_tRodc01kCgW1I0C9.json b/src/packs/items/general/miscellaneous_Gem_of_Audacity_tRodc01kCgW1I0C9.json deleted file mode 100644 index 8329f8a1..00000000 --- a/src/packs/items/general/miscellaneous_Gem_of_Audacity_tRodc01kCgW1I0C9.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Gem of Audacity", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/gem_of_audacity.png", - "system": { - "description": "

You can attach this gem to a weapon, allowing you to use your Presence when making an attack with that weapon.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009118172, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "tRodc01kCgW1I0C9", - "sort": 1700000, - "_key": "!items!tRodc01kCgW1I0C9" -} diff --git a/src/packs/items/general/miscellaneous_Gem_of_Insight_SRS1y2KTaJiI3DRD.json b/src/packs/items/general/miscellaneous_Gem_of_Insight_SRS1y2KTaJiI3DRD.json deleted file mode 100644 index e7de6999..00000000 --- a/src/packs/items/general/miscellaneous_Gem_of_Insight_SRS1y2KTaJiI3DRD.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Gem of Insight", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/gem_of_insight.png", - "system": { - "description": "

You can attach this gem to a weapon, allowing you to use your Instinct when making an attack with that weapon.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009117304, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "SRS1y2KTaJiI3DRD", - "sort": 1600000, - "_key": "!items!SRS1y2KTaJiI3DRD" -} diff --git a/src/packs/items/general/miscellaneous_Gem_of_Might_otQUU7REbc6XP3Em.json b/src/packs/items/general/miscellaneous_Gem_of_Might_otQUU7REbc6XP3Em.json deleted file mode 100644 index d08d614a..00000000 --- a/src/packs/items/general/miscellaneous_Gem_of_Might_otQUU7REbc6XP3Em.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Gem of Might", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/gem_of_might.png", - "system": { - "description": "

You can attach this gem to a weapon, allowing you to use your Strength when making an attack with that weapon.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009116508, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "otQUU7REbc6XP3Em", - "sort": 2700000, - "_key": "!items!otQUU7REbc6XP3Em" -} diff --git a/src/packs/items/general/miscellaneous_Gem_of_Precision_UhWgZtY7GchaWH9X.json b/src/packs/items/general/miscellaneous_Gem_of_Precision_UhWgZtY7GchaWH9X.json deleted file mode 100644 index e6e5765f..00000000 --- a/src/packs/items/general/miscellaneous_Gem_of_Precision_UhWgZtY7GchaWH9X.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Gem of Precision", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/gem_of_precision.png", - "system": { - "description": "

You can attach this gem to a weapon, allowing you to use your Finesse when making an attack with that weapon.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009115526, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "UhWgZtY7GchaWH9X", - "sort": 3100000, - "_key": "!items!UhWgZtY7GchaWH9X" -} diff --git a/src/packs/items/general/miscellaneous_Gem_of_Sagacity_MIguWkeZvN4g5Wy2.json b/src/packs/items/general/miscellaneous_Gem_of_Sagacity_MIguWkeZvN4g5Wy2.json deleted file mode 100644 index d0a3d977..00000000 --- a/src/packs/items/general/miscellaneous_Gem_of_Sagacity_MIguWkeZvN4g5Wy2.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Gem of Sagacity", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/gem_of_sagacity.png", - "system": { - "description": "

You can attach this gem to a weapon, allowing you to use your Knowledge when making an attack with that weapon.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009114561, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "MIguWkeZvN4g5Wy2", - "sort": 3000000, - "_key": "!items!MIguWkeZvN4g5Wy2" -} diff --git a/src/packs/items/general/miscellaneous_Glamour_Stone_sqhQYeVDAwDtZMPm.json b/src/packs/items/general/miscellaneous_Glamour_Stone_sqhQYeVDAwDtZMPm.json deleted file mode 100644 index 20130c2d..00000000 --- a/src/packs/items/general/miscellaneous_Glamour_Stone_sqhQYeVDAwDtZMPm.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Glamour Stone", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/glamour_stone.png", - "system": { - "description": "

Activate this pebble-sized stone to memorize the appearance of someone you can see. Spend a Hope to magically recreate this guise on yourself as an illusion.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009113828, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "sqhQYeVDAwDtZMPm", - "sort": 2900000, - "_key": "!items!sqhQYeVDAwDtZMPm" -} diff --git a/src/packs/items/general/miscellaneous_Glider_MPbJbRn2tgFuWx4Z.json b/src/packs/items/general/miscellaneous_Glider_MPbJbRn2tgFuWx4Z.json deleted file mode 100644 index 583efc85..00000000 --- a/src/packs/items/general/miscellaneous_Glider_MPbJbRn2tgFuWx4Z.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Glider", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/glider.png", - "system": { - "description": "

While falling, you can mark a Stress to deploy this small parachute and glide safely to the ground.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009112826, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "MPbJbRn2tgFuWx4Z", - "sort": 2800000, - "_key": "!items!MPbJbRn2tgFuWx4Z" -} diff --git a/src/packs/items/general/miscellaneous_Greatstone_UkOwMJtusXYODPxQ.json b/src/packs/items/general/miscellaneous_Greatstone_UkOwMJtusXYODPxQ.json deleted file mode 100644 index c1c2ba2c..00000000 --- a/src/packs/items/general/miscellaneous_Greatstone_UkOwMJtusXYODPxQ.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Greatstone", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/greatstone.png", - "system": { - "description": "

You can attach this stone to a weapon that doesn’t already have a feature. The weapon gains the following feature.

Powerful: On a successful attack, roll an additional damage die and discard the lowest result.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009111955, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "UkOwMJtusXYODPxQ", - "sort": 2600000, - "_key": "!items!UkOwMJtusXYODPxQ" -} diff --git a/src/packs/items/general/miscellaneous_Homing_Compasses_RhtsgQz7ZaU7lPnH.json b/src/packs/items/general/miscellaneous_Homing_Compasses_RhtsgQz7ZaU7lPnH.json deleted file mode 100644 index fa8205a3..00000000 --- a/src/packs/items/general/miscellaneous_Homing_Compasses_RhtsgQz7ZaU7lPnH.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Homing Compasses", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/homing_compass.png", - "system": { - "description": "

These two compasses point toward each other no matter how far apart they are.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009110886, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "RhtsgQz7ZaU7lPnH", - "sort": 2500000, - "_key": "!items!RhtsgQz7ZaU7lPnH" -} diff --git a/src/packs/items/general/miscellaneous_Honing_Relic_iIO2TKSHpdwksAMF.json b/src/packs/items/general/miscellaneous_Honing_Relic_iIO2TKSHpdwksAMF.json deleted file mode 100644 index fe6df548..00000000 --- a/src/packs/items/general/miscellaneous_Honing_Relic_iIO2TKSHpdwksAMF.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Honing Relic", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/honing_relic.png", - "system": { - "description": "

You gain a +1 bonus to an Experience of your choice. You can only carry one relic.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009107465, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "iIO2TKSHpdwksAMF", - "sort": 2400000, - "_key": "!items!iIO2TKSHpdwksAMF" -} diff --git a/src/packs/items/general/miscellaneous_Hopekeeper_Locket_kn6AIJk6UZsiKOjn.json b/src/packs/items/general/miscellaneous_Hopekeeper_Locket_kn6AIJk6UZsiKOjn.json deleted file mode 100644 index e5230db9..00000000 --- a/src/packs/items/general/miscellaneous_Hopekeeper_Locket_kn6AIJk6UZsiKOjn.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Hopekeeper Locket", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/hopekeeper_locket.png", - "system": { - "description": "

During a long rest, if you have 6 Hope, you can spend a Hope to imbue this locket with your bountiful resolve. When you have 0 Hope, you can use the locket to immediately gain a Hope. The locket must be re-imbued before it can be used this way again.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009106535, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "kn6AIJk6UZsiKOjn", - "sort": 3400000, - "_key": "!items!kn6AIJk6UZsiKOjn" -} diff --git a/src/packs/items/general/miscellaneous_Infinite_Bag_iw9qd8SHpTMo6cOW.json b/src/packs/items/general/miscellaneous_Infinite_Bag_iw9qd8SHpTMo6cOW.json deleted file mode 100644 index c0fb1f1d..00000000 --- a/src/packs/items/general/miscellaneous_Infinite_Bag_iw9qd8SHpTMo6cOW.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Infinite Bag", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/infinite_bag.png", - "system": { - "description": "

When you store items in this bag, they are kept in a pocket dimension that never runs out of space. You can retrieve an item at any time.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009105653, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "iw9qd8SHpTMo6cOW", - "sort": 3800000, - "_key": "!items!iw9qd8SHpTMo6cOW" -} diff --git a/src/packs/items/general/miscellaneous_Lakestrider_Boots_jEZrG7E8krKYee7j.json b/src/packs/items/general/miscellaneous_Lakestrider_Boots_jEZrG7E8krKYee7j.json deleted file mode 100644 index 17a33215..00000000 --- a/src/packs/items/general/miscellaneous_Lakestrider_Boots_jEZrG7E8krKYee7j.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Lakestrider Boots", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/lakestrider_boots.png", - "system": { - "description": "

You can walk on the surface of water as if it were soft ground.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009104985, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "jEZrG7E8krKYee7j", - "sort": 3700000, - "_key": "!items!jEZrG7E8krKYee7j" -} diff --git a/src/packs/items/general/miscellaneous_Lorekeeper_U1IdgxKT6CNa9SUh.json b/src/packs/items/general/miscellaneous_Lorekeeper_U1IdgxKT6CNa9SUh.json deleted file mode 100644 index c0854c9b..00000000 --- a/src/packs/items/general/miscellaneous_Lorekeeper_U1IdgxKT6CNa9SUh.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Lorekeeper", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/lorekeeper.png", - "system": { - "description": "

You can store the name and details of up to three hostile creatures inside this book. You gain a +1 bonus to action rolls against those creatures.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009104255, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "U1IdgxKT6CNa9SUh", - "sort": 3600000, - "_key": "!items!U1IdgxKT6CNa9SUh" -} diff --git a/src/packs/items/general/miscellaneous_Manacles_ItHEkRuzBMRF1jvm.json b/src/packs/items/general/miscellaneous_Manacles_ItHEkRuzBMRF1jvm.json deleted file mode 100644 index ed04a619..00000000 --- a/src/packs/items/general/miscellaneous_Manacles_ItHEkRuzBMRF1jvm.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Manacles", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/manacles.png", - "system": { - "description": "

This pair of locking cuffs comes with a key.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009103489, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "ItHEkRuzBMRF1jvm", - "sort": 3500000, - "_key": "!items!ItHEkRuzBMRF1jvm" -} diff --git a/src/packs/items/general/miscellaneous_Minor_Health_Potion_Recipe_XkvYkna8SF1x0sep.json b/src/packs/items/general/miscellaneous_Minor_Health_Potion_Recipe_XkvYkna8SF1x0sep.json deleted file mode 100644 index b8d52d2d..00000000 --- a/src/packs/items/general/miscellaneous_Minor_Health_Potion_Recipe_XkvYkna8SF1x0sep.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Minor Health Potion Recipe", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/minor_health_potion_recipe.png", - "system": { - "description": "

As a downtime move, you can use a vial of blood to craft a Minor Health Potion.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009102731, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "XkvYkna8SF1x0sep", - "sort": 3300000, - "_key": "!items!XkvYkna8SF1x0sep" -} diff --git a/src/packs/items/general/miscellaneous_Minor_Stamina_Potion_Recipe_YO4E2pVHAmrODPtF.json b/src/packs/items/general/miscellaneous_Minor_Stamina_Potion_Recipe_YO4E2pVHAmrODPtF.json deleted file mode 100644 index 14d51cb8..00000000 --- a/src/packs/items/general/miscellaneous_Minor_Stamina_Potion_Recipe_YO4E2pVHAmrODPtF.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Minor Stamina Potion Recipe", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/minor_stamina_potion_recipe.png", - "system": { - "description": "

As a downtime move, you can use the bone of a creature to craft a Minor Stamina Potion.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009101832, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "YO4E2pVHAmrODPtF", - "sort": 3200000, - "_key": "!items!YO4E2pVHAmrODPtF" -} diff --git a/src/packs/items/general/miscellaneous_Mythic_Dust_Recipe_mVX1FUiEe3jRiuGQ.json b/src/packs/items/general/miscellaneous_Mythic_Dust_Recipe_mVX1FUiEe3jRiuGQ.json deleted file mode 100644 index 4316e03b..00000000 --- a/src/packs/items/general/miscellaneous_Mythic_Dust_Recipe_mVX1FUiEe3jRiuGQ.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Mythic Dust Recipe", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/mythic_dust_recipe.png", - "system": { - "description": "

As a downtime move, you can use a handful of fine gold dust to craft Mythic Dust.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009099533, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "mVX1FUiEe3jRiuGQ", - "sort": 4100000, - "_key": "!items!mVX1FUiEe3jRiuGQ" -} diff --git a/src/packs/items/general/miscellaneous_Paragon_s_Chain_uZnJM4VHUg1JHQ6z.json b/src/packs/items/general/miscellaneous_Paragon_s_Chain_uZnJM4VHUg1JHQ6z.json deleted file mode 100644 index adc4820f..00000000 --- a/src/packs/items/general/miscellaneous_Paragon_s_Chain_uZnJM4VHUg1JHQ6z.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Paragon's Chain", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/paragons_chain.png", - "system": { - "description": "

As a downtime move, you can meditate on an ideal or principle you hold dear and focus your will into this chain. Once per long rest, you can spend a Hope to roll a [[d20]] as your Hope Die for rolls that directly align with that principle.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009098183, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "uZnJM4VHUg1JHQ6z", - "sort": 4500000, - "_key": "!items!uZnJM4VHUg1JHQ6z" -} diff --git a/src/packs/items/general/miscellaneous_Phoenix_Feather_RkOa2edxkqEQwL37.json b/src/packs/items/general/miscellaneous_Phoenix_Feather_RkOa2edxkqEQwL37.json deleted file mode 100644 index c7cbb90b..00000000 --- a/src/packs/items/general/miscellaneous_Phoenix_Feather_RkOa2edxkqEQwL37.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Phoenix Feather", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/phoenix_feather.png", - "system": { - "description": "

If you have at least one Phoenix Feather on you when you fall unconscious, you gain a +1 bonus to the roll you make to determine whether you gain a scar.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009095994, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "RkOa2edxkqEQwL37", - "sort": 4400000, - "_key": "!items!RkOa2edxkqEQwL37" -} diff --git a/src/packs/items/general/miscellaneous_Piercing_Arrows_C5KmTPU1tQQyg7Id.json b/src/packs/items/general/miscellaneous_Piercing_Arrows_C5KmTPU1tQQyg7Id.json deleted file mode 100644 index 085d3170..00000000 --- a/src/packs/items/general/miscellaneous_Piercing_Arrows_C5KmTPU1tQQyg7Id.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Piercing Arrows", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/piercing_arrows.png", - "system": { - "description": "

Three times per rest when you succeed on an attack with one of these arrows, you can add your Proficiency to the damage roll.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009095162, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "C5KmTPU1tQQyg7Id", - "sort": 4300000, - "_key": "!items!C5KmTPU1tQQyg7Id" -} diff --git a/src/packs/items/general/miscellaneous_Piper_Whistle_I3YOGFP6jmF6wYcZ.json b/src/packs/items/general/miscellaneous_Piper_Whistle_I3YOGFP6jmF6wYcZ.json deleted file mode 100644 index 9e5b98f9..00000000 --- a/src/packs/items/general/miscellaneous_Piper_Whistle_I3YOGFP6jmF6wYcZ.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Piper Whistle", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/piper_whistle.png", - "system": { - "description": "

This handcrafted whistle has a distinctive sound. When you blow this whistle, its piercing tone can be heard within a 1-mile radius.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009094394, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "I3YOGFP6jmF6wYcZ", - "sort": 4200000, - "_key": "!items!I3YOGFP6jmF6wYcZ" -} diff --git a/src/packs/items/general/miscellaneous_Portal_Seed_1FpooC9ILQKobVS3.json b/src/packs/items/general/miscellaneous_Portal_Seed_1FpooC9ILQKobVS3.json deleted file mode 100644 index 6a04be12..00000000 --- a/src/packs/items/general/miscellaneous_Portal_Seed_1FpooC9ILQKobVS3.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Portal Seed", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/portal_seed.png", - "system": { - "description": "

You can plant this seed in the ground to grow a portal in that spot. The portal is ready to use in 24 hours. You can use this portal to travel to any other location where you planted a portal seed. A portal can be destroyed by dealing any amount of magic damage to it.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009093573, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "1FpooC9ILQKobVS3", - "sort": 4000000, - "_key": "!items!1FpooC9ILQKobVS3" -} diff --git a/src/packs/items/general/miscellaneous_Premium_Bedroll_O4oywDenBWAi2h8t.json b/src/packs/items/general/miscellaneous_Premium_Bedroll_O4oywDenBWAi2h8t.json deleted file mode 100644 index 3b0957ae..00000000 --- a/src/packs/items/general/miscellaneous_Premium_Bedroll_O4oywDenBWAi2h8t.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Premium Bedroll", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/premium_bedroll.png", - "system": { - "description": "

During downtime, you automatically clear a Stress.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009092730, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "O4oywDenBWAi2h8t", - "sort": 3900000, - "_key": "!items!O4oywDenBWAi2h8t" -} diff --git a/src/packs/items/general/miscellaneous_Ring_of_Resistance_4nqRRPYVLB9Oqb6Q.json b/src/packs/items/general/miscellaneous_Ring_of_Resistance_4nqRRPYVLB9Oqb6Q.json deleted file mode 100644 index 5ad7596f..00000000 --- a/src/packs/items/general/miscellaneous_Ring_of_Resistance_4nqRRPYVLB9Oqb6Q.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Ring of Resistance", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/ring_of_resistance.png", - "system": { - "description": "

Once per long rest, you can activate this ring after a successful attack against you to halve the damage.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009091733, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "4nqRRPYVLB9Oqb6Q", - "sort": 5000000, - "_key": "!items!4nqRRPYVLB9Oqb6Q" -} diff --git a/src/packs/items/general/miscellaneous_Ring_of_Silence_zw8UhND7qIdFYiRg.json b/src/packs/items/general/miscellaneous_Ring_of_Silence_zw8UhND7qIdFYiRg.json deleted file mode 100644 index 237756d8..00000000 --- a/src/packs/items/general/miscellaneous_Ring_of_Silence_zw8UhND7qIdFYiRg.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Ring of Silence", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/ring_of_silence.png", - "system": { - "description": "

Spend a Hope to activate this ring. Your footsteps are silent until your next rest.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009090530, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "zw8UhND7qIdFYiRg", - "sort": 5600000, - "_key": "!items!zw8UhND7qIdFYiRg" -} diff --git a/src/packs/items/general/miscellaneous_Ring_of_Unbreakable_Resolve_dJzMhS1SKz8gJzKY.json b/src/packs/items/general/miscellaneous_Ring_of_Unbreakable_Resolve_dJzMhS1SKz8gJzKY.json deleted file mode 100644 index 77de17f4..00000000 --- a/src/packs/items/general/miscellaneous_Ring_of_Unbreakable_Resolve_dJzMhS1SKz8gJzKY.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Ring of Unbreakable Resolve", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/ring_of_unbreakable_resolve.png", - "system": { - "description": "

Once per session, when the GM spends a Fear, you can spend 4 Hope to cancel the effects of that spent Fear.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009083656, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "dJzMhS1SKz8gJzKY", - "sort": 5500000, - "_key": "!items!dJzMhS1SKz8gJzKY" -} diff --git a/src/packs/items/general/miscellaneous_Shard_of_Memory_2nv0fA4wLhuI5CuX.json b/src/packs/items/general/miscellaneous_Shard_of_Memory_2nv0fA4wLhuI5CuX.json deleted file mode 100644 index 359de428..00000000 --- a/src/packs/items/general/miscellaneous_Shard_of_Memory_2nv0fA4wLhuI5CuX.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Shard of Memory", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/shard_of_memory.png", - "system": { - "description": "

Once per long rest, you can spend 2 Hope to recall a domain card from your vault instead of paying its Recall Cost.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009082575, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "2nv0fA4wLhuI5CuX", - "sort": 5400000, - "_key": "!items!2nv0fA4wLhuI5CuX" -} diff --git a/src/packs/items/general/miscellaneous_Skeleton_Key_s91E77MCWpD0j6po.json b/src/packs/items/general/miscellaneous_Skeleton_Key_s91E77MCWpD0j6po.json deleted file mode 100644 index 87019956..00000000 --- a/src/packs/items/general/miscellaneous_Skeleton_Key_s91E77MCWpD0j6po.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Skeleton Key", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/skeleton_key.png", - "system": { - "description": "

When you use this key to open a locked door, you gain advantage on the Finesse Roll.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009081592, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "s91E77MCWpD0j6po", - "sort": 5300000, - "_key": "!items!s91E77MCWpD0j6po" -} diff --git a/src/packs/items/general/miscellaneous_Speaking_Orbs_aMujq8kf36Qtw5Bh.json b/src/packs/items/general/miscellaneous_Speaking_Orbs_aMujq8kf36Qtw5Bh.json deleted file mode 100644 index 7f1f50a4..00000000 --- a/src/packs/items/general/miscellaneous_Speaking_Orbs_aMujq8kf36Qtw5Bh.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Speaking Orbs", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/speaking_orbs.png", - "system": { - "description": "

This pair of orbs allows any creatures holding them to communicate with each other across any distance.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009080619, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "aMujq8kf36Qtw5Bh", - "sort": 5200000, - "_key": "!items!aMujq8kf36Qtw5Bh" -} diff --git a/src/packs/items/general/miscellaneous_Stride_Relic_MA1hzd2g9ffXq3cU.json b/src/packs/items/general/miscellaneous_Stride_Relic_MA1hzd2g9ffXq3cU.json deleted file mode 100644 index 4072a553..00000000 --- a/src/packs/items/general/miscellaneous_Stride_Relic_MA1hzd2g9ffXq3cU.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Stride Relic", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/stride_relic.png", - "system": { - "description": "

You gain a +1 bonus to your Agility. You can only carry one relic.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009079450, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "MA1hzd2g9ffXq3cU", - "sort": 5100000, - "_key": "!items!MA1hzd2g9ffXq3cU" -} diff --git a/src/packs/items/general/miscellaneous_Suspended_Rod_zmWjD1F8u5kxfIzX.json b/src/packs/items/general/miscellaneous_Suspended_Rod_zmWjD1F8u5kxfIzX.json deleted file mode 100644 index 378bbfb1..00000000 --- a/src/packs/items/general/miscellaneous_Suspended_Rod_zmWjD1F8u5kxfIzX.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Suspended Rod", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/suspended_rod.png", - "system": { - "description": "

This flat rod is inscribed with runes. When you activate the rod, it is immediately suspended in place. Until the rod is deactivated, it can’t move, doesn’t abide by the rules of gravity, and remains in place.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009078369, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "zmWjD1F8u5kxfIzX", - "sort": 4900000, - "_key": "!items!zmWjD1F8u5kxfIzX" -} diff --git a/src/packs/items/general/miscellaneous_Valorstone_jVeqaaFSpxbdZ7ZT.json b/src/packs/items/general/miscellaneous_Valorstone_jVeqaaFSpxbdZ7ZT.json deleted file mode 100644 index 673c5e79..00000000 --- a/src/packs/items/general/miscellaneous_Valorstone_jVeqaaFSpxbdZ7ZT.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Valorstone", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/valorstone.png", - "system": { - "description": "

You can attach this stone to armor that doesn’t already have a feature. The armor gains the following feature.

Resilient: Before you mark your last Armor Slot, roll a [[d6]]. On a result of 6, reduce the severity by one threshold without marking an Armor Slot.

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009077415, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "jVeqaaFSpxbdZ7ZT", - "sort": 4800000, - "_key": "!items!jVeqaaFSpxbdZ7ZT" -} diff --git a/src/packs/items/general/miscellaneous_Vial_of_Darksmoke_Recipe_ZJ8sWwXyNdEeEIV9.json b/src/packs/items/general/miscellaneous_Vial_of_Darksmoke_Recipe_ZJ8sWwXyNdEeEIV9.json deleted file mode 100644 index 91ffc6f5..00000000 --- a/src/packs/items/general/miscellaneous_Vial_of_Darksmoke_Recipe_ZJ8sWwXyNdEeEIV9.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Vial of Darksmoke Recipe", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/vial_of_darksmoke_recipe.png", - "system": { - "description": "

As a downtime move, you can mark a Stress to craft a @Consumables(Vial of Darksmoke).

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009076500, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "ZJ8sWwXyNdEeEIV9", - "sort": 4700000, - "_key": "!items!ZJ8sWwXyNdEeEIV9" -} diff --git a/src/packs/items/general/miscellaneous_Woven_Net_nQAlliOvdz1cgira.json b/src/packs/items/general/miscellaneous_Woven_Net_nQAlliOvdz1cgira.json deleted file mode 100644 index 61013a46..00000000 --- a/src/packs/items/general/miscellaneous_Woven_Net_nQAlliOvdz1cgira.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Woven Net", - "type": "miscellaneous", - "img": "systems/daggerheart/assets/icons/loot/woven_net.png", - "system": { - "description": "

You can make a Finesse Roll using this net to trap a small creature. A trapped target can break free with a successful Attack Roll (16).

", - "quantity": 1 - }, - "effects": [], - "folder": null, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748009075110, - "modifiedTime": 1748009143602, - "lastModifiedBy": "JKaKJsbixtjbUa07" - }, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3 - }, - "_id": "nQAlliOvdz1cgira", - "sort": 4600000, - "_key": "!items!nQAlliOvdz1cgira" -} diff --git a/src/packs/items/weapons/weapon_Aantari_Bow_DNSHS8KTawyOfQqH.json b/src/packs/items/weapons/weapon_Aantari_Bow_DNSHS8KTawyOfQqH.json deleted file mode 100644 index 8b05f7cc..00000000 --- a/src/packs/items/weapons/weapon_Aantari_Bow_DNSHS8KTawyOfQqH.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Aantari Bow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/aanatari_bow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+11", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "feature": "reliable", - "range": "far", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717524137, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "DNSHS8KTawyOfQqH", - "sort": 3400000, - "_key": "!items!DNSHS8KTawyOfQqH" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Arcane_Gauntlets_wy7ylEZZL6quWba0.json b/src/packs/items/weapons/weapon_Advanced_Arcane_Gauntlets_wy7ylEZZL6quWba0.json deleted file mode 100644 index 050b082b..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Arcane_Gauntlets_wy7ylEZZL6quWba0.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Arcane Gauntlets", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/advanced_arcane_gauntlets.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+9", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717459609, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "wy7ylEZZL6quWba0", - "sort": 4100000, - "_key": "!items!wy7ylEZZL6quWba0" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Battleaxe_8crRfaAQ9g3ZSlz0.json b/src/packs/items/weapons/weapon_Advanced_Battleaxe_8crRfaAQ9g3ZSlz0.json deleted file mode 100644 index e0af548a..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Battleaxe_8crRfaAQ9g3ZSlz0.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Battleaxe", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/advanced_battleaxe.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+9", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717461045, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "8crRfaAQ9g3ZSlz0", - "sort": 4300000, - "_key": "!items!8crRfaAQ9g3ZSlz0" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Broadsword_NM9iNiVQSWRfUzbC.json b/src/packs/items/weapons/weapon_Advanced_Broadsword_NM9iNiVQSWRfUzbC.json deleted file mode 100644 index 4dd13748..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Broadsword_NM9iNiVQSWRfUzbC.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Advanced Broadsword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/advanced_broadsword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+6", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "melee", - "burden": "oneHanded", - "feature": "reliable", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717463127, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "NM9iNiVQSWRfUzbC", - "sort": 4200000, - "_key": "!items!NM9iNiVQSWRfUzbC" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Crossbow_avxhDjL3lxBMpqq5.json b/src/packs/items/weapons/weapon_Advanced_Crossbow_avxhDjL3lxBMpqq5.json deleted file mode 100644 index 2362f59b..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Crossbow_avxhDjL3lxBMpqq5.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Crossbow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/advanced_crossbow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+7", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "far", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717464940, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "avxhDjL3lxBMpqq5", - "sort": 3600000, - "_key": "!items!avxhDjL3lxBMpqq5" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Cutlass_kBwwJ1vbuy5lyIyp.json b/src/packs/items/weapons/weapon_Advanced_Cutlass_kBwwJ1vbuy5lyIyp.json deleted file mode 100644 index 1a8e9e5e..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Cutlass_kBwwJ1vbuy5lyIyp.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Cutlass", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/advanced_cutlass.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+7", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717465845, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "kBwwJ1vbuy5lyIyp", - "sort": 3700000, - "_key": "!items!kBwwJ1vbuy5lyIyp" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Dagger_ZjZwghxJTAhbJwgf.json b/src/packs/items/weapons/weapon_Advanced_Dagger_ZjZwghxJTAhbJwgf.json deleted file mode 100644 index 07391f16..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Dagger_ZjZwghxJTAhbJwgf.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Dagger", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/advanced_dagger.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+7", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717466693, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "ZjZwghxJTAhbJwgf", - "sort": 3900000, - "_key": "!items!ZjZwghxJTAhbJwgf" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Dualstaff_9f1XlCd3fN7SgTkk.json b/src/packs/items/weapons/weapon_Advanced_Dualstaff_9f1XlCd3fN7SgTkk.json deleted file mode 100644 index f139ff57..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Dualstaff_9f1XlCd3fN7SgTkk.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Dualstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/advanced_dualstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+9", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "far", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717467499, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "9f1XlCd3fN7SgTkk", - "sort": 4000000, - "_key": "!items!9f1XlCd3fN7SgTkk" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Greatstaff_r45VbaXuCbAgeh6p.json b/src/packs/items/weapons/weapon_Advanced_Greatstaff_r45VbaXuCbAgeh6p.json deleted file mode 100644 index 1b06b864..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Greatstaff_r45VbaXuCbAgeh6p.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Advanced Greatstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/advanced_greatstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+6", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "knowledge", - "range": "veryFar", - "burden": "twoHanded", - "feature": "powerful", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717469459, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "r45VbaXuCbAgeh6p", - "sort": 3800000, - "_key": "!items!r45VbaXuCbAgeh6p" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Greatsword_XAkNXcsfWLoNeyoF.json b/src/packs/items/weapons/weapon_Advanced_Greatsword_XAkNXcsfWLoNeyoF.json deleted file mode 100644 index 58875c75..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Greatsword_XAkNXcsfWLoNeyoF.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Advanced Greatsword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/advanced_greatsword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+9", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "feature": "massive", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717470422, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "XAkNXcsfWLoNeyoF", - "sort": 2900000, - "_key": "!items!XAkNXcsfWLoNeyoF" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Halberd_1ro8WmVPGvU5AcNb.json b/src/packs/items/weapons/weapon_Advanced_Halberd_1ro8WmVPGvU5AcNb.json deleted file mode 100644 index 4b3bfd9f..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Halberd_1ro8WmVPGvU5AcNb.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Advanced Halberd", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/advanced_halberd.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+8", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "veryClose", - "burden": "twoHanded", - "feature": "cumbersome", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717471485, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "1ro8WmVPGvU5AcNb", - "sort": 3000000, - "_key": "!items!1ro8WmVPGvU5AcNb" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Hallowed_Axe_6tltkuPbrHaqbCO0.json b/src/packs/items/weapons/weapon_Advanced_Hallowed_Axe_6tltkuPbrHaqbCO0.json deleted file mode 100644 index 574eb917..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Hallowed_Axe_6tltkuPbrHaqbCO0.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Hallowed Axe", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/advanced_hallowed_axe.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+7", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717472596, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "6tltkuPbrHaqbCO0", - "sort": 3100000, - "_key": "!items!6tltkuPbrHaqbCO0" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Hand_Runes_UKnk8XcmeG5BiNEP.json b/src/packs/items/weapons/weapon_Advanced_Hand_Runes_UKnk8XcmeG5BiNEP.json deleted file mode 100644 index 143e998f..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Hand_Runes_UKnk8XcmeG5BiNEP.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Hand Runes", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/advanced_hand_runes.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+6", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "veryClose", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717474332, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "UKnk8XcmeG5BiNEP", - "sort": 3300000, - "_key": "!items!UKnk8XcmeG5BiNEP" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Longbow_CTBVsiB2abltveHL.json b/src/packs/items/weapons/weapon_Advanced_Longbow_CTBVsiB2abltveHL.json deleted file mode 100644 index 0fd849fb..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Longbow_CTBVsiB2abltveHL.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Advanced Longbow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/advanced_longbow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+9", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "veryFar", - "burden": "twoHanded", - "feature": "cumbersome", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717475290, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "CTBVsiB2abltveHL", - "sort": 3400000, - "_key": "!items!CTBVsiB2abltveHL" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Longsword_MGjqO5ovO4m63pnR.json b/src/packs/items/weapons/weapon_Advanced_Longsword_MGjqO5ovO4m63pnR.json deleted file mode 100644 index cf318497..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Longsword_MGjqO5ovO4m63pnR.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Longsword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/advanced_longsword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+9", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717476881, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "MGjqO5ovO4m63pnR", - "sort": 3500000, - "_key": "!items!MGjqO5ovO4m63pnR" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Mace_bhPYWRBEYjdLxjsS.json b/src/packs/items/weapons/weapon_Advanced_Mace_bhPYWRBEYjdLxjsS.json deleted file mode 100644 index 4d505c9b..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Mace_bhPYWRBEYjdLxjsS.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Mace", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/advanced_mace.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+7", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717478009, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "bhPYWRBEYjdLxjsS", - "sort": 3200000, - "_key": "!items!bhPYWRBEYjdLxjsS" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Quarterstaff_FAlwfHMZ57zMeEXX.json b/src/packs/items/weapons/weapon_Advanced_Quarterstaff_FAlwfHMZ57zMeEXX.json deleted file mode 100644 index 652e3f7a..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Quarterstaff_FAlwfHMZ57zMeEXX.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Quarterstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/advanced_quarterstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+9", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717479047, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "FAlwfHMZ57zMeEXX", - "sort": 1400000, - "_key": "!items!FAlwfHMZ57zMeEXX" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Rapier_2Ja5VIvPszG0ZOFa.json b/src/packs/items/weapons/weapon_Advanced_Rapier_2Ja5VIvPszG0ZOFa.json deleted file mode 100644 index eab87e9b..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Rapier_2Ja5VIvPszG0ZOFa.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Advanced Rapier", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/advanced_rapier.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+7", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "range": "melee", - "burden": "oneHanded", - "feature": "quick", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717480168, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "2Ja5VIvPszG0ZOFa", - "sort": 1500000, - "_key": "!items!2Ja5VIvPszG0ZOFa" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Returning_Blade_EiWtyGG1438yU7FE.json b/src/packs/items/weapons/weapon_Advanced_Returning_Blade_EiWtyGG1438yU7FE.json deleted file mode 100644 index 58f2da50..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Returning_Blade_EiWtyGG1438yU7FE.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Returning Blade", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/advanced_returning_blade.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+6", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "close", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717483515, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "EiWtyGG1438yU7FE", - "sort": 1600000, - "_key": "!items!EiWtyGG1438yU7FE" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Scepter_svrqrOD9ICZtyX5C.json b/src/packs/items/weapons/weapon_Advanced_Scepter_svrqrOD9ICZtyX5C.json deleted file mode 100644 index 5611f6d8..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Scepter_svrqrOD9ICZtyX5C.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Advanced Scepter", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/advanced_scepter.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+6", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "range": "far", - "burden": "twoHanded", - "feature": "versatile", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717484622, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "svrqrOD9ICZtyX5C", - "sort": 1800000, - "_key": "!items!svrqrOD9ICZtyX5C" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Shortbow_5SsnVWZfaLNZ262c.json b/src/packs/items/weapons/weapon_Advanced_Shortbow_5SsnVWZfaLNZ262c.json deleted file mode 100644 index 49cafd22..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Shortbow_5SsnVWZfaLNZ262c.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Shortbow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/advanced_shortbow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+9", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "far", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717485676, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "5SsnVWZfaLNZ262c", - "sort": 1900000, - "_key": "!items!5SsnVWZfaLNZ262c" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Shortstaff_u7WEnZfpJibSbq7j.json b/src/packs/items/weapons/weapon_Advanced_Shortstaff_u7WEnZfpJibSbq7j.json deleted file mode 100644 index fd041b5d..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Shortstaff_u7WEnZfpJibSbq7j.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Shortstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/advanced_shortstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+7", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "close", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717486808, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "u7WEnZfpJibSbq7j", - "sort": 2000000, - "_key": "!items!u7WEnZfpJibSbq7j" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Spear_E5SEF7QYomDM6tIn.json b/src/packs/items/weapons/weapon_Advanced_Spear_E5SEF7QYomDM6tIn.json deleted file mode 100644 index aa5627f4..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Spear_E5SEF7QYomDM6tIn.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Advanced Spear", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/advanced_spear.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+8", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "veryClose", - "burden": "twoHanded", - "feature": "cumbersome", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717487907, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "E5SEF7QYomDM6tIn", - "sort": 2100000, - "_key": "!items!E5SEF7QYomDM6tIn" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Wand_EBYFq8AMUrVmlV10.json b/src/packs/items/weapons/weapon_Advanced_Wand_EBYFq8AMUrVmlV10.json deleted file mode 100644 index 86dd8903..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Wand_EBYFq8AMUrVmlV10.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Advanced Wand", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/advanced_wand.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+7", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "knowledge", - "range": "far", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717489144, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "EBYFq8AMUrVmlV10", - "sort": 2200000, - "_key": "!items!EBYFq8AMUrVmlV10" -} diff --git a/src/packs/items/weapons/weapon_Advanced_Warhammer_7oyZvWDs9QXQJLkX.json b/src/packs/items/weapons/weapon_Advanced_Warhammer_7oyZvWDs9QXQJLkX.json deleted file mode 100644 index da8471b9..00000000 --- a/src/packs/items/weapons/weapon_Advanced_Warhammer_7oyZvWDs9QXQJLkX.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Advanced Warhammer", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/advanced_warhammer.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d12+9", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "feature": "heavy", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717490314, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "7oyZvWDs9QXQJLkX", - "sort": 2300000, - "_key": "!items!7oyZvWDs9QXQJLkX" -} diff --git a/src/packs/items/weapons/weapon_Arcane_Gauntlets_Py1MXNUmI81Qq5Eb.json b/src/packs/items/weapons/weapon_Arcane_Gauntlets_Py1MXNUmI81Qq5Eb.json deleted file mode 100644 index f93d6677..00000000 --- a/src/packs/items/weapons/weapon_Arcane_Gauntlets_Py1MXNUmI81Qq5Eb.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Arcane Gauntlets", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/magical/arcane_gauntlets.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+3", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717298932, - "modifiedTime": 1748717301647, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "Py1MXNUmI81Qq5Eb", - "sort": 100000, - "_key": "!items!Py1MXNUmI81Qq5Eb" -} diff --git a/src/packs/items/weapons/weapon_Axe_of_Fortunis_7acS1kBjE98WwngU.json b/src/packs/items/weapons/weapon_Axe_of_Fortunis_7acS1kBjE98WwngU.json deleted file mode 100644 index df647076..00000000 --- a/src/packs/items/weapons/weapon_Axe_of_Fortunis_7acS1kBjE98WwngU.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Axe of Fortunis", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/axe_of_fortunis.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+8", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717491382, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "7acS1kBjE98WwngU", - "sort": 2400000, - "_key": "!items!7acS1kBjE98WwngU" -} diff --git a/src/packs/items/weapons/weapon_Battleaxe_FasGIMef6XBoygUG.json b/src/packs/items/weapons/weapon_Battleaxe_FasGIMef6XBoygUG.json deleted file mode 100644 index a0f3d95f..00000000 --- a/src/packs/items/weapons/weapon_Battleaxe_FasGIMef6XBoygUG.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Battleaxe", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/physical/battleaxe.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+3", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717300326, - "modifiedTime": 1748717301647, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "FasGIMef6XBoygUG", - "sort": 300000, - "_key": "!items!FasGIMef6XBoygUG" -} diff --git a/src/packs/items/weapons/weapon_Black_Powder_Revolver_yKRCcrggt4kroLGc.json b/src/packs/items/weapons/weapon_Black_Powder_Revolver_yKRCcrggt4kroLGc.json deleted file mode 100644 index 2aecea8d..00000000 --- a/src/packs/items/weapons/weapon_Black_Powder_Revolver_yKRCcrggt4kroLGc.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Black Powder Revolver", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/black_powder_revolver.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+8", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "far", - "burden": "oneHanded", - "feature": "reloading", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717492483, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "yKRCcrggt4kroLGc", - "sort": 2500000, - "_key": "!items!yKRCcrggt4kroLGc" -} diff --git a/src/packs/items/weapons/weapon_Bladed_Whip_DcugVpNyWKgoKvSf.json b/src/packs/items/weapons/weapon_Bladed_Whip_DcugVpNyWKgoKvSf.json deleted file mode 100644 index 6919bb3c..00000000 --- a/src/packs/items/weapons/weapon_Bladed_Whip_DcugVpNyWKgoKvSf.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Bladed Whip", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/bladed_whip.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+3", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "veryClose", - "burden": "oneHanded", - "feature": "quick", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717375482, - "modifiedTime": 1748717378187, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "DcugVpNyWKgoKvSf", - "sort": 100000, - "_key": "!items!DcugVpNyWKgoKvSf" -} diff --git a/src/packs/items/weapons/weapon_Blessed_Anlace_c93VQ2ZLScV0o0m5.json b/src/packs/items/weapons/weapon_Blessed_Anlace_c93VQ2ZLScV0o0m5.json deleted file mode 100644 index c836ea11..00000000 --- a/src/packs/items/weapons/weapon_Blessed_Anlace_c93VQ2ZLScV0o0m5.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Blessed Anlace", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/blessed_anlace.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+6", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717493410, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "c93VQ2ZLScV0o0m5", - "sort": 2600000, - "_key": "!items!c93VQ2ZLScV0o0m5" -} diff --git a/src/packs/items/weapons/weapon_Bloodstaff_nrb7pyh8YYncOWti.json b/src/packs/items/weapons/weapon_Bloodstaff_nrb7pyh8YYncOWti.json deleted file mode 100644 index dfbc4892..00000000 --- a/src/packs/items/weapons/weapon_Bloodstaff_nrb7pyh8YYncOWti.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Bloodstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/bloodstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d20+7", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "feature": "painful", - "range": "far", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717526335, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "nrb7pyh8YYncOWti", - "sort": 3500000, - "_key": "!items!nrb7pyh8YYncOWti" -} diff --git a/src/packs/items/weapons/weapon_Blunderbuss_xLFEBehUK17zML2B.json b/src/packs/items/weapons/weapon_Blunderbuss_xLFEBehUK17zML2B.json deleted file mode 100644 index 3f19deae..00000000 --- a/src/packs/items/weapons/weapon_Blunderbuss_xLFEBehUK17zML2B.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Blunderbuss", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/blunderbuss.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+6", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "close", - "burden": "twoHanded", - "feature": "reloading", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717376945, - "modifiedTime": 1748717378187, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "xLFEBehUK17zML2B", - "sort": 300000, - "_key": "!items!xLFEBehUK17zML2B" -} diff --git a/src/packs/items/weapons/weapon_Bravesword_JCvRYFpIwdqfmqdk.json b/src/packs/items/weapons/weapon_Bravesword_JCvRYFpIwdqfmqdk.json deleted file mode 100644 index 21a60083..00000000 --- a/src/packs/items/weapons/weapon_Bravesword_JCvRYFpIwdqfmqdk.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Bravesword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/bravesword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d12+7", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "feature": "barrier", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717494401, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "JCvRYFpIwdqfmqdk", - "sort": 2700000, - "_key": "!items!JCvRYFpIwdqfmqdk" -} diff --git a/src/packs/items/weapons/weapon_Broadsword_tB2lDopuefiG4gD7.json b/src/packs/items/weapons/weapon_Broadsword_tB2lDopuefiG4gD7.json deleted file mode 100644 index d9531417..00000000 --- a/src/packs/items/weapons/weapon_Broadsword_tB2lDopuefiG4gD7.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Broadsword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/physical/broadsword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "melee", - "burden": "oneHanded", - "feature": "reliable", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717301639, - "modifiedTime": 1748717301647, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "tB2lDopuefiG4gD7", - "sort": 200000, - "_key": "!items!tB2lDopuefiG4gD7" -} diff --git a/src/packs/items/weapons/weapon_Casting_Sword_qfJbWjwKZ5k8vzCr.json b/src/packs/items/weapons/weapon_Casting_Sword_qfJbWjwKZ5k8vzCr.json deleted file mode 100644 index db7c83f3..00000000 --- a/src/packs/items/weapons/weapon_Casting_Sword_qfJbWjwKZ5k8vzCr.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Casting Sword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/casting_sword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+4", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "feature": "versatile", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717378179, - "modifiedTime": 1748717378187, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "qfJbWjwKZ5k8vzCr", - "sort": 200000, - "_key": "!items!qfJbWjwKZ5k8vzCr" -} diff --git a/src/packs/items/weapons/weapon_Crossbow_sTIiyrI2o2GHKp0u.json b/src/packs/items/weapons/weapon_Crossbow_sTIiyrI2o2GHKp0u.json deleted file mode 100644 index 535214e1..00000000 --- a/src/packs/items/weapons/weapon_Crossbow_sTIiyrI2o2GHKp0u.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Crossbow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/physical/crossbow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+1", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "far", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717302887, - "modifiedTime": 1748717302887, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "sTIiyrI2o2GHKp0u", - "sort": 0, - "_key": "!items!sTIiyrI2o2GHKp0u" -} diff --git a/src/packs/items/weapons/weapon_Curved_Dagger_IQpfAz5mjXBNgq7A.json b/src/packs/items/weapons/weapon_Curved_Dagger_IQpfAz5mjXBNgq7A.json deleted file mode 100644 index 7281f453..00000000 --- a/src/packs/items/weapons/weapon_Curved_Dagger_IQpfAz5mjXBNgq7A.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Curved Dagger", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/curved_dagger.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+9", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "feature": "serrated", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717527943, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "IQpfAz5mjXBNgq7A", - "sort": 3700000, - "_key": "!items!IQpfAz5mjXBNgq7A" -} diff --git a/src/packs/items/weapons/weapon_Cutlass_HdyZyBywO1byCsfM.json b/src/packs/items/weapons/weapon_Cutlass_HdyZyBywO1byCsfM.json deleted file mode 100644 index a02f02d2..00000000 --- a/src/packs/items/weapons/weapon_Cutlass_HdyZyBywO1byCsfM.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Cutlass", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/physical/cutlass.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+1", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717304153, - "modifiedTime": 1748717304153, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "HdyZyBywO1byCsfM", - "sort": 0, - "_key": "!items!HdyZyBywO1byCsfM" -} diff --git a/src/packs/items/weapons/weapon_Dagger_PQ8QSP0BhzJcVy4Z.json b/src/packs/items/weapons/weapon_Dagger_PQ8QSP0BhzJcVy4Z.json deleted file mode 100644 index 8f3a42e8..00000000 --- a/src/packs/items/weapons/weapon_Dagger_PQ8QSP0BhzJcVy4Z.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Dagger", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/physical/dagger.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+1", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717305476, - "modifiedTime": 1748717305476, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "PQ8QSP0BhzJcVy4Z", - "sort": 0, - "_key": "!items!PQ8QSP0BhzJcVy4Z" -} diff --git a/src/packs/items/weapons/weapon_Devouring_Dagger_iv4ojTQDd91tOGeP.json b/src/packs/items/weapons/weapon_Devouring_Dagger_iv4ojTQDd91tOGeP.json deleted file mode 100644 index fb7e07c6..00000000 --- a/src/packs/items/weapons/weapon_Devouring_Dagger_iv4ojTQDd91tOGeP.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Devouring Dagger", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/devouring_dagger.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+4", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "melee", - "burden": "oneHanded", - "feature": "scary", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717379624, - "modifiedTime": 1748717379624, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "iv4ojTQDd91tOGeP", - "sort": 0, - "_key": "!items!iv4ojTQDd91tOGeP" -} diff --git a/src/packs/items/weapons/weapon_Double_Flail_9U7Q69SA2V4WtlyE.json b/src/packs/items/weapons/weapon_Double_Flail_9U7Q69SA2V4WtlyE.json deleted file mode 100644 index a90dfb30..00000000 --- a/src/packs/items/weapons/weapon_Double_Flail_9U7Q69SA2V4WtlyE.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Double Flail", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/double_flail.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+8", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "veryClose", - "burden": "twoHanded", - "feature": "powerful", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717495519, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "9U7Q69SA2V4WtlyE", - "sort": 2800000, - "_key": "!items!9U7Q69SA2V4WtlyE" -} diff --git a/src/packs/items/weapons/weapon_Dual_Ended_Sword_wT0yIYoQmgXgUyhO.json b/src/packs/items/weapons/weapon_Dual_Ended_Sword_wT0yIYoQmgXgUyhO.json deleted file mode 100644 index f8909d74..00000000 --- a/src/packs/items/weapons/weapon_Dual_Ended_Sword_wT0yIYoQmgXgUyhO.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Dual-Ended Sword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/dual-ended_sword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+9", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "feature": "quick", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717532363, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "wT0yIYoQmgXgUyhO", - "sort": 3600000, - "_key": "!items!wT0yIYoQmgXgUyhO" -} diff --git a/src/packs/items/weapons/weapon_Dualstaff_953Q2rTuxkAuNhyh.json b/src/packs/items/weapons/weapon_Dualstaff_953Q2rTuxkAuNhyh.json deleted file mode 100644 index 456c4550..00000000 --- a/src/packs/items/weapons/weapon_Dualstaff_953Q2rTuxkAuNhyh.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Dualstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/magical/dualstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+3", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "far", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717306841, - "modifiedTime": 1748717306841, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "953Q2rTuxkAuNhyh", - "sort": 0, - "_key": "!items!953Q2rTuxkAuNhyh" -} diff --git a/src/packs/items/weapons/weapon_Ego_Blade_wiud7JWoMilk2KQN.json b/src/packs/items/weapons/weapon_Ego_Blade_wiud7JWoMilk2KQN.json deleted file mode 100644 index da564bc1..00000000 --- a/src/packs/items/weapons/weapon_Ego_Blade_wiud7JWoMilk2KQN.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Ego Blade", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/ego_blade.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d12+4", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "melee", - "burden": "oneHanded", - "feature": "pompous", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717381040, - "modifiedTime": 1748717381040, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "wiud7JWoMilk2KQN", - "sort": 0, - "_key": "!items!wiud7JWoMilk2KQN" -} diff --git a/src/packs/items/weapons/weapon_Elder_Bow_rgUz50aNrRn9poGf.json b/src/packs/items/weapons/weapon_Elder_Bow_rgUz50aNrRn9poGf.json deleted file mode 100644 index 5d7336a2..00000000 --- a/src/packs/items/weapons/weapon_Elder_Bow_rgUz50aNrRn9poGf.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Elder Bow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/elder_bow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+4", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "far", - "burden": "twoHanded", - "feature": "powerful", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717382547, - "modifiedTime": 1748717382547, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "rgUz50aNrRn9poGf", - "sort": 0, - "_key": "!items!rgUz50aNrRn9poGf" -} diff --git a/src/packs/items/weapons/weapon_Extended_Polearm_Yg3WZZq6jgAn9xED.json b/src/packs/items/weapons/weapon_Extended_Polearm_Yg3WZZq6jgAn9xED.json deleted file mode 100644 index e8021932..00000000 --- a/src/packs/items/weapons/weapon_Extended_Polearm_Yg3WZZq6jgAn9xED.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Extended Polearm", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/extended_polearm.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+10", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "feature": "long", - "range": "veryClose", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717533153, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "Yg3WZZq6jgAn9xED", - "sort": 3000000, - "_key": "!items!Yg3WZZq6jgAn9xED" -} diff --git a/src/packs/items/weapons/weapon_Finehair_Bow_KocXOIOSVFazOqFh.json b/src/packs/items/weapons/weapon_Finehair_Bow_KocXOIOSVFazOqFh.json deleted file mode 100644 index c29fb816..00000000 --- a/src/packs/items/weapons/weapon_Finehair_Bow_KocXOIOSVFazOqFh.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Finehair Bow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/finehair_bow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+5", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "veryFar", - "burden": "twoHanded", - "feature": "reliable", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717383959, - "modifiedTime": 1748717383959, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "KocXOIOSVFazOqFh", - "sort": 0, - "_key": "!items!KocXOIOSVFazOqFh" -} diff --git a/src/packs/items/weapons/weapon_Firestaff_0jQunbQG1LnTRdOI.json b/src/packs/items/weapons/weapon_Firestaff_0jQunbQG1LnTRdOI.json deleted file mode 100644 index 612729b5..00000000 --- a/src/packs/items/weapons/weapon_Firestaff_0jQunbQG1LnTRdOI.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Firestaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/firestaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+7", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "far", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717500707, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "0jQunbQG1LnTRdOI", - "sort": 1700000, - "_key": "!items!0jQunbQG1LnTRdOI" -} diff --git a/src/packs/items/weapons/weapon_Flickerfly_Blade_QGAvPrLPWHJWcAV1.json b/src/packs/items/weapons/weapon_Flickerfly_Blade_QGAvPrLPWHJWcAV1.json deleted file mode 100644 index e0108d7b..00000000 --- a/src/packs/items/weapons/weapon_Flickerfly_Blade_QGAvPrLPWHJWcAV1.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Flickerfly Blade", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/flickerfly_blade.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+5", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "melee", - "burden": "oneHanded", - "feature": "sheltering", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717501586, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "QGAvPrLPWHJWcAV1", - "sort": 100000, - "_key": "!items!QGAvPrLPWHJWcAV1" -} diff --git a/src/packs/items/weapons/weapon_Floating_Bladeshards_arBh0DEfg5X9TJbn.json b/src/packs/items/weapons/weapon_Floating_Bladeshards_arBh0DEfg5X9TJbn.json deleted file mode 100644 index 3bdb4c54..00000000 --- a/src/packs/items/weapons/weapon_Floating_Bladeshards_arBh0DEfg5X9TJbn.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Floating Bladeshards", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/floating_bladeshards.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+9", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "feature": "powerful", - "range": "close", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717533904, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "arBh0DEfg5X9TJbn", - "sort": 3200000, - "_key": "!items!arBh0DEfg5X9TJbn" -} diff --git a/src/packs/items/weapons/weapon_Fusion_Gloves_Rj1eYiu6BPp58xn2.json b/src/packs/items/weapons/weapon_Fusion_Gloves_Rj1eYiu6BPp58xn2.json deleted file mode 100644 index f390e89a..00000000 --- a/src/packs/items/weapons/weapon_Fusion_Gloves_Rj1eYiu6BPp58xn2.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Fusion Gloves", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/fusion_gloves.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+9", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "knowledge", - "feature": "bonded", - "range": "veryFar", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717535412, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "Rj1eYiu6BPp58xn2", - "sort": 3300000, - "_key": "!items!Rj1eYiu6BPp58xn2" -} diff --git a/src/packs/items/weapons/weapon_Ghostblade_QzymDpCD7NMbLlpu.json b/src/packs/items/weapons/weapon_Ghostblade_QzymDpCD7NMbLlpu.json deleted file mode 100644 index 641fb2d3..00000000 --- a/src/packs/items/weapons/weapon_Ghostblade_QzymDpCD7NMbLlpu.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Ghostblade", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/ghostblade.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+7", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717502573, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "QzymDpCD7NMbLlpu", - "sort": 200000, - "_key": "!items!QzymDpCD7NMbLlpu" -} diff --git a/src/packs/items/weapons/weapon_Gilded_Bow_XONn2rH8NyZbXi68.json b/src/packs/items/weapons/weapon_Gilded_Bow_XONn2rH8NyZbXi68.json deleted file mode 100644 index bc6bf2c6..00000000 --- a/src/packs/items/weapons/weapon_Gilded_Bow_XONn2rH8NyZbXi68.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Gilded Bow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/guilded_bow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+7", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "far", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717503716, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "XONn2rH8NyZbXi68", - "sort": 300000, - "_key": "!items!XONn2rH8NyZbXi68" -} diff --git a/src/packs/items/weapons/weapon_Gilded_Falchion_ZOL4O7BqmcmYHfjY.json b/src/packs/items/weapons/weapon_Gilded_Falchion_ZOL4O7BqmcmYHfjY.json deleted file mode 100644 index dfd58243..00000000 --- a/src/packs/items/weapons/weapon_Gilded_Falchion_ZOL4O7BqmcmYHfjY.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Gilded Falchion", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/gilded_falchion.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+4", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "oneHanded", - "feature": "powerful", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717385831, - "modifiedTime": 1748717385831, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "ZOL4O7BqmcmYHfjY", - "sort": 0, - "_key": "!items!ZOL4O7BqmcmYHfjY" -} diff --git a/src/packs/items/weapons/weapon_Glowing_Rings_4Mjzmyvjwhq3mm6l.json b/src/packs/items/weapons/weapon_Glowing_Rings_4Mjzmyvjwhq3mm6l.json deleted file mode 100644 index 747ae64b..00000000 --- a/src/packs/items/weapons/weapon_Glowing_Rings_4Mjzmyvjwhq3mm6l.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Glowing Rings", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/magical/glowing_rings.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+1", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "veryClose", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717308235, - "modifiedTime": 1748717308235, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "4Mjzmyvjwhq3mm6l", - "sort": 0, - "_key": "!items!4Mjzmyvjwhq3mm6l" -} diff --git a/src/packs/items/weapons/weapon_Greatbow_cxBpxu3X2bNs8HN4.json b/src/packs/items/weapons/weapon_Greatbow_cxBpxu3X2bNs8HN4.json deleted file mode 100644 index 69cb6dd3..00000000 --- a/src/packs/items/weapons/weapon_Greatbow_cxBpxu3X2bNs8HN4.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Greatbow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/greatbow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+6", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "far", - "burden": "twoHanded", - "feature": "powerful", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717387209, - "modifiedTime": 1748717387209, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "cxBpxu3X2bNs8HN4", - "sort": 0, - "_key": "!items!cxBpxu3X2bNs8HN4" -} diff --git a/src/packs/items/weapons/weapon_Greatstaff_AYSnrvAX0IgbexFI.json b/src/packs/items/weapons/weapon_Greatstaff_AYSnrvAX0IgbexFI.json deleted file mode 100644 index 10cd56d1..00000000 --- a/src/packs/items/weapons/weapon_Greatstaff_AYSnrvAX0IgbexFI.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Greatstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/magical/greatstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "knowledge", - "range": "veryFar", - "burden": "twoHanded", - "feature": "powerful", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717309498, - "modifiedTime": 1748717309498, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "AYSnrvAX0IgbexFI", - "sort": 0, - "_key": "!items!AYSnrvAX0IgbexFI" -} diff --git a/src/packs/items/weapons/weapon_Greatsword_GsRLkQG13xoPc7kq.json b/src/packs/items/weapons/weapon_Greatsword_GsRLkQG13xoPc7kq.json deleted file mode 100644 index 3190cb87..00000000 --- a/src/packs/items/weapons/weapon_Greatsword_GsRLkQG13xoPc7kq.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Greatsword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/physical/greatsword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+3", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "feature": "massive", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717311128, - "modifiedTime": 1748717311128, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "GsRLkQG13xoPc7kq", - "sort": 0, - "_key": "!items!GsRLkQG13xoPc7kq" -} diff --git a/src/packs/items/weapons/weapon_Halberd_0SlckjJMb30R5ErF.json b/src/packs/items/weapons/weapon_Halberd_0SlckjJMb30R5ErF.json deleted file mode 100644 index 6e805337..00000000 --- a/src/packs/items/weapons/weapon_Halberd_0SlckjJMb30R5ErF.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Halberd", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/physical/halberd.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+2", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "veryClose", - "burden": "twoHanded", - "feature": "cumbersome", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717312672, - "modifiedTime": 1748717312672, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "0SlckjJMb30R5ErF", - "sort": 0, - "_key": "!items!0SlckjJMb30R5ErF" -} diff --git a/src/packs/items/weapons/weapon_Hallowed_Axe_WckoUxyJZfvq9cR7.json b/src/packs/items/weapons/weapon_Hallowed_Axe_WckoUxyJZfvq9cR7.json deleted file mode 100644 index 963009de..00000000 --- a/src/packs/items/weapons/weapon_Hallowed_Axe_WckoUxyJZfvq9cR7.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Hallowed Axe", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/magical/hallowed_axe.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+1", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717314116, - "modifiedTime": 1748717314116, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "WckoUxyJZfvq9cR7", - "sort": 0, - "_key": "!items!WckoUxyJZfvq9cR7" -} diff --git a/src/packs/items/weapons/weapon_Hammer_of_Exota_p889rprb5FMsSlK5.json b/src/packs/items/weapons/weapon_Hammer_of_Exota_p889rprb5FMsSlK5.json deleted file mode 100644 index 7638fd22..00000000 --- a/src/packs/items/weapons/weapon_Hammer_of_Exota_p889rprb5FMsSlK5.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Hammer of Exota", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/hammer_of_exota.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+6", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "melee", - "burden": "twoHanded", - "feature": "eruptive", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717388704, - "modifiedTime": 1748717388704, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "p889rprb5FMsSlK5", - "sort": 0, - "_key": "!items!p889rprb5FMsSlK5" -} diff --git a/src/packs/items/weapons/weapon_Hammer_of_Wrath_cHrHkq7AwYk34ach.json b/src/packs/items/weapons/weapon_Hammer_of_Wrath_cHrHkq7AwYk34ach.json deleted file mode 100644 index 618e6497..00000000 --- a/src/packs/items/weapons/weapon_Hammer_of_Wrath_cHrHkq7AwYk34ach.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Hammer of Wrath", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/hammer_of_wrath.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+7", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "feature": "devastating", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717504678, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "cHrHkq7AwYk34ach", - "sort": 400000, - "_key": "!items!cHrHkq7AwYk34ach" -} diff --git a/src/packs/items/weapons/weapon_Hand_Cannon_4tAGYqfm0fsSncr4.json b/src/packs/items/weapons/weapon_Hand_Cannon_4tAGYqfm0fsSncr4.json deleted file mode 100644 index cba099a4..00000000 --- a/src/packs/items/weapons/weapon_Hand_Cannon_4tAGYqfm0fsSncr4.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Hand Cannon", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/hand_cannon.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+12", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "feature": "reloading", - "range": "veryFar", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717536259, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "4tAGYqfm0fsSncr4", - "sort": 3100000, - "_key": "!items!4tAGYqfm0fsSncr4" -} diff --git a/src/packs/items/weapons/weapon_Hand_Runes_mPaKupCQhJzS5wMc.json b/src/packs/items/weapons/weapon_Hand_Runes_mPaKupCQhJzS5wMc.json deleted file mode 100644 index 770f5589..00000000 --- a/src/packs/items/weapons/weapon_Hand_Runes_mPaKupCQhJzS5wMc.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Hand Runes", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/magical/hand_runes.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "veryClose", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717315723, - "modifiedTime": 1748717315723, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "mPaKupCQhJzS5wMc", - "sort": 0, - "_key": "!items!mPaKupCQhJzS5wMc" -} diff --git a/src/packs/items/weapons/weapon_Ilmari_s_Rifle_qGH3VFuBQV8DGhPd.json b/src/packs/items/weapons/weapon_Ilmari_s_Rifle_qGH3VFuBQV8DGhPd.json deleted file mode 100644 index e1b6da69..00000000 --- a/src/packs/items/weapons/weapon_Ilmari_s_Rifle_qGH3VFuBQV8DGhPd.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Ilmari's Rifle", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/ilmaris_rifle.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+6", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "veryFar", - "burden": "oneHanded", - "feature": "reloading", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717505646, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "qGH3VFuBQV8DGhPd", - "sort": 500000, - "_key": "!items!qGH3VFuBQV8DGhPd" -} diff --git a/src/packs/items/weapons/weapon_Impact_Gauntlet_H73r7YuOkVmAgIci.json b/src/packs/items/weapons/weapon_Impact_Gauntlet_H73r7YuOkVmAgIci.json deleted file mode 100644 index be332871..00000000 --- a/src/packs/items/weapons/weapon_Impact_Gauntlet_H73r7YuOkVmAgIci.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Impact Gauntlet", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/impact_gauntlet.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+11", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "feature": "concussive", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717537244, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "H73r7YuOkVmAgIci", - "sort": 2500000, - "_key": "!items!H73r7YuOkVmAgIci" -} diff --git a/src/packs/items/weapons/weapon_Improved_Arcane_Gauntlets_CTkuKjwWfrvmmRvH.json b/src/packs/items/weapons/weapon_Improved_Arcane_Gauntlets_CTkuKjwWfrvmmRvH.json deleted file mode 100644 index a19b0b49..00000000 --- a/src/packs/items/weapons/weapon_Improved_Arcane_Gauntlets_CTkuKjwWfrvmmRvH.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Arcane Gauntlets", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/improved_arcane_gauntlets.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+6", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717390549, - "modifiedTime": 1748717390549, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "CTkuKjwWfrvmmRvH", - "sort": 0, - "_key": "!items!CTkuKjwWfrvmmRvH" -} diff --git a/src/packs/items/weapons/weapon_Improved_Battleaxe_c6ss8Ydb5ydmLsnO.json b/src/packs/items/weapons/weapon_Improved_Battleaxe_c6ss8Ydb5ydmLsnO.json deleted file mode 100644 index 1cd64b77..00000000 --- a/src/packs/items/weapons/weapon_Improved_Battleaxe_c6ss8Ydb5ydmLsnO.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Battleaxe", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/improved_battleaxe.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+6", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717392247, - "modifiedTime": 1748717392247, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "c6ss8Ydb5ydmLsnO", - "sort": 0, - "_key": "!items!c6ss8Ydb5ydmLsnO" -} diff --git a/src/packs/items/weapons/weapon_Improved_Broadsword_lXRVCITpGlXF3sOw.json b/src/packs/items/weapons/weapon_Improved_Broadsword_lXRVCITpGlXF3sOw.json deleted file mode 100644 index d05328d0..00000000 --- a/src/packs/items/weapons/weapon_Improved_Broadsword_lXRVCITpGlXF3sOw.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Improved Broadsword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/improved_broadsword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+3", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "melee", - "burden": "oneHanded", - "feature": "reliable", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717394086, - "modifiedTime": 1748717394086, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "lXRVCITpGlXF3sOw", - "sort": 0, - "_key": "!items!lXRVCITpGlXF3sOw" -} diff --git a/src/packs/items/weapons/weapon_Improved_Crossbow_TSvPCik6v3UYqr9f.json b/src/packs/items/weapons/weapon_Improved_Crossbow_TSvPCik6v3UYqr9f.json deleted file mode 100644 index 7ce693d6..00000000 --- a/src/packs/items/weapons/weapon_Improved_Crossbow_TSvPCik6v3UYqr9f.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Crossbow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/improved_crossbow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+4", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "far", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717395774, - "modifiedTime": 1748717395774, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "TSvPCik6v3UYqr9f", - "sort": 0, - "_key": "!items!TSvPCik6v3UYqr9f" -} diff --git a/src/packs/items/weapons/weapon_Improved_Cutlass_sCuu0hIzsdWowP4h.json b/src/packs/items/weapons/weapon_Improved_Cutlass_sCuu0hIzsdWowP4h.json deleted file mode 100644 index 964ccb86..00000000 --- a/src/packs/items/weapons/weapon_Improved_Cutlass_sCuu0hIzsdWowP4h.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Cutlass", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/improved_cutlass.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+4", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717397513, - "modifiedTime": 1748717397513, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "sCuu0hIzsdWowP4h", - "sort": 0, - "_key": "!items!sCuu0hIzsdWowP4h" -} diff --git a/src/packs/items/weapons/weapon_Improved_Dagger_qyMnZ5uJTeqgiEPb.json b/src/packs/items/weapons/weapon_Improved_Dagger_qyMnZ5uJTeqgiEPb.json deleted file mode 100644 index 6e50b531..00000000 --- a/src/packs/items/weapons/weapon_Improved_Dagger_qyMnZ5uJTeqgiEPb.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Dagger", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/improved_dagger.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+4", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717399443, - "modifiedTime": 1748717399443, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "qyMnZ5uJTeqgiEPb", - "sort": 0, - "_key": "!items!qyMnZ5uJTeqgiEPb" -} diff --git a/src/packs/items/weapons/weapon_Improved_Dualstaff_wNB9Uyl3aY842K9p.json b/src/packs/items/weapons/weapon_Improved_Dualstaff_wNB9Uyl3aY842K9p.json deleted file mode 100644 index e3adee4f..00000000 --- a/src/packs/items/weapons/weapon_Improved_Dualstaff_wNB9Uyl3aY842K9p.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Dualstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/improved_dualstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+6", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "far", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717401150, - "modifiedTime": 1748717401150, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "wNB9Uyl3aY842K9p", - "sort": 0, - "_key": "!items!wNB9Uyl3aY842K9p" -} diff --git a/src/packs/items/weapons/weapon_Improved_Glowing_Rings_9jzi0f7MOL3Ot1tj.json b/src/packs/items/weapons/weapon_Improved_Glowing_Rings_9jzi0f7MOL3Ot1tj.json deleted file mode 100644 index 6e24544f..00000000 --- a/src/packs/items/weapons/weapon_Improved_Glowing_Rings_9jzi0f7MOL3Ot1tj.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Glowing Rings", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/improved_glowing_rings.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+5", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "veryClose", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717403044, - "modifiedTime": 1748717403044, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "9jzi0f7MOL3Ot1tj", - "sort": 0, - "_key": "!items!9jzi0f7MOL3Ot1tj" -} diff --git a/src/packs/items/weapons/weapon_Improved_Greatstaff_rZEHNAwKW1vgS3Or.json b/src/packs/items/weapons/weapon_Improved_Greatstaff_rZEHNAwKW1vgS3Or.json deleted file mode 100644 index 6a8a9e0c..00000000 --- a/src/packs/items/weapons/weapon_Improved_Greatstaff_rZEHNAwKW1vgS3Or.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Improved Greatstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/improved_greatstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+3", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "knowledge", - "range": "veryClose", - "burden": "twoHanded", - "feature": "powerful", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717405238, - "modifiedTime": 1748717405238, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "rZEHNAwKW1vgS3Or", - "sort": 0, - "_key": "!items!rZEHNAwKW1vgS3Or" -} diff --git a/src/packs/items/weapons/weapon_Improved_Greatsword_c1HtTqfS9OnNv1Bt.json b/src/packs/items/weapons/weapon_Improved_Greatsword_c1HtTqfS9OnNv1Bt.json deleted file mode 100644 index 5cc7bd6c..00000000 --- a/src/packs/items/weapons/weapon_Improved_Greatsword_c1HtTqfS9OnNv1Bt.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Improved Greatsword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/improved_greatsword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+6", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "feature": "massive", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717406944, - "modifiedTime": 1748717406944, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "c1HtTqfS9OnNv1Bt", - "sort": 0, - "_key": "!items!c1HtTqfS9OnNv1Bt" -} diff --git a/src/packs/items/weapons/weapon_Improved_Halberd_0i6CzOfsBoZjbuTZ.json b/src/packs/items/weapons/weapon_Improved_Halberd_0i6CzOfsBoZjbuTZ.json deleted file mode 100644 index d8dc3027..00000000 --- a/src/packs/items/weapons/weapon_Improved_Halberd_0i6CzOfsBoZjbuTZ.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Improved Halberd", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/improved_halberd.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+5", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "veryClose", - "burden": "twoHanded", - "feature": "cumbersome", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717408834, - "modifiedTime": 1748717408834, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "0i6CzOfsBoZjbuTZ", - "sort": 0, - "_key": "!items!0i6CzOfsBoZjbuTZ" -} diff --git a/src/packs/items/weapons/weapon_Improved_Hallowed_Axe_6zrrwIYQNa7gHhDA.json b/src/packs/items/weapons/weapon_Improved_Hallowed_Axe_6zrrwIYQNa7gHhDA.json deleted file mode 100644 index 62771665..00000000 --- a/src/packs/items/weapons/weapon_Improved_Hallowed_Axe_6zrrwIYQNa7gHhDA.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Hallowed Axe", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/improved_hallowed_axe.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+4", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717413816, - "modifiedTime": 1748717413816, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "6zrrwIYQNa7gHhDA", - "sort": 0, - "_key": "!items!6zrrwIYQNa7gHhDA" -} diff --git a/src/packs/items/weapons/weapon_Improved_Hand_Runes_PlJj4nObc6zDVVIv.json b/src/packs/items/weapons/weapon_Improved_Hand_Runes_PlJj4nObc6zDVVIv.json deleted file mode 100644 index 7674b8cf..00000000 --- a/src/packs/items/weapons/weapon_Improved_Hand_Runes_PlJj4nObc6zDVVIv.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Hand Runes", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/improved_hand_runes.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+3", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "veryClose", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717415774, - "modifiedTime": 1748717415774, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "PlJj4nObc6zDVVIv", - "sort": 0, - "_key": "!items!PlJj4nObc6zDVVIv" -} diff --git a/src/packs/items/weapons/weapon_Improved_Longbow_S9fPH89qdYHAygG5.json b/src/packs/items/weapons/weapon_Improved_Longbow_S9fPH89qdYHAygG5.json deleted file mode 100644 index 4a2c263e..00000000 --- a/src/packs/items/weapons/weapon_Improved_Longbow_S9fPH89qdYHAygG5.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Improved Longbow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/improved_longbow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+6", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "veryFar", - "burden": "twoHanded", - "feature": "cumbersome", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717417053, - "modifiedTime": 1748717417053, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "S9fPH89qdYHAygG5", - "sort": 0, - "_key": "!items!S9fPH89qdYHAygG5" -} diff --git a/src/packs/items/weapons/weapon_Improved_Longsword_1sk01NDq0XVHAFpa.json b/src/packs/items/weapons/weapon_Improved_Longsword_1sk01NDq0XVHAFpa.json deleted file mode 100644 index 726efa75..00000000 --- a/src/packs/items/weapons/weapon_Improved_Longsword_1sk01NDq0XVHAFpa.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Longsword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/improved_longsword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+6", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717418334, - "modifiedTime": 1748717418334, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "1sk01NDq0XVHAFpa", - "sort": 0, - "_key": "!items!1sk01NDq0XVHAFpa" -} diff --git a/src/packs/items/weapons/weapon_Improved_Mace_KwCBPCV9wFH9FuxZ.json b/src/packs/items/weapons/weapon_Improved_Mace_KwCBPCV9wFH9FuxZ.json deleted file mode 100644 index aa11fb2c..00000000 --- a/src/packs/items/weapons/weapon_Improved_Mace_KwCBPCV9wFH9FuxZ.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Mace", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/improved_mace.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+4", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717419874, - "modifiedTime": 1748717419874, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "KwCBPCV9wFH9FuxZ", - "sort": 0, - "_key": "!items!KwCBPCV9wFH9FuxZ" -} diff --git a/src/packs/items/weapons/weapon_Improved_Quarterstaff_CgELEWAyG4ASDLZA.json b/src/packs/items/weapons/weapon_Improved_Quarterstaff_CgELEWAyG4ASDLZA.json deleted file mode 100644 index 0edd000b..00000000 --- a/src/packs/items/weapons/weapon_Improved_Quarterstaff_CgELEWAyG4ASDLZA.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Quarterstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/improved_quarterstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+6", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717421307, - "modifiedTime": 1748717421307, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "CgELEWAyG4ASDLZA", - "sort": 0, - "_key": "!items!CgELEWAyG4ASDLZA" -} diff --git a/src/packs/items/weapons/weapon_Improved_Rapier_BCUXoneSYSw0imXe.json b/src/packs/items/weapons/weapon_Improved_Rapier_BCUXoneSYSw0imXe.json deleted file mode 100644 index 46d31fc6..00000000 --- a/src/packs/items/weapons/weapon_Improved_Rapier_BCUXoneSYSw0imXe.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Improved Rapier", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/improved_rapier.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+3", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "range": "melee", - "burden": "oneHanded", - "feature": "quick", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717422912, - "modifiedTime": 1748717422912, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "BCUXoneSYSw0imXe", - "sort": 0, - "_key": "!items!BCUXoneSYSw0imXe" -} diff --git a/src/packs/items/weapons/weapon_Improved_Returning_Blade_YHlzVFpHVYyDJSwc.json b/src/packs/items/weapons/weapon_Improved_Returning_Blade_YHlzVFpHVYyDJSwc.json deleted file mode 100644 index 50e968bd..00000000 --- a/src/packs/items/weapons/weapon_Improved_Returning_Blade_YHlzVFpHVYyDJSwc.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Improved Returning Blade", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/improved_returning_blade.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+3", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "close", - "burden": "oneHanded", - "feature": "retractable", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717424591, - "modifiedTime": 1748717424591, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "YHlzVFpHVYyDJSwc", - "sort": 0, - "_key": "!items!YHlzVFpHVYyDJSwc" -} diff --git a/src/packs/items/weapons/weapon_Improved_Scepter_uPqG5L8ltREV4605.json b/src/packs/items/weapons/weapon_Improved_Scepter_uPqG5L8ltREV4605.json deleted file mode 100644 index bf3ba045..00000000 --- a/src/packs/items/weapons/weapon_Improved_Scepter_uPqG5L8ltREV4605.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Improved Scepter", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/improved_scepter.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+3", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "range": "far", - "burden": "twoHanded", - "feature": "versatile", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717425972, - "modifiedTime": 1748717425972, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "uPqG5L8ltREV4605", - "sort": 0, - "_key": "!items!uPqG5L8ltREV4605" -} diff --git a/src/packs/items/weapons/weapon_Improved_Shortbow_ZSBJ0cYWHrWMMJHc.json b/src/packs/items/weapons/weapon_Improved_Shortbow_ZSBJ0cYWHrWMMJHc.json deleted file mode 100644 index 5e24e823..00000000 --- a/src/packs/items/weapons/weapon_Improved_Shortbow_ZSBJ0cYWHrWMMJHc.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Shortbow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/improved_shortbow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+6", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "far", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717427240, - "modifiedTime": 1748717427240, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "ZSBJ0cYWHrWMMJHc", - "sort": 0, - "_key": "!items!ZSBJ0cYWHrWMMJHc" -} diff --git a/src/packs/items/weapons/weapon_Improved_Shortstaff_RkJezS4b5VwesYoR.json b/src/packs/items/weapons/weapon_Improved_Shortstaff_RkJezS4b5VwesYoR.json deleted file mode 100644 index 6a586e6e..00000000 --- a/src/packs/items/weapons/weapon_Improved_Shortstaff_RkJezS4b5VwesYoR.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Shortstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/improved_shortstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+4", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "close", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717428719, - "modifiedTime": 1748717428719, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "RkJezS4b5VwesYoR", - "sort": 0, - "_key": "!items!RkJezS4b5VwesYoR" -} diff --git a/src/packs/items/weapons/weapon_Improved_Spear_KnWHxJNf7ZJWePdg.json b/src/packs/items/weapons/weapon_Improved_Spear_KnWHxJNf7ZJWePdg.json deleted file mode 100644 index 7d5898b1..00000000 --- a/src/packs/items/weapons/weapon_Improved_Spear_KnWHxJNf7ZJWePdg.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Improved Spear", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/improved_spear.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+5", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "veryClose", - "burden": "twoHanded", - "feature": "cumbersome", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717430283, - "modifiedTime": 1748717430283, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "KnWHxJNf7ZJWePdg", - "sort": 0, - "_key": "!items!KnWHxJNf7ZJWePdg" -} diff --git a/src/packs/items/weapons/weapon_Improved_Wand_NzvNV6lnWPbk7AQW.json b/src/packs/items/weapons/weapon_Improved_Wand_NzvNV6lnWPbk7AQW.json deleted file mode 100644 index 54f83705..00000000 --- a/src/packs/items/weapons/weapon_Improved_Wand_NzvNV6lnWPbk7AQW.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Improved Wand", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/improved_wand.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+4", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "knowledge", - "range": "far", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717432599, - "modifiedTime": 1748717432599, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "NzvNV6lnWPbk7AQW", - "sort": 0, - "_key": "!items!NzvNV6lnWPbk7AQW" -} diff --git a/src/packs/items/weapons/weapon_Improved_Warhammer_0grDkkD9bYHT3Dk5.json b/src/packs/items/weapons/weapon_Improved_Warhammer_0grDkkD9bYHT3Dk5.json deleted file mode 100644 index 590c06bb..00000000 --- a/src/packs/items/weapons/weapon_Improved_Warhammer_0grDkkD9bYHT3Dk5.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Improved Warhammer", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/improved_warhammer.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d12+6", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "feature": "heavy", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717434236, - "modifiedTime": 1748717434236, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "0grDkkD9bYHT3Dk5", - "sort": 0, - "_key": "!items!0grDkkD9bYHT3Dk5" -} diff --git a/src/packs/items/weapons/weapon_Keeper_s_Staff_EyPLO7vy5VcmEKbA.json b/src/packs/items/weapons/weapon_Keeper_s_Staff_EyPLO7vy5VcmEKbA.json deleted file mode 100644 index 53fde521..00000000 --- a/src/packs/items/weapons/weapon_Keeper_s_Staff_EyPLO7vy5VcmEKbA.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Keeper's Staff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/keepers_staff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+4", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "knowledge", - "range": "far", - "burden": "twoHanded", - "feature": "reliable", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717435900, - "modifiedTime": 1748717435900, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "EyPLO7vy5VcmEKbA", - "sort": 0, - "_key": "!items!EyPLO7vy5VcmEKbA" -} diff --git a/src/packs/items/weapons/weapon_Knuckle_Blades_kzE863F8Kqh6Ssrw.json b/src/packs/items/weapons/weapon_Knuckle_Blades_kzE863F8Kqh6Ssrw.json deleted file mode 100644 index b0d9d8be..00000000 --- a/src/packs/items/weapons/weapon_Knuckle_Blades_kzE863F8Kqh6Ssrw.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Knuckle Blades", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/knuckle_blades.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+6", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "feature": "brutal", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717437872, - "modifiedTime": 1748717437872, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "kzE863F8Kqh6Ssrw", - "sort": 0, - "_key": "!items!kzE863F8Kqh6Ssrw" -} diff --git a/src/packs/items/weapons/weapon_Labrys_Axe_Wzkf1I3PMKX1aL22.json b/src/packs/items/weapons/weapon_Labrys_Axe_Wzkf1I3PMKX1aL22.json deleted file mode 100644 index bc5ec10c..00000000 --- a/src/packs/items/weapons/weapon_Labrys_Axe_Wzkf1I3PMKX1aL22.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Labrys Axe", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/labrys_axe.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+7", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "feature": "protective", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717506661, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "Wzkf1I3PMKX1aL22", - "sort": 600000, - "_key": "!items!Wzkf1I3PMKX1aL22" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Arcane_Gauntlets_brGbwSLC8i5KSIgw.json b/src/packs/items/weapons/weapon_Legendary_Arcane_Gauntlets_brGbwSLC8i5KSIgw.json deleted file mode 100644 index 4110d8b0..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Arcane_Gauntlets_brGbwSLC8i5KSIgw.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Arcane Gauntlets", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/legendary_arcane_gauntlets.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+12", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "feature": "", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717538077, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "brGbwSLC8i5KSIgw", - "sort": 2700000, - "_key": "!items!brGbwSLC8i5KSIgw" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Battleaxe_RZqNqIJA8Y76vyAS.json b/src/packs/items/weapons/weapon_Legendary_Battleaxe_RZqNqIJA8Y76vyAS.json deleted file mode 100644 index 389e0132..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Battleaxe_RZqNqIJA8Y76vyAS.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Battleaxe", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/legendary_battleaxe.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+12", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "feature": "", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717538837, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "RZqNqIJA8Y76vyAS", - "sort": 2800000, - "_key": "!items!RZqNqIJA8Y76vyAS" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Broadsword_ZagTf04G2LUzBVIJ.json b/src/packs/items/weapons/weapon_Legendary_Broadsword_ZagTf04G2LUzBVIJ.json deleted file mode 100644 index 56e05c79..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Broadsword_ZagTf04G2LUzBVIJ.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Broadsword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/legendary_broadsword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+9", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "feature": "reliable", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717539610, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "ZagTf04G2LUzBVIJ", - "sort": 2900000, - "_key": "!items!ZagTf04G2LUzBVIJ" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Crossbow_kHO5zhsA6neUWIIY.json b/src/packs/items/weapons/weapon_Legendary_Crossbow_kHO5zhsA6neUWIIY.json deleted file mode 100644 index bdb8e03a..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Crossbow_kHO5zhsA6neUWIIY.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Crossbow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/legendary_crossbow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+10", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "feature": "", - "range": "far", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717540479, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "kHO5zhsA6neUWIIY", - "sort": 2600000, - "_key": "!items!kHO5zhsA6neUWIIY" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Cutlass_5yF2KXtThRMjHlVY.json b/src/packs/items/weapons/weapon_Legendary_Cutlass_5yF2KXtThRMjHlVY.json deleted file mode 100644 index 8381ee07..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Cutlass_5yF2KXtThRMjHlVY.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Cutlass", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/legendary_cutlass.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+10", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "feature": "", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717541362, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "5yF2KXtThRMjHlVY", - "sort": 1900000, - "_key": "!items!5yF2KXtThRMjHlVY" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Dagger_KWPrdOcsjw0UqiaO.json b/src/packs/items/weapons/weapon_Legendary_Dagger_KWPrdOcsjw0UqiaO.json deleted file mode 100644 index a6fa77b4..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Dagger_KWPrdOcsjw0UqiaO.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Dagger", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/legendary_dagger.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+10", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "feature": "", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717542285, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "KWPrdOcsjw0UqiaO", - "sort": 2100000, - "_key": "!items!KWPrdOcsjw0UqiaO" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Dualstaff_CA7tFWu0yJY8AKaf.json b/src/packs/items/weapons/weapon_Legendary_Dualstaff_CA7tFWu0yJY8AKaf.json deleted file mode 100644 index 98dbc23f..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Dualstaff_CA7tFWu0yJY8AKaf.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Dualstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/legendary_dualstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+12", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "feature": "", - "range": "far", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717545502, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "CA7tFWu0yJY8AKaf", - "sort": 2200000, - "_key": "!items!CA7tFWu0yJY8AKaf" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Glowing_Rings_M5ksicUetj1cUQV4.json b/src/packs/items/weapons/weapon_Legendary_Glowing_Rings_M5ksicUetj1cUQV4.json deleted file mode 100644 index dfc85a25..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Glowing_Rings_M5ksicUetj1cUQV4.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Glowing Rings", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/legendary_glowing_rings.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+11", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "feature": "", - "range": "veryClose", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717546412, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "M5ksicUetj1cUQV4", - "sort": 2300000, - "_key": "!items!M5ksicUetj1cUQV4" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Greatstaff_8vK8Cgp43QjVAqO4.json b/src/packs/items/weapons/weapon_Legendary_Greatstaff_8vK8Cgp43QjVAqO4.json deleted file mode 100644 index c9414434..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Greatstaff_8vK8Cgp43QjVAqO4.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Greatstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/legendary_greatstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+9", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "knowledge", - "feature": "powerful", - "range": "veryClose", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717547431, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "8vK8Cgp43QjVAqO4", - "sort": 2400000, - "_key": "!items!8vK8Cgp43QjVAqO4" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Greatsword_g1Jg7UAyWPHswjec.json b/src/packs/items/weapons/weapon_Legendary_Greatsword_g1Jg7UAyWPHswjec.json deleted file mode 100644 index 75854650..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Greatsword_g1Jg7UAyWPHswjec.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Greatsword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/legendary_greatsword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+12", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "feature": "massive", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717548513, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "g1Jg7UAyWPHswjec", - "sort": 2000000, - "_key": "!items!g1Jg7UAyWPHswjec" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Halberd_r0XAlwFuUBrKALfw.json b/src/packs/items/weapons/weapon_Legendary_Halberd_r0XAlwFuUBrKALfw.json deleted file mode 100644 index e70520fc..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Halberd_r0XAlwFuUBrKALfw.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Halberd", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/legendary_halberd.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+11", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "feature": "cumbersome", - "range": "veryClose", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717554475, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "r0XAlwFuUBrKALfw", - "sort": 800000, - "_key": "!items!r0XAlwFuUBrKALfw" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Hallowed_Axe_cgmsLxAQ3o9oUoCG.json b/src/packs/items/weapons/weapon_Legendary_Hallowed_Axe_cgmsLxAQ3o9oUoCG.json deleted file mode 100644 index aa8f16dd..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Hallowed_Axe_cgmsLxAQ3o9oUoCG.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Hallowed Axe", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/legendary_hallowed_axe.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+10", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "feature": "", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717555462, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "cgmsLxAQ3o9oUoCG", - "sort": 900000, - "_key": "!items!cgmsLxAQ3o9oUoCG" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Hand_Runes_aY7GF7lU7pozg8ji.json b/src/packs/items/weapons/weapon_Legendary_Hand_Runes_aY7GF7lU7pozg8ji.json deleted file mode 100644 index b8403b79..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Hand_Runes_aY7GF7lU7pozg8ji.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Hand Runes", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/legendary_hand_runes.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+9", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "feature": "", - "range": "veryClose", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717556534, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "aY7GF7lU7pozg8ji", - "sort": 1000000, - "_key": "!items!aY7GF7lU7pozg8ji" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Longbow_0VMzALprSt7t4vk7.json b/src/packs/items/weapons/weapon_Legendary_Longbow_0VMzALprSt7t4vk7.json deleted file mode 100644 index 39e9db2a..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Longbow_0VMzALprSt7t4vk7.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Longbow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/legendary_longbow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+12", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "feature": "cumbersome", - "range": "veryFar", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717557541, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "0VMzALprSt7t4vk7", - "sort": 1200000, - "_key": "!items!0VMzALprSt7t4vk7" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Longsword_OfYAhe88Z0biN4Sa.json b/src/packs/items/weapons/weapon_Legendary_Longsword_OfYAhe88Z0biN4Sa.json deleted file mode 100644 index 71d42e3a..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Longsword_OfYAhe88Z0biN4Sa.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Longsword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/legendary_longsword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+12", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "feature": "", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717558437, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "OfYAhe88Z0biN4Sa", - "sort": 1300000, - "_key": "!items!OfYAhe88Z0biN4Sa" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Mace_ZImmy9vIJlmnzEPr.json b/src/packs/items/weapons/weapon_Legendary_Mace_ZImmy9vIJlmnzEPr.json deleted file mode 100644 index a85f47c9..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Mace_ZImmy9vIJlmnzEPr.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Mace", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/legendary_mace.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+10", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "feature": "", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717559415, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "ZImmy9vIJlmnzEPr", - "sort": 1400000, - "_key": "!items!ZImmy9vIJlmnzEPr" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Quarterstaff_pinNKWkejkzHPCQj.json b/src/packs/items/weapons/weapon_Legendary_Quarterstaff_pinNKWkejkzHPCQj.json deleted file mode 100644 index cae48ce2..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Quarterstaff_pinNKWkejkzHPCQj.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Quarterstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/legendary_quarterstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+12", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "feature": "", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717560359, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "pinNKWkejkzHPCQj", - "sort": 1500000, - "_key": "!items!pinNKWkejkzHPCQj" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Rapier_90XtvPz8EfjqdMcM.json b/src/packs/items/weapons/weapon_Legendary_Rapier_90XtvPz8EfjqdMcM.json deleted file mode 100644 index 50a64ae5..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Rapier_90XtvPz8EfjqdMcM.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Rapier", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/legendary_rapier.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+9", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "feature": "quick", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717561443, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "90XtvPz8EfjqdMcM", - "sort": 1600000, - "_key": "!items!90XtvPz8EfjqdMcM" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Returning_Blade_RYRwUObgRgWOWjAY.json b/src/packs/items/weapons/weapon_Legendary_Returning_Blade_RYRwUObgRgWOWjAY.json deleted file mode 100644 index d244ac49..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Returning_Blade_RYRwUObgRgWOWjAY.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "Legendary Returning Blade", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/legendary_returning_blade.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+9", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "close", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717562323, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "RYRwUObgRgWOWjAY", - "sort": 1700000, - "_key": "!items!RYRwUObgRgWOWjAY" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Scepter_zut78R32b72vCe2W.json b/src/packs/items/weapons/weapon_Legendary_Scepter_zut78R32b72vCe2W.json deleted file mode 100644 index c33e9009..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Scepter_zut78R32b72vCe2W.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Scepter", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/legendary_scepter.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+9", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "feature": "versatile", - "range": "far", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717563317, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "zut78R32b72vCe2W", - "sort": 1800000, - "_key": "!items!zut78R32b72vCe2W" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Shortbow_KDQClgBxRL6ky6pP.json b/src/packs/items/weapons/weapon_Legendary_Shortbow_KDQClgBxRL6ky6pP.json deleted file mode 100644 index 4165ee73..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Shortbow_KDQClgBxRL6ky6pP.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Shortbow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/legendary_shortbow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+12", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "feature": "", - "range": "far", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717568502, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "KDQClgBxRL6ky6pP", - "sort": 1100000, - "_key": "!items!KDQClgBxRL6ky6pP" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Shortstaff_a3Am2xUZxQuqkvqQ.json b/src/packs/items/weapons/weapon_Legendary_Shortstaff_a3Am2xUZxQuqkvqQ.json deleted file mode 100644 index 9a60ef3f..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Shortstaff_a3Am2xUZxQuqkvqQ.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Shortstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/legendary_shortstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+10", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "feature": "", - "range": "close", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717569510, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "a3Am2xUZxQuqkvqQ", - "sort": 100000, - "_key": "!items!a3Am2xUZxQuqkvqQ" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Spear_zT53LgiBetkWtQKE.json b/src/packs/items/weapons/weapon_Legendary_Spear_zT53LgiBetkWtQKE.json deleted file mode 100644 index ebbea09a..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Spear_zT53LgiBetkWtQKE.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Spear", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/legendary_spear.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+11", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "feature": "cumbersome", - "range": "veryClose", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717570332, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "zT53LgiBetkWtQKE", - "sort": 300000, - "_key": "!items!zT53LgiBetkWtQKE" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Wand_YAMbvl0sGYWaeGuh.json b/src/packs/items/weapons/weapon_Legendary_Wand_YAMbvl0sGYWaeGuh.json deleted file mode 100644 index 77e24ffa..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Wand_YAMbvl0sGYWaeGuh.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Wand", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/legendary_wand.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+10", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "knowledge", - "feature": "", - "range": "far", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717571500, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "YAMbvl0sGYWaeGuh", - "sort": 400000, - "_key": "!items!YAMbvl0sGYWaeGuh" -} diff --git a/src/packs/items/weapons/weapon_Legendary_Warhammer_Ms76FGrkbxJu3xdP.json b/src/packs/items/weapons/weapon_Legendary_Warhammer_Ms76FGrkbxJu3xdP.json deleted file mode 100644 index aa6ced97..00000000 --- a/src/packs/items/weapons/weapon_Legendary_Warhammer_Ms76FGrkbxJu3xdP.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Legendary Warhammer", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/legendary_warhammer.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d12+12", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "feature": "heavy", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717572463, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "Ms76FGrkbxJu3xdP", - "sort": 500000, - "_key": "!items!Ms76FGrkbxJu3xdP" -} diff --git a/src/packs/items/weapons/weapon_Longbow_QxDqWi0hu9uNwwe6.json b/src/packs/items/weapons/weapon_Longbow_QxDqWi0hu9uNwwe6.json deleted file mode 100644 index d9c979e7..00000000 --- a/src/packs/items/weapons/weapon_Longbow_QxDqWi0hu9uNwwe6.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Longbow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/physical/longbow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+3", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "veryFar", - "burden": "twoHanded", - "feature": "cumbersome", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717317714, - "modifiedTime": 1748717317714, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "QxDqWi0hu9uNwwe6", - "sort": 0, - "_key": "!items!QxDqWi0hu9uNwwe6" -} diff --git a/src/packs/items/weapons/weapon_Longsword_h8XhL7dB7mJbFf6R.json b/src/packs/items/weapons/weapon_Longsword_h8XhL7dB7mJbFf6R.json deleted file mode 100644 index ffc4c0eb..00000000 --- a/src/packs/items/weapons/weapon_Longsword_h8XhL7dB7mJbFf6R.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Longsword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/physical/longsword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+3", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717319700, - "modifiedTime": 1748717319700, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "h8XhL7dB7mJbFf6R", - "sort": 0, - "_key": "!items!h8XhL7dB7mJbFf6R" -} diff --git a/src/packs/items/weapons/weapon_Mace_CFIK5SxXN2FxV8ew.json b/src/packs/items/weapons/weapon_Mace_CFIK5SxXN2FxV8ew.json deleted file mode 100644 index c4f08417..00000000 --- a/src/packs/items/weapons/weapon_Mace_CFIK5SxXN2FxV8ew.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Mace", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/physical/mace.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+1", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717321399, - "modifiedTime": 1748717321399, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "CFIK5SxXN2FxV8ew", - "sort": 0, - "_key": "!items!CFIK5SxXN2FxV8ew" -} diff --git a/src/packs/items/weapons/weapon_Mage_Orb_xP8qusQ2orIHnDIk.json b/src/packs/items/weapons/weapon_Mage_Orb_xP8qusQ2orIHnDIk.json deleted file mode 100644 index 971cc15c..00000000 --- a/src/packs/items/weapons/weapon_Mage_Orb_xP8qusQ2orIHnDIk.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Mage Orb", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/mage_orb.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+7", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "knowledge", - "range": "far", - "burden": "oneHanded", - "feature": "powerful", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717507510, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "xP8qusQ2orIHnDIk", - "sort": 700000, - "_key": "!items!xP8qusQ2orIHnDIk" -} diff --git a/src/packs/items/weapons/weapon_Magus_Revolver_QBZi7ftJIv4VRSjX.json b/src/packs/items/weapons/weapon_Magus_Revolver_QBZi7ftJIv4VRSjX.json deleted file mode 100644 index be95ce4d..00000000 --- a/src/packs/items/weapons/weapon_Magus_Revolver_QBZi7ftJIv4VRSjX.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Magus Revolver", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/magus_revolver.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+13", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "feature": "reloading", - "range": "veryFar", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717573571, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "QBZi7ftJIv4VRSjX", - "sort": 600000, - "_key": "!items!QBZi7ftJIv4VRSjX" -} diff --git a/src/packs/items/weapons/weapon_Meridian_Cutlass_O5e5ltywjeEwXZw5.json b/src/packs/items/weapons/weapon_Meridian_Cutlass_O5e5ltywjeEwXZw5.json deleted file mode 100644 index cdf12995..00000000 --- a/src/packs/items/weapons/weapon_Meridian_Cutlass_O5e5ltywjeEwXZw5.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Meridian Cutlass", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/meridian_cutlass.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+5", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "range": "melee", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717508398, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "O5e5ltywjeEwXZw5", - "sort": 800000, - "_key": "!items!O5e5ltywjeEwXZw5" -} diff --git a/src/packs/items/weapons/weapon_Midas_Scythe_NCQxM3efha2fi3un.json b/src/packs/items/weapons/weapon_Midas_Scythe_NCQxM3efha2fi3un.json deleted file mode 100644 index e8e508fc..00000000 --- a/src/packs/items/weapons/weapon_Midas_Scythe_NCQxM3efha2fi3un.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Midas Scythe", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/midas_scythe.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+9", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "knowledge", - "feature": "greedy", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717574508, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "NCQxM3efha2fi3un", - "sort": 700000, - "_key": "!items!NCQxM3efha2fi3un" -} diff --git a/src/packs/items/weapons/weapon_Quarterstaff_J4Mlwt3BmVeWV6vC.json b/src/packs/items/weapons/weapon_Quarterstaff_J4Mlwt3BmVeWV6vC.json deleted file mode 100644 index 052ed3bd..00000000 --- a/src/packs/items/weapons/weapon_Quarterstaff_J4Mlwt3BmVeWV6vC.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Quarterstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/physical/quarterstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+3", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717323051, - "modifiedTime": 1748717323051, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "J4Mlwt3BmVeWV6vC", - "sort": 0, - "_key": "!items!J4Mlwt3BmVeWV6vC" -} diff --git a/src/packs/items/weapons/weapon_Rapier_GldFyzsA56nyVQZR.json b/src/packs/items/weapons/weapon_Rapier_GldFyzsA56nyVQZR.json deleted file mode 100644 index d9b43795..00000000 --- a/src/packs/items/weapons/weapon_Rapier_GldFyzsA56nyVQZR.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Rapier", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/physical/rapier.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "range": "melee", - "burden": "oneHanded", - "feature": "quick", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717324656, - "modifiedTime": 1748717324656, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "GldFyzsA56nyVQZR", - "sort": 0, - "_key": "!items!GldFyzsA56nyVQZR" -} diff --git a/src/packs/items/weapons/weapon_Retractable_Saber_7lqP8EycKwpsYp2H.json b/src/packs/items/weapons/weapon_Retractable_Saber_7lqP8EycKwpsYp2H.json deleted file mode 100644 index 9ead1e04..00000000 --- a/src/packs/items/weapons/weapon_Retractable_Saber_7lqP8EycKwpsYp2H.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Retractable Saber", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/retractable_saber.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+7", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "range": "melee", - "burden": "oneHanded", - "feature": "retractable", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717509423, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "7lqP8EycKwpsYp2H", - "sort": 1000000, - "_key": "!items!7lqP8EycKwpsYp2H" -} diff --git a/src/packs/items/weapons/weapon_Returning_Blade_JsKC4GypAiA67a60.json b/src/packs/items/weapons/weapon_Returning_Blade_JsKC4GypAiA67a60.json deleted file mode 100644 index a0388166..00000000 --- a/src/packs/items/weapons/weapon_Returning_Blade_JsKC4GypAiA67a60.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Returning Blade", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/magical/returning_blade.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8", - "type": "magical" - }, - "quantity": 1, - "description": "

Returning: When this weapon is thrown within its

range, it appears in your hand immediately after the

attack.

", - "trait": "finesse", - "range": "close", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717326300, - "modifiedTime": 1748717326300, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "JsKC4GypAiA67a60", - "sort": 0, - "_key": "!items!JsKC4GypAiA67a60" -} diff --git a/src/packs/items/weapons/weapon_Ricochet_Axes_ianVggptVejn9RnU.json b/src/packs/items/weapons/weapon_Ricochet_Axes_ianVggptVejn9RnU.json deleted file mode 100644 index 5ebee5b4..00000000 --- a/src/packs/items/weapons/weapon_Ricochet_Axes_ianVggptVejn9RnU.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Ricochet Axes", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/ricochet_axes.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+11", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "feature": "bouncing", - "range": "far", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717577623, - "modifiedTime": 1748717577648, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "ianVggptVejn9RnU", - "sort": 200000, - "_key": "!items!ianVggptVejn9RnU" -} diff --git a/src/packs/items/weapons/weapon_Runes_of_Ruination_SyrN9HZ2q5J3uw7f.json b/src/packs/items/weapons/weapon_Runes_of_Ruination_SyrN9HZ2q5J3uw7f.json deleted file mode 100644 index a8c6d9e4..00000000 --- a/src/packs/items/weapons/weapon_Runes_of_Ruination_SyrN9HZ2q5J3uw7f.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Runes of Ruination", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/runes_of_ruination.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d20+4", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "knowledge", - "range": "veryClose", - "burden": "oneHanded", - "feature": "painful", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717510342, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "SyrN9HZ2q5J3uw7f", - "sort": 1100000, - "_key": "!items!SyrN9HZ2q5J3uw7f" -} diff --git a/src/packs/items/weapons/weapon_Scepter_As9XfR5ZpwnfcEsM.json b/src/packs/items/weapons/weapon_Scepter_As9XfR5ZpwnfcEsM.json deleted file mode 100644 index 32d85e6e..00000000 --- a/src/packs/items/weapons/weapon_Scepter_As9XfR5ZpwnfcEsM.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Scepter", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/magical/scepter.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "range": "far", - "burden": "twoHanded", - "feature": "versatile", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717328765, - "modifiedTime": 1748717328765, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "As9XfR5ZpwnfcEsM", - "sort": 0, - "_key": "!items!As9XfR5ZpwnfcEsM" -} diff --git a/src/packs/items/weapons/weapon_Scepter_of_Elias_XIrmU6NCXXElx2JI.json b/src/packs/items/weapons/weapon_Scepter_of_Elias_XIrmU6NCXXElx2JI.json deleted file mode 100644 index 96790016..00000000 --- a/src/packs/items/weapons/weapon_Scepter_of_Elias_XIrmU6NCXXElx2JI.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Scepter of Elias", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/scepter_of_elias.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+3", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "range": "far", - "burden": "oneHanded", - "feature": "invigorating", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717439440, - "modifiedTime": 1748717439440, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "XIrmU6NCXXElx2JI", - "sort": 0, - "_key": "!items!XIrmU6NCXXElx2JI" -} diff --git a/src/packs/items/weapons/weapon_Shortbow_GoooPAB5sJ9eDPWz.json b/src/packs/items/weapons/weapon_Shortbow_GoooPAB5sJ9eDPWz.json deleted file mode 100644 index 9392141b..00000000 --- a/src/packs/items/weapons/weapon_Shortbow_GoooPAB5sJ9eDPWz.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Shortbow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/physical/shortbow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+3", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "far", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717331306, - "modifiedTime": 1748717331306, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "GoooPAB5sJ9eDPWz", - "sort": 0, - "_key": "!items!GoooPAB5sJ9eDPWz" -} diff --git a/src/packs/items/weapons/weapon_Shortstaff_ydm5W8kYujEbElmj.json b/src/packs/items/weapons/weapon_Shortstaff_ydm5W8kYujEbElmj.json deleted file mode 100644 index c19c1486..00000000 --- a/src/packs/items/weapons/weapon_Shortstaff_ydm5W8kYujEbElmj.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Shortstaff", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/magical/shortstaff.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+1", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "range": "close", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717334049, - "modifiedTime": 1748717334049, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "ydm5W8kYujEbElmj", - "sort": 0, - "_key": "!items!ydm5W8kYujEbElmj" -} diff --git a/src/packs/items/weapons/weapon_Siphoning_Gauntlets_WdbNUGWB2Dsx0JLs.json b/src/packs/items/weapons/weapon_Siphoning_Gauntlets_WdbNUGWB2Dsx0JLs.json deleted file mode 100644 index adad70ab..00000000 --- a/src/packs/items/weapons/weapon_Siphoning_Gauntlets_WdbNUGWB2Dsx0JLs.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Siphoning Gauntlets", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/siphoning_gauntlets.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+9", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "feature": "lifestealing", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717578566, - "modifiedTime": 1748717578566, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "WdbNUGWB2Dsx0JLs", - "sort": 0, - "_key": "!items!WdbNUGWB2Dsx0JLs" -} diff --git a/src/packs/items/weapons/weapon_Sledge_Axe_BYcF7qAR8yR5Rv0f.json b/src/packs/items/weapons/weapon_Sledge_Axe_BYcF7qAR8yR5Rv0f.json deleted file mode 100644 index 850b7055..00000000 --- a/src/packs/items/weapons/weapon_Sledge_Axe_BYcF7qAR8yR5Rv0f.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Sledge Axe", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/sledge_axe.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d12+13", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "feature": "destructive", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717579882, - "modifiedTime": 1748717579882, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "BYcF7qAR8yR5Rv0f", - "sort": 0, - "_key": "!items!BYcF7qAR8yR5Rv0f" -} diff --git a/src/packs/items/weapons/weapon_Spear_ZsX59BQsuGvlB3mw.json b/src/packs/items/weapons/weapon_Spear_ZsX59BQsuGvlB3mw.json deleted file mode 100644 index 215db200..00000000 --- a/src/packs/items/weapons/weapon_Spear_ZsX59BQsuGvlB3mw.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Spear", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/physical/spear.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+2", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "veryClose", - "burden": "twoHanded", - "feature": "cumbersome", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717336219, - "modifiedTime": 1748717336219, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "ZsX59BQsuGvlB3mw", - "sort": 0, - "_key": "!items!ZsX59BQsuGvlB3mw" -} diff --git a/src/packs/items/weapons/weapon_Spiked_Bow_oyQRdPFBkPu1G7uN.json b/src/packs/items/weapons/weapon_Spiked_Bow_oyQRdPFBkPu1G7uN.json deleted file mode 100644 index 90020bd1..00000000 --- a/src/packs/items/weapons/weapon_Spiked_Bow_oyQRdPFBkPu1G7uN.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Spiked Bow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/spiked_bow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+7", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "agility", - "range": "veryFar", - "burden": "twoHanded", - "feature": "versatile", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717511737, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "oyQRdPFBkPu1G7uN", - "sort": 1200000, - "_key": "!items!oyQRdPFBkPu1G7uN" -} diff --git a/src/packs/items/weapons/weapon_Steelforged_Halberd_rrWmGNT0L0Cvw9Tx.json b/src/packs/items/weapons/weapon_Steelforged_Halberd_rrWmGNT0L0Cvw9Tx.json deleted file mode 100644 index 6f9f3254..00000000 --- a/src/packs/items/weapons/weapon_Steelforged_Halberd_rrWmGNT0L0Cvw9Tx.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Steelforged Halberd", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/steelforged_halberd.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+4", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "veryClose", - "burden": "twoHanded", - "feature": "scary", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717441444, - "modifiedTime": 1748717441444, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "rrWmGNT0L0Cvw9Tx", - "sort": 0, - "_key": "!items!rrWmGNT0L0Cvw9Tx" -} diff --git a/src/packs/items/weapons/weapon_Swinging_Ropeblade_e6DVC3wUxMM7puMK.json b/src/packs/items/weapons/weapon_Swinging_Ropeblade_e6DVC3wUxMM7puMK.json deleted file mode 100644 index 6154390b..00000000 --- a/src/packs/items/weapons/weapon_Swinging_Ropeblade_e6DVC3wUxMM7puMK.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Swinging Ropeblade", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/physical/swinging_ropeblade.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+9", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "feature": "grappling", - "range": "close", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717581081, - "modifiedTime": 1748717581081, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "e6DVC3wUxMM7puMK", - "sort": 0, - "_key": "!items!e6DVC3wUxMM7puMK" -} diff --git a/src/packs/items/weapons/weapon_Sword_of_Light___Flame_8Sa5TccQvhWde1O7.json b/src/packs/items/weapons/weapon_Sword_of_Light___Flame_8Sa5TccQvhWde1O7.json deleted file mode 100644 index c3af3775..00000000 --- a/src/packs/items/weapons/weapon_Sword_of_Light___Flame_8Sa5TccQvhWde1O7.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "Sword of Light & Flame", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/sword_of_light_flame.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+11", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717581996, - "modifiedTime": 1748717581996, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "8Sa5TccQvhWde1O7", - "sort": 0, - "_key": "!items!8Sa5TccQvhWde1O7" -} diff --git a/src/packs/items/weapons/weapon_Talon_Blades_lswl0hauQmLAQh58.json b/src/packs/items/weapons/weapon_Talon_Blades_lswl0hauQmLAQh58.json deleted file mode 100644 index 020093cf..00000000 --- a/src/packs/items/weapons/weapon_Talon_Blades_lswl0hauQmLAQh58.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Talon Blades", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/physical/talon_blades.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+7", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "close", - "burden": "twoHanded", - "feature": "brutal", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717513931, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "lswl0hauQmLAQh58", - "sort": 1300000, - "_key": "!items!lswl0hauQmLAQh58" -} diff --git a/src/packs/items/weapons/weapon_Thistlebow_FoLC2rSujCBXxtZ9.json b/src/packs/items/weapons/weapon_Thistlebow_FoLC2rSujCBXxtZ9.json deleted file mode 100644 index 092631db..00000000 --- a/src/packs/items/weapons/weapon_Thistlebow_FoLC2rSujCBXxtZ9.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Thistlebow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/thistlebow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+13", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "instinct", - "feature": "reliable", - "range": "far", - "burden": "twoHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717582991, - "modifiedTime": 1748717582991, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "FoLC2rSujCBXxtZ9", - "sort": 0, - "_key": "!items!FoLC2rSujCBXxtZ9" -} diff --git a/src/packs/items/weapons/weapon_Urok_Broadsword_kpp3gAPXoke7mx0d.json b/src/packs/items/weapons/weapon_Urok_Broadsword_kpp3gAPXoke7mx0d.json deleted file mode 100644 index 8c67d46c..00000000 --- a/src/packs/items/weapons/weapon_Urok_Broadsword_kpp3gAPXoke7mx0d.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Urok Broadsword", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/urok_broadsword.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+3", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "melee", - "burden": "oneHanded", - "feature": "devastating", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717444575, - "modifiedTime": 1748717444575, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "kpp3gAPXoke7mx0d", - "sort": 0, - "_key": "!items!kpp3gAPXoke7mx0d" -} diff --git a/src/packs/items/weapons/weapon_Wand_of_Enthrallment_8u0tnoaSBpRWmVex.json b/src/packs/items/weapons/weapon_Wand_of_Enthrallment_8u0tnoaSBpRWmVex.json deleted file mode 100644 index 6899f777..00000000 --- a/src/packs/items/weapons/weapon_Wand_of_Enthrallment_8u0tnoaSBpRWmVex.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Wand of Enthrallment", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/wand_of_enthrallment.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+4", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "presence", - "range": "far", - "burden": "oneHanded", - "feature": "persuasive", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717447447, - "modifiedTime": 1748717447447, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "8u0tnoaSBpRWmVex", - "sort": 0, - "_key": "!items!8u0tnoaSBpRWmVex" -} diff --git a/src/packs/items/weapons/weapon_Wand_of_Essek_lNWN759jT1Z098RI.json b/src/packs/items/weapons/weapon_Wand_of_Essek_lNWN759jT1Z098RI.json deleted file mode 100644 index 4fc224d4..00000000 --- a/src/packs/items/weapons/weapon_Wand_of_Essek_lNWN759jT1Z098RI.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "Wand of Essek", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_4/magical/wand_of_essek.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+13", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "knowledge", - "range": "far", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "UNDVQEo6UtTuueNQ", - "ownership": { - "default": 0, - "ei8OkswTzyDp4IGC": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717584048, - "modifiedTime": 1748717584048, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "lNWN759jT1Z098RI", - "sort": 0, - "_key": "!items!lNWN759jT1Z098RI" -} diff --git a/src/packs/items/weapons/weapon_Wand_pTOX05HxPJgwwMnf.json b/src/packs/items/weapons/weapon_Wand_pTOX05HxPJgwwMnf.json deleted file mode 100644 index 0e067837..00000000 --- a/src/packs/items/weapons/weapon_Wand_pTOX05HxPJgwwMnf.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Wand", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/magical/wand.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+1", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "knowledge", - "range": "far", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717337955, - "modifiedTime": 1748717337955, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "pTOX05HxPJgwwMnf", - "sort": 0, - "_key": "!items!pTOX05HxPJgwwMnf" -} diff --git a/src/packs/items/weapons/weapon_War_Scythe_UhWpEKkfo9mjRgnw.json b/src/packs/items/weapons/weapon_War_Scythe_UhWpEKkfo9mjRgnw.json deleted file mode 100644 index fbff35bd..00000000 --- a/src/packs/items/weapons/weapon_War_Scythe_UhWpEKkfo9mjRgnw.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "War Scythe", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/physical/war_scythe.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d8+5", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "veryClose", - "burden": "twoHanded", - "feature": "reliable", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717449196, - "modifiedTime": 1748717449196, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "UhWpEKkfo9mjRgnw", - "sort": 0, - "_key": "!items!UhWpEKkfo9mjRgnw" -} diff --git a/src/packs/items/weapons/weapon_Warhammer_54gLWy5YhwB9YeTA.json b/src/packs/items/weapons/weapon_Warhammer_54gLWy5YhwB9YeTA.json deleted file mode 100644 index 6976e9b4..00000000 --- a/src/packs/items/weapons/weapon_Warhammer_54gLWy5YhwB9YeTA.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Warhammer", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_1/physical/warhammer.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d12+3", - "type": "physical" - }, - "quantity": 1, - "description": "", - "trait": "strength", - "range": "melee", - "burden": "twoHanded", - "feature": "heavy", - "equipped": false - }, - "effects": [], - "folder": "d7tdCsIUd94XuTtq", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717339775, - "modifiedTime": 1748717339775, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "54gLWy5YhwB9YeTA", - "sort": 0, - "_key": "!items!54gLWy5YhwB9YeTA" -} diff --git a/src/packs/items/weapons/weapon_Widogast_Pendant_6wASGCohz4Y7CxjK.json b/src/packs/items/weapons/weapon_Widogast_Pendant_6wASGCohz4Y7CxjK.json deleted file mode 100644 index 24d7fb18..00000000 --- a/src/packs/items/weapons/weapon_Widogast_Pendant_6wASGCohz4Y7CxjK.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "Widogast Pendant", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_3/magical/widogast_pendant.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d10+5", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "knowledge", - "range": "close", - "burden": "oneHanded", - "equipped": false - }, - "effects": [], - "folder": "oreMpiiytMRaR9sy", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717516383, - "modifiedTime": 1748717516398, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "6wASGCohz4Y7CxjK", - "sort": 900000, - "_key": "!items!6wASGCohz4Y7CxjK" -} diff --git a/src/packs/items/weapons/weapon_Yutari_Bloodbow_zDVW3GhTnSwISSxF.json b/src/packs/items/weapons/weapon_Yutari_Bloodbow_zDVW3GhTnSwISSxF.json deleted file mode 100644 index 2addf1d4..00000000 --- a/src/packs/items/weapons/weapon_Yutari_Bloodbow_zDVW3GhTnSwISSxF.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Yutari Bloodbow", - "type": "weapon", - "img": "systems/daggerheart/assets/icons/weapons/primary/tier_2/magical/yutari_bloodbow.png", - "system": { - "inventoryWeapon": null, - "secondary": false, - "damage": { - "value": "d6+4", - "type": "magical" - }, - "quantity": 1, - "description": "", - "trait": "finesse", - "range": "far", - "burden": "twoHanded", - "feature": "brutal", - "equipped": false - }, - "effects": [], - "folder": "ereMKW01MCYg0qUY", - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3, - "JKaKJsbixtjbUa07": 3, - "WafZqd6qLGpBRGTt": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748717451048, - "modifiedTime": 1748717451048, - "lastModifiedBy": "WafZqd6qLGpBRGTt" - }, - "_id": "zDVW3GhTnSwISSxF", - "sort": 0, - "_key": "!items!zDVW3GhTnSwISSxF" -} diff --git a/src/packs/subclasses/folders_Bard_GdwNrxosxgFCMwUJ.json b/src/packs/subclasses/folders_Bard_GdwNrxosxgFCMwUJ.json deleted file mode 100644 index e7e8aba9..00000000 --- a/src/packs/subclasses/folders_Bard_GdwNrxosxgFCMwUJ.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "Item", - "folder": null, - "name": "Bard", - "color": null, - "sorting": "a", - "_id": "GdwNrxosxgFCMwUJ", - "description": "", - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748710754682, - "modifiedTime": 1748710754682, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!folders!GdwNrxosxgFCMwUJ" -} diff --git a/src/packs/subclasses/folders_Druid_8o3AE33T1pSQH296.json b/src/packs/subclasses/folders_Druid_8o3AE33T1pSQH296.json deleted file mode 100644 index 208512b0..00000000 --- a/src/packs/subclasses/folders_Druid_8o3AE33T1pSQH296.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "Item", - "folder": null, - "name": "Druid", - "color": null, - "sorting": "a", - "_id": "8o3AE33T1pSQH296", - "description": "", - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748710759338, - "modifiedTime": 1748710759338, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!folders!8o3AE33T1pSQH296" -} diff --git a/src/packs/subclasses/folders_Guardian_GECczaEI6KI9W7B7.json b/src/packs/subclasses/folders_Guardian_GECczaEI6KI9W7B7.json deleted file mode 100644 index ca69a32e..00000000 --- a/src/packs/subclasses/folders_Guardian_GECczaEI6KI9W7B7.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "Item", - "folder": null, - "name": "Guardian", - "color": null, - "sorting": "a", - "_id": "GECczaEI6KI9W7B7", - "description": "", - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748710765365, - "modifiedTime": 1748710765365, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!folders!GECczaEI6KI9W7B7" -} diff --git a/src/packs/subclasses/folders_Ranger_cTmpeni3Jg55NkX4.json b/src/packs/subclasses/folders_Ranger_cTmpeni3Jg55NkX4.json deleted file mode 100644 index 609c8475..00000000 --- a/src/packs/subclasses/folders_Ranger_cTmpeni3Jg55NkX4.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "Item", - "folder": null, - "name": "Ranger", - "color": null, - "sorting": "a", - "_id": "cTmpeni3Jg55NkX4", - "description": "", - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748710771596, - "modifiedTime": 1748710771596, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!folders!cTmpeni3Jg55NkX4" -} diff --git a/src/packs/subclasses/folders_Rogue_2ifNVaI1HZtXVSdf.json b/src/packs/subclasses/folders_Rogue_2ifNVaI1HZtXVSdf.json deleted file mode 100644 index 361524ab..00000000 --- a/src/packs/subclasses/folders_Rogue_2ifNVaI1HZtXVSdf.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "Item", - "folder": null, - "name": "Rogue", - "color": null, - "sorting": "a", - "_id": "2ifNVaI1HZtXVSdf", - "description": "", - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748710777343, - "modifiedTime": 1748710777343, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!folders!2ifNVaI1HZtXVSdf" -} diff --git a/src/packs/subclasses/folders_Seraph_8fx2IqJphzGyrZbx.json b/src/packs/subclasses/folders_Seraph_8fx2IqJphzGyrZbx.json deleted file mode 100644 index 39eb0cfa..00000000 --- a/src/packs/subclasses/folders_Seraph_8fx2IqJphzGyrZbx.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "Item", - "folder": null, - "name": "Seraph", - "color": null, - "sorting": "a", - "_id": "8fx2IqJphzGyrZbx", - "description": "", - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748710783410, - "modifiedTime": 1748710783410, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!folders!8fx2IqJphzGyrZbx" -} diff --git a/src/packs/subclasses/folders_Sorcerer_3H1ThzHW4rZStZrr.json b/src/packs/subclasses/folders_Sorcerer_3H1ThzHW4rZStZrr.json deleted file mode 100644 index 13f215d0..00000000 --- a/src/packs/subclasses/folders_Sorcerer_3H1ThzHW4rZStZrr.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "Item", - "folder": null, - "name": "Sorcerer", - "color": null, - "sorting": "a", - "_id": "3H1ThzHW4rZStZrr", - "description": "", - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748710789227, - "modifiedTime": 1748710789227, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!folders!3H1ThzHW4rZStZrr" -} diff --git a/src/packs/subclasses/folders_Subclass_Features_Sfpr4iK1cGrmncok.json b/src/packs/subclasses/folders_Subclass_Features_Sfpr4iK1cGrmncok.json new file mode 100644 index 00000000..93f4e0d0 --- /dev/null +++ b/src/packs/subclasses/folders_Subclass_Features_Sfpr4iK1cGrmncok.json @@ -0,0 +1,23 @@ +{ + "type": "Item", + "folder": null, + "name": "Subclass Features", + "color": null, + "sorting": "a", + "_id": "Sfpr4iK1cGrmncok", + "description": "", + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.346", + "systemId": "daggerheart", + "systemVersion": "0.0.1", + "createdTime": 1752680688668, + "modifiedTime": 1752680688668, + "lastModifiedBy": "binNpU8lWev6geDj" + }, + "_key": "!folders!Sfpr4iK1cGrmncok" +} diff --git a/src/packs/subclasses/folders_Warrior_OzZ4UX9B6eNEzF49.json b/src/packs/subclasses/folders_Warrior_OzZ4UX9B6eNEzF49.json deleted file mode 100644 index cd0bcd40..00000000 --- a/src/packs/subclasses/folders_Warrior_OzZ4UX9B6eNEzF49.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "Item", - "folder": null, - "name": "Warrior", - "color": null, - "sorting": "a", - "_id": "OzZ4UX9B6eNEzF49", - "description": "", - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748710794270, - "modifiedTime": 1748710794270, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!folders!OzZ4UX9B6eNEzF49" -} diff --git a/src/packs/subclasses/folders_Wizard_H1Djv0I92cn25M4t.json b/src/packs/subclasses/folders_Wizard_H1Djv0I92cn25M4t.json deleted file mode 100644 index 2cac09dc..00000000 --- a/src/packs/subclasses/folders_Wizard_H1Djv0I92cn25M4t.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "Item", - "folder": null, - "name": "Wizard", - "color": null, - "sorting": "a", - "_id": "H1Djv0I92cn25M4t", - "description": "", - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1748710800425, - "modifiedTime": 1748710800425, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!folders!H1Djv0I92cn25M4t" -} diff --git a/src/packs/subclasses/subclass_Troubadour_T1iBO8i0xRF5c8Q2.json b/src/packs/subclasses/subclass_Troubadour_T1iBO8i0xRF5c8Q2.json deleted file mode 100644 index e4e87698..00000000 --- a/src/packs/subclasses/subclass_Troubadour_T1iBO8i0xRF5c8Q2.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "Troubadour", - "type": "subclass", - "_id": "T1iBO8i0xRF5c8Q2", - "img": "icons/svg/item-bag.svg", - "system": { - "description": "

Play the Troubadour if you want to play music to bolster your allies.

", - "spellcastingTrait": "presence", - "foundationFeature": { - "description": "

Gifted Performer: Describe how you perform for others. You can play each song once per long rest:

Relaxing Song: You and all allies within Close range clear a Hit Point.

Epic Song: Make a target within Close range temporarily Vulnerable.

Heartbreaking Song: You and all allies within Close range gain a Hope.

", - "abilities": [] - }, - "specializationFeature": { - "unlocked": false, - "tier": null, - "description": "", - "abilities": [] - }, - "masteryFeature": { - "unlocked": false, - "tier": null, - "description": "", - "abilities": [] - }, - "multiclass": null - }, - "effects": [], - "folder": "GdwNrxosxgFCMwUJ", - "sort": 100000, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747991594334, - "modifiedTime": 1748710816900, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!T1iBO8i0xRF5c8Q2" -} diff --git a/src/packs/subclasses/subclass_Wordsmith_FXT65YDVWFy85EI0.json b/src/packs/subclasses/subclass_Wordsmith_FXT65YDVWFy85EI0.json deleted file mode 100644 index c8e4c3d4..00000000 --- a/src/packs/subclasses/subclass_Wordsmith_FXT65YDVWFy85EI0.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "Wordsmith", - "type": "subclass", - "_id": "FXT65YDVWFy85EI0", - "img": "icons/svg/item-bag.svg", - "system": { - "description": "

Play the Wordsmith if you want to use clever wordplay and captivate crowds.

", - "spellcastingTrait": "presence", - "foundationFeature": { - "description": "", - "abilities": [] - }, - "specializationFeature": { - "unlocked": false, - "tier": null, - "description": "", - "abilities": [] - }, - "masteryFeature": { - "unlocked": false, - "tier": null, - "description": "", - "abilities": [] - }, - "multiclass": null - }, - "effects": [], - "folder": "GdwNrxosxgFCMwUJ", - "sort": 200000, - "ownership": { - "default": 0, - "NqO2eQGMjrvUO6v9": 3 - }, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.344", - "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1747991988842, - "modifiedTime": 1748710818443, - "lastModifiedBy": "MxkU9FQYKmOxbdzm" - }, - "_key": "!items!FXT65YDVWFy85EI0" -} diff --git a/styles/application.less b/styles/application.less deleted file mode 100644 index 412d41e7..00000000 --- a/styles/application.less +++ /dev/null @@ -1,561 +0,0 @@ -form.daggerheart.views.downtime { - // Shouldn't be needed, but DEFAULT_OPTIONS doesn't accept Height: 'auto' - height: auto !important; -} - -div.daggerheart.views.death-move { - // Shouldn't be needed, but DEFAULT_OPTIONS doesn't accept Height: 'auto' - height: auto !important; -} - -div.daggerheart.views.multiclass { - // Shouldn't be needed, but DEFAULT_OPTIONS doesn't accept Height: 'auto' - height: auto !important; -} - -.daggerheart.views { - &.levelup { - .levelup-title-container { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: 32px; - margin-bottom: 4px; - - .level-title { - text-decoration: underline; - } - - .level-display { - display: flex; - align-items: center; - - i { - margin: 0 @halfMargin; - } - } - } - - .levelup-section { - display: flex; - align-items: flex-start; - margin-bottom: 8px; - font-size: 11px; - - .levelup-container { - flex: 1; - - &:nth-of-type(2) { - padding: 0 4px; - } - - &.disabled { - opacity: 0.2; - } - - .levelup-inner-container { - height: 700px; - padding: 24px 58px 0; - display: flex; - flex-direction: column; - align-items: center; - position: relative; - - .levelup-legend { - margin-left: auto; - margin-right: auto; - font-weight: bold; - z-index: 1; - } - - .levelup-info { - background: @primaryAccent; - width: 100%; - text-align: center; - position: absolute; - top: -6px; - padding: 8px 0; - } - - .levelup-pretext { - padding: 8px 0; - } - - .levelup-body { - display: flex; - flex-direction: column; - - .levelup-choice-row { - display: flex; - align-items: center; - padding: 4px; - - .levelup-choice-row-inner { - display: flex; - align-items: center; - } - - .levelup-choice-input-container { - position: relative; - display: flex; - align-items: center; - - input { - &:disabled:checked::before { - opacity: 0.4; - color: var(--color-warm-1); - } - } - - i.fa-link { - transform: rotate(45deg); - position: relative; - top: 2px; - margin: 0 -3px; - } - - i.fa-lock { - position: absolute; - top: 0; - left: 0; - font-size: 8px; - } - } - } - } - - .levelup-posttext { - padding: 8px 0; - } - } - } - } - } - - .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; - } - } - - .range-reset { - flex: 0; - width: 21px; - height: 21px; - margin: 3px 4px; - border: 1px solid black; - display: flex; - align-items: center; - justify-content: center; - } - - &.roll-selection { - .roll-selection-container { - i { - filter: invert(0%) sepia(100%) saturate(0%) hue-rotate(21deg) brightness(17%) contrast(103%); - } - } - - #roll-selection-costSelection footer { - display: none; - } - - .roll-dialog-container { - .hope-container { - display: flex; - gap: @fullMargin; - align-items: center; - font-size: 18px; - } - } - } - - &.npc-roll-selection { - .npc-roll-dialog-container { - display: flex; - flex-direction: column; - - .selection-container { - display: flex; - align-items: center; - margin-bottom: @fullMargin; - gap: 16px; - - .dice-container { - display: flex; - align-items: center; - flex: 1; - - .dice-inner-container { - position: relative; - display: flex; - align-items: center; - justify-content: center; - - i { - font-size: 18px; - } - - img { - border: 0; - position: relative; - left: 1px; - } - - .dice-number { - position: absolute; - font-size: 24px; - font-weight: bold; - } - } - - .advantage-container { - display: flex; - flex-direction: column; - gap: 2px; - flex: 1; - - .advantage-button { - &.active, - &:hover { - background: var(--button-hover-background-color); - } - } - } - } - } - } - } - - &.multiclass { - .multiclass-container { - margin-bottom: @largeMargin; - - .multiclass-category-title { - margin-top: @largeMargin; - } - - .multiclass-class-choices { - display: flex; - width: 100%; - height: 100%; - flex-wrap: wrap; - } - - .multiclass-spaced-choices { - display: flex; - justify-content: space-around; - width: 100%; - height: 100%; - } - - .multiclass-class-choice { - display: flex; - align-items: center; - flex-basis: 33.33%; - font-weight: bold; - font-size: 24px; - cursor: pointer; - - &.selected:not(.disabled), - &:hover:not(.disabled) { - filter: drop-shadow(0 0 3px gold); - } - - &.inactive, - &.disabled { - cursor: initial; - opacity: 0.4; - } - - img { - width: 80px; - height: 80px; - margin-right: @largeMargin; - } - } - } - } - - &.damage-selection { - .hope-container { - display: flex; - gap: @fullMargin; - align-items: center; - font-size: 18px; - } - } - - &.action { - .action-category { - display: flex; - flex-direction: column; - - .action-category-label { - display: flex; - align-items: center; - justify-content: space-between; - border-radius: 6px; - cursor: pointer; - padding: 0 @fullPadding; - margin: 0 auto @halfMargin; - - &:hover { - background-color: darkgray; - } - } - - .action-category-data { - max-height: 0; - transition: max-height 0.2s ease-in-out; - overflow: hidden; - - &.open { - max-height: initial; - } - - .multi-display { - display: flex; - gap: 1rem; - align-items: center; - .form-group { - flex: 1; - } - } - - .form-group { - display: flex; - align-items: center; - margin-bottom: 0.5rem; - label { - flex: 2; - } - .form-fields { - flex: 3; - } - img { - width: 1.5rem; - height: 1.5rem; - } - } - - .hint-group { - display: flex; - flex-direction: column; - align-items: end; - - .form-fields { - width: 100%; - display: flex; - align-items: center; - - label { - flex: 1; - } - - input, - select { - flex: 3; - } - } - - .hint { - margin: 4px 0 0 0; - font-size: 12px; - font-style: italic; - opacity: 0.6; - } - } - - .data-form-array { - border: 1px solid var(--color-fieldset-border); - padding: 0.5rem; - margin-bottom: 0.5rem; - } - } - } - } - - &.ancestry-selection { - .ancestry-section { - display: flex; - flex-direction: column; - align-items: center; - margin-bottom: @fullMargin; - - .ancestry-container { - width: 100%; - display: flex; - flex-wrap: wrap; - - .ancestry-inner-container { - flex-basis: 25%; - display: flex; - flex-direction: column; - align-items: center; - - .image-container { - img { - width: 120px; - border: 4px solid black; - border-radius: 50%; - - &.selected { - border-color: @secondaryShadow; - } - - &:hover:not(.selected) { - filter: drop-shadow(0 0 3px @secondaryShadow); - } - - &.disabled { - opacity: 0.3; - } - } - } - - .name-container { - div { - font-size: 18px; - font-weight: bold; - cursor: help; - } - } - } - } - - .mixed-ancestry-container { - width: 100%; - display: flex; - gap: @fullMargin; - - > div { - flex: 1; - } - - .mixed-ancestry-name { - text-align: center; - div { - font-size: 24px; - } - } - - .mixed-ancestry-images { - display: flex; - align-items: center; - gap: @halfMargin; - - .mixed-ancestry-image { - position: relative; - max-width: 33%; - - &:hover i { - opacity: 1; - } - - i { - position: absolute; - font-size: 32px; - top: calc(50% - 20px); - left: calc(50% - 20px); - padding: @fullPadding; - background-color: grey; - opacity: 0; - cursor: pointer; - - &:hover { - filter: drop-shadow(0 0 3px @secondaryShadow); - } - } - - img { - max-width: 100%; - } - } - - img { - max-width: 33%; - border: 4px solid black; - border-radius: 50%; - - &.selected { - border-color: @secondaryShadow; - } - } - } - } - } - } -} diff --git a/styles/class.less b/styles/class.less deleted file mode 100644 index ec1b1bd5..00000000 --- a/styles/class.less +++ /dev/null @@ -1,5 +0,0 @@ -.daggerheart.sheet.class { - .editor { - height: 500px; - } -} diff --git a/styles/daggerheart.css b/styles/daggerheart.css deleted file mode 100755 index b64cd424..00000000 --- a/styles/daggerheart.css +++ /dev/null @@ -1,6628 +0,0 @@ -/* Base Value */ -/* Margins */ -/* Borders */ -/* Padding */ -/* Inputs */ -/* General */ -/* Drop Shadows */ -/* Background */ -/* Duality */ -/* Fear */ -@import '../node_modules/@yaireo/tagify/dist/tagify.css'; -.daggerheart.sheet.class .editor { - height: 500px; -} -.daggerheart.sheet.pc { - width: 810px !important; -} -.daggerheart.sheet.pc div[data-application-part] { - display: flex; - flex-direction: column; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header { - display: flex; - gap: 4px; - height: 120px; - margin-bottom: 4px; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .portrait { - border: 0; - border-right: 1px solid var(--color-underline-header); -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info { - flex: 1; - background: #778899; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .portrait { - max-width: 120px; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .class-title { - text-align: center; - display: flex; - justify-content: space-between; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .class-title span:hover { - filter: drop-shadow(0px 0px 3px red); - cursor: pointer; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .class-title .domain-container { - margin-left: 4px; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .class-add-container { - display: flex; - align-items: center; - justify-content: center; - width: 100%; - flex: 0; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .class-add-container button { - height: 22px; - width: 22px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - margin-left: 4px; - background: #778899; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .domain-title { - text-transform: uppercase; - display: flex; - flex-direction: column; - align-items: center; - line-height: 23px; - font-weight: bold; - font-style: italic; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .class-info .domain-image { - height: 30px; - flex: 0; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info { - flex: 2; - display: flex; - flex-direction: column; - justify-content: space-between; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .general-input { - position: relative; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .general-input .general-title { - position: absolute; - left: 4px; - text-align: center; - font-weight: bold; - text-transform: uppercase; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .pc-tabs { - flex: 1; - margin: 0; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .rest-container { - flex-wrap: nowrap; - display: flex; - height: var(--form-field-height); - flex: 0; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .rest-container button { - display: flex; - align-items: center; - justify-content: center; - border-radius: 50%; - width: var(--form-field-height); -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .rest-container button i { - font-size: 13px; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container { - position: relative; - bottom: 4px; - flex: none; - width: 40px; - border: none; - outline: none; - margin-left: 8px; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container.levelup { - filter: drop-shadow(0px 0px 3px gold); -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container img { - height: 40px; - width: 40px; - border: none; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-value-container { - width: 48px; - position: absolute; - top: calc(50% - 17px); - left: calc(50% - 23px); -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-value-container .level-value { - font-weight: bold; - font-size: 20px; - text-align: center; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-value-container .level-value:not(:hover), -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-value-container .level-value:not(:focus) { - border: none; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-value-container .levelup-marker { - position: absolute; - top: 0; - right: calc(50% - 12px); - color: gold; - filter: drop-shadow(0px 0px 3px black); -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-value-container .levelup-marker.double-digit { - right: calc(50% - 20px); -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-title { - position: absolute; - bottom: 2px; - width: 42px; - background-color: black; - color: white; - left: calc(50% - 21px); - text-align: center; - border-radius: 5px; - font-size: 12px; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-title.levelup { - color: gold; - filter: drop-shadow(0px 0px 3px orange); - font-weight: bold; - cursor: pointer; -} -.daggerheart.sheet.pc div[data-application-part] .pc-sheet-header .general-info .level-container .level-title.levelup:hover { - background-color: aliceblue; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body { - display: flex; - flex-direction: column; - flex: 1; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .tab-container { - height: 100%; - display: flex; - flex-direction: column; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .tab-container .tab-inner-container { - flex: 1; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .tab-container .tab-inner-container .body-section { - display: flex; - flex-direction: column; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .tab-container .tab-inner-container .body-section fieldset { - flex: 0; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .system-info { - font-size: 12px; - font-style: italic; - font-weight: bold; - margin-top: -4px; - flex: 0; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .feature-sheet-body { - gap: 4px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container { - position: relative; - display: flex; - flex-wrap: wrap; - border-radius: 6px; - padding-left: 0; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container legend { - margin-left: auto; - margin-right: auto; - font-weight: bold; - text-transform: uppercase; - padding: 0 8px; - position: relative; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attributes-menu { - position: absolute; - bottom: calc(50% - 12px); - font-size: 24px; - left: -8px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute { - position: relative; - padding: 0 0 4px; - display: flex; - flex-direction: column; - align-items: center; - flex-basis: 33.33%; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-banner { - position: relative; - top: 8px; - z-index: 2; - background: black; - color: white; - text-transform: uppercase; - padding: 2px; - border-radius: 6px; - display: flex; - align-items: center; - overflow: hidden; - min-width: 96px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-banner .attribute-roll { - position: absolute; - width: 16px; - transition: transform 0.2s; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-banner .attribute-roll:hover { - transform: rotate(30deg); - filter: drop-shadow(0px 0px 3px red); - cursor: pointer; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-banner .attribute-text { - width: 100%; - margin-left: 16px; - font-size: 12px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-mark { - height: 23px; - width: 23px; - position: absolute; - right: -5px; - top: 6px; - border: 2px solid black; - border-radius: 50%; - background: white; - z-index: 2; - display: flex; - align-items: center; - justify-content: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-mark.selectable { - border-color: gold; - filter: drop-shadow(0 0 3px black); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-mark.selectable:hover i { - opacity: 0.3; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-mark i.selected, -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-mark:hover i.selected { - color: green; - opacity: 1; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-mark i { - color: black; - font-size: 17px; - opacity: 0; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-image { - position: relative; - width: fit-content; - display: flex; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-image img { - height: 80px; - width: 80px; - border: none; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-image .attribute-value { - width: 55px; - padding-right: 10px; - position: absolute; - top: calc(50% - 18px); - left: calc(50% - 24px); - font-weight: bold; - font-size: 30px; - line-height: 30px; - text-align: center; - border: none; - appearance: none; - -moz-appearance: none; - -webkit-appearance: none; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-image .attribute-value.negative { - left: calc(50% - 29px); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-image .attribute-value.unselected { - filter: drop-shadow(0 0 3px gold); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-image .attribute-text { - width: 47px; - position: absolute; - top: calc(50% - 22px); - left: calc(50% - 24px); - font-weight: bold; - font-size: 30px; - text-align: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-image .attribute-text.negative { - left: calc(50% - 29px); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-container .attribute .attribute-verb { - font-variant: petite-caps; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row { - height: 100%; - width: 100%; - display: flex; - align-items: baseline; - justify-content: space-evenly; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .defense-section { - display: flex; - align-items: center; - margin-right: 8px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .defense-section .defense-container { - position: relative; - padding: 4px; - max-width: 100px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .defense-section .defense-container img { - border: none; - max-width: 80px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .defense-section .defense-container .defense-value { - width: 47px; - position: absolute; - top: calc(50% - 22px); - left: calc(50% - 24px); - font-weight: bold; - font-size: 30px; - text-align: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .defense-section .defense-container .defense-value:not(:hover), -.daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .defense-section .defense-container .defense-value:not(:focus) { - border: none; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .defense-section .defense-container .defense-banner { - position: absolute; - bottom: 20px; - left: calc(50% - 42px); - z-index: 2; - background-color: black; - color: white; - width: 84px; - text-align: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .armor-marks { - max-width: 67px; - padding: 4px; - align-self: end; - margin-left: 4px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .armor-marks .mark { - width: 16px; - height: 16px; - margin: 0px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .defense-row .armor-marks .disabled-mark { - opacity: 0.6; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .left-main-container { - position: relative; - display: flex; - flex-direction: column; - align-items: flex-start; - border-radius: 6px; - height: 100px; - width: 100px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .left-main-container .legend { - margin-left: auto; - margin-right: auto; - font-weight: bold; - text-transform: uppercase; - padding: 0 4px; - position: relative; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .weapon-section { - padding-top: 8px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .threshold-container { - position: relative; - display: flex; - align-items: center; - align-self: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .threshold-container .threshold-box { - position: relative; - width: 30px; - height: 30px; - border: 2px solid black; - display: flex; - align-items: center; - justify-content: center; - font-size: 20px; - font-weight: bold; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .threshold-container .threshold-spacer { - position: relative; - z-index: 2; - width: 70px; - height: 18px; - background-color: darkgray; - color: white; - display: flex; - justify-content: center; - align-items: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .resource-label { - text-transform: uppercase; - font-weight: bold; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .death-save { - position: absolute; - right: -22px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .death-save:hover:not(.disabled) { - filter: drop-shadow(0 0 3px red); - cursor: pointer; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .death-save.disabled { - opacity: 0.4; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .resource-box { - width: 20px; - height: 12px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .resource-box.stress:nth-child(even) { - position: relative; - right: 1px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .resource-box .disabled { - opacity: 0.6; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .hope-text { - font-size: 11.7px; - margin-right: 6px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .hope-container { - background: darkgray; - border-radius: 6px; - display: flex; - padding: 2px 0px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .hope-container .vertical-separator { - border-left: 2px solid white; - height: auto; - margin: 4px 0; - flex: 0; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .hope-container .hope-inner-container { - position: relative; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .hope-container .hope-inner-container .hope-value { - width: 16px; - height: 16px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .hope-container .hope-inner-container .hope-scar { - position: absolute; - top: calc(50% - 6px); - left: calc(50% - 7px); - opacity: 0.4; - font-size: 12px; - -webkit-transform: scaleX(-1); - transform: scaleX(-1); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .experience-row { - width: 100%; - display: flex; - align-items: flex-end; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .experience-row .experience-selector { - font-size: 18px; - cursor: pointer; - margin-right: 4px; - opacity: 0.5; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .experience-row .experience-selector:hover:not(.selected) { - filter: drop-shadow(0 0 3px gold); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .experience-row .experience-selector.selected { - filter: drop-shadow(0 0 3px gold); - opacity: 1; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .experience-row .experience-value { - margin-left: 8px; - width: 30px; - border-bottom: 2px solid black; - border-radius: 4px; - text-align: center; - font-weight: bold; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .experience-row .experience-value.empty { - border: 0; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .experience-row .disabled-experience { - border: 1px solid #7a7971; - background: rgba(0, 0, 0, 0.2); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section { - width: calc(100% - 8px); - display: flex; - justify-content: space-between; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset { - padding-right: 0; - padding-left: 0; - padding-bottom: 4px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset legend { - margin-left: auto; - margin-right: auto; - font-size: 15px; - font-variant: all-petite-caps; - font-weight: bold; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-column { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100%; - gap: 4px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-row { - display: flex; - align-items: center; - justify-content: center; - padding: 0 4px; - gap: 2px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-row img, -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-column img { - min-width: 14px; - min-height: 14px; - height: 14px; - border: 0; - filter: invert(0%) sepia(100%) saturate(0%) hue-rotate(21deg) brightness(17%) contrast(103%); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-row img:hover, -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-column img:hover { - cursor: pointer; - filter: invert(0%) sepia(100%) saturate(0%) hue-rotate(21deg) brightness(17%) contrast(103%) drop-shadow(0 0 3px red); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-row i:hover, -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-column i:hover { - cursor: pointer; - filter: drop-shadow(0 0 3px red); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-row img:not(.owned), -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-column img:not(.owned), -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-row i:not(.owned), -.daggerheart.sheet.pc div[data-application-part] .sheet-body .gold-section fieldset.gold-fieldset .gold-column i:not(.owned) { - opacity: 0.4; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .health-category { - text-transform: uppercase; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .class-feature-selectable { - cursor: pointer; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .class-feature-selectable:hover { - filter: drop-shadow(0 0 3px red); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .class-feature-selectable.inactive { - opacity: 0.5; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container { - width: 100%; - min-height: 136px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-container { - display: flex; - align-items: center; - justify-content: space-between; - padding: 4px; - margin-bottom: 0; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-container .feature-img { - max-width: 42px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-container .feature-label { - font-weight: bold; - font-size: 30px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-container button { - flex: 0; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-tick-container { - flex: 0; - min-width: 56px; - display: flex; - flex-wrap: wrap; - gap: 8px; - margin: 0 24px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-tick-container .feature-tick { - position: relative; - border: 2px solid #7a7971; - height: 24px; - border-radius: 50%; - width: 24px; - background: rgba(0, 0, 0, 0.05); - display: flex; - justify-content: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-tick-container .feature-tick:hover:not(.disabled):not(.used) { - cursor: pointer; - filter: drop-shadow(0 0 3px red); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-tick-container .feature-tick.disabled { - opacity: 0.3; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-tick-container .feature-tick img { - border: 0; - width: 24px; - height: 24px; - filter: invert(17%) sepia(0%) saturate(0%) hue-rotate(19deg) brightness(102%) contrast(84%); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-tick-container .feature-tick .feature-dice-value { - font-size: 18px; - align-self: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .features-container .feature-tick-container .feature-tick.used::after { - position: absolute; - content: '/'; - color: #7a7971; - font-weight: 700; - font-size: 1.7em; - left: 4px; - top: -5px; - transform: rotate(25deg); - font-size: 24.5px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .feature-input { - border: 0; - border-bottom: 1px solid #7a7971; - text-align: center; - height: min-content; - background: inherit; - font-size: 20px; - position: relative; - bottom: 3px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .editor { - height: 400px; - width: 100%; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-title { - position: relative; - display: flex; - flex-direction: column; - align-items: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-title .proficiency-container { - width: 176px; - height: 20px; - position: absolute; - bottom: -15px; - left: calc(50% - 88px); - text-transform: uppercase; - display: flex; - align-items: center; - justify-content: center; - z-index: 1; - clip-path: polygon(11% 100%, 89% 100%, 100% 0%, 0% 0%); - font-size: 10px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-title .proficiency-container span { - margin-right: 2px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-title .proficiency-container .proficiency-dot { - background: white; - color: white; - font-size: 10px; - padding: 1px; - border-radius: 50%; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-title .proficiency-container .proficiency-dot.marked { - color: black; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-title .proficiency-container .proficiency-dot:not(:last-of-type) { - margin-right: 2px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-burden { - position: absolute; - top: -4px; - right: -56px; - display: flex; - align-items: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-burden .weapons-burden-icon { - color: white; - font-size: 22px; - -webkit-text-stroke-width: 1px; - -webkit-text-stroke-color: black; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-burden .weapons-burden-icon.active { - -webkit-text-stroke-color: rgba(0, 0, 0, 0.05); - color: black; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-burden .weapons-burden-icon.left { - -webkit-transform: scaleX(-1) rotate(20deg); - transform: scaleX(-1) rotate(20deg); - margin-right: 4px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .weapons-burden .weapons-burden-icon.right { - transform: rotate(20deg); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .armor-container { - display: flex; - align-items: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .armor-container .active-item-label-chip { - margin-left: 4px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-container { - display: flex; - flex-direction: column; - width: 100%; - padding: 2px 0px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-container .weapons-label-row { - display: flex; - align-items: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-container .weapons-label-row .damage-roll { - width: 24px; - border: none; - margin-left: 4px; - transition: transform 0.2s; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-container .weapons-label-row .damage-roll:hover { - transform: rotate(30deg); - filter: drop-shadow(0px 0px 3px red); - cursor: pointer; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-label-chip { - width: 62px; - border: 2px solid black; - border-radius: 6px; - background-color: #778899; - display: flex; - align-items: center; - justify-content: space-around; - margin-left: 4px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-label-chip img { - height: 20px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-label-chip button { - height: 17px; - width: 17px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - background: #7a7971; - border-color: black; - margin: 0; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-label-chip button:hover { - background: red; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .item-section .active-item-label-chip button i { - font-size: 10px; - color: black; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-armor-section, -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-weapon-section { - width: 100%; - margin-bottom: 8px; - text-transform: uppercase; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-armor-section h2, -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-weapon-section h2 { - width: 100%; - display: flex; - align-items: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-legend { - display: flex; - align-items: center; - margin-bottom: 4px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-legend .page-selector { - margin-left: 4px; - display: flex; - align-items: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-legend .page-selector i:hover:not(.disabled) { - cursor: pointer; - filter: drop-shadow(0px 0px 3px red); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-legend .page-selector i.disabled { - opacity: 0.4; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-add-button { - position: absolute; - border-radius: 50%; - height: 15px; - width: 15px; - top: -20px; - background: grey; - border-color: black; - right: 6px; - display: flex; - font-size: 13px; - align-items: center; - justify-content: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory { - width: 100%; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .inventory-row { - height: 26px; - border-bottom: 1px solid #7a7971; - display: flex; - margin-bottom: 8px; - border-radius: 8px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .inventory-row .item-container { - flex-basis: 25%; - margin: 0 4px 8px; - display: flex; - justify-content: center; - align-items: center; - cursor: pointer; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .inventory-row .item-container:hover { - filter: drop-shadow(0px 0px 3px red); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .inventory-row .item-container .inventory-item { - background: #778899; - padding: 4px; - border: 1px solid black; - border-radius: 6px; - display: flex; - align-items: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .inventory-row .item-container .inventory-item .inventory-item-text { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - flex: 1; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .inventory-row .item-container .inventory-item button { - height: 16px; - width: 16px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - flex: 0; - background: #7a7971; - border-color: black; - margin-left: 4px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .inventory-row .item-container .inventory-item button i { - font-size: 12px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory .editor { - height: 100px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-items { - width: 100%; - flex: 1; - display: flex; - flex-direction: column; - justify-content: space-between; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab { - flex: 1; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body { - height: 100%; - width: 100%; - padding: 8px; - display: flex; - flex-direction: column; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .card-row { - flex: 1; - display: flex; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .domain-card { - flex: 0; - flex-basis: 33.33%; - margin: 8px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .loadout-body { - flex: 1; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .loadout-body .loadout-container { - height: 100%; - display: flex; - flex-direction: column; - gap: 8px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .loadout-body .loadout-container .top-card-row { - flex: 1; - display: flex; - justify-content: space-around; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .loadout-body .loadout-container .domain-card.outlined { - border: 2px dotted black; - padding: 0; - margin: 8px; - height: calc(100% - 16px); - display: flex; - flex-direction: column; - align-items: center; - justify-content: space-evenly; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .vault-container { - display: flex; - flex-wrap: wrap; - overflow-y: auto; - height: 100%; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .vault-container .vault-card { - flex: 0; - flex-basis: calc(33.33% - 16px); - margin: 8px; - height: calc(50% - 16px); - min-height: calc(50% - 16px); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .domain-card-menu { - flex: 0; - width: 120px; - height: 100%; - border-width: 2px 0 2px 2px; - border-color: black; - border-style: solid; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .domain-card-tab .domain-card-body .domain-card-menu button { - margin-bottom: 2px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .loadout-tabs { - border-top: 1px solid #b5b3a4; - border-bottom: 1px solid #b5b3a4; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card { - position: relative; - border: 4px solid #708090; - border-radius: 6px; - display: flex; - flex-direction: column; - height: 100%; - font-size: 14px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-image-container { - position: relative; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-image { - width: 100%; - height: 100%; - aspect-ratio: 2; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-text-container { - flex: 1; - position: relative; - height: 50%; - display: flex; - flex-direction: column; - overflow-y: auto; - padding: 12px 4px 4px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-level { - position: absolute; - top: 0; - left: 12px; - color: black; - height: 60px; - border: 2px solid orange; - border-top-width: 0; - width: 30px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: space-evenly; - background: grey; - font-size: 20px; - font-weight: bold; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-level img { - border: 0; - width: 20px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-refresh-cost { - position: absolute; - top: 12px; - right: 12px; - color: white; - width: 30px; - height: 30px; - border: 2px solid orange; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - background: black; - font-size: 14px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-refresh-cost i { - font-size: 11px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-type { - flex: 0; - display: flex; - justify-content: center; - align-items: center; - font-weight: bold; - position: absolute; - left: 0; - text-align: center; - width: 100%; - bottom: -9px; - z-index: 1; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-type .abilities-card-type-text { - padding: 0px 4px; - border: 1px solid black; - border-radius: 6px; - background: gold; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-title { - flex: 0; - display: flex; - justify-content: center; - align-items: center; - font-weight: bold; - font-size: 18px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-sub-title { - flex: 0; - display: flex; - justify-content: center; - align-items: center; - font-style: italic; - font-size: 12px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-spellcast { - flex: 0; - display: flex; - justify-content: center; - align-items: center; - text-transform: uppercase; - font-size: 12px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-spellcast .title { - font-weight: bold; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-description { - flex: 0; - font-size: 12px; - margin-bottom: 4px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-effect { - cursor: pointer; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-effect:hover { - background: rgba(47, 79, 79, 0.25); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-effect > * { - margin-top: 0; - margin-bottom: 0; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-abilities { - flex: 1; - display: flex; - flex-direction: column; - gap: 4px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-abilities .abilities-card-ability { - font-size: 12px; - cursor: pointer; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-abilities .abilities-card-ability:hover { - background: rgba(47, 79, 79, 0.25); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-abilities .abilities-card-ability > * { - margin: 0; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card:hover .abilities-card-menu { - height: 40px; - left: 0px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-menu { - display: flex; - justify-content: center; - align-items: center; - height: 0; - transition: height 0.2s; - overflow: hidden; - position: absolute; - bottom: 0; - z-index: 2; - width: 100%; - background: grey; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .abilities-card .abilities-card-menu button { - font-weight: bold; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .heritage-container { - height: 100%; - display: flex; - flex-direction: column; - gap: 8px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .heritage-container .card-row { - height: 50%; - display: flex; - justify-content: space-around; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .heritage-container .heritage-card { - flex-basis: 33.33%; - margin: 8px; - display: flex; - align-items: center; - justify-content: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .heritage-container .heritage-card.outlined { - border: 2px dotted black; - font-size: 25px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .empty-ability-container { - height: 100%; - display: flex; - flex-direction: column; - align-items: center; - font-size: 25px; - opacity: 0.7; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .empty-ability-container .empty-ability-inner-container { - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .empty-ability-container .empty-ability-inner-container i { - font-size: 48px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .story-container { - gap: 16px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .story-container .story-fieldset { - border-radius: 6px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .story-container .story-legend { - margin-left: auto; - margin-right: auto; - padding: 0 8px; - font-size: 30px; - font-weight: bold; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .story-container .scars-container .editor { - height: 240px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container { - height: 100%; - overflow: auto; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list { - list-style-type: none; - padding: 0 8px; - margin-top: 0; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list.inventory-item-header { - margin-bottom: 0; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-title-row-container { - display: flex; - align-items: center; - width: 100%; - border-bottom: 4px ridge slategrey; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-title-row-container .inventory-title-row { - justify-content: space-between; - flex: 1; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-title-row-container .inventory-item-title-container { - flex: 1; - display: flex; - align-items: center; - justify-content: flex-start; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-title-row-container .inventory-item-quantity { - width: 48px; - display: flex; - align-items: center; - margin-right: 96px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item { - background: crimson; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item:not(:last-of-type) { - border-bottom: 2px ridge slategrey; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item .inventory-item-title-container { - flex: 1; - display: flex; - align-items: center; - justify-content: flex-start; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item .inventory-item-title-container .inventory-item-title { - display: flex; - align-items: center; - cursor: pointer; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item .inventory-item-title-container .inventory-item-title:hover { - filter: drop-shadow(0 0 3px gold); -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item .inventory-item-quantity { - width: 60px; - display: flex; - align-items: center; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item .inventory-item-quantity.spaced { - margin-right: 56px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item .inventory-item-quantity input { - margin: 0 2px; - border: 0; - border-bottom: 2px solid black; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-item .inventory-item-quantity i { - font-size: 20px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-title-row { - font-size: 20px; - font-weight: bold; - display: flex; - align-items: center; - padding: 0 4px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-row { - display: flex; - align-items: center; - padding: 4px; - font-size: 24px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-row .row-icon { - margin-left: 4px; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-row .active-item { - position: absolute; - font-size: 16px; - left: calc(50% - 8px); - top: calc(50% - 8px); - margin-left: 2px; - color: crimson; -} -.daggerheart.sheet.pc div[data-application-part] .sheet-body .inventory-container .inventory-item-list .inventory-row img { - width: 32px; -} -.combat-sidebar .encounter-controls.combat { - justify-content: space-between; -} -.combat-sidebar .encounter-controls.combat .encounter-fear-controls { - display: flex; - align-items: center; - gap: 8px; -} -.combat-sidebar .encounter-controls.combat .encounter-fear-controls .encounter-fear-dice-container { - display: flex; - gap: 2px; -} -.combat-sidebar .encounter-controls.combat .encounter-fear-controls .encounter-fear-dice-container .encounter-control-fear-container { - display: flex; - position: relative; - align-items: center; - justify-content: center; - color: black; -} -.combat-sidebar .encounter-controls.combat .encounter-fear-controls .encounter-fear-dice-container .encounter-control-fear-container .dice { - height: 22px; - width: 22px; -} -.combat-sidebar .encounter-controls.combat .encounter-fear-controls .encounter-fear-dice-container .encounter-control-fear-container .encounter-control-fear { - position: absolute; - font-size: 16px; -} -.combat-sidebar .encounter-controls.combat .encounter-fear-controls .encounter-fear-dice-container .encounter-control-fear-container .encounter-control-counter { - position: absolute; - right: -10px; - color: var(--color-text-secondary); -} -.combat-sidebar .encounter-controls.combat .encounter-fear-controls .encounter-countdowns { - color: var(--content-link-icon-color); -} -.combat-sidebar .encounter-controls.combat .control-buttons { - width: min-content; -} -.combat-sidebar .combatant-controls { - flex: 0; -} -.combat-sidebar .token-actions { - align-self: stretch; - display: flex; - align-items: top; - justify-content: center; - gap: 16px; -} -.combat-sidebar .token-actions .action-tokens { - display: flex; - gap: 4px; -} -.combat-sidebar .token-actions .action-tokens .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; -} -.combat-sidebar .token-actions .action-tokens .action-token.used { - opacity: 0.5; - background: transparent; -} -.combat-sidebar .token-actions button { - font-size: 22px; - height: 24px; - width: 24px; -} -.combat-sidebar .token-actions button.main { - background: var(--button-hover-background-color); - color: var(--button-hover-text-color); - border-color: var(--button-hover-border-color); -} -.combat-sidebar .token-actions button.main:hover { - filter: drop-shadow(0 0 3px var(--button-hover-text-color)); -} -.combat-sidebar .spotlight-control { - font-size: 26px; -} -.combat-sidebar .spotlight-control:focus { - outline: none; - box-shadow: none; -} -.combat-sidebar .spotlight-control.discrete:hover { - background: inherit; -} -.combat-sidebar .spotlight-control.requesting { - filter: drop-shadow(0 0 3px gold); - color: var(--button-hover-text-color); -} -.combat-sidebar h4 { - margin: 0; - text-align: center; -} -.chat-message .duality-modifiers, -.chat-message .duality-result, -.chat-message .dice-title { - display: none; -} -fieldset.daggerheart.chat { - padding: 0; - border-left-width: 0; - border-right-width: 0; - border-bottom-width: 0; -} -fieldset.daggerheart.chat legend { - display: flex; - align-items: center; - gap: 5px; -} -fieldset.daggerheart.chat legend:before, -fieldset.daggerheart.chat legend:after { - content: '\f0d8'; - font-family: 'Font Awesome 6 Pro'; -} -fieldset.daggerheart.chat.expanded legend:before, -fieldset.daggerheart.chat.expanded legend:after { - content: '\f0d7'; -} -fieldset.daggerheart.chat .daggerheart.chat { - margin-top: 5px; -} -.daggerheart.chat.downtime { - display: flex; - flex-direction: column; - align-items: center; -} -.daggerheart.chat.downtime .downtime-title-container { - display: flex; - flex-direction: column; - align-items: center; -} -.daggerheart.chat.downtime .downtime-title-container .downtime-subtitle { - font-size: 17px; -} -.daggerheart.chat.downtime .downtime-image { - width: 80px; -} -.daggerheart.chat.downtime .downtime-refresh-container { - margin-top: 8px; - width: 100%; -} -.daggerheart.chat.downtime .downtime-refresh-container .refresh-title { - font-weight: bold; -} -.daggerheart.chat.roll .dice-flavor { - text-align: center; - font-weight: bold; -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls.duality { - display: flex; - gap: 0.25rem; -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll { - display: flex; - align-items: center; - justify-content: center; - gap: 4px; - margin-bottom: 4px; -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container { - display: flex; - flex-direction: column; - gap: 2px; -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-title { - color: var(--color-light-1); - text-shadow: 0 0 1px black; -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container { - display: flex; - align-items: center; - justify-content: center; - position: relative; -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.hope .dice-wrapper, -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.fear .dice-wrapper { - clip-path: polygon(50% 0%, 80% 10%, 100% 35%, 100% 70%, 80% 90%, 50% 100%, 20% 90%, 0% 70%, 0% 35%, 20% 10%); -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container .dice-wrapper { - height: 24px; - width: 24px; - position: relative; - display: flex; - align-items: center; - justify-content: center; -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container .dice-wrapper .dice { - height: 26px; - width: 26px; - max-width: unset; - position: absolute; -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container .dice-value { - position: absolute; - font-weight: bold; - font-size: 16px; -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.hope .dice-wrapper { - background: black; -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.hope .dice-wrapper .dice { - filter: brightness(0) saturate(100%) invert(79%) sepia(79%) saturate(333%) hue-rotate(352deg) brightness(102%) contrast(103%); -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.hope .dice-value { - color: var(--color-dark-1); - text-shadow: 0 0 4px white; -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.fear .dice-wrapper { - background: white; -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.fear .dice-wrapper .dice { - filter: brightness(0) saturate(100%) invert(12%) sepia(88%) saturate(4321%) hue-rotate(221deg) brightness(92%) contrast(110%); -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.fear .dice-value { - color: var(--color-light-1); - text-shadow: 0 0 4px black; -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.advantage .dice-wrapper .dice { - filter: brightness(0) saturate(100%) invert(18%) sepia(92%) saturate(4133%) hue-rotate(96deg) brightness(104%) contrast(107%); -} -.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.disadvantage .dice-wrapper .dice { - filter: brightness(0) saturate(100%) invert(9%) sepia(78%) saturate(6903%) hue-rotate(11deg) brightness(93%) contrast(117%); -} -.daggerheart.chat.roll .dice-total.duality.hope { - border-color: #ffe760; - border-width: 3px; - background: rgba(255, 231, 96, 0.5); -} -.daggerheart.chat.roll .dice-total.duality.fear { - border-color: #0032b1; - border-width: 3px; - background: rgba(0, 50, 177, 0.5); -} -.daggerheart.chat.roll .dice-total.duality.critical { - border-color: #430070; - border-width: 3px; - background: rgba(67, 0, 112, 0.5); -} -.daggerheart.chat.roll .dice-total .dice-total-value .hope { - color: #ffe760; -} -.daggerheart.chat.roll .dice-total .dice-total-value .fear { - color: #0032b1; -} -.daggerheart.chat.roll .dice-total .dice-total-value .critical { - color: #430070; -} -.daggerheart.chat.roll .dice-total-label { - font-size: 12px; - font-weight: bold; - font-variant: all-small-caps; - margin: -8px 0; -} -.daggerheart.chat.roll .target-selection { - display: flex; - justify-content: space-around; -} -.daggerheart.chat.roll .target-selection input[type='radio'] { - display: none; -} -.daggerheart.chat.roll .target-selection input[type='radio']:checked + label { - text-shadow: 0px 0px 4px #ce5937; -} -.daggerheart.chat.roll .target-selection input[type='radio']:not(:checked) + label { - opacity: 0.75; -} -.daggerheart.chat.roll .target-selection label { - cursor: pointer; - opacity: 0.75; -} -.daggerheart.chat.roll .target-selection label.target-selected { - text-shadow: 0px 0px 4px #ce5937; - opacity: 1; -} -.daggerheart.chat.roll .target-section { - margin-top: 5px; -} -.daggerheart.chat.roll .target-section .target-container { - display: flex; - transition: all 0.2s ease-in-out; -} -.daggerheart.chat.roll .target-section .target-container:hover { - filter: drop-shadow(0 0 3px gold); - border-color: gold; -} -.daggerheart.chat.roll .target-section .target-container.hidden { - display: none; - border: 0; -} -.daggerheart.chat.roll .target-section .target-container.hit { - background: #008000; -} -.daggerheart.chat.roll .target-section .target-container.miss { - background: #ff0000; -} -.daggerheart.chat.roll .target-section .target-container img, -.daggerheart.chat.roll .target-section .target-container .target-save-container { - width: 22px; - height: 22px; - align-self: center; - border-color: transparent; -} -.daggerheart.chat.roll .target-section .target-container img { - flex: 0; - margin-left: 8px; -} -.daggerheart.chat.roll .target-section .target-container .target-save-container { - margin-right: 8px; - justify-content: center; - display: flex; - align-items: center; - min-height: unset; - border: 1px solid black; -} -.daggerheart.chat.roll .target-section .target-container .target-inner-container { - flex: 1; - display: flex; - justify-content: center; - font-size: var(--font-size-16); -} -.daggerheart.chat.roll .target-section .target-container:not(:has(.target-save-container)) .target-inner-container { - margin-right: 32px; -} -.daggerheart.chat.roll .dice-actions { - display: flex; - gap: 4px; -} -.daggerheart.chat.roll .dice-actions button { - flex: 1; -} -.daggerheart.chat.roll .dice-result .roll-damage-button, -.daggerheart.chat.roll .dice-result .damage-button, -.daggerheart.chat.roll .dice-result .duality-action { - margin-top: 5px; -} -.daggerheart.chat.roll:not(.expanded) .dice-tooltip { - grid-template-rows: 0fr; -} -.daggerheart.chat.domain-card { - display: flex; - flex-direction: column; - align-items: center; -} -.daggerheart.chat.domain-card .domain-card-title { - width: 100%; - display: flex; - flex-direction: column; - align-items: center; -} -.daggerheart.chat.domain-card .domain-card-title div { - font-size: 20px; - font-variant: small-caps; - font-weight: bold; -} -.daggerheart.chat.domain-card .domain-card-title h2 { - width: 100%; - text-align: center; - margin: 0; -} -.daggerheart.chat.domain-card .ability-card-footer { - display: flex; - width: 100%; - margin-top: 8px; - flex-wrap: wrap; -} -.daggerheart.chat.domain-card .ability-card-footer button { - border-radius: 6px; - background: #699969; - border-color: black; - flex-basis: calc(50% - 2px); -} -.daggerheart.chat.domain-card .ability-card-footer button:nth-of-type(n + 3) { - margin-top: 2px; -} -.daggerheart.chat.domain-card .ability-card-footer .ability-card-action-cost { - margin: auto; - font-size: 1.5em; -} -.daggerheart.chat.domain-card img { - width: 80px; -} -.daggerheart.chat button.inner-button { - --button-size: 1.25rem; - --input-height: 1.25rem; - padding: 0 0.25rem; - margin: 5px 1px -4px auto; -} -.daggerheart.chat button.inner-button.inner-button-right { - margin-left: auto; -} -.daggerheart.chat [data-use-perm='false'] { - pointer-events: none; - border-color: transparent; -} -.daggerheart.chat [data-view-perm='false'] > * { - display: none; -} -.daggerheart.chat [data-view-perm='false']::after { - content: '??'; -} -.theme-colorful .chat-message.duality { - border-color: black; - padding: 8px 0 0 0; -} -.theme-colorful .chat-message.duality fieldset.daggerheart.chat { - border-top-width: 0; - display: contents; -} -.theme-colorful .chat-message.duality fieldset.daggerheart.chat legend:before, -.theme-colorful .chat-message.duality fieldset.daggerheart.chat legend:after { - display: none; -} -.theme-colorful .chat-message.duality .message-header { - color: var(--color-light-3); - padding: 0 8px; -} -.theme-colorful .chat-message.duality.hope { - background: linear-gradient(0, rgba(165, 42, 42, 0.6) 40px, rgba(0, 0, 0, 0.6)); -} -.theme-colorful .chat-message.duality.fear { - background: linear-gradient(0, rgba(0, 0, 255, 0.6), rgba(15, 15, 97, 0.6)); -} -.theme-colorful .chat-message.duality.critical { - background: linear-gradient(0, rgba(128, 0, 128, 0.6), rgba(37, 8, 37, 0.6)); -} -.theme-colorful .chat-message.duality .chat-message header { - color: var(--color-light-3); -} -.theme-colorful .chat-message.duality > * { - padding: 0 8px; -} -.theme-colorful .chat-message.duality .message-content .duality-modifiers, -.theme-colorful .chat-message.duality .message-content .duality-result, -.theme-colorful .chat-message.duality .message-content .dice-title { - display: flex; -} -.theme-colorful .chat-message.duality .message-content .duality-modifiers { - display: flex; - gap: 2px; - margin-bottom: 4px; -} -.theme-colorful .chat-message.duality .message-content .duality-modifiers .duality-modifier { - padding: 2px; - border-radius: 6px; - border: 1px solid; - background: var(--color-dark-6); - font-size: 12px; -} -.theme-colorful .chat-message.duality .message-content .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; -} -.theme-colorful .chat-message.duality .message-content .dice-result .duality-modifiers { - display: flex; - gap: 2px; - margin-bottom: 4px; -} -.theme-colorful .chat-message.duality .message-content .dice-result .duality-modifiers .duality-modifier { - padding: 2px; - border-radius: 6px; - border: 1px solid; - background: var(--color-dark-6); - font-size: 12px; -} -.theme-colorful .chat-message.duality .message-content .dice-result .dice-formula, -.theme-colorful .chat-message.duality .message-content .dice-result > .dice-total, -.theme-colorful .chat-message.duality .message-content .dice-result .part-header { - display: none; -} -.theme-colorful .chat-message.duality .message-content .dice-result .dice-tooltip { - grid-template-rows: 1fr; -} -.theme-colorful .chat-message.duality .message-content .dice-result .dice-tooltip .wrapper .tooltip-part { - display: flex; - align-items: end; - gap: 0.25rem; -} -.theme-colorful .chat-message.duality .message-content .dice-result .dice-tooltip .wrapper .tooltip-part .dice .dice-rolls { - margin-bottom: 0; -} -.theme-colorful .chat-message.duality .message-content .dice-result .dice-tooltip .wrapper .tooltip-part .dice .dice-rolls.duality li { - display: flex; - align-items: center; - justify-content: center; - position: relative; - background: unset; - line-height: unset; - font-weight: unset; -} -.theme-colorful .chat-message.duality .message-content .dice-result .dice-tooltip .wrapper .tooltip-part .duality-modifier { - display: flex; - margin-bottom: 6px; - color: var(--color-light-1); - text-shadow: 0 0 1px black; - font-size: var(--font-size-16); -} -.theme-colorful .chat-message.duality .message-content .dice-result .target-selection label { - color: var(--color-light-1); -} -.theme-colorful .chat-message.duality .message-content .dice-result .target-section { - margin: 4px 0; - border: 2px solid; - margin-top: 5px; -} -.theme-colorful .chat-message.duality .message-content .dice-result .target-section .dice-total { - box-shadow: unset; - border: unset; - border-radius: unset; - font-size: var(--font-size-18); -} -.theme-colorful .chat-message.duality .message-content .dice-result .dice-actions { - justify-content: space-between; -} -.theme-colorful .chat-message.duality .message-content .dice-result .dice-actions.duality-alone { - justify-content: end; - margin-top: -20px; -} -.theme-colorful .chat-message.duality .message-content .dice-result .dice-actions > * { - 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; -} -.theme-colorful .chat-message.duality .message-content .dice-result .dice-actions .duality-action { - border-radius: 0 6px 0 0; - margin-left: -8px; -} -.theme-colorful .chat-message.duality .message-content .dice-result .dice-actions .duality-action.duality-action-effect { - border-top-left-radius: 6px; - margin-left: initial; -} -.theme-colorful .chat-message.duality .message-content .dice-result .dice-actions .duality-result { - border-radius: 6px 0 0 0; - margin-right: -8px; -} -.theme-colorful .chat-message.duality .message-content .dice-result .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; -} -.theme-colorful .chat-message.duality 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; -} -.daggerheart.sheet.feature .editable { - display: flex; - flex-direction: column; -} -.daggerheart.sheet.feature .sheet-body { - flex: 1; - display: flex; - flex-direction: column; -} -.daggerheart.sheet.feature .feature-description { - flex: 1; - display: flex; - flex-direction: column; -} -.daggerheart.sheet.class .class-feature { - display: flex; -} -.daggerheart.sheet.class .class-feature img { - width: 40px; -} -.daggerheart.sheet.class .class-feature button { - width: 40px; -} -.daggerheart.sheet .domain-card-description .editor { - height: 300px; -} -.daggerheart.sheet .item-container { - margin-top: 4px; - gap: 4px; - align-items: baseline; -} -.daggerheart.sheet .item-sidebar { - min-width: 160px; - flex: 0; - padding: 4px; -} -.daggerheart.sheet .item-sidebar label { - margin-right: 8px; - font-weight: bold; -} -.daggerheart.sheet .item-sidebar input[type='checkbox'] { - margin: 0; -} -form.daggerheart.views.downtime { - height: auto !important; -} -div.daggerheart.views.death-move { - height: auto !important; -} -div.daggerheart.views.multiclass { - height: auto !important; -} -.daggerheart.views.levelup .levelup-title-container { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: 32px; - margin-bottom: 4px; -} -.daggerheart.views.levelup .levelup-title-container .level-title { - text-decoration: underline; -} -.daggerheart.views.levelup .levelup-title-container .level-display { - display: flex; - align-items: center; -} -.daggerheart.views.levelup .levelup-title-container .level-display i { - margin: 0 4px; -} -.daggerheart.views.levelup .levelup-section { - display: flex; - align-items: flex-start; - margin-bottom: 8px; - font-size: 11px; -} -.daggerheart.views.levelup .levelup-section .levelup-container { - flex: 1; -} -.daggerheart.views.levelup .levelup-section .levelup-container:nth-of-type(2) { - padding: 0 4px; -} -.daggerheart.views.levelup .levelup-section .levelup-container.disabled { - opacity: 0.2; -} -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container { - height: 700px; - padding: 24px 58px 0; - display: flex; - flex-direction: column; - align-items: center; - position: relative; -} -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-legend { - margin-left: auto; - margin-right: auto; - font-weight: bold; - z-index: 1; -} -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-info { - background: #778899; - width: 100%; - text-align: center; - position: absolute; - top: -6px; - padding: 8px 0; -} -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-pretext { - padding: 8px 0; -} -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-body { - display: flex; - flex-direction: column; -} -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-body .levelup-choice-row { - display: flex; - align-items: center; - padding: 4px; -} -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-body .levelup-choice-row .levelup-choice-row-inner { - display: flex; - align-items: center; -} -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-body .levelup-choice-row .levelup-choice-input-container { - position: relative; - display: flex; - align-items: center; -} -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-body .levelup-choice-row .levelup-choice-input-container input:disabled:checked::before { - opacity: 0.4; - color: var(--color-warm-1); -} -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-body .levelup-choice-row .levelup-choice-input-container i.fa-link { - transform: rotate(45deg); - position: relative; - top: 2px; - margin: 0 -3px; -} -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-body .levelup-choice-row .levelup-choice-input-container i.fa-lock { - position: absolute; - top: 0; - left: 0; - font-size: 8px; -} -.daggerheart.views.levelup .levelup-section .levelup-container .levelup-inner-container .levelup-posttext { - padding: 8px 0; -} -.daggerheart.views .downtime-container .downtime-header { - margin: 0; - color: light-dark(#18162e, #f3c267); - text-align: center; -} -.daggerheart.views .downtime-container .activity-container { - display: flex; - align-items: center; - padding: 8px; -} -.daggerheart.views .downtime-container .activity-container .activity-title { - flex: 1; - display: flex; - align-items: center; -} -.daggerheart.views .downtime-container .activity-container .activity-title .activity-title-text { - font-size: 24px; - font-weight: bold; -} -.daggerheart.views .downtime-container .activity-container .activity-title .activity-image { - width: 80px; - position: relative; - display: flex; - justify-content: center; - margin-right: 8px; - border: 2px solid black; - border-radius: 50%; - cursor: pointer; -} -.daggerheart.views .downtime-container .activity-container .activity-title .activity-image .activity-select-label { - position: absolute; - top: -9px; - font-size: 14px; - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - color: light-dark(#efe6d8, #222); - background-image: url(../assets/parchments/dh-parchment-light.png); - padding: 0 8px; - line-height: 1; - font-weight: bold; -} -.daggerheart.views .downtime-container .activity-container .activity-title .activity-image img { - border-radius: 50%; -} -.daggerheart.views .downtime-container .activity-container .activity-title .activity-image:hover, -.daggerheart.views .downtime-container .activity-container .activity-title .activity-image.selected { - filter: drop-shadow(0 0 6px gold); -} -.daggerheart.views .downtime-container .activity-container .activity-title .custom-name-input { - font-size: 24px; - font-weight: bold; - padding: 0; - background: transparent; - color: #efe6d8; -} -.daggerheart.views .downtime-container .activity-container .activity-body { - flex: 1; - font-style: italic; -} -.daggerheart.views.downtime .activity-text-area { - resize: none; -} -.daggerheart.views .range-reset { - flex: 0; - width: 21px; - height: 21px; - margin: 3px 4px; - border: 1px solid black; - display: flex; - align-items: center; - justify-content: center; -} -.daggerheart.views.roll-selection .roll-selection-container i { - filter: invert(0%) sepia(100%) saturate(0%) hue-rotate(21deg) brightness(17%) contrast(103%); -} -.daggerheart.views.roll-selection #roll-selection-costSelection footer { - display: none; -} -.daggerheart.views.roll-selection .roll-dialog-container .hope-container { - display: flex; - gap: 8px; - align-items: center; - font-size: 18px; -} -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container { - display: flex; - flex-direction: column; -} -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .selection-container { - display: flex; - align-items: center; - margin-bottom: 8px; - gap: 16px; -} -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .selection-container .dice-container { - display: flex; - align-items: center; - flex: 1; -} -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .selection-container .dice-container .dice-inner-container { - position: relative; - display: flex; - align-items: center; - justify-content: center; -} -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .selection-container .dice-container .dice-inner-container i { - font-size: 18px; -} -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .selection-container .dice-container .dice-inner-container img { - border: 0; - position: relative; - left: 1px; -} -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .selection-container .dice-container .dice-inner-container .dice-number { - position: absolute; - font-size: 24px; - font-weight: bold; -} -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .selection-container .dice-container .advantage-container { - display: flex; - flex-direction: column; - gap: 2px; - flex: 1; -} -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .selection-container .dice-container .advantage-container .advantage-button.active, -.daggerheart.views.npc-roll-selection .npc-roll-dialog-container .selection-container .dice-container .advantage-container .advantage-button:hover { - background: var(--button-hover-background-color); -} -.daggerheart.views.multiclass .multiclass-container { - margin-bottom: 16px; -} -.daggerheart.views.multiclass .multiclass-container .multiclass-category-title { - margin-top: 16px; -} -.daggerheart.views.multiclass .multiclass-container .multiclass-class-choices { - display: flex; - width: 100%; - height: 100%; - flex-wrap: wrap; -} -.daggerheart.views.multiclass .multiclass-container .multiclass-spaced-choices { - display: flex; - justify-content: space-around; - width: 100%; - height: 100%; -} -.daggerheart.views.multiclass .multiclass-container .multiclass-class-choice { - display: flex; - align-items: center; - flex-basis: 33.33%; - font-weight: bold; - font-size: 24px; - cursor: pointer; -} -.daggerheart.views.multiclass .multiclass-container .multiclass-class-choice.selected:not(.disabled), -.daggerheart.views.multiclass .multiclass-container .multiclass-class-choice:hover:not(.disabled) { - filter: drop-shadow(0 0 3px gold); -} -.daggerheart.views.multiclass .multiclass-container .multiclass-class-choice.inactive, -.daggerheart.views.multiclass .multiclass-container .multiclass-class-choice.disabled { - cursor: initial; - opacity: 0.4; -} -.daggerheart.views.multiclass .multiclass-container .multiclass-class-choice img { - width: 80px; - height: 80px; - margin-right: 16px; -} -.daggerheart.views.damage-selection .hope-container { - display: flex; - gap: 8px; - align-items: center; - font-size: 18px; -} -.daggerheart.views.action .action-category { - display: flex; - flex-direction: column; -} -.daggerheart.views.action .action-category .action-category-label { - display: flex; - align-items: center; - justify-content: space-between; - border-radius: 6px; - cursor: pointer; - padding: 0 4px; - margin: 0 auto 4px; -} -.daggerheart.views.action .action-category .action-category-label:hover { - background-color: darkgray; -} -.daggerheart.views.action .action-category .action-category-data { - max-height: 0; - transition: max-height 0.2s ease-in-out; - overflow: hidden; -} -.daggerheart.views.action .action-category .action-category-data.open { - max-height: initial; -} -.daggerheart.views.action .action-category .action-category-data .multi-display { - display: flex; - gap: 1rem; - align-items: center; -} -.daggerheart.views.action .action-category .action-category-data .multi-display .form-group { - flex: 1; -} -.daggerheart.views.action .action-category .action-category-data .form-group { - display: flex; - align-items: center; - margin-bottom: 0.5rem; -} -.daggerheart.views.action .action-category .action-category-data .form-group label { - flex: 2; -} -.daggerheart.views.action .action-category .action-category-data .form-group .form-fields { - flex: 3; -} -.daggerheart.views.action .action-category .action-category-data .form-group img { - width: 1.5rem; - height: 1.5rem; -} -.daggerheart.views.action .action-category .action-category-data .hint-group { - display: flex; - flex-direction: column; - align-items: end; -} -.daggerheart.views.action .action-category .action-category-data .hint-group .form-fields { - width: 100%; - display: flex; - align-items: center; -} -.daggerheart.views.action .action-category .action-category-data .hint-group .form-fields label { - flex: 1; -} -.daggerheart.views.action .action-category .action-category-data .hint-group .form-fields input, -.daggerheart.views.action .action-category .action-category-data .hint-group .form-fields select { - flex: 3; -} -.daggerheart.views.action .action-category .action-category-data .hint-group .hint { - margin: 4px 0 0 0; - font-size: 12px; - font-style: italic; - opacity: 0.6; -} -.daggerheart.views.action .action-category .action-category-data .data-form-array { - border: 1px solid var(--color-fieldset-border); - padding: 0.5rem; - margin-bottom: 0.5rem; -} -.daggerheart.views.ancestry-selection .ancestry-section { - display: flex; - flex-direction: column; - align-items: center; - margin-bottom: 8px; -} -.daggerheart.views.ancestry-selection .ancestry-section .ancestry-container { - width: 100%; - display: flex; - flex-wrap: wrap; -} -.daggerheart.views.ancestry-selection .ancestry-section .ancestry-container .ancestry-inner-container { - flex-basis: 25%; - display: flex; - flex-direction: column; - align-items: center; -} -.daggerheart.views.ancestry-selection .ancestry-section .ancestry-container .ancestry-inner-container .image-container img { - width: 120px; - border: 4px solid black; - border-radius: 50%; -} -.daggerheart.views.ancestry-selection .ancestry-section .ancestry-container .ancestry-inner-container .image-container img.selected { - border-color: gold; -} -.daggerheart.views.ancestry-selection .ancestry-section .ancestry-container .ancestry-inner-container .image-container img:hover:not(.selected) { - filter: drop-shadow(0 0 3px gold); -} -.daggerheart.views.ancestry-selection .ancestry-section .ancestry-container .ancestry-inner-container .image-container img.disabled { - opacity: 0.3; -} -.daggerheart.views.ancestry-selection .ancestry-section .ancestry-container .ancestry-inner-container .name-container div { - font-size: 18px; - font-weight: bold; - cursor: help; -} -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container { - width: 100%; - display: flex; - gap: 8px; -} -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container > div { - flex: 1; -} -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-name { - text-align: center; -} -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-name div { - font-size: 24px; -} -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images { - display: flex; - align-items: center; - gap: 4px; -} -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images .mixed-ancestry-image { - position: relative; - max-width: 33%; -} -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images .mixed-ancestry-image:hover i { - opacity: 1; -} -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images .mixed-ancestry-image i { - position: absolute; - font-size: 32px; - top: calc(50% - 20px); - left: calc(50% - 20px); - padding: 4px; - background-color: grey; - opacity: 0; - cursor: pointer; -} -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images .mixed-ancestry-image i:hover { - filter: drop-shadow(0 0 3px gold); -} -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images .mixed-ancestry-image img { - max-width: 100%; -} -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images img { - max-width: 33%; - border: 4px solid black; - border-radius: 50%; -} -.daggerheart.views.ancestry-selection .ancestry-section .mixed-ancestry-container .mixed-ancestry-images img.selected { - border-color: gold; -} -.daggerheart.sheet.heritage .editor { - height: 200px; -} -.daggerheart.sheet.class .guide .drop-section { - width: 100%; -} -.daggerheart.sheet.class .guide .drop-section legend { - margin-left: auto; - margin-right: auto; - font-size: 12px; -} -.daggerheart.sheet.class .guide .drop-section .drop-section-body { - min-height: 40px; - display: flex; - flex-direction: column; - align-items: center; -} -.daggerheart.sheet.class .guide .trait-input { - text-align: center; - min-width: 24px; -} -.daggerheart.sheet.class .guide .suggested-item { - border-radius: 6px; - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; -} -.daggerheart.sheet.class .guide .suggested-item img { - width: 30px; -} -.daggerheart.sheet.class .guide .suggested-item div { - text-align: center; -} -.daggerheart.sheet.class .guide .suggested-item i { - border-radius: 50%; - margin-right: 4px; - font-size: 11px; -} -.daggerheart.sheet.class .guide .extra-section { - display: flex; - flex-direction: column; - align-items: center; -} -.daggerheart.sheet.class .guide .extra-section .extra-title { - font-size: 14px; - font-weight: bold; -} -.daggerheart.sheet.class .guide-section-title-centered { - font-weight: bold; - font-size: 18px; -} -.daggerheart.sheet.class .inventory-section { - width: 100%; - border: 2px solid black; - border-style: dotted; - min-height: 80px; -} -.daggerheart.sheet.class .inventory-section .inventory-title { - font-weight: bold; - font-size: 14px; - text-align: center; -} -.daggerheart.sheet.class .domain-section { - display: flex; - align-items: center; - gap: 5px; -} -.application.sheet.daggerheart.dh-style.active-effect-config label { - white-space: nowrap; -} -.daggerheart.sheet .title-container { - display: flex; - gap: 8px; -} -.daggerheart.sheet .title-container div { - flex: 1; - align-items: baseline; -} -.daggerheart.sheet .editor-form-group { - display: flex; - flex-direction: column; -} -.daggerheart.sheet .editor-form-group label { - font-weight: bold; - text-align: center; -} -.daggerheart.sheet .option-select { - position: absolute; - top: calc(50% - 10px); - right: 8px; - height: 20px; - width: 20px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - padding: 8px; -} -.daggerheart.sheet .option-select.deeper { - right: 32px; -} -.daggerheart.sheet .option-select:hover:not(:disabled) { - filter: drop-shadow(0px 0px 3px red); - cursor: pointer; -} -.daggerheart.sheet .option-select i { - margin: 0; - font-size: 11px; -} -.daggerheart.sheet .ability-title { - width: 100%; - display: flex; -} -.daggerheart.sheet .ability-title h2 { - flex: 1; -} -.daggerheart.sheet .ability-title i { - cursor: pointer; -} -.daggerheart.sheet .ability-title i:hover { - filter: drop-shadow(0px 0px 3px red); -} -.daggerheart.sheet .ability-choices { - display: flex; - align-items: center; - flex-wrap: wrap; -} -.daggerheart.sheet .ability-chip { - border: 2px solid #708090; - border-radius: 6px; - display: flex; - align-items: center; - padding: 4px; - margin-bottom: 6px; - flex: calc(33% - 4px); - max-width: calc(33% - 4px); -} -.daggerheart.sheet .ability-chip.selected { - filter: drop-shadow(0px 0px 3px red); -} -.daggerheart.sheet .ability-chip:nth-of-type(3n-1) { - margin-left: 6px; - margin-right: 6px; -} -.daggerheart.sheet .ability-chip input { - border: 0; -} -.daggerheart.sheet .ability-chip button { - flex: 0; - border-radius: 50%; - height: 20px; - width: 20px; - display: flex; - align-items: center; - justify-content: center; - margin: 2px 0 2px 4px; - padding: 12px; -} -.daggerheart.sheet .ability-chip button i { - margin: 0; -} -.daggerheart.sheet .object-select-display { - position: relative; - width: calc(100% - 2px); - background: rgba(0, 0, 0, 0.05); - height: var(--form-field-height); - display: flex; - border: 1px solid #7a7971; - border-radius: 3px; -} -.daggerheart.sheet .object-select-display .object-select-title { - position: absolute; - left: 4px; - text-align: center; - font-weight: bold; - text-transform: uppercase; -} -.daggerheart.sheet .object-select-display .object-select-text { - align-self: center; -} -.daggerheart.sheet .object-select-display .object-select-item { - cursor: pointer; -} -.daggerheart.sheet .object-select-display .object-select-item:hover { - filter: drop-shadow(0px 0px 3px red); -} -.daggerheart.sheet .feature-container { - display: flex; - align-items: center; - justify-content: space-between; - background: #778899; - padding: 8px; - border: 2px solid black; - border-radius: 6px; -} -.daggerheart.sheet .feature-container:not(:last-child) { - margin-bottom: 8px; -} -.daggerheart.sheet .feature-container .feature-inner-container { - display: flex; - align-items: center; -} -.daggerheart.sheet .feature-container .feature-inner-container img { - height: 40px; - width: 40px; - margin-right: 8px; -} -.daggerheart.sheet .feature-container .feature-inner-container .feature-title { - font-size: 22px; - font-weight: bold; - font-style: italic; -} -.daggerheart.sheet .feature-container button { - height: 40px; - width: 40px; - background: inherit; - border: 0; -} -.item-button.checked { - background: green; -} -.item-button .item-icon { - opacity: 0; - transition: opacity 0.2s; -} -.item-button .item-icon.checked { - opacity: 1; -} -.theme-light .daggerheart.dh-style.dialog.character-creation .tab-navigation nav a .descriptor { - background-image: url('../assets/parchments/dh-parchment-dark.png'); -} -.theme-light .daggerheart.dh-style.dialog.character-creation .main-selections-container .traits-container .suggested-traits-container .suggested-trait-container, -.theme-light .daggerheart.dh-style.dialog.character-creation .main-selections-container .creation-action-footer .footer-section nav a .descriptor, -.theme-light .daggerheart.dh-style.dialog.character-creation .main-selections-container .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; -} -.daggerheart.dh-style.dialog.character-creation .window-content .tab { - overflow-y: auto; -} -.daggerheart.dh-style.dialog.character-creation .tab-navigation nav { - flex: 1; -} -.daggerheart.dh-style.dialog.character-creation .tab-navigation nav a { - flex: 1; - text-align: center; - display: flex; - justify-content: center; - position: relative; -} -.daggerheart.dh-style.dialog.character-creation .tab-navigation nav a.disabled { - opacity: 0.4; -} -.daggerheart.dh-style.dialog.character-creation .tab-navigation nav a .nav-section-text { - position: relative; - display: flex; - align-items: center; -} -.daggerheart.dh-style.dialog.character-creation .tab-navigation nav a .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: ''; -} -.daggerheart.dh-style.dialog.character-creation .tab-navigation nav a .finish-marker.active { - background-color: var(--color-warm-2); -} -.daggerheart.dh-style.dialog.character-creation .tab-navigation nav a .descriptor { - position: absolute; - bottom: -8px; - font-size: 12px; - border-radius: 8px; - width: 56px; - text-align: center; - line-height: 1; - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - color: light-dark(#efe6d8, #222); - background-image: url(../assets/parchments/dh-parchment-light.png); -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container { - display: flex; - flex-direction: column; - gap: 4px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .selections-container { - width: 140px; - display: flex; - flex-direction: column; - text-align: center; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .selections-container .card-preview-container { - border-color: light-dark(#18162e, #f3c267); -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .selections-outer-container { - display: flex; - justify-content: space-evenly; - height: 210px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .section-container { - border-radius: 8px; - border-color: light-dark(#18162e, #f3c267); -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .section-container legend { - margin-left: auto; - margin-right: auto; - font-size: 28px; - font-weight: bold; - padding: 0 8px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .section-container .section-inner-container { - position: relative; - border-radius: 8px; - border-color: light-dark(#18162e, #f3c267); - display: flex; - justify-content: center; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .section-container .section-inner-container legend { - font-size: 20px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .section-container .section-inner-container .action-button { - position: absolute; - bottom: -8px; - height: 16px; - width: 110px; - min-height: unset; - border: 1px solid light-dark(#18162e, #f3c267); - color: light-dark(#efe6d8, #efe6d8); - background-color: light-dark(var(--color-warm-3), var(--color-warm-3)); -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .section-container .section-inner-container .action-button: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))); -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .traits-container { - text-align: center; - display: flex; - gap: 16px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .traits-container .suggested-traits-container { - display: flex; - flex-wrap: wrap; - width: 176px; - gap: 4px; - margin-bottom: 8px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .traits-container .suggested-traits-container .suggested-trait-container { - width: 56px; - white-space: nowrap; - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - color: light-dark(#efe6d8, #222); - background-image: url('../assets/parchments/dh-parchment-light.png'); -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .traits-container .traits-inner-container { - display: flex; - justify-content: space-evenly; - gap: 8px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .traits-container .traits-inner-container .trait-container { - border: 1px solid light-dark(#18162e, #f3c267); - padding: 0 4px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .experiences-inner-container { - display: flex; - justify-content: space-evenly; - text-align: center; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .experiences-inner-container .experience-container { - position: relative; - display: flex; - align-items: center; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .experiences-inner-container .experience-container .experience-description { - border-color: light-dark(#18162e, #f3c267); - padding-right: 24px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .experiences-inner-container .experience-container .experience-value { - position: absolute; - right: 0; - width: 22px; - border-left: 1px solid light-dark(#18162e, #f3c267); - height: 100%; - display: flex; - align-items: center; - justify-content: center; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .creation-action-footer { - display: flex; - align-items: center; - gap: 32px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .creation-action-footer .footer-section { - display: flex; - align-items: center; - gap: 32px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .creation-action-footer .footer-section nav { - flex: 1; - gap: 8px; - border: 0; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .creation-action-footer .footer-section nav a { - flex: 1; - text-align: center; - display: flex; - justify-content: center; - position: relative; - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .creation-action-footer .footer-section nav a .nav-section-text { - position: relative; - display: flex; - align-items: center; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .creation-action-footer .footer-section nav a .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: ''; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .creation-action-footer .footer-section nav a .finish-marker.finished { - background-color: var(--color-warm-2); -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .creation-action-footer .footer-section nav a .descriptor { - position: absolute; - bottom: -8px; - font-size: 12px; - border-radius: 8px; - width: 56px; - text-align: center; - line-height: 1; - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - color: light-dark(#efe6d8, #222); - background-image: url(../assets/parchments/dh-parchment-light.png); -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .creation-action-footer .footer-section button { - flex: 1; - height: 100%; - white-space: nowrap; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .main-equipment-selection { - display: grid; - grid-template-columns: 1fr 2fr; - gap: 16px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .main-equipment-selection.triple { - grid-template-columns: 1fr 1fr 1fr; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection { - display: flex; - flex-direction: column; - align-items: center; - gap: 8px; - border: 2px solid light-dark(#18162e, #f3c267); - border-radius: 8px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection legend { - margin-left: auto; - margin-right: auto; - font-size: 28px; - font-weight: bold; - padding: 0 8px; - white-space: nowrap; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection .equipment-subsection { - display: flex; - align-items: start; - gap: 32px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection .equipment-wrapper { - display: flex; - flex-direction: column; - align-items: center; - gap: 8px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection .simple-equipment-container { - display: flex; - flex-direction: column; - justify-content: space-evenly; - gap: 8px; - height: 100%; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection .simple-equipment-container .simple-equipment { - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 8px; - position: relative; - display: flex; - justify-content: center; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection .simple-equipment-container .simple-equipment.selectable { - cursor: pointer; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection .simple-equipment-container .simple-equipment.inactive { - opacity: 0.4; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection .simple-equipment-container .simple-equipment label { - position: absolute; - top: -8px; - font-size: 12px; - white-space: nowrap; - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - color: light-dark(#efe6d8, #222); - background-image: url('../assets/parchments/dh-parchment-light.png'); - padding: 0 2px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection .simple-equipment-container .simple-equipment img { - width: 60px; - height: 60px; - border-radius: 8px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection .suggestion-container { - position: relative; - display: flex; - justify-content: center; - height: min-content; - border: 2px solid light-dark(#18162e, #f3c267); - border-radius: 8px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection .suggestion-container legend { - margin-left: auto; - margin-right: auto; - font-size: 12px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection .suggestion-container .suggestion-inner-container { - position: relative; - display: flex; - justify-content: center; - align-items: center; - padding: 6px; - cursor: grab; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection .suggestion-container .suggestion-inner-container.taken { - opacity: 0.4; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection .suggestion-container .suggestion-inner-container label { - position: absolute; - top: -2px; - font-size: 12px; -} -.daggerheart.dh-style.dialog.character-creation .main-selections-container .equipment-selection .suggestion-container .suggestion-inner-container img { - width: 120px; -} -.daggerheart.dh-style.dialog.character-creation .creation-action-footer { - display: flex; - align-items: center; - gap: 32px; -} -.daggerheart.dh-style.dialog.character-creation .creation-action-footer button { - flex: 1; - height: 100%; - white-space: nowrap; -} -.theme-light .daggerheart.levelup .tiers-container .tier-container { - background-image: url('../assets/parchments/dh-parchment-light.png'); -} -.daggerheart.levelup .window-content { - max-height: 960px; - overflow: auto; -} -.daggerheart.levelup div[data-application-part='form'] { - display: flex; - flex-direction: column; - gap: 8px; -} -.daggerheart.levelup section .section-container { - display: flex; - flex-direction: column; - gap: 8px; - margin-top: 8px; -} -.daggerheart.levelup .levelup-navigation-container { - display: flex; - align-items: center; - gap: 22px; - height: 36px; -} -.daggerheart.levelup .levelup-navigation-container nav { - flex: 1; -} -.daggerheart.levelup .levelup-navigation-container nav .levelup-tab-container { - display: flex; - align-items: center; - gap: 4px; -} -.daggerheart.levelup .levelup-navigation-container .levelup-navigation-actions { - width: 306px; - display: flex; - justify-content: end; - gap: 16px; - margin-right: 4px; -} -.daggerheart.levelup .levelup-navigation-container .levelup-navigation-actions * { - width: calc(50% - 8px); -} -.daggerheart.levelup .tiers-container { - display: flex; - gap: 16px; -} -.daggerheart.levelup .tiers-container .tier-container { - flex: 1; - display: flex; - flex-direction: column; - gap: 8px; - background-image: url('../assets/parchments/dh-parchment-dark.png'); -} -.daggerheart.levelup .tiers-container .tier-container.inactive { - opacity: 0.4; - pointer-events: none; -} -.daggerheart.levelup .tiers-container .tier-container legend { - margin-left: auto; - margin-right: auto; - font-size: 22px; - font-weight: bold; - padding: 0 12px; -} -.daggerheart.levelup .tiers-container .tier-container .checkbox-group-container { - display: grid; - grid-template-columns: 1fr 3fr; - gap: 4px; -} -.daggerheart.levelup .tiers-container .tier-container .checkbox-group-container .checkboxes-container { - display: flex; - justify-content: end; - gap: 4px; -} -.daggerheart.levelup .tiers-container .tier-container .checkbox-group-container .checkboxes-container .checkbox-grouping-coontainer { - display: flex; - height: min-content; -} -.daggerheart.levelup .tiers-container .tier-container .checkbox-group-container .checkboxes-container .checkbox-grouping-coontainer.multi { - border: 2px solid grey; - padding: 2.4px 2.5px 0; - border-radius: 4px; - gap: 2px; -} -.daggerheart.levelup .tiers-container .tier-container .checkbox-group-container .checkboxes-container .checkbox-grouping-coontainer.multi .selection-checkbox { - margin-left: 0; - margin-right: 0; -} -.daggerheart.levelup .tiers-container .tier-container .checkbox-group-container .checkboxes-container .checkbox-grouping-coontainer .selection-checkbox { - margin: 0; -} -.daggerheart.levelup .tiers-container .tier-container .checkbox-group-container .checkbox-group-label { - font-size: 14px; - font-style: italic; -} -.daggerheart.levelup .levelup-selections-container .achievement-experience-cards { - display: flex; - gap: 8px; -} -.daggerheart.levelup .levelup-selections-container .achievement-experience-cards .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; -} -.daggerheart.levelup .levelup-selections-container .achievement-experience-cards .achievement-experience-card .achievement-experience-marker { - border: 1px solid; - border-radius: 50%; - height: 18px; - width: 18px; - display: flex; - align-items: center; - justify-content: center; - font-size: 12px; -} -.daggerheart.levelup .levelup-selections-container .levelup-card-selection { - display: flex; - flex-wrap: wrap; - gap: 40px; -} -.daggerheart.levelup .levelup-selections-container .levelup-card-selection .card-preview-container { - width: calc(100% * (1 / 5)); -} -.daggerheart.levelup .levelup-selections-container .levelup-card-selection .levelup-domains-selection-container { - display: flex; - flex-direction: column; - gap: 8px; -} -.daggerheart.levelup .levelup-selections-container .levelup-card-selection .levelup-domains-selection-container .levelup-domain-selection-container { - display: flex; - flex-direction: column; - align-items: center; - flex: 1; - position: relative; - cursor: pointer; -} -.daggerheart.levelup .levelup-selections-container .levelup-card-selection .levelup-domains-selection-container .levelup-domain-selection-container.disabled { - pointer-events: none; - opacity: 0.4; -} -.daggerheart.levelup .levelup-selections-container .levelup-card-selection .levelup-domains-selection-container .levelup-domain-selection-container .levelup-domain-label { - position: absolute; - text-align: center; - top: 4px; - background: grey; - padding: 0 12px; - border-radius: 6px; -} -.daggerheart.levelup .levelup-selections-container .levelup-card-selection .levelup-domains-selection-container .levelup-domain-selection-container img { - height: 124px; -} -.daggerheart.levelup .levelup-selections-container .levelup-card-selection .levelup-domains-selection-container .levelup-domain-selection-container .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); -} -.daggerheart.levelup .levelup-selections-container .levelup-card-selection .levelup-domains-selection-container .levelup-domain-selection-container .levelup-domain-selected i { - position: relative; - right: 2px; -} -.daggerheart.levelup .levelup-selections-container .levelup-selections-title { - display: flex; - align-items: center; - gap: 4px; -} -.daggerheart.levelup .levelup-selections-container .levelup-radio-choices { - display: flex; - gap: 8px; -} -.daggerheart.levelup .levelup-selections-container .levelup-radio-choices label { - flex: 0; -} -.daggerheart.levelup .levelup-summary-container .level-achievements-container, -.daggerheart.levelup .levelup-summary-container .level-advancements-container { - display: flex; - flex-direction: column; - gap: 8px; -} -.daggerheart.levelup .levelup-summary-container .level-achievements-container h2, -.daggerheart.levelup .levelup-summary-container .level-advancements-container h2, -.daggerheart.levelup .levelup-summary-container .level-achievements-container h3, -.daggerheart.levelup .levelup-summary-container .level-advancements-container h3, -.daggerheart.levelup .levelup-summary-container .level-achievements-container h4, -.daggerheart.levelup .levelup-summary-container .level-advancements-container h4, -.daggerheart.levelup .levelup-summary-container .level-achievements-container h5, -.daggerheart.levelup .levelup-summary-container .level-advancements-container h5 { - margin: 0; - color: var(--color-text-secondary); -} -.daggerheart.levelup .levelup-summary-container .increase-container { - display: flex; - align-items: center; - gap: 4px; - font-size: 20px; -} -.daggerheart.levelup .levelup-summary-container .summary-selection-container { - display: flex; - gap: 8px; -} -.daggerheart.levelup .levelup-summary-container .summary-selection-container .summary-selection { - border: 2px solid; - border-radius: 6px; - padding: 0 4px; - font-size: 18px; -} -.daggerheart.levelup .levelup-footer { - display: flex; -} -.daggerheart.views.ownership-selection .ownership-outer-container { - display: flex; - flex-direction: column; - gap: 8px; -} -.daggerheart.views.ownership-selection .ownership-outer-container .ownership-container { - display: flex; - border: 2px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - padding: 0 4px 0 0; - align-items: center; - gap: 8px; -} -.daggerheart.views.ownership-selection .ownership-outer-container .ownership-container img { - height: 40px; - width: 40px; - border-radius: 6px 0 0 6px; -} -.daggerheart.views.ownership-selection .ownership-outer-container .ownership-container select { - margin: 4px 0; -} -.daggerheart.views.damage-reduction .window-content { - padding: 8px 0; -} -.daggerheart.views.damage-reduction .damage-reduction-container { - display: flex; - flex-direction: column; - align-items: center; - gap: 4px; -} -.daggerheart.views.damage-reduction .damage-reduction-container .section-container { - display: flex; - flex-direction: column; - align-items: center; - width: 100%; -} -.daggerheart.views.damage-reduction .damage-reduction-container .padded { - padding: 0 8px; -} -.daggerheart.views.damage-reduction .damage-reduction-container .armor-title { - margin: 0; - white-space: nowrap; -} -.daggerheart.views.damage-reduction .damage-reduction-container .resources-container { - display: flex; - gap: 8px; - width: 100%; -} -.daggerheart.views.damage-reduction .damage-reduction-container .resources-container .resource-container { - flex: 1; - display: flex; - flex-direction: column; - align-items: center; -} -.daggerheart.views.damage-reduction .damage-reduction-container .mark-selection { - display: flex; - align-items: center; - width: 100%; - margin: 0; -} -.daggerheart.views.damage-reduction .damage-reduction-container .mark-selection .mark-selection-inner { - display: flex; - gap: 2px; -} -.daggerheart.views.damage-reduction .damage-reduction-container .mark-selection .mark-selection-inner:not(:last-child) { - margin-right: 8px; -} -.daggerheart.views.damage-reduction .damage-reduction-container .mark-selection .mark-selection-inner .mark-container { - cursor: pointer; - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - height: 26px; - padding: 0 1px; - font-size: 18px; - display: flex; - align-items: center; - justify-content: center; - opacity: 0.4; -} -.daggerheart.views.damage-reduction .damage-reduction-container .mark-selection .mark-selection-inner .mark-container.selected { - opacity: 1; -} -.daggerheart.views.damage-reduction .damage-reduction-container .mark-selection .mark-selection-inner .mark-container.inactive { - cursor: initial; - opacity: 0.2; -} -.daggerheart.views.damage-reduction .damage-reduction-container .mark-selection .mark-selection-inner .mark-container .fa-shield { - position: relative; - right: 0.5px; -} -.daggerheart.views.damage-reduction .damage-reduction-container .stress-reduction-container { - margin: 0; - width: 100%; -} -.daggerheart.views.damage-reduction .damage-reduction-container .stress-reduction-container .stress-reduction { - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - height: 26px; - padding: 0 4px; - font-size: 18px; - display: flex; - align-items: center; - justify-content: center; - gap: 4px; - opacity: 0.4; -} -.daggerheart.views.damage-reduction .damage-reduction-container .stress-reduction-container .stress-reduction.active { - opacity: 1; - cursor: pointer; -} -.daggerheart.views.damage-reduction .damage-reduction-container .stress-reduction-container .stress-reduction.selected { - opacity: 1; - background: var(--color-warm-2); - color: white; -} -.daggerheart.views.damage-reduction .damage-reduction-container .stress-reduction-container .stress-reduction .stress-reduction-cost { - display: flex; - align-items: center; -} -.daggerheart.views.damage-reduction .damage-reduction-container .markers-subtitle { - margin: -4px 0 0 0; -} -.daggerheart.views.damage-reduction .damage-reduction-container .markers-subtitle.bold { - font-variant: all-small-caps; - font-weight: bold; -} -.daggerheart.views.damage-reduction .damage-reduction-container footer { - display: flex; - width: 100%; -} -.daggerheart.views.damage-reduction .damage-reduction-container footer button { - flex: 1; -} -.daggerheart.views.damage-reduction .damage-reduction-container footer button .damage-value { - font-weight: bold; -} -.daggerheart.views.damage-reduction .damage-reduction-container footer button .damage-value.reduced-value { - opacity: 0.4; - text-decoration: line-through; -} -:root { - --shadow-text-stroke: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000; - --fear-animation: background 0.3s ease, box-shadow 0.3s ease, border-color 0.3s ease, opacity 0.3s ease; -} -#resources { - min-height: calc(var(--header-height) + 4rem); - min-width: 4rem; - color: #d3d3d3; - transition: var(--fear-animation); -} -#resources header, -#resources .controls, -#resources .window-resize-handle { - transition: var(--fear-animation); -} -#resources .window-content { - padding: 0.5rem; -} -#resources .window-content #resource-fear { - display: flex; - flex-direction: row; - gap: 0.5rem 0.25rem; - flex-wrap: wrap; -} -#resources .window-content #resource-fear i { - font-size: var(--font-size-18); - border: 1px solid rgba(0, 0, 0, 0.5); - border-radius: 50%; - aspect-ratio: 1; - display: flex; - justify-content: center; - align-items: center; - width: 3rem; - background-color: rgba(9, 71, 179, 0.75); - -webkit-box-shadow: 0px 0px 5px 1px rgba(0, 0, 0, 0.75); - box-shadow: 0px 0px 5px 1px rgba(0, 0, 0, 0.75); - color: #d3d3d3; - flex-grow: 0; -} -#resources .window-content #resource-fear i.inactive { - filter: grayscale(1) !important; - opacity: 0.5; -} -#resources .window-content #resource-fear .controls, -#resources .window-content #resource-fear .resource-bar { - border: 2px solid #997a4f; - background-color: #18162e; -} -#resources .window-content #resource-fear .controls { - display: flex; - align-self: center; - border-radius: 50%; - align-items: center; - justify-content: center; - width: 30px; - height: 30px; - font-size: var(--font-size-20); - cursor: pointer; -} -#resources .window-content #resource-fear .controls:hover { - font-size: 1.5rem; -} -#resources .window-content #resource-fear .controls.disabled { - opacity: 0.5; -} -#resources .window-content #resource-fear .resource-bar { - display: flex; - justify-content: center; - border-radius: 6px; - font-size: var(--font-size-20); - overflow: hidden; - position: relative; - padding: 0.25rem 0.5rem; - flex: 1; - text-shadow: var(--shadow-text-stroke); -} -#resources .window-content #resource-fear .resource-bar:before { - content: ''; - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: var(--fear-percent); - max-width: 100%; - background: linear-gradient(90deg, #020026 0%, #c701fc 100%); - z-index: 0; - border-radius: 4px; -} -#resources .window-content #resource-fear .resource-bar span { - position: inherit; - z-index: 1; -} -#resources .window-content #resource-fear.isGM i { - cursor: pointer; -} -#resources .window-content #resource-fear.isGM i:hover { - font-size: var(--font-size-20); -} -#resources button[data-action='close'] { - display: none; -} -#resources:not(:hover):not(.minimized) { - background: transparent; - box-shadow: unset; - border-color: transparent; -} -#resources:not(:hover):not(.minimized) header, -#resources:not(:hover):not(.minimized) .controls, -#resources:not(:hover):not(.minimized) .window-resize-handle { - opacity: 0; -} -#resources:has(.fear-bar) { - min-width: 200px; -} -.theme-light .daggerheart.dh-style.countdown .minimized-view .mini-countdown-container { - background-image: url('../assets/parchments/dh-parchment-dark.png'); -} -.daggerheart.dh-style.countdown { - overflow: hidden; -} -.daggerheart.dh-style.countdown fieldset { - align-items: center; - margin-top: 5px; - border-radius: 6px; - border-color: light-dark(#18162e, #f3c267); -} -.daggerheart.dh-style.countdown fieldset legend { - font-family: 'Montserrat', sans-serif; - font-weight: bold; - color: light-dark(#18162e, #f3c267); -} -.daggerheart.dh-style.countdown fieldset legend a { - text-shadow: none; -} -.daggerheart.dh-style.countdown .minimized-view { - display: flex; - gap: 8px; - flex-wrap: wrap; -} -.daggerheart.dh-style.countdown .minimized-view .mini-countdown-container { - width: fit-content; - display: flex; - align-items: center; - gap: 8px; - border: 2px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - padding: 0 4px 0 0; - background-image: url('../assets/parchments/dh-parchment-light.png'); - color: light-dark(#efe6d8, #222); - cursor: pointer; -} -.daggerheart.dh-style.countdown .minimized-view .mini-countdown-container.disabled { - cursor: initial; -} -.daggerheart.dh-style.countdown .minimized-view .mini-countdown-container img { - width: 30px; - height: 30px; - border-radius: 6px 0 0 6px; -} -.daggerheart.dh-style.countdown .minimized-view .mini-countdown-container .mini-countdown-name { - white-space: nowrap; -} -.daggerheart.dh-style.countdown .hidden { - display: none; -} -.daggerheart.dh-style.countdown .window-content > div { - height: 100%; -} -.daggerheart.dh-style.countdown .window-content > div .expanded-view { - height: 100%; - display: flex; - flex-direction: column; -} -.daggerheart.dh-style.countdown .window-content > div .expanded-view .countdowns-menu { - display: flex; - gap: 8px; -} -.daggerheart.dh-style.countdown .window-content > div .expanded-view .countdowns-menu .flex { - flex: 1; -} -.daggerheart.dh-style.countdown .window-content > div .expanded-view .countdowns-container { - display: flex; - gap: 8px; - flex-wrap: wrap; - overflow: auto; - max-height: 100%; -} -.daggerheart.dh-style.countdown .window-content > div .expanded-view .countdowns-container .countdown-fieldset { - width: 340px; - height: min-content; - position: relative; -} -.daggerheart.dh-style.countdown .window-content > div .expanded-view .countdowns-container .countdown-fieldset .ownership-button { - position: absolute; - top: 8px; - right: 8px; - font-size: 18px; -} -.daggerheart.dh-style.countdown .window-content > div .expanded-view .countdowns-container .countdown-fieldset .countdown-container { - display: flex; - align-items: center; - gap: 16px; -} -.daggerheart.dh-style.countdown .window-content > div .expanded-view .countdowns-container .countdown-fieldset .countdown-container img { - width: 150px; - height: 150px; - cursor: pointer; -} -.daggerheart.dh-style.countdown .window-content > div .expanded-view .countdowns-container .countdown-fieldset .countdown-container img.disabled { - cursor: initial; -} -.daggerheart.dh-style.countdown .window-content > div .expanded-view .countdowns-container .countdown-fieldset .countdown-container .countdown-inner-container { - display: flex; - flex-direction: column; - gap: 4px; -} -.daggerheart.dh-style.countdown .window-content > div .expanded-view .countdowns-container .countdown-fieldset .countdown-container .countdown-inner-container .countdown-value-container { - display: flex; - gap: 4px; -} -.daggerheart.dh-style.countdown .window-content > div .expanded-view .countdowns-container .countdown-fieldset .countdown-container .countdown-inner-container .countdown-value-container input { - max-width: 80px; -} -.daggerheart.dh-style.setting fieldset { - display: flex; - flex-direction: column; - gap: 4px; -} -.daggerheart.dh-style.setting fieldset.two-columns { - display: grid; - grid-template-columns: 1fr 2fr; - gap: 10px; -} -.daggerheart.dh-style.setting fieldset.two-columns.even { - grid-template-columns: 1fr 1fr; -} -.daggerheart.dh-style.setting .setting-group-field { - white-space: nowrap; - display: flex; - align-items: center; - gap: 8px; -} -.daggerheart.dh-style.setting .settings-items { - display: flex; - flex-direction: column; - gap: 8px; -} -.daggerheart.dh-style.setting .settings-items .settings-item { - display: flex; - align-items: center; - justify-content: space-between; - border: 1px solid; - border-radius: 8px; - padding: 0 8px 0 0; -} -.daggerheart.dh-style.setting .settings-items .settings-item .settings-sub-item { - display: flex; - align-items: center; - gap: 8px; -} -.daggerheart.dh-style.setting .settings-items .settings-item .settings-sub-item img { - width: 60px; - border-radius: 8px 0 0 8px; -} -.daggerheart.dh-style.setting .settings-items .settings-item .settings-sub-item i { - font-size: 18px; -} -.daggerheart.dh-style.setting .settings-item-header { - display: flex; - align-items: center; -} -.daggerheart.dh-style.setting .settings-item-header .profile { - height: 100px; - width: 100px; - object-fit: cover; - box-sizing: border-box; - cursor: pointer; -} -.daggerheart.dh-style.setting .settings-item-header .item-info { - display: flex; - flex-direction: column; - align-items: center; - gap: 5px; - text-align: center; - width: 80%; -} -.daggerheart.dh-style.setting .settings-item-header .item-info .item-name input[type='text'] { - font-size: 32px; - height: 42px; - text-align: center; - width: 90%; - transition: all 0.3s ease; - outline: 2px solid transparent; - border: 1px solid transparent; -} -.daggerheart.dh-style.setting .settings-item-header .item-info .item-name input[type='text']:hover[type='text'], -.daggerheart.dh-style.setting .settings-item-header .item-info .item-name input[type='text']:focus[type='text'] { - box-shadow: none; - outline: 2px solid light-dark(#18162e, #f3c267); -} -.daggerheart.dh-style.setting .settings-col { - display: flex; - flex-direction: column; - gap: 4px; -} -.daggerheart.dh-style.setting .trait-array-container { - display: flex; - justify-content: space-evenly; - gap: 8px; - margin-bottom: 16px; -} -.daggerheart.dh-style.setting .trait-array-container .trait-array-item { - position: relative; - display: flex; - justify-content: center; -} -.daggerheart.dh-style.setting .trait-array-container .trait-array-item label { - position: absolute; - top: -7px; - font-size: 12px; - font-variant: petite-caps; -} -.daggerheart.dh-style.setting .trait-array-container .trait-array-item input { - text-align: center; -} -.themed.theme-dark .application.daggerheart.sheet.dh-style .character-header-sheet .trait, -.themed.theme-dark.application.daggerheart.sheet.dh-style .character-header-sheet .trait, -body.theme-dark .application.daggerheart .character-header-sheet .trait, -body.theme-dark.application.daggerheart .character-header-sheet .trait { - background: url(../assets/svg/trait-shield.svg) no-repeat; -} -.themed.theme-light .application.daggerheart.sheet.dh-style .character-header-sheet .trait, -.themed.theme-light.application.daggerheart.sheet.dh-style .character-header-sheet .trait, -body.theme-light .application.daggerheart .character-header-sheet .trait, -body.theme-light.application.daggerheart .character-header-sheet .trait { - background: url('../assets/svg/trait-shield-light.svg') no-repeat; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet { - padding: 0 15px; - padding-top: 36px; - width: 100%; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .name-row { - display: flex; - gap: 5px; - align-items: center; - justify-content: space-between; - padding: 0; - padding-top: 5px; - flex: 1; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .name-row input[type='text'] { - font-size: 32px; - height: 42px; - text-align: start; - border: 1px solid transparent; - outline: 2px solid transparent; - transition: all 0.3s ease; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .name-row input[type='text']:hover { - outline: 2px solid light-dark(#222, #f3c267); -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .name-row .level-div { - white-space: nowrap; - display: flex; - justify-content: end; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .name-row .level-div .label { - display: flex; - align-items: center; - gap: 4px; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .name-row .level-div input { - width: 40px; - padding: 0; - text-align: center; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .name-row .level-div .level-button { - color: light-dark(#222, #efe6d8); - font-size: 18px; - line-height: 1; - min-height: unset; - height: min-content; - padding: 4px; - font-family: 'Cinzel', serif; - margin: 0; - font-weight: normal; - border-color: light-dark(#18162e, #f3c267); - background-color: light-dark(transparent, #0e0d15); -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .name-row .level-div .level-button:hover { - background-image: none; - background-color: var(--color-warm-2); - filter: drop-shadow(0 0 3px lightgray); -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-details { - display: flex; - justify-content: space-between; - padding: 5px 0; - margin-bottom: 10px; - font-size: 12px; - color: light-dark(#18162e, #f3c267); -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-details span { - padding: 3px; - border-radius: 3px; - transition: all 0.3s ease; - cursor: pointer; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-details span:hover { - background: light-dark(#18162e40, #f3c26740); -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-details span.dot { - background: transparent; - cursor: default; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-row { - display: flex; - gap: 20px; - align-items: center; - justify-content: space-between; - padding: 0; - margin-bottom: 15px; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-row .hope-section, -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-row .threshold-section { - position: relative; - display: flex; - gap: 10px; - background-color: light-dark(transparent, #18162e); - color: light-dark(#18162e, #f3c267); - padding: 5px 10px; - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - align-items: center; - width: fit-content; - height: 30px; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-row .hope-section h4, -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-row .threshold-section h4 { - font-size: 14px; - font-weight: bold; - text-transform: uppercase; - color: light-dark(#18162e, #f3c267); -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-row .hope-section h4.threshold-value, -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-row .threshold-section h4.threshold-value { - color: light-dark(#222, #efe6d8); -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-row .hope-section .threshold-legend, -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-row .threshold-section .threshold-legend { - position: absolute; - bottom: -21px; - color: light-dark(#f3c267, #18162e); - background-color: light-dark(#18162e, #f3c267); - padding: 3px; - justify-self: anchor-center; - border-radius: 0 0 3px 3px; - text-transform: capitalize; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-row .hope-section .hope-value, -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-row .threshold-section .hope-value { - display: flex; - cursor: pointer; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-traits { - display: flex; - justify-content: space-between; - padding: 0; - margin-bottom: 15px; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-traits .trait { - height: 60px; - width: 60px; - cursor: pointer; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-traits .trait .trait-name { - display: flex; - padding-top: 5px; - color: light-dark(#18162e, #f3c267); - font-size: 14px; - font-weight: 600; - align-items: center; - justify-content: center; - gap: 3px; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-traits .trait .trait-name i { - line-height: 17px; - font-size: 10px; -} -.application.sheet.daggerheart.actor.dh-style.character .character-header-sheet .character-traits .trait .trait-value { - font-family: 'Montserrat', sans-serif; - font-style: normal; - font-weight: 400; - font-size: 20px; - text-align: center; -} -.themed.theme-dark .application.daggerheart.sheet.dh-style .character-sidebar-sheet, -.themed.theme-dark.application.daggerheart.sheet.dh-style .character-sidebar-sheet, -body.theme-dark .application.daggerheart .character-sidebar-sheet, -body.theme-dark.application.daggerheart .character-sidebar-sheet { - background-image: url('../assets/parchments/dh-parchment-dark.png'); -} -.themed.theme-dark .application.daggerheart.sheet.dh-style .character-sidebar-sheet .experience-value, -.themed.theme-dark.application.daggerheart.sheet.dh-style .character-sidebar-sheet .experience-value, -body.theme-dark .application.daggerheart .character-sidebar-sheet .experience-value, -body.theme-dark.application.daggerheart .character-sidebar-sheet .experience-value { - background: url(../assets/svg/experience-shield.svg) no-repeat; -} -.themed.theme-light .application.daggerheart.sheet.dh-style .character-sidebar-sheet, -.themed.theme-light.application.daggerheart.sheet.dh-style .character-sidebar-sheet, -body.theme-light .application.daggerheart .character-sidebar-sheet, -body.theme-light.application.daggerheart .character-sidebar-sheet { - background: transparent; -} -.themed.theme-light .application.daggerheart.sheet.dh-style .character-sidebar-sheet .experience-value, -.themed.theme-light.application.daggerheart.sheet.dh-style .character-sidebar-sheet .experience-value, -body.theme-light .application.daggerheart .character-sidebar-sheet .experience-value, -body.theme-light.application.daggerheart .character-sidebar-sheet .experience-value { - background: url('../assets/svg/experience-shield-light.svg') no-repeat; -} -.application.sheet.dh-style .character-sidebar-sheet { - width: 275px; - min-width: 275px; - border-right: 1px solid light-dark(#18162e, #f3c267); -} -.application.sheet.dh-style .character-sidebar-sheet .portrait { - position: relative; - border-bottom: 1px solid light-dark(#18162e, #f3c267); - cursor: pointer; -} -.application.sheet.dh-style .character-sidebar-sheet .portrait img { - height: 235px; - width: 275px; - object-fit: cover; -} -.application.sheet.dh-style .character-sidebar-sheet .portrait .death-roll-btn { - display: none; -} -.application.sheet.dh-style .character-sidebar-sheet .portrait.death-roll { - filter: grayscale(1); -} -.application.sheet.dh-style .character-sidebar-sheet .portrait.death-roll .death-roll-btn { - display: flex; - position: absolute; - top: 30%; - right: 30%; - font-size: 6rem; - color: #efe6d8; -} -.application.sheet.dh-style .character-sidebar-sheet .portrait.death-roll .death-roll-btn:hover { - text-shadow: 0 0 8px #efe6d8; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section { - position: relative; - display: flex; - flex-direction: column; - top: -20px; - gap: 30px; - margin-bottom: -10px; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section { - display: flex; - justify-content: space-evenly; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section .status-bar { - position: relative; - width: 100px; - height: 40px; - justify-items: center; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section .status-bar .status-label { - position: relative; - top: 40px; - height: 22px; - width: 79px; - clip-path: path('M0 0H79L74 16.5L39 22L4 16.5L0 0Z'); - background: light-dark(#18162e, #f3c267); -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section .status-bar .status-label h4 { - font-weight: bold; - text-align: center; - line-height: 18px; - color: light-dark(#efe6d8, #18162e); -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section .status-bar .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: #efe6d8; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section .status-bar .status-value input[type='number'] { - background: transparent; - font-size: 1.5rem; - width: 40px; - height: 30px; - text-align: center; - border: none; - outline: 2px solid transparent; - color: #efe6d8; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section .status-bar .status-value input[type='number'].bar-input { - padding: 0; - color: #efe6d8; - backdrop-filter: none; - background: transparent; - transition: all 0.3s ease; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section .status-bar .status-value input[type='number'].bar-input:hover, -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section .status-bar .status-value input[type='number'].bar-input:focus { - background: rgba(24, 22, 46, 0.33); - backdrop-filter: blur(9.5px); -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section .status-bar .status-value .bar-label { - width: 40px; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section .status-bar .progress-bar { - position: absolute; - appearance: none; - width: 100px; - height: 40px; - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - z-index: 1; - background: #18162e; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section .status-bar .progress-bar::-webkit-progress-bar { - border: none; - background: #18162e; - border-radius: 6px; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section .status-bar .progress-bar::-webkit-progress-value { - background: linear-gradient(15deg, #46140a 0%, #be0000 42%, #fcb045 100%); - border-radius: 6px; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section .status-bar .progress-bar.stress-color::-webkit-progress-value { - background: linear-gradient(15deg, #823b01 0%, #fc8e45 65%, #be0000 100%); - border-radius: 6px; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section .status-bar .progress-bar::-moz-progress-bar { - background: linear-gradient(15deg, #46140a 0%, #be0000 42%, #fcb045 100%); - border-radius: 6px; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .resources-section .status-bar .progress-bar.stress-color::-moz-progress-bar { - background: linear-gradient(15deg, #823b01 0%, #fc8e45 65%, #be0000 100%); - border-radius: 6px; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .status-section { - display: flex; - flex-wrap: wrap; - gap: 5px; - justify-content: center; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .status-section .status-number { - justify-items: center; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .status-section .status-number .status-value { - position: relative; - display: flex; - width: 50px; - height: 30px; - border: 1px solid light-dark(#18162e, #f3c267); - 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, #18162e); - z-index: 2; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .status-section .status-number .status-value.armor-slots { - width: 80px; - height: 30px; -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .status-section .status-number .status-label { - padding: 2px 10px; - width: 100%; - border-radius: 3px; - background: light-dark(#18162e, #f3c267); -} -.application.sheet.dh-style .character-sidebar-sheet .info-section .status-section .status-number .status-label h4 { - font-weight: bold; - text-align: center; - line-height: 18px; - font-size: 12px; - color: light-dark(#efe6d8, #18162e); -} -.application.sheet.dh-style .character-sidebar-sheet .items-sidebar-list { - display: flex; - flex-direction: column; - gap: 5px; -} -.application.sheet.dh-style .character-sidebar-sheet .items-sidebar-list .inventory-item { - padding: 0 10px; -} -.application.sheet.dh-style .character-sidebar-sheet .equipment-section .title { - display: flex; - gap: 15px; - align-items: center; -} -.application.sheet.dh-style .character-sidebar-sheet .equipment-section .title h3 { - font-size: 20px; -} -.application.sheet.dh-style .character-sidebar-sheet .equipment-section .items-list { - display: flex; - flex-direction: column; - gap: 10px; - align-items: center; -} -.application.sheet.dh-style .character-sidebar-sheet .loadout-section .title { - display: flex; - gap: 15px; - align-items: center; -} -.application.sheet.dh-style .character-sidebar-sheet .loadout-section .title h3 { - font-size: 20px; -} -.application.sheet.dh-style .character-sidebar-sheet .experience-section .title { - display: flex; - gap: 15px; - align-items: center; -} -.application.sheet.dh-style .character-sidebar-sheet .experience-section .title h3 { - font-size: 20px; -} -.application.sheet.dh-style .character-sidebar-sheet .experience-section .experience-list { - display: flex; - flex-direction: column; - gap: 5px; - width: 100%; - margin-top: 10px; - align-items: center; -} -.application.sheet.dh-style .character-sidebar-sheet .experience-section .experience-list .experience-row { - display: flex; - gap: 5px; - width: 250px; - align-items: center; - justify-content: space-between; -} -.application.sheet.dh-style .character-sidebar-sheet .experience-section .experience-list .experience-row input[type='text'] { - height: 32px; - width: 180px; - border: 1px solid transparent; - outline: 2px solid transparent; - font-size: 14px; - font-family: 'Montserrat', sans-serif; - transition: all 0.3s ease; - color: light-dark(#222, #efe6d8); -} -.application.sheet.dh-style .character-sidebar-sheet .experience-section .experience-list .experience-row input[type='text']:hover { - outline: 2px solid light-dark(#222, #efe6d8); -} -.application.sheet.dh-style .character-sidebar-sheet .experience-section .experience-list .experience-value { - height: 25px; - width: 35px; - font-size: 14px; - font-family: 'Montserrat', sans-serif; - color: light-dark(#222, #efe6d8); - align-content: center; - text-align: center; -} -.application.sheet.daggerheart.actor.dh-style.character .window-content { - display: grid; - grid-template-columns: 275px 1fr; - grid-template-rows: auto 1fr; - gap: 15px 0; - height: 100%; - width: 100%; - overflow: auto; -} -.application.sheet.daggerheart.actor.dh-style.character .window-content .character-sidebar-sheet { - grid-row: 1 / span 2; - grid-column: 1; -} -.application.sheet.daggerheart.actor.dh-style.character .window-content .character-header-sheet { - grid-row: 1; - grid-column: 2; -} -.application.sheet.daggerheart.actor.dh-style.character .window-content .tab { - grid-row: 2; - grid-column: 2; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.inventory .search-section { - display: flex; - gap: 10px; - align-items: center; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.inventory .search-section .search-bar { - position: relative; - color: light-dark(#18162e50, #efe6d850); - width: 100%; - padding-top: 5px; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.inventory .search-section .search-bar input { - border-radius: 50px; - font-family: 'Montserrat', sans-serif; - background: light-dark(#18162e10, #f3c26710); - border: none; - outline: 2px solid transparent; - transition: all 0.3s ease; - padding: 0 20px; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.inventory .search-section .search-bar input:hover { - outline: 2px solid light-dark(#222, #f3c267); -} -.application.sheet.daggerheart.actor.dh-style.character .tab.inventory .search-section .search-bar input:placeholder { - color: light-dark(#18162e50, #efe6d850); -} -.application.sheet.daggerheart.actor.dh-style.character .tab.inventory .search-section .search-bar input::-webkit-search-cancel-button { - -webkit-appearance: none; - display: none; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.inventory .search-section .search-bar .icon { - align-content: center; - height: 32px; - position: absolute; - right: 20px; - font-size: 16px; - z-index: 1; - color: light-dark(#18162e50, #efe6d850); -} -.application.sheet.daggerheart.actor.dh-style.character .tab.inventory .items-section { - display: flex; - flex-direction: column; - gap: 10px; - overflow-y: auto; - mask-image: linear-gradient(0deg, transparent 0%, black 5%, black 95%, transparent 100%); - padding: 20px 0; - height: 80%; - scrollbar-width: thin; - scrollbar-color: light-dark(#18162e, #f3c267) transparent; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.inventory .currency-section { - display: flex; - gap: 10px; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.loadout .search-section { - display: flex; - align-items: center; - justify-content: space-between; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.loadout .search-section .search-bar { - position: relative; - color: light-dark(#18162e50, #efe6d850); - width: 80%; - padding-top: 5px; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.loadout .search-section .search-bar input { - border-radius: 50px; - font-family: 'Montserrat', sans-serif; - background: light-dark(#18162e10, #f3c26710); - border: none; - outline: 2px solid transparent; - transition: all 0.3s ease; - padding: 0 20px; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.loadout .search-section .search-bar input:hover { - outline: 2px solid light-dark(#222, #f3c267); -} -.application.sheet.daggerheart.actor.dh-style.character .tab.loadout .search-section .search-bar input:placeholder { - color: light-dark(#18162e50, #efe6d850); -} -.application.sheet.daggerheart.actor.dh-style.character .tab.loadout .search-section .search-bar input::-webkit-search-cancel-button { - -webkit-appearance: none; - display: none; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.loadout .search-section .search-bar .icon { - align-content: center; - height: 32px; - position: absolute; - right: 20px; - font-size: 16px; - z-index: 1; - color: light-dark(#18162e50, #efe6d850); -} -.application.sheet.daggerheart.actor.dh-style.character .tab.loadout .search-section .btn-toggle-view { - background: light-dark(#18162e10, #18162e); - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 15px; - padding: 0; - gap: 0; - width: 62px; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.loadout .search-section .btn-toggle-view span { - margin: 1px; - width: 26px; - color: light-dark(#18162e, #f3c267); -} -.application.sheet.daggerheart.actor.dh-style.character .tab.loadout .search-section .btn-toggle-view span.list-icon i { - margin-left: 3px; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.loadout .search-section .btn-toggle-view span.grid-icon i { - margin-right: 3px; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.loadout .search-section .btn-toggle-view span.list-active { - border-radius: 32px 3px 3px 32px; - background-color: light-dark(#18162e, #f3c267); - color: light-dark(#efe6d8, #18162e); - padding: 2px; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.loadout .search-section .btn-toggle-view span.grid-active { - border-radius: 3px 32px 32px 3px; - background-color: light-dark(#18162e, #f3c267); - color: light-dark(#efe6d8, #18162e); - padding: 2px; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.loadout .items-section { - display: flex; - flex-direction: column; - gap: 10px; - height: 100%; - overflow-y: auto; - mask-image: linear-gradient(0deg, transparent 0%, black 10%, black 98%, transparent 100%); - padding: 20px 0; - height: 90%; - scrollbar-width: thin; - scrollbar-color: light-dark(#18162e, #f3c267) transparent; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.biography .items-section { - display: flex; - flex-direction: column; - gap: 10px; - overflow-y: auto; - mask-image: linear-gradient(0deg, transparent 0%, black 10%, black 98%, transparent 100%); - padding-bottom: 40px; - height: 100%; - scrollbar-width: thin; - scrollbar-color: light-dark(#18162e, #f3c267) transparent; -} -.application.sheet.daggerheart.actor.dh-style.character .tab.features .features-sections { - display: flex; - flex-direction: column; - gap: 10px; - overflow-y: auto; - mask-image: linear-gradient(0deg, transparent 0%, black 5%, black 95%, transparent 100%); - padding: 20px 0; - padding-top: 10px; - height: 95%; - scrollbar-width: thin; - scrollbar-color: light-dark(#18162e, #f3c267) transparent; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-header-sheet { - padding: 0 15px; - padding-top: 36px; - width: 100%; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-header-sheet .name-row { - display: flex; - gap: 5px; - align-items: center; - justify-content: space-between; - padding: 0; - padding-top: 5px; - padding-bottom: 8px; - flex: 1; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-header-sheet .name-row input[type='text'] { - font-size: 32px; - height: 42px; - text-align: start; - border: 1px solid transparent; - outline: 2px solid transparent; - transition: all 0.3s ease; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-header-sheet .name-row input[type='text']:hover { - outline: 2px solid light-dark(#222, #f3c267); -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-header-sheet .tags { - display: flex; - gap: 10px; - padding-bottom: 16px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-header-sheet .tags .tag { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - padding: 3px 5px; - font-size: 12px; - font: 'Montserrat', sans-serif; - background: light-dark(#22222215, #efe6d815); - border: 1px solid light-dark(#222, #efe6d8); - border-radius: 3px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-header-sheet .tags .label { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - font-size: 12px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-header-sheet .adversary-info { - display: flex; - flex-direction: column; - gap: 12px; - padding: 16px 0; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-header-sheet .adversary-info .description, -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-header-sheet .adversary-info .motives-and-tatics { - font-family: 'Montserrat', sans-serif; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-header-sheet .adversary-navigation { - display: flex; - gap: 8px; - align-items: center; -} -.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%; -} -.application.sheet.daggerheart.actor.dh-style.adversary .window-content .adversary-sidebar-sheet { - grid-row: 1 / span 2; - grid-column: 1; -} -.application.sheet.daggerheart.actor.dh-style.adversary .window-content .adversary-header-sheet { - grid-row: 1; - grid-column: 2; -} -.application.sheet.daggerheart.actor.dh-style.adversary .window-content .tab { - grid-row: 2; - grid-column: 2; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet { - width: 275px; - min-width: 275px; - border-right: 1px solid light-dark(#18162e, #f3c267); - background-image: url('../assets/parchments/dh-parchment-dark.png'); -} -.theme-light .application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet { - background: transparent; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .portrait { - position: relative; - border-bottom: 1px solid light-dark(#18162e, #f3c267); - cursor: pointer; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .portrait img { - height: 235px; - width: 275px; - object-fit: cover; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .portrait .death-roll-btn { - display: none; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .portrait.death-roll { - filter: grayscale(1); -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .portrait.death-roll .death-roll-btn { - display: flex; - position: absolute; - top: 30%; - right: 30%; - font-size: 6rem; - color: #efe6d8; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .portrait.death-roll .death-roll-btn:hover { - text-shadow: 0 0 8px #efe6d8; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .threshold-section { - position: relative; - display: flex; - gap: 10px; - background-color: light-dark(transparent, #18162e); - color: light-dark(#18162e, #f3c267); - padding: 5px 10px; - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - align-items: center; - width: fit-content; - height: 30px; - margin-top: 16px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .threshold-section h4 { - font-size: 14px; - font-weight: bold; - text-transform: uppercase; - color: light-dark(#18162e, #f3c267); -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .threshold-section h4.threshold-value { - color: light-dark(#222, #efe6d8); -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .threshold-section .threshold-legend { - position: absolute; - bottom: -21px; - color: light-dark(#f3c267, #18162e); - background-color: light-dark(#18162e, #f3c267); - padding: 3px; - justify-self: anchor-center; - border-radius: 0 0 3px 3px; - text-transform: capitalize; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .threshold-section .hope-value { - display: flex; - cursor: pointer; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section { - position: relative; - display: flex; - flex-direction: column; - top: -20px; - gap: 16px; - margin-bottom: -10px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section { - display: flex; - justify-content: space-evenly; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section .status-bar { - position: relative; - width: 100px; - height: 40px; - justify-items: center; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section .status-bar .status-label { - position: relative; - top: 40px; - height: 22px; - width: 79px; - clip-path: path('M0 0H79L74 16.5L39 22L4 16.5L0 0Z'); - background: light-dark(#18162e, #f3c267); -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section .status-bar .status-label h4 { - font-weight: bold; - text-align: center; - line-height: 18px; - color: light-dark(#efe6d8, #18162e); -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section .status-bar .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: #efe6d8; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section .status-bar .status-value input[type='number'] { - background: transparent; - font-size: 1.5rem; - width: 40px; - height: 30px; - text-align: center; - border: none; - outline: 2px solid transparent; - color: #efe6d8; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section .status-bar .status-value input[type='number'].bar-input { - padding: 0; - color: #efe6d8; - backdrop-filter: none; - background: transparent; - transition: all 0.3s ease; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section .status-bar .status-value input[type='number'].bar-input:hover, -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section .status-bar .status-value input[type='number'].bar-input:focus { - background: rgba(24, 22, 46, 0.33); - backdrop-filter: blur(9.5px); -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section .status-bar .status-value .bar-label { - width: 40px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section .status-bar .progress-bar { - position: absolute; - appearance: none; - width: 100px; - height: 40px; - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - z-index: 1; - background: #18162e; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section .status-bar .progress-bar::-webkit-progress-bar { - border: none; - background: #18162e; - border-radius: 6px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section .status-bar .progress-bar::-webkit-progress-value { - background: linear-gradient(15deg, #46140a 0%, #be0000 42%, #fcb045 100%); - border-radius: 6px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section .status-bar .progress-bar.stress-color::-webkit-progress-value { - background: linear-gradient(15deg, #823b01 0%, #fc8e45 65%, #be0000 100%); - border-radius: 6px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section .status-bar .progress-bar::-moz-progress-bar { - background: linear-gradient(15deg, #46140a 0%, #be0000 42%, #fcb045 100%); - border-radius: 6px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .resources-section .status-bar .progress-bar.stress-color::-moz-progress-bar { - background: linear-gradient(15deg, #823b01 0%, #fc8e45 65%, #be0000 100%); - border-radius: 6px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .status-section { - display: flex; - flex-wrap: wrap; - gap: 10px; - justify-content: center; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .status-section .status-number { - justify-items: center; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .status-section .status-number .status-value { - position: relative; - display: flex; - width: 50px; - height: 30px; - border: 1px solid light-dark(#18162e, #f3c267); - 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, #18162e); - z-index: 2; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .status-section .status-number .status-value.armor-slots { - width: 80px; - height: 30px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .status-section .status-number .status-label { - padding: 2px 10px; - width: 100%; - border-radius: 3px; - background: light-dark(#18162e, #f3c267); -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .info-section .status-section .status-number .status-label h4 { - font-weight: bold; - text-align: center; - line-height: 18px; - font-size: 12px; - color: light-dark(#efe6d8, #18162e); -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .items-sidebar-list { - display: flex; - flex-direction: column; - gap: 5px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .items-sidebar-list .inventory-item { - padding: 0 10px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .attack-section .title { - display: flex; - gap: 15px; - align-items: center; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .attack-section .title h3 { - font-size: 20px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .attack-section .items-list { - display: flex; - flex-direction: column; - gap: 10px; - align-items: center; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .experience-section { - margin-bottom: 20px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .experience-section .title { - display: flex; - gap: 15px; - align-items: center; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .experience-section .title h3 { - font-size: 20px; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .experience-section .experience-list { - display: flex; - flex-direction: column; - gap: 5px; - width: 100%; - margin-top: 10px; - align-items: center; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .experience-section .experience-list .experience-row { - display: flex; - gap: 5px; - width: 250px; - align-items: center; - justify-content: space-between; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .experience-section .experience-list .experience-row .experience-name { - width: 180px; - text-align: start; - font-size: 14px; - font-family: 'Montserrat', sans-serif; - color: light-dark(#222, #efe6d8); -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .experience-section .experience-list .experience-value { - height: 25px; - width: 35px; - font-size: 14px; - font-family: 'Montserrat', sans-serif; - color: light-dark(#222, #efe6d8); - align-content: center; - text-align: center; - background: url(../assets/svg/experience-shield.svg) no-repeat; -} -.theme-light .application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .experience-section .experience-list .experience-value { - background: url('../assets/svg/experience-shield-light.svg') no-repeat; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .reaction-section { - display: flex; - padding: 0 10px; - margin-top: 20px; - width: 100%; -} -.application.sheet.daggerheart.actor.dh-style.adversary .adversary-sidebar-sheet .reaction-section button { - width: 100%; -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet { - display: flex; - flex-direction: column; - justify-content: start; - text-align: center; -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .profile { - width: 100%; - height: 235px; - object-fit: cover; - mask-image: linear-gradient(0deg, transparent 0%, black 10%); - cursor: pointer; -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .item-container { - display: flex; - align-items: center; - position: relative; - top: -45px; - gap: 20px; - padding: 0 20px; - margin-bottom: -30px; -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .item-container .item-info { - display: flex; - flex-direction: column; - gap: 8px; -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .item-container .item-info .tags { - display: flex; - gap: 10px; - padding-bottom: 0; -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .item-container .item-info .tags .tag { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - padding: 3px 5px; - font-size: 12px; - font: 'Montserrat', sans-serif; - background: light-dark(#22222215, #efe6d815); - border: 1px solid light-dark(#222, #efe6d8); - border-radius: 3px; -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .item-container .item-info .tags .label { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - font-size: 12px; -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .item-container .status-number { - justify-items: center; -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .item-container .status-number .status-value { - position: relative; - display: flex; - width: 50px; - height: 30px; - border: 1px solid light-dark(#18162e, #f3c267); - 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, #18162e); - z-index: 2; -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .item-container .status-number .status-value.armor-slots { - width: 80px; - height: 30px; -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .item-container .status-number .status-label { - padding: 2px 10px; - width: 100%; - border-radius: 3px; - background: light-dark(#18162e, #f3c267); -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .item-container .status-number .status-label h4 { - font-weight: bold; - text-align: center; - line-height: 18px; - font-size: 12px; - color: light-dark(#efe6d8, #18162e); -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .item-container .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; -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .item-container .item-name input[type='text']:hover[type='text'], -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .item-container .item-name input[type='text']:focus[type='text'] { - box-shadow: none; - outline: 2px solid light-dark(#18162e, #f3c267); -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .environment-info { - display: flex; - flex-direction: column; - gap: 12px; - padding: 10px 20px; -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .environment-info .description, -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .environment-info .impulses { - text-align: start; - font-family: 'Montserrat', sans-serif; -} -.application.sheet.daggerheart.actor.dh-style.environment .environment-header-sheet .environment-navigation { - display: flex; - gap: 20px; - align-items: center; - padding: 0 20px; -} -.themed.theme-dark .application.daggerheart.sheet.dh-style.environment, -.themed.theme-dark.application.daggerheart.sheet.dh-style.environment, -body.theme-dark .application.daggerheart.environment, -body.theme-dark.application.daggerheart.environment { - background-image: url('../assets/parchments/dh-parchment-dark.png'); -} -.themed.theme-light .application.daggerheart.sheet.dh-style.environment, -.themed.theme-light.application.daggerheart.sheet.dh-style.environment, -body.theme-light .application.daggerheart.environment, -body.theme-light.application.daggerheart.environment { - background: url('../assets/parchments/dh-parchment-light.png'); -} -.application.sheet.daggerheart.actor.dh-style.environment .tab { - max-height: 300px; - overflow-y: auto; - scrollbar-width: thin; - scrollbar-color: light-dark(#18162e, #f3c267) transparent; -} -.application.daggerheart.dh-style.dialog .window-content .dialog-header { - width: 100%; - padding-bottom: 16px; -} -.application.daggerheart.dh-style.dialog .window-content .dialog-header h1 { - font-family: 'Cinzel', serif; - font-style: normal; - font-weight: 700; - font-size: 24px; - margin: 0; - text-align: center; - color: light-dark(#18162e, #f3c267); -} -.application.daggerheart.dh-style.dialog .tab.details.active, -.application.daggerheart.dh-style.dialog .tab.attack.active { - display: flex; - flex-direction: column; - gap: 16px; -} -.application.daggerheart.dh-style.dialog .tab .fieldsets-section { - display: flex; - gap: 16px; -} -.application.daggerheart.dh-style.dialog .tab.experiences .add-experience-btn { - width: 100%; - margin-bottom: 12px; -} -.application.daggerheart.dh-style.dialog .tab.experiences .experience-list { - display: flex; - flex-direction: column; - gap: 10px; -} -.application.daggerheart.dh-style.dialog .tab.experiences .experience-list .experience-item { - display: grid; - grid-template-columns: 3fr 1fr 30px; - align-items: center; - gap: 5px; -} -.application.daggerheart.dh-style.dialog .tab.experiences .experience-list .experience-item a { - text-align: center; -} -.application.daggerheart.dh-style.dialog .tab.features { - max-height: 450px; - overflow-y: auto; - scrollbar-width: thin; - scrollbar-color: light-dark(#18162e, #f3c267) transparent; -} -.application.daggerheart.dh-style.dialog .tab.features .add-feature-btn { - width: 100%; - margin-bottom: 12px; -} -.application.daggerheart.dh-style.dialog .tab.features .feature-list { - display: flex; - flex-direction: column; - gap: 10px; -} -.application.daggerheart.dh-style.dialog .tab.features .feature-list .feature-item { - display: grid; - grid-template-columns: 40px 1fr auto; - align-items: center; - gap: 5px; - border-radius: 3px; -} -.application.daggerheart.dh-style.dialog .tab.features .feature-list .feature-item img { - height: 40px; - width: 40px; - object-fit: cover; -} -.application.daggerheart.dh-style.dialog .tab.features .feature-list .feature-item .label { - font-family: 'Montserrat', sans-serif; -} -.application.daggerheart.dh-style.dialog .tab.features .feature-list .feature-item .controls { - display: flex; - gap: 5px; -} -.application.daggerheart.dh-style.dialog .tab.features .feature-list .feature-item .controls a { - text-align: center; -} -.application.daggerheart.dh-style.dialog.environment-settings .tab.features { - max-height: 450px; - overflow-y: auto; - scrollbar-width: thin; - scrollbar-color: light-dark(#18162e, #f3c267) transparent; -} -.application.daggerheart.dh-style.dialog.environment-settings .tab.features .add-feature-btn { - width: 100%; - margin-bottom: 12px; -} -.application.daggerheart.dh-style.dialog.environment-settings .tab.features .feature-list { - display: flex; - flex-direction: column; - gap: 10px; -} -.application.daggerheart.dh-style.dialog.environment-settings .tab.features .feature-list .feature-item { - display: grid; - grid-template-columns: 40px 1fr auto; - align-items: center; - gap: 5px; -} -.application.daggerheart.dh-style.dialog.environment-settings .tab.features .feature-list .feature-item img { - height: 40px; - width: 40px; - object-fit: cover; - border-radius: 3px; -} -.application.daggerheart.dh-style.dialog.environment-settings .tab.features .feature-list .feature-item .label { - font-family: 'Montserrat', sans-serif; -} -.application.daggerheart.dh-style.dialog.environment-settings .tab.features .feature-list .feature-item .controls { - display: flex; - gap: 5px; -} -.application.daggerheart.dh-style.dialog.environment-settings .tab.features .feature-list .feature-item .controls a { - text-align: center; -} -.application.daggerheart.dh-style.dialog .tab.adversaries { - max-height: 450px; - overflow-y: auto; - scrollbar-width: thin; - scrollbar-color: light-dark(#18162e, #f3c267) transparent; -} -.application.daggerheart.dh-style.dialog .tab.adversaries .add-action-btn { - width: 100%; - margin-bottom: 12px; -} -.application.daggerheart.dh-style.dialog .tab.adversaries .category-container { - display: flex; - flex-direction: column; - align-items: start; - gap: 8px; -} -.application.daggerheart.dh-style.dialog .tab.adversaries .category-container .category-name { - display: flex; - align-items: center; - gap: 10px; - width: 100%; -} -.application.daggerheart.dh-style.dialog .tab.adversaries .category-container .adversaries-container { - display: flex; - flex-direction: column; - gap: 6px; - width: 100%; -} -.application.daggerheart.dh-style.dialog .tab.adversaries .adversaries-dragger { - display: flex; - align-items: center; - justify-content: center; - box-sizing: border-box; - width: 100%; - height: 40px; - border: 1px dashed light-dark(#18162e50, #efe6d850); - border-radius: 3px; - color: light-dark(#18162e50, #efe6d850); - font-family: 'Montserrat', sans-serif; -} -.theme-light .application.daggerheart.dh-style.views.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 .beastforms-container { - display: flex; - flex-direction: column; - gap: 4px; -} -.application.daggerheart.dh-style.views.beastform-selection .beastforms-container .beastforms-tier { - display: grid; - grid-template-columns: 1fr 1fr 1fr 1fr; - gap: 4px; -} -.application.daggerheart.dh-style.views.beastform-selection .beastforms-container .beastforms-tier .beastform-container { - position: relative; - display: flex; - justify-content: center; - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - cursor: pointer; -} -.application.daggerheart.dh-style.views.beastform-selection .beastforms-container .beastforms-tier .beastform-container.inactive { - opacity: 0.4; -} -.application.daggerheart.dh-style.views.beastform-selection .beastforms-container .beastforms-tier .beastform-container img { - width: 100%; - border-radius: 6px; -} -.application.daggerheart.dh-style.views.beastform-selection .beastforms-container .beastforms-tier .beastform-container .beastform-title { - position: absolute; - top: 4px; - display: flex; - flex-wrap: wrap; - font-size: 16px; - margin: 0 4px; - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - color: light-dark(#efe6d8, #222); - background-image: url('../assets/parchments/dh-parchment-light.png'); -} -.application.daggerheart.dh-style.views.beastform-selection footer { - margin-top: 8px; - display: flex; -} -.application.daggerheart.dh-style.views.beastform-selection footer button { - flex: 1; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet { - display: flex; - flex-direction: column; - align-items: center; - gap: 8px; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .profile { - height: 235px; - width: 100%; - object-fit: cover; - cursor: pointer; - mask-image: linear-gradient(0deg, transparent 0%, black 10%); -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .actor-name { - display: flex; - align-items: center; - position: relative; - top: -30px; - gap: 20px; - padding: 0 20px; - margin-bottom: -30px; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .actor-name input[type='text'] { - font-size: 24px; - height: 32px; - text-align: center; - border: 1px solid transparent; - outline: 2px solid transparent; - transition: all 0.3s ease; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .actor-name input[type='text']:hover { - outline: 2px solid light-dark(#222, #f3c267); -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section { - display: flex; - gap: 5px; - justify-content: center; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-number { - justify-items: center; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-number .status-value { - position: relative; - display: flex; - width: 50px; - height: 40px; - border: 1px solid light-dark(#18162e, #f3c267); - border-bottom: none; - border-radius: 6px 6px 0 0; - padding: 0 6px; - font-size: 1.5rem; - align-items: center; - justify-content: center; - background: light-dark(transparent, #18162e); - z-index: 2; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-number .status-value.armor-slots { - width: 80px; - height: 30px; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-number .status-label { - padding: 2px 10px; - width: 100%; - border-radius: 3px; - background: light-dark(#18162e, #f3c267); -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-number .status-label h4 { - font-weight: bold; - text-align: center; - line-height: 18px; - font-size: 12px; - color: light-dark(#efe6d8, #18162e); -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-bar { - position: relative; - width: 100px; - height: 40px; - justify-items: center; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-bar .status-label { - position: relative; - top: 40px; - height: 22px; - width: 79px; - clip-path: path('M0 0H79L74 16.5L39 22L4 16.5L0 0Z'); - background: light-dark(#18162e, #f3c267); -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-bar .status-label h4 { - font-weight: bold; - text-align: center; - line-height: 18px; - color: light-dark(#efe6d8, #18162e); -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-bar .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: #efe6d8; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-bar .status-value input[type='number'] { - background: transparent; - font-size: 1.5rem; - width: 40px; - height: 30px; - text-align: center; - border: none; - outline: 2px solid transparent; - color: #efe6d8; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-bar .status-value input[type='number'].bar-input { - padding: 0; - color: #efe6d8; - backdrop-filter: none; - background: transparent; - transition: all 0.3s ease; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-bar .status-value input[type='number'].bar-input:hover, -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-bar .status-value input[type='number'].bar-input:focus { - background: rgba(24, 22, 46, 0.33); - backdrop-filter: blur(9.5px); -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-bar .status-value .bar-label { - width: 40px; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-bar .progress-bar { - position: absolute; - appearance: none; - width: 100px; - height: 40px; - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - z-index: 1; - background: #18162e; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-bar .progress-bar::-webkit-progress-bar { - border: none; - background: #18162e; - border-radius: 6px; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-bar .progress-bar::-webkit-progress-value { - background: linear-gradient(15deg, #46140a 0%, #be0000 42%, #fcb045 100%); - border-radius: 6px; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-bar .progress-bar.stress-color::-webkit-progress-value { - background: linear-gradient(15deg, #823b01 0%, #fc8e45 65%, #be0000 100%); - border-radius: 6px; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-bar .progress-bar::-moz-progress-bar { - background: linear-gradient(15deg, #46140a 0%, #be0000 42%, #fcb045 100%); - border-radius: 6px; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .status-bar .progress-bar.stress-color::-moz-progress-bar { - background: linear-gradient(15deg, #823b01 0%, #fc8e45 65%, #be0000 100%); - border-radius: 6px; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .status-section .level-up-label { - font-size: 24px; - padding-top: 8px; -} -.application.sheet.daggerheart.actor.dh-style.companion .companion-header-sheet .companion-navigation { - display: flex; - gap: 8px; - align-items: center; - width: 100%; -} -.application.sheet.daggerheart.actor.dh-style.companion .partner-section, -.application.sheet.daggerheart.actor.dh-style.companion .attack-section { - display: flex; - flex-direction: column; - align-items: center; -} -.application.sheet.daggerheart.actor.dh-style.companion .partner-section .title, -.application.sheet.daggerheart.actor.dh-style.companion .attack-section .title { - display: flex; - gap: 15px; - align-items: center; -} -.application.sheet.daggerheart.actor.dh-style.companion .partner-section .title h3, -.application.sheet.daggerheart.actor.dh-style.companion .attack-section .title h3 { - font-size: 20px; -} -.application.sheet.daggerheart.actor.dh-style.companion .partner-section .items-list, -.application.sheet.daggerheart.actor.dh-style.companion .attack-section .items-list { - display: flex; - flex-direction: column; - gap: 10px; - align-items: center; -} -.application.sheet.daggerheart.actor.dh-style.companion .partner-placeholder { - display: flex; - opacity: 0.6; - text-align: center; - font-style: italic; - justify-content: center; -} -.application.sheet.daggerheart.actor.dh-style.companion .experience-list { - display: flex; - flex-direction: column; - gap: 5px; - width: 100%; - margin-top: 10px; - align-items: center; -} -.application.sheet.daggerheart.actor.dh-style.companion .experience-list .experience-row { - display: flex; - gap: 5px; - width: 250px; - align-items: center; - justify-content: space-between; -} -.application.sheet.daggerheart.actor.dh-style.companion .experience-list .experience-row .experience-name { - width: 180px; - text-align: start; - font-size: 14px; - font-family: 'Montserrat', sans-serif; - color: light-dark(#222, #efe6d8); -} -.application.sheet.daggerheart.actor.dh-style.companion .experience-list .experience-value { - height: 25px; - width: 35px; - font-size: 14px; - font-family: 'Montserrat', sans-serif; - color: light-dark(#222, #efe6d8); - align-content: center; - text-align: center; - background: url(../assets/svg/experience-shield.svg) no-repeat; -} -.theme-light .application.sheet.daggerheart.actor.dh-style.companion .experience-list .experience-value { - background: url('../assets/svg/experience-shield-light.svg') no-repeat; -} -.themed.theme-dark .application.daggerheart.sheet.dh-style.companion, -.themed.theme-dark.application.daggerheart.sheet.dh-style.companion, -body.theme-dark .application.daggerheart.companion, -body.theme-dark.application.daggerheart.companion { - background-image: url('../assets/parchments/dh-parchment-dark.png'); -} -.themed.theme-light .application.daggerheart.sheet.dh-style.companion, -.themed.theme-light.application.daggerheart.sheet.dh-style.companion, -body.theme-light .application.daggerheart.companion, -body.theme-light.application.daggerheart.companion { - background: url('../assets/parchments/dh-parchment-light.png'); -} -.application.sheet.daggerheart.actor.dh-style.adversary .window-content { - overflow: auto; -} -.daggerheart.sheet.actor.environment .potential-adversary-container { - width: 100%; - height: 50px; -} -.daggerheart.sheet.actor.environment .potential-adversary-container .adversary-placeholder { - font-style: italic; - text-align: center; - opacity: 0.6; -} -.daggerheart.sheet.actor.environment .potential-adversary-container .adversaries-container { - display: flex; - gap: 8px; -} -.daggerheart.sheet.actor.environment .potential-adversary-container .adversaries-container .adversary-container { - border: 1px solid var(--color-dark-5); - border-radius: 6px; - padding: 0 2px; - font-weight: bold; - cursor: pointer; - background-image: url(../assets/parchments/dh-parchment-dark.png); - color: var(--color-light-3); -} -.application.sheet.daggerheart.dh-style.feature .item-sheet-header { - display: flex; -} -.application.sheet.daggerheart.dh-style.feature .item-sheet-header .profile { - height: 130px; - width: 130px; -} -.application.sheet.daggerheart.dh-style.feature section.tab { - height: 400px; - overflow-y: auto; - scrollbar-width: thin; - scrollbar-color: light-dark(#18162e, #f3c267) transparent; -} -.application.sheet.daggerheart.dh-style.domain-card section.tab { - height: 400px; - overflow-y: auto; - scrollbar-width: thin; - scrollbar-color: light-dark(#18162e, #f3c267) transparent; -} -.application.sheet.daggerheart.dh-style.class .tab.settings .fieldsets-section { - display: grid; - gap: 10px; - grid-template-columns: 1fr 1.5fr 1.5fr; -} -.application.sheet.daggerheart.dh-style.class .tab.settings .fieldsets-section .drop-section { - width: 100%; -} -.application.sheet.daggerheart.dh-style.class .tab.settings .list-items { - margin-bottom: 10px; - width: 100%; -} -.application.sheet.daggerheart.dh-style.class .tab.settings .list-items:last-child { - margin-bottom: 0px; -} -.application.sheet.daggerheart.dh-style.class .tab.settings .list-items .item-line { - display: grid; - align-items: center; - gap: 10px; - grid-template-columns: 1fr 3fr 1fr; -} -.application.sheet.daggerheart.dh-style.class .tab.settings .list-items .item-line h4 { - font-family: 'Montserrat', sans-serif; - font-weight: lighter; - color: light-dark(#222, #efe6d8); -} -.application.sheet.daggerheart.dh-style.class .tab.settings .list-items .item-line .image { - height: 40px; - width: 40px; - object-fit: cover; - border-radius: 6px; - border: none; -} -.application.sheet.daggerheart.dh-style.class .tab.settings .list-items .item-line .controls { - display: flex; - justify-content: center; - gap: 10px; -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container { - display: flex; - flex-direction: column; - gap: 12px; -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .dices-section { - display: flex; - gap: 60px; - justify-content: center; -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .dices-section .dice-option { - display: flex; - flex-direction: column; - align-items: center; - gap: 10px; - width: 120px; -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .dices-section .dice-option .dice-icon { - width: 70px; - height: 70px; - object-fit: contain; -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .dices-section .dice-option .dice-select { - display: flex; - align-items: center; - gap: 10px; - height: 32px; -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .dices-section .dice-option .dice-select .label { - font-family: 'Cinzel', serif; - font-style: normal; - font-weight: 700; - font-size: 16px; - line-height: 19px; - color: light-dark(#222, #efe6d8); -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .experience-container { - display: flex; - gap: 10px; - flex-wrap: wrap; -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .experience-container .experience-chip { - display: flex; - align-items: center; - border-radius: 5px; - width: fit-content; - gap: 5px; - cursor: pointer; - padding: 5px; - background: light-dark(#18162e10, #f3c26710); - color: light-dark(#18162e, #f3c267); -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .experience-container .experience-chip .label { - font-family: 'Montserrat', sans-serif; - font-style: normal; - font-weight: 400; - font-size: 14px; - line-height: 17px; -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .experience-container .experience-chip.selected { - background: light-dark(#18162e40, #f3c26740); -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .modifier-container .advantage-chip, -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .modifier-container .disadvantage-chip { - display: flex; - align-items: center; - border-radius: 5px; - width: fit-content; - gap: 5px; - cursor: pointer; - padding: 5px; - transition: all 0.3s ease; -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .modifier-container .advantage-chip .label, -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .modifier-container .disadvantage-chip .label { - font-family: 'Montserrat', sans-serif; - font-style: normal; - font-weight: 400; - font-size: 14px; - line-height: 17px; -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .modifier-container .advantage-chip { - background: #40a64010; - color: #40a640; -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .modifier-container .advantage-chip.selected { - color: #efe6d8; - background: linear-gradient(151.21deg, #40a640 7.21%, #011b01 92.79%); -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .modifier-container .disadvantage-chip { - background: #e54e4e10; - color: #e54e4e; -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .modifier-container .disadvantage-chip.selected { - color: #efe6d8; - background: linear-gradient(151.21deg, #e54e4e 7.21%, #3c0000 92.79%); -} -.application.daggerheart.dialog.dh-style.views.roll-selection .roll-dialog-container .formula-label { - font-family: 'Montserrat', sans-serif; - font-style: normal; - font-weight: 500; - font-size: 14px; - line-height: 17px; - color: light-dark(#222, #efe6d8); -} -@keyframes glow { - 0% { - box-shadow: 0 0 1px 1px #f3c267; - } - 100% { - box-shadow: 0 0 2px 2px #f3c267; - } -} -@keyframes glow-dark { - 0% { - box-shadow: 0 0 1px 1px #18162e; - } - 100% { - box-shadow: 0 0 2px 2px #18162e; - } -} -@font-face { - font-family: 'Cinzel'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/cinzel/v25/8vIU7ww63mVu7gtR-kwKxNvkNOjw-tbnTYo.ttf) format('truetype'); -} -@font-face { - font-family: 'Cinzel'; - font-style: normal; - font-weight: 700; - font-display: swap; - src: url(https://fonts.gstatic.com/s/cinzel/v25/8vIU7ww63mVu7gtR-kwKxNvkNOjw-jHgTYo.ttf) format('truetype'); -} -@font-face { - font-family: 'Cinzel Decorative'; - font-style: normal; - font-weight: 700; - font-display: swap; - src: url(https://fonts.gstatic.com/s/cinzeldecorative/v18/daaHSScvJGqLYhG8nNt8KPPswUAPniZoaelD.ttf) format('truetype'); -} -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/montserrat/v30/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Ew-.ttf) format('truetype'); -} -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: 600; - font-display: swap; - src: url(https://fonts.gstatic.com/s/montserrat/v30/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCu170w-.ttf) format('truetype'); -} -.application.sheet.daggerheart.dh-style h1 { - font-family: 'Cinzel Decorative', serif; - margin: 0; - border: none; - font-weight: normal; -} -.application.sheet.daggerheart.dh-style h2, -.application.sheet.daggerheart.dh-style h3 { - font-family: 'Cinzel', serif; - margin: 0; - border: none; - font-weight: normal; -} -.application.sheet.daggerheart.dh-style h4 { - font-family: 'Montserrat', sans-serif; - font-size: 14px; - border: none; - font-weight: 700; - margin: 0; - text-shadow: none; - color: #f3c267; - font-weight: normal; -} -.application.sheet.daggerheart.dh-style h5 { - font-size: 14px; - color: #f3c267; - margin: 0; - font-weight: normal; -} -.application.sheet.daggerheart.dh-style p, -.application.sheet.daggerheart.dh-style span { - font-family: 'Montserrat', sans-serif; -} -.application.sheet.daggerheart.dh-style small { - font-family: 'Montserrat', sans-serif; - opacity: 0.8; -} -/** - * Applies theme-specific styles. - * @param {Rules} @darkRules - Styles to apply when `.theme-dark` is present - * @param {Rules} @lightRules - Styles to apply when `.theme-light` is present - */ -.themed.theme-dark .application.daggerheart.sheet.dh-style, -.themed.theme-dark.application.daggerheart.sheet.dh-style, -body.theme-dark .application.daggerheart, -body.theme-dark.application.daggerheart { - background: rgba(24, 22, 46, 0.33); - backdrop-filter: blur(9px); -} -.themed.theme-light .application.daggerheart.sheet.dh-style, -.themed.theme-light.application.daggerheart.sheet.dh-style, -body.theme-light .application.daggerheart, -body.theme-light.application.daggerheart { - background: url('../assets/parchments/dh-parchment-light.png') no-repeat center; -} -.application.sheet.dh-style { - border-radius: 10px; -} -.application.sheet.dh-style .window-header { - background: transparent; - border-bottom: none; - justify-content: end; -} -.application.sheet.dh-style .window-header h1 { - color: light-dark(#18162e, #efe6d8); - font-family: 'Montserrat', sans-serif; -} -.application.sheet.dh-style .window-header button { - background: light-dark(transparent, #0e0d15); - color: light-dark(#18162e, #efe6d8); - border: 1px solid light-dark(#18162e, transparent); - padding: 0; -} -.application.sheet.dh-style .window-header button:hover { - border-color: light-dark(#18162e, #f3c267); - color: light-dark(#18162e, #f3c267); -} -.application.sheet.dh-style .window-content { - padding: 0; - position: relative; - top: -36px; - min-height: -webkit-fill-available; - transition: opacity 0.3s ease; -} -.application.sheet.dh-style .window-content .tab { - padding: 0 10px; -} -.application.sheet.dh-style.minimized .window-content { - opacity: 0; - transition-duration: 0.1s; -} -.application.sheet.dh-style:not(.minimized) .window-title, -.application.sheet.dh-style:not(.minimized) .window-icon { - display: none; - opacity: 0; - transition: opacity 0.3s ease; -} -.application.sheet.dh-style:not(.minimized) .window-content { - opacity: 1; -} -.themed.theme-dark .application.daggerheart.sheet.dh-style.dialog, -.themed.theme-dark.application.daggerheart.sheet.dh-style.dialog, -body.theme-dark .application.daggerheart.dialog, -body.theme-dark.application.daggerheart.dialog { - background-image: url('../assets/parchments/dh-parchment-dark.png'); - background-repeat: no-repeat; - background-position: center; -} -.themed.theme-light .application.daggerheart.sheet.dh-style.dialog, -.themed.theme-light.application.daggerheart.sheet.dh-style.dialog, -body.theme-light .application.daggerheart.dialog, -body.theme-light.application.daggerheart.dialog { - background-image: url('../assets/parchments/dh-parchment-light.png'); - background-repeat: no-repeat; - background-position: center; -} -.application.dialog.dh-style { - border: none; -} -.application.dialog.dh-style .window-header { - background: transparent; - border-bottom: none; - color: light-dark(#18162e, #efe6d8); -} -.application.dialog.dh-style .window-header h1 { - color: light-dark(#18162e, #efe6d8); - font-family: 'Montserrat', sans-serif; -} -.application.dialog.dh-style .window-header button { - color: light-dark(#18162e, #efe6d8); - background: light-dark(transparent, #0e0d15); - border: 1px solid light-dark(#18162e, transparent); - padding: 0; -} -.application.dialog.dh-style .window-header button:hover { - border: 1px solid light-dark(#18162e, #f3c267); - color: light-dark(#18162e, #f3c267); -} -.application.dh-style { - border: 1px solid light-dark(#18162e, #f3c267); -} -.application.dh-style input[type='text'], -.application.dh-style input[type='number'] { - background: light-dark(transparent, transparent); - border-radius: 6px; - box-shadow: 0 4px 30px rgba(0, 0, 0, 0.05); - backdrop-filter: blur(9.5px); - -webkit-backdrop-filter: blur(9.5px); - outline: none; - color: light-dark(#18162e, #f3c267); - border: 1px solid light-dark(#222, #efe6d8); -} -.application.dh-style input[type='text']:hover[type='text'], -.application.dh-style input[type='number']:hover[type='text'], -.application.dh-style input[type='text']:hover[type='number'], -.application.dh-style input[type='number']:hover[type='number'], -.application.dh-style input[type='text']:focus[type='text'], -.application.dh-style input[type='number']:focus[type='text'], -.application.dh-style input[type='text']:focus[type='number'], -.application.dh-style input[type='number']:focus[type='number'] { - background: light-dark(rgba(0, 0, 0, 0.05), rgba(24, 22, 46, 0.33)); - box-shadow: none; - outline: 2px solid light-dark(#222, #efe6d8); -} -.application.dh-style input[type='text']:disabled[type='text'], -.application.dh-style input[type='number']:disabled[type='text'], -.application.dh-style input[type='text']:disabled[type='number'], -.application.dh-style input[type='number']:disabled[type='number'] { - outline: 2px solid transparent; - cursor: not-allowed; -} -.application.dh-style input[type='text']:disabled[type='text']:hover, -.application.dh-style input[type='number']:disabled[type='text']:hover, -.application.dh-style input[type='text']:disabled[type='number']:hover, -.application.dh-style input[type='number']:disabled[type='number']:hover { - background: transparent; -} -.application.dh-style input[type='checkbox']:checked::after { - color: light-dark(#222, #f3c267); -} -.application.dh-style input[type='checkbox']:checked::before { - color: light-dark(transparent, #18162e); -} -.application.dh-style input[type='checkbox']::before { - color: light-dark(#222, #efe6d8); -} -.application.dh-style button { - background: light-dark(transparent, #f3c267); - border: 1px solid light-dark(#18162e, #18162e); - color: light-dark(#18162e, #18162e); - outline: none; - box-shadow: none; -} -.application.dh-style button:hover { - background: light-dark(rgba(0, 0, 0, 0.3), #18162e); - color: light-dark(#18162e, #f3c267); -} -.application.dh-style button.glow { - animation: glow 0.75s infinite alternate; -} -.application.dh-style button:disabled { - background: light-dark(transparent, #f3c267); - color: light-dark(#18162e, #18162e); - opacity: 0.6; - cursor: not-allowed; -} -.application.dh-style button:disabled:hover { - background: light-dark(transparent, #f3c267); - color: light-dark(#18162e, #18162e); -} -.application.dh-style select { - background: light-dark(transparent, transparent); - color: light-dark(#222, #efe6d8); - font-family: 'Montserrat', sans-serif; - outline: 2px solid transparent; - border: 1px solid light-dark(#222, #efe6d8); -} -.application.dh-style select:focus, -.application.dh-style select:hover { - outline: 2px solid light-dark(#222, #efe6d8); - box-shadow: none; -} -.application.dh-style select option, -.application.dh-style select optgroup { - color: #efe6d8; - background-color: #18162e; - border-radius: 6px; -} -.application.dh-style select:disabled { - opacity: 0.6; - outline: 2px solid transparent; - cursor: not-allowed; -} -.application.dh-style p { - margin: 0; -} -.application.dh-style ul { - margin: 0; - padding: 0; - list-style: none; -} -.application.dh-style li { - margin: 0; -} -.application.dh-style a:hover, -.application.dh-style a.active { - font-weight: bold; - text-shadow: 0 0 8px light-dark(#18162e, #f3c267); -} -.application.dh-style fieldset { - align-items: center; - margin-top: 5px; - border-radius: 6px; - border-color: light-dark(#18162e, #f3c267); -} -.application.dh-style fieldset.glassy { - background-color: light-dark(#18162e10, #f3c26710); - border-color: transparent; -} -.application.dh-style fieldset.glassy legend { - padding: 2px 12px; - border-radius: 3px; - background-color: light-dark(#18162e, #f3c267); - color: light-dark(#efe6d8, #18162e); -} -.application.dh-style fieldset.fit-height { - height: 95%; -} -.application.dh-style fieldset.flex { - display: flex; - gap: 20px; -} -.application.dh-style fieldset.flex.wrap { - flex-wrap: wrap; - gap: 10px 20px; -} -.application.dh-style fieldset.flex .inline-child { - flex: 1; -} -.application.dh-style fieldset .list-w-img { - padding: 5px; -} -.application.dh-style fieldset .list-w-img label { - flex: 1; -} -.application.dh-style fieldset .list-w-img img { - width: 2rem; - height: 2rem; -} -.application.dh-style fieldset.one-column { - display: flex; - flex-direction: column; - align-items: start; - gap: 10px; - min-height: 64px; - flex: 1; -} -.application.dh-style fieldset.one-column > .one-column { - width: 100%; -} -.application.dh-style fieldset.two-columns { - display: grid; - grid-template-columns: 1fr 2fr; - gap: 10px; -} -.application.dh-style fieldset.two-columns.even { - grid-template-columns: 1fr 1fr; -} -.application.dh-style fieldset.two-columns .full-width { - grid-column: span 2; -} -.application.dh-style fieldset legend { - font-family: 'Montserrat', sans-serif; - font-weight: bold; - color: light-dark(#18162e, #f3c267); -} -.application.dh-style fieldset input[type='text'], -.application.dh-style fieldset input[type='number'] { - color: light-dark(#222, #efe6d8); - font-family: 'Montserrat', sans-serif; - transition: all 0.3s ease; - outline: 2px solid transparent; -} -.application.dh-style fieldset input[type='text']:focus, -.application.dh-style fieldset input[type='number']:focus, -.application.dh-style fieldset input[type='text']:hover, -.application.dh-style fieldset input[type='number']:hover { - outline: 2px solid light-dark(#222, #efe6d8); -} -.application.dh-style fieldset[disabled], -.application.dh-style fieldset.child-disabled .form-group, -.application.dh-style fieldset select[disabled], -.application.dh-style fieldset input[disabled] { - opacity: 0.5; -} -.application.dh-style fieldset.child-disabled .form-group { - pointer-events: none; -} -.application.dh-style fieldset .nest-inputs { - display: flex; - align-items: center; - width: 100%; - gap: 5px; -} -.application.dh-style fieldset .nest-inputs .btn { - padding-top: 15px; -} -.application.dh-style fieldset .nest-inputs .image { - height: 40px; - width: 40px; - object-fit: cover; - border-radius: 6px; - border: none; -} -.application.dh-style fieldset .nest-inputs > .checkbox { - align-self: end; -} -.application.dh-style fieldset .form-group { - width: 100%; -} -.application.dh-style fieldset .form-group label { - font-family: 'Montserrat', sans-serif; - font-weight: bold; - font-size: smaller; -} -.application.dh-style fieldset .form-group.checkbox { - width: fit-content; - display: flex; - align-items: center; -} -.application.dh-style fieldset .form-group.checkbox .form-fields { - height: 32px; - align-content: center; -} -.application.dh-style fieldset:has(.list-w-img) { - gap: 0; -} -.application.dh-style .two-columns { - display: grid; - grid-template-columns: 1fr 2fr; - gap: 10px; -} -.application.dh-style .two-columns.even { - grid-template-columns: 1fr 1fr; -} -.application.dh-style line-div { - display: block; - height: 1px; - width: 100%; - border-bottom: 1px solid light-dark(#18162e, #f3c267); - mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); -} -.application.dh-style side-line-div { - display: block; - height: 1px; - width: 100%; - border-bottom: 1px solid light-dark(#18162e, #f3c267); - mask-image: linear-gradient(270deg, transparent 0%, black 100%); -} -.application.dh-style side-line-div.invert { - mask-image: linear-gradient(270deg, black 0%, transparent 100%); -} -.application.dh-style .item-description { - opacity: 1; - transform: translateY(0); - grid-column: 1/-1; - transition: opacity 0.3s ease-out, transform 0.3s ease-out; -} -.application.dh-style .item-description.invisible { - height: 0; - opacity: 0; - overflow: hidden; - transform: translateY(-20px); - transform-origin: top; -} -.application.setting.dh-style fieldset h2, -.application.setting.dh-style fieldset h3, -.application.setting.dh-style fieldset h4 { - margin: 8px 0 4px; - text-align: center; -} -.application.setting.dh-style fieldset .title-hint { - font-size: 12px; - font-variant: small-caps; - text-align: center; -} -.application.setting.dh-style fieldset .field-section .split-section { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 10px; -} -.application.setting.dh-style fieldset .label-container { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 10px; -} -.application.setting.dh-style fieldset .label-container label { - align-self: center; - text-align: center; -} -.application.setting.dh-style footer { - margin-top: 8px; - display: flex; - gap: 8px; -} -.application.setting.dh-style footer button { - flex: 1; -} -.application.setting.dh-style .form-group { - display: flex; - justify-content: space-between; - align-items: center; -} -.application.setting.dh-style .form-group label { - font-size: 16px; -} -.application.setting.dh-style .form-group .form-fields { - display: flex; - gap: 4px; - align-items: center; -} -.system-daggerheart .tagify { - background: light-dark(transparent, transparent); - border: 1px solid light-dark(#222, #efe6d8); - height: 34px; - border-radius: 3px; - margin-right: 1px; -} -.system-daggerheart .tagify tag div { - display: flex; - justify-content: space-between; - align-items: center; - height: 22px; -} -.system-daggerheart .tagify tag div span { - font-weight: 400; -} -.system-daggerheart .tagify tag div img { - margin-left: 8px; - height: 20px; - width: 20px; -} -.system-daggerheart .tagify__dropdown { - border: 1px solid light-dark(#222, #efe6d8) !important; -} -.system-daggerheart .tagify__dropdown .tagify__dropdown__wrapper { - background-image: url(../assets/parchments/dh-parchment-dark.png); - background-color: transparent; - border: 0; -} -.system-daggerheart .tagify__dropdown .tagify__dropdown__wrapper .tagify__dropdown__item--active { - background-color: light-dark(#222, #efe6d8); - color: var(--color-dark-3); -} -.system-daggerheart.theme-light .tagify__dropdown { - color: black; -} -.system-daggerheart.theme-light .tagify__dropdown .tagify__dropdown__wrapper { - background-image: url(../assets/parchments/dh-parchment-light.png); -} -.system-daggerheart.theme-light .tagify__dropdown .tagify__dropdown__item--active { - color: #efe6d8; -} -.theme-light .application.sheet.dh-style button.glow { - animation: glow-dark 0.75s infinite alternate; -} -.theme-light .application .component.dh-style.card-preview-container { - background-image: url('../assets/parchments/dh-parchment-light.png'); -} -.theme-light .application .component.dh-style.card-preview-container .preview-text-container { - background-image: url(../assets/parchments/dh-parchment-dark.png); -} -.theme-light .application .component.dh-style.card-preview-container .preview-selected-icon-container { - background-image: url(../assets/parchments/dh-parchment-dark.png); - color: var(--color-light-5); -} -.application .component.dh-style.card-preview-container { - position: relative; - border-radius: 6px; - border: 2px solid var(--color-tabs-border); - display: flex; - flex-direction: column; - aspect-ratio: 0.75; - background-image: url('../assets/parchments/dh-parchment-dark.png'); -} -.application .component.dh-style.card-preview-container.selectable { - cursor: pointer; -} -.application .component.dh-style.card-preview-container.disabled { - pointer-events: none; - opacity: 0.4; -} -.application .component.dh-style.card-preview-container .preview-image-outer-container { - position: relative; - display: flex; - align-items: center; - justify-content: center; -} -.application .component.dh-style.card-preview-container .preview-image-container { - flex: 1; - border-radius: 4px 4px 0 0; -} -.application .component.dh-style.card-preview-container .preview-text-container { - flex: 1; - border-radius: 0 0 4px 4px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: 18px; - text-align: center; - color: var(--color-text-selection-bg); - background-image: url(../assets/parchments/dh-parchment-light.png); -} -.application .component.dh-style.card-preview-container .preview-empty-container { - pointer-events: none; - position: relative; - display: flex; - align-items: center; - justify-content: center; - flex: 1; -} -.application .component.dh-style.card-preview-container .preview-empty-container .preview-empty-inner-container { - width: 100%; - display: flex; - justify-content: center; -} -.application .component.dh-style.card-preview-container .preview-empty-container .preview-empty-inner-container .preview-add-icon { - font-size: 48px; -} -.application .component.dh-style.card-preview-container .preview-empty-container .preview-empty-inner-container .preview-empty-subtext { - position: absolute; - top: 10%; - font-size: 18px; - font-variant: small-caps; - text-align: center; -} -.application .component.dh-style.card-preview-container .preview-selected-icon-container { - 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); -} -.application .component.dh-style.card-preview-container .preview-selected-icon-container i { - position: relative; - right: 2px; -} -.daggerheart.dh-style .tab-navigation { - margin: 5px 0; - height: 40px; - width: 100%; -} -.daggerheart.dh-style .tab-navigation .feature-tab { - border: none; -} -.daggerheart.dh-style .tab-navigation .feature-tab a { - color: light-dark(#18162e, #f3c267); - font-family: 'Montserrat', sans-serif; -} -.sheet.daggerheart.dh-style .tab-form-footer { - display: flex; - padding: 0 10px; -} -.sheet.daggerheart.dh-style .tab-form-footer button { - flex: 1; - border-width: 2px; -} -.sheet.daggerheart.dh-style .tab.actions .actions-list { - display: flex; - flex-direction: column; - list-style: none; - padding: 0; - margin: 0; - width: 100%; - gap: 5px; -} -.sheet.daggerheart.dh-style .tab.actions .actions-list .action-item { - display: grid; - align-items: center; - grid-template-columns: 1fr 4fr 1fr; - cursor: pointer; -} -.sheet.daggerheart.dh-style .tab.actions .actions-list .action-item img { - height: 40px; - width: 40px; - object-fit: cover; - border-radius: 3px; -} -.sheet.daggerheart.dh-style .tab.actions .actions-list .action-item h4 { - font-family: 'Montserrat', sans-serif; - font-weight: lighter; - color: #efe6d8; -} -.sheet.daggerheart.dh-style .tab.actions .actions-list .action-item .image { - height: 40px; - width: 40px; - object-fit: cover; - border-radius: 6px; - border: none; -} -.sheet.daggerheart.dh-style .tab.actions .actions-list .action-item .controls { - display: flex; - justify-content: center; - gap: 10px; -} -.sheet.daggerheart.dh-style .tab.features .features-list { - display: flex; - flex-direction: column; - list-style: none; - padding: 0; - margin: 0; - width: 100%; - gap: 5px; -} -.sheet.daggerheart.dh-style .tab.features .features-list .feature-item { - display: grid; - align-items: center; - grid-template-columns: 1fr 4fr 1fr; - cursor: pointer; -} -.sheet.daggerheart.dh-style .tab.features .features-list .feature-item img { - height: 40px; - width: 40px; - object-fit: cover; - border-radius: 3px; -} -.sheet.daggerheart.dh-style .tab.features .features-list .feature-item h4 { - font-family: 'Montserrat', sans-serif; - font-weight: lighter; - color: #efe6d8; -} -.sheet.daggerheart.dh-style .tab.features .features-list .feature-item .image { - height: 40px; - width: 40px; - object-fit: cover; - border-radius: 6px; - border: none; -} -.sheet.daggerheart.dh-style .tab.features .features-list .feature-item .controls { - display: flex; - justify-content: center; - gap: 10px; -} -.sheet.daggerheart.dh-style .tab.effects .effects-list { - display: flex; - flex-direction: column; - list-style: none; - padding: 0; - margin: 0; - width: 100%; - gap: 5px; -} -.sheet.daggerheart.dh-style .tab.effects .effects-list .effect-item { - display: grid; - align-items: center; - grid-template-columns: 1fr 4fr 1fr; - cursor: pointer; -} -.sheet.daggerheart.dh-style .tab.effects .effects-list .effect-item h4 { - font-family: 'Montserrat', sans-serif; - font-weight: lighter; - color: #efe6d8; -} -.sheet.daggerheart.dh-style .tab.effects .effects-list .effect-item .image { - height: 40px; - width: 40px; - object-fit: cover; - border-radius: 6px; - border: none; -} -.sheet.daggerheart.dh-style .tab.effects .effects-list .effect-item .controls { - display: flex; - justify-content: center; - gap: 10px; -} -.application.sheet.daggerheart.dh-style .item-sheet-header { - display: flex; -} -.application.sheet.daggerheart.dh-style .item-sheet-header .profile { - height: 150px; - width: 150px; - object-fit: cover; - border-right: 1px solid light-dark(#18162e, #f3c267); - border-bottom: 1px solid light-dark(#18162e, #f3c267); - box-sizing: border-box; - cursor: pointer; -} -.application.sheet.daggerheart.dh-style .item-sheet-header .item-info { - display: flex; - flex-direction: column; - align-items: center; - gap: 5px; - margin-top: 36px; - text-align: center; - width: 80%; -} -.application.sheet.daggerheart.dh-style .item-sheet-header .item-info .item-name input[type='text'] { - font-size: 32px; - height: 42px; - text-align: center; - width: 90%; - transition: all 0.3s ease; - outline: 2px solid transparent; - border: 1px solid transparent; -} -.application.sheet.daggerheart.dh-style .item-sheet-header .item-info .item-name input[type='text']:hover[type='text'], -.application.sheet.daggerheart.dh-style .item-sheet-header .item-info .item-name input[type='text']:focus[type='text'] { - box-shadow: none; - outline: 2px solid light-dark(#18162e, #f3c267); -} -.application.sheet.daggerheart.dh-style .item-sheet-header .item-info .item-description { - display: flex; - flex-direction: column; - gap: 10px; -} -.application.sheet.daggerheart.dh-style .item-sheet-header .item-info h3 { - font-size: 1rem; -} -.application.sheet.daggerheart.dh-style .item-card-header { - display: flex; - flex-direction: column; - justify-content: start; - text-align: center; -} -.application.sheet.daggerheart.dh-style .item-card-header .profile { - height: 300px; - width: 100%; - object-fit: cover; - mask-image: linear-gradient(0deg, transparent 0%, black 10%); - cursor: pointer; -} -.application.sheet.daggerheart.dh-style .item-card-header .item-icons-list { - position: absolute; - display: flex; - align-items: center; - justify-content: center; - top: 50px; - right: 10px; -} -.application.sheet.daggerheart.dh-style .item-card-header .item-icons-list .item-icon { - display: flex; - align-items: center; - justify-content: end; - text-align: center; - padding-right: 8px; - max-width: 50px; - height: 50px; - font-size: 1.2rem; - background: light-dark(rgba(0, 0, 0, 0.3), rgba(24, 22, 46, 0.33)); - border: 4px double light-dark(#efe6d8, #f3c267); - color: light-dark(#efe6d8, #f3c267); - border-radius: 999px; - transition: all 0.3s ease; -} -.application.sheet.daggerheart.dh-style .item-card-header .item-icons-list .item-icon .recall-label { - font-size: 14px; - opacity: 0; - margin-right: 0.3rem; - transition: all 0.3s ease; -} -.application.sheet.daggerheart.dh-style .item-card-header .item-icons-list .item-icon i { - font-size: 0.8rem; -} -.application.sheet.daggerheart.dh-style .item-card-header .item-icons-list .item-icon:hover { - max-width: 300px; - padding: 0 10px; - border-radius: 60px; -} -.application.sheet.daggerheart.dh-style .item-card-header .item-icons-list .item-icon:hover .recall-label { - opacity: 1; -} -.application.sheet.daggerheart.dh-style .item-card-header .item-info { - display: flex; - flex-direction: column; - align-items: center; - position: relative; - top: -25px; - gap: 5px; - margin-bottom: -20px; -} -.application.sheet.daggerheart.dh-style .item-card-header .item-info .item-name input[type='text'] { - font-size: 32px; - height: 42px; - text-align: center; - width: 90%; - transition: all 0.3s ease; - outline: 2px solid transparent; - border: 1px solid transparent; -} -.application.sheet.daggerheart.dh-style .item-card-header .item-info .item-name input[type='text']:hover[type='text'], -.application.sheet.daggerheart.dh-style .item-card-header .item-info .item-name input[type='text']:focus[type='text'] { - box-shadow: none; - outline: 2px solid light-dark(#18162e, #f3c267); -} -.application.sheet.daggerheart.dh-style .item-card-header .item-info .item-description { - display: flex; - flex-direction: column; - gap: 10px; -} -.application.sheet.daggerheart.dh-style .item-card-header .item-info h3 { - font-size: 1rem; -} -.sheet.daggerheart.dh-style.item .tab.features { - padding: 0 10px; - overflow-y: auto; - scrollbar-width: thin; - scrollbar-color: light-dark(#18162e, #f3c267) transparent; -} -.sheet.daggerheart.dh-style.item .tab.features .feature-list { - display: flex; - flex-direction: column; - list-style: none; - padding: 0; - margin: 0; - width: 100%; -} -.sheet.daggerheart.dh-style.item .tab.features .feature-list .feature-item { - margin-bottom: 10px; -} -.sheet.daggerheart.dh-style.item .tab.features .feature-list .feature-item:last-child { - margin-bottom: 0px; -} -.sheet.daggerheart.dh-style.item .tab.features .feature-list .feature-item .feature-line { - display: grid; - align-items: center; - grid-template-columns: 1fr 4fr 1fr; -} -.sheet.daggerheart.dh-style.item .tab.features .feature-list .feature-item .feature-line h4 { - font-family: 'Montserrat', sans-serif; - font-weight: lighter; - color: light-dark(#222, #efe6d8); -} -.sheet.daggerheart.dh-style.item .tab.features .feature-list .feature-item .feature-line .image { - height: 40px; - width: 40px; - object-fit: cover; - border-radius: 6px; - border: none; -} -.sheet.daggerheart.dh-style.item .tab.features .feature-list .feature-item .feature-line .controls { - display: flex; - justify-content: center; - gap: 10px; -} -.sheet.daggerheart.dh-style.item .tab.features .feature-list .feature-item .feature-line .controls a { - text-shadow: none; -} -.application.daggerheart.dh-style .inventory-item { - display: grid; - grid-template-columns: 40px 1fr 60px; - gap: 10px; - width: 100%; -} -.application.daggerheart.dh-style .inventory-item .item-img { - height: 40px; - width: 40px; - border-radius: 3px; - border: none; - cursor: pointer; - object-fit: cover; -} -.application.daggerheart.dh-style .inventory-item .item-img.actor-img { - border-radius: 50%; -} -.application.daggerheart.dh-style .inventory-item .item-label { - font-family: 'Montserrat', sans-serif; - align-self: center; -} -.application.daggerheart.dh-style .inventory-item .item-label .item-name { - font-size: 14px; -} -.application.daggerheart.dh-style .inventory-item .item-label .item-tags, -.application.daggerheart.dh-style .inventory-item .item-label .item-labels { - display: flex; - gap: 10px; -} -.application.daggerheart.dh-style .inventory-item .item-label .item-tags .tag, -.application.daggerheart.dh-style .inventory-item .item-label .item-labels .tag { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - padding: 3px 5px; - font-size: 12px; - background: light-dark(#22222215, #efe6d815); - border: 1px solid light-dark(#222, #efe6d8); - border-radius: 3px; -} -.application.daggerheart.dh-style .inventory-item .item-label .item-tags .label, -.application.daggerheart.dh-style .inventory-item .item-label .item-labels .label { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - font-size: 12px; - gap: 4px; -} -.application.daggerheart.dh-style .inventory-item .controls { - display: flex; - align-items: center; - justify-content: end; - gap: 8px; -} -.application.daggerheart.dh-style .inventory-item .controls a { - text-align: center; -} -.application.daggerheart.dh-style .inventory-item .controls a.unequipped { - opacity: 0.4; -} -.application.daggerheart.dh-style .card-item { - position: relative; - height: 120px; - width: 100px; - border: 1px solid light-dark(#18162e, #f3c267); - border-radius: 6px; - cursor: pointer; -} -.application.daggerheart.dh-style .card-item:hover .card-label { - padding-top: 15px; -} -.application.daggerheart.dh-style .card-item:hover .card-label .controls { - opacity: 1; - visibility: visible; - transition: all 0.3s ease; - max-height: 16px; -} -.application.daggerheart.dh-style .card-item .card-img { - height: 100%; - width: 100%; - object-fit: cover; -} -.application.daggerheart.dh-style .card-item .card-label { - display: flex; - flex-direction: column; - height: fit-content; - align-items: center; - gap: 5px; - padding-top: 5px; - padding-bottom: 5px; - width: 100%; - position: absolute; - background-color: #18162e; - bottom: 0; - mask-image: linear-gradient(180deg, transparent 0%, black 20%); -} -.application.daggerheart.dh-style .card-item .card-label .card-name { - font-family: 'Montserrat', sans-serif; - font-style: normal; - font-weight: 400; - font-size: 12px; - line-height: 15px; - color: #efe6d8; -} -.application.daggerheart.dh-style .card-item .card-label .controls { - display: flex; - gap: 15px; - align-items: center; - max-height: 0px; - opacity: 0; - visibility: collapse; - transition: all 0.3s ease; - color: #efe6d8; -} -.application.daggerheart.dh-style .items-list { - display: flex; - flex-direction: column; - gap: 10px; - align-items: center; - width: 100%; -} -.application.daggerheart.dh-style .card-list { - display: flex; - flex-direction: row; - gap: 10px; - align-items: center; -} -.application prose-mirror { - height: 100% !important; -} -.application prose-mirror .editor-menu { - background-color: transparent; -} -.application prose-mirror .editor-content { - scrollbar-width: thin; - scrollbar-color: light-dark(#18162e, #f3c267) transparent; -} -.application prose-mirror .editor-content h1 { - font-size: 36px; -} -.application prose-mirror .editor-content h2 { - font-size: 32px; -} -.application prose-mirror .editor-content h3 { - font-size: 24px; -} -.filter-menu { - width: auto; -} -.filter-menu fieldset.filter-section { - align-items: center; - margin: 5px; - border-radius: 6px; - border-color: light-dark(#18162e, #f3c267); - padding: 5px; -} -.filter-menu fieldset.filter-section legend { - font-family: 'Montserrat', sans-serif; - font-weight: bold; - color: light-dark(#18162e, #f3c267); - font-size: var(--font-size-12); -} -.filter-menu fieldset.filter-section .filter-buttons { - display: flex; - flex-wrap: wrap; - justify-content: space-evenly; - gap: 5px; -} -.filter-menu fieldset.filter-section .filter-buttons button { - background: light-dark(rgba(0, 0, 0, 0.3), #18162e); - color: light-dark(#18162e, #f3c267); - outline: none; - box-shadow: none; - border: 1px solid light-dark(#18162e, #18162e); - padding: 0 0.2rem; - font-size: var(--font-size-12); -} -.filter-menu fieldset.filter-section .filter-buttons button:hover { - background: light-dark(transparent, #f3c267); - color: light-dark(#18162e, #18162e); -} -.filter-menu fieldset.filter-section .filter-buttons button.active { - animation: glow 0.75s infinite alternate; -} -.daggerheart { - /* Flex */ - /****/ -} -.daggerheart .vertical-separator { - border-left: 2px solid black; - height: 56px; - flex: 0; - align-self: center; -} -.daggerheart .flex-centered { - display: flex; - align-items: center; - justify-content: center; -} -.daggerheart .flex-col-centered { - display: flex; - flex-direction: column; - align-items: center; -} -.daggerheart .flex-spaced { - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; -} -.daggerheart .flex-min { - display: flex; - flex: 0; -} -.daggerheart img[data-edit='img'] { - min-width: 64px; - min-height: 64px; -} -.daggerheart .editor { - height: 200px; -} -.daggerheart button i { - margin: 0; -} -.daggerheart .icon-button.spaced { - margin-left: 4px; -} -.daggerheart .icon-button.disabled { - opacity: 0.6; -} -.daggerheart .icon-button:hover:not(.disabled) { - cursor: pointer; -} -#players h3 { - display: flex; - align-items: center; - justify-content: space-between; - flex-wrap: nowrap; -} -#players h3 .players-container { - display: flex; - align-items: center; -} -#players h3 .fear-control { - font-size: 10px; -} -#players h3 .fear-control.disabled { - opacity: 0.4; -} -#players h3 .fear-control:hover:not(.disabled) { - cursor: pointer; - filter: drop-shadow(0 0 3px red); -} -.unlist { - list-style: none; - padding-inline-start: 0; -} -.list-select { - margin: 1rem; -} -.list-select li:not(:last-child) { - border-bottom: 1px solid #bbb; -} -.list-select li label { - padding: 4px 8px; - display: flex; - align-items: center; - gap: 1rem; - cursor: pointer; -} -.list-select li label > span { - flex: 1; - font-weight: bold; - font-size: var(--font-size-16); -} -dh-icon, -dh-icon > img { - width: 32px; - height: 32px; - display: flex; - align-items: center; - justify-content: center; - font-size: x-large; -} diff --git a/styles/daggerheart.less b/styles/daggerheart.less index ebecdc95..efff7499 100755 --- a/styles/daggerheart.less +++ b/styles/daggerheart.less @@ -1,203 +1,17 @@ -@import './variables/variables.less'; -@import './variables/colors.less'; -@import './class.less'; -@import './pc.less'; -@import './ui.less'; -@import './chat.less'; -@import './item.less'; -@import './application.less'; -@import './sheets/sheets.less'; -@import './dialog.less'; -@import './characterCreation.less'; -@import './levelup.less'; -@import './ownershipSelection.less'; -@import './damageReduction.less'; -@import './resources.less'; -@import './countdown.less'; -@import './settings.less'; +@import './less/sheets/index.less'; +@import './less/sheets-settings/index.less'; -// new styles imports -@import './less/actors/character/header.less'; -@import './less/actors/character/sidebar.less'; -@import './less/actors/character/sheet.less'; -@import './less/actors/character/inventory.less'; -@import './less/actors/character/loadout.less'; -@import './less/actors/character/biography.less'; -@import './less/actors/character/features.less'; +@import './less/dialog/index.less'; -@import './less/actors/adversary/header.less'; -@import './less/actors/adversary/sheet.less'; -@import './less/actors/adversary/sidebar.less'; - -@import './less/actors/environment/header.less'; -@import './less/actors/environment/sheet.less'; - -@import './less/applications/header.less'; -@import './less/applications/adversary-settings/sheet.less'; -@import './less/applications/adversary-settings/experiences.less'; -@import './less/applications/adversary-settings/features.less'; - -@import './less/applications/environment-settings/features.less'; -@import './less/applications/environment-settings/adversaries.less'; - -@import './less/applications//beastform.less'; - -@import './less/actors/companion/header.less'; -@import './less/actors/companion/details.less'; -@import './less/actors/companion/sheet.less'; - -@import './less/actors/adversary.less'; -@import './less/actors/environment.less'; - -@import './less/items/feature.less'; -@import './less/items/domainCard.less'; -@import './less/items/class.less'; - -@import './less/dialog/dice-roll/roll-selection.less'; +@import './less//hud/index.less'; @import './less/utils/colors.less'; @import './less/utils/fonts.less'; -@import './less/global/sheet.less'; -@import './less/global/dialog.less'; -@import './less/global/elements.less'; -@import './less/global/tab-navigation.less'; -@import './less/global/tab-form-footer.less'; -@import './less/global/tab-actions.less'; -@import './less/global/tab-features.less'; -@import './less/global/tab-effects.less'; -@import './less/global/item-header.less'; -@import './less/global/feature-section.less'; -@import './less/global/inventory-item.less'; -@import './less/global/inventory-fieldset-items.less'; -@import './less/global/prose-mirror.less'; -@import './less/global/filter-menu.less'; +@import './less/global/index.less'; -@import '../node_modules/@yaireo/tagify/dist/tagify.css'; +@import './less/ui/index.less'; -.daggerheart { - .vertical-separator { - border-left: 2px solid black; - height: 56px; - flex: 0; - align-self: center; - } +@import './less/ux/index.less'; - /* Flex */ - .flex-centered { - display: flex; - align-items: center; - justify-content: center; - } - - .flex-col-centered { - display: flex; - flex-direction: column; - align-items: center; - } - - .flex-spaced { - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; - } - - .flex-min { - display: flex; - flex: 0; - } - - /****/ - img[data-edit='img'] { - min-width: 64px; - min-height: 64px; - } - - .editor { - height: 200px; - } - - button { - i { - margin: 0; - } - } - - .icon-button { - &.spaced { - margin-left: @halfMargin; - } - - &.disabled { - opacity: 0.6; - } - - &:hover:not(.disabled) { - cursor: pointer; - } - } -} - -#players { - h3 { - display: flex; - align-items: center; - justify-content: space-between; - flex-wrap: nowrap; - - .players-container { - display: flex; - align-items: center; - } - - .fear-control { - font-size: 10px; - - &.disabled { - opacity: 0.4; - } - - &:hover:not(.disabled) { - cursor: pointer; - filter: drop-shadow(0 0 3px @mainShadow); - } - } - } -} - -.unlist { - list-style: none; - padding-inline-start: 0; -} - -.list-select { - margin: 1rem; - li { - &:not(:last-child) { - border-bottom: 1px solid #bbb; - } - label { - padding: 4px 8px; - display: flex; - align-items: center; - gap: 1rem; - cursor: pointer; - > span { - flex: 1; - font-weight: bold; - font-size: var(--font-size-16); - } - } - } -} - -dh-icon, -dh-icon > img { - width: 32px; - height: 32px; - display: flex; - align-items: center; - justify-content: center; - font-size: x-large; -} +@import '../build/tagify.css'; diff --git a/styles/dialog.less b/styles/dialog.less deleted file mode 100644 index 0a9f31e3..00000000 --- a/styles/dialog.less +++ /dev/null @@ -1,12 +0,0 @@ -.item-button { - &.checked { - background: green; - } - .item-icon { - opacity: 0; - transition: opacity 0.2s; - &.checked { - opacity: 1; - } - } -} diff --git a/styles/item.less b/styles/item.less deleted file mode 100755 index 964d69fc..00000000 --- a/styles/item.less +++ /dev/null @@ -1,59 +0,0 @@ -.daggerheart.sheet { - &.feature { - .editable { - display: flex; - flex-direction: column; - } - - .sheet-body { - flex: 1; - display: flex; - flex-direction: column; - } - .feature-description { - flex: 1; - display: flex; - flex-direction: column; - } - } - - &.class { - .class-feature { - display: flex; - img { - width: 40px; - } - button { - width: 40px; - } - } - } - - .domain-card-description { - .editor { - height: 300px; - } - } - - .item-container { - margin-top: @halfMargin; - gap: @halfMargin; - align-items: baseline; - } - - .item-sidebar { - // border-right: @thinBorder groove darkgray; - min-width: 160px; - flex: 0; - padding: @fullPadding; - - label { - margin-right: @fullMargin; - font-weight: bold; - } - - input[type='checkbox'] { - margin: 0; - } - } -} diff --git a/styles/less/actors/adversary.less b/styles/less/actors/adversary.less deleted file mode 100644 index 5b4feb26..00000000 --- a/styles/less/actors/adversary.less +++ /dev/null @@ -1,5 +0,0 @@ -.application.sheet.daggerheart.actor.dh-style.adversary { - .window-content { - overflow: auto; - } -} diff --git a/styles/less/actors/character.less b/styles/less/actors/character.less deleted file mode 100644 index e3833e3b..00000000 --- a/styles/less/actors/character.less +++ /dev/null @@ -1,11 +0,0 @@ -@import '../utils/colors.less'; -@import '../utils/fonts.less'; - -.application.sheet.daggerheart.actor.dh-style.character { - .window-content { - display: flex; - flex-direction: row; - height: 100%; - width: 100%; - } -} diff --git a/styles/less/actors/environment.less b/styles/less/actors/environment.less deleted file mode 100644 index d534de38..00000000 --- a/styles/less/actors/environment.less +++ /dev/null @@ -1,27 +0,0 @@ -.daggerheart.sheet.actor.environment { - .potential-adversary-container { - width: 100%; - height: 50px; - - .adversary-placeholder { - font-style: italic; - text-align: center; - opacity: 0.6; - } - - .adversaries-container { - display: flex; - gap: 8px; - - .adversary-container { - border: 1px solid var(--color-dark-5); - border-radius: 6px; - padding: 0 2px; - font-weight: bold; - cursor: pointer; - background-image: url(../assets/parchments/dh-parchment-dark.png); - color: var(--color-light-3); - } - } - } -} diff --git a/styles/less/applications/beastform.less b/styles/less/applications/beastform.less deleted file mode 100644 index 37069bdb..00000000 --- a/styles/less/applications/beastform.less +++ /dev/null @@ -1,59 +0,0 @@ -.theme-light .application.daggerheart.dh-style.views.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 { - .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'); - } - } - } - } - - footer { - margin-top: 8px; - display: flex; - - button { - flex: 1; - } - } -} diff --git a/styles/less/dialog/actions/action-list.less b/styles/less/dialog/actions/action-list.less new file mode 100644 index 00000000..1f405b5d --- /dev/null +++ b/styles/less/dialog/actions/action-list.less @@ -0,0 +1,19 @@ +@import '../../utils/fonts.less'; + +.application.daggerheart.dh-style { + .actions-list { + display: flex; + flex-direction: column; + gap: 10px; + + .action-item { + display: flex; + align-items: center; + gap: 5px; + + .label { + font-family: @font-body; + } + } + } +} diff --git a/styles/less/dialog/beastform/sheet.less b/styles/less/dialog/beastform/sheet.less new file mode 100644 index 00000000..26b6072a --- /dev/null +++ b/styles/less/dialog/beastform/sheet.less @@ -0,0 +1,218 @@ +@import '../../utils/colors.less'; +@import '../../utils/mixin.less'; +@import '../../utils/fonts.less'; + +.theme-light .application.daggerheart.dh-style.views.beastform-selection .beastforms-outer-container { + .beastform-title { + background-image: url('../assets/parchments/dh-parchment-light.png'); + } + + .advanced-container { + .advanced-forms-container { + .advanced-form-container { + background-image: url('../assets/parchments/dh-parchment-light.png'); + } + + .hybrid-data-wrapper .hybrid-data-container .hybrid-data-inner-container .hybrid-data { + background-image: url('../assets/parchments/dh-parchment-light.png'); + } + } + .form-features .form-feature { + background-image: url('../assets/parchments/dh-parchment-light.png'); + } + } +} + +.application.daggerheart.dh-style.views.beastform-selection { + .beastform-nav { + nav { + flex: 1; + + a { + white-space: nowrap; + } + } + } + + .beastform-title { + position: absolute; + top: 4px; + padding: 0 2px; + display: flex; + flex-wrap: wrap; + text-align: center; + font-size: 16px; + margin: 0 4px; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + color: light-dark(@dark, @beige); + background-image: url('../assets/parchments/dh-parchment-dark.png'); + } + + .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; + width: 120px; + height: 120px; + + &.inactive { + opacity: 0.4; + cursor: default; + } + + &.draggable { + cursor: pointer; + filter: drop-shadow(0 0 15px light-dark(@dark-blue, @golden)); + } + + img { + width: 100%; + border-radius: 6px; + } + } + } + + .advanced-container { + display: flex; + flex-direction: column; + align-items: center; + padding-top: 12px; + transition: width 0.3s ease; + + h2 { + margin: 0; + } + + .advanced-forms-container { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: 16px; + } + + .advanced-form-container { + position: relative; + display: flex; + justify-content: center; + border: 1px solid light-dark(#18162e, #f3c267); + border-radius: 6px; + cursor: pointer; + width: 120px; + height: 120px; + align-items: center; + text-align: center; + color: light-dark(@dark, @beige); + background-image: url('../assets/parchments/dh-parchment-dark.png'); + + &.hybridized { + flex-direction: column; + justify-content: start; + padding-top: 4px; + height: 200px; + width: 100%; + overflow: hidden; + + &.empty { + justify-content: center; + } + + .beastform-title { + position: initial; + } + } + + .empty-form { + display: flex; + flex-direction: column; + align-items: center; + + i { + font-size: 24px; + } + } + + .beastform-title-wrapper { + height: 44px; + } + + .hybrid-data-wrapper { + overflow: auto; + + .hybrid-data-container { + display: flex; + flex-direction: column; + gap: 2px; + padding: 0 4px; + + label { + font-weight: bold; + } + + .hybrid-data-inner-container { + display: flex; + justify-content: center; + flex-wrap: wrap; + gap: 4px; + + .hybrid-data { + padding: 0 2px; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + color: light-dark(@dark, @beige); + background-image: url('../assets/parchments/dh-parchment-dark.png'); + opacity: 0.4; + + &.active { + opacity: 1; + } + } + } + } + } + } + + .form-features { + display: flex; + flex-direction: column; + gap: 8px; + padding: 0 16px; + margin: 8px 0; + + .form-feature { + display: flex; + flex-direction: column; + gap: 4px; + padding: 0 4px; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + color: light-dark(@dark, @beige); + background-image: url('../assets/parchments/dh-parchment-dark.png'); + + h4 { + text-align: center; + margin: 0; + } + } + } + } + + footer { + margin-top: 8px; + display: flex; + + button { + flex: 1; + font-family: @font-body; + font-weight: bold; + height: 40px; + } + } +} diff --git a/styles/less/dialog/character-creation/creation-action-footer.less b/styles/less/dialog/character-creation/creation-action-footer.less new file mode 100644 index 00000000..88a9b3c8 --- /dev/null +++ b/styles/less/dialog/character-creation/creation-action-footer.less @@ -0,0 +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; + } + } +} diff --git a/styles/characterCreation.less b/styles/less/dialog/character-creation/selections-container.less similarity index 68% rename from styles/characterCreation.less rename to styles/less/dialog/character-creation/selections-container.less index e6548d21..0c13fae9 100644 --- a/styles/characterCreation.less +++ b/styles/less/dialog/character-creation/selections-container.less @@ -1,83 +1,55 @@ -@import './less/utils/colors.less'; +@import '../../utils/colors.less'; -.theme-light .daggerheart.dh-style.dialog.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'); +.appTheme({}, { + &.daggerheart.dh-style.dialog.character-creation { + .setup-tabs button { + background-image: url(../assets/parchments/dh-parchment-dark.png); } - } -} -.daggerheart.dh-style.dialog.character-creation { - .window-content { - gap: 16px; - - .tab { - overflow-y: auto; + nav a .descriptor { + background-image: url(../assets/parchments/dh-parchment-dark.png); } - } - .tab-navigation { - nav { - flex: 1; + .main-selections-container { + .ancestry-mixed-controller label { + background-image: url(../assets/parchments/dh-parchment-dark.png); + } - a { - flex: 1; - text-align: center; - display: flex; - justify-content: center; - position: relative; + .selections-container + .ancestry-preview-info-container + .ancestry-preview-features + .ancestry-preview-feature { + background-image: url(../assets/parchments/dh-parchment-light.png); + } - &.disabled { - opacity: 0.4; + .traits-container { + .suggested-traits-container .suggested-trait-container { + background-image: url('../assets/parchments/dh-parchment-dark.png'); } - .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); + .traits-inner-container .trait-container { + background: url('../assets/svg/trait-shield-light.svg') no-repeat; + + div { + filter: none; + text-shadow: none; } } - - .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); - } } + } + } +}); + +.daggerheart.dh-style.dialog.character-creation { + .setup-tabs { + display: flex; + justify-content: center; + + button { + background-image: url(../assets/parchments/dh-parchment-light.png); + border-radius: 6px; + border-color: light-dark(@dark-blue, @golden); + color: light-dark(@beige, @dark); } } @@ -86,6 +58,54 @@ flex-direction: column; gap: 4px; + .ancestry-mixed-controller { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + gap: 4px; + margin-bottom: 8px; + + &.active { + label { + opacity: 1; + } + } + + label { + position: absolute; + font-size: 18px; + font-weight: bold; + padding: 0 2px; + background-image: url(../assets/parchments/dh-parchment-light.png); + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + color: light-dark(@beige, @dark); + opacity: 0.4; + cursor: pointer; + display: flex; + align-items: center; + gap: 4px; + } + + input { + width: 50%; + } + } + + .ancestry-name { + display: flex; + justify-content: center; + width: 100%; + margin-bottom: 8px; + + input { + width: 50%; + text-align: center; + } + } + .selections-container { width: 140px; display: flex; @@ -95,6 +115,43 @@ .card-preview-container { border-color: light-dark(@dark-blue, @golden); } + + .ancestry-preview-info-container { + display: flex; + flex-direction: column; + gap: 4px; + width: 100%; + + .ancestry-preview-label { + text-align: center; + font-weight: bold; + } + + .ancestry-preview-features { + display: flex; + flex-direction: column; + justify-content: end; + gap: 2px; + width: 100%; + padding: 0 2px 2px 2px; + + .ancestry-preview-feature { + flex: 1; + font-size: 14px; + white-space: wrap; + padding: 0 2px; + border: 1px solid light-dark(@golden, @dark-blue); + border-radius: 6px; + background-image: url(../assets/parchments/dh-parchment-dark.png); + color: light-dark(@dark, @beige); + height: min-content; + + &.inactive { + opacity: 0.2; + } + } + } + } } .selections-outer-container { @@ -107,6 +164,10 @@ border-radius: 8px; border-color: light-dark(@dark-blue, @golden); + &.inactive { + opacity: 0.2; + } + legend { margin-left: auto; margin-right: auto; @@ -124,6 +185,7 @@ legend { font-size: 20px; + white-space: nowrap; } .action-button { @@ -167,21 +229,38 @@ } .traits-inner-container { + width: 100%; display: flex; + align-items: center; justify-content: space-evenly; gap: 8px; .trait-container { - border: 1px solid light-dark(@dark-blue, @golden); - padding: 0 4px; + width: 60px; + height: 60px; + background: url(../assets/svg/trait-shield.svg) no-repeat; + + div { + filter: drop-shadow(0 0 3px black); + text-shadow: 0 0 3px black; + } + + select { + text-align: center; + width: 32px; + height: 24px; + position: relative; + top: 2px; + padding: 0; + } } } } .experiences-inner-container { display: flex; - justify-content: space-evenly; - text-align: center; + flex-direction: column; + gap: 8px; .experience-container { position: relative; @@ -402,16 +481,4 @@ } } } - - .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/sheet.less b/styles/less/dialog/character-creation/sheet.less new file mode 100644 index 00000000..ce12d056 --- /dev/null +++ b/styles/less/dialog/character-creation/sheet.less @@ -0,0 +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; + } + } +} diff --git a/styles/less/dialog/character-creation/tab-navigation.less b/styles/less/dialog/character-creation/tab-navigation.less new file mode 100644 index 00000000..dbf285f6 --- /dev/null +++ b/styles/less/dialog/character-creation/tab-navigation.less @@ -0,0 +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); + } + } + } + } +} diff --git a/styles/damageReduction.less b/styles/less/dialog/damage-reduction/damage-reduction-container.less similarity index 98% rename from styles/damageReduction.less rename to styles/less/dialog/damage-reduction/damage-reduction-container.less index e3ffc2e9..25ca5ff9 100644 --- a/styles/damageReduction.less +++ b/styles/less/dialog/damage-reduction/damage-reduction-container.less @@ -1,8 +1,6 @@ -.daggerheart.views.damage-reduction { - .window-content { - padding: 8px 0; - } +@import '../../utils/colors.less'; +.daggerheart.views.damage-reduction { .damage-reduction-container { display: flex; flex-direction: column; diff --git a/styles/less/dialog/damage-reduction/sheets.less b/styles/less/dialog/damage-reduction/sheets.less new file mode 100644 index 00000000..b73d7518 --- /dev/null +++ b/styles/less/dialog/damage-reduction/sheets.less @@ -0,0 +1,7 @@ +@import '../../utils/colors.less'; + +.daggerheart.views.damage-reduction { + .window-content { + padding: 8px 0; + } +} diff --git a/styles/less/dialog/damage-selection/sheet.less b/styles/less/dialog/damage-selection/sheet.less new file mode 100644 index 00000000..461fb0b5 --- /dev/null +++ b/styles/less/dialog/damage-selection/sheet.less @@ -0,0 +1,34 @@ +@import '../../utils/colors.less'; + +.daggerheart.dialog.dh-style.views.damage-selection { + .damage-section-container { + display: flex; + flex-direction: column; + gap: 12px; + + input[type='text'], + input[type='number'] { + color: light-dark(@dark, @beige); + outline: 2px solid transparent; + transition: all 0.3s ease; + + &:hover { + outline: 2px solid light-dark(@dark, @beige); + } + } + + .damage-section-controls { + display: flex; + align-items: center; + gap: 16px; + + .roll-mode-select { + width: min-content; + } + + button { + flex: 1; + } + } + } +} diff --git a/styles/less/dialog/dice-roll/roll-selection.less b/styles/less/dialog/dice-roll/roll-selection.less index b2f05dc2..4ee2ee1f 100644 --- a/styles/less/dialog/dice-roll/roll-selection.less +++ b/styles/less/dialog/dice-roll/roll-selection.less @@ -1,11 +1,19 @@ @import '../../utils/colors.less'; @import '../../utils/fonts.less'; +.theme-light .application.daggerheart.dialog.dh-style.views.roll-selection { + .roll-dialog-container .dices-section .dice-option .dice-icon.normal { + filter: brightness(0) saturate(100%) invert(13%) sepia(1%) saturate(0%) hue-rotate(10deg) brightness(98%) + contrast(100%); + } +} + .application.daggerheart.dialog.dh-style.views.roll-selection { .roll-dialog-container { display: flex; flex-direction: column; gap: 12px; + max-width: 550px; .dices-section { display: flex; @@ -24,6 +32,7 @@ height: 70px; object-fit: contain; } + .dice-select { display: flex; align-items: center; @@ -92,6 +101,10 @@ font-size: 14px; line-height: 17px; } + + .advantage-chip-tooltip { + pointer-events: all; + } } .advantage-chip { @@ -115,14 +128,23 @@ } } - .formula-label { - font-family: @font-body; - font-style: normal; - font-weight: 500; - font-size: 14px; - line-height: 17px; + .roll-dialog-controls { + display: flex; + align-items: center; + gap: 16px; + height: 32px; - color: light-dark(@dark, @beige); + .roll-mode-select { + width: min-content; + height: 100%; + } + + button { + flex: 1; + height: 100%; + font-weight: bold; + font-family: @font-body; + } } } } diff --git a/styles/less/dialog/downtime/downtime-container.less b/styles/less/dialog/downtime/downtime-container.less new file mode 100644 index 00000000..0f803d9b --- /dev/null +++ b/styles/less/dialog/downtime/downtime-container.less @@ -0,0 +1,75 @@ +@import '../../utils/spacing.less'; +@import '../../utils/colors.less'; + +.theme-light .daggerheart.dh-style.views.downtime { + .downtime-container .activity-container .activity-selected-marker { + background-image: url(../assets/parchments/dh-parchment-light.png); + } +} + +.daggerheart.dh-style.views.downtime { + font-family: @font-body; + + .downtime-container { + .activities-grouping { + width: 280px; + } + + .activities-container { + width: 100%; + + .activity-container { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px; + + .activity-inner-container { + display: flex; + align-items: center; + gap: 4px; + + .activity-marker { + font-size: 8px; + flex: none; + color: light-dark(#18162e, #f3c267); + margin-right: 4px; + } + + .activity-select-section { + display: flex; + align-items: center; + gap: 4px; + + .activity-icon { + min-width: 24px; + text-align: center; + } + } + } + + .activity-selected-marker { + font-size: 14px; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + color: light-dark(@dark, @beige); + background-image: url(../assets/parchments/dh-parchment-dark.png); + padding: 0 8px; + line-height: 1; + font-weight: bold; + } + } + } + } + + footer { + margin-top: 8px; + display: flex; + gap: 8px; + + button { + flex: 1; + font-family: 'Montserrat', sans-serif; + } + } +} diff --git a/styles/less/dialog/index.less b/styles/less/dialog/index.less new file mode 100644 index 00000000..66fd981d --- /dev/null +++ b/styles/less/dialog/index.less @@ -0,0 +1,24 @@ +@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 './resource-dice/sheet.less'; + +@import './actions/action-list.less'; + +@import './damage-selection/sheet.less'; + +@import './downtime/downtime-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 new file mode 100644 index 00000000..142cf089 --- /dev/null +++ b/styles/less/dialog/level-up/navigation-container.less @@ -0,0 +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); + } + } + } +} diff --git a/styles/less/dialog/level-up/selections-container.less b/styles/less/dialog/level-up/selections-container.less new file mode 100644 index 00000000..182e2962 --- /dev/null +++ b/styles/less/dialog/level-up/selections-container.less @@ -0,0 +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; + } + } + } +} diff --git a/styles/less/dialog/level-up/sheet.less b/styles/less/dialog/level-up/sheet.less new file mode 100644 index 00000000..2f89034c --- /dev/null +++ b/styles/less/dialog/level-up/sheet.less @@ -0,0 +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; + } +} diff --git a/styles/less/dialog/level-up/summary-container.less b/styles/less/dialog/level-up/summary-container.less new file mode 100644 index 00000000..fbaa783e --- /dev/null +++ b/styles/less/dialog/level-up/summary-container.less @@ -0,0 +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; + } + } + } +} diff --git a/styles/less/dialog/level-up/tiers-container.less b/styles/less/dialog/level-up/tiers-container.less new file mode 100644 index 00000000..bf270fe9 --- /dev/null +++ b/styles/less/dialog/level-up/tiers-container.less @@ -0,0 +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; + } + } + } + } +} diff --git a/styles/less/dialog/resource-dice/sheet.less b/styles/less/dialog/resource-dice/sheet.less new file mode 100644 index 00000000..7ddb53ca --- /dev/null +++ b/styles/less/dialog/resource-dice/sheet.less @@ -0,0 +1,58 @@ +.theme-light .daggerheart.dialog.dh-style.views.resource-dice { + .resource-items .resource-item { + input { + background-image: url('../assets/parchments/dh-parchment-light.png'); + } + + img { + filter: brightness(0) saturate(100%); + } + } +} + +.daggerheart.dialog.dh-style.views.resource-dice { + .reroll-confirmation { + margin-bottom: 8px; + } + + .resource-items { + display: flex; + justify-content: center; + gap: 8px; + + .resource-item { + position: relative; + display: flex; + align-items: center; + justify-content: center; + + input { + position: absolute; + border-color: light-dark(@dark-blue, @golden); + color: light-dark(black, white); + background-image: url('../assets/parchments/dh-parchment-dark.png'); + z-index: 2; + line-height: 22px; + height: unset; + text-align: center; + } + + img { + width: 48px; + height: 48px; + filter: brightness(0) saturate(100%) invert(97%) sepia(7%) saturate(580%) hue-rotate(332deg) + brightness(96%) contrast(95%); + } + } + } + + footer { + display: flex; + gap: 8px; + + button { + flex: 1; + white-space: nowrap; + } + } +} diff --git a/styles/less/global/dialog.less b/styles/less/global/dialog.less index 3856facb..8c86e825 100644 --- a/styles/less/global/dialog.less +++ b/styles/less/global/dialog.less @@ -1,5 +1,6 @@ @import '../utils/colors.less'; @import '../utils/fonts.less'; +@import '../utils/mixin.less'; .appTheme({ &.dialog { @@ -40,4 +41,30 @@ } } } + + .submit-btn { + width: 100%; + height: 38px; + } + + .formula-label { + font-family: @font-body; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 17px; + + color: light-dark(@dark, @beige); + } + + .damage-formula { + display: flex; + justify-content: space-between; + .damage-details { + font-style: italic; + display: flex; + align-items: center; + gap: 5px; + } + } } diff --git a/styles/less/global/elements.css b/styles/less/global/elements.css new file mode 100644 index 00000000..5c9d36d1 --- /dev/null +++ b/styles/less/global/elements.css @@ -0,0 +1,618 @@ +@keyframes glow { + 0% { + box-shadow: 0 0 1px 1px #f3c267; + } + 100% { + box-shadow: 0 0 2px 2px #f3c267; + } +} +@keyframes glow-dark { + 0% { + box-shadow: 0 0 1px 1px #18162e; + } + 100% { + box-shadow: 0 0 2px 2px #18162e; + } +} +@font-face { + font-family: 'Cinzel'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cinzel/v25/8vIU7ww63mVu7gtR-kwKxNvkNOjw-tbnTYo.ttf) format('truetype'); +} +@font-face { + font-family: 'Cinzel'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cinzel/v25/8vIU7ww63mVu7gtR-kwKxNvkNOjw-jHgTYo.ttf) format('truetype'); +} +@font-face { + font-family: 'Cinzel Decorative'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cinzeldecorative/v18/daaHSScvJGqLYhG8nNt8KPPswUAPniZoaelD.ttf) + format('truetype'); +} +@font-face { + font-family: 'Montserrat'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/montserrat/v30/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Ew-.ttf) format('truetype'); +} +@font-face { + font-family: 'Montserrat'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(https://fonts.gstatic.com/s/montserrat/v30/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCu170w-.ttf) format('truetype'); +} +.application.sheet.daggerheart.dh-style h1 { + font-family: 'Cinzel Decorative', serif; + margin: 0; + border: none; + font-weight: normal; +} +.application.sheet.daggerheart.dh-style h2, +.application.sheet.daggerheart.dh-style h3 { + font-family: 'Cinzel', serif; + margin: 0; + border: none; + font-weight: normal; +} +.application.sheet.daggerheart.dh-style h4 { + font-family: 'Montserrat', sans-serif; + font-size: 14px; + border: none; + font-weight: 700; + margin: 0; + text-shadow: none; + color: #f3c267; + font-weight: normal; +} +.application.sheet.daggerheart.dh-style h5 { + font-size: 14px; + color: #f3c267; + margin: 0; + font-weight: normal; +} +.application.sheet.daggerheart.dh-style p, +.application.sheet.daggerheart.dh-style span { + font-family: 'Montserrat', sans-serif; +} +.application.sheet.daggerheart.dh-style small { + font-family: 'Montserrat', sans-serif; + opacity: 0.8; +} +.application.dh-style { + border: 1px solid light-dark(#18162e, #f3c267); +} +.application.dh-style input[type='text'], +.application.dh-style input[type='number'] { + background: light-dark(transparent, transparent); + border-radius: 6px; + box-shadow: 0 4px 30px rgba(0, 0, 0, 0.05); + backdrop-filter: blur(9.5px); + -webkit-backdrop-filter: blur(9.5px); + outline: none; + color: light-dark(#18162e, #f3c267); + border: 1px solid light-dark(#222, #efe6d8); +} +.application.dh-style input[type='text']:hover[type='text'], +.application.dh-style input[type='number']:hover[type='text'], +.application.dh-style input[type='text']:hover[type='number'], +.application.dh-style input[type='number']:hover[type='number'], +.application.dh-style input[type='text']:focus[type='text'], +.application.dh-style input[type='number']:focus[type='text'], +.application.dh-style input[type='text']:focus[type='number'], +.application.dh-style input[type='number']:focus[type='number'] { + background: light-dark(rgba(0, 0, 0, 0.05), rgba(24, 22, 46, 0.33)); + box-shadow: none; + outline: 2px solid light-dark(#222, #efe6d8); +} +.application.dh-style input[type='text']:disabled[type='text'], +.application.dh-style input[type='number']:disabled[type='text'], +.application.dh-style input[type='text']:disabled[type='number'], +.application.dh-style input[type='number']:disabled[type='number'] { + outline: 2px solid transparent; + cursor: not-allowed; +} +.application.dh-style input[type='text']:disabled[type='text']:hover, +.application.dh-style input[type='number']:disabled[type='text']:hover, +.application.dh-style input[type='text']:disabled[type='number']:hover, +.application.dh-style input[type='number']:disabled[type='number']:hover { + background: transparent; +} +.application.dh-style input[type='checkbox']:checked::after, +.application.dh-style input[type='radio']:checked::after { + color: light-dark(#222, #f3c267); +} +.application.dh-style input[type='checkbox']:checked::before, +.application.dh-style input[type='radio']:checked::before { + color: light-dark(#22222240, #f3c26740); +} +.application.dh-style input[type='checkbox']::before, +.application.dh-style input[type='radio']::before { + color: light-dark(#22222240, #f3c26740); +} +.application.dh-style button { + background: light-dark(transparent, #f3c267); + border: 1px solid light-dark(#18162e, #18162e); + color: light-dark(#18162e, #18162e); + outline: none; + box-shadow: none; +} +.application.dh-style button:hover { + background: light-dark(rgba(0, 0, 0, 0.3), #18162e); + color: light-dark(#18162e, #f3c267); +} +.application.dh-style button.glow { + animation: glow 0.75s infinite alternate; +} +.application.dh-style button:disabled { + background: light-dark(transparent, #f3c267); + color: light-dark(#18162e, #18162e); + opacity: 0.6; + cursor: not-allowed; +} +.application.dh-style button:disabled:hover { + background: light-dark(transparent, #f3c267); + color: light-dark(#18162e, #18162e); +} +.application.dh-style select { + background: light-dark(transparent, transparent); + color: light-dark(#222, #efe6d8); + font-family: 'Montserrat', sans-serif; + outline: 2px solid transparent; + border: 1px solid light-dark(#222, #efe6d8); +} +.application.dh-style select:focus, +.application.dh-style select:hover { + outline: 2px solid light-dark(#222, #efe6d8); + box-shadow: none; +} +.application.dh-style select option, +.application.dh-style select optgroup { + color: #efe6d8; + background-color: #18162e; + border-radius: 6px; +} +.application.dh-style select:disabled { + opacity: 0.6; + outline: 2px solid transparent; + cursor: not-allowed; +} +.application.dh-style multi-select { + position: relative; + height: 34px; +} +.application.dh-style multi-select .tags { + justify-content: flex-start; + margin: 4px; + height: inherit; +} +.application.dh-style multi-select .tags .tag { + padding: 0.3rem 0.5rem; + color: light-dark(#18162e, #f3c267); + background-color: light-dark(#18162e10, #f3c26740); + font-family: 'Montserrat', sans-serif; + border-radius: 3px; + transition: 0.13s ease-out; + gap: 0.5rem; + z-index: 1; +} +.application.dh-style multi-select .tags .tag .remove { + font-size: 10px; +} +.application.dh-style multi-select select { + position: absolute; + height: inherit; + outline: initial; +} +.application.dh-style p { + margin: 0; +} +.application.dh-style ul { + margin: 0; + padding: 0; + list-style: none; +} +.application.dh-style li { + margin: 0; +} +.application.dh-style a:hover, +.application.dh-style a.active { + font-weight: bold; + text-shadow: 0 0 8px light-dark(#18162e, #f3c267); +} +.application.dh-style fieldset { + align-items: center; + margin-top: 5px; + border-radius: 6px; + border-color: light-dark(#18162e, #f3c267); +} +.application.dh-style fieldset.glassy { + background-color: light-dark(#18162e10, #f3c26710); + border-color: transparent; +} +.application.dh-style fieldset.glassy legend { + padding: 2px 12px; + border-radius: 3px; + background-color: light-dark(#18162e, #f3c267); + color: light-dark(#efe6d8, #18162e); +} +.application.dh-style fieldset.fit-height { + height: 95%; +} +.application.dh-style fieldset.flex { + display: flex; + gap: 20px; +} +.application.dh-style fieldset.flex.wrap { + flex-wrap: wrap; + gap: 10px 20px; +} +.application.dh-style fieldset.flex .inline-child { + flex: 1; +} +.application.dh-style fieldset .list-w-img { + padding: 5px; +} +.application.dh-style fieldset .list-w-img label { + flex: 1; +} +.application.dh-style fieldset .list-w-img img { + width: 2rem; + height: 2rem; +} +.application.dh-style fieldset.one-column { + display: flex; + flex-direction: column; + align-items: start; + gap: 10px; + min-height: 64px; + flex: 1; +} +.application.dh-style fieldset.one-column > .one-column { + width: 100%; +} +.application.dh-style fieldset.two-columns { + display: grid; + grid-template-columns: 1fr 2fr; + gap: 10px; +} +.application.dh-style fieldset.two-columns.even { + grid-template-columns: 1fr 1fr; +} +.application.dh-style fieldset.two-columns .full-width { + grid-column: span 2; +} +.application.dh-style fieldset legend { + font-family: 'Montserrat', sans-serif; + font-weight: bold; + color: light-dark(#18162e, #f3c267); +} +.application.dh-style fieldset input[type='text'], +.application.dh-style fieldset input[type='number'] { + color: light-dark(#222, #efe6d8); + font-family: 'Montserrat', sans-serif; + transition: all 0.3s ease; + outline: 2px solid transparent; +} +.application.dh-style fieldset input[type='text']:focus, +.application.dh-style fieldset input[type='number']:focus, +.application.dh-style fieldset input[type='text']:hover, +.application.dh-style fieldset input[type='number']:hover { + outline: 2px solid light-dark(#222, #efe6d8); +} +.application.dh-style fieldset[disabled], +.application.dh-style fieldset.child-disabled .form-group, +.application.dh-style fieldset select[disabled], +.application.dh-style fieldset input[disabled] { + opacity: 0.5; +} +.application.dh-style fieldset.child-disabled .form-group { + pointer-events: none; +} +.application.dh-style fieldset .nest-inputs { + display: flex; + align-items: center; + width: 100%; + gap: 5px; +} +.application.dh-style fieldset .nest-inputs .btn { + padding-top: 15px; +} +.application.dh-style fieldset .nest-inputs .image { + height: 40px; + width: 40px; + object-fit: cover; + border-radius: 6px; + border: none; +} +.application.dh-style fieldset .nest-inputs > .checkbox { + align-self: end; +} +.application.dh-style fieldset .form-group { + width: 100%; +} +.application.dh-style fieldset .form-group label { + font-family: 'Montserrat', sans-serif; + font-weight: bold; + font-size: smaller; +} +.application.dh-style fieldset .form-group.checkbox { + width: fit-content; + display: flex; + align-items: center; +} +.application.dh-style fieldset .form-group.checkbox .form-fields { + height: 32px; + align-content: center; +} +.application.dh-style fieldset:has(.list-w-img) { + gap: 0; +} +.application.dh-style .two-columns { + display: grid; + grid-template-columns: 1fr 2fr; + gap: 10px; +} +.application.dh-style .two-columns.even { + grid-template-columns: 1fr 1fr; +} +.application.dh-style line-div { + display: block; + height: 1px; + width: 100%; + border-bottom: 1px solid light-dark(#18162e, #f3c267); + mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); +} +.application.dh-style side-line-div { + display: block; + height: 1px; + width: 100%; + border-bottom: 1px solid light-dark(#18162e, #f3c267); + mask-image: linear-gradient(270deg, transparent 0%, black 100%); +} +.application.dh-style side-line-div.invert { + mask-image: linear-gradient(270deg, black 0%, transparent 100%); +} +.application.dh-style .item-description { + opacity: 1; + transform: translateY(0); + grid-column: 1/-1; + transition: + opacity 0.3s ease-out, + transform 0.3s ease-out; +} +.application.dh-style .item-description.invisible { + height: 0; + opacity: 0; + overflow: hidden; + transform: translateY(-20px); + transform-origin: top; +} +.application.dh-style .item-buttons { + grid-column: span 3; + display: flex; + gap: 8px; + flex-wrap: wrap; +} +.application.dh-style .item-buttons button { + white-space: nowrap; +} +.application.setting.dh-style fieldset h2, +.application.setting.dh-style fieldset h3, +.application.setting.dh-style fieldset h4 { + margin: 8px 0 4px; + text-align: center; +} +.application.setting.dh-style fieldset .title-hint { + font-size: 12px; + font-variant: small-caps; + text-align: center; +} +.application.setting.dh-style fieldset .field-section .split-section { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px; +} +.application.setting.dh-style fieldset .label-container { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px; +} +.application.setting.dh-style fieldset .label-container label { + align-self: center; + text-align: center; +} +.application.setting.dh-style footer { + margin-top: 8px; + display: flex; + gap: 8px; +} +.application.setting.dh-style footer button { + flex: 1; +} +.application.setting.dh-style .form-group { + display: flex; + justify-content: space-between; + align-items: center; +} +.application.setting.dh-style .form-group label { + font-size: 16px; + font-family: 'Montserrat', sans-serif; +} +.application.setting.dh-style .form-group .form-fields { + display: flex; + gap: 4px; + align-items: center; +} +.system-daggerheart .tagify { + background: light-dark(transparent, transparent); + border: 1px solid light-dark(#222, #efe6d8); + height: 34px; + --tags-disabled-bg: none; + --tags-border-color: none; + --tags-hover-border-color: none; + --tags-focus-border-color: none; + --tag-border-radius: 3px; + --tag-bg: light-dark(#18162e, #f3c267); + --tag-remove-btn-color: light-dark(#18162e, #f3c267); + --tag-hover: light-dark(#18162e, #f3c267); + --tag-text-color: light-dark(#efe6d8, #222); + --tag-text-color--edit: light-dark(#efe6d8, #222); + --tag-pad: 0.3em 0.5em; + --tag-inset-shadow-size: 1.2em; + --tag-invalid-color: #d39494; + --tag-invalid-bg: rgba(211, 148, 148, 0.5); + --tag--min-width: 1ch; + --tag--max-width: 100%; + --tag-hide-transition: 0.3s; + --tag-remove-bg: light-dark(#18162e40, #f3c26740); + --tag-remove-btn-color: light-dark(#efe6d8, #222); + --tag-remove-btn-bg: none; + --tag-remove-btn-bg--hover: light-dark(#efe6d8, #222); + --input-color: inherit; + --placeholder-color: light-dark(#efe6d815, #22222215); + --placeholder-color-focus: light-dark(#efe6d815, #22222215); + --loader-size: 0.8em; + --readonly-striped: 1; + border-radius: 3px; + margin-right: 1px; +} +.system-daggerheart .tagify tag div { + display: flex; + justify-content: space-between; + align-items: center; + height: 22px; +} +.system-daggerheart .tagify tag div span { + font-weight: 400; +} +.system-daggerheart .tagify tag div img { + margin-left: 8px; + height: 20px; + width: 20px; +} +.system-daggerheart .tagify__dropdown { + border: 1px solid light-dark(#222, #efe6d8) !important; + font-family: 'Montserrat', sans-serif; + color: light-dark(#222, #efe6d8); +} +.system-daggerheart .tagify__dropdown .tagify__dropdown__wrapper { + background-image: url(../assets/parchments/dh-parchment-dark.png); + background-color: transparent; + border: 0; + color: light-dark(#222, #efe6d8); +} +.system-daggerheart .tagify__dropdown .tagify__dropdown__wrapper .tagify__dropdown__item--active { + background-color: light-dark(#222, #efe6d8); + color: light-dark(#efe6d8, #222); +} +.system-daggerheart.theme-light .tagify__dropdown .tagify__dropdown__wrapper { + background-image: url(../assets/parchments/dh-parchment-light.png); +} +.theme-light .application.sheet.dh-style button.glow { + animation: glow-dark 0.75s infinite alternate; +} +.theme-light .application .component.dh-style.card-preview-container { + background-image: url('../assets/parchments/dh-parchment-light.png'); +} +.theme-light .application .component.dh-style.card-preview-container .preview-text-container { + background-image: url(../assets/parchments/dh-parchment-dark.png); +} +.theme-light .application .component.dh-style.card-preview-container .preview-selected-icon-container { + background-image: url(../assets/parchments/dh-parchment-dark.png); + color: var(--color-light-5); +} +.application .component.dh-style.card-preview-container { + position: relative; + border-radius: 6px; + border: 2px solid var(--color-tabs-border); + display: flex; + flex-direction: column; + aspect-ratio: 0.75; + background-image: url('../assets/parchments/dh-parchment-dark.png'); +} +.application .component.dh-style.card-preview-container.selectable { + cursor: pointer; +} +.application .component.dh-style.card-preview-container.disabled { + pointer-events: none; + opacity: 0.4; +} +.application .component.dh-style.card-preview-container .preview-image-outer-container { + position: relative; + display: flex; + align-items: center; + justify-content: center; +} +.application .component.dh-style.card-preview-container .preview-image-container { + flex: 1; + border-radius: 4px 4px 0 0; +} +.application .component.dh-style.card-preview-container .preview-text-container { + flex: 1; + border-radius: 0 0 4px 4px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: 18px; + text-align: center; + color: var(--color-text-selection-bg); + background-image: url(../assets/parchments/dh-parchment-light.png); +} +.application .component.dh-style.card-preview-container .preview-empty-container { + pointer-events: none; + position: relative; + display: flex; + align-items: center; + justify-content: center; + flex: 1; +} +.application .component.dh-style.card-preview-container .preview-empty-container .preview-empty-inner-container { + width: 100%; + display: flex; + justify-content: center; +} +.application + .component.dh-style.card-preview-container + .preview-empty-container + .preview-empty-inner-container + .preview-add-icon { + font-size: 48px; +} +.application + .component.dh-style.card-preview-container + .preview-empty-container + .preview-empty-inner-container + .preview-empty-subtext { + position: absolute; + top: 10%; + font-size: 18px; + font-variant: small-caps; + text-align: center; +} +.application .component.dh-style.card-preview-container .preview-selected-icon-container { + 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); +} +.application .component.dh-style.card-preview-container .preview-selected-icon-container i { + position: relative; + right: 2px; +} diff --git a/styles/less/global/elements.less b/styles/less/global/elements.less index 03772bfb..29a2c1dd 100755 --- a/styles/less/global/elements.less +++ b/styles/less/global/elements.less @@ -15,6 +15,10 @@ color: light-dark(@dark-blue, @golden); border: 1px solid light-dark(@dark, @beige); + &::placeholder { + color: light-dark(@dark-40, @beige-50); + } + &:hover[type='text'], &:hover[type='number'], &:focus[type='text'], @@ -35,15 +39,34 @@ } } - input[type='checkbox'] { + input[type='checkbox'], + input[type='radio'] { &:checked::after { color: light-dark(@dark, @golden); } &:checked::before { - color: light-dark(transparent, @dark-blue); + color: light-dark(@dark-40, @golden-40); } &::before { - color: light-dark(@dark, @beige); + color: light-dark(@dark-40, @golden-40); + } + } + + input[type='range'] { + &::-webkit-slider-runnable-track { + background: light-dark(@dark-blue-40, @golden-40); + } + &::-moz-range-track { + background: light-dark(@dark-blue-40, @golden-40); + } + &::-webkit-slider-thumb { + background: light-dark(@dark-blue, @golden); + border: none; + border-radius: 50%; + + &:hover { + box-shadow: 0 0 8px light-dark(@dark-blue, @golden); + } } } @@ -103,6 +126,35 @@ } } + multi-select { + position: relative; + height: 34px; + .tags { + justify-content: flex-start; + margin: 4px; + height: inherit; + .tag { + padding: 0.3rem 0.5rem; + color: light-dark(@dark-blue, @golden); + background-color: light-dark(@dark-blue-10, @golden-40); + font-family: @font-body; + border-radius: 3px; + transition: 0.13s ease-out; + gap: 0.5rem; + z-index: 1; + + .remove { + font-size: 10px; + } + } + } + select { + position: absolute; + height: inherit; + outline: initial; + } + } + p { margin: 0; } @@ -266,6 +318,31 @@ } } + .scalable-input { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + + .form-group { + width: fit-content; + .nest-inputs { + width: fit-content; + } + } + + label { + font-family: @font-body; + font-size: 14px; + font-weight: 400; + + &.modifier-label { + width: 6ch; + text-align: end; + } + } + } + &:has(.list-w-img) { gap: 0; } @@ -319,6 +396,17 @@ transform: translateY(-20px); transform-origin: top; } + + .item-buttons { + grid-column: span 3; + display: flex; + gap: 8px; + flex-wrap: wrap; + + button { + white-space: nowrap; + } + } } .application.setting.dh-style { @@ -372,6 +460,7 @@ label { font-size: 16px; + font-family: @font-body; } .form-fields { @@ -388,6 +477,34 @@ border: 1px solid light-dark(@dark, @beige); height: 34px; + // tagify rule styles + --tags-disabled-bg: none; + --tags-border-color: none; + --tags-hover-border-color: none; + --tags-focus-border-color: none; + --tag-border-radius: 3px; + --tag-bg: light-dark(@dark-blue, @golden); + --tag-remove-btn-color: light-dark(@dark-blue, @golden); + --tag-hover: light-dark(@dark-blue, @golden); + --tag-text-color: light-dark(@beige, @dark); + --tag-text-color--edit: light-dark(@beige, @dark); + --tag-pad: 0.3em 0.5em; + --tag-inset-shadow-size: 1.2em; + --tag-invalid-color: #d39494; + --tag-invalid-bg: rgba(211, 148, 148, 0.5); + --tag--min-width: 1ch; + --tag--max-width: 100%; + --tag-hide-transition: 0.3s; + --tag-remove-bg: light-dark(@dark-blue-40, @golden-40); + --tag-remove-btn-color: light-dark(@beige, @dark); + --tag-remove-btn-bg: none; + --tag-remove-btn-bg--hover: light-dark(@beige, @dark); + --input-color: inherit; + --placeholder-color: light-dark(@beige-15, @dark-15); + --placeholder-color-focus: light-dark(@beige-15, @dark-15); + --loader-size: 0.8em; + --readonly-striped: 1; + border-radius: 3px; margin-right: 1px; @@ -413,30 +530,27 @@ .tagify__dropdown { border: 1px solid light-dark(@dark, @beige) !important; + font-family: @font-body; + color: light-dark(@dark, @beige); .tagify__dropdown__wrapper { background-image: url(../assets/parchments/dh-parchment-dark.png); background-color: transparent; border: 0; + color: light-dark(@dark, @beige); .tagify__dropdown__item--active { background-color: light-dark(@dark, @beige); - color: var(--color-dark-3); + color: light-dark(@beige, @dark); } } } &.theme-light { .tagify__dropdown { - color: black; - .tagify__dropdown__wrapper { background-image: url(../assets/parchments/dh-parchment-light.png); } - - .tagify__dropdown__item--active { - color: @beige; - } } } } diff --git a/styles/less/global/index.less b/styles/less/global/index.less new file mode 100644 index 00000000..c37de0c7 --- /dev/null +++ b/styles/less/global/index.less @@ -0,0 +1,16 @@ +@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 './tab-settings.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 './tab-attachments.less'; diff --git a/styles/less/global/inventory-item.less b/styles/less/global/inventory-item.less index 24e53165..077ae165 100644 --- a/styles/less/global/inventory-item.less +++ b/styles/less/global/inventory-item.less @@ -1,78 +1,168 @@ @import '../utils/colors.less'; @import '../utils/fonts.less'; +.theme-light .application.daggerheart.dh-style { + .inventory-item, + .card-item { + .item-resource .item-dice-resource { + img { + filter: brightness(0) saturate(100%); + } + } + } +} + +.appTheme({}, { + .inventory-item-header .img-portait .roll-img { + filter: invert(1); + } +}); + .application.daggerheart.dh-style { .inventory-item { - display: grid; - grid-template-columns: 40px 1fr 60px; - gap: 10px; width: 100%; + list-style-type: none; - .item-img { - height: 40px; - width: 40px; - border-radius: 3px; - border: none; - cursor: pointer; - object-fit: cover; - - &.actor-img { - border-radius: 50%; - } - } - - .item-label { - font-family: @font-body; - align-self: center; - - .item-name { - font-size: 14px; - } - - .item-tags, - .item-labels { - display: flex; - gap: 10px; - - .tag { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - padding: 3px 5px; - font-size: 12px; - - background: light-dark(@dark-15, @beige-15); - border: 1px solid light-dark(@dark, @beige); - border-radius: 3px; + &:hover { + .inventory-item-header .img-portait { + .roll-img { + opacity: 1; } - - .label { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - font-size: 12px; - gap: 4px; + .item-img { + opacity: 0; } } } - .controls { + .inventory-item-header { display: flex; align-items: center; - justify-content: end; - gap: 8px; + gap: 10px; + cursor: pointer; - a { - text-align: center; + .img-portait { + flex: 0 0 40px; + height: 40px; + cursor: pointer; + position: relative; - &.unequipped { - opacity: 0.4; + .item-img, + .roll-img { + position: absolute; + transition: opacity 300ms ease-in; + } + + .roll-img { + opacity: 0; + } + } + + .item-label { + flex: 1; + font-family: @font-body; + align-self: center; + + .item-name { + font-size: 14px; + } + + .item-tags, + .item-labels { + display: flex; + gap: 10px; + + .tag, + .label { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-size: 12px; + } + + .tag { + padding: 3px 5px; + background: light-dark(@dark-15, @beige-15); + border: 1px solid light-dark(@dark, @beige); + border-radius: 3px; + } + + .label { + gap: 4px; + } + } + } + + .item-resource { + flex: 0 0 60px; + display: flex; + align-items: center; + gap: 4px; + } + .controls { + flex: 0 0 auto; + display: flex; + align-items: center; + justify-content: end; + gap: 8px; + } + } + + .inventory-item-content { + > *:not(:last-child) { + margin-bottom: 5px; + } + &.extensible { + display: grid; + grid-template-rows: 0fr; + transition: grid-template-rows 0.3s ease-in-out; + &.extended { + grid-template-rows: 1fr; + } + .invetory-description { + overflow: hidden; + } + } + .item-resources { + display: flex; + align-items: center; + gap: 4px; + .item-dice-resource { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 26px; + + label, + i { + position: absolute; + z-index: 2; + cursor: pointer; + } + + label { + color: light-dark(white, black); + filter: drop-shadow(0 0 1px light-dark(@dark-blue, @golden)); + font-size: 18px; + } + + img { + filter: brightness(0) saturate(100%) invert(97%) sepia(7%) saturate(580%) hue-rotate(332deg) + brightness(96%) contrast(95%); + } + + i { + text-shadow: 0 0 3px white; + filter: drop-shadow(0 1px white); + color: black; + font-size: 26px; + } } } } } + .card-item { position: relative; height: 120px; @@ -84,11 +174,27 @@ &:hover { .card-label { padding-top: 15px; - .controls { + .menu { opacity: 1; visibility: visible; transition: all 0.3s ease; max-height: 16px; + + &.resource-menu { + max-height: 55px; + + &.dice-menu { + max-height: 118px; + + .item-resources { + flex-wrap: wrap; + } + + .item-resource { + width: unset; + } + } + } } } } @@ -97,6 +203,7 @@ height: 100%; width: 100%; object-fit: cover; + border-radius: 6px; } .card-label { @@ -123,15 +230,89 @@ color: @beige; } - .controls { + .menu { display: flex; - gap: 15px; - align-items: center; + flex-direction: column; + gap: 8px; max-height: 0px; opacity: 0; visibility: collapse; transition: all 0.3s ease; color: @beige; + + .controls { + display: flex; + gap: 2px; + gap: 15px; + justify-content: center; + } + } + } + + .item-resources { + width: 92px; + } + + .item-resource { + width: 92px; + } + } + + .inventory-item, + .card-item { + .item-resources { + display: flex; + gap: 4px; + + .resource-edit { + font-size: 14px; + } + } + + .item-resource { + display: flex; + align-items: center; + justify-content: end; + gap: 4px; + + i { + flex: none; + font-size: 14px; + } + + input { + flex: 1; + text-align: center; + } + + .item-dice-resource { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 26px; + + label { + position: absolute; + color: light-dark(white, black); + filter: drop-shadow(0 0 1px light-dark(@dark-blue, @golden)); + z-index: 2; + font-size: 18px; + cursor: pointer; + } + + img { + filter: brightness(0) saturate(100%) invert(97%) sepia(7%) saturate(580%) hue-rotate(332deg) + brightness(96%) contrast(95%); + } + + i { + position: absolute; + text-shadow: 0 0 3px white; + filter: drop-shadow(0 1px white); + color: black; + font-size: 26px; + } } } } diff --git a/styles/less/global/sheet.less b/styles/less/global/sheet.less index 1e44d7a0..1a00239a 100755 --- a/styles/less/global/sheet.less +++ b/styles/less/global/sheet.less @@ -4,8 +4,8 @@ // Theme handling .appTheme({ - background: @semi-transparent-dark-blue; - backdrop-filter: blur(9px); + background: @dark-blue-60; + backdrop-filter: blur(10px); }, { background: url('../assets/parchments/dh-parchment-light.png') no-repeat center; }); @@ -44,6 +44,8 @@ top: -36px; min-height: -webkit-fill-available; transition: opacity 0.3s ease; + padding-bottom: 20px; + margin-bottom: -36px; .tab { padding: 0 10px; diff --git a/styles/less/global/tab-attachments.less b/styles/less/global/tab-attachments.less new file mode 100644 index 00000000..04a9f49e --- /dev/null +++ b/styles/less/global/tab-attachments.less @@ -0,0 +1,7 @@ +.daggerheart.dh-style { + .tab.attachments { + .attached-items { + width: 100%; + } + } +} diff --git a/styles/less/global/tab-navigation.less b/styles/less/global/tab-navigation.less index 2880711d..014da89f 100755 --- a/styles/less/global/tab-navigation.less +++ b/styles/less/global/tab-navigation.less @@ -7,12 +7,22 @@ height: 40px; width: 100%; - .feature-tab { - border: none; + .navigation-container { + display: flex; + align-items: center; + gap: 8px; - a { - color: light-dark(@dark-blue, @golden); - font-family: @font-body; + .navigation-inner-container { + flex: 1; + + .feature-tab { + border: none; + + a { + color: light-dark(@dark-blue, @golden); + font-family: @font-body; + } + } } } } diff --git a/styles/less/global/tab-settings.less b/styles/less/global/tab-settings.less new file mode 100644 index 00000000..3d5248be --- /dev/null +++ b/styles/less/global/tab-settings.less @@ -0,0 +1,8 @@ +@import '../utils/colors.less'; +@import '../utils/fonts.less'; + +.sheet.daggerheart.dh-style { + .tab.settings { + margin-bottom: 36px; + } +} diff --git a/styles/less/hud/index.less b/styles/less/hud/index.less new file mode 100644 index 00000000..459f8fd7 --- /dev/null +++ b/styles/less/hud/index.less @@ -0,0 +1 @@ +@import './token-hud/token-hud.less'; diff --git a/styles/less/hud/token-hud/token-hud.less b/styles/less/hud/token-hud/token-hud.less new file mode 100644 index 00000000..7d231e8c --- /dev/null +++ b/styles/less/hud/token-hud/token-hud.less @@ -0,0 +1,10 @@ +.daggerheart.placeable-hud { + .col.right { + .palette { + .palette-category-title { + grid-column: span var(--effect-columns); + font-weight: bold; + } + } + } +} diff --git a/styles/less/items/class.css b/styles/less/items/class.css deleted file mode 100644 index 19f17576..00000000 --- a/styles/less/items/class.css +++ /dev/null @@ -1,132 +0,0 @@ -@font-face { - font-family: 'Cinzel'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/cinzel/v23/8vIU7ww63mVu7gtR-kwKxNvkNOjw-tbnTYo.ttf) format('truetype'); -} -@font-face { - font-family: 'Cinzel'; - font-style: normal; - font-weight: 700; - font-display: swap; - src: url(https://fonts.gstatic.com/s/cinzel/v23/8vIU7ww63mVu7gtR-kwKxNvkNOjw-jHgTYo.ttf) format('truetype'); -} -@font-face { - font-family: 'Cinzel Decorative'; - font-style: normal; - font-weight: 700; - font-display: swap; - src: url(https://fonts.gstatic.com/s/cinzeldecorative/v17/daaHSScvJGqLYhG8nNt8KPPswUAPniZoaelD.ttf) - format('truetype'); -} -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/montserrat/v30/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Ew-.ttf) format('truetype'); -} -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: 600; - font-display: swap; - src: url(https://fonts.gstatic.com/s/montserrat/v30/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCu170w-.ttf) format('truetype'); -} -.application.sheet.daggerheart.dh-style h1 { - font-family: 'Cinzel Decorative', serif; - margin: 0; - border: none; - font-weight: normal; -} -.application.sheet.daggerheart.dh-style h2, -.application.sheet.daggerheart.dh-style h3 { - font-family: 'Cinzel', serif; - margin: 0; - border: none; - font-weight: normal; -} -.application.sheet.daggerheart.dh-style h4 { - font-family: 'Montserrat', sans-serif; - font-size: 14px; - border: none; - font-weight: 700; - margin: 0; - text-shadow: none; - color: #f3c267; - font-weight: normal; -} -.application.sheet.daggerheart.dh-style h5 { - font-size: 14px; - color: #f3c267; - margin: 0; - font-weight: normal; -} -.application.sheet.daggerheart.dh-style p, -.application.sheet.daggerheart.dh-style span { - font-family: 'Montserrat', sans-serif; -} -.application.sheet.daggerheart.dh-style small { - font-family: 'Montserrat', sans-serif; - opacity: 0.8; -} -.application.sheet.daggerheart.dh-style.class .tagify { - background: light-dark(transparent, transparent); - border: 1px solid light-dark(#222, #efe6d8); - height: 34px; - border-radius: 3px; - margin-right: 1px; -} -.application.sheet.daggerheart.dh-style.class .tagify tag div { - display: flex; - justify-content: space-between; - align-items: center; - height: 22px; -} -.application.sheet.daggerheart.dh-style.class .tagify tag div span { - font-weight: 400; -} -.application.sheet.daggerheart.dh-style.class .tagify tag div img { - margin-left: 8px; - height: 20px; - width: 20px; -} -.application.sheet.daggerheart.dh-style.class .tab.settings .fieldsets-section { - display: grid; - gap: 10px; - grid-template-columns: 1fr 1.5fr 1.5fr; -} -.application.sheet.daggerheart.dh-style.class .tab.settings .list-items { - margin-bottom: 10px; - width: 100%; -} -.application.sheet.daggerheart.dh-style.class .tab.settings .list-items:last-child { - margin-bottom: 0px; -} -.application.sheet.daggerheart.dh-style.class .tab.settings .list-items .item-line { - display: grid; - align-items: center; - gap: 10px; - grid-template-columns: 1fr 3fr 1fr; -} -.application.sheet.daggerheart.dh-style.class .tab.settings .list-items .item-line h4 { - font-family: 'Montserrat', sans-serif; - font-weight: lighter; - color: light-dark(#222, #efe6d8); -} -.application.sheet.daggerheart.dh-style.class .tab.settings .list-items .item-line .image { - height: 40px; - width: 40px; - object-fit: cover; - border-radius: 6px; - border: none; -} -.application.sheet.daggerheart.dh-style.class .tab.settings .list-items .item-line .controls { - display: flex; - justify-content: center; - gap: 10px; -} -.application.sheet.daggerheart.dh-style.class .tab.settings .list-items .item-line .controls a { - text-shadow: none; -} diff --git a/styles/less/applications/adversary-settings/experiences.less b/styles/less/sheets-settings/adversary-settings/experiences.less similarity index 95% rename from styles/less/applications/adversary-settings/experiences.less rename to styles/less/sheets-settings/adversary-settings/experiences.less index 36fe85cb..05595ed4 100644 --- a/styles/less/applications/adversary-settings/experiences.less +++ b/styles/less/sheets-settings/adversary-settings/experiences.less @@ -1,28 +1,29 @@ -@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%; + height: 38px; + 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/applications/adversary-settings/features.less b/styles/less/sheets-settings/adversary-settings/features.less similarity index 97% rename from styles/less/applications/adversary-settings/features.less rename to styles/less/sheets-settings/adversary-settings/features.less index 5798bfa9..037a08ea 100644 --- a/styles/less/applications/adversary-settings/features.less +++ b/styles/less/sheets-settings/adversary-settings/features.less @@ -10,6 +10,7 @@ .add-feature-btn { width: 100%; + height: 38px; margin-bottom: 12px; } diff --git a/styles/less/applications/adversary-settings/sheet.less b/styles/less/sheets-settings/adversary-settings/sheet.less similarity index 95% rename from styles/less/applications/adversary-settings/sheet.less rename to styles/less/sheets-settings/adversary-settings/sheet.less index 5fd80b60..b4b0683b 100644 --- a/styles/less/applications/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/applications/environment-settings/adversaries.less b/styles/less/sheets-settings/environment-settings/adversaries.less similarity index 96% rename from styles/less/applications/environment-settings/adversaries.less rename to styles/less/sheets-settings/environment-settings/adversaries.less index a60314ff..8dc12c87 100644 --- a/styles/less/applications/environment-settings/adversaries.less +++ b/styles/less/sheets-settings/environment-settings/adversaries.less @@ -1,50 +1,51 @@ -@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%; + height: 38px; + 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/applications/environment-settings/features.less b/styles/less/sheets-settings/environment-settings/features.less similarity index 97% rename from styles/less/applications/environment-settings/features.less rename to styles/less/sheets-settings/environment-settings/features.less index e4bb039f..f2a9583a 100644 --- a/styles/less/applications/environment-settings/features.less +++ b/styles/less/sheets-settings/environment-settings/features.less @@ -10,6 +10,7 @@ .add-feature-btn { width: 100%; + height: 38px; margin-bottom: 12px; } diff --git a/styles/less/applications/header.less b/styles/less/sheets-settings/header.less similarity index 96% rename from styles/less/applications/header.less rename to styles/less/sheets-settings/header.less index 209037ef..6ac2663f 100644 --- a/styles/less/applications/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 new file mode 100644 index 00000000..e7818326 --- /dev/null +++ b/styles/less/sheets-settings/index.less @@ -0,0 +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'; diff --git a/styles/less/actors/adversary/actions.less b/styles/less/sheets/actors/adversary/actions.less similarity index 87% rename from styles/less/actors/adversary/actions.less rename to styles/less/sheets/actors/adversary/actions.less index 6ca46e90..8370abc3 100644 --- a/styles/less/actors/adversary/actions.less +++ b/styles/less/sheets/actors/adversary/actions.less @@ -1,5 +1,5 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; .application.sheet.daggerheart.actor.dh-style.adversary { .tab.features { diff --git a/styles/less/actors/adversary/header.less b/styles/less/sheets/actors/adversary/header.less similarity index 93% rename from styles/less/actors/adversary/header.less rename to styles/less/sheets/actors/adversary/header.less index 4b962466..a8646a0a 100644 --- a/styles/less/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/actors/adversary/sheet.less b/styles/less/sheets/actors/adversary/sheet.less similarity index 84% rename from styles/less/actors/adversary/sheet.less rename to styles/less/sheets/actors/adversary/sheet.less index f5507f36..286351c9 100644 --- a/styles/less/actors/adversary/sheet.less +++ b/styles/less/sheets/actors/adversary/sheet.less @@ -1,28 +1,29 @@ -@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%; + padding-bottom: 0; + + .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/actors/adversary/sidebar.less b/styles/less/sheets/actors/adversary/sidebar.less similarity index 94% rename from styles/less/actors/adversary/sidebar.less rename to styles/less/sheets/actors/adversary/sidebar.less index df2ca161..f8a34874 100644 --- a/styles/less/actors/adversary/sidebar.less +++ b/styles/less/sheets/actors/adversary/sidebar.less @@ -1,341 +1,354 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; - -.application.sheet.daggerheart.actor.dh-style.adversary { - .adversary-sidebar-sheet { - width: 275px; - min-width: 275px; - border-right: 1px solid light-dark(@dark-blue, @golden); - background-image: url('../assets/parchments/dh-parchment-dark.png'); - - .theme-light & { - background: transparent; - } - - .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 { + display: flex; + justify-content: center; + position: relative; + width: 100px; + height: 40px; + + .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 { + display: flex; + align-items: center; + flex-direction: column; + + .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/actors/character/biography.less b/styles/less/sheets/actors/character/biography.less similarity index 87% rename from styles/less/actors/character/biography.less rename to styles/less/sheets/actors/character/biography.less index 635cf8d5..e07d7080 100644 --- a/styles/less/actors/character/biography.less +++ b/styles/less/sheets/actors/character/biography.less @@ -1,5 +1,5 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; .application.sheet.daggerheart.actor.dh-style.character { .tab.biography { diff --git a/styles/less/actors/character/features.less b/styles/less/sheets/actors/character/features.less similarity index 83% rename from styles/less/actors/character/features.less rename to styles/less/sheets/actors/character/features.less index 6fc86ac3..c2feb6b1 100644 --- a/styles/less/actors/character/features.less +++ b/styles/less/sheets/actors/character/features.less @@ -1,5 +1,5 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; .application.sheet.daggerheart.actor.dh-style.character { .tab.features { @@ -11,7 +11,7 @@ mask-image: linear-gradient(0deg, transparent 0%, black 5%, black 95%, transparent 100%); padding: 20px 0; padding-top: 10px; - height: 95%; + height: 84%; scrollbar-width: thin; scrollbar-color: light-dark(@dark-blue, @golden) transparent; diff --git a/styles/less/actors/character/header.less b/styles/less/sheets/actors/character/header.less similarity index 95% rename from styles/less/actors/character/header.less rename to styles/less/sheets/actors/character/header.less index 300314da..b80da83d 100644 --- a/styles/less/actors/character/header.less +++ b/styles/less/sheets/actors/character/header.less @@ -1,5 +1,6 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; +@import '../../../utils/mixin.less'; // Theme header backgrounds .appTheme({ @@ -192,5 +193,14 @@ } } } + + .character-downtime-container { + display: flex; + gap: 2px; + + button { + flex: 1; + } + } } } diff --git a/styles/less/actors/character/inventory.less b/styles/less/sheets/actors/character/inventory.less similarity index 90% rename from styles/less/actors/character/inventory.less rename to styles/less/sheets/actors/character/inventory.less index 516b01b0..eac1065d 100644 --- a/styles/less/actors/character/inventory.less +++ b/styles/less/sheets/actors/character/inventory.less @@ -1,5 +1,5 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; .application.sheet.daggerheart.actor.dh-style.character { .tab.inventory { @@ -56,7 +56,7 @@ overflow-y: auto; mask-image: linear-gradient(0deg, transparent 0%, black 5%, black 95%, transparent 100%); padding: 20px 0; - height: 80%; + height: 73%; scrollbar-width: thin; scrollbar-color: light-dark(@dark-blue, @golden) transparent; @@ -65,6 +65,11 @@ .currency-section { display: flex; gap: 10px; + padding: 10px 10px 0; + + input { + color: light-dark(@dark, @beige); + } } } } diff --git a/styles/less/actors/character/loadout.less b/styles/less/sheets/actors/character/loadout.less similarity index 97% rename from styles/less/actors/character/loadout.less rename to styles/less/sheets/actors/character/loadout.less index 72393597..b7863e77 100644 --- a/styles/less/actors/character/loadout.less +++ b/styles/less/sheets/actors/character/loadout.less @@ -1,5 +1,5 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; .application.sheet.daggerheart.actor.dh-style.character { .tab.loadout { @@ -97,7 +97,7 @@ overflow-y: auto; mask-image: linear-gradient(0deg, transparent 0%, black 10%, black 98%, transparent 100%); padding: 20px 0; - height: 90%; + height: 84%; scrollbar-width: thin; scrollbar-color: light-dark(@dark-blue, @golden) transparent; diff --git a/styles/less/actors/character/sheet.less b/styles/less/sheets/actors/character/sheet.less similarity index 80% rename from styles/less/actors/character/sheet.less rename to styles/less/sheets/actors/character/sheet.less index f3e0cd74..3d19a3b2 100644 --- a/styles/less/actors/character/sheet.less +++ b/styles/less/sheets/actors/character/sheet.less @@ -1,5 +1,5 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; .application.sheet.daggerheart.actor.dh-style.character { .window-content { @@ -9,7 +9,8 @@ gap: 15px 0; height: 100%; width: 100%; - overflow: auto; + padding-bottom: 0; + overflow-x: auto; .character-sidebar-sheet { grid-row: 1 / span 2; diff --git a/styles/less/actors/character/sidebar.less b/styles/less/sheets/actors/character/sidebar.less similarity index 62% rename from styles/less/actors/character/sidebar.less rename to styles/less/sheets/actors/character/sidebar.less index 4c637839..2c88d14f 100644 --- a/styles/less/actors/character/sidebar.less +++ b/styles/less/sheets/actors/character/sidebar.less @@ -1,5 +1,6 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; +@import '../../../utils/mixin.less'; // Theme sidebar backgrounds .appTheme({ @@ -69,10 +70,11 @@ justify-content: space-evenly; .status-bar { + display: flex; + justify-content: center; position: relative; width: 100px; height: 40px; - justify-items: center; .status-label { position: relative; @@ -172,8 +174,115 @@ gap: 5px; justify-content: center; + .status-bar.armor-slots { + display: flex; + justify-content: center; + position: relative; + width: 95px; + height: 30px; + + .status-label { + padding: 2px 10px; + position: relative; + top: 30px; + height: 22px; + width: 95px; + border-radius: 3px; + background: light-dark(@dark-blue, @golden); + + h4 { + font-weight: bold; + text-align: center; + line-height: 18px; + color: light-dark(@beige, @dark-blue); + font-size: 12px; + } + } + .status-value { + position: absolute; + display: flex; + padding: 0 6px; + font-size: 1.2rem; + align-items: center; + width: 80px; + height: 30px; + justify-content: center; + text-align: center; + z-index: 2; + color: light-dark(@dark-blue, @beige); + border: 1px solid light-dark(@dark-blue, @golden); + border-bottom: none; + border-radius: 6px 6px 0 0; + + input[type='number'] { + background: transparent; + font-size: 1.2rem; + width: 30px; + height: 20px; + text-align: center; + border: none; + outline: 2px solid transparent; + color: light-dark(@dark-blue, @beige); + + &.bar-input { + padding: 0; + color: light-dark(@dark-blue, @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: 30px; + } + } + + .progress-bar { + position: absolute; + appearance: none; + width: 80px; + height: 30px; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + z-index: 1; + background: light-dark(transparent, @dark-blue); + border-bottom: none; + border-radius: 6px 6px 0 0; + + &::-webkit-progress-bar { + border: none; + background: light-dark(transparent, @dark-blue); + } + &::-webkit-progress-value { + background: @gradient-stress; + } + &.stress-color::-webkit-progress-value { + background: @gradient-stress; + } + &::-moz-progress-bar { + background: @gradient-stress; + } + &.stress-color::-moz-progress-bar { + background: @gradient-stress; + } + } + } + .status-number { - justify-items: center; + display: flex; + align-items: center; + flex-direction: column; + + &.armor-slots { + width: 95px; + } .status-value { position: relative; @@ -190,9 +299,33 @@ background: light-dark(transparent, @dark-blue); z-index: 2; - &.armor-slots { - width: 80px; - height: 30px; + input[type='number'] { + background: transparent; + font-size: 1.2rem; + width: 30px; + height: 20px; + text-align: center; + border: none; + outline: 2px solid transparent; + color: light-dark(@dark-blue, @beige); + + &.bar-input { + padding: 0; + color: light-dark(@dark-blue, @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: 30px; } } diff --git a/styles/less/actors/companion/details.less b/styles/less/sheets/actors/companion/details.less similarity index 92% rename from styles/less/actors/companion/details.less rename to styles/less/sheets/actors/companion/details.less index 4da8d126..2e76cf44 100644 --- a/styles/less/actors/companion/details.less +++ b/styles/less/sheets/actors/companion/details.less @@ -1,9 +1,10 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; .application.sheet.daggerheart.actor.dh-style.companion { .partner-section, - .attack-section { + .attack-section, + .experience-list { display: flex; flex-direction: column; align-items: center; @@ -12,6 +13,7 @@ display: flex; gap: 15px; align-items: center; + width: 100%; h3 { font-size: 20px; diff --git a/styles/less/actors/companion/header.less b/styles/less/sheets/actors/companion/header.less similarity index 96% rename from styles/less/actors/companion/header.less rename to styles/less/sheets/actors/companion/header.less index daa20e93..b343146f 100644 --- a/styles/less/actors/companion/header.less +++ b/styles/less/sheets/actors/companion/header.less @@ -1,5 +1,5 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; .application.sheet.daggerheart.actor.dh-style.companion { .companion-header-sheet { @@ -45,7 +45,9 @@ justify-content: center; .status-number { - justify-items: center; + display: flex; + flex-direction: column; + align-items: center; .status-value { position: relative; @@ -85,10 +87,11 @@ } .status-bar { + display: flex; + justify-content: center; position: relative; width: 100px; height: 40px; - justify-items: center; .status-label { position: relative; diff --git a/styles/less/actors/companion/sheet.less b/styles/less/sheets/actors/companion/sheet.less similarity index 52% rename from styles/less/actors/companion/sheet.less rename to styles/less/sheets/actors/companion/sheet.less index 22c5fc0b..f31679ba 100644 --- a/styles/less/actors/companion/sheet.less +++ b/styles/less/sheets/actors/companion/sheet.less @@ -1,3 +1,5 @@ +@import '../../../utils/mixin.less'; + // Theme header backgrounds .appTheme({ &.companion { @@ -8,15 +10,3 @@ background: url('../assets/parchments/dh-parchment-light.png'); } }); - -.application.sheet.daggerheart.actor.dh-style.companion { - // .profile { - // height: 80px; - // width: 80px; - // } - - // .temp-container { - // position: relative; - // top: 32px; - // } -} diff --git a/styles/less/actors/environment/header.less b/styles/less/sheets/actors/environment/header.less similarity index 94% rename from styles/less/actors/environment/header.less rename to styles/less/sheets/actors/environment/header.less index fce7943f..1276b276 100644 --- a/styles/less/actors/environment/header.less +++ b/styles/less/sheets/actors/environment/header.less @@ -1,140 +1,142 @@ -@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 { + display: flex; + align-items: center; + flex-direction: column; + + .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/actors/environment/sheet.less b/styles/less/sheets/actors/environment/sheet.less similarity index 80% rename from styles/less/actors/environment/sheet.less rename to styles/less/sheets/actors/environment/sheet.less index 733f105e..74cec028 100644 --- a/styles/less/actors/environment/sheet.less +++ b/styles/less/sheets/actors/environment/sheet.less @@ -1,5 +1,6 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; +@import '../../../utils/mixin.less'; .appTheme({ &.environment { diff --git a/styles/less/sheets/index.less b/styles/less/sheets/index.less new file mode 100644 index 00000000..3470de37 --- /dev/null +++ b/styles/less/sheets/index.less @@ -0,0 +1,24 @@ +@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/beastform.less'; +@import './items/class.less'; +@import './items/domain-card.less'; +@import './items/feature.less'; diff --git a/styles/less/sheets/items/beastform.less b/styles/less/sheets/items/beastform.less new file mode 100644 index 00000000..162c4925 --- /dev/null +++ b/styles/less/sheets/items/beastform.less @@ -0,0 +1,9 @@ +.application.sheet.daggerheart.dh-style.beastform { + .settings.tab { + .advantage-on-section { + display: flex; + flex-direction: column; + margin-top: 10px; + } + } +} diff --git a/styles/less/items/class.less b/styles/less/sheets/items/class.less similarity index 94% rename from styles/less/items/class.less rename to styles/less/sheets/items/class.less index f8004d31..d32f60d6 100644 --- a/styles/less/items/class.less +++ b/styles/less/sheets/items/class.less @@ -1,5 +1,5 @@ -@import '../utils/colors.less'; -@import '../utils/fonts.less'; +@import '../../utils/colors.less'; +@import '../../utils/fonts.less'; .application.sheet.daggerheart.dh-style.class { .tab.settings { diff --git a/styles/less/items/domainCard.less b/styles/less/sheets/items/domain-card.less similarity index 77% rename from styles/less/items/domainCard.less rename to styles/less/sheets/items/domain-card.less index 93c00558..a784b3a2 100644 --- a/styles/less/items/domainCard.less +++ b/styles/less/sheets/items/domain-card.less @@ -1,5 +1,5 @@ -@import '../utils/colors.less'; -@import '../utils/fonts.less'; +@import '../../utils/colors.less'; +@import '../../utils/fonts.less'; .application.sheet.daggerheart.dh-style.domain-card { section.tab { diff --git a/styles/less/items/feature.less b/styles/less/sheets/items/feature.less old mode 100755 new mode 100644 similarity index 84% rename from styles/less/items/feature.less rename to styles/less/sheets/items/feature.less index c27cfb65..b7493f15 --- a/styles/less/items/feature.less +++ b/styles/less/sheets/items/feature.less @@ -1,5 +1,5 @@ -@import '../utils/colors.less'; -@import '../utils/fonts.less'; +@import '../../utils/colors.less'; +@import '../../utils/fonts.less'; .application.sheet.daggerheart.dh-style.feature { .item-sheet-header { diff --git a/styles/chat.less b/styles/less/ui/chat/chat.less similarity index 59% rename from styles/chat.less rename to styles/less/ui/chat/chat.less index f454bec7..c2c72d48 100644 --- a/styles/chat.less +++ b/styles/less/ui/chat/chat.less @@ -1,36 +1,5 @@ -.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; - } -} +@import '../../utils/colors.less'; +@import '../../utils/spacing.less'; .daggerheart.chat { &.downtime { @@ -52,13 +21,16 @@ fieldset.daggerheart.chat { width: 80px; } - .downtime-refresh-container { - margin-top: @fullMargin; + .action-use-button { width: 100%; + } + } - .refresh-title { - font-weight: bold; - } + &.resource-roll { + .reroll-message { + text-align: center; + font-size: 18px; + margin-bottom: 0; } } @@ -187,6 +159,11 @@ fieldset.daggerheart.chat { } } } + + .damage-resource { + font-weight: 600; + margin-top: 5px; + } } .dice-total { @@ -383,6 +360,7 @@ fieldset.daggerheart.chat { width: 80px; } } + button { &.inner-button { --button-size: 1.25rem; @@ -408,194 +386,3 @@ fieldset.daggerheart.chat { } } } - -.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/chat/sheet.less b/styles/less/ui/chat/sheet.less new file mode 100644 index 00000000..1c41f97e --- /dev/null +++ b/styles/less/ui/chat/sheet.less @@ -0,0 +1,54 @@ +.chat-message { + .duality-modifiers, + .duality-result, + .dice-title { + display: none; + } + + .message-content { + .enriched-effect { + display: flex; + align-items: center; + border: 1px solid black; + width: fit-content; + padding: 0 2px 0 0; + border-radius: 6px; + color: @dark; + background-image: url(../assets/parchments/dh-parchment-light.png); + + &:hover { + text-shadow: none; + } + + span { + white-space: nowrap; + } + } + } +} + +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 new file mode 100644 index 00000000..3de5b432 --- /dev/null +++ b/styles/less/ui/chat/theme-colorful.less @@ -0,0 +1,195 @@ +@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; + flex-wrap: wrap; + .duality-modifier { + padding: 2px; + border-radius: 6px; + border: 1px solid; + background: var(--color-dark-6); + font-size: 12px; + white-space: nowrap; + } + } + .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 new file mode 100644 index 00000000..62da7233 --- /dev/null +++ b/styles/less/ui/combat-sidebar/combat-sidebar.less @@ -0,0 +1,6 @@ +.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 new file mode 100644 index 00000000..ee63a197 --- /dev/null +++ b/styles/less/ui/combat-sidebar/combatant-controls.less @@ -0,0 +1,5 @@ +.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 new file mode 100644 index 00000000..58deaae8 --- /dev/null +++ b/styles/less/ui/combat-sidebar/encounter-controls.less @@ -0,0 +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; + } + } +} diff --git a/styles/less/ui/combat-sidebar/spotlight-control.less b/styles/less/ui/combat-sidebar/spotlight-control.less new file mode 100644 index 00000000..b5efed7a --- /dev/null +++ b/styles/less/ui/combat-sidebar/spotlight-control.less @@ -0,0 +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); + } + } +} diff --git a/styles/less/ui/combat-sidebar/token-actions.less b/styles/less/ui/combat-sidebar/token-actions.less new file mode 100644 index 00000000..6fc84d29 --- /dev/null +++ b/styles/less/ui/combat-sidebar/token-actions.less @@ -0,0 +1,57 @@ +.combat-sidebar { + .token-actions { + align-self: stretch; + display: flex; + 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; + } + + &.inactive { + background: var(--color-warm-2); + color: var(--color-light-1); + cursor: default; + + &:hover { + filter: none; + } + } + } + } + + 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/countdown.less b/styles/less/ui/countdown/countdown.less new file mode 100644 index 00000000..ecc9f1b8 --- /dev/null +++ b/styles/less/ui/countdown/countdown.less @@ -0,0 +1,61 @@ +@import '../../utils/colors.less'; +@import '../../utils/fonts.less'; + +.daggerheart.dh-style.countdown { + fieldset { + align-items: center; + margin-top: 5px; + border-radius: 6px; + border-color: light-dark(@dark-blue, @golden); + + legend { + font-family: @font-body; + font-weight: bold; + color: light-dark(@dark-blue, @golden); + + a { + text-shadow: none; + } + } + } + + .minimized-view { + display: flex; + gap: 8px; + flex-wrap: wrap; + + .mini-countdown-container { + width: fit-content; + display: flex; + align-items: center; + gap: 8px; + border: 2px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + padding: 0 4px 0 0; + background-image: url('../assets/parchments/dh-parchment-light.png'); + color: light-dark(@beige, @dark); + cursor: pointer; + + &.disabled { + cursor: initial; + } + + img { + width: 30px; + height: 30px; + border-radius: 6px 0 0 6px; + } + + .mini-countdown-name { + white-space: nowrap; + } + + .mini-countdown-value { + } + } + } + + .hidden { + display: none; + } +} diff --git a/styles/countdown.less b/styles/less/ui/countdown/sheet.less similarity index 64% rename from styles/countdown.less rename to styles/less/ui/countdown/sheet.less index 336805a9..1692773e 100644 --- a/styles/countdown.less +++ b/styles/less/ui/countdown/sheet.less @@ -1,71 +1,18 @@ -.theme-light { - .daggerheart.dh-style.countdown { +@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; - fieldset { - align-items: center; - margin-top: 5px; - border-radius: 6px; - border-color: light-dark(@dark-blue, @golden); - - legend { - font-family: @font-body; - font-weight: bold; - color: light-dark(@dark-blue, @golden); - - a { - text-shadow: none; - } - } - } - - .minimized-view { - display: flex; - gap: 8px; - flex-wrap: wrap; - - .mini-countdown-container { - width: fit-content; - display: flex; - align-items: center; - gap: 8px; - border: 2px solid light-dark(@dark-blue, @golden); - border-radius: 6px; - padding: 0 4px 0 0; - background-image: url('../assets/parchments/dh-parchment-light.png'); - color: light-dark(@beige, @dark); - cursor: pointer; - - &.disabled { - cursor: initial; - } - - img { - width: 30px; - height: 30px; - border-radius: 6px 0 0 6px; - } - - .mini-countdown-name { - white-space: nowrap; - } - - .mini-countdown-value { - } - } - } - - .hidden { - display: none; - } - .window-content { > div { height: 100%; diff --git a/styles/less/ui/index.less b/styles/less/ui/index.less new file mode 100644 index 00000000..13e578b0 --- /dev/null +++ b/styles/less/ui/index.less @@ -0,0 +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'; diff --git a/styles/ownershipSelection.less b/styles/less/ui/ownership-selection/ownership-selection.less similarity index 94% rename from styles/ownershipSelection.less rename to styles/less/ui/ownership-selection/ownership-selection.less index f0b05937..56fddd4f 100644 --- a/styles/ownershipSelection.less +++ b/styles/less/ui/ownership-selection/ownership-selection.less @@ -1,3 +1,5 @@ +@import '../../utils/colors.less'; + .daggerheart.views.ownership-selection { .ownership-outer-container { display: flex; diff --git a/styles/resources.less b/styles/less/ui/resources/resources.less similarity index 100% rename from styles/resources.less rename to styles/less/ui/resources/resources.less diff --git a/styles/settings.less b/styles/less/ui/settings/settings.less similarity index 96% rename from styles/settings.less rename to styles/less/ui/settings/settings.less index d3e63a2d..580c79ca 100644 --- a/styles/settings.less +++ b/styles/less/ui/settings/settings.less @@ -1,3 +1,5 @@ +@import '../../utils/colors.less'; + .daggerheart.dh-style.setting { fieldset { display: flex; @@ -13,6 +15,10 @@ grid-template-columns: 1fr 1fr; } } + + &.start-align { + align-self: flex-start; + } } .setting-group-field { diff --git a/styles/less/utils/colors.less b/styles/less/utils/colors.less index 57a6b018..622480a7 100755 --- a/styles/less/utils/colors.less +++ b/styles/less/utils/colors.less @@ -25,10 +25,12 @@ @dark-blue-10: #18162e10; @dark-blue-40: #18162e40; @dark-blue-50: #18162e50; +@dark-blue-60: #18162e60; @semi-transparent-dark-blue: rgba(24, 22, 46, 0.33); @dark: #222; @dark-15: #22222215; +@dark-40: #22222240; @deep-black: #0e0d15; @@ -45,6 +47,21 @@ @gradient-hp: linear-gradient(15deg, rgb(70, 20, 10) 0%, rgb(190, 0, 0) 42%, rgb(252, 176, 69) 100%); @gradient-stress: linear-gradient(15deg, rgb(130, 59, 1) 0%, rgb(252, 142, 69) 65%, rgb(190, 0, 0) 100%); +// TODO: Remove this colors section once new chat layout is done +@miss: rgb(255, 0, 0); +@hit: rgb(0, 128, 0); +@positive: #699969; +@secondaryShadow: gold; +@primaryAccent: #778899; +@hope: #ffe760; +@fear: #0032b1; +@fearBackgroundStart: rgba(15, 15, 97, 0.6); +@fearBackgroundEnd: rgba(0, 0, 255, 0.6); +@critical: #430070; +@criticalBackgroundStart: rgba(37, 8, 37, 0.6); +@criticalBackgroundEnd: rgba(128, 0, 128, 0.6); +@primary-color-fear: rgba(9, 71, 179, 0.75); + @keyframes glow { 0% { box-shadow: 0 0 1px 1px @golden; diff --git a/styles/variables/values.less b/styles/less/utils/spacing.less similarity index 100% rename from styles/variables/values.less rename to styles/less/utils/spacing.less diff --git a/styles/less/ux/autocomplete/autocomplete.less b/styles/less/ux/autocomplete/autocomplete.less new file mode 100644 index 00000000..868b4f43 --- /dev/null +++ b/styles/less/ux/autocomplete/autocomplete.less @@ -0,0 +1,43 @@ +.theme-light .autocomplete { + background-image: url('../assets/parchments/dh-parchment-light.png'); + color: black; +} + +.autocomplete { + padding: 2px; + border-width: 0 1px 1px 1px; + border-style: solid; + border-color: light-dark(@dark, @beige); + border-radius: 6px; + background-image: url('../assets/parchments/dh-parchment-dark.png'); + max-height: 400px !important; + width: fit-content !important; + overflow-y: auto; + font-family: @font-body; + display: flex; + flex-direction: column; + gap: 2px; + + scrollbar-color: light-dark(@dark-blue, @golden) transparent; + + .group { + font-weight: bold; + font-size: 14px; + padding-left: 8px; + } + + li[role='option'] { + font-size: 14px; + padding-left: 10px; + cursor: pointer; + + &:hover { + background-color: light-dark(@dark, @beige); + color: light-dark(@beige, var(--color-dark-3)); + } + + > div { + white-space: nowrap; + } + } +} diff --git a/styles/less/ux/index.less b/styles/less/ux/index.less new file mode 100644 index 00000000..68cfc7e5 --- /dev/null +++ b/styles/less/ux/index.less @@ -0,0 +1,2 @@ +@import './tooltip/tooltip.less'; +@import './autocomplete/autocomplete.less'; diff --git a/styles/less/ux/tooltip/tooltip.less b/styles/less/ux/tooltip/tooltip.less new file mode 100644 index 00000000..e6b660a5 --- /dev/null +++ b/styles/less/ux/tooltip/tooltip.less @@ -0,0 +1,136 @@ +.daggerheart.dh-style.tooltip { + display: flex; + flex-direction: column; + align-items: center; + gap: 4px; + + .tooltip-title-container { + width: 100%; + display: flex; + align-items: center; + gap: 16px; + + .tooltip-image { + height: 40px; + width: 40px; + border-radius: 6px; + border: 1px solid @golden; + } + } + + .tooltip-title { + margin: 0; + text-align: center; + } + + .tooltip-image { + height: 180px; + width: 180px; + } + + .tooltip-description { + font-style: italic; + } + + .tooltip-sub-title { + margin: 0; + color: light-dark(@dark-blue, @beige); + } + + .tooltip-information-section { + width: 100%; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 4px; + + &.triple { + grid-template-columns: 1fr 1fr 1fr; + } + + &.border { + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + padding: 2px; + } + + .tooltip-information { + display: flex; + flex-direction: column; + align-items: center; + gap: 2px; + + &.full-width { + grid-column: span 2; + } + + label { + font-weight: bold; + } + + label, + div { + white-space: nowrap; + } + } + } + + .tooltip-chips { + display: flex; + justify-content: space-around; + flex-wrap: wrap; + gap: 8px; + + .tooltip-chip { + font-size: 18px; + padding: 2px 4px; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + color: light-dark(@dark, @beige); + background-image: url(../assets/parchments/dh-parchment-dark.png); + } + } + + .tooltip-tags { + width: 100%; + display: flex; + flex-direction: column; + gap: 4px; + + .tooltip-tag { + width: 100%; + display: grid; + grid-template-columns: 80px 1fr; + align-items: start; + gap: 8px; + padding: 4px; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + + .tooltip-tag-label-container { + display: flex; + align-items: center; + flex-direction: column; + gap: 2px; + + .tooltip-tag-image { + width: 40px; + height: 40px; + } + } + + .tooltip-tag-label { + font-weight: bold; + text-align: center; + } + + .tooltip-tag-description { + display: flex; + flex-wrap: wrap; + } + } + } + + .spaced { + margin-bottom: 4px; + } +} diff --git a/styles/levelup.less b/styles/levelup.less deleted file mode 100644 index 0f7949ba..00000000 --- a/styles/levelup.less +++ /dev/null @@ -1,271 +0,0 @@ -.theme-light { - .daggerheart.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-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); - } - } - } - - .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; - } - } - } - } - - .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; - } - } - } - - .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; - } - } - } - - .levelup-footer { - display: flex; - } -} diff --git a/styles/pc.less b/styles/pc.less deleted file mode 100644 index c9abd821..00000000 --- a/styles/pc.less +++ /dev/null @@ -1,1519 +0,0 @@ -@import 'variables/values.less'; -@import 'variables/colors.less'; - -.daggerheart.sheet.pc { - width: 810px !important; // Form won't apply height for some reason - - div[data-application-part] { - display: flex; - flex-direction: column; - - .pc-sheet-header { - display: flex; - gap: @halfMargin; - height: 120px; - margin-bottom: @halfMargin; - - .portrait { - border: 0; - border-right: @thinBorder solid var(--color-underline-header); - } - - .class-info { - flex: 1; - background: @primaryAccent; - // -webkit-clip-path: polygon(0 0, 100% 0, calc(100% - 55px) 100%, 0px 100%); - // clip-path: polygon(0 0, 100% 0, calc(100% - 75px) 100%, 0px 100%); - - .portrait { - max-width: 120px; - } - - .class-title { - text-align: center; - display: flex; - justify-content: space-between; - - span:hover { - filter: drop-shadow(0px 0px 3px red); - cursor: pointer; - } - - .domain-container { - margin-left: @halfMargin; - } - } - - .class-add-container { - display: flex; - align-items: center; - justify-content: center; - width: 100%; - flex: 0; - - button { - height: 22px; - width: 22px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - margin-left: @halfMargin; - background: @primaryAccent; - } - } - - .domain-title { - text-transform: uppercase; - display: flex; - flex-direction: column; - align-items: center; - line-height: 23px; - font-weight: bold; - font-style: italic; - } - - .domain-image { - height: 30px; - flex: 0; - } - } - .general-info { - flex: 2; - display: flex; - flex-direction: column; - justify-content: space-between; - - .general-input { - position: relative; - - .general-title { - position: absolute; - left: 4px; - // height: 100%; - text-align: center; - font-weight: bold; - text-transform: uppercase; - } - } - - .pc-tabs { - flex: 1; - margin: 0; - } - - .rest-container { - flex-wrap: nowrap; - display: flex; - height: var(--form-field-height); - flex: 0; - - button { - display: flex; - align-items: center; - justify-content: center; - border-radius: 50%; - width: var(--form-field-height); - - i { - font-size: 13px; - } - } - } - - .level-container { - position: relative; - bottom: 4px; - flex: none; - width: 40px; - border: none; - outline: none; - margin-left: @fullMargin; - - &.levelup { - filter: drop-shadow(0px 0px 3px gold); - } - - img { - height: 40px; - width: 40px; - border: none; - } - - .level-value-container { - width: 48px; - position: absolute; - top: calc(50% - 17px); - left: calc(50% - 23px); - - .level-value { - font-weight: bold; - font-size: 20px; - text-align: center; - &:not(:hover), - &:not(:focus) { - border: none; - } - } - - .levelup-marker { - position: absolute; - top: 0; - right: calc(50% - 12px); - color: gold; - filter: drop-shadow(0px 0px 3px black); - - &.double-digit { - right: calc(50% - 20px); - } - } - } - - .level-title { - position: absolute; - bottom: 2px; - width: 42px; - background-color: black; - color: white; - left: calc(50% - 21px); - text-align: center; - border-radius: 5px; - font-size: 12px; - - &.levelup { - color: gold; - filter: drop-shadow(0px 0px 3px orange); - font-weight: bold; - cursor: pointer; - &:hover { - background-color: aliceblue; - } - } - } - } - } - } - - .sheet-body { - display: flex; - flex-direction: column; - flex: 1; - - .tab-container { - height: 100%; - display: flex; - flex-direction: column; - - .tab-inner-container { - flex: 1; - - .body-section { - display: flex; - flex-direction: column; - - fieldset { - flex: 0; - } - } - } - } - - .system-info { - font-size: 12px; - font-style: italic; - font-weight: bold; - margin-top: -@halfMargin; - flex: 0; - } - - .feature-sheet-body { - gap: @halfMargin; - } - - .abilities-container { - position: relative; - display: flex; - flex-wrap: wrap; - border-radius: 6px; - padding-left: 0; - // flex: 2.5; - - legend { - margin-left: auto; - margin-right: auto; - font-weight: bold; - text-transform: uppercase; - padding: 0 @fullMargin; - position: relative; - } - - .attributes-menu { - position: absolute; - bottom: calc(50% - 12px); - font-size: 24px; - left: -8px; - } - - .attribute { - position: relative; - padding: 0 0 @fullPadding; - display: flex; - flex-direction: column; - align-items: center; - flex-basis: 33.33%; - // flex: 1; - - .attribute-banner { - position: relative; - top: 8px; - z-index: 2; - background: black; - color: white; - text-transform: uppercase; - padding: @smallPadding; - border-radius: 6px; - display: flex; - align-items: center; - overflow: hidden; - min-width: 96px; - - .attribute-roll { - position: absolute; - width: 16px; - transition: transform 0.2s; - - &:hover { - transform: rotate(30deg); - filter: drop-shadow(0px 0px 3px red); - cursor: pointer; - } - } - - .attribute-text { - width: 100%; - margin-left: @largeMargin; - font-size: 12px; - } - } - - .attribute-mark { - height: 23px; - width: 23px; - position: absolute; - right: -5px; - top: 6px; - border: 2px solid black; - border-radius: 50%; - background: white; - z-index: 2; - display: flex; - align-items: center; - justify-content: center; - - &.selectable { - border-color: gold; - filter: drop-shadow(0 0 3px black); - - &:hover i { - opacity: 0.3; - } - } - - & i.selected, - &:hover i.selected { - color: green; - opacity: 1; - } - - i { - color: black; - font-size: 17px; - opacity: 0; - } - } - - .attribute-image { - position: relative; - width: fit-content; - display: flex; - - img { - height: 80px; - width: 80px; - border: none; - } - - .attribute-value { - width: 55px; - padding-right: 10px; - position: absolute; - top: calc(50% - 18px); - left: calc(50% - 24px); - font-weight: bold; - font-size: 30px; - line-height: 30px; - text-align: center; - border: none; - appearance: none; - -moz-appearance: none; - -webkit-appearance: none; - &.negative { - left: calc(50% - 29px); - } - &.unselected { - filter: drop-shadow(0 0 3px @secondaryShadow); - } - } - - .attribute-text { - width: 47px; - position: absolute; - top: calc(50% - 22px); - left: calc(50% - 24px); - font-weight: bold; - font-size: 30px; - text-align: center; - - &.negative { - left: calc(50% - 29px); - } - } - } - - .attribute-verb { - font-variant: petite-caps; - } - } - } - - .defense-row { - height: 100%; - width: 100%; - display: flex; - align-items: baseline; - justify-content: space-evenly; - - .defense-section { - display: flex; - align-items: center; - margin-right: @fullMargin; - - .defense-container { - position: relative; - padding: @fullPadding; - max-width: 100px; - - img { - border: none; - max-width: 80px; - } - - .defense-value { - width: 47px; - position: absolute; - top: calc(50% - 22px); - left: calc(50% - 24px); - font-weight: bold; - font-size: 30px; - text-align: center; - &:not(:hover), - &:not(:focus) { - border: none; - } - } - - .defense-banner { - position: absolute; - bottom: 20px; - left: calc(50% - 42px); - z-index: 2; - background-color: black; - color: white; - width: 84px; - text-align: center; - } - } - } - - .armor-marks { - max-width: 67px; - padding: @fullPadding; - align-self: end; - margin-left: @halfMargin; - - .mark { - width: 16px; - height: 16px; - margin: 0px; - } - - .disabled-mark { - opacity: 0.6; - } - } - } - - .left-main-container { - position: relative; - display: flex; - flex-direction: column; - align-items: flex-start; - border-radius: @normalRadius; - - height: 100px; - width: 100px; - - .legend { - margin-left: auto; - margin-right: auto; - font-weight: bold; - text-transform: uppercase; - padding: 0 @fullPadding; - position: relative; - } - } - - .weapon-section { - padding-top: 8px; - } - - .threshold-container { - position: relative; - display: flex; - align-items: center; - align-self: center; - - .threshold-box { - position: relative; - width: 30px; - height: 30px; - border: @normalBorder solid black; - display: flex; - align-items: center; - justify-content: center; - font-size: 20px; - font-weight: bold; - } - - .threshold-spacer { - position: relative; - z-index: 2; - width: 70px; - height: 18px; - background-color: darkgray; - color: white; - display: flex; - justify-content: center; - align-items: center; - } - } - - .resource-label { - text-transform: uppercase; - font-weight: bold; - } - - .death-save { - position: absolute; - right: -22px; - - &:hover:not(.disabled) { - filter: drop-shadow(0 0 3px @mainShadow); - cursor: pointer; - } - - &.disabled { - opacity: 0.4; - } - } - - .resource-box { - width: 20px; - height: 12px; - - &.stress:nth-child(even) { - position: relative; - right: 1px; - } - - .disabled { - opacity: 0.6; - } - } - - .hope-text { - font-size: 11.7px; - margin-right: 6px; - } - - .hope-container { - background: darkgray; - border-radius: 6px; - display: flex; - padding: @smallPadding 0px; - - .vertical-separator { - border-left: 2px solid white; - height: auto; - margin: @halfMargin 0; - flex: 0; - } - - .hope-inner-container { - position: relative; - - .hope-value { - width: 16px; - height: 16px; - } - - .hope-scar { - position: absolute; - top: calc(50% - 6px); - left: calc(50% - 7px); - opacity: 0.4; - font-size: 12px; - -webkit-transform: scaleX(-1); - transform: scaleX(-1); - } - } - } - - .experience-row { - width: 100%; - display: flex; - align-items: flex-end; - - .experience-selector { - font-size: 18px; - cursor: pointer; - margin-right: @halfMargin; - opacity: 0.5; - - &:hover:not(.selected) { - filter: drop-shadow(0 0 3px gold); - } - - &.selected { - filter: drop-shadow(0 0 3px gold); - opacity: 1; - } - } - - .experience-value { - margin-left: @fullMargin; - width: 30px; - border-bottom: @normalBorder solid black; - border-radius: 4px; - text-align: center; - font-weight: bold; - - &.empty { - border: 0; - } - } - - .disabled-experience { - border: @thinBorder solid @borderTertiary; - background: rgba(0, 0, 0, 0.2); - } - } - .gold-section { - width: calc(100% - 8px); - display: flex; - justify-content: space-between; - - fieldset.gold-fieldset { - padding-right: 0; - padding-left: 0; - padding-bottom: @fullPadding; - - legend { - margin-left: auto; - margin-right: auto; - font-size: 15px; - font-variant: all-petite-caps; - font-weight: bold; - } - - .gold-column { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100%; - gap: @halfMargin; - } - - .gold-row { - display: flex; - align-items: center; - justify-content: center; - padding: 0 @fullPadding; - gap: @tinyMargin; - } - - .gold-row, - .gold-column { - img { - min-width: 14px; - min-height: 14px; - height: 14px; - border: 0; - filter: invert(0%) sepia(100%) saturate(0%) hue-rotate(21deg) brightness(17%) contrast(103%); - - &:hover { - cursor: pointer; - filter: invert(0%) sepia(100%) saturate(0%) hue-rotate(21deg) brightness(17%) - contrast(103%) drop-shadow(0 0 3px @mainShadow); - } - } - - i:hover { - cursor: pointer; - filter: drop-shadow(0 0 3px @mainShadow); - } - - img:not(.owned), - i:not(.owned) { - opacity: 0.4; - } - } - } - } - - .health-category { - text-transform: uppercase; - } - - .class-feature-selectable { - cursor: pointer; - - &:hover { - filter: drop-shadow(0 0 3px @mainShadow); - } - - &.inactive { - opacity: 0.5; - } - } - - .features-container { - width: 100%; - min-height: 136px; - - .feature-container { - display: flex; - align-items: center; - justify-content: space-between; - padding: @fullPadding; - margin-bottom: 0; - - .feature-img { - max-width: 42px; - } - - .feature-label { - font-weight: bold; - font-size: 30px; - } - - button { - flex: 0; - } - } - - .feature-tick-container { - flex: 0; - min-width: 56px; - display: flex; - flex-wrap: wrap; - gap: @fullMargin; - margin: 0 @threeQuarterMargin; - - .feature-tick { - position: relative; - border: @normalBorder solid @borderTertiary; - height: 24px; - border-radius: 50%; - width: 24px; - background: rgba(0, 0, 0, 0.05); - display: flex; - justify-content: center; - - &:hover:not(.disabled):not(.used) { - cursor: pointer; - filter: drop-shadow(0 0 3px @mainShadow); - } - - &.disabled { - opacity: 0.3; - } - - img { - border: 0; - width: 24px; - height: 24px; - filter: invert(17%) sepia(0%) saturate(0%) hue-rotate(19deg) brightness(102%) contrast(84%); - } - - .feature-dice-value { - font-size: 18px; - align-self: center; - } - - &.used::after { - position: absolute; - content: '/'; - color: @borderTertiary; - font-weight: 700; - font-size: 1.7em; - left: 4px; - top: -5px; - transform: rotate(25deg); - font-size: 24.5px; - } - } - } - } - - .feature-input { - border: 0; - border-bottom: @thinBorder solid @borderTertiary; - text-align: center; - height: min-content; - background: inherit; - font-size: 20px; - position: relative; - bottom: 3px; - } - - .editor { - height: 400px; - width: 100%; - } - - .weapons-title { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - - .proficiency-container { - width: 176px; - height: 20px; - position: absolute; - bottom: -15px; - left: calc(50% - 88px); - text-transform: uppercase; - display: flex; - align-items: center; - justify-content: center; - z-index: 1; - clip-path: polygon(11% 100%, 89% 100%, 100% 0%, 0% 0%); - font-size: 10px; - - span { - margin-right: @tinyMargin; - } - - .proficiency-dot { - background: white; - color: white; - font-size: 10px; - padding: 1px; - border-radius: 50%; - - &.marked { - color: black; - } - - &:not(:last-of-type) { - margin-right: @tinyMargin; - } - } - } - } - - .weapons-burden { - position: absolute; - top: -4px; - right: -56px; - display: flex; - align-items: center; - - .weapons-burden-icon { - color: white; - font-size: 22px; - -webkit-text-stroke-width: 1px; - -webkit-text-stroke-color: black; - - &.active { - -webkit-text-stroke-color: rgba(0, 0, 0, 0.05); - color: black; - } - - &.left { - -webkit-transform: scaleX(-1) rotate(20deg); - transform: scaleX(-1) rotate(20deg); - margin-right: 4px; - } - - &.right { - transform: rotate(20deg); - } - } - } - - .armor-container { - display: flex; - align-items: center; - - .active-item-label-chip { - margin-left: @halfMargin; - } - } - - .item-section { - .active-item-container { - display: flex; - flex-direction: column; - width: 100%; - padding: @smallPadding 0px; - - .weapons-label-row { - display: flex; - align-items: center; - - .damage-roll { - width: 24px; - border: none; - margin-left: @halfMargin; - transition: transform 0.2s; - - &:hover { - transform: rotate(30deg); - filter: drop-shadow(0px 0px 3px red); - cursor: pointer; - } - } - } - } - - .active-item-label-chip { - width: 62px; - border: @normalBorder solid black; - border-radius: 6px; - background-color: @primaryAccent; - display: flex; - align-items: center; - justify-content: space-around; - margin-left: @fullPadding; - - img { - height: 20px; - } - - button { - height: 17px; - width: 17px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - background: rgb(122, 121, 113); - border-color: black; - margin: 0; - - &:hover { - background: red; - } - - i { - font-size: 10px; - color: black; - } - } - } - } - - .inventory-armor-section, - .inventory-weapon-section { - width: 100%; - margin-bottom: @fullMargin; - text-transform: uppercase; - - h2 { - width: 100%; - display: flex; - align-items: center; - } - } - - .inventory-legend { - display: flex; - align-items: center; - margin-bottom: @halfMargin; - - .page-selector { - margin-left: 4px; - display: flex; - align-items: center; - - i { - &:hover:not(.disabled) { - cursor: pointer; - filter: drop-shadow(0px 0px 3px red); - } - - &.disabled { - opacity: 0.4; - } - } - } - } - - .inventory-add-button { - position: absolute; - border-radius: 50%; - height: 15px; - width: 15px; - top: -20px; - background: grey; - border-color: black; - right: 6px; - display: flex; - font-size: 13px; - align-items: center; - justify-content: center; - } - - .inventory { - width: 100%; - - .inventory-row { - height: 26px; - border-bottom: @thinBorder solid @borderTertiary; - display: flex; - margin-bottom: @fullMargin; - border-radius: 8px; - - .item-container { - flex-basis: 25%; - margin: 0 @halfMargin @fullMargin; - display: flex; - justify-content: center; - align-items: center; - cursor: pointer; - - &:hover { - filter: drop-shadow(0px 0px 3px red); - } - - .inventory-item { - background: @primaryAccent; - padding: @fullPadding; - border: @thinBorder solid black; - border-radius: 6px; - display: flex; - align-items: center; - - .inventory-item-text { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - flex: 1; - } - - button { - height: 16px; - width: 16px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - flex: 0; - background: @secondaryBackground; - border-color: black; - margin-left: @halfMargin; - - i { - font-size: 12px; - } - } - } - } - } - - .editor { - height: 100px; - } - } - - .inventory-items { - width: 100%; - flex: 1; - display: flex; - flex-direction: column; - justify-content: space-between; - } - - .domain-card-tab { - flex: 1; - - .domain-card-body { - height: 100%; - width: 100%; - padding: @largePadding; - display: flex; - flex-direction: column; - - .card-row { - flex: 1; - display: flex; - } - - .domain-card { - flex: 0; - flex-basis: 33.33%; - margin: @fullMargin; - } - - .loadout-body { - flex: 1; - - .loadout-container { - height: 100%; - display: flex; - flex-direction: column; - gap: @fullMargin; - - .top-card-row { - flex: 1; - display: flex; - justify-content: space-around; - } - - .domain-card.outlined { - border: @normalBorder dotted black; - padding: 0; - margin: @fullMargin; - height: calc(100% - 16px); - display: flex; - flex-direction: column; - align-items: center; - justify-content: space-evenly; - } - } - } - - .vault-container { - display: flex; - flex-wrap: wrap; - overflow-y: auto; - height: 100%; - - .vault-card { - flex: 0; - flex-basis: calc(33.33% - 16px); - margin: 8px; - height: calc(50% - 16px); - min-height: calc(50% - 16px); - } - } - - .domain-card-menu { - flex: 0; - width: 120px; - height: 100%; - border-width: @normalBorder 0 @normalBorder @normalBorder; - border-color: black; - border-style: solid; - - button { - margin-bottom: @tinyMargin; - } - } - } - } - - .loadout-tabs { - border-top: @thinBorder solid @borderPrimary; - border-bottom: @thinBorder solid @borderPrimary; - } - - .abilities-card { - position: relative; - border: @thickBorder solid @secondaryAccent; - border-radius: 6px; - display: flex; - flex-direction: column; - height: 100%; - font-size: 14px; - - .abilities-card-image-container { - position: relative; - // height: 50%; - } - - .abilities-card-image { - width: 100%; - height: 100%; - aspect-ratio: 2; - } - - .abilities-text-container { - flex: 1; - position: relative; - height: 50%; - display: flex; - flex-direction: column; - overflow-y: auto; - padding: 12px 4px 4px; - } - - .abilities-card-level { - position: absolute; - top: 0; - left: 12px; - color: black; - height: 60px; - border: @normalBorder solid orange; - border-top-width: 0; - width: 30px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: space-evenly; - background: grey; - font-size: 20px; - font-weight: bold; - - img { - border: 0; - width: 20px; - } - } - .abilities-card-refresh-cost { - position: absolute; - top: 12px; - right: 12px; - color: white; - width: 30px; - height: 30px; - border: @normalBorder solid orange; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - background: black; - font-size: 14px; - i { - font-size: 11px; - } - } - - .abilities-card-type { - flex: 0; - display: flex; - justify-content: center; - align-items: center; - font-weight: bold; - position: absolute; - left: 0; - text-align: center; - width: 100%; - bottom: -9px; - z-index: 1; - - .abilities-card-type-text { - padding: 0px 4px; - border: 1px solid black; - border-radius: 6px; - background: gold; - } - } - - .abilities-card-title { - flex: 0; - display: flex; - justify-content: center; - align-items: center; - font-weight: bold; - font-size: 18px; - } - - .abilities-card-sub-title { - flex: 0; - display: flex; - justify-content: center; - align-items: center; - font-style: italic; - font-size: 12px; - } - - .abilities-card-spellcast { - flex: 0; - display: flex; - justify-content: center; - align-items: center; - text-transform: uppercase; - font-size: 12px; - - .title { - font-weight: bold; - } - } - - .abilities-card-description { - flex: 0; - font-size: 12px; - margin-bottom: 4px; - } - - .abilities-card-effect { - cursor: pointer; - - &:hover { - background: rgb(47 79 79 / 25%); - } - - > * { - margin-top: 0; - margin-bottom: 0; - } - } - - .abilities-card-abilities { - flex: 1; - display: flex; - flex-direction: column; - gap: 4px; - - .abilities-card-ability { - font-size: 12px; - cursor: pointer; - - &:hover { - background: rgb(47 79 79 / 25%); - } - - > * { - margin: 0; - } - } - } - - &:hover .abilities-card-menu { - height: 40px; - left: 0px; - } - - .abilities-card-menu { - display: flex; - justify-content: center; - align-items: center; - height: 0; - transition: height 0.2s; - overflow: hidden; - position: absolute; - bottom: 0; - z-index: 2; - width: 100%; - background: grey; - - button { - font-weight: bold; - } - } - } - - .heritage-container { - height: 100%; - display: flex; - flex-direction: column; - gap: @fullMargin; - - .card-row { - height: 50%; - display: flex; - justify-content: space-around; - } - - .heritage-card { - flex-basis: 33.33%; - margin: @fullMargin; - display: flex; - align-items: center; - justify-content: center; - - &.outlined { - border: @normalBorder dotted black; - font-size: 25px; - } - } - } - - .empty-ability-container { - height: 100%; - display: flex; - flex-direction: column; - align-items: center; - font-size: 25px; - opacity: 0.7; - - .empty-ability-inner-container { - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - - i { - font-size: 48px; - } - } - } - - .story-container { - gap: @largeMargin; - - .story-fieldset { - border-radius: 6px; - } - - .story-legend { - margin-left: auto; - margin-right: auto; - padding: 0 8px; - font-size: 30px; - font-weight: bold; - } - - .scars-container { - .editor { - height: 240px; - } - } - } - - .inventory-container { - height: 100%; - overflow: auto; - - .inventory-item-list { - list-style-type: none; - padding: 0 @largePadding; - margin-top: 0; - - &.inventory-item-header { - margin-bottom: 0; - } - - .inventory-title-row-container { - display: flex; - align-items: center; - width: 100%; - border-bottom: @thickBorder ridge slategrey; - - .inventory-title-row { - justify-content: space-between; - flex: 1; - } - - .inventory-item-title-container { - flex: 1; - display: flex; - align-items: center; - justify-content: flex-start; - } - - .inventory-item-quantity { - width: 48px; - display: flex; - align-items: center; - margin-right: 96px; // Icon toolbar spacing - } - } - - .inventory-item { - background: crimson; - - &:not(:last-of-type) { - border-bottom: @normalBorder ridge slategrey; - } - - .inventory-item-title-container { - flex: 1; - display: flex; - align-items: center; - justify-content: flex-start; - - .inventory-item-title { - display: flex; - align-items: center; - cursor: pointer; - - &:hover { - filter: drop-shadow(0 0 3px @secondaryShadow); - } - } - } - - .inventory-item-quantity { - width: 60px; - display: flex; - align-items: center; - - &.spaced { - margin-right: 56px; - } - - input { - margin: 0 @tinyMargin; - border: 0; - border-bottom: 2px solid black; - } - - i { - font-size: 20px; - } - } - } - - .inventory-title-row { - font-size: 20px; - font-weight: bold; - display: flex; - align-items: center; - padding: 0 @fullPadding; - } - - .inventory-row { - display: flex; - align-items: center; - padding: @fullPadding; - font-size: 24px; - - .row-icon { - margin-left: @halfMargin; - } - - .active-item { - position: absolute; - font-size: 16px; - left: calc(50% - 8px); - top: calc(50% - 8px); - margin-left: @tinyMargin; - color: crimson; - } - - img { - width: 32px; - } - } - } - } - } - } -} diff --git a/styles/sheets/activeEffect.less b/styles/sheets/activeEffect.less deleted file mode 100644 index 86a29244..00000000 --- a/styles/sheets/activeEffect.less +++ /dev/null @@ -1,5 +0,0 @@ -.application.sheet.daggerheart.dh-style.active-effect-config { - label { - white-space: nowrap; - } -} diff --git a/styles/sheets/class.less b/styles/sheets/class.less deleted file mode 100644 index 09dafcff..00000000 --- a/styles/sheets/class.less +++ /dev/null @@ -1,65 +0,0 @@ -.daggerheart.sheet.class .guide .drop-section { - width: 100%; -} -.daggerheart.sheet.class .guide .drop-section legend { - margin-left: auto; - margin-right: auto; - font-size: 12px; -} -.daggerheart.sheet.class .guide .drop-section .drop-section-body { - min-height: 40px; - display: flex; - flex-direction: column; - align-items: center; -} -.daggerheart.sheet.class .guide .trait-input { - text-align: center; - min-width: 24px; -} -.daggerheart.sheet.class .guide .suggested-item { - border-radius: 6px; - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; -} -.daggerheart.sheet.class .guide .suggested-item img { - width: 30px; -} -.daggerheart.sheet.class .guide .suggested-item div { - text-align: center; -} -.daggerheart.sheet.class .guide .suggested-item i { - border-radius: 50%; - margin-right: 4px; - font-size: 11px; -} -.daggerheart.sheet.class .guide .extra-section { - display: flex; - flex-direction: column; - align-items: center; -} -.daggerheart.sheet.class .guide .extra-section .extra-title { - font-size: 14px; - font-weight: bold; -} -.daggerheart.sheet.class .guide-section-title-centered { - font-weight: bold; - font-size: 18px; -} -.daggerheart.sheet.class .inventory-section { - width: 100%; - border: 2px solid black; - border-style: dotted; - min-height: 80px; -} -.daggerheart.sheet.class .inventory-section .inventory-title { - font-weight: bold; - font-size: 14px; - text-align: center; -} -.daggerheart.sheet.class .domain-section { - display: flex; - align-items: center; - gap: 5px; -} diff --git a/styles/sheets/heritage.less b/styles/sheets/heritage.less deleted file mode 100644 index 84af64bc..00000000 --- a/styles/sheets/heritage.less +++ /dev/null @@ -1,5 +0,0 @@ -.daggerheart.sheet.heritage { - .editor { - height: 200px; - } -} diff --git a/styles/sheets/sheets.less b/styles/sheets/sheets.less deleted file mode 100644 index 5c9b43a1..00000000 --- a/styles/sheets/sheets.less +++ /dev/null @@ -1,185 +0,0 @@ -@import './heritage.less'; -@import './class.less'; -@import './activeEffect.less'; - -.daggerheart.sheet { - .title-container { - display: flex; - gap: @fullMargin; - - div { - flex: 1; - align-items: baseline; - } - } - - .editor-form-group { - display: flex; - flex-direction: column; - - label { - font-weight: bold; - text-align: center; - } - } - - .option-select { - position: absolute; - top: calc(50% - 10px); - right: 8px; - height: 20px; - width: 20px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - padding: 8px; - - &.deeper { - right: 32px; - } - - &:hover:not(:disabled) { - filter: drop-shadow(0px 0px 3px @mainShadow); - cursor: pointer; - } - - i { - margin: 0; - font-size: 11px; - } - } - - .ability-title { - width: 100%; - display: flex; - - h2 { - flex: 1; - } - - i { - cursor: pointer; - - &:hover { - filter: drop-shadow(0px 0px 3px @mainShadow); - } - } - } - - .ability-choices { - display: flex; - align-items: center; - flex-wrap: wrap; - } - - .ability-chip { - border: 2px solid @secondaryAccent; - border-radius: 6px; - display: flex; - align-items: center; - padding: 4px; - margin-bottom: 6px; - flex: calc(33% - 4px); - max-width: calc(33% - 4px); - - &.selected { - filter: drop-shadow(0px 0px 3px @mainShadow); - } - - &:nth-of-type(3n-1) { - margin-left: 6px; - margin-right: 6px; - } - - input { - border: 0; - } - - button { - flex: 0; - border-radius: 50%; - height: 20px; - width: 20px; - display: flex; - align-items: center; - justify-content: center; - margin: 2px 0 2px 4px; - padding: 12px; - - i { - margin: 0; - } - } - } - - .object-select-display { - position: relative; - width: calc(100% - 2px); - background: rgba(0, 0, 0, 0.05); - height: var(--form-field-height); - display: flex; - border: 1px solid rgb(122, 121, 113); - border-radius: 3px; - - .object-select-title { - position: absolute; - left: 4px; - text-align: center; - font-weight: bold; - text-transform: uppercase; - } - - .object-select-text { - align-self: center; - } - - .object-select-item { - cursor: pointer; - &:hover { - filter: drop-shadow(0px 0px 3px red); - } - } - } - - .feature-container { - display: flex; - align-items: center; - justify-content: space-between; - background: @primaryAccent; - padding: 8px; - border: 2px solid black; - border-radius: 6px; - - &:not(:last-child) { - margin-bottom: 8px; - } - - .feature-inner-container { - display: flex; - align-items: center; - - img { - height: 40px; - width: 40px; - margin-right: 8px; - } - - .feature-title { - font-size: 22px; - font-weight: bold; - font-style: italic; - } - } - - button { - height: 40px; - width: 40px; - background: inherit; - border: 0; - - i { - } - } - } -} diff --git a/styles/ui.less b/styles/ui.less deleted file mode 100644 index 09a3511f..00000000 --- a/styles/ui.less +++ /dev/null @@ -1,122 +0,0 @@ -.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; - } - } - - .combatant-controls { - flex: 0; - } - - .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)); - } - } - } - } - - .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); - } - } - - h4 { - margin: 0; - text-align: center; - } -} diff --git a/styles/variables/colors.less b/styles/variables/colors.less deleted file mode 100644 index 0468c1e6..00000000 --- a/styles/variables/colors.less +++ /dev/null @@ -1,37 +0,0 @@ -/* General */ -@advantage: #008000; -@disadvantage: #b30000; -@miss: rgb(255, 0, 0); -@hit: rgb(0, 128, 0); -@positive: #699969; -@negative: #ff7f7f; - -@borderPrimary: #b5b3a4; -@borderTertiary: #7a7971; - -/* Drop Shadows */ -@mainShadow: red; -@secondaryShadow: gold; - -/* Background */ -@secondaryBackground: #7a7971; -@primaryAccent: #778899; -@secondaryAccent: #708090; -@formBackground: #782e22; -@hoverBackground: #2f4f4f40; - -/* Duality */ -@hope: #ffe760; -@hopeBackgroundStart: rgba(0, 0, 0, 0.6); -@hopeBackgroundEnd: rgba(165, 42, 42, 0.6); -@fear: #0032b1; -@fearAccent: #2555cd; -@fearBackgroundStart: rgba(15, 15, 97, 0.6); -@fearBackgroundEnd: rgba(0, 0, 255, 0.6); -@critical: #430070; -@criticalAccent: #66159c; -@criticalBackgroundStart: rgba(37, 8, 37, 0.6); -@criticalBackgroundEnd: rgba(128, 0, 128, 0.6); - -/* Fear */ -@primary-color-fear: rgba(9, 71, 179, 0.75); diff --git a/styles/variables/variables.less b/styles/variables/variables.less deleted file mode 100644 index ef536475..00000000 --- a/styles/variables/variables.less +++ /dev/null @@ -1,2 +0,0 @@ -@import './colors.less'; -@import './values.less'; diff --git a/system.json b/system.json index 7bd337f0..eaef71c1 100644 --- a/system.json +++ b/system.json @@ -9,9 +9,6 @@ "maximum": "13" }, "authors": [ - { - "name": "Darrington Press LLC" - }, { "name": "WBHarry" }, @@ -38,6 +35,12 @@ }, { "name": "Po0lp" + }, + { + "name": "JoaquinP", + "url": "https://github.com/joaquinpereyra98", + "email": "joaquinpereyra98@gmail.com", + "discord": "joaquinp98" } ], "esmodules": ["build/daggerheart.js"], @@ -52,15 +55,6 @@ "private": false, "flags": {} }, - { - "name": "class-features", - "label": "Class Features", - "system": "daggerheart", - "path": "packs/class-features.db", - "type": "Item", - "private": false, - "flags": {} - }, { "name": "subclasses", "label": "Subclasses", @@ -97,15 +91,6 @@ "private": false, "flags": {} }, - { - "name": "community-features", - "label": "Community Features", - "system": "daggerheart", - "path": "packs/community-features.db", - "type": "Item", - "private": false, - "flags": {} - }, { "name": "weapons", "label": "Weapons", @@ -134,10 +119,10 @@ "flags": {} }, { - "name": "general-items", - "label": "General Items", + "name": "miscellaneous", + "label": "Miscellaneous", "system": "daggerheart", - "path": "packs/items/general.db", + "path": "packs/items/miscellaneous.db", "type": "Item", "private": false, "flags": {} @@ -159,6 +144,15 @@ "type": "Item", "private": false, "flags": {} + }, + { + "name": "beastforms", + "label": "Beastforms", + "system": "daggerheart", + "path": "packs/beastforms.db", + "type": "Item", + "private": false, + "flags": {} } ], "packFolders": [ @@ -172,21 +166,13 @@ "name": "Character Options", "sorting": "m", "color": "#000000", - "packs": [ - "classes", - "class-features", - "subclasses", - "domains", - "ancestries", - "communities", - "community-features" - ] + "packs": ["ancestries", "communities", "classes", "subclasses", "domains", "beastforms"] }, { "name": "Items", "sorting": "m", "color": "#000000", - "packs": ["weapons", "armors", "consumables", "general-items"] + "packs": ["armors", "weapons", "consumables", "miscellaneous"] } ] } @@ -207,14 +193,14 @@ "documentTypes": { "Actor": { "character": { - "htmlFields": ["story", "description", "scars.*.description"] + "htmlFields": ["biography.background", "biography.connections"] }, "companion": {}, "adversary": { - "htmlFields": ["description", "motivesAndTactics"] + "htmlFields": ["notes", "description"] }, "environment": { - "htmlFields": ["description", "impulses"] + "htmlFields": ["notes", "description"] } }, "Item": { @@ -264,7 +250,7 @@ "applyEffect": {} } }, - "primaryTokenAttribute": "resources.health", + "primaryTokenAttribute": "resources.hitPoints", "secondaryTokenAttribute": "resources.stress", "url": "https://your/hosted/system/repo/", "manifest": "https://your/hosted/system/repo/system.json", diff --git a/templates/actionTypes/actionType.hbs b/templates/actionTypes/actionType.hbs index fdffaabe..1cd912e9 100644 --- a/templates/actionTypes/actionType.hbs +++ b/templates/actionTypes/actionType.hbs @@ -1,13 +1,12 @@
-
    +
    +

    {{itemName}}

    +
    +
      {{#each types}} -
    • - +
    • + + {{localize name}}
    • {{/each}}
    diff --git a/templates/actionTypes/cost.hbs b/templates/actionTypes/cost.hbs index 515f4968..116fc631 100644 --- a/templates/actionTypes/cost.hbs +++ b/templates/actionTypes/cost.hbs @@ -6,7 +6,7 @@ {{#each source as |cost index|}}
    {{formField ../fields.scalable label="Scalable" value=cost.scalable name=(concat "cost." index ".scalable") classes="checkbox"}} - {{formField ../fields.type choices=(@root.disableOption index ../fields.type.choices ../source) label="Resource" value=cost.type name=(concat "cost." index ".type") localize=true}} + {{formField ../fields.key choices=(@root.disableOption index @root.costOptions ../source) label="Resource" value=cost.key name=(concat "cost." index ".key") localize=true}} {{formField ../fields.value label="Amount" value=cost.value name=(concat "cost." index ".value")}} {{formField ../fields.step label="Step" value=cost.step name=(concat "cost." index ".step") disabled=(not cost.scalable)}} diff --git a/templates/actionTypes/damage.hbs b/templates/actionTypes/damage.hbs index 59519e6d..ad45fc33 100644 --- a/templates/actionTypes/damage.hbs +++ b/templates/actionTypes/damage.hbs @@ -1,12 +1,12 @@
    - Damage + {{localize "DAGGERHEART.GENERAL.damage"}} {{#unless (eq path 'system.attack.')}}{{/unless}} {{#unless (or @root.isNPC path)}} {{#if @root.hasBaseDamage}} - {{formField @root.fields.damage.fields.includeBase value=@root.source.damage.includeBase label="Include Item Damage" name="damage.includeBase" classes="checkbox" }} + {{formField @root.fields.damage.fields.includeBase value=@root.source.damage.includeBase name="damage.includeBase" classes="checkbox" localize=true }} {{/if}} {{/unless}} {{#each source.parts as |dmg index|}} @@ -17,12 +17,27 @@ {{formField ../fields.value.fields.custom.fields.formula value=dmg.value.custom.formula name=(concat ../path "damage.parts." index ".value.custom.formula") localize=true}} {{else}}
    - {{#if @root.isNPC}}{{formField ../fields.value.fields.flatMultiplier value=dmg.value.flatMultiplier name=(concat ../path "damage.parts." index ".value.flatMultiplier") label="Multiplier" classes="inline-child" }}{{/if}} + {{#if @root.isNPC}}{{formField ../fields.value.fields.flatMultiplier value=dmg.value.flatMultiplier name=(concat ../path "damage.parts." index ".value.flatMultiplier") label="DAGGERHEART.ACTIONS.Settings.multiplier" classes="inline-child" localize=true }}{{/if}} {{formField ../fields.value.fields.dice value=dmg.value.dice name=(concat ../path "damage.parts." index ".value.dice") classes="inline-child"}} {{formField ../fields.value.fields.bonus value=dmg.value.bonus name=(concat ../path "damage.parts." index ".value.bonus") localize=true classes="inline-child"}}
    {{/if}} - {{formField ../fields.type value=dmg.type name=(concat ../path "damage.parts." index ".type") localize=true}} +
    + {{formField ../fields.applyTo value=dmg.applyTo name=(concat ../path "damage.parts." realIndex ".applyTo") localize=true}} + {{#if (eq dmg.applyTo 'hitPoints')}} + {{formField ../fields.type value=dmg.type name=(concat ../path "damage.parts." index ".type") localize=true}} + {{/if}} +
    + {{#if ../horde}} +
    + {{localize "DAGGERHEART.ACTORS.Adversary.hordeDamage"}} +
    + {{formField ../fields.valueAlt.fields.flatMultiplier value=dmg.valueAlt.flatMultiplier name=(concat ../path "damage.parts." index ".valueAlt.flatMultiplier") label="DAGGERHEART.ACTIONS.Settings.multiplier" classes="inline-child" localize=true }} + {{formField ../fields.valueAlt.fields.dice value=dmg.valueAlt.dice name=(concat ../path "damage.parts." index ".valueAlt.dice") classes="inline-child"}} + {{formField ../fields.valueAlt.fields.bonus value=dmg.valueAlt.bonus name=(concat ../path "damage.parts." index ".valueAlt.bonus") localize=true classes="inline-child"}} +
    +
    + {{/if}} {{else}} {{#with (@root.getRealIndex index) as | realIndex |}}
    @@ -33,11 +48,11 @@ {{#if (and (not @root.isNPC) @root.hasRoll (not dmg.base) dmg.resultBased)}}
    - With Hope + {{localize "DAGGERHEART.GENERAL.withThing" thing=(localize "DAGGERHEART.GENERAL.hope")}} {{> formula fields=../../fields.value.fields type=../../fields.type dmg=dmg source=dmg.value target="value" realIndex=realIndex}}
    - With Fear + {{localize "DAGGERHEART.GENERAL.withThing" thing=(localize "DAGGERHEART.GENERAL.fear")}} {{> formula fields=../../fields.valueAlt.fields type=../../fields.type dmg=dmg source=dmg.valueAlt target="valueAlt" realIndex=realIndex}}
    @@ -46,7 +61,12 @@ {{> formula fields=../../fields.value.fields type=../fields.type dmg=dmg source=dmg.value target="value" realIndex=realIndex}}
    {{/if}} - {{formField ../../fields.type value=dmg.type name=(concat "damage.parts." realIndex ".type") localize=true}} +
    + {{formField ../../fields.applyTo value=dmg.applyTo name=(concat "damage.parts." realIndex ".applyTo") localize=true}} + {{#if (eq dmg.applyTo 'hitPoints')}} + {{formField ../../fields.type value=dmg.type name=(concat "damage.parts." realIndex ".type") localize=true}} + {{/if}} +
    {{#unless dmg.base}}
    {{/unless}} diff --git a/templates/actionTypes/effect.hbs b/templates/actionTypes/effect.hbs index d144f2fc..0d89399c 100644 --- a/templates/actionTypes/effect.hbs +++ b/templates/actionTypes/effect.hbs @@ -1,6 +1,6 @@
    - Effects + {{localize "DAGGERHEART.GENERAL.Effect.plural"}}
      @@ -13,7 +13,7 @@
    {{/with}} - {{#if @root.source.save.trait}}{{formInput ../fields.onSave value=effect.onSave name=(concat "effects." index ".onSave") dataset=(object tooltip="Applied even if save succeeded" tooltipDirection="UP")}}{{/if}} + {{#if @root.source.save.trait}}{{formInput ../fields.onSave value=effect.onSave name=(concat "effects." index ".onSave") dataset=(object tooltip=(localize "DAGGERHEART.UI.Tooltip.appliedEvenIfSuccessful") tooltipDirection="UP")}}{{/if}}
    diff --git a/templates/actionTypes/healing.hbs b/templates/actionTypes/healing.hbs index 5bf46f7a..9091469e 100644 --- a/templates/actionTypes/healing.hbs +++ b/templates/actionTypes/healing.hbs @@ -1,43 +1,41 @@ -
    - -
    Healing
    +
    + + {{localize "DAGGERHEART.GENERAL.healing"}} -
    -
    - {{formField fields.type value=source.type name="healing.type" localize=true}} - {{#if (and (not @root.isNPC) @root.hasRoll)}} - {{formField fields.resultBased value=source.resultBased name="healing.resultBased" localize=true}} - {{/if}} - {{#if (and (not @root.isNPC) @root.hasRoll source.resultBased)}} -
    - -
    With Hope
    -
    - {{> formula fields=fields.value.fields source=source.value target="value"}} -
    -
    - -
    With Fear
    -
    - {{> formula fields=fields.valueAlt.fields source=source.valueAlt target="valueAlt"}} -
    - {{else}} + {{#if (and (not @root.isNPC) @root.hasRoll)}} + {{formField fields.resultBased value=source.resultBased name="healing.resultBased" localize=true classes="checkbox"}} + {{/if}} + {{#if (and (not @root.isNPC) @root.hasRoll source.resultBased)}} +
    +
    + +
    {{localize "DAGGERHEART.GENERAL.withThing" thing=(localize "DAGGERHEART.GENERAL.hope")}}
    +
    {{> formula fields=fields.value.fields source=source.value target="value"}} - {{/if}} -
    -
    +
    +
    + +
    {{localize "DAGGERHEART.GENERAL.withThing" thing=(localize "DAGGERHEART.GENERAL.fear")}}
    +
    + {{> formula fields=fields.valueAlt.fields source=source.valueAlt target="valueAlt"}} +
    +
    + {{else}} + {{> formula fields=fields.value.fields source=source.value target="value"}} + {{/if}} + {{formField fields.applyTo value=source.type name="healing.applyTo" localize=true}}
    {{#*inline "formula"}} -
    - {{formField fields.custom.fields.enabled value=source.custom.enabled name=(concat "healing." target ".custom.enabled")}} - {{#if source.custom.enabled}} - {{formField fields.custom.fields.formula value=source.custom.formula name=(concat "healing." target ".custom.formula") localize=true}} - {{else}} + {{formField fields.custom.fields.enabled value=source.custom.enabled name=(concat "healing." target ".custom.enabled") classes="checkbox"}} + {{#if source.custom.enabled}} + {{formField fields.custom.fields.formula value=source.custom.formula name=(concat "healing." target ".custom.formula") localize=true}} + {{else}} +
    {{formField fields.multiplier value=source.multiplier name=(concat "healing." target ".multiplier") localize=true}} {{formField fields.dice value=source.dice name=(concat "healing." target ".dice")}} {{formField fields.bonus value=source.bonus name=(concat "healing." target ".bonus") localize=true}} - {{/if}} -
    +
    + {{/if}} {{/inline}} \ No newline at end of file diff --git a/templates/actionTypes/part/damage-part.hbs b/templates/actionTypes/part/damage-part.hbs deleted file mode 100644 index e69de29b..00000000 diff --git a/templates/actionTypes/range-target.hbs b/templates/actionTypes/range-target.hbs index 22da2f86..3776f0c1 100644 --- a/templates/actionTypes/range-target.hbs +++ b/templates/actionTypes/range-target.hbs @@ -1,5 +1,5 @@
    - Range{{#if fields.target}} & Target{{/if}} + {{localize "DAGGERHEART.GENERAL.range"}}{{#if fields.target}} & {{localize "DAGGERHEART.GENERAL.Target.single"}}{{/if}} {{formField fields.range value=source.range label="Range" name=(concat path "range") localize=true}} {{#if fields.target}}
    diff --git a/templates/actionTypes/resource.hbs b/templates/actionTypes/resource.hbs index 4b1daa1e..9c8fc965 100644 --- a/templates/actionTypes/resource.hbs +++ b/templates/actionTypes/resource.hbs @@ -1,7 +1,7 @@
    -
    Resource
    +
    {{localize "DAGGERHEART.GENERAL.resource"}}
    diff --git a/templates/actionTypes/save.hbs b/templates/actionTypes/save.hbs index 4f2809ee..ff5be220 100644 --- a/templates/actionTypes/save.hbs +++ b/templates/actionTypes/save.hbs @@ -1,5 +1,5 @@
    - Save + {{localize "DAGGERHEART.GENERAL.save"}} {{formField fields.trait label="Trait" name="save.trait" value=source.trait localize=true}} {{formField fields.difficulty label="Difficulty" name="save.difficulty" value=source.difficulty disabled=(not source.trait)}} {{formField fields.damageMod label="Damage on Save" name="save.damageMod" value=source.damageMod localize=true disabled=(not source.trait)}} diff --git a/templates/actionTypes/uses.hbs b/templates/actionTypes/uses.hbs index 820d67ab..174b1904 100644 --- a/templates/actionTypes/uses.hbs +++ b/templates/actionTypes/uses.hbs @@ -1,5 +1,5 @@
    - Uses + {{localize "DAGGERHEART.GENERAL.uses"}}
    {{formField fields.value label="Spent" value=source.value name="uses.value" rootId=partId}} {{formField fields.max label="Max" value=source.max name="uses.max" rootId=partId}} diff --git a/templates/actionTypes/uuid.hbs b/templates/actionTypes/uuid.hbs index b7ccd578..140cad78 100644 --- a/templates/actionTypes/uuid.hbs +++ b/templates/actionTypes/uuid.hbs @@ -1,7 +1,7 @@
    -
    Macro
    +
    {{localize "DOCUMENT.Macro"}}
    {{formInput fields value=source name="documentUUID" placeholder=fields.options.placeholder}} diff --git a/templates/characterCreation/footer.hbs b/templates/characterCreation/footer.hbs index fb9b6a29..47321c7a 100644 --- a/templates/characterCreation/footer.hbs +++ b/templates/characterCreation/footer.hbs @@ -1,4 +1,8 @@ \ No newline at end of file diff --git a/templates/characterCreation/setupTabs/ancestry.hbs b/templates/characterCreation/setupTabs/ancestry.hbs new file mode 100644 index 00000000..1c87ca47 --- /dev/null +++ b/templates/characterCreation/setupTabs/ancestry.hbs @@ -0,0 +1,63 @@ +
    +
    +
    + {{localize "TYPES.Item.ancestry"}} + +
    + +
    + +
    + + +
    + +
    +
    + {{#> "systems/daggerheart/templates/components/card-preview.hbs" primaryAncestry altPartialBlock=true secondaryDisabled=secondaryAncestry.uuid mixedAncestry=mixedAncestry }} + {{#if uuid}} +
    +
    {{name}}
    +
    +
    {{system.primaryFeature.name}}
    +
    {{system.secondaryFeature.name}}
    +
    +
    + {{else}} + {{#if mixedAncestry}} + {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.selectPrimaryAncestry"}} + {{else}} + {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.selectAncestry"}} + {{/if}} + {{/if}} + {{/"systems/daggerheart/templates/components/card-preview.hbs"}} +
    + + {{#if mixedAncestry}} +
    + {{#> "systems/daggerheart/templates/components/card-preview.hbs" secondaryAncestry altPartialBlock=true }} + {{#if uuid}} +
    +
    {{name}}
    +
    +
    {{system.primaryFeature.name}}
    +
    {{system.secondaryFeature.name}}
    +
    +
    + {{else}} + {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.selectSecondaryAncestry"}} + {{/if}} + {{/"systems/daggerheart/templates/components/card-preview.hbs"}} +
    + {{/if}} +
    +
    +
    +
    \ No newline at end of file diff --git a/templates/characterCreation/setupTabs/class.hbs b/templates/characterCreation/setupTabs/class.hbs new file mode 100644 index 00000000..d2215b80 --- /dev/null +++ b/templates/characterCreation/setupTabs/class.hbs @@ -0,0 +1,24 @@ +
    +
    +
    + {{localize "TYPES.Item.class"}} +
    +
    + {{#> "systems/daggerheart/templates/components/card-preview.hbs" class }} + {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.selectClass"}} + {{/"systems/daggerheart/templates/components/card-preview.hbs"}} +
    + +
    + {{#> "systems/daggerheart/templates/components/card-preview.hbs" subclass disabled=(not class.img) }} + {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.selectSubclass"}} + {{/"systems/daggerheart/templates/components/card-preview.hbs"}} +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/templates/characterCreation/setupTabs/community.hbs b/templates/characterCreation/setupTabs/community.hbs new file mode 100644 index 00000000..32a0844c --- /dev/null +++ b/templates/characterCreation/setupTabs/community.hbs @@ -0,0 +1,18 @@ +
    +
    +
    + {{localize "TYPES.Item.community"}} +
    +
    + {{#> "systems/daggerheart/templates/components/card-preview.hbs" community }} + {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.selectCommunity"}} + {{/"systems/daggerheart/templates/components/card-preview.hbs"}} +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/templates/characterCreation/setupTabs/domainCards.hbs b/templates/characterCreation/setupTabs/domainCards.hbs new file mode 100644 index 00000000..298d8859 --- /dev/null +++ b/templates/characterCreation/setupTabs/domainCards.hbs @@ -0,0 +1,22 @@ +
    +
    +
    + {{localize "TYPES.Item.domainCard"}} +
    + {{#each domainCards as |domainCard id|}} +
    + {{#> "systems/daggerheart/templates/components/card-preview.hbs" domainCard }} + {{#each @root.class.system.domains }} +
    {{localize (concat "DAGGERHEART.GENERAL.Domain." this ".label")}}
    + {{/each}} + {{/"systems/daggerheart/templates/components/card-preview.hbs"}} +
    + {{/each}} +
    +
    +
    +
    \ No newline at end of file diff --git a/templates/characterCreation/setupTabs/experience.hbs b/templates/characterCreation/setupTabs/experience.hbs new file mode 100644 index 00000000..46c5b754 --- /dev/null +++ b/templates/characterCreation/setupTabs/experience.hbs @@ -0,0 +1,19 @@ +
    +
    +
    + {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.initialExperiences"}} {{experience.nrSelected}}/{{experience.nrTotal}} +
    + {{#each experience.values as |experience id|}} +
    + +
    {{numberFormat this.value sign=true}}
    +
    + {{/each}} +
    +
    +
    +
    \ No newline at end of file diff --git a/templates/characterCreation/setupTabs/traits.hbs b/templates/characterCreation/setupTabs/traits.hbs new file mode 100644 index 00000000..94f66452 --- /dev/null +++ b/templates/characterCreation/setupTabs/traits.hbs @@ -0,0 +1,32 @@ +
    +
    +
    + {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.traitIncreases"}} {{traits.nrSelected}}/{{traits.nrTotal}} +
    +
    + {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.suggestedTraits"}} +
    + {{#each suggestedTraits}} +
    {{this}}
    + {{/each}} +
    + +
    +
    + {{#each traits.values}} +
    +
    {{this.name}}
    + +
    + {{/each}} +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/templates/characterCreation/tabs/setup.hbs b/templates/characterCreation/tabs/setup.hbs index 3f21fbb4..1504898d 100644 --- a/templates/characterCreation/tabs/setup.hbs +++ b/templates/characterCreation/tabs/setup.hbs @@ -3,99 +3,11 @@ data-tab='{{tabs.setup.id}}' data-group='{{tabs.setup.group}}' > -
    -
    - {{localize "TYPES.Item.class"}} -
    -
    - {{#> "systems/daggerheart/templates/components/card-preview.hbs" class }} - {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.selectClass"}} - {{/"systems/daggerheart/templates/components/card-preview.hbs"}} -
    - -
    - {{#> "systems/daggerheart/templates/components/card-preview.hbs" subclass disabled=(not class.img) }} - {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.selectSubclass"}} - {{/"systems/daggerheart/templates/components/card-preview.hbs"}} -
    -
    -
    - - {{#if (gte visibility 2)}} -
    - {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.heritage"}} -
    -
    - {{#> "systems/daggerheart/templates/components/card-preview.hbs" ancestry }} - {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.selectAncestry"}} - {{/"systems/daggerheart/templates/components/card-preview.hbs"}} -
    - -
    - {{#> "systems/daggerheart/templates/components/card-preview.hbs" community }} - {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.selectCommunity"}} - {{/"systems/daggerheart/templates/components/card-preview.hbs"}} -
    -
    -
    - {{/if}} - - {{#if (gte visibility 3)}} -
    - {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.traitIncreases"}} {{traits.nrSelected}}/{{traits.nrTotal}} -
    -
    - {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.suggestedTraits"}} -
    - {{#each suggestedTraits}} -
    {{this}}
    - {{/each}} -
    - -
    -
    - {{#each traits.values}} -
    -
    {{this.name}}
    - -
    - {{/each}} -
    -
    -
    - {{/if}} - - {{#if (gte visibility 4)}} -
    - {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.initialExperiences"}} {{experience.nrSelected}}/{{experience.nrTotal}} -
    - {{#each experience.values as |experience id|}} -
    - -
    {{numberFormat this.value sign=true}}
    -
    - {{/each}} -
    -
    - {{/if}} - - {{#if (gte visibility 5)}} -
    - {{localize "TYPES.Item.domainCard"}} -
    - {{#each domainCards as |domainCard id|}} -
    - {{#> "systems/daggerheart/templates/components/card-preview.hbs" domainCard }} - {{#each @root.class.system.domains }} -
    {{localize (concat "DAGGERHEART.GENERAL.Domain." this ".label")}}
    - {{/each}} - {{/"systems/daggerheart/templates/components/card-preview.hbs"}} -
    - {{/each}} -
    -
    - {{/if}} -
    + \ No newline at end of file diff --git a/templates/characterCreation/tabs/story.hbs b/templates/characterCreation/tabs/story.hbs index c2fb7400..6aa08334 100644 --- a/templates/characterCreation/tabs/story.hbs +++ b/templates/characterCreation/tabs/story.hbs @@ -4,6 +4,6 @@ data-group='{{tabs.story.group}}' >
    - Story + {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.story"}}
    \ No newline at end of file diff --git a/templates/components/card-preview.hbs b/templates/components/card-preview.hbs index da2abb77..08d4ca01 100644 --- a/templates/components/card-preview.hbs +++ b/templates/components/card-preview.hbs @@ -4,7 +4,13 @@ > {{#if this.img}} -
    {{this.name}}
    +
    + {{#if altPartialBlock}} + {{> @partial-block }} + {{else}} + {{this.name}} + {{/if}} +
    {{else}}
    diff --git a/templates/dialogs/actionSelect.hbs b/templates/dialogs/actionSelect.hbs index 2ea76cae..f2190121 100644 --- a/templates/dialogs/actionSelect.hbs +++ b/templates/dialogs/actionSelect.hbs @@ -1,12 +1,12 @@ -
      +
      +

      {{itemName}}

      +
      +
        {{#each actions}} -
      • - +
      • + +
      • {{/each}}
      diff --git a/templates/dialogs/beastform/advanced.hbs b/templates/dialogs/beastform/advanced.hbs new file mode 100644 index 00000000..78a690da --- /dev/null +++ b/templates/dialogs/beastform/advanced.hbs @@ -0,0 +1,73 @@ +
      + {{#if (eq selected.system.beastformType 'evolved')}} +

      {{localize "DAGGERHEART.ITEMS.Beastform.evolve"}}

      + +
      + {{#if selectedBeastformEffect}} +
      +

      {{localize "DAGGERHEART.ITEMS.Beastform.evolvedFeatureTitle"}}

      +
      {{{selectedBeastformEffect.description}}}
      +
      + {{/if}} +
      + +
      + {{#if evolved.form}} +
      {{concat (localize "DAGGERHEART.CONFIG.BeastformType.evolved") " " evolved.form.name}}
      + + {{else}} +
      + + +
      + {{/if}} +
      + {{/if}} + {{#if (eq selected.system.beastformType 'hybrid')}} +

      {{localize "DAGGERHEART.ITEMS.Beastform.hybridize"}}

      + +
      + {{#if selectedBeastformEffect}} +
      +

      {{localize "DAGGERHEART.ITEMS.Beastform.hybridizeFeatureTitle"}}

      +
      {{{selectedBeastformEffect.description}}}
      +
      + {{/if}} +
      + +
      + {{#each hybridForms as | form key |}} +
      + {{#if form}} +
      +
      {{form.name}}
      +
      +
      +
      + +
      + {{#each form.system.features as | feature |}} +
      {{feature.name}}
      + {{/each}} +
      +
      +
      + +
      + {{#each form.system.advantageOn as | advantage id |}} +
      {{advantage.value}}
      + {{/each}} +
      +
      +
      + {{else}} +
      + + +
      + {{/if}} +
      + {{/each}} +
      + {{/if}} +
      \ No newline at end of file diff --git a/templates/dialogs/beastform/beastformTier.hbs b/templates/dialogs/beastform/beastformTier.hbs new file mode 100644 index 00000000..db307158 --- /dev/null +++ b/templates/dialogs/beastform/beastformTier.hbs @@ -0,0 +1,8 @@ +
      + {{#each tier.values as |form uuid|}} +
      + +
      {{form.value.name}}
      +
      + {{/each}} +
      \ No newline at end of file diff --git a/templates/dialogs/beastform/footer.hbs b/templates/dialogs/beastform/footer.hbs new file mode 100644 index 00000000..8ad53964 --- /dev/null +++ b/templates/dialogs/beastform/footer.hbs @@ -0,0 +1,3 @@ +
      + +
      \ No newline at end of file diff --git a/templates/dialogs/beastform/header.hbs b/templates/dialogs/beastform/header.hbs new file mode 100644 index 00000000..ac92d14c --- /dev/null +++ b/templates/dialogs/beastform/header.hbs @@ -0,0 +1,3 @@ +
      +

      {{localize 'DAGGERHEART.ITEMS.Beastform.dialogTitle'}}

      +
      \ No newline at end of file diff --git a/templates/dialogs/beastform/tabs.hbs b/templates/dialogs/beastform/tabs.hbs new file mode 100644 index 00000000..0a252dd6 --- /dev/null +++ b/templates/dialogs/beastform/tabs.hbs @@ -0,0 +1,15 @@ +
      + +
      \ No newline at end of file diff --git a/templates/dialogs/beastformDialog.hbs b/templates/dialogs/beastformDialog.hbs deleted file mode 100644 index 05f87b89..00000000 --- a/templates/dialogs/beastformDialog.hbs +++ /dev/null @@ -1,18 +0,0 @@ -
      -
      - {{#each beastformTiers as |tier tierKey|}} -
      - {{tier.label}} - {{#each tier.values as |form uuid|}} -
      - -
      {{form.value.name}}
      -
      - {{/each}} -
      - {{/each}} -
      -
      - -
      -
      \ No newline at end of file diff --git a/templates/dialogs/damageReduction.hbs b/templates/dialogs/damageReduction.hbs index 4c30bbfc..43f55e86 100644 --- a/templates/dialogs/damageReduction.hbs +++ b/templates/dialogs/damageReduction.hbs @@ -8,7 +8,7 @@ {{#if this.stress}}

      {{localize "DAGGERHEART.APPLICATIONS.DamageReduction.stress"}}

      -
      {{this.stress.value}}/{{this.stress.maxTotal}}
      +
      {{this.stress.value}}/{{this.stress.max}}
      {{/if}}
    diff --git a/templates/dialogs/dice-roll/costSelection.hbs b/templates/dialogs/dice-roll/costSelection.hbs index 39ef7cf7..d376c749 100644 --- a/templates/dialogs/dice-roll/costSelection.hbs +++ b/templates/dialogs/dice-roll/costSelection.hbs @@ -1,24 +1,30 @@ -
    - {{#if uses}} -
    -
    - - +
    + {{localize 'DAGGERHEART.GENERAL.Cost.single'}} +
      + {{#if uses}} +
    • +
      +
      + + +
      +
      + +
    • + {{/if}} + {{#each costs as | cost index |}} +
    • +
      +
      + + +
      -
    - {{/if}} - {{#each costs as | cost index |}} -
    -
    - - - {{#if scalable}} - - {{/if}} -
    -
    - {{/each}} - {{!--
    - -
    --}} -
    \ No newline at end of file + {{#if scalable}} + + {{/if}} + + + {{/each}} +
+ \ No newline at end of file diff --git a/templates/dialogs/dice-roll/damageSelection.hbs b/templates/dialogs/dice-roll/damageSelection.hbs index 988b852e..6eb2efff 100644 --- a/templates/dialogs/dice-roll/damageSelection.hbs +++ b/templates/dialogs/dice-roll/damageSelection.hbs @@ -1,33 +1,36 @@ -
-
- -
- {{!-- --}} -
{{@root.formula}}
-
-
- -
-
- {{!-- {{#each bonusDamage as |damage index|}} -
- -
- - - {{#if (and damage.initiallySelected damage.hopeIncrease)}} - - -
- -
{{damage.hopeUses}}
- -
+
+
+

{{title}}

+
+ {{#each @root.formula}} +
+ {{localize "DAGGERHEART.GENERAL.formula"}}: {{roll.formula}} + + {{#with (lookup @root.config.GENERAL.healingTypes applyTo)}} + {{localize label}} + {{/with}} + {{#if damageTypes}} + {{#each damageTypes as | type | }} + {{#with (lookup @root.config.GENERAL.damageTypes type)}} + + {{/with}} + {{/each}} {{/if}} -
+
- {{/each}} --}} -
- -
-
\ No newline at end of file +
+ +
+ {{/each}} +
+ {{#if directDamage}} + + {{/if}} + +
+ \ No newline at end of file diff --git a/templates/dialogs/dice-roll/resourceDice.hbs b/templates/dialogs/dice-roll/resourceDice.hbs new file mode 100644 index 00000000..bebe8f4e --- /dev/null +++ b/templates/dialogs/dice-roll/resourceDice.hbs @@ -0,0 +1,16 @@ +
+
+ {{#times (rollParsed item.system.resource.max actor item numerical=true)}} + {{#with (ifThen (lookup ../diceStates this) (lookup ../diceStates this) this) as | state |}} +
+ + +
+ {{/with}} + {{/times}} +
+
+ + +
+
\ No newline at end of file diff --git a/templates/dialogs/dice-roll/rollSelection.hbs b/templates/dialogs/dice-roll/rollSelection.hbs index 5c0ba41d..995be022 100644 --- a/templates/dialogs/dice-roll/rollSelection.hbs +++ b/templates/dialogs/dice-roll/rollSelection.hbs @@ -5,7 +5,7 @@
{{#if (eq @root.rollType 'D20Roll')}}
- +
{{selectOptions diceOptions selected=@root.roll.dHope.denomination}} @@ -54,14 +54,14 @@
- Advantage + {{localize "DAGGERHEART.GENERAL.Advantage.full"}}
{{else if (eq @root.advantage -1)}}
- Disdvantage + {{localize "DAGGERHEART.GENERAL.Disadvantage.full"}}
{{/if}} @@ -70,7 +70,7 @@
- Experiences + {{localize "DAGGERHEART.GENERAL.experience.plural"}} {{#each experiences}} {{#if name}}
@@ -88,8 +88,8 @@ {{/if}} {{/each}}
-
- Modifiers +
+ {{localize "DAGGERHEART.GENERAL.Modifier.plural"}}
- {{#unless (eq @root.rollType 'D20Roll')}} - + {{#times 10}} + + {{/times}} + + - {{/unless}} -
- +
+ {{/unless}} + {{#if @root.rallyDie.length}} + {{localize "DAGGERHEART.CLASS.Feature.rallyDice"}} + + {{/if}} + {{#if (eq @root.rollType 'DualityRoll')}}{{localize "DAGGERHEART.GENERAL.situationalBonus"}}{{/if}} + + {{#if (or costs uses)}} + {{> 'systems/daggerheart/templates/dialogs/dice-roll/costSelection.hbs'}} + {{/if}} {{/unless}} - Formula: {{@root.formula}} - + + {{localize "DAGGERHEART.GENERAL.formula"}}: {{@root.formula}} + +
+ + +
{{else}} - + {{#if (or costs uses)}} + {{> 'systems/daggerheart/templates/dialogs/dice-roll/costSelection.hbs'}} + {{/if}} +
+ +
{{/if}}
\ No newline at end of file diff --git a/templates/dialogs/downtime.hbs b/templates/dialogs/downtime.hbs deleted file mode 100644 index fd5fa405..00000000 --- a/templates/dialogs/downtime.hbs +++ /dev/null @@ -1,24 +0,0 @@ -
-
-

{{localize "DAGGERHEART.APPLICATIONS.Downtime.downtimeHeader" current=nrCurrentChoices max=moveData.nrChoices}}

- {{#each moveData.moves as |move key|}} -
-
-
- {{#if this.selected}}
{{move.selected}}
{{/if}} - -
- - {{localize this.name}} -
-
- {{localize this.description}} -
-
- {{/each}} -
-
- - -
-
\ No newline at end of file diff --git a/templates/dialogs/downtime/activities.hbs b/templates/dialogs/downtime/activities.hbs new file mode 100644 index 00000000..f67e8a10 --- /dev/null +++ b/templates/dialogs/downtime/activities.hbs @@ -0,0 +1,18 @@ +
+ {{localize (concat "DAGGERHEART.APPLICATIONS.Downtime." category ".moves") max=nrChoices.max current=nrChoices.current}} + + +
\ No newline at end of file diff --git a/templates/dialogs/downtime/downtime.hbs b/templates/dialogs/downtime/downtime.hbs new file mode 100644 index 00000000..c8e44e5d --- /dev/null +++ b/templates/dialogs/downtime/downtime.hbs @@ -0,0 +1,14 @@ +
+
+

{{title}}

+
+ +
+ {{#if shortRestMoves.moves}}{{> "systems/daggerheart/templates/dialogs/downtime/activities.hbs" moves=shortRestMoves.moves category='shortRest' nrChoices=nrChoices.shortRest}}{{/if}} + {{#if longRestMoves.moves}}{{> "systems/daggerheart/templates/dialogs/downtime/activities.hbs" moves=longRestMoves.moves category='longRest' nrChoices=nrChoices.longRest}}{{/if}} +
+
+ + +
+
\ No newline at end of file diff --git a/templates/hud/tokenHUD.hbs b/templates/hud/tokenHUD.hbs new file mode 100644 index 00000000..58d13267 --- /dev/null +++ b/templates/hud/tokenHUD.hbs @@ -0,0 +1,78 @@ +
+
+ + +
+ + + + + + {{#if canConfigure}} + + {{/if}} +
+ +
+
+ {{#if displayBar2}} + + {{/if}} +
+ +
+ {{#if displayBar1}} + + {{/if}} +
+
+ +
+ {{#if isGM}} + + {{/if}} + + +
+ {{#each systemStatusEffects as |status|}} + + {{/each}} + {{#if genericStatusEffects}} + + {{#each genericStatusEffects as |status|}} + + {{/each}} + {{/if}} +
+ + +
+ {{#each movementActions as |action|}} + + {{#if action.icon}}{{/if}} {{action.label}} + + {{/each}} +
+ + + + {{#if canToggleCombat}} + + {{/if}} +
diff --git a/templates/settings/appearance-settings.hbs b/templates/settings/appearance-settings.hbs index 5aa6d28d..f297a28f 100644 --- a/templates/settings/appearance-settings.hbs +++ b/templates/settings/appearance-settings.hbs @@ -1,5 +1,9 @@
+
+

{{localize 'DAGGERHEART.SETTINGS.Menu.appearance.name'}}

+
{{formGroup settingFields.schema.fields.displayFear value=settingFields._source.displayFear localize=true}} + {{formGroup settingFields.schema.fields.showGenericStatusEffects value=settingFields._source.showGenericStatusEffects localize=true}}
{{localize "DAGGERHEART.SETTINGS.Menu.appearance.duality"}} diff --git a/templates/settings/automation-settings.hbs b/templates/settings/automation-settings.hbs index 7a637d08..9ffe5049 100644 --- a/templates/settings/automation-settings.hbs +++ b/templates/settings/automation-settings.hbs @@ -1,7 +1,15 @@
- {{formGroup settingFields.schema.fields.hope value=settingFields._source.hope localize=true}} +
+

{{localize 'DAGGERHEART.SETTINGS.Menu.automation.name'}}

+
+
+ + {{formGroup settingFields.schema.fields.hopeFear.fields.gm value=settingFields._source.hopeFear.gm localize=true}} + {{formGroup settingFields.schema.fields.hopeFear.fields.players value=settingFields._source.hopeFear.players localize=true}} + +
{{formGroup settingFields.schema.fields.actionPoints value=settingFields._source.actionPoints localize=true}} - {{formGroup settingFields.schema.fields.countdowns value=settingFields._source.countdowns localize=true}} + {{formGroup settingFields.schema.fields.hordeDamage value=settingFields._source.hordeDamage localize=true}}
-
+
{{localize "DAGGERHEART.APPLICATIONS.Downtime.shortRest.title"}} diff --git a/templates/settings/range-measurement-settings.hbs b/templates/settings/range-measurement-settings.hbs index 36357d57..617d1899 100644 --- a/templates/settings/range-measurement-settings.hbs +++ b/templates/settings/range-measurement-settings.hbs @@ -1,4 +1,7 @@
+
+

{{localize 'DAGGERHEART.SETTINGS.Menu.range.name'}}

+
{{formGroup settingFields.schema.fields.enabled value=settingFields._source.enabled localize=true}} {{formGroup settingFields.schema.fields.melee value=settingFields._source.melee localize=true}} diff --git a/templates/settings/variant-rules.hbs b/templates/settings/variant-rules.hbs index 1ee18b99..75a5534b 100644 --- a/templates/settings/variant-rules.hbs +++ b/templates/settings/variant-rules.hbs @@ -1,4 +1,8 @@
+
+

{{localize 'DAGGERHEART.SETTINGS.Menu.variantRules.name'}}

+
+
diff --git a/templates/sheets-settings/action-settings/base.hbs b/templates/sheets-settings/action-settings/base.hbs index eab56de7..25db8359 100644 --- a/templates/sheets-settings/action-settings/base.hbs +++ b/templates/sheets-settings/action-settings/base.hbs @@ -4,14 +4,14 @@ data-tab="base" >
- Identity + {{localize "DAGGERHEART.GENERAL.identify"}} {{formField fields.name value=source.name label="Name" name="name"}} {{formField fields.img value=source.img label="Icon" name="img"}} {{formField fields.actionType value=source.actionType label="Type" name="actionType" localize=true}} {{formField fields.chatDisplay value=source.chatDisplay name="chatDisplay" classes="checkbox"}}
- Description + {{localize "DAGGERHEART.GENERAL.description"}} {{formInput fields.description value=source.description name="description" }}
\ No newline at end of file diff --git a/templates/sheets-settings/action-settings/configuration.hbs b/templates/sheets-settings/action-settings/configuration.hbs index 74d5fcc1..51b2a72b 100644 --- a/templates/sheets-settings/action-settings/configuration.hbs +++ b/templates/sheets-settings/action-settings/configuration.hbs @@ -4,6 +4,6 @@ data-tab="config" > {{> 'systems/daggerheart/templates/actionTypes/uses.hbs' fields=fields.uses.fields source=source.uses}} - {{> 'systems/daggerheart/templates/actionTypes/cost.hbs' fields=fields.cost.element.fields source=source.cost}} + {{> 'systems/daggerheart/templates/actionTypes/cost.hbs' fields=fields.cost.element.fields source=source.cost costOptions=costOptions}} {{> 'systems/daggerheart/templates/actionTypes/range-target.hbs' fields=(object range=fields.range target=fields.target.fields) source=(object target=source.target range=source.range)}} \ No newline at end of file diff --git a/templates/sheets-settings/adversary-settings/attack.hbs b/templates/sheets-settings/adversary-settings/attack.hbs index eb7183b2..bdb6da5b 100644 --- a/templates/sheets-settings/adversary-settings/attack.hbs +++ b/templates/sheets-settings/adversary-settings/attack.hbs @@ -5,19 +5,21 @@ >
{{localize "DAGGERHEART.GENERAL.basics"}} - {{formGroup systemFields.attack.fields.img value=document.system.attack.img label="Image Path" name="system.attack.img"}} - {{formGroup systemFields.attack.fields.name value=document.system.attack.name label="Attack Name" name="system.attack.name"}} + {{formGroup systemFields.attack.fields.img value=document.system.attack.img label="DAGGERHEART.GENERAL.imagePath" name="system.attack.img" localize=true}} + {{formGroup systemFields.attack.fields.name value=document.system.attack.name label="DAGGERHEART.ACTIONS.Settings.attackName" name="system.attack.name" localize=true}}
{{localize "DAGGERHEART.GENERAL.attack"}} - {{formField systemFields.attack.fields.roll.fields.bonus value=document.system.attack.roll.bonus label="Attack Bonus" name="system.attack.roll.bonus"}} - {{formField systemFields.attack.fields.range value=document.system.attack.range label="Range" name="system.attack.range" localize=true}} + {{formField systemFields.attack.fields.roll.fields.bonus value=document.system.attack.roll.bonus label="DAGGERHEART.ACTIONS.Settings.attackBonus" name="system.attack.roll.bonus" localize=true}} + {{formField systemFields.attack.fields.range value=document.system.attack.range label="DAGGERHEART.GENERAL.range" name="system.attack.range" localize=true}} {{#if systemFields.attack.fields.target.fields}} - {{ formField systemFields.attack.fields.target.fields.type value=document.system.attack.target.type label="Target" name="system.attack.target.type" localize=true }} + {{ formField systemFields.attack.fields.target.fields.type value=document.system.attack.target.type label="DAGGERHEART.GENERAL.Target.single" name="system.attack.target.type" localize=true }} {{#if (and document.system.attack.target.type (not (eq document.system.attack.target.type 'self')))}} - {{ formField systemFields.attack.fields.target.fields.amount value=document.system.attack.target.amount label="Amount" name="system.attack.target.amount" }} + {{ formField systemFields.attack.fields.target.fields.amount value=document.system.attack.target.amount label="DAGGERHEART.GENERAL.amount" name="system.attack.target.amount" localize=true}} {{/if}} {{/if}}
- {{> 'systems/daggerheart/templates/actionTypes/damage.hbs' fields=systemFields.attack.fields.damage.fields.parts.element.fields source=document.system.attack.damage path="system.attack."}} + {{#if (eq document.system.type 'horde')}} + {{> 'systems/daggerheart/templates/actionTypes/damage.hbs' fields=systemFields.attack.fields.damage.fields.parts.element.fields source=document.system.attack.damage path="system.attack." horde=true}} + {{/if}} \ No newline at end of file diff --git a/templates/sheets-settings/adversary-settings/details.hbs b/templates/sheets-settings/adversary-settings/details.hbs index 08668fd8..e3ecf859 100644 --- a/templates/sheets-settings/adversary-settings/details.hbs +++ b/templates/sheets-settings/adversary-settings/details.hbs @@ -19,20 +19,20 @@
- {{localize "DAGGERHEART.GENERAL.hitPoints"}} - {{formGroup systemFields.resources.fields.hitPoints.fields.value value=document.system.resources.hitPoints.value}} + {{localize "DAGGERHEART.GENERAL.HitPoints.plural"}} + {{formGroup systemFields.resources.fields.hitPoints.fields.value value=document.system.resources.hitPoints.value label=(localize "DAGGERHEART.ACTORS.Adversary.FIELDS.resources.hitPoints.value.label")}} {{formGroup systemFields.resources.fields.hitPoints.fields.max value=document.system.resources.hitPoints.max}}
{{localize "DAGGERHEART.GENERAL.stress"}} - {{formGroup systemFields.resources.fields.stress.fields.value value=document.system.resources.stress.value}} + {{formGroup systemFields.resources.fields.stress.fields.value value=document.system.resources.stress.value label=(localize "DAGGERHEART.ACTORS.Adversary.FIELDS.resources.stress.value.label")}} {{formGroup systemFields.resources.fields.stress.fields.max value=document.system.resources.stress.max}}
{{localize "DAGGERHEART.GENERAL.DamageThresholds.title"}} - {{formGroup systemFields.damageThresholds.fields.major value=document.system.damageThresholds.major}} - {{formGroup systemFields.damageThresholds.fields.severe value=document.system.damageThresholds.severe}} + {{formGroup systemFields.damageThresholds.fields.major value=document.system.damageThresholds.major label=(localize "DAGGERHEART.GENERAL.DamageThresholds.majorThreshold")}} + {{formGroup systemFields.damageThresholds.fields.severe value=document.system.damageThresholds.severe label=(localize "DAGGERHEART.GENERAL.DamageThresholds.severeThreshold")}}
\ No newline at end of file diff --git a/templates/sheets-settings/adversary-settings/experiences.hbs b/templates/sheets-settings/adversary-settings/experiences.hbs index c15bf6b9..72d2a3c4 100644 --- a/templates/sheets-settings/adversary-settings/experiences.hbs +++ b/templates/sheets-settings/adversary-settings/experiences.hbs @@ -4,7 +4,7 @@ data-group='{{tabs.experiences.group}}' >
@@ -13,7 +13,7 @@ {{#each document.system.experiences as |experience key|}}
  • - +
  • {{/each}} diff --git a/templates/sheets-settings/adversary-settings/features.hbs b/templates/sheets-settings/adversary-settings/features.hbs index f232dae9..a287c2a8 100644 --- a/templates/sheets-settings/adversary-settings/features.hbs +++ b/templates/sheets-settings/adversary-settings/features.hbs @@ -16,8 +16,8 @@ {{feature.name}}
    - - + +
    {{/each}} diff --git a/templates/sheets-settings/companion-settings/attack.hbs b/templates/sheets-settings/companion-settings/attack.hbs index 0c874ac1..359536b6 100644 --- a/templates/sheets-settings/companion-settings/attack.hbs +++ b/templates/sheets-settings/companion-settings/attack.hbs @@ -5,16 +5,16 @@ >
    {{localize "DAGGERHEART.GENERAL.basics"}} - {{formGroup systemFields.attack.fields.img value=document.system.attack.img label="Image Path" name="system.attack.img"}} - {{formGroup systemFields.attack.fields.name value=document.system.attack.name label="Attack Name" name="system.attack.name"}} + {{formGroup systemFields.attack.fields.img value=document.system.attack.img label="DAGGERHEART.GENERAL.imagePath" name="system.attack.img" localize=true}} + {{formGroup systemFields.attack.fields.name value=document.system.attack.name label="DAGGERHEART.ACTIONS.Settings.attackName" name="system.attack.name" localize=true}}
    {{localize "DAGGERHEART.GENERAL.attack"}} - {{formField systemFields.attack.fields.range value=document.system.attack.range label="Range" name="system.attack.range" localize=true}} + {{formField systemFields.attack.fields.range value=document.system.attack.range label="DAGGERHEART.GENERAL.range" name="system.attack.range" localize=true}} {{#if systemFields.attack.fields.target.fields}} - {{ formField systemFields.attack.fields.target.fields.type value=document.system.attack.target.type label="Target" name="system.attack.target.type" localize=true }} + {{ formField systemFields.attack.fields.target.fields.type value=document.system.attack.target.type label="DAGGERHEART.GENERAL.Target.single" name="system.attack.target.type" localize=true}} {{#if (and document.system.attack.target.type (not (eq document.system.attack.target.type 'self')))}} - {{ formField systemFields.attack.fields.target.fields.amount value=document.system.attack.target.amount label="Amount" name="system.attack.target.amount" }} + {{ formField systemFields.attack.fields.target.fields.amount value=document.system.attack.target.amount label="DAGGERHEART.GENERAL.amount" name="system.attack.target.amount" localize=true}} {{/if}} {{/if}}
    diff --git a/templates/sheets-settings/companion-settings/details.hbs b/templates/sheets-settings/companion-settings/details.hbs index 2811377d..4f1825d8 100644 --- a/templates/sheets-settings/companion-settings/details.hbs +++ b/templates/sheets-settings/companion-settings/details.hbs @@ -6,18 +6,18 @@
    {{localize 'DAGGERHEART.GENERAL.basics'}}
    - {{formGroup systemFields.evasion.fields.value value=document.system.evasion.value localize=true}} - {{formGroup systemFields.resources.fields.stress.fields.value value=document.system.resources.stress.value label='Current Stress'}} - {{formGroup systemFields.resources.fields.stress.fields.max value=document.system.resources.stress.max label='Max Stress'}} + {{formGroup systemFields.evasion value=document.system.evasion localize=true}} + {{formGroup systemFields.resources.fields.stress.fields.value value=document.system.resources.stress.value label='DAGGERHEART.ACTORS.Companion.FIELDS.resources.stress.currentStress.label' localize=true}} + {{formGroup systemFields.resources.fields.stress.fields.max value=document.system.resources.stress.max label='DAGGERHEART.ACTORS.Companion.FIELDS.resources.stress.maxStress.label' localize=true}}
    -
    - - +
    + + +
    -
    - + \ No newline at end of file diff --git a/templates/sheets-settings/environment-settings/adversaries.hbs b/templates/sheets-settings/environment-settings/adversaries.hbs index 4d8fa066..3464a745 100644 --- a/templates/sheets-settings/environment-settings/adversaries.hbs +++ b/templates/sheets-settings/environment-settings/adversaries.hbs @@ -1,30 +1,33 @@ -
    +
    - {{#each document.system.potentialAdversaries as |category id|}} -
    - {{category.label}} -
    - - - - + {{#each document.system.potentialAdversaries as |category categoryId|}} +
    + {{category.label}} +
    + + + + +
    +
    + {{#each category.adversaries as |adversary|}} +
    + {{> 'daggerheart.inventory-item' + item=adversary + type='adversary' + isActor=true + categoryAdversary=categoryId + }}
    -
    - {{#each category.adversaries as |adversary|}} -
    - {{> 'systems/daggerheart/templates/sheets/global/partials/inventory-item.hbs' item=adversary type='adversary' isActor=true categoryAdversary=@../key}} -
    - {{/each}} -
    -
    - Drop Actors here -
    -
    + {{/each}} +
    +
    + {{localize "DAGGERHEART.GENERAL.dropActorsHere"}} +
    +
    {{/each}}
    \ No newline at end of file diff --git a/templates/sheets-settings/environment-settings/features.hbs b/templates/sheets-settings/environment-settings/features.hbs index f232dae9..aab68309 100644 --- a/templates/sheets-settings/environment-settings/features.hbs +++ b/templates/sheets-settings/environment-settings/features.hbs @@ -16,8 +16,8 @@ {{feature.name}}
    - - + +
    {{/each}} diff --git a/templates/sheets/activeEffect/changes.hbs b/templates/sheets/activeEffect/changes.hbs index c1047206..9cf137f0 100644 --- a/templates/sheets/activeEffect/changes.hbs +++ b/templates/sheets/activeEffect/changes.hbs @@ -11,12 +11,7 @@ {{#with ../fields.changes.element.fields as |changeFields|}}
  • - - - {{#each @root.fieldPaths}} - - {{/each}} - +
    {{formInput changeFields.mode name=(concat "changes." i ".mode") value=change.mode choices=@root.modes}} diff --git a/templates/sheets/activeEffect/details.hbs b/templates/sheets/activeEffect/details.hbs index 8ff72b98..8a862c53 100644 --- a/templates/sheets/activeEffect/details.hbs +++ b/templates/sheets/activeEffect/details.hbs @@ -7,7 +7,7 @@ {{formGroup fields.origin value=source.origin rootId=rootId disabled=true}} {{/if}} {{#if isItemEffect}} - {{formGroup fields.transfer value=source.transfer rootId=rootId label=legacyTransfer.label hint=legacyTransfer.hint}} + {{formGroup fields.transfer value=source.transfer rootId=rootId label=legacyTransfer.label hint=(localize "DAGGERHEART.EFFECTS.Attachments.transferHint")}} {{/if}} {{formGroup fields.statuses value=source.statuses options=statuses rootId=rootId classes="statuses"}} diff --git a/templates/sheets/actors/adversary/effects.hbs b/templates/sheets/actors/adversary/effects.hbs index 3d378802..325610e6 100644 --- a/templates/sheets/actors/adversary/effects.hbs +++ b/templates/sheets/actors/adversary/effects.hbs @@ -1,8 +1,20 @@ -
    - {{> 'systems/daggerheart/templates/sheets/global/partials/inventory-fieldset-items.hbs' title=(localize 'DAGGERHEART.GENERAL.activeEffects') type='effect'}} - {{> 'systems/daggerheart/templates/sheets/global/partials/inventory-fieldset-items.hbs' title=(localize 'DAGGERHEART.GENERAL.inactiveEffects') type='effect'}} +
    + {{> 'daggerheart.inventory-items' + title='DAGGERHEART.GENERAL.activeEffects' + type='effect' + isGlassy=true + collection=effects.actives + canCreate=true + hideResources=true + }} + + {{> 'daggerheart.inventory-items' + title='DAGGERHEART.GENERAL.inactiveEffects' + type='effect' + isGlassy=true + collection=effects.inactives + canCreate=true + hideResources=true + }}
    \ No newline at end of file diff --git a/templates/sheets/actors/adversary/features.hbs b/templates/sheets/actors/adversary/features.hbs index 1a8d918e..e5a304ef 100644 --- a/templates/sheets/actors/adversary/features.hbs +++ b/templates/sheets/actors/adversary/features.hbs @@ -1,9 +1,13 @@ -
    +
    - {{> 'systems/daggerheart/templates/sheets/global/partials/inventory-fieldset-items.hbs' title=(localize tabs.features.label) type='feature' values=document.system.features hideControls=true}} + {{> 'daggerheart.inventory-items' + title=tabs.features.label + type='feature' + collection=document.system.features + hideControls=true + canCreate=true + showActions=true + }}
    \ No newline at end of file diff --git a/templates/sheets/actors/adversary/header.hbs b/templates/sheets/actors/adversary/header.hbs index 9b126f73..a7cfa3a6 100644 --- a/templates/sheets/actors/adversary/header.hbs +++ b/templates/sheets/actors/adversary/header.hbs @@ -2,7 +2,7 @@

    -

    @@ -20,14 +20,14 @@ {{#if (eq source.system.type 'horde')}}
    {{source.system.hordeHp}} - /HP + /{{localize "DAGGERHEART.GENERAL.HitPoints.short"}}
    {{/if}}
    - {{source.system.description}} + {{{description}}}
    {{localize 'DAGGERHEART.ACTORS.Adversary.FIELDS.motivesAndTactics.label'}}: {{{source.system.motivesAndTactics}}} diff --git a/templates/sheets/actors/adversary/notes.hbs b/templates/sheets/actors/adversary/notes.hbs index effa7240..a2378516 100644 --- a/templates/sheets/actors/adversary/notes.hbs +++ b/templates/sheets/actors/adversary/notes.hbs @@ -5,6 +5,6 @@ >
    {{localize tabs.notes.label}} - {{formInput systemFields.notes value=document.system.notes enriched=document.system.notes localize=true toggled=true}} + {{formInput notes.field value=notes.value enriched=notes.enriched toggled=true}}
    \ No newline at end of file diff --git a/templates/sheets/actors/adversary/sidebar.hbs b/templates/sheets/actors/adversary/sidebar.hbs index b26c1b81..131fb33b 100644 --- a/templates/sheets/actors/adversary/sidebar.hbs +++ b/templates/sheets/actors/adversary/sidebar.hbs @@ -1,111 +1,118 @@ \ No newline at end of file diff --git a/templates/sheets/actors/character/biography.hbs b/templates/sheets/actors/character/biography.hbs index 34313def..6913f279 100644 --- a/templates/sheets/actors/character/biography.hbs +++ b/templates/sheets/actors/character/biography.hbs @@ -26,11 +26,11 @@
  • {{localize 'DAGGERHEART.ACTORS.Character.story.backgroundTitle'}} - {{formInput systemFields.biography.fields.background value=source.system.biography.background enriched=source.system.biography.background localize=true toggled=true}} + {{formInput background.field value=background.value enriched=background.enriched toggled=true}}
    {{localize 'DAGGERHEART.ACTORS.Character.story.connectionsTitle'}} - {{formInput systemFields.biography.fields.connections value=source.system.biography.connections enriched=source.system.biography.connections localize=true toggled=true}} + {{formInput connections.field value=connections.value enriched=connections.enriched toggled=true}}
    \ No newline at end of file diff --git a/templates/sheets/actors/character/effects.hbs b/templates/sheets/actors/character/effects.hbs index 3d378802..4c4fca27 100644 --- a/templates/sheets/actors/character/effects.hbs +++ b/templates/sheets/actors/character/effects.hbs @@ -1,8 +1,21 @@ -
    - {{> 'systems/daggerheart/templates/sheets/global/partials/inventory-fieldset-items.hbs' title=(localize 'DAGGERHEART.GENERAL.activeEffects') type='effect'}} - {{> 'systems/daggerheart/templates/sheets/global/partials/inventory-fieldset-items.hbs' title=(localize 'DAGGERHEART.GENERAL.inactiveEffects') type='effect'}} +
    + + {{> 'daggerheart.inventory-items' + title='DAGGERHEART.GENERAL.activeEffects' + type='effect' + isGlassy=true + collection=effects.actives + canCreate=true + hideResources=true + }} + + {{> 'daggerheart.inventory-items' + title='DAGGERHEART.GENERAL.inactiveEffects' + type='effect' + isGlassy=true + collection=effects.inactives + canCreate=true + hideResources=true + }}
    \ No newline at end of file diff --git a/templates/sheets/actors/character/features.hbs b/templates/sheets/actors/character/features.hbs index 7fab5263..acabd37e 100644 --- a/templates/sheets/actors/character/features.hbs +++ b/templates/sheets/actors/character/features.hbs @@ -1,13 +1,25 @@ -
    +
    - {{#each document.system.sheetLists}} - {{#if this.values}} - {{> 'systems/daggerheart/templates/sheets/global/partials/inventory-fieldset-items.hbs' title=this.title values=this.values}} - {{/if}} + {{#each document.system.sheetLists as |category|}} + {{#if (eq category.type 'feature' )}} + {{> 'daggerheart.inventory-items' + title=category.title + type='feature' + collection=category.values + canCreate=true + showActions=true + }} + {{else if category.values}} + {{> 'daggerheart.inventory-items' + title=category.title + type='feature' + collection=category.values + canCreate=false + showActions=true + }} + + {{/if}} {{/each}}
    \ No newline at end of file diff --git a/templates/sheets/actors/character/header.hbs b/templates/sheets/actors/character/header.hbs index 2b4ae13c..9e930fd6 100644 --- a/templates/sheets/actors/character/header.hbs +++ b/templates/sheets/actors/character/header.hbs @@ -15,7 +15,7 @@ {{#if (or document.system.needsCharacterSetup document.system.levelData.canLevelUp)}} + +
    + {{/'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs'}} \ No newline at end of file diff --git a/templates/sheets/actors/character/inventory.hbs b/templates/sheets/actors/character/inventory.hbs index be8bb251..24f7836f 100644 --- a/templates/sheets/actors/character/inventory.hbs +++ b/templates/sheets/actors/character/inventory.hbs @@ -1,8 +1,5 @@ -
    +
    \ No newline at end of file diff --git a/templates/sheets/actors/character/loadout.hbs b/templates/sheets/actors/character/loadout.hbs index 5a1d675e..0319d56f 100644 --- a/templates/sheets/actors/character/loadout.hbs +++ b/templates/sheets/actors/character/loadout.hbs @@ -10,28 +10,33 @@ -
    - {{> 'systems/daggerheart/templates/sheets/global/partials/inventory-fieldset-items.hbs' - title=(localize 'DAGGERHEART.GENERAL.Tabs.loadout') + {{> 'daggerheart.inventory-items' + title='DAGGERHEART.GENERAL.Tabs.loadout' type='domainCard' isGlassy=true - cardView=(ifThen listView "list" "card")}} - - {{> 'systems/daggerheart/templates/sheets/global/partials/inventory-fieldset-items.hbs' - title=(localize 'DAGGERHEART.GENERAL.Tabs.vault') + cardView=cardView + collection=document.system.domainCards.loadout + canCreate=true + }} + {{> 'daggerheart.inventory-items' + title='DAGGERHEART.GENERAL.Tabs.vault' type='domainCard' - isVault=true isGlassy=true - cardView=(ifThen listView "list" "card")}} + cardView=cardView + collection=document.system.domainCards.vault + canCreate=true + inVault=true + }}
    \ No newline at end of file diff --git a/templates/sheets/actors/character/sidebar.hbs b/templates/sheets/actors/character/sidebar.hbs index df275472..6ed47fc7 100644 --- a/templates/sheets/actors/character/sidebar.hbs +++ b/templates/sheets/actors/character/sidebar.hbs @@ -1,123 +1,157 @@