diff --git a/src/module/sheets/characterSheet.mjs b/src/module/sheets/characterSheet.mjs index 7cdef543..690260d8 100644 --- a/src/module/sheets/characterSheet.mjs +++ b/src/module/sheets/characterSheet.mjs @@ -524,8 +524,6 @@ export class CharacterSheet extends ActorSheet { rollMode: game.settings.get('core', 'rollMode'), }) } - - } } diff --git a/src/module/sheets/groupSheet.mjs b/src/module/sheets/groupSheet.mjs index fafc86a7..cf5b2010 100644 --- a/src/module/sheets/groupSheet.mjs +++ b/src/module/sheets/groupSheet.mjs @@ -83,7 +83,10 @@ export class GroupSheet extends ActorSheet { context.fields = []; - const hiddenFields = Object.entries(groupData.system.settings).filter(([key, value]) => value === true).map(([key, value]) => key) + const hiddenFields = Object.entries(groupData.system.settings) + .sort(([key, value], [otherKey, otherValue]) => key.localeCompare(otherKey)) + .filter(([key, value]) => value === true) + .map(([key, value]) => key) context.fields = {} context.fields["head"] = {} @@ -98,7 +101,6 @@ export class GroupSheet extends ActorSheet { } } - for (const characterId of groupData.system.characters) { const character = await game.actors.get(characterId) @@ -115,7 +117,19 @@ export class GroupSheet extends ActorSheet { if (!context.fields[n]) { context.fields[n] = {} } - context.fields[n][character.name] = skill.system.taw ?? 0 // TODO: Allow GM roll + const eigenschaften = Object.values(skill.system.probe); + context.fields[n][character.name] = { + taw: skill.system.taw, + eigenschaft1: eigenschaften[0], + eigenschaft2: eigenschaften[1], + eigenschaft3: eigenschaften[2], + rollEigenschaft1: character.system.attribute[eigenschaften[0].toLowerCase()].aktuell, + rollEigenschaft2: character.system.attribute[eigenschaften[1].toLowerCase()].aktuell, + rollEigenschaft3: character.system.attribute[eigenschaften[2].toLowerCase()].aktuell, + name: skill.name, + actor: character._id, + } + ?? 0 // TODO: Allow GM roll }) context.fields.head[character.name] = @@ -153,6 +167,9 @@ export class GroupSheet extends ActorSheet { } }) + context.settings = Object.fromEntries(Object.entries(groupData.system.settings) + .sort(([key, value], [otherKey, otherValue]) => key.localeCompare(otherKey))) + return await context; } @@ -160,6 +177,70 @@ export class GroupSheet extends ActorSheet { this.object.items.get(documentId).sheet.render(true) } + + _evaluateRoll(rolledDice, { + taw, + lowerThreshold = 1, + upperThreshold = 20, + countToMeisterlich = 3, + countToPatzer = 3, + werte = [] + }) { + let tap = taw; + let meisterlichCounter = 0; + let patzerCounter = 0; + let failCounter = 0; + + rolledDice.forEach((rolledDie, index) => { + if (tap < 0 && rolledDie.result > werte[index]) { + tap -= rolledDie.result - werte[index]; + if (tap < 0) { // konnte nicht vollständig ausgeglichen werden + failCounter++; + } + } else if (rolledDie.result > werte[index]) { // taw ist bereits aufgebraucht und wert kann nicht ausgeglichen werden + tap -= rolledDie.result - werte[index]; + failCounter++; + } + if (rolledDie.result <= lowerThreshold) meisterlichCounter++; + if (rolledDie.result > upperThreshold) patzerCounter++; + }) + + return { + tap, + meisterlich: meisterlichCounter === countToMeisterlich, + patzer: patzerCounter === countToPatzer, + } + } + + async _onTalentRoll(event) { + event.preventDefault(); + const dataset = event.currentTarget.dataset; + const actor = await game.actors.get(dataset.actorId); + console.log(dataset, actor) + if (dataset.rolleigenschaft1) { + let roll1 = new Roll("3d20", actor.getRollData()); + + let evaluated1 = (await roll1.evaluate()) + + const dsaDieRollEvaluated = this._evaluateRoll(evaluated1.terms[0].results, { + taw: dataset.taw, + werte: [dataset.rolleigenschaft1, dataset.rolleigenschaft2, dataset.rolleigenschaft3], + }) + + if (dsaDieRollEvaluated.tap >= 0) { // erfolg + evaluated1.toMessage({ + speaker: ChatMessage.getSpeaker({actor: actor}), + flavor: ` ${dsaDieRollEvaluated.meisterlich ? 'Meisterlich geschafft' : 'Geschafft'} mit ${dsaDieRollEvaluated.tap} Punkten übrig`, + }, {rollMode: "gmroll"}) + } else { // misserfolg + evaluated1.toMessage({ + speaker: ChatMessage.getSpeaker({actor: actor}), + flavor: ` ${dsaDieRollEvaluated.meisterlich ? 'Gepatzt' : ''} mit ${Math.abs(dsaDieRollEvaluated.tap)} Punkten daneben`, + }, {rollMode: "gmroll"}) + } + } + } + activateListeners(html) { super.activateListeners(html); @@ -190,6 +271,11 @@ export class GroupSheet extends ActorSheet { evt.stopPropagation(); }) + html.on('click', ".rollable", (evt) => { + this._onTalentRoll(evt) + evt.stopPropagation() + }) + new ContextMenu(html, '.equipment', [ { name: "Aus dem Gruppeninventar entfernen", diff --git a/src/style/_group-sheet.scss b/src/style/_group-sheet.scss index 5316d214..0f61f602 100644 --- a/src/style/_group-sheet.scss +++ b/src/style/_group-sheet.scss @@ -56,6 +56,10 @@ } } + .rollable:hover { + text-shadow: 0 0 10px rgb(255 0 0); + } + .character { width: 192px; diff --git a/src/templates/actor/group-sheet.hbs b/src/templates/actor/group-sheet.hbs index 65d7ce0d..776e34e7 100644 --- a/src/templates/actor/group-sheet.hbs +++ b/src/templates/actor/group-sheet.hbs @@ -36,7 +36,7 @@
| Charakter | +{{#each this.fields.head}} |
@@ -75,7 +75,22 @@
{{#if (eq this "-")}}
{{else}}
- {{this}}
+ {{#if this.taw}}
+
{{#if owner}}
+ {{this.taw}} ({{this.eigenschaft1}}, {{this.eigenschaft2}}
+ , {{this.eigenschaft3}})
+
+ {{else}}
+ Ja
+ {{/if}}
{{/if}}
{{/each}}
@@ -93,7 +108,7 @@
- {{#each actor.system.settings}}
+ {{#each settings}}
|
|---|