mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-19 00:19:03 +01:00
Merge branch 'main' into feature/416-reaction-roll-query
This commit is contained in:
commit
702038c41e
17 changed files with 203 additions and 32 deletions
|
|
@ -13,8 +13,9 @@ export default class DhpDeathMove extends HandlebarsApplicationMixin(Application
|
|||
}
|
||||
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ['daggerheart', 'views', 'death-move'],
|
||||
position: { width: 800, height: 'auto' },
|
||||
classes: ['daggerheart', 'dh-style', 'dialog', 'views', 'death-move'],
|
||||
position: { width: 'auto', height: 'auto' },
|
||||
window: { icon: 'fa-solid fa-skull' },
|
||||
actions: {
|
||||
selectMove: this.selectMove,
|
||||
takeMove: this.takeMove
|
||||
|
|
@ -32,6 +33,7 @@ export default class DhpDeathMove extends HandlebarsApplicationMixin(Application
|
|||
const context = await super._prepareContext(_options);
|
||||
context.selectedMove = this.selectedMove;
|
||||
context.options = CONFIG.DH.GENERAL.deathMoves;
|
||||
context.title = game.i18n.localize('DAGGERHEART.APPLICATIONS.DeathMove.takeMove');
|
||||
|
||||
return context;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,12 +66,9 @@ export default class DHTokenHUD extends foundry.applications.hud.TokenHUD {
|
|||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -99,7 +99,17 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac
|
|||
async _preparePartContext(partId, context) {
|
||||
const partContext = await super._preparePartContext(partId, context);
|
||||
switch (partId) {
|
||||
case 'changes':
|
||||
case 'details':
|
||||
const useGeneric = game.settings.get(
|
||||
CONFIG.DH.id,
|
||||
CONFIG.DH.SETTINGS.gameSettings.appearance
|
||||
).showGenericStatusEffects;
|
||||
if (!useGeneric) {
|
||||
partContext.statuses = Object.values(CONFIG.DH.GENERAL.conditions).map(status => ({
|
||||
value: status.id,
|
||||
label: game.i18n.localize(status.name)
|
||||
}));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -10,8 +10,28 @@ export default class DhTokenPlaceable extends foundry.canvas.placeables.Token {
|
|||
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'));
|
||||
const statusMap = new Map(foundry.CONFIG.statusEffects.map(status => [status.id, status]));
|
||||
const activeEffects = (this.actor ? this.actor.effects.filter(x => !x.disabled) : []).reduce((acc, effect) => {
|
||||
acc.push(effect);
|
||||
|
||||
const currentStatusActiveEffects = acc.filter(
|
||||
x => x.statuses.size === 1 && x.name === game.i18n.localize(statusMap.get(x.statuses.first()).name)
|
||||
);
|
||||
for (var status of effect.statuses) {
|
||||
if (!currentStatusActiveEffects.find(x => x.statuses.includes(status))) {
|
||||
const statusData = statusMap.get(status);
|
||||
acc.push({
|
||||
name: game.i18n.localize(statusData.name),
|
||||
statuses: [status],
|
||||
img: statusData.icon,
|
||||
tint: effect.tint
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return acc;
|
||||
}, []);
|
||||
const overlayEffect = activeEffects.findLast(e => e.img && e.getFlag?.('core', 'overlay'));
|
||||
|
||||
// Draw effects
|
||||
const promises = [];
|
||||
|
|
|
|||
|
|
@ -322,18 +322,21 @@ export const deathMoves = {
|
|||
id: 'avoidDeath',
|
||||
name: 'DAGGERHEART.CONFIG.DeathMoves.avoidDeath.name',
|
||||
img: 'icons/magic/time/hourglass-yellow-green.webp',
|
||||
icon: 'fa-person-running',
|
||||
description: 'DAGGERHEART.CONFIG.DeathMoves.avoidDeath.description'
|
||||
},
|
||||
riskItAll: {
|
||||
id: 'riskItAll',
|
||||
name: 'DAGGERHEART.CONFIG.DeathMoves.riskItAll.name',
|
||||
img: 'icons/sundries/gaming/dice-pair-white-green.webp',
|
||||
icon: 'fa-dice',
|
||||
description: 'DAGGERHEART.CONFIG.DeathMoves.riskItAll.description'
|
||||
},
|
||||
blazeOfGlory: {
|
||||
id: 'blazeOfGlory',
|
||||
name: 'DAGGERHEART.CONFIG.DeathMoves.blazeOfGlory.name',
|
||||
img: 'icons/magic/life/heart-cross-strong-flame-purple-orange.webp',
|
||||
icon: 'fa-burst',
|
||||
description: 'DAGGERHEART.CONFIG.DeathMoves.blazeOfGlory.description'
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -41,6 +41,14 @@ export default class DhActiveEffect extends ActiveEffect {
|
|||
});
|
||||
}
|
||||
|
||||
get localizedStatuses() {
|
||||
const statusMap = new Map(foundry.CONFIG.statusEffects.map(status => [status.id, status.name]));
|
||||
return this.statuses.map(x => ({
|
||||
key: x,
|
||||
name: game.i18n.localize(statusMap.get(x))
|
||||
}));
|
||||
}
|
||||
|
||||
async _preCreate(data, options, user) {
|
||||
const update = {};
|
||||
if (!data.img) {
|
||||
|
|
|
|||
|
|
@ -388,6 +388,41 @@ export default class DhpActor extends Actor {
|
|||
return this.system.difficulty ?? 10;
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
async toggleStatusEffect(statusId, { active, overlay = false } = {}) {
|
||||
const status = CONFIG.statusEffects.find(e => e.id === statusId);
|
||||
if (!status) throw new Error(`Invalid status ID "${statusId}" provided to Actor#toggleStatusEffect`);
|
||||
const existing = [];
|
||||
|
||||
// Find the effect with the static _id of the status effect
|
||||
if (status._id) {
|
||||
const effect = this.effects.get(status._id);
|
||||
if (effect) existing.push(effect.id);
|
||||
}
|
||||
|
||||
// If no static _id, find all effects that have this status
|
||||
else {
|
||||
for (const effect of this.effects) {
|
||||
if (effect.statuses.has(status.id)) existing.push(effect.id);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove the existing effects unless the status effect is forced active
|
||||
if (existing.length) {
|
||||
if (active) return true;
|
||||
await this.deleteEmbeddedDocuments('ActiveEffect', existing);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create a new effect unless the status effect is forced inactive
|
||||
if (!active && active !== undefined) return;
|
||||
|
||||
const ActiveEffect = getDocumentClass('ActiveEffect');
|
||||
const effect = await ActiveEffect.fromStatusEffect(statusId);
|
||||
if (overlay) effect.updateSource({ 'flags.core.overlay': true });
|
||||
return ActiveEffect.implementation.create(effect, { parent: this, keepId: true });
|
||||
}
|
||||
|
||||
getRollData() {
|
||||
const rollData = super.getRollData();
|
||||
rollData.system = this.system.getRollData();
|
||||
|
|
@ -508,16 +543,16 @@ export default class DhpActor extends Actor {
|
|||
Object.entries(healings).forEach(([key, healing]) => {
|
||||
healing.parts.forEach(part => {
|
||||
const update = updates.find(u => u.key === key);
|
||||
if (update)
|
||||
update.value += part.total;
|
||||
if (update) update.value += part.total;
|
||||
else updates.push({ value: part.total, key });
|
||||
});
|
||||
});
|
||||
|
||||
updates.forEach(
|
||||
u =>
|
||||
(u.value =
|
||||
!(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false) ? u.value * -1 : u.value)
|
||||
(u.value = !(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false)
|
||||
? u.value * -1
|
||||
: u.value)
|
||||
);
|
||||
|
||||
await this.modifyResource(updates);
|
||||
|
|
@ -564,7 +599,7 @@ export default class DhpActor extends Actor {
|
|||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Object.keys(updates).forEach(async key => {
|
||||
const u = updates[key];
|
||||
if (key === 'items') {
|
||||
|
|
|
|||
|
|
@ -87,6 +87,26 @@ export default class DhTooltipManager extends foundry.helpers.interaction.Toolti
|
|||
this.tooltip.innerHTML = html;
|
||||
}
|
||||
}
|
||||
|
||||
const deathMove = element.dataset.tooltip?.startsWith('#deathMove#');
|
||||
if (deathMove) {
|
||||
const name = element.dataset.deathName;
|
||||
const img = element.dataset.deathImg;
|
||||
const description = element.dataset.deathDescription;
|
||||
|
||||
html = await foundry.applications.handlebars.renderTemplate(
|
||||
`systems/daggerheart/templates/ui/tooltip/death-move.hbs`,
|
||||
{
|
||||
move: { name: name, img: img, description: description }
|
||||
}
|
||||
);
|
||||
|
||||
this.tooltip.innerHTML = html;
|
||||
options.direction = this._determineItemTooltipDirection(
|
||||
element,
|
||||
this.constructor.TOOLTIP_DIRECTIONS.RIGHT
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
super.activate(element, { ...options, html: html });
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue