mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-07-22 10:29:54 +02:00
Merge branch 'weapon-tokens' of github.com:Skarlso/daggerheart into weapon-tokens
This commit is contained in:
commit
8082cb3a18
454 changed files with 3347 additions and 4751 deletions
|
|
@ -622,22 +622,30 @@ export default class DhpActor extends Actor {
|
|||
return rollData;
|
||||
}
|
||||
|
||||
#canReduceDamage(hpDamage, type) {
|
||||
const { stressDamageReduction, disabledArmor } = this.system.rules.damageReduction;
|
||||
#canReduceDamage(hpDamage, types) {
|
||||
const { stressDamageReduction, disabledArmor, reduceSeverity, thresholdImmunities } =
|
||||
this.system.rules.damageReduction;
|
||||
if (disabledArmor) return false;
|
||||
|
||||
const availableStress = this.system.resources.stress.max - this.system.resources.stress.value;
|
||||
|
||||
const canUseArmor =
|
||||
this.system.armorScore.value < this.system.armorScore.max &&
|
||||
type.every(t => this.system.armorApplicableDamageTypes[t] === true);
|
||||
types.every(t => this.system.armorApplicableDamageTypes[t] === true);
|
||||
|
||||
const canUseStress = Object.keys(stressDamageReduction).reduce((acc, x) => {
|
||||
const rule = stressDamageReduction[x];
|
||||
if (damageKeyToNumber(x) <= hpDamage) return acc || (rule.enabled && availableStress >= rule.cost);
|
||||
return acc;
|
||||
}, false);
|
||||
|
||||
return canUseArmor || canUseStress;
|
||||
const hasReduceSeverity = types.some(t => reduceSeverity[t]);
|
||||
|
||||
const hasThresholdImmunity = Object.entries(thresholdImmunities)
|
||||
.filter(([key, value]) => Boolean(value) && damageKeyToNumber(key) === hpDamage)
|
||||
.length;
|
||||
|
||||
return canUseArmor || canUseStress || hasReduceSeverity || hasThresholdImmunity;
|
||||
}
|
||||
|
||||
async takeDamage(damages, isDirect = false) {
|
||||
|
|
|
|||
|
|
@ -3,6 +3,13 @@ import { emitGMUpdate, emitGMCreate, GMUpdateEvent } from '../systemRegistration
|
|||
export default class DhpChatMessage extends foundry.documents.ChatMessage {
|
||||
targetHook = null;
|
||||
|
||||
static #EXPAND_SECTIONS = [
|
||||
{ selector: 'roll-section [data-action="expandRoll"]', key: 'roll' },
|
||||
{ selector: 'damage-section', key: 'damage' },
|
||||
{ selector: 'target-section', key: 'target' },
|
||||
{ selector: 'description-section', key: 'desc' }
|
||||
];
|
||||
|
||||
async renderHTML() {
|
||||
const actor = game.actors.get(this.speaker.actor);
|
||||
const actorData =
|
||||
|
|
@ -89,23 +96,26 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
|
|||
}
|
||||
}
|
||||
|
||||
// Check registered selectors and the main item section for expanding
|
||||
// Preserving during re-render is handled by core foundry on anything with [data-action=expandRoll]
|
||||
const autoExpandRoll = game.settings.get(
|
||||
CONFIG.DH.id,
|
||||
CONFIG.DH.SETTINGS.gameSettings.appearance
|
||||
).expandRollMessage,
|
||||
rollSections = html.querySelectorAll('.roll-part'),
|
||||
itemDesc = html.querySelector('.domain-card-move');
|
||||
rollSections.forEach(s => {
|
||||
if (s.classList.contains('roll-section')) {
|
||||
const toExpand = s.querySelector('[data-action="expandRoll"]');
|
||||
toExpand.classList.toggle('expanded', autoExpandRoll.roll);
|
||||
} else if (s.classList.contains('damage-section'))
|
||||
s.classList.toggle('expanded', autoExpandRoll.damage);
|
||||
else if (s.classList.contains('target-section')) s.classList.toggle('expanded', autoExpandRoll.target);
|
||||
else if (s.classList.contains('description-section'))
|
||||
s.classList.toggle('expanded', autoExpandRoll.desc);
|
||||
});
|
||||
if (itemDesc && autoExpandRoll.desc) itemDesc.setAttribute('open', '');
|
||||
CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance
|
||||
).expandRollMessage;
|
||||
for (const { selector, key } of DhpChatMessage.#EXPAND_SECTIONS) {
|
||||
const elements = html.querySelectorAll(selector);
|
||||
for (const element of elements) {
|
||||
element.classList.toggle('expanded', autoExpandRoll[key]);
|
||||
}
|
||||
}
|
||||
|
||||
// Auto expand the item description. These are not preserved by foundry during re-renders
|
||||
const itemDesc = html.querySelector('details');
|
||||
if (itemDesc) {
|
||||
const existing = document.querySelector(`.chat-message[data-message-id="${this.id}"] details`);
|
||||
if (existing?.hasAttribute('open') ?? autoExpandRoll.desc) {
|
||||
itemDesc.setAttribute('open', '');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!this.isAuthor && !this.speakerActor?.isOwner) {
|
||||
|
|
|
|||
|
|
@ -208,10 +208,7 @@ export default class DHItem extends foundry.documents.Item {
|
|||
tags: this._getTags()
|
||||
},
|
||||
actions: item.system.actionsList,
|
||||
description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.system.description, {
|
||||
relativeTo: this.parent,
|
||||
rollData: this.parent?.getRollData() ?? {}
|
||||
})
|
||||
description: await this.system.getEnrichedDescription()
|
||||
};
|
||||
|
||||
const msg = {
|
||||
|
|
|
|||
|
|
@ -19,10 +19,10 @@ export default class DhTokenManager {
|
|||
}
|
||||
}
|
||||
|
||||
return await canvas.tokens.placeTokens(
|
||||
const placedData = await canvas.tokens.placeTokens(
|
||||
[
|
||||
{
|
||||
...actor.prototypeToken.toObject(),
|
||||
...(await actor.getTokenDocument()).toObject(),
|
||||
actorId: actor.id,
|
||||
displayName: 50,
|
||||
...tokenData
|
||||
|
|
@ -30,6 +30,8 @@ export default class DhTokenManager {
|
|||
],
|
||||
{ create: false }
|
||||
);
|
||||
|
||||
return placedData?.[0] ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -46,22 +48,24 @@ export default class DhTokenManager {
|
|||
|
||||
const createElevation = elevation ?? level.elevation.bottom;
|
||||
for (const tokenData of tokensData) {
|
||||
const previewTokens = await this.createPreview(tokenData.actor, {
|
||||
const previewToken = await this.createPreview(tokenData.actor, {
|
||||
name: tokenData.tokenPreviewName,
|
||||
level: game.user.viewedLevel,
|
||||
elevation: createElevation,
|
||||
flags: { daggerheart: { createPlacement: true } }
|
||||
});
|
||||
if (!previewTokens?.length) return null;
|
||||
if (!previewToken) return null;
|
||||
|
||||
const finalTokenData = {
|
||||
...previewToken.toObject(),
|
||||
name: tokenData.actor.prototypeToken.name,
|
||||
displayName: tokenData.actor.prototypeToken.displayName,
|
||||
flags: tokenData.actor.prototypeToken.flags
|
||||
};
|
||||
|
||||
await canvas.scene.createEmbeddedDocuments(
|
||||
'Token',
|
||||
previewTokens.map(x => ({
|
||||
...x.toObject(),
|
||||
name: tokenData.actor.prototypeToken.name,
|
||||
displayName: tokenData.actor.prototypeToken.displayName,
|
||||
flags: tokenData.actor.prototypeToken.flags
|
||||
})),
|
||||
[finalTokenData],
|
||||
{ controlObject: true, parent: canvas.scene }
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue