Compare commits

..

No commits in common. "39a408fb3da99f9ab55f8fdb217d4b01cc488735" and "cdeeba9445b4a1ec636fc6d56822f9ddca3aeefd" have entirely different histories.

5 changed files with 59 additions and 194 deletions

View File

@ -578,6 +578,8 @@ export class CharacterSheet extends ActorSheet {
rollMode: game.settings.get('core', 'rollMode'), rollMode: game.settings.get('core', 'rollMode'),
}) })
} }
} }
} }

View File

@ -28,18 +28,13 @@ export class GroupSheet extends ActorSheet {
// update group // update group
let settings = {...group.system.settings} const settings = {...group.system.settings}
character.items.filter((i) => i.type === "Advantage").forEach((advantage) => { character.items.filter((i) => i.type === "Advantage").forEach((advantage) => {
if (!settings[sheet.#stringToKeyFieldName(advantage.name)]) { settings[sheet.#stringToKeyFieldName(advantage.name)] = false
settings[sheet.#stringToKeyFieldName(advantage.name)] = false
}
}) })
character.items.filter((i) => i.type === "Skill").forEach((skill) => { character.items.filter((i) => i.type === "Skill").forEach((skill) => {
if (!settings[sheet.#stringToKeyFieldName(skill.name)]) { settings[sheet.#stringToKeyFieldName(skill.name)] = false
settings[sheet.#stringToKeyFieldName(skill.name)] = false }),
}
})
await group.update({ await group.update({
system: { system: {
characters: [ characters: [
@ -60,7 +55,7 @@ export class GroupSheet extends ActorSheet {
} }
#stringToKeyFieldName(s) { #stringToKeyFieldName(s) {
return s return s.replace(/[ \[\]:]/g, "_").toLowerCase()
} }
/** @override */ /** @override */
@ -79,60 +74,14 @@ export class GroupSheet extends ActorSheet {
context.system = groupData.system; context.system = groupData.system;
context.flags = groupData.flags; context.flags = groupData.flags;
context.characters = [] context.characters = []
context.isGM = game.user.isGM;
context.fields = []; context.fields = [];
const hiddenFields = Object.entries(groupData.system.settings) const hiddenFields = Object.entries(groupData.system.settings).filter(([key, value]) => value === true).map(([key, value]) => key)
.sort(([key, value], [otherKey, otherValue]) => key.localeCompare(otherKey))
.filter(([key, value]) => value === true)
.map(([key, value]) => key)
context.fields = {}
context.fields["head"] = {}
for (const field of hiddenFields) {
context.fields[field] = {}
for (const characterId of groupData.system.characters) {
const character = await game.actors.get(characterId)
context.fields[field][character.name] = "-"
}
}
for (const characterId of groupData.system.characters) { for (const characterId of groupData.system.characters) {
const character = await game.actors.get(characterId) const character = await game.actors.get(characterId)
context.characters.push(
character.items.filter((i) => i.type === "Advantage").filter((i) => hiddenFields.includes(this.#stringToKeyFieldName(i.name))).map((advantage) => {
const n = this.#stringToKeyFieldName(advantage.name)
if (!context.fields[n]) {
context.fields[n] = {}
}
context.fields[n][character.name] = advantage.system.value ?? "Ja" // TODO: Allow GM roll
})
character.items.filter((i) => i.type === "Skill").filter((i) => hiddenFields.includes(this.#stringToKeyFieldName(i.name))).map((skill) => {
const n = this.#stringToKeyFieldName(skill.name)
if (!context.fields[n]) {
context.fields[n] = {}
}
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
})
context.fields.head[character.name] =
{ {
img: character.img, img: character.img,
name: character.name, name: character.name,
@ -147,10 +96,25 @@ export class GroupSheet extends ActorSheet {
{name: "KO", value: character.system.attribute.ko.aktuell}, {name: "KO", value: character.system.attribute.ko.aktuell},
{name: "KK", value: character.system.attribute.kk.aktuell}, {name: "KK", value: character.system.attribute.kk.aktuell},
], ],
advantages: character.items.filter((i) => i.type === "Advantage").filter((i) => hiddenFields.includes(this.#stringToKeyFieldName(i.name))).map((advantage) => {
return {
name: advantage.name,
id: advantage._id,
value: advantage.system.value,
}
}),
skills: character.items.filter((i) => i.type === "Skill").filter((i) => hiddenFields.includes(this.#stringToKeyFieldName(i.name))).map((skill) => {
return {
name: skill.name,
taw: skill.system.taw,
id: skill._id
}
}),
isLimited: character.isOwner || !character.limited, isLimited: character.isOwner || !character.limited,
isVisible: character.isOwner || character.visible, isVisible: character.isOwner || character.visible,
isOwner: character.isOwner isOwner: character.isOwner
} }
)
} }
context.equipments = []; context.equipments = [];
@ -167,9 +131,6 @@ 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; return await context;
} }
@ -177,70 +138,6 @@ export class GroupSheet extends ActorSheet {
this.object.items.get(documentId).sheet.render(true) 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) { activateListeners(html) {
super.activateListeners(html); super.activateListeners(html);
@ -271,11 +168,6 @@ export class GroupSheet extends ActorSheet {
evt.stopPropagation(); evt.stopPropagation();
}) })
html.on('click', ".rollable", (evt) => {
this._onTalentRoll(evt)
evt.stopPropagation()
})
new ContextMenu(html, '.equipment', [ new ContextMenu(html, '.equipment', [
{ {
name: "Aus dem Gruppeninventar entfernen", name: "Aus dem Gruppeninventar entfernen",

View File

@ -56,10 +56,6 @@
} }
} }
.rollable:hover {
text-shadow: 0 0 10px rgb(255 0 0);
}
.character { .character {
width: 192px; width: 192px;

View File

@ -17,7 +17,7 @@
{{!-- Sheet Body --}} {{!-- Sheet Body --}}
<section class="sheet-body"> <section class="sheet-body">
<div class="tab characters" data-group="primary" data-tab="characters"> <div class="tab characters" data-group="primary" data-tab="characters">
{{#unless isGM}} {{#if actor.limited}}
<div class="characters-overview minimal"> <div class="characters-overview minimal">
{{#each characters}} {{#each characters}}
{{#if this.isVisible}} {{#if this.isVisible}}
@ -33,19 +33,14 @@
</div> </div>
{{else}} {{else}}
<div class="characters-overview"> <div class="characters-overview">
<table> {{#each characters}}
<thead> {{#if this.isVisible}}
<tr> <div class="character">
<th></th> <div class="header clickable" data-id="{{this.id}}" data-operation="openActorSheet">
{{#each this.fields.head}} <img class="profile-img" src="{{this.img}}" style="object-fit: cover;"
<th> title="{{this.name}}" alt="{{this.name}}"/>
<div class="character"> <span class="name">{{this.name}}</span>
<div class="header clickable" data-id="{{this.id}}" </div>
data-operation="openActorSheet">
<img class="profile-img" src="{{this.img}}" style="object-fit: cover;"
title="{{this.name}}" alt="{{this.name}}"/>
<span class="name">{{this.name}}</span>
</div>
{{#if this.isLimited}} {{#if this.isLimited}}
<div class="mini-attributes"> <div class="mini-attributes">
{{#each this.attributes}} {{#each this.attributes}}
@ -56,59 +51,39 @@
</div> </div>
{{/each}} {{/each}}
</div> </div>
{{/if}} <div class="fixedElements">
<ul class="inline-list">
{{#each skills}}
<li class="mini-skill clickable" data-actor-id="{{this.id}}"
data-id="{{this.id}}">{{this.name}}: {{this.taw}}</li>{{/each}}
</ul>
<ul class="inline-list">
{{#each advantages}}
<li class="mini-advantage clickable" data-actor-id="{{this.id}}"
data-id="{{this.id}}">{{this.name}} {{#if this.value}}
[{{this.value}}]{{/if}}</li>{{/each}}
</ul>
</div> </div>
</th> {{/if}}
{{/each}} {{#if this.isOwner}}
</tr> <div class="owneroptions">
</thead> <button class="owneroption clickable" data-operation="removeFromParty"
<tbody> data-id="{{this.id}}">Leave Group
{{#each this.fields}} </button>
{{#unless (eq @key "head")}} </div>
<tr> {{/if}}
<th> </div>
{{ @key}} {{/if}}
</th> {{/each}}
{{#each this}}
<td>
{{#if (eq this "-")}}
{{else}}
{{#if this.taw}}
<div class="rollable" data-actor-id="{{this.actor}}"
data-taw="{{this.taw}}"
data-name="{{this.name}}"
data-eigenschaft1="{{this.eigenschaft1}}"
data-eigenschaft2="{{this.eigenschaft2}}"
data-eigenschaft3="{{this.eigenschaft3}}"
data-rollEigenschaft1="{{this.rollEigenschaft1}}"
data-rollEigenschaft2="{{this.rollEigenschaft2}}"
data-rollEigenschaft3="{{this.rollEigenschaft3}}">
{{this.taw}} ({{this.eigenschaft1}}, {{this.eigenschaft2}}
, {{this.eigenschaft3}})
</div>
{{else}}
Ja
{{/if}}
{{/if}}
</td>
{{/each}}
</tr>
{{/unless}}
{{/each}}
</tbody>
</table>
</div> </div>
{{/unless}} {{/if}}
</div> </div>
<div class="tab inventory" data-group="primary" data-tab="inventory"> <div class="tab inventory" data-group="primary" data-tab="inventory">
{{> 'systems/DSA_4-1/templates/ui/partial-equipment-group-button.hbs' equipments}} {{> 'systems/DSA_4-1/templates/ui/partial-equipment-group-button.hbs' equipments}}
</div> </div>
{{#if owner}} {{#if owner}}
<div class="tab settings" data-group="primary" data-tab="settings"> <div class="tab settings" data-group="primary" data-tab="settings">
{{#each settings}} {{#each actor.system.settings}}
<div> <div>
<label><input name="system.settings.{{@key}}" type="checkbox" {{checked this}}> {{@key}}</label> <label><input name="system.settings.{{@key}}" type="checkbox" {{checked this}}> {{@key}}</label>
</div> </div>

View File

@ -1,6 +1,6 @@
<div class="block rollable {{this.type}} {{this.gruppe}}" data-id="{{this.id}}" data-taw="{{this.taw}}" <div class="block rollable {{this.type}} {{this.gruppe}}" data-id="{{this.id}}" data-taw="{{this.taw}}"
data-name="{{this.name}}" data-eigenschaft1="{{this.eigenschaft1}}" data-eigenschaft2="{{this.eigenschaft2}}" data-name="{{this.name}}" data-eigenschaft1="{{this.eigenschaft1}}" data-eigenschaft2="{{this.eigenschaft2}}"
data-eigenschaft3="{{this.eigenschaft3}}" data-rollEigenschaft1="{{this.rollEigenschaft1}}" data-eigenschaft3="{{this.eigenschaft3}}" data-taw="{{this.taw}}" data-rollEigenschaft1="{{this.rollEigenschaft1}}"
data-rollEigenschaft2="{{this.rollEigenschaft2}}" data-rollEigenschaft3="{{this.rollEigenschaft3}}"> data-rollEigenschaft2="{{this.rollEigenschaft2}}" data-rollEigenschaft3="{{this.rollEigenschaft3}}">
<div class="die"> <div class="die">