Skip to content

Commit df3e604

Browse files
authored
Merge pull request #119 from League-of-Fabulous-Developers/V12
Foundry V12 Compatibility
2 parents 16b66fa + 5e1810d commit df3e604

29 files changed

+204
-2330
lines changed

lang/en.json

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1024,6 +1024,21 @@
10241024
"UseMetaCurrencyDialogMessage": "Do you want to use a {type} point?",
10251025
"UseMetaCurrencyChatFlavor": "{type} point used",
10261026
"UseMetaCurrencyChatMessage": "<b>{actor}</b> used a {type} point.",
1027-
"UseMetaCurrencyNotificationInsufficientPoints": "<b>{actor}</b> does not have enough {type} points."
1027+
"UseMetaCurrencyNotificationInsufficientPoints": "<b>{actor}</b> does not have enough {type} points.",
1028+
"D6": "d6",
1029+
"D8": "d8",
1030+
"D10": "d10",
1031+
"D12": "d12",
1032+
"PotencyMinor": "Minor",
1033+
"PotencyMedium": "Medium",
1034+
"PotencyMajor": "Major",
1035+
"PotencyExtreme": "Extreme",
1036+
"AreaIndividual": "Individual",
1037+
"AreaSmall": "Small",
1038+
"AreaLarge": "Large",
1039+
"AreaHuge": "Huge",
1040+
"ImprovisedEffectMinor": "Minor",
1041+
"ImprovisedEffectHeavy": "Heavy",
1042+
"ImprovisedEffectMassive": "Massive"
10281043
}
10291044
}

module/documents/actors/common/affinity-data-model.mjs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export class AffinityDataModel extends foundry.abstract.DataModel {
1717
_initialize(options = {}) {
1818
super._initialize(options);
1919

20-
let current = this.base;
20+
let current = options.current ?? this.base;
2121
Object.defineProperty(this, 'current', {
2222
configurable: false,
2323
enumerable: true,
@@ -45,4 +45,9 @@ export class AffinityDataModel extends foundry.abstract.DataModel {
4545
},
4646
});
4747
}
48+
49+
clone(data = {}, context = {}) {
50+
context.current = this.current;
51+
return super.clone(data, context);
52+
}
4853
}

module/documents/actors/common/attribute-data-model.mjs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ export class AttributeDataModel extends foundry.abstract.DataModel {
2424
_initialize(options = {}) {
2525
super._initialize(options);
2626
let thiz = this;
27+
const { current } = options;
2728
let holder = {
2829
get current() {
29-
return thiz.base;
30+
return current ?? thiz.base;
3031
},
3132
set current(value) {
3233
delete this.current;
@@ -58,4 +59,9 @@ export class AttributeDataModel extends foundry.abstract.DataModel {
5859
},
5960
});
6061
}
62+
63+
clone(data = {}, context = {}) {
64+
context.current = this.current;
65+
return super.clone(data, context);
66+
}
6167
}

module/documents/actors/npc/npc-data-model.mjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ export class NpcDataModel extends foundry.abstract.TypeDataModel {
9090
derived: new EmbeddedDataField(DerivedValuesDataModel, {}),
9191
bonuses: new EmbeddedDataField(BonusesDataModel, {}),
9292
traits: new SchemaField({ value: new StringField({ initial: '' }) }),
93-
species: new SchemaField({ value: new StringField({ initial: 'beast', choices: FU.species }) }),
94-
villain: new SchemaField({ value: new StringField({ initial: '', blank: true, choices: FU.villainTypes }) }),
93+
species: new SchemaField({ value: new StringField({ initial: 'beast', choices: Object.keys(FU.species) }) }),
94+
villain: new SchemaField({ value: new StringField({ initial: '', blank: true, choices: Object.keys(FU.villainTypes) }) }),
9595
phases: new SchemaField({ value: new NumberField({ initial: 1, min: 1, integer: true, nullable: false }) }),
9696
multipart: new SchemaField({ value: new StringField({ initial: '' }) }),
9797
isElite: new SchemaField({ value: new BooleanField({ initial: false }) }),

module/documents/effects/active-effect.mjs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,20 @@ export function onRenderActiveEffectConfig(sheet, html) {
3232
* @param delta
3333
*/
3434
export function onApplyActiveEffect(actor, change, current, delta) {
35-
if (change.key.startsWith('system.') && current instanceof foundry.abstract.DataModel && Object.hasOwn(current, delta) && current[delta] instanceof Function) {
36-
console.debug(`applying ${delta} to ${change.key}`);
37-
current[delta]();
38-
return false;
35+
if (game.release.isNewer(12)) {
36+
if (change.key.startsWith('system.') && current instanceof foundry.abstract.DataModel && Object.hasOwn(current, change.value) && current[change.value] instanceof Function) {
37+
console.debug(`applying ${change.value} to ${change.key}`);
38+
const newValue = current.clone();
39+
newValue[change.value]();
40+
foundry.utils.setProperty(actor, change.key, newValue);
41+
return false;
42+
}
43+
} else {
44+
if (change.key.startsWith('system.') && current instanceof foundry.abstract.DataModel && Object.hasOwn(current, delta) && current[delta] instanceof Function) {
45+
console.debug(`applying ${delta} to ${change.key}`);
46+
current[delta]();
47+
return false;
48+
}
3949
}
4050
}
4151

module/documents/items/classFeature/class-feature-sheet.mjs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { ClassFeatureDataModel } from './class-feature-data-model.mjs';
22
import { onManageActiveEffect, prepareActiveEffectCategories } from '../../../helpers/effects.mjs';
3+
import { FU } from '../../../helpers/config.mjs';
34

45
export class FUClassFeatureSheet extends ItemSheet {
56
static get defaultOptions() {
@@ -83,7 +84,9 @@ export class FUClassFeatureSheet extends ItemSheet {
8384
schema.apply(function () {
8485
if (this instanceof foundry.data.fields.HTMLField) {
8586
const path = this.fieldPath.split('.');
86-
path.shift(); // remove data model name
87+
if (!game.release.isNewer(12)) {
88+
path.shift(); // remove data model name
89+
}
8790
path.pop(); // remove actual field name
8891
let enrichedHtml = data.enrichedHtml;
8992
let modelData = data.system.data;
@@ -108,8 +111,11 @@ export class FUClassFeatureSheet extends ItemSheet {
108111

109112
await enrichRecursively(data.enrichedHtml);
110113
}
111-
data.features = CONFIG.FU.classFeatureRegistry.features();
114+
data.features = Object.entries(CONFIG.FU.classFeatureRegistry.features()).reduce((agg, [key, value]) => (agg[key] = value.translation) && agg, {});
112115
data.effects = prepareActiveEffectCategories(this.item.effects);
116+
117+
data.FU = FU;
118+
113119
return data;
114120
}
115121

module/documents/items/common/improvised-damage-data-model.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export class ImprovisedDamageDataModel extends foundry.abstract.DataModel {
1616
return {
1717
hasImpDamage: new SchemaField({ value: new BooleanField() }),
1818
value: new NumberField({ initial: 0, integer: true, nullable: false }),
19-
impType: new SchemaField({ value: new StringField({ initial: 'minor', choices: ['minor', 'heavy', 'massive'] }) }),
19+
impType: new SchemaField({ value: new StringField({ initial: 'minor', choices: Object.keys(FU.improvisedEffect) }) }),
2020
type: new SchemaField({ value: new StringField({ initial: 'physical', choices: Object.keys(FU.damageTypes) }) }),
2121
};
2222
}

module/documents/items/project/project-data-model.mjs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ProgressDataModel } from '../common/progress-data-model.mjs';
2+
import { FU } from '../../../helpers/config.mjs';
23

34
/**
45
* @property {string} subtype.value
@@ -34,9 +35,9 @@ export class ProjectDataModel extends foundry.abstract.TypeDataModel {
3435
showTitleCard: new SchemaField({ value: new BooleanField() }),
3536
hasClock: new SchemaField({ value: new BooleanField() }),
3637
progress: new EmbeddedDataField(ProgressDataModel, {}),
37-
potency: new SchemaField({ value: new StringField({ initial: 'minor', choices: ['minor', 'medium', 'major', 'extreme'] }) }),
38-
area: new SchemaField({ value: new StringField({ initial: 'individual', choices: ['individual', 'small', 'large', 'huge'] }) }),
39-
use: new SchemaField({ value: new StringField({ initial: 'consumable', choices: ['consumable', 'permanent'] }) }),
38+
potency: new SchemaField({ value: new StringField({ initial: 'minor', choices: Object.keys(FU.potency) }) }),
39+
area: new SchemaField({ value: new StringField({ initial: 'individual', choices: Object.keys(FU.area) }) }),
40+
use: new SchemaField({ value: new StringField({ initial: 'consumable', choices: Object.keys(FU.uses) }) }),
4041
isFlawed: new SchemaField({ value: new BooleanField() }),
4142
defectMod: new SchemaField({ value: new NumberField({ initial: 0, integer: true, nullable: false }) }),
4243
numTinker: new SchemaField({ value: new NumberField({ initial: 1, min: 1, integer: true, nullable: false }) }),

module/documents/items/ritual/ritual-data-model.mjs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { ItemAttributesDataModel } from '../common/item-attributes-data-model.mj
33
import { DamageDataModel } from '../common/damage-data-model.mjs';
44
import { ImprovisedDamageDataModel } from '../common/improvised-damage-data-model.mjs';
55
import { ProgressDataModel } from '../common/progress-data-model.mjs';
6+
import { FU } from '../../../helpers/config.mjs';
67

78
/**
89
* @property {string} subtype.value
@@ -46,8 +47,8 @@ export class RitualDataModel extends foundry.abstract.TypeDataModel {
4647
impdamage: new EmbeddedDataField(ImprovisedDamageDataModel, {}),
4748
hasClock: new SchemaField({ value: new BooleanField() }),
4849
progress: new EmbeddedDataField(ProgressDataModel, {}),
49-
potency: new SchemaField({ value: new StringField({ initial: 'minor', choices: ['minor', 'medium', 'major', 'extreme'] }) }),
50-
area: new SchemaField({ value: new StringField({ initial: 'individual', choices: ['individual', 'small', 'large', 'huge'] }) }),
50+
potency: new SchemaField({ value: new StringField({ initial: 'minor', choices: Object.keys(FU.potency) }) }),
51+
area: new SchemaField({ value: new StringField({ initial: 'individual', choices: Object.keys(FU.area) }) }),
5152
source: new SchemaField({ value: new StringField() }),
5253
hasRoll: new SchemaField({ value: new BooleanField() }),
5354
rollInfo: new SchemaField({

module/helpers/config.mjs

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,31 @@ FU.affValue = {
113113
repulsion: 4,
114114
};
115115

116-
FU.species = ['beast', 'construct', 'demon', 'elemental', 'humanoid', 'monster', 'plant', 'undead', 'custom'];
116+
FU.species = {
117+
beast: 'FU.Beast',
118+
construct: 'FU.Construct',
119+
demon: 'FU.Demon',
120+
elemental: 'FU.Elemental',
121+
humanoid: 'FU.Humanoid',
122+
monster: 'FU.Monster',
123+
plant: 'FU.Plant',
124+
undead: 'FU.Undead',
125+
custom: 'FU.Custom',
126+
};
127+
128+
FU.companionSpecies = {
129+
beast: 'FU.Beast',
130+
construct: 'FU.Construct',
131+
elemental: 'FU.Elemental',
132+
plant: 'FU.Plant',
133+
custom: 'FU.Custom',
134+
};
117135

118-
FU.villainTypes = ['minor', 'major', 'supreme'];
136+
FU.villainTypes = {
137+
minor: 'FU.VillainMinor',
138+
major: 'FU.VillainMajor',
139+
supreme: 'FU.VillainSupreme',
140+
};
119141

120142
FU.speciesRule = {
121143
beast: 'FU.BeastRule',
@@ -365,3 +387,55 @@ FU.combatHudResources = foundry.utils.mergeObject(FU.resources, {
365387
});
366388

367389
FU.classFeatures = {};
390+
391+
FU.studyRoll = {
392+
core: [10, 13, 16],
393+
revised: [7, 10, 13],
394+
};
395+
396+
FU.attributeDice = {
397+
6: 'FU.D6',
398+
8: 'FU.D8',
399+
10: 'FU.D10',
400+
12: 'FU.D12',
401+
};
402+
403+
FU.bonds = {
404+
admInf: {
405+
Admiration: 'FU.Admiration',
406+
Inferiority: 'FU.Inferiority',
407+
},
408+
loyMis: {
409+
Loyalty: 'FU.Loyalty',
410+
Mistrust: 'FU.Mistrust',
411+
},
412+
affHat: {
413+
Affection: 'FU.Affection',
414+
Hatred: 'FU.Hatred',
415+
},
416+
};
417+
418+
FU.potency = {
419+
minor: 'FU.PotencyMinor',
420+
medium: 'FU.PotencyMedium',
421+
major: 'FU.PotencyMajor',
422+
extreme: 'FU.PotencyExtreme',
423+
};
424+
425+
FU.area = {
426+
individual: 'FU.AreaIndividual',
427+
small: 'FU.AreaSmall',
428+
large: 'FU.AreaLarge',
429+
huge: 'FU.AreaHuge',
430+
};
431+
432+
FU.uses = {
433+
consumable: 'FU.Consumable',
434+
permanent: 'FU.Permanent',
435+
};
436+
437+
FU.improvisedEffect = {
438+
minor: 'FU.ImprovisedEffectMinor',
439+
heavy: 'FU.ImprovisedEffectHeavy',
440+
massive: 'FU.ImprovisedEffectMassive',
441+
};

0 commit comments

Comments
 (0)