attack rolls via manager are now chatty as well

main
macniel 2026-01-26 17:21:35 +01:00
parent f56f0be0b2
commit 487994ff24
3 changed files with 78 additions and 7 deletions

View File

@ -1,6 +1,8 @@
import {LiturgyData} from "../data/miracle/liturgyData.mjs";
import {Zonenruestung, Zonenwunde, Wunde} from "../data/trefferzone.mjs";
import {PlayerCharacterDataModel} from "../data/character.mjs";
import {evaluateRoll} from "../globals/DSARoll.mjs";
import {displayRoll} from "../globals/displayRoll.js";
export class Character extends Actor {
@ -502,15 +504,43 @@ export class Character extends Actor {
const skill = this.itemTypes["Skill"].find(p => p._id === data.skill)
const target = game.actors.get(game.scenes.current.tokens.find(p => p._id === data.target).actorId)
// TODO: Migrate to DSARoll
const roll = new Roll("1d20cs<" + data.targetNumber)
const evaluated1 = (await roll.evaluate())
let evaluated = await evaluateRoll("1d20", {
value: data.targetNumber,
mod: data.mod + data.penalty,
owner: data.actor,
werte: [0]
})
await evaluated1.toMessage({
const context = {
weapon: weapon.name,
maneuver,
skill: skill.name,
target: target.name,
attacker: this._id,
mod: data.mod,
penalty: data.penalty,
circumstance: data.circumstance,
die: evaluated.evaluated.terms[0].results[0].result,
value: data.targetNumber,
}
if (evaluated.tap>0) {
context.remaining = evaluated.tap
context.hit = true
context.critical = evaluated.meisterlich
} else {
context.missing = evaluated.tap
context.miss = true
context.fumble = evaluated.patzer
}
await displayRoll(evaluated.evaluated, game.user, data.actor, false, false, 'systems/DSA_4-1/templates/chat/attack-chat-message.hbs', context)
/*await evaluated1.toMessage({
speaker: ChatMessage.getSpeaker({actor: this}),
flavor: `Attackiert ${target.name} mit ${weapon.name} (${skill.name})<br/>${data.modDescription}`,
rollMode: "publicroll",
})
})*/
}
/**

View File

@ -11,7 +11,33 @@
*/
const displayRoll = async(roll, user=game.user, actor, blind=true, secret=true, template, templateContext) => {
const rollMode = game.settings.get('core', 'rollMode')
if (game.dice3d) {
let blind = false // hidden to user
let secret = false // hidden to others
switch (rollMode) {
case 'selfroll': // secret to others but not blind
blind = false
secret = true
break;
case 'blindgmroll': // secret to others and to user
blind = true
secret = true
break;
case 'gmroll': // secret to others but not to user
blind = false
secret = true
break;
case 'publicroll': // no secret to anyone
default:
blind = false
secret = false
}
game.dice3d.showForRoll(roll, user, true, null, blind, null,
ChatMessage.getSpeaker({actor}), {
ghost: false,
@ -23,11 +49,12 @@ const displayRoll = async(roll, user=game.user, actor, blind=true, secret=true,
try {
await loadTemplates([template])
const htmlContent = await renderTemplate(template, templateContext)
ChatMessage.create({
const chatData = await (ChatMessage.create({
user: user._id,
speaker: {actor},
content: htmlContent,
})
}))
chatData.applyRollMode("roll")
} catch (err) {
console.log(err)
}

View File

@ -0,0 +1,14 @@
<div>
<div>{{weapon}} ({{value}})</div>
<div>Gewürfelt: {{die}}</div>
<div>Erschwernis: {{circumstance}}</div>
<div>Modifikation: {{mod}}</div>
<hr>
{{#if missing}}
<div>Gefehlt: {{missing}} {{#if fumble}}Patzer{{/if}}</div>
{{else}}
<div>Übrig: {{remaining}} {{#if critical}}Meisterlich{{/if}}</div>
{{/if}}
</div>