restores rollability also for combat skills
parent
e031fe712c
commit
2900a45959
|
|
@ -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<void>}
|
||||
*/
|
||||
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())
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@
|
|||
|
||||
<div class="die">
|
||||
{{> '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}}
|
||||
{{else}}
|
||||
{{#if this.liturgiekenntnis}}
|
||||
|
|
|
|||
Loading…
Reference in New Issue