Skip to content

Commit fc8a696

Browse files
authored
Add an affinity field to the damage rule trigger (#844)
1 parent 0ea7c87 commit fc8a696

File tree

6 files changed

+42
-2
lines changed

6 files changed

+42
-2
lines changed

lang/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,7 @@
542542
"DamageIce": "Ice",
543543
"DamageLight": "Light",
544544
"DamagePoison": "Poison",
545+
"Affinity": "Affinity",
545546
"AffinityNormal": "Normal",
546547
"AffinityVulnerable": "Vulnerable",
547548
"AffinityVulnerableHint": "Vulnerable Multiplier",

module/checks/common-events.mjs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ function attack(inspector, actor, item) {
7575
* @typedef DamageEvent
7676
* @property {CharacterInfo|null} source
7777
* @property {DamageType} type
78+
* @property {FUAffinity} affinity
7879
* @property {InlineSourceInfo} sourceInfo
7980
* @property {FUItemGroup} damageSource
8081
* @property {Number} amount
@@ -87,7 +88,7 @@ function attack(inspector, actor, item) {
8788
* @property {String} origin An id used to prevent cascading.
8889
*/
8990

90-
async function damage(type, amount, traits, sourceActor, targetActor, sourceInfo, origin, renderData) {
91+
async function damage(type, affinity, amount, traits, sourceActor, targetActor, sourceInfo, origin, renderData) {
9192
const source = CharacterInfo.fromActor(sourceActor);
9293
const target = CharacterInfo.fromActor(targetActor);
9394
const item = sourceInfo.resolveItem();
@@ -98,6 +99,7 @@ async function damage(type, amount, traits, sourceActor, targetActor, sourceInfo
9899
amount: amount,
99100
item: item,
100101
type: type,
102+
affinity: affinity,
101103
source: source,
102104
sourceActor: sourceInfo,
103105
damageSource: damageSource,

module/documents/effects/triggers/damage-rule-trigger.mjs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const fields = foundry.data.fields;
1111
* @property {DamageType} damageTypes
1212
* @property {Set<FUItemGroup>} damageSource
1313
* @property {FUThreshold} damageThreshold
14+
* @property {FUAffinity} affinity
1415
* @inheritDoc
1516
*/
1617
export class DamageRuleTrigger extends RuleTriggerDataModel {
@@ -33,6 +34,11 @@ export class DamageRuleTrigger extends RuleTriggerDataModel {
3334
choices: Object.keys(FU.damageTypes),
3435
blank: true,
3536
}),
37+
affinity: new fields.StringField({
38+
initial: '',
39+
choices: Object.keys(FU.affValue),
40+
blank: true,
41+
}),
3642
damageSources: new fields.SetField(new fields.StringField()),
3743
damageThreshold: new fields.SchemaField({
3844
operator: new fields.StringField({ initial: '', blank: true, choices: Object.keys(FU.comparisonOperator) }),
@@ -87,6 +93,12 @@ export class DamageRuleTrigger extends RuleTriggerDataModel {
8793
return false;
8894
}
8995

96+
if (this.affinity) {
97+
if (context.event.affinity !== this.affinity) {
98+
return false;
99+
}
100+
}
101+
90102
return true;
91103
}
92104
}

module/helpers/config.mjs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ FU.affTypeAbbr = {
158158
3: 'FU.AffinityAbsorptionAbbr',
159159
};
160160

161+
/**
162+
* @typedef {'none'|'vulnerability'|'resistance'|'immunity'|'absorption'} FUAffinity
163+
*/
164+
161165
FU.affValue = {
162166
vulnerability: -1,
163167
none: 0,
@@ -166,6 +170,19 @@ FU.affValue = {
166170
absorption: 3,
167171
};
168172

173+
FU.affinities = {
174+
vulnerability: 'FU.AffinityVulnerable',
175+
none: 'FU.AffinityNormal',
176+
resistance: 'FU.AffinityResistance',
177+
immunity: 'FU.AffinityImmune',
178+
absorption: 'FU.AffinityAbsorption',
179+
};
180+
181+
/**
182+
* @desc For reverse lookups.
183+
*/
184+
FU.affinityKeyByValue = Object.fromEntries(Object.entries(FU.affValue).map(([k, v]) => [v, k]));
185+
169186
/**
170187
* @typedef {"beast" | "construct" | "demon" | "elemental" | "humanoid" | "monster" | "plant" | "undead" | "custom"} FUSpeciesKey
171188
*/

module/pipelines/damage-pipeline.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,7 @@ async function process(request) {
516516
postRenderActions: [],
517517
};
518518

519-
await CommonEvents.damage(request.damageType, damageTaken, context.traits, context.sourceActor, actor, context.sourceInfo, request.origin, renderData);
519+
await CommonEvents.damage(request.damageType, FU.affinityKeyByValue[context.affinity], damageTaken, context.traits, context.sourceActor, actor, context.sourceInfo, request.origin, renderData);
520520
await CommonEvents.resource(request.sourceActor, request.targets, resource, -damageTaken, request.origin, renderData);
521521
TokenUtils.showFloatyText(actor, `${-damageTaken} ${resource.toUpperCase()}`, color);
522522

templates/effects/triggers/damage-rule-trigger.hbs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@
1111
{{formGroup trigger.schema.fields.damageSources value=trigger.damageSources options=options.damageSourceOptions name=(pfuConcat path ".damageSources") classes="fu-rule-element__set stacked"}}
1212
</div>
1313

14+
<label class="fu-rule-element__property">
15+
<span>{{localize 'FU.Affinity'}}</span>
16+
<select name="{{pfuConcat path ".affinity"}}">
17+
<option value="">-</option>
18+
{{selectOptions options.affinities selected=trigger.affinity sort=true localize=true}}
19+
</select>
20+
</label>
21+
1422
<div class="fu-rule-element__property-row">
1523
<label class="fu-rule-element__property">
1624
<span>{{localize 'FU.ComparisonOperator'}}</span>

0 commit comments

Comments
 (0)