restores rollability also for combat skills

feature/applicationv2
macniel 2025-10-17 22:55:44 +02:00
parent e031fe712c
commit 2900a45959
4 changed files with 102 additions and 11 deletions

View File

@ -44,13 +44,89 @@ export class SkillDataModel extends BaseItem {
} }
/** /**
* Handle clickable rolls. * Determines the values to consult for the given type of roll (normal: talent roll, attack: AT, parry: PA
* @param {RollMode} rollMode * @returns {{NORMAL: string, ATTACK: string, PARRY: string}}
* @private * @constructor
*/ */
async roll(rollMode = null) { get SKILL_MODE() {
return {
NORMAL: "NORMAL",
ATTACK: "ATTACK",
PARRY: "PARRY",
}
}
/**
*
* @param rollMode {["publicroll","gmroll"] }
* @param mode
* @returns {Promise<void>}
*/
async roll(rollMode = null, mode = this.SKILL_MODE.NORMAL) {
rollMode = rollMode ?? game.settings.get('core', 'rollMode'); 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 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 roll1 = new Roll("3d20", owner.getRollData());
let evaluated1 = (await roll1.evaluate()) let evaluated1 = (await roll1.evaluate())

View File

@ -223,14 +223,10 @@ export class Character extends Actor {
getRollData() { getRollData() {
const data = super.getRollData(); const data = super.getRollData();
this.prepareDerivedData()
if (this.type !== 'character' && this.type !== 'creature') return; 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 // move sonderfertigkeiten into data, if it isn't in data the actor doesn't have that sonderfertigkeit

View File

@ -29,6 +29,7 @@ class CharacterSheet extends HandlebarsApplicationMixin(ActorSheetV2) {
resizable: true, resizable: true,
}, },
actions: { actions: {
rollCombatSkill: CharacterSheet.#rollCombatSkill,
rollSkill: CharacterSheet.#rollSkill, rollSkill: CharacterSheet.#rollSkill,
roll: CharacterSheet.#dieRoll, roll: CharacterSheet.#dieRoll,
editImage: ActorSheetV2.DEFAULT_OPTIONS.actions.editImage, editImage: ActorSheetV2.DEFAULT_OPTIONS.actions.editImage,
@ -77,14 +78,31 @@ class CharacterSheet extends HandlebarsApplicationMixin(ActorSheetV2) {
} }
} }
/**
*
* @param {PointerEvent} event
*/
static #rollSkill(event) { static #rollSkill(event) {
const {id} = event.srcElement.dataset const {id} = event.target.dataset
const skill = this.document.items.get(id) const skill = this.document.items.get(id)
if (skill?.system?.roll) { if (skill?.system?.roll) {
skill.system.roll("publicroll") 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) { static #dieRoll(event) {
event.preventDefault() event.preventDefault()
const dataset = event.currentTarget.dataset const dataset = event.currentTarget.dataset

View File

@ -5,7 +5,8 @@
<div class="die"> <div class="die">
{{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }} {{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }}
<span class="value">{{#if this.taw}} <span class="value" data-action="rollCombatSkill" title="Click: Attacke; Shift+Click: Parrieren"
data-id="{{this.id}}">{{#if this.taw}}
{{this.taw}} {{this.taw}}
{{else}} {{else}}
{{#if this.liturgiekenntnis}} {{#if this.liturgiekenntnis}}