[Feature] Beastform Types (#372)

* Temp

* Finished Evolved

* Fixed hybrid

* Changed generalConfig.tiers to be number based

* Weaponhandling while in beastform

* Added unarmed strike in sidebar

* Added DamageEnricher

* Added effect enricher

* Corrected downtime buttons and actions

* Added BeastformTooltip

* Split the BeastformDialog into parts with tabs

* Added temp beastform features

* rollData change

* Improvement

* character.getRollData cleanup
This commit is contained in:
WBHarry 2025-07-20 21:56:22 +02:00 committed by GitHub
parent 867947c2c5
commit 42a705a870
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
93 changed files with 2795 additions and 538 deletions

View file

@ -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 => `<i class="fa-solid ${x}"></i>`).join('');
const dualityElement = document.createElement('span');
dualityElement.innerHTML = `
<button class="enriched-damage-button"
data-value="${damage}"
data-type="${type}"
data-tooltip="${game.i18n.localize('DAGGERHEART.GENERAL.damage')}"
>
${damage}
${iconNodes}
</button>
`;
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);
};

View file

@ -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', {

View file

@ -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 = `
<a class="flexrow enriched-effect"
data-link
draggable="true"
data-uuid="${match[1]}"
data-tooltip="${game.i18n.localize('DAGGERHEART.UI.Tooltip.dragApplyEffect')}"
>
<img src="icons/svg/aura.svg" style="width: 24px;" />
<span>${effect.name}</span>
</a>
`;
return dualityElement;
}

View file

@ -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));
};