foundry-vtt-system-midgard5/source/module/items/M5Item.ts

134 lines
3.8 KiB
TypeScript

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
}
}
}