mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-12 19:51:08 +01:00
Merged with development
This commit is contained in:
commit
aed7942fc4
69 changed files with 1092 additions and 229 deletions
|
|
@ -28,7 +28,8 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
|
|||
actionType: new fields.StringField({
|
||||
choices: CONFIG.DH.ITEM.actionTypes,
|
||||
initial: 'action',
|
||||
nullable: true
|
||||
nullable: false,
|
||||
required: true
|
||||
})
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -30,4 +30,24 @@ export default class BaseEffect extends foundry.abstract.TypeDataModel {
|
|||
})
|
||||
};
|
||||
}
|
||||
|
||||
static getDefaultObject() {
|
||||
return {
|
||||
name: 'New Effect',
|
||||
id: foundry.utils.randomID(),
|
||||
disabled: false,
|
||||
img: 'icons/magic/life/heart-cross-blue.webp',
|
||||
description: '',
|
||||
statuses: [],
|
||||
changes: [],
|
||||
system: {
|
||||
rangeDependence: {
|
||||
enabled: false,
|
||||
type: CONFIG.DH.GENERAL.rangeInclusion.withinRange.id,
|
||||
target: CONFIG.DH.GENERAL.otherTargetTypes.hostile.id,
|
||||
range: CONFIG.DH.GENERAL.range.melee.id
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -218,7 +218,8 @@ export default class CostField extends fields.ArrayField {
|
|||
* @returns
|
||||
*/
|
||||
static getRealCosts(costs) {
|
||||
const realCosts = costs?.length ? costs.filter(c => c.enabled) : [];
|
||||
const cloneCosts = foundry.utils.deepClone(costs),
|
||||
realCosts = cloneCosts?.length ? cloneCosts.filter(c => c.enabled) : [];
|
||||
let mergedCosts = [];
|
||||
realCosts.forEach(c => {
|
||||
const getCost = Object.values(mergedCosts).find(gc => gc.key === c.key);
|
||||
|
|
|
|||
|
|
@ -206,7 +206,9 @@ export class DHActionDiceData extends foundry.abstract.DataModel {
|
|||
multiplier: new fields.StringField({
|
||||
choices: CONFIG.DH.GENERAL.multiplierTypes,
|
||||
initial: 'prof',
|
||||
label: 'DAGGERHEART.ACTIONS.Config.damage.multiplier'
|
||||
label: 'DAGGERHEART.ACTIONS.Config.damage.multiplier',
|
||||
nullable: false,
|
||||
required: true
|
||||
}),
|
||||
flatMultiplier: new fields.NumberField({
|
||||
nullable: true,
|
||||
|
|
@ -216,7 +218,9 @@ export class DHActionDiceData extends foundry.abstract.DataModel {
|
|||
dice: new fields.StringField({
|
||||
choices: CONFIG.DH.GENERAL.diceTypes,
|
||||
initial: 'd6',
|
||||
label: 'DAGGERHEART.GENERAL.Dice.single'
|
||||
label: 'DAGGERHEART.GENERAL.Dice.single',
|
||||
nullable: false,
|
||||
required: true
|
||||
}),
|
||||
bonus: new fields.NumberField({ nullable: true, initial: null, label: 'DAGGERHEART.GENERAL.bonus' }),
|
||||
custom: new fields.SchemaField({
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ export default class EffectsField extends fields.ArrayField {
|
|||
let effects = this.effects;
|
||||
const messageTargets = [];
|
||||
targets.forEach(async baseToken => {
|
||||
if (this.hasSave && baseToken.saved.success === true) effects = this.effects.filter(e => e.onSave === true);
|
||||
if (this.hasSave && token.saved.success === true) effects = this.effects.filter(e => e.onSave === true);
|
||||
if (!effects.length) return;
|
||||
|
||||
const token = canvas.tokens.get(baseToken.id);
|
||||
|
|
|
|||
|
|
@ -15,13 +15,17 @@ export class DHActionRollData extends foundry.abstract.DataModel {
|
|||
bonus: new fields.NumberField({ nullable: true, initial: null, integer: true }),
|
||||
advState: new fields.StringField({
|
||||
choices: CONFIG.DH.ACTIONS.advantageState,
|
||||
initial: 'neutral'
|
||||
initial: 'neutral',
|
||||
nullable: false,
|
||||
required: true
|
||||
}),
|
||||
diceRolling: new fields.SchemaField({
|
||||
multiplier: new fields.StringField({
|
||||
choices: CONFIG.DH.GENERAL.diceSetNumbers,
|
||||
initial: 'prof',
|
||||
label: 'DAGGERHEART.ACTIONS.RollField.diceRolling.multiplier'
|
||||
label: 'DAGGERHEART.ACTIONS.RollField.diceRolling.multiplier',
|
||||
nullable: false,
|
||||
required: true
|
||||
}),
|
||||
flatMultiplier: new fields.NumberField({
|
||||
nullable: true,
|
||||
|
|
@ -31,7 +35,9 @@ export class DHActionRollData extends foundry.abstract.DataModel {
|
|||
dice: new fields.StringField({
|
||||
choices: CONFIG.DH.GENERAL.diceTypes,
|
||||
initial: CONFIG.DH.GENERAL.diceTypes.d6,
|
||||
label: 'DAGGERHEART.ACTIONS.RollField.diceRolling.dice'
|
||||
label: 'DAGGERHEART.ACTIONS.RollField.diceRolling.dice',
|
||||
nullable: false,
|
||||
required: true
|
||||
}),
|
||||
compare: new fields.StringField({
|
||||
choices: CONFIG.DH.ACTIONS.diceCompare,
|
||||
|
|
|
|||
|
|
@ -19,7 +19,9 @@ export default class SaveField extends fields.SchemaField {
|
|||
difficulty: new fields.NumberField({ nullable: true, initial: null, integer: true, min: 0 }),
|
||||
damageMod: new fields.StringField({
|
||||
initial: CONFIG.DH.ACTIONS.damageOnSave.none.id,
|
||||
choices: CONFIG.DH.ACTIONS.damageOnSave
|
||||
choices: CONFIG.DH.ACTIONS.damageOnSave,
|
||||
nullable: false,
|
||||
required: true
|
||||
})
|
||||
};
|
||||
super(saveFields, options, context);
|
||||
|
|
|
|||
|
|
@ -7,7 +7,8 @@ export default class TargetField extends fields.SchemaField {
|
|||
type: new fields.StringField({
|
||||
choices: CONFIG.DH.GENERAL.targetTypes,
|
||||
initial: CONFIG.DH.GENERAL.targetTypes.any.id,
|
||||
nullable: true
|
||||
nullable: true,
|
||||
blank: true
|
||||
}),
|
||||
amount: new fields.NumberField({ nullable: true, initial: null, integer: true, min: 0 })
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import AttachableItem from './attachableItem.mjs';
|
||||
import { armorFeatures } from '../../config/itemConfig.mjs';
|
||||
|
||||
export default class DHArmor extends AttachableItem {
|
||||
/** @inheritDoc */
|
||||
|
|
@ -25,7 +24,7 @@ export default class DHArmor extends AttachableItem {
|
|||
new fields.SchemaField({
|
||||
value: new fields.StringField({
|
||||
required: true,
|
||||
choices: CONFIG.DH.ITEM.armorFeatures,
|
||||
choices: CONFIG.DH.ITEM.allArmorFeatures,
|
||||
blank: true
|
||||
}),
|
||||
effectIds: new fields.ArrayField(new fields.StringField({ required: true })),
|
||||
|
|
@ -60,13 +59,14 @@ export default class DHArmor extends AttachableItem {
|
|||
const allowed = await super._preUpdate(changes, options, user);
|
||||
if (allowed === false) return false;
|
||||
|
||||
const changedArmorFeatures = changes.system?.armorFeatures ?? [];
|
||||
const removedFeatures = this.armorFeatures.filter(x => changedArmorFeatures.every(y => y.value !== x.value));
|
||||
if (changes.system?.armorFeatures) {
|
||||
const removed = this.armorFeatures.filter(x => !changes.system.armorFeatures.includes(x));
|
||||
const added = changes.system.armorFeatures.filter(x => !this.armorFeatures.includes(x));
|
||||
const added = changedArmorFeatures.filter(x => this.armorFeatures.every(y => y.value !== x.value));
|
||||
|
||||
const effectIds = [];
|
||||
const actionIds = [];
|
||||
for (var feature of removed) {
|
||||
for (var feature of removedFeatures) {
|
||||
effectIds.push(...feature.effectIds);
|
||||
actionIds.push(...feature.actionIds);
|
||||
}
|
||||
|
|
@ -76,8 +76,9 @@ export default class DHArmor extends AttachableItem {
|
|||
return acc;
|
||||
}, {});
|
||||
|
||||
const allFeatures = CONFIG.DH.ITEM.allArmorFeatures();
|
||||
for (const feature of added) {
|
||||
const featureData = armorFeatures[feature.value];
|
||||
const featureData = allFeatures[feature.value];
|
||||
if (featureData.effects?.length > 0) {
|
||||
const embeddedItems = await this.parent.createEmbeddedDocuments(
|
||||
'ActiveEffect',
|
||||
|
|
@ -91,7 +92,7 @@ export default class DHArmor extends AttachableItem {
|
|||
}
|
||||
|
||||
const newActions = {};
|
||||
if (featureData.actions?.length > 0) {
|
||||
if (featureData.actions?.length > 0 || featureData.actions?.size > 0) {
|
||||
for (let action of featureData.actions) {
|
||||
const embeddedEffects = await this.parent.createEmbeddedDocuments(
|
||||
'ActiveEffect',
|
||||
|
|
@ -110,10 +111,12 @@ export default class DHArmor extends AttachableItem {
|
|||
{
|
||||
...cls.getSourceConfig(this),
|
||||
...action,
|
||||
type: action.type,
|
||||
_id: actionId,
|
||||
name: game.i18n.localize(action.name),
|
||||
description: game.i18n.localize(action.description),
|
||||
effects: embeddedEffects.map(x => ({ _id: x.id }))
|
||||
effects: embeddedEffects.map(x => ({ _id: x.id })),
|
||||
systemPath: 'actions'
|
||||
},
|
||||
{ parent: this }
|
||||
);
|
||||
|
|
@ -126,6 +129,10 @@ export default class DHArmor extends AttachableItem {
|
|||
}
|
||||
}
|
||||
|
||||
_onUpdate(a, b, c) {
|
||||
super._onUpdate(a, b, c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a list of localized tags based on this item's type-specific properties.
|
||||
* @returns {string[]} An array of localized tag strings.
|
||||
|
|
@ -145,7 +152,8 @@ export default class DHArmor extends AttachableItem {
|
|||
*/
|
||||
_getLabels() {
|
||||
const labels = [];
|
||||
if(this.baseScore) labels.push(`${game.i18n.localize('DAGGERHEART.ITEMS.Armor.baseScore')}: ${this.baseScore}`)
|
||||
if (this.baseScore)
|
||||
labels.push(`${game.i18n.localize('DAGGERHEART.ITEMS.Armor.baseScore')}: ${this.baseScore}`);
|
||||
return labels;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ export default class DHWeapon extends AttachableItem {
|
|||
new fields.SchemaField({
|
||||
value: new fields.StringField({
|
||||
required: true,
|
||||
choices: CONFIG.DH.ITEM.weaponFeatures,
|
||||
choices: CONFIG.DH.ITEM.allWeaponFeatures,
|
||||
blank: true
|
||||
}),
|
||||
effectIds: new fields.ArrayField(new fields.StringField({ required: true })),
|
||||
|
|
@ -116,13 +116,14 @@ export default class DHWeapon extends AttachableItem {
|
|||
const allowed = await super._preUpdate(changes, options, user);
|
||||
if (allowed === false) return false;
|
||||
|
||||
const changedWeaponFeatures = changes.system?.weaponFeatures ?? [];
|
||||
const removedFeatures = this.weaponFeatures.filter(x => changedWeaponFeatures.every(y => y.value !== x.value));
|
||||
if (changes.system?.weaponFeatures) {
|
||||
const removed = this.weaponFeatures.filter(x => !changes.system.weaponFeatures.includes(x));
|
||||
const added = changes.system.weaponFeatures.filter(x => !this.weaponFeatures.includes(x));
|
||||
const added = changedWeaponFeatures.filter(x => this.weaponFeatures.every(y => y.value !== x.value));
|
||||
|
||||
const removedEffectsUpdate = [];
|
||||
const removedActionsUpdate = [];
|
||||
for (let weaponFeature of removed) {
|
||||
for (let weaponFeature of removedFeatures) {
|
||||
removedEffectsUpdate.push(...weaponFeature.effectIds);
|
||||
removedActionsUpdate.push(...weaponFeature.actionIds);
|
||||
}
|
||||
|
|
@ -133,8 +134,9 @@ export default class DHWeapon extends AttachableItem {
|
|||
return acc;
|
||||
}, {});
|
||||
|
||||
const allFeatures = CONFIG.DH.ITEM.allWeaponFeatures();
|
||||
for (let weaponFeature of added) {
|
||||
const featureData = CONFIG.DH.ITEM.weaponFeatures[weaponFeature.value];
|
||||
const featureData = allFeatures[weaponFeature.value];
|
||||
if (featureData.effects?.length > 0) {
|
||||
const embeddedItems = await this.parent.createEmbeddedDocuments(
|
||||
'ActiveEffect',
|
||||
|
|
@ -148,7 +150,7 @@ export default class DHWeapon extends AttachableItem {
|
|||
}
|
||||
|
||||
const newActions = {};
|
||||
if (featureData.actions?.length > 0) {
|
||||
if (featureData.actions?.length > 0 || featureData.actions?.size > 0) {
|
||||
for (let action of featureData.actions) {
|
||||
const embeddedEffects = await this.parent.createEmbeddedDocuments(
|
||||
'ActiveEffect',
|
||||
|
|
@ -170,10 +172,12 @@ export default class DHWeapon extends AttachableItem {
|
|||
{
|
||||
...cls.getSourceConfig(this),
|
||||
...action,
|
||||
type: action.type,
|
||||
_id: actionId,
|
||||
name: game.i18n.localize(action.name),
|
||||
description: game.i18n.localize(action.description),
|
||||
effects: embeddedEffects.map(x => ({ _id: x.id }))
|
||||
effects: embeddedEffects.map(x => ({ _id: x.id })),
|
||||
systemPath: 'actions'
|
||||
},
|
||||
{ parent: this }
|
||||
);
|
||||
|
|
|
|||
|
|
@ -169,7 +169,7 @@ export const defaultLevelTiers = {
|
|||
tiers: {
|
||||
2: {
|
||||
tier: 2,
|
||||
name: 'Tier 2',
|
||||
name: 'DAGGERHEART.APPLICATIONS.Levelup.tier2.name',
|
||||
levels: {
|
||||
start: 2,
|
||||
end: 4
|
||||
|
|
@ -232,7 +232,7 @@ export const defaultLevelTiers = {
|
|||
},
|
||||
3: {
|
||||
tier: 3,
|
||||
name: 'Tier 3',
|
||||
name: 'DAGGERHEART.APPLICATIONS.Levelup.tier3.name',
|
||||
levels: {
|
||||
start: 5,
|
||||
end: 7
|
||||
|
|
@ -313,7 +313,7 @@ export const defaultLevelTiers = {
|
|||
},
|
||||
4: {
|
||||
tier: 4,
|
||||
name: 'Tier 4',
|
||||
name: 'DAGGERHEART.APPLICATIONS.Levelup.tier4.name',
|
||||
levels: {
|
||||
start: 8,
|
||||
end: 10
|
||||
|
|
|
|||
|
|
@ -234,7 +234,7 @@ export class DhLevelup extends foundry.abstract.DataModel {
|
|||
const subclassInTier = subclasses.some(x => x.tier === Number(tierKey));
|
||||
|
||||
return {
|
||||
name: tier.name,
|
||||
name: game.i18n.localize(tier.name),
|
||||
active: this.currentLevel >= Math.min(...tier.belongingLevels),
|
||||
groups: Object.keys(tier.options).map(optionKey => {
|
||||
const option = tier.options[optionKey];
|
||||
|
|
|
|||
|
|
@ -115,7 +115,35 @@ export default class DhHomebrew extends foundry.abstract.DataModel {
|
|||
label: new fields.StringField({ required: true, label: 'DAGGERHEART.GENERAL.label' }),
|
||||
description: new fields.StringField()
|
||||
})
|
||||
)
|
||||
),
|
||||
itemFeatures: new fields.SchemaField({
|
||||
weaponFeatures: new fields.TypedObjectField(
|
||||
new fields.SchemaField({
|
||||
name: new fields.StringField({ required: true }),
|
||||
img: new fields.FilePathField({
|
||||
initial: 'icons/magic/life/cross-worn-green.webp',
|
||||
categories: ['IMAGE'],
|
||||
base64: false
|
||||
}),
|
||||
description: new fields.HTMLField(),
|
||||
actions: new ActionsField(),
|
||||
effects: new fields.ArrayField(new fields.ObjectField())
|
||||
})
|
||||
),
|
||||
armorFeatures: new fields.TypedObjectField(
|
||||
new fields.SchemaField({
|
||||
name: new fields.StringField({ required: true }),
|
||||
img: new fields.FilePathField({
|
||||
initial: 'icons/magic/life/cross-worn-green.webp',
|
||||
categories: ['IMAGE'],
|
||||
base64: false
|
||||
}),
|
||||
description: new fields.HTMLField(),
|
||||
actions: new ActionsField(),
|
||||
effects: new fields.ArrayField(new fields.ObjectField())
|
||||
})
|
||||
)
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue