Skip to content

Commit 9860bf7

Browse files
authored
FIx RE item data entries 2 (#651)
* Fix incorrect targeting data used for check outcome predicate * Fix missing trait data on apply damage rule action * Fix missing locality check for init. check trigger * Update the volcano entry * Fix up consume, crossfire and warning shot skill entries * Fix brainwave clock not advancing on the new chat action * Add the gadget infusion automation * Implement an inline action command * Add automation for painful lesson * Update agony too
1 parent 805053d commit 9860bf7

File tree

61 files changed

+889
-323
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+889
-323
lines changed

lang/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1625,6 +1625,7 @@
16251625
"RuleElement": "Rule Element",
16261626
"RuleElementOptions": "Rule Elements",
16271627
"RuleElementNew": "Add new rule element",
1628+
"RuleElementTriggered": "The triggering condition has been satisfied.",
16281629
"RuleActions": "Rule Actions",
16291630
"RuleActionMessage": "Message",
16301631
"RuleActionApplyDamage": "Apply Damage",

module/checks/check-configuration.mjs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,12 @@ class CheckConfigurer extends CheckInspector {
309309
if (!this.check.additionalData[TRAITS]) {
310310
this.check.additionalData[TRAITS] = [];
311311
}
312-
traits.forEach((t) => this.check.additionalData[TRAITS].push(t.toLowerCase()));
312+
313+
traits.flat().forEach((t) => {
314+
if (t != null) {
315+
this.check.additionalData[TRAITS].push(String(t).toLowerCase());
316+
}
317+
});
313318
return this;
314319
}
315320

module/checks/common-sections.mjs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ const actions = (sections, actor, item, targetData, flags, inspector = undefined
272272
const isDamage = checkData && damageData;
273273
const sourceInfo = InlineSourceInfo.fromInstance(actor, item);
274274
const targets = Targeting.deserializeTargetData(targetData);
275+
const traits = inspector.getTraits();
275276

276277
sections.push(async function () {
277278
/** @type {ChatAction[]} **/
@@ -299,7 +300,7 @@ const actions = (sections, actor, item, targetData, flags, inspector = undefined
299300

300301
// Damage action
301302
if (isDamage) {
302-
actions.push(DamagePipeline.getTargetedAction(damageData, sourceInfo));
303+
actions.push(DamagePipeline.getTargetedAction(damageData, sourceInfo, traits));
303304

304305
// TODO: Combine expenses among all actions?
305306
for (const mod of damageData.modifiers) {

module/checks/damage-data.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
* @property {Boolean} enabled
1111
* @property {number} amount
1212
* @property {DamageType[]} types
13+
* @property {String[]} traits
1314
* @property {ResourceExpense} expense
1415
*/
1516

@@ -67,7 +68,9 @@ export class DamageData {
6768
* @remarks Returns only those modifiers that have been enabled.
6869
*/
6970
get modifiers() {
70-
return this._modifiers.filter((m) => m.enabled && m.amount > 0);
71+
return this._modifiers.filter((m) => {
72+
return m.enabled && (m.amount > 0 || (m.traits && m.traits.length > 0));
73+
});
7174
}
7275

7376
/**

module/checks/default-section-order.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ export const CHECK_REROLL = -1100;
88

99
export const CHECK_ROLL = -1000;
1010

11-
export const CHECK_DAMAGE = -900;
11+
export const CHECK_ADDENDUM_ORDER = -900;
1212

1313
export const CHECK_RESULT = 1000;

module/documents/actors/actor.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,8 +539,11 @@ export class FUActor extends Actor {
539539
await progress.parent.parent.update({ [`system.${schemaName}.current`]: current });
540540
}
541541
// ActiveEffect
542-
else if (progress.parent.parent instanceof FUActiveEffectModel) {
542+
else if (progress.parent instanceof FUActiveEffectModel) {
543543
await progress.parent.parent.update({ [`system.rules.progress.current`]: current });
544+
// if (this.sheet.rendered) {
545+
// this.sheet.render();
546+
// }
544547
}
545548

546549
// Update this instance for tracking, though it is not the same as the one that just got replaced in the model

module/documents/effects/actions/apply-damage-rule-action.mjs

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@ import { ExpressionContext, Expressions } from '../../../expressions/expressions
44
import { DamagePipeline, DamageRequest } from '../../../pipelines/damage-pipeline.mjs';
55
import { RuleActionDataModel } from './rule-action-data-model.mjs';
66
import { SETTINGS } from '../../../settings.js';
7+
import { TraitsDataModel } from '../../items/common/traits-data-model.mjs';
8+
import { DamageTraits, TraitUtils } from '../../../pipelines/traits.mjs';
79

810
const fields = foundry.data.fields;
911

1012
/**
1113
* @property {String} amount
1214
* @property {FU.damageTypes} damageType
15+
* @property {TraitsDataModel} traits
1316
*/
1417
export class ApplyDamageRuleAction extends RuleActionDataModel {
1518
static {
@@ -25,6 +28,9 @@ export class ApplyDamageRuleAction extends RuleActionDataModel {
2528
blank: true,
2629
nullable: false,
2730
}),
31+
traits: new fields.EmbeddedDataField(TraitsDataModel, {
32+
options: TraitUtils.getOptions(DamageTraits),
33+
}),
2834
});
2935
}
3036

@@ -39,30 +45,36 @@ export class ApplyDamageRuleAction extends RuleActionDataModel {
3945
async execute(context, selected) {
4046
const targets = selected.map((t) => t.actor);
4147
const expressionContext = ExpressionContext.fromSourceInfo(context.sourceInfo, targets).withCheck(context.check);
42-
const amount = await Expressions.evaluateAsync(this.amount, expressionContext);
43-
const request = new DamageRequest(context.sourceInfo, targets, {
44-
type: this.damageType,
45-
total: amount,
46-
});
47-
request.fromOrigin(context.origin);
48-
if (game.settings.get(SYSTEM, SETTINGS.automationApplyDamage)) {
49-
await DamagePipeline.process(request);
50-
} else {
51-
if (context.event.config) {
52-
/** @type CheckConfigurer **/
53-
const config = context.event.config;
54-
if (context.check) {
55-
switch (context.check.type) {
56-
case 'display':
57-
config.setDamage(this.damageType, amount);
58-
break;
48+
const evalAmount = await Expressions.evaluateAsync(this.amount, expressionContext);
49+
50+
if (context.config) {
51+
if (context.check) {
52+
const _traits = this.traits.values;
53+
context.config.addTraits(_traits);
54+
55+
switch (context.check.type) {
56+
case 'display':
57+
context.config.setDamage(this.damageType, evalAmount);
58+
break;
5959

60-
case 'accuracy':
61-
case 'magic':
62-
config.damage.addModifier(context.label, amount, [this.damageType]);
63-
break;
64-
}
60+
case 'accuracy':
61+
case 'magic':
62+
context.config.damage.addModifier(context.label, evalAmount, [this.damageType]);
63+
break;
6564
}
65+
}
66+
} else {
67+
const request = new DamageRequest(context.sourceInfo, targets, {
68+
type: this.damageType,
69+
total: evalAmount,
70+
});
71+
if (!this.traits.empty) {
72+
request.addTraits(this.traits.values);
73+
}
74+
request.fromOrigin(context.origin);
75+
76+
if (game.settings.get(SYSTEM, SETTINGS.automationApplyDamage)) {
77+
await DamagePipeline.process(request);
6678
} else {
6779
await DamagePipeline.promptApply(request);
6880
}

module/documents/effects/actions/change-traits-rule-action.mjs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@ import { systemTemplatePath } from '../../../helpers/system-utils.mjs';
22
import { RuleActionDataModel } from './rule-action-data-model.mjs';
33
import { FUHooks } from '../../../hooks.mjs';
44
import { FU } from '../../../helpers/config.mjs';
5-
import { Traits } from '../../../pipelines/traits.mjs';
6-
import FoundryUtils from '../../../helpers/foundry-utils.mjs';
5+
import { Traits, TraitUtils } from '../../../pipelines/traits.mjs';
76
import { TraitsDataModel } from '../../items/common/traits-data-model.mjs';
87

98
const fields = foundry.data.fields;
109

1110
/**
12-
* @property {Set<String>} traits
11+
* @property {TraitsDataModel} traits
1312
* @property {FUChangeSetMode} mode
1413
*/
1514
export class ChangeTraitsRuleAction extends RuleActionDataModel {
@@ -21,14 +20,14 @@ export class ChangeTraitsRuleAction extends RuleActionDataModel {
2120
static get metadata() {
2221
return {
2322
...super.metadata,
24-
eventTypes: [FUHooks.PERFORM_CHECK_EVENT],
23+
eventTypes: [FUHooks.PERFORM_CHECK_EVENT, FUHooks.CALCULATE_DAMAGE_EVENT],
2524
};
2625
}
2726

2827
static defineSchema() {
2928
return Object.assign(super.defineSchema(), {
3029
traits: new fields.EmbeddedDataField(TraitsDataModel, {
31-
options: FoundryUtils.getFormOptions(Traits, (k, v) => k),
30+
options: TraitUtils.getOptions(Traits),
3231
}),
3332
mode: new fields.StringField({
3433
initial: 'add',
@@ -47,16 +46,14 @@ export class ChangeTraitsRuleAction extends RuleActionDataModel {
4746
}
4847

4948
async execute(context, selected) {
50-
const values = this.traits.values();
51-
if (context.eventType === FUHooks.CALCULATE_DAMAGE_EVENT) {
52-
/** @type CalculateDamageEvent **/
53-
const event = context.event;
49+
const values = this.traits.values;
50+
if (context.config) {
5451
switch (this.mode) {
5552
case 'add':
56-
event.context.addTraits(values);
53+
context.config.addTraits(values);
5754
break;
5855
case 'remove':
59-
event.context.removeTraits(values);
56+
//context.config.removeTraits(values);
6057
break;
6158
}
6259
}

module/documents/effects/actions/message-rule-action.mjs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import { FUHooks } from '../../../hooks.mjs';
55
import { CommonSections } from '../../../checks/common-sections.mjs';
66
import { Flags } from '../../../helpers/flags.mjs';
77
import { Pipeline } from '../../../pipelines/pipeline.mjs';
8-
import { CHECK_DETAILS } from '../../../checks/default-section-order.mjs';
8+
import { CHECK_ADDENDUM_ORDER } from '../../../checks/default-section-order.mjs';
9+
import { StringUtils } from '../../../helpers/string-utils.mjs';
910

1011
const { StringField } = foundry.data.fields;
1112

@@ -45,20 +46,21 @@ export class MessageRuleAction extends RuleActionDataModel {
4546
}
4647

4748
async execute(context, selected) {
48-
let flags = Pipeline.initializedFlags(Flags.ChatMessage.Item, context.item);
49+
let flags = Pipeline.initializedFlags(Flags.ChatMessage.Item, context.item.uuid);
50+
let _message = this.message || StringUtils.localize('FU.RuleElementTriggered');
4951
if (context.check) {
5052
flags = Pipeline.setFlag(flags, Flags.ChatMessage.CheckV2, context.check);
5153
}
5254
if (context.eventType === FUHooks.RENDER_CHECK_EVENT) {
5355
/** @type RenderCheckEvent **/
5456
const rce = context.event;
5557
const actor = rce.source.actor !== context.character.actor ? context.item.parent : null;
56-
CommonSections.itemText(rce.renderData, this.message, actor, context.item, flags, CHECK_DETAILS);
58+
CommonSections.itemText(rce.renderData, _message, actor, context.item, flags, CHECK_ADDENDUM_ORDER);
5759
} else {
5860
const actor = context.character.actor;
5961
const content = await FoundryUtils.renderTemplate('chat/partials/chat-item-text', {
6062
item: context.item,
61-
text: this.message,
63+
text: _message,
6264
});
6365
ChatMessage.create({
6466
flags: flags,

module/documents/effects/actions/modify-damage-rule-action.mjs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ import { ExpressionContext, Expressions } from '../../../expressions/expressions
55
import { ActionCostDataModel } from '../../items/common/action-cost-data-model.mjs';
66
import { FU } from '../../../helpers/config.mjs';
77
import { SkillDataModel } from '../../items/skill/skill-data-model.mjs';
8-
import { SkillTraits } from '../../../pipelines/traits.mjs';
8+
import { DamageTraits, SkillTraits, TraitUtils } from '../../../pipelines/traits.mjs';
9+
import { TraitsDataModel } from '../../items/common/traits-data-model.mjs';
910

1011
const fields = foundry.data.fields;
1112

1213
/**
1314
* @property {DamageType} damageType
1415
* @property {String} amount
16+
* @property {TraitsDataModel} traits
1517
* @property {Set<DamageType>} damageTypes
1618
* @property {ActionCostDataModel} cost
1719
* @property {String} variant
@@ -32,6 +34,9 @@ export class ModifyDamageRuleAction extends RuleActionDataModel {
3234
return Object.assign(super.defineSchema(), {
3335
amount: new fields.StringField({ blank: true }),
3436
damageTypes: new fields.SetField(new fields.StringField()),
37+
traits: new fields.EmbeddedDataField(TraitsDataModel, {
38+
options: TraitUtils.getOptions(DamageTraits),
39+
}),
3540
cost: new fields.EmbeddedDataField(ActionCostDataModel, {
3641
resource: {
3742
initial: '',
@@ -77,11 +82,12 @@ export class ModifyDamageRuleAction extends RuleActionDataModel {
7782
return;
7883
}
7984
for (let sl = 1; sl <= skill.level.value; sl++) {
80-
context.event.config.getDamage().addModifier(context.label, _amount * sl, types, {
85+
context.config.getDamage().addModifier(context.label, _amount * sl, types, {
8186
expense: {
8287
amount: this.cost.amount * sl,
8388
resource: this.cost.resource,
8489
},
90+
traits: this.traits.values,
8591
enabled: false,
8692
});
8793
}
@@ -90,25 +96,29 @@ export class ModifyDamageRuleAction extends RuleActionDataModel {
9096

9197
case 'psychicGift': {
9298
const brainwave = context.character.actor.resolveProgress('brainwave-clock');
93-
context.event.config.getDamage().addModifier(context.label, _amount, types, {
99+
context.config.getDamage().addModifier(context.label, _amount, types, {
94100
expense: {
95101
amount: Math.max(5, this.cost.amount * brainwave.current),
96102
resource: this.cost.resource,
97103
traits: [SkillTraits.Gift],
98104
},
105+
traits: this.traits.values,
99106
enabled: false,
100107
});
101108
break;
102109
}
103110
}
104111
} else {
105-
if (this.damageTypes.size > 0 || this.cost.amount > 0) {
106-
context.event.config.getDamage().addModifier(context.label, _amount, types, {
112+
if (this.damageTypes.size > 0 || this.cost.amount > 0 || !this.traits.empty) {
113+
context.config.getDamage().addModifier(context.label, _amount, types, {
107114
expense: this.cost,
115+
traits: this.traits.values,
108116
enabled: this.cost.amount === 0,
109117
});
110118
} else {
111-
context.event.config.addDamageBonus(context.label, _amount);
119+
context.config.addDamageBonus(context.label, _amount);
120+
// TODO: Verify...
121+
context.config.addTraits(this.traits.values);
112122
}
113123
}
114124
}

0 commit comments

Comments
 (0)