diff --git a/src/module/data/skill.mjs b/src/module/data/skill.mjs index 90d2a4f1..4385777b 100644 --- a/src/module/data/skill.mjs +++ b/src/module/data/skill.mjs @@ -44,13 +44,89 @@ export class SkillDataModel extends BaseItem { } /** - * Handle clickable rolls. - * @param {RollMode} rollMode - * @private + * Determines the values to consult for the given type of roll (normal: talent roll, attack: AT, parry: PA + * @returns {{NORMAL: string, ATTACK: string, PARRY: string}} + * @constructor */ - async roll(rollMode = null) { + get SKILL_MODE() { + return { + NORMAL: "NORMAL", + ATTACK: "ATTACK", + PARRY: "PARRY", + } + } + + + /** + * + * @param rollMode {["publicroll","gmroll"] } + * @param mode + * @returns {Promise} + */ + async roll(rollMode = null, mode = this.SKILL_MODE.NORMAL) { + + + rollMode = rollMode ?? game.settings.get('core', 'rollMode'); + + switch (mode) { + case this.SKILL_MODE.NORMAL: + return this.#talentRoll(rollMode) + case this.SKILL_MODE.ATTACK: + case this.SKILL_MODE.PARRY: + return this.#combatRoll(rollMode, mode) + } + + } + + async #combatRoll(rollMode, mode) { const owner = this.parent.parent + const rollData = owner.getRollData() + + let targetNumber = 0 + + if (mode === this.SKILL_MODE.ATTACK) { + targetNumber = this.at + owner.system.at.basis + } else { + targetNumber = this.pa + owner.system.pa.basis + } + + let roll1 = new Roll(`1d20cs<${targetNumber}`, owner.getRollData()); + + let evaluated1 = (await roll1.evaluate()) + + const rolledValue = evaluated1.terms[0].results[0].result + + if (rolledValue === 1 || rolledValue === 20) { // TODO: Modify this target + // fill with actual evaluation (targetNumber should be reduced by X and roll against that again) + } + + let message = "" + if (mode === this.SKILL_MODE.ATTACK) { + if (rolledValue <= targetNumber) { + message = `Würde treffen [${rolledValue}]` + } else { + message = `Verfehlt [${rolledValue}]` + } + } else { + if (rolledValue <= targetNumber) { + message = `Würde parrieren [${rolledValue}]` + } else { + message = `Verfehlt die parade [${rolledValue}]` + } + } + + evaluated1.toMessage({ + speaker: ChatMessage.getSpeaker({actor: owner}), + flavor: message, + rollMode, + }) + + } + + async #talentRoll(rollMode) { + const owner = this.parent.parent + let roll1 = new Roll("3d20", owner.getRollData()); let evaluated1 = (await roll1.evaluate()) diff --git a/src/module/documents/character.mjs b/src/module/documents/character.mjs index eb1cfc8c..7ec909d5 100644 --- a/src/module/documents/character.mjs +++ b/src/module/documents/character.mjs @@ -223,14 +223,10 @@ export class Character extends Actor { getRollData() { const data = super.getRollData(); + this.prepareDerivedData() if (this.type !== 'character' && this.type !== 'creature') return; - if (data.attribute) { - for (let [k, v] of Object.entries(data.attribute)) { - data[k] = foundry.utils.deepClone(v); - } - } // move sonderfertigkeiten into data, if it isn't in data the actor doesn't have that sonderfertigkeit diff --git a/src/module/sheets/characterSheet.mjs b/src/module/sheets/characterSheet.mjs index d60bc6d1..92992f52 100644 --- a/src/module/sheets/characterSheet.mjs +++ b/src/module/sheets/characterSheet.mjs @@ -29,6 +29,7 @@ class CharacterSheet extends HandlebarsApplicationMixin(ActorSheetV2) { resizable: true, }, actions: { + rollCombatSkill: CharacterSheet.#rollCombatSkill, rollSkill: CharacterSheet.#rollSkill, roll: CharacterSheet.#dieRoll, editImage: ActorSheetV2.DEFAULT_OPTIONS.actions.editImage, @@ -77,14 +78,31 @@ class CharacterSheet extends HandlebarsApplicationMixin(ActorSheetV2) { } } + + /** + * + * @param {PointerEvent} event + */ static #rollSkill(event) { - const {id} = event.srcElement.dataset + const {id} = event.target.dataset const skill = this.document.items.get(id) if (skill?.system?.roll) { skill.system.roll("publicroll") } } + /** + * + * @param {PointerEvent} event + */ + static #rollCombatSkill(event) { + const {id} = event.target.dataset + const skill = this.document.items.get(id) + if (skill?.system?.roll) { + skill.system.roll("publicroll", event.shiftKey ? "PARRY" : "ATTACK") + } + } + static #dieRoll(event) { event.preventDefault() const dataset = event.currentTarget.dataset diff --git a/src/templates/ui/partial-rollable-weaponskill-button.hbs b/src/templates/ui/partial-rollable-weaponskill-button.hbs index e1d68f60..552ea31f 100644 --- a/src/templates/ui/partial-rollable-weaponskill-button.hbs +++ b/src/templates/ui/partial-rollable-weaponskill-button.hbs @@ -5,7 +5,8 @@
{{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }} - {{#if this.taw}} + {{#if this.taw}} {{this.taw}} {{else}} {{#if this.liturgiekenntnis}}