import DaggerheartAction from "../action.mjs"; import { MappingField } from "../fields.mjs"; export default class DhpEffects extends foundry.abstract.TypeDataModel { static defineSchema() { const fields = foundry.data.fields; return { effects: new MappingField(new fields.SchemaField({ type: new fields.StringField({ choices: Object.keys(SYSTEM.EFFECTS.effectTypes) }), valueType: new fields.StringField({ choices: Object.keys(SYSTEM.EFFECTS.valueTypes) }), parseType: new fields.StringField({ choices: Object.keys(SYSTEM.EFFECTS.parseTypes) }), initiallySelected: new fields.BooleanField({ initial: true }), options: new fields.ArrayField(new fields.SchemaField({ name: new fields.StringField({}), value: new fields.StringField({}), }), { nullable: true, initial: null }), dataField: new fields.StringField({}), appliesOn: new fields.StringField({ choices: Object.keys(SYSTEM.EFFECTS.applyLocations) }, { nullable: true, initial: null }), applyLocationChoices: new MappingField(new fields.StringField({}), { nullable: true, initial: null }), valueData: new fields.SchemaField({ value: new fields.StringField({}), fromValue: new fields.StringField({ initial: null, nullable: true }), type: new fields.StringField({ initial: null, nullable: true }), hopeIncrease: new fields.StringField({ initial: null, nullable: true }) }), })), actions: new fields.ArrayField(new fields.EmbeddedDataField(DaggerheartAction)), // actions: new fields.SchemaField({ // damage: new fields.ArrayField(new fields.SchemaField({ // type: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.extendedDamageTypes), initial: SYSTEM.GENERAL.extendedDamageTypes.physical.id }), // value: new fields.StringField({}), // })), // uses: new fields.SchemaField({ // nr: new fields.StringField({}), // refreshType: new fields.StringField({ choices: Object.keys(SYSTEM.GENERAL.refreshTypes), initial: SYSTEM.GENERAL.refreshTypes.session.id }), // refreshed: new fields.BooleanField({ initial: true }), // }), // }), } } get effectData(){ const effectValues = Object.values(this.effects); const effectCategories = Object.keys(SYSTEM.EFFECTS.effectTypes).reduce((acc, effectType) => { acc[effectType] = effectValues.reduce((acc, effect) => { if(effect.type === effectType){ acc.push({ ...effect, valueData: this.#parseValues(effect.parseType, effect.valueData) }); } return acc; }, []); return acc; }, {}); return effectCategories; } #parseValues(parseType, values){ return Object.keys(values).reduce((acc, prop) => { acc[prop] = this.#parseValue(parseType, values[prop]); return acc; }, {}); } #parseValue(parseType, value) { switch(parseType){ case SYSTEM.EFFECTS.parseTypes.number.id: return Number.parseInt(value); default: return value; } } }