daggerheart/module/config/itemConfig.mjs
WBHarry c6bdc846ab
[Fix] SRD Effect Priorities (#1505)
* Increased priority on effects in srd domain cards that depend on character data

* Increased priority on effects in srd classes/subclasses that depend on character data

* Increased priority on effects in srd ancestries that depend on character data

* Increased priority on effects in srd beastforms that depend on character data

* Increased priority on effects in remaining SRD items that depend on character data

* Adversaries

* Raised system version
2026-01-09 15:50:56 +01:00

1528 lines
57 KiB
JavaScript

export const armorFeatures = {
burning: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.burning.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.burning.description',
actions: [
{
type: 'damage',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.ArmorFeature.burning.actions.burn.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.burning.actions.burn.description',
img: 'icons/magic/fire/flame-burning-embers-yellow.webp',
range: 'melee',
target: {
type: 'hostile'
},
damage: {
parts: [
{
applyTo: 'stress',
value: {
custom: {
enabled: true,
formula: '1'
}
}
}
]
}
}
]
},
channeling: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.channeling.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.channeling.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.ArmorFeature.channeling.effects.channeling.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.channeling.effects.channeling.description',
img: 'icons/magic/symbols/rune-sigil-horned-blue.webp',
changes: [
{
key: 'system.bonuses.roll.spellcast',
mode: 2,
value: '1'
}
]
}
]
},
difficult: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.difficult.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.difficult.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.ArmorFeature.difficult.effects.difficult.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.difficult.effects.difficult.description',
img: 'icons/magic/control/buff-flight-wings-red.webp',
changes: [
{
key: 'system.traits.agility.value',
mode: 2,
value: '-1'
},
{
key: 'system.traits.strength.value',
mode: 2,
value: '-1'
},
{
key: 'system.traits.finesse.value',
mode: 2,
value: '-1'
},
{
key: 'system.traits.instinct.value',
mode: 2,
value: '-1'
},
{
key: 'system.traits.presence.value',
mode: 2,
value: '-1'
},
{
key: 'system.traits.knowledge.value',
mode: 2,
value: '-1'
},
{
key: 'system.evasion',
mode: 2,
value: '-1'
}
]
}
]
},
flexible: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.flexible.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.flexible.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.ArmorFeature.flexible.effects.flexible.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.flexible.effects.flexible.description',
img: 'icons/magic/movement/abstract-ribbons-red-orange.webp',
changes: [
{
key: 'system.evasion',
mode: 2,
value: '1'
}
]
}
]
},
fortified: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.fortified.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.fortified.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.ArmorFeature.fortified.effects.fortified.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.fortified.effects.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.effects.gilded.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.gilded.effects.gilded.description',
img: 'icons/magic/control/control-influence-crown-gold.webp',
changes: [
{
key: 'system.traits.presence.value',
mode: 2,
value: '1'
}
]
}
]
},
heavy: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.heavy.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.heavy.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.ArmorFeature.heavy.effects.heavy.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.heavy.effects.heavy.description',
img: 'icons/commodities/metal/ingot-worn-iron.webp',
changes: [
{
key: 'system.evasion',
mode: 2,
value: '-1'
}
]
}
]
},
hopeful: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.hopeful.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.hopeful.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.ArmorFeature.hopeful.actions.hope.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.hopeful.actions.hope.description',
img: 'icons/magic/holy/barrier-shield-winged-blue.webp'
}
]
},
impenetrable: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.impenetrable.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.impenetrable.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.ArmorFeature.impenetrable.actions.impenetrable.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.impenetrable.actions.impenetrable.description',
img: 'icons/magic/defensive/shield-barrier-flaming-pentagon-purple-orange.webp',
uses: {
max: 1,
recovery: 'shortRest',
value: 0
},
cost: [
{
key: 'stress',
value: 1
}
]
}
]
},
magical: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.magical.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.magical.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.ArmorFeature.magical.effects.magical.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.magical.effects.magical.description',
img: 'icons/magic/defensive/barrier-shield-dome-blue-purple.webp',
changes: [
{
key: 'system.rules.damageReduction.magical',
mode: 5,
value: 1
}
]
}
]
},
painful: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.painful.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.painful.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.ArmorFeature.painful.actions.pain.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.painful.actions.pain.description',
img: 'icons/skills/wounds/injury-face-impact-orange.webp',
cost: [
{
key: 'stress',
value: 1
}
]
}
]
},
physical: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.physical.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.physical.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.ArmorFeature.physical.effects.physical.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.physical.effects.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',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.ArmorFeature.quiet.actions.quiet.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.quiet.actions.quiet.description',
img: 'icons/magic/perception/silhouette-stealth-shadow.webp'
}
]
},
reinforced: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.effects.reinforced.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.effects.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',
actions: [
{
type: 'attack',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.ArmorFeature.resilient.actions.resilient.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.resilient.actions.resilient.description',
img: 'icons/magic/life/heart-cross-purple-orange.webp',
roll: {
type: 'diceSet',
diceRolling: {
compare: 'equal',
dice: 'd6',
multiplier: 'flat',
flatMultiplier: 1,
treshold: 6
}
}
}
]
},
sharp: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.sharp.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.sharp.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.ArmorFeature.sharp.effects.sharp.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.sharp.effects.sharp.description',
img: 'icons/magic/defensive/shield-barrier-glowing-triangle-green.webp',
changes: [
{
key: 'system.bonuses.damage.primaryWeapon.dice',
mode: 2,
value: '1d4'
},
{
key: 'system.bonuses.damage.secondaryWeapon.dice',
mode: 2,
value: '1d4'
}
]
}
]
},
shifting: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.shifting.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.shifting.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.ArmorFeature.shifting.actions.shift.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.shifting.actions.shift.description',
img: 'icons/magic/defensive/illusion-evasion-echo-purple.webp',
cost: [
{
key: 'stress',
value: 1
}
]
}
]
},
timeslowing: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.timeslowing.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.timeslowing.description',
actions: [
{
type: 'attack',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.ArmorFeature.timeslowing.actions.slowTime.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.timeslowing.actions.slowTime.description',
img: 'icons/magic/time/hourglass-brown-orange.webp',
cost: [
{
key: 'armorSlot',
value: 1
}
],
roll: {
type: 'diceSet',
diceRolling: {
dice: 'd4',
multiplier: 'flat',
flatMultiplier: 1
}
}
}
]
},
truthseeking: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.truthseeking.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.truthseeking.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.ArmorFeature.truthseeking.actions.truthseeking.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.truthseeking.actions.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.effects.veryHeavy.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.veryHeavy.effects.veryHeavy.description',
img: 'icons/commodities/metal/ingot-stamped-steel.webp',
changes: [
{
key: 'system.evasion',
mode: 2,
value: '-2'
},
{
key: 'system.traits.agility.value',
mode: 2,
value: '-1'
}
]
}
]
},
warded: {
label: 'DAGGERHEART.CONFIG.ArmorFeature.warded.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.warded.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.ArmorFeature.warded.effects.warded.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.warded.effects.warded.description',
img: 'icons/magic/defensive/barrier-shield-dome-pink.webp',
changes: [
{
key: 'system.resistance.magical.reduction',
mode: 2,
value: '@system.armorScore',
priority: 21
}
]
}
]
}
};
export const allArmorFeatures = () => {
const homebrewFeatures = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).itemFeatures
.armorFeatures;
return {
...armorFeatures,
...Object.keys(homebrewFeatures).reduce((acc, key) => {
const feature = homebrewFeatures[key];
const actions = feature.actions.map(action => ({
...action,
effects: action.effects.map(effect => feature.effects.find(x => x.id === effect._id)),
type: action.type
}));
const actionEffects = actions.flatMap(a => a.effects);
const effects = feature.effects.filter(effect => !actionEffects.some(x => x.id === effect.id));
acc[key] = { ...feature, label: feature.name, effects, actions };
return acc;
}, {})
};
};
export const orderedArmorFeatures = () => {
const homebrewFeatures = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).itemFeatures
.armorFeatures;
const allFeatures = { ...armorFeatures, ...homebrewFeatures };
const all = Object.keys(allFeatures).map(key => {
const feature = allFeatures[key];
return {
...feature,
id: key,
label: feature.label ?? feature.name
};
});
return Object.values(all).sort((a, b) => game.i18n.localize(a.label).localeCompare(game.i18n.localize(b.label)));
};
export const weaponFeatures = {
barrier: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.barrier.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.barrier.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.barrier.effects.barrier.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.barrier.effects.barrier.description',
img: 'icons/skills/melee/shield-block-bash-blue.webp',
changes: [
{
key: 'system.armorScore',
mode: 2,
value: 'ITEM.@system.tier + 1'
},
{
key: 'system.evasion',
mode: 2,
value: '-1'
}
]
}
]
},
bonded: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.bonded.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.bonded.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.bonded.effects.damage.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.bonded.effects.damage.description',
img: 'icons/magic/symbols/chevron-elipse-circle-blue.webp',
changes: [
{
key: 'system.bonuses.damage.primaryWeapon.bonus',
mode: 2,
value: '@system.levelData.level.current'
}
]
}
]
},
bouncing: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.bouncing.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.bouncing.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.bouncing.actions.bounce.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.bouncing.actions.bounce.description',
img: 'icons/skills/movement/ball-spinning-blue.webp',
cost: [
{
key: 'stress',
value: 1,
scalable: true,
step: 1
}
]
}
]
},
brave: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.brave.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.brave.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.brave.effects.brave.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.brave.effects.brave.description',
img: 'icons/magic/life/heart-cross-strong-flame-purple-orange.webp',
changes: [
{
key: 'system.evasion',
mode: 2,
value: '-1'
},
{
key: 'system.damageThresholds.severe',
mode: 2,
value: 'ITEM.@system.tier'
}
]
}
]
},
brutal: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.brutal.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.brutal.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.brutal.actions.addDamage.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.brutal.actions.addDamage.description',
img: 'icons/skills/melee/strike-dagger-blood-red.webp'
}
]
},
burning: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.burning.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.burning.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.burning.actions.burn.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.burning.actions.burn.description',
img: 'icons/magic/fire/blast-jet-stream-embers-orange.webp'
}
]
},
charged: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.charged.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.charged.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.charged.actions.markStress.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.charged.actions.markStress.description',
img: 'icons/magic/lightning/claws-unarmed-strike-teal.webp',
target: {
type: 'self'
},
cost: [
{
key: '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'
}
]
}
]
}
]
},
concussive: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.concussive.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.concussive.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.concussive.actions.attack.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.concussive.actions.attack.description',
img: 'icons/skills/melee/shield-block-bash-yellow.webp',
target: {
type: 'any'
},
cost: [
{
key: 'hope',
value: 1
}
]
}
]
},
cumbersome: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.cumbersome.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.cumbersome.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.cumbersome.effects.cumbersome.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.cumbersome.effects.cumbersome.description',
img: 'icons/commodities/metal/mail-plate-steel.webp',
changes: [
{
key: 'system.traits.finesse.value',
mode: 2,
value: '-1'
}
]
}
]
},
deadly: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.deadly.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.deadly.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.deadly.actions.extraDamage.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.deadly.actions.extraDamage.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',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.actions.deflect.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.actions.deflect.description',
img: 'icons/skills/melee/hand-grip-sword-strike-orange.webp',
target: {
type: 'self'
},
cost: [
{
type: 'armor',
value: 1
}
],
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.effects.deflecting.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.effects.deflecting.description',
img: 'icons/skills/melee/hand-grip-sword-strike-orange.webp',
changes: [
{
key: 'system.evasion',
mode: 2,
value: '@system.armorScore',
priority: 21
}
]
}
]
}
]
},
destructive: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.description',
actions: [
{
type: 'damage',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.actions.attack.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.actions.attack.descriptive',
img: 'icons/skills/melee/strike-flail-spiked-pink.webp',
range: 'veryClose',
target: {
type: 'hostile'
},
damage: {
parts: [
{
applyTo: 'stress',
value: {
custom: {
enabled: true,
formula: '1'
}
}
}
]
}
}
],
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.effects.agility',
img: 'icons/skills/melee/strike-flail-spiked-pink.webp',
changes: [
{
key: 'system.traits.agility.value',
mode: 2,
value: '-1'
}
]
}
]
},
devastating: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.devastating.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.devastating.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.devastating.actions.devastate.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.devastating.actions.devastate.description',
img: 'icons/skills/melee/strike-flail-destructive-yellow.webp',
cost: [
{
key: 'stress',
value: 1
}
]
}
]
},
doubleDuty: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.doubleDuty.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.doubleDuty.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.doubleDuty.effects.doubleDuty.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.doubleDuty.effects.doubleDuty.description',
img: 'icons/skills/melee/sword-shield-stylized-white.webp',
changes: [
{
key: 'system.armorScore',
mode: 2,
value: '1'
},
{
key: 'system.bonuses.damage.primaryWeapon.bonus',
mode: 2,
value: '1'
}
],
system: {
rangeDependence: {
enabled: true,
range: 'melee',
target: 'hostile',
type: 'withinRange'
}
}
}
]
},
doubledUp: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.doubledUp.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.doubledUp.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.doubledUp.actions.doubleUp.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.doubledUp.actions.doubleUp.description',
img: 'icons/skills/melee/strike-slashes-orange.webp'
}
]
},
dueling: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.dueling.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.dueling.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.dueling.actions.duel.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.dueling.actions.duel.description',
img: 'icons/skills/melee/weapons-crossed-swords-pink.webp'
}
]
},
eruptive: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.eruptive.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.eruptive.description',
actions: [
{
type: 'effect', // Should prompt a dc 14 reaction save on adversaries
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.eruptive.actions.erupt.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.eruptive.actions.erupt.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: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.grappling.actions.grapple.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.grappling.actions.grapple.description',
img: 'icons/magic/control/debuff-chains-ropes-net-white.webp',
cost: [
{
key: 'hope',
value: 1
}
]
}
]
},
greedy: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.description',
img: 'icons/commodities/currency/coins-crown-stack-gold.webp',
target: {
type: 'self'
},
// Should cost handful of gold,
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.actions.greed.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.actions.greed.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',
description: 'DAGGERHEART.CONFIG.WeaponFeature.healing.description',
actions: [
{
type: 'healing',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.healing.actions.heal.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.healing.actions.heal.description',
img: 'icons/magic/life/cross-beam-green.webp',
target: {
type: 'self'
},
damage: {
parts: [
{
applyTo: 'hitPoints',
value: {
custom: {
enabled: true,
formula: 1
}
}
}
]
}
}
]
},
heavy: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.heavy.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.heavy.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.heavy.effects.heavy.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.heavy.effects.heavy.description',
img: 'icons/commodities/metal/ingot-worn-iron.webp',
changes: [
{
key: 'system.evasion',
mode: 2,
value: '-1'
}
]
}
]
},
hooked: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.hooked.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.hooked.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.hooked.actions.hook.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.hooked.actions.hook.description',
img: 'icons/skills/melee/strike-chain-whip-blue.webp'
}
]
},
hot: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.hot.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.hot.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.hot.actions.hot.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.hot.actions.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',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.invigorating.actions.invigorate.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.invigorating.actions.invigorate.description',
img: 'icons/magic/life/heart-cross-green.webp'
}
]
},
lifestealing: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.lifestealing.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.lifestealing.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.lifestealing.actions.lifesteal.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.lifestealing.actions.lifesteal.description',
img: 'icons/magic/unholy/hand-claw-fire-blue.webp'
}
]
},
lockedOn: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.lockedOn.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.lockedOn.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.lockedOn.actions.lockOn.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.lockedOn.actions.lockOn.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',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.long.actions.long.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.long.actions.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: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.lucky.actions.luck.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.lucky.actions.luck.description',
img: 'icons/magic/control/buff-luck-fortune-green.webp',
cost: [
{
key: 'stress',
value: 1
}
]
}
]
},
massive: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.massive.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.massive.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.massive.effects.massive.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.massive.effects.massive.description',
img: 'icons/skills/melee/strike-flail-destructive-yellow.webp',
changes: [
{
key: 'system.evasion',
mode: 2,
value: '-1'
}
]
}
]
},
painful: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.painful.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.painful.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.painful.actions.pain.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.painful.actions.pain.description',
img: 'icons/skills/wounds/injury-face-impact-orange.webp',
cost: [
{
key: 'stress',
value: 1
}
]
}
]
},
paired: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.paired.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.paired.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.paired.effects.paired.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.paired.effects.paired.description',
img: 'icons/skills/melee/weapons-crossed-swords-yellow-teal.webp',
changes: [
{
key: 'system.bonuses.damage.primaryWeapon.bonus',
mode: 2,
value: 'ITEM.@system.tier + 1'
}
],
system: {
rangeDependence: {
enabled: true,
range: 'melee',
target: 'hostile',
type: 'withinRange'
}
}
}
]
},
parry: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.parry.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.parry.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.parry.actions.parry.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.parry.actions.parry.description',
img: 'icons/skills/melee/shield-block-fire-orange.webp'
}
]
},
persuasive: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.actions.persuade.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.actions.persuade.description',
img: 'icons/magic/control/hypnosis-mesmerism-eye.webp',
target: {
type: 'self'
},
cost: [
{
key: 'stress',
value: 1
}
],
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.effects.persuasive.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.effects.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',
description: 'DAGGERHEART.CONFIG.WeaponFeature.pompous.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.pompous.actions.pompous.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.pompous.actions.pompous.description',
img: 'icons/magic/control/control-influence-crown-gold.webp'
}
]
},
powerful: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.powerful.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.powerful.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.powerful.effects.powerful.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.powerful.effects.powerful.description',
img: 'icons/magic/control/buff-flight-wings-runes-red-yellow.webp',
changes: []
}
]
},
protective: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.protective.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.protective.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.protective.effects.protective.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.protective.effects.protective.description',
img: 'icons/skills/melee/shield-block-gray-orange.webp',
changes: [
{
key: 'system.armorScore',
mode: 2,
value: 'ITEM.@system.tier'
}
]
}
]
},
quick: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.quick.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.quick.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.quick.actions.quick.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.quick.actions.quick.description',
img: 'icons/skills/movement/arrow-upward-yellow.webp',
cost: [
{
key: 'stress',
value: 1
}
]
}
]
},
reliable: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.reliable.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.reliable.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.reliable.effects.reliable.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.reliable.effects.reliable.description',
img: 'icons/skills/melee/strike-sword-slashing-red.webp',
changes: [
{
key: 'system.bonuses.roll.primaryWeapon.bonus',
mode: 2,
value: 1
}
]
}
]
},
reloading: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.reloading.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.reloading.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.reloading.actions.reload.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.reloading.actions.reload.description',
img: 'icons/weapons/ammunition/shot-round-blue.webp'
}
]
},
retractable: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.retractable.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.retractable.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.retractable.actions.retract.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.retractable.actions.retract.description',
img: 'icons/skills/melee/blade-tip-smoke-green.webp'
}
]
},
returning: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.returning.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.returning.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.returning.actions.return.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.returning.actions.return.description',
img: 'icons/magic/movement/trail-streak-pink.webp'
}
]
},
scary: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.scary.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.scary.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.scary.actions.scare.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.scary.actions.scare.description',
img: 'icons/magic/death/skull-energy-light-purple.webp'
}
]
},
selfCorrecting: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.selfCorrecting.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.selfCorrecting.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.selfCorrecting.effects.selfCorrecting.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.selfCorrecting.effects.selfCorrecting.description',
img: 'icons/weapons/ammunition/arrow-broadhead-glowing-orange.webp',
changes: []
}
]
},
serrated: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.serrated.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.serrated.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.serrated.effects.serrated.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.serrated.effects.serrated.description',
img: 'icons/weapons/ammunition/arrow-broadhead-glowing-orange.webp',
changes: []
}
]
},
sharpwing: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.sharpwing.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.sharpwing.description',
effects: [
{
name: 'DAGGERHEART.CONFIG.WeaponFeature.sharpwing.effects.sharpwing.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.sharpwing.effects.sharpwing.description',
img: 'icons/weapons/swords/sword-winged-pink.webp',
changes: [
{
key: 'system.bonuses.damage.primaryWeapon.bonus',
mode: 2,
value: '@system.traits.agility.value',
priority: 21
}
]
}
]
},
sheltering: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.sheltering.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.sheltering.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.sheltering.actions.shelter.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.sheltering.actions.shelter.description',
img: 'icons/skills/melee/shield-block-gray-yellow.webp'
}
]
},
startling: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.startling.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.startling.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.startling.actions.startle.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.startling.actions.startle.description',
img: 'icons/magic/control/fear-fright-mask-orange.webp',
cost: [
{
key: 'stress',
value: 1
}
]
}
]
},
timebending: {
label: 'DAGGERHEART.CONFIG.WeaponFeature.timebending.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.timebending.description',
actions: [
{
type: 'effect',
chatDisplay: true,
name: 'DAGGERHEART.CONFIG.WeaponFeature.timebending.actions.bendTime.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.timebending.actions.bendTime.description',
img: 'icons/magic/time/clock-spinning-gold-pink.webp'
}
]
}
};
export const allWeaponFeatures = () => {
const homebrewFeatures = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).itemFeatures
.weaponFeatures;
return {
...weaponFeatures,
...Object.keys(homebrewFeatures).reduce((acc, key) => {
const feature = homebrewFeatures[key];
const actions = feature.actions.map(action => ({
...action,
effects: action.effects.map(effect => feature.effects.find(x => x.id === effect._id)),
type: action.type
}));
const actionEffects = actions.flatMap(a => a.effects);
const effects = feature.effects.filter(effect => !actionEffects.some(x => x.id === effect.id));
acc[key] = { ...feature, label: feature.name, effects, actions };
return acc;
}, {})
};
};
export const orderedWeaponFeatures = () => {
const homebrewFeatures = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).itemFeatures
.weaponFeatures;
const allFeatures = { ...weaponFeatures, ...homebrewFeatures };
const all = Object.keys(allFeatures).map(key => {
const feature = allFeatures[key];
return {
...feature,
id: key,
label: feature.label ?? feature.name
};
});
return Object.values(all).sort((a, b) => game.i18n.localize(a.label).localeCompare(game.i18n.localize(b.label)));
};
export const featureForm = {
passive: 'DAGGERHEART.CONFIG.FeatureForm.passive',
action: 'DAGGERHEART.CONFIG.FeatureForm.action',
reaction: 'DAGGERHEART.CONFIG.FeatureForm.reaction'
};
export const featureTypes = {
ancestry: {
id: 'ancestry',
label: 'TYPES.Item.ancestry'
},
community: {
id: 'community',
label: 'TYPES.Item.community'
},
companion: {
id: 'companion',
label: 'TYPES.Actor.companion'
},
class: {
id: 'class',
label: 'TYPES.Item.class'
},
subclass: {
id: 'subclass',
label: 'TYPES.Item.subclass'
},
domainCard: {
id: 'domainCard',
label: 'TYPES.Item.domainCard'
},
armor: {
id: 'armor',
label: 'TYPES.Item.armor'
},
weapon: {
id: 'weapon',
label: 'TYPES.Item.weapon'
},
consumable: {
id: 'consumable',
label: 'TYPES.Item.consumable'
},
loot: {
id: 'loot',
label: 'TYPES.Item.loot'
},
beastform: {
if: 'beastform',
label: 'TYPES.Item.beastform'
}
};
export const featureSubTypes = {
primary: 'primary',
secondary: 'secondary',
hope: 'hope',
class: 'class',
foundation: 'foundation',
specialization: 'specialization',
mastery: 'mastery'
};
export const itemResourceTypes = {
simple: {
id: 'simple',
label: 'DAGGERHEART.CONFIG.ItemResourceType.simple'
},
diceValue: {
id: 'diceValue',
label: 'DAGGERHEART.CONFIG.ItemResourceType.diceValue'
},
die: {
id: 'die',
label: 'DAGGERHEART.CONFIG.ItemResourceType.die'
}
};
export const itemResourceProgression = {
increasing: {
id: 'increasing',
label: 'DAGGERHEART.CONFIG.ItemResourceProgression.increasing'
},
decreasing: {
id: 'decreasing',
label: 'DAGGERHEART.CONFIG.ItemResourceProgression.decreasing'
}
};
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'
}
};
export const originItemType = {
itemCollection: 'itemCollection',
restMove: 'restMove'
};