mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-12 11:41:08 +01:00
[Feature] ActiveEffect Improvements (#439)
* Fixed so genericStatuses aren't shown in activeEffectConfig if turned off. Fixed localization of genericStatuses in Inventory-ItemV2.
* Effects with statuses on them will now add them as full additional effects so they show up on the token.
* Revert "Effects with statuses on them will now add them as full additional effects so they show up on the token."
This reverts commit 5afd7ae686.
* Redid it a better way
* Fixed so multiple statuses on an effect are still treated as active
This commit is contained in:
parent
0a944eb3d4
commit
2fbbf98f88
6 changed files with 83 additions and 13 deletions
|
|
@ -66,12 +66,9 @@ export default class DHTokenHUD extends foundry.applications.hud.TokenHUD {
|
||||||
if (!status) continue;
|
if (!status) continue;
|
||||||
if (status._id) {
|
if (status._id) {
|
||||||
if (status._id !== effect.id) continue;
|
if (status._id !== effect.id) continue;
|
||||||
} else {
|
|
||||||
if (effect.statuses.size !== 1) continue;
|
|
||||||
}
|
}
|
||||||
status.isActive = true;
|
status.isActive = true;
|
||||||
if (effect.getFlag('core', 'overlay')) status.isOverlay = 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) {
|
async _preparePartContext(partId, context) {
|
||||||
const partContext = await super._preparePartContext(partId, context);
|
const partContext = await super._preparePartContext(partId, context);
|
||||||
switch (partId) {
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,28 @@ export default class DhTokenPlaceable extends foundry.canvas.placeables.Token {
|
||||||
this.effects.overlay = null;
|
this.effects.overlay = null;
|
||||||
|
|
||||||
// Categorize effects
|
// Categorize effects
|
||||||
const activeEffects = this.actor ? Array.from(this.actor.effects).filter(x => !x.disabled) : [];
|
const statusMap = new Map(foundry.CONFIG.statusEffects.map(status => [status.id, status]));
|
||||||
const overlayEffect = activeEffects.findLast(e => e.img && e.getFlag('core', 'overlay'));
|
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
|
// Draw effects
|
||||||
const promises = [];
|
const promises = [];
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
async _preCreate(data, options, user) {
|
||||||
const update = {};
|
const update = {};
|
||||||
if (!data.img) {
|
if (!data.img) {
|
||||||
|
|
|
||||||
|
|
@ -389,6 +389,41 @@ export default class DhpActor extends Actor {
|
||||||
return this.system.difficulty ?? 10;
|
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() {
|
getRollData() {
|
||||||
const rollData = super.getRollData();
|
const rollData = super.getRollData();
|
||||||
rollData.system = this.system.getRollData();
|
rollData.system = this.system.getRollData();
|
||||||
|
|
@ -505,16 +540,16 @@ export default class DhpActor extends Actor {
|
||||||
Object.entries(healings).forEach(([key, healing]) => {
|
Object.entries(healings).forEach(([key, healing]) => {
|
||||||
healing.parts.forEach(part => {
|
healing.parts.forEach(part => {
|
||||||
const update = updates.find(u => u.key === key);
|
const update = updates.find(u => u.key === key);
|
||||||
if (update)
|
if (update) update.value += part.total;
|
||||||
update.value += part.total;
|
|
||||||
else updates.push({ value: part.total, key });
|
else updates.push({ value: part.total, key });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
updates.forEach(
|
updates.forEach(
|
||||||
u =>
|
u =>
|
||||||
(u.value =
|
(u.value = !(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false)
|
||||||
!(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false) ? u.value * -1 : u.value)
|
? u.value * -1
|
||||||
|
: u.value)
|
||||||
);
|
);
|
||||||
|
|
||||||
await this.modifyResource(updates);
|
await this.modifyResource(updates);
|
||||||
|
|
|
||||||
|
|
@ -156,8 +156,8 @@ Parameters:
|
||||||
{{localize 'DAGGERHEART.EFFECTS.Duration.passive'}}
|
{{localize 'DAGGERHEART.EFFECTS.Duration.passive'}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
{{#each item.statuses as |status|}}
|
{{#each item.localizedStatuses as |status|}}
|
||||||
<div class="tag">{{localize (concat 'DAGGERHEART.CONFIG.Condition.' status '.name')}}</div>
|
<div class="tag">{{status.name}}</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
{{else if (not hideLabels)}}
|
{{else if (not hideLabels)}}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue