Skip to content

Commit 4fbf0c7

Browse files
authored
Update dance automation (#938)
1 parent 0dd6fdf commit 4fbf0c7

File tree

3 files changed

+76
-17
lines changed

3 files changed

+76
-17
lines changed

module/documents/items/classFeature/dancer/dance-data-model.mjs

Lines changed: 56 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
import { RollableClassFeatureDataModel } from '../class-feature-data-model.mjs';
2-
import { Flags } from '../../../../helpers/flags.mjs';
2+
import { Flags, FlagUtility } from '../../../../helpers/flags.mjs';
33
import { SYSTEM } from '../../../../helpers/config.mjs';
44
import { CommonEvents } from '../../../../checks/common-events.mjs';
55
import { TextEditor } from '../../../../helpers/text-editor.mjs';
6-
import FoundryUtils from '../../../../helpers/foundry-utils.mjs';
6+
import { FeatureTraits } from '../../../../pipelines/traits.mjs';
7+
import { CommonSections } from '../../../../checks/common-sections.mjs';
8+
import { FUChatBuilder } from '../../../../helpers/chat-builder.mjs';
9+
import { StringUtils } from '../../../../helpers/string-utils.mjs';
10+
import { Effects } from '../../../../pipelines/effects.mjs';
11+
import { systemId } from '../../../../helpers/system-utils.mjs';
712

813
const durations = {
914
instant: 'FU.ClassFeatureDanceDurationInstant',
@@ -44,21 +49,58 @@ export class DanceDataModel extends RollableClassFeatureDataModel {
4449
}
4550

4651
static async roll(model, item, isShift) {
47-
const data = {
48-
duration: durations[model.duration],
49-
description: await TextEditor.enrichHTML(model.description),
52+
/** @type FURenderData **/
53+
const renderData = {
54+
sections: [],
55+
postRenderActions: [],
56+
tags: [
57+
{
58+
tag: `${StringUtils.localize('FU.ClassFeatureDanceDuration')}:`,
59+
value: StringUtils.localize(durations[model.duration]),
60+
},
61+
],
5062
};
51-
const speaker = ChatMessage.implementation.getSpeaker({ actor: item.actor });
52-
const chatMessage = {
53-
speaker,
54-
flavor: await FoundryUtils.renderTemplate('chat/chat-check-flavor-item-v2', { item: item }),
55-
content: await foundry.applications.handlebars.renderTemplate('systems/projectfu/templates/feature/dancer/feature-dance-chat-message.hbs', data),
56-
flags: {
57-
[SYSTEM]: { [Flags.ChatMessage.Item]: item.uuid },
58-
},
63+
64+
const actor = item.parent;
65+
CommonSections.itemFlavor(renderData.sections, item);
66+
const description = await TextEditor.enrichHTML(model.description);
67+
CommonSections.genericText(renderData.sections, description);
68+
const flags = {
69+
[SYSTEM]: { [Flags.ChatMessage.Item]: item.uuid },
5970
};
6071

72+
/** @type ResourceExpense **/
73+
const expense = {
74+
source: 'skill',
75+
resource: 'mp',
76+
amount: 10,
77+
};
78+
79+
const currentDance = item.system.fuid;
80+
const previousDance = actor?.getFlag(systemId, Flags.State.PreviousDance);
81+
if (previousDance && currentDance !== previousDance) {
82+
expense.amount = 5;
83+
}
84+
85+
CommonSections.expense(renderData, actor, item, [], flags, expense);
86+
await CommonEvents.feature(actor, item, [FeatureTraits.Dance], renderData);
87+
88+
Effects.createTemporaryEffect(actor, 'temporary', 'Previous Dance', {
89+
img: item.img,
90+
system: {
91+
duration: {
92+
event: 'endOfTurn',
93+
interval: 1,
94+
},
95+
},
96+
changes: [FlagUtility.getEffectChange(Flags.State.PreviousDance, currentDance)],
97+
});
98+
99+
const builder = new FUChatBuilder(actor, item);
100+
builder.withFlags(flags);
101+
builder.withData(renderData);
102+
await builder.create();
103+
61104
CommonEvents.skill(item.actor, item);
62-
ChatMessage.create(chatMessage);
63105
}
64106
}

module/helpers/flags.mjs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
* @remarks Flag data can be of any type, as long as it can be JSON.stringify'd. Flags can be used with almost all types of documents — not just Actors and Items, but nearly everything in Foundry. Settings are the only exception.
66
*/
77

8+
import { systemId } from './system-utils.mjs';
9+
810
/**
911
* @description The keys for scoped flags commonly used by the system. They are stored and accessed by documents such as actors, chat messages.
1012
* @example Usage: actor.getFlag(Flags.Scope, Flags.CurrentTurn)
@@ -54,7 +56,20 @@ export const Flags = Object.freeze({
5456
WeaponMagicCheck: 'weaponMagicCheck',
5557
ApexAttribute: 'apexAttribute',
5658
}),
59+
State: Object.freeze({
60+
PreviousDance: 'previousDance',
61+
}),
5762
Modifier: Object.freeze({
5863
ScaleIncomingDamage: 'scaleIncomingDamage',
5964
}),
6065
});
66+
67+
export const FlagUtility = Object.freeze({
68+
getEffectChange: (flag, value) => {
69+
return {
70+
key: `flags.${systemId}.${flag}`,
71+
mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE,
72+
value: value,
73+
};
74+
},
75+
});

module/pipelines/effects.mjs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,13 @@ import { systemId } from '../helpers/system-utils.mjs';
6161

6262
/**
6363
* @param {Actor|Item} owner The owning document which manages this effect
64-
* @param {String} effectType
64+
* @param {'temporary'|'inactive'} effectType
6565
* @param {String} name
66+
* @param {ActiveEffectData} data
6667
* @returns {*}
6768
* @remarks Effects created this way will by default be removed at the end of the scene
6869
*/
69-
function createTemporaryEffect(owner, effectType, name = undefined) {
70+
function createTemporaryEffect(owner, effectType, name = undefined, data = {}) {
7071
const system = {
7172
duration: {
7273
event: effectType === 'passive' ? 'none' : 'endOfScene',
@@ -75,12 +76,13 @@ function createTemporaryEffect(owner, effectType, name = undefined) {
7576
return owner.createEmbeddedDocuments('ActiveEffect', [
7677
{
7778
name: name ?? (owner instanceof FUItem ? owner.name : game.i18n.localize('FU.NewEffect')),
78-
img: 'icons/svg/aura.svg',
79+
img: owner instanceof FUItem ? owner.img : 'icons/svg/aura.svg',
7980
source: owner.uuid,
8081
origin: owner.uuid,
8182
system: system,
8283
'duration.rounds': effectType === 'temporary' ? 1 : undefined,
8384
disabled: effectType === 'inactive',
85+
...data,
8486
},
8587
]);
8688
}

0 commit comments

Comments
 (0)