import { M5Character } from "../actors/M5Character" import { M5RollData, M5RollResult, M5Skill } from "../M5Base" import { M5Roll } from "../rolls/M5Roll" export class M5Item extends Item { static readonly SKILL = "skill" prepareDerivedData() { const actor = (this.actor as any) const character = actor as M5Character const context = (this as any).data const calc = context.data.calc if (context.type === "skill") { calc.bonus = 0 if (context.data?.attribute && context.data?.attribute !== "" && character) { const attribute = character.attribute(context.data.attribute) calc.bonus += M5Character.attributeBonus(attribute) } calc.ew = context.data.fw + calc.bonus } else if (context.type === "weapon") { calc.fw = 0 calc.bonus = 0 calc.special = context.data.special ? 2 : 0 calc.ew = calc.special + context.data.stats.attackBonus calc.combatSkills = null if (actor) { const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true }) calc.ew += actorCalc.stats.attackBonus const skill = character.getSkill(context.data.skillId) as any //console.log("M5Item.prepareDerivedData:weapon", context.data, skill?.data?.data) if (skill) { skill.prepareDerivedData() const skillData = skill.data.data calc.ew += skillData.calc.ew calc.bonus += skillData.calc.bonus calc.fw += skillData.fw } calc.combatSkills = actorCalc.skills.combat } } else if (context.type === "defensiveWeapon") { calc.fw = 0 calc.bonus = 0 calc.special = context.data.special ? 2 : 0 calc.ew = calc.special + context.data.stats.defenseBonus calc.combatSkills = null if (actor) { const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true }) calc.ew += actorCalc.stats.defense + actorCalc.stats.defenseBonus const skill = character.getSkill(context.data.skillId) as any //console.log("M5Item.prepareDerivedData:weapon", context.data, skill?.data?.data) if (skill) { skill.prepareDerivedData() const skillData = skill.data.data calc.ew += skillData.calc.ew calc.bonus += skillData.calc.bonus calc.fw += skillData.fw } calc.combatSkills = actorCalc.skills.combat } } else if (context.type === "spell") { calc.ew = context.data.bonus if (actor) { const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true }) calc.ew += actorCalc.stats.spellCasting } } } getRollData() { const actor = this.actor as any const context = (this as any).data let ret: M5RollData = actor?.getRollData() ?? { c: null, i: null, iType: null, rolls: {}, res: {} } ret.i = context.data ret.iType = context.type return ret } async roll() { const item = (this as any).data // Initialize chat data. const speaker = ChatMessage.getSpeaker({ actor: this.actor }) const rollMode = (game as Game).settings.get('core', 'rollMode') const label = `[${item.type}] ${item.name}` // If there's no roll data, send a chat message. const formulaNames = item.data.rolls?.formulas ? Object.keys(item.data.rolls.formulas) : [] if (formulaNames.length > 0) { const rollData = this.getRollData() formulaNames.forEach(formulaName => { const formula = item.data.rolls.formulas[formulaName] rollData.rolls[formulaName] = { formula: formula.formula, label: formula.label, type: formula.type, result: "", total: 0, totalStr: "", dice: {} } as M5RollResult }) const roll = new M5Roll(rollData, this.actor, item.name) return roll.toMessage() } else { ChatMessage.create({ speaker: speaker, rollMode: rollMode, flavor: label, content: item.data.description ?? '' }) return null } } }