Compare commits
No commits in common. "39a408fb3da99f9ab55f8fdb217d4b01cc488735" and "cdeeba9445b4a1ec636fc6d56822f9ddca3aeefd" have entirely different histories.
39a408fb3d
...
cdeeba9445
|
|
@ -578,6 +578,8 @@ export class CharacterSheet extends ActorSheet {
|
||||||
rollMode: game.settings.get('core', 'rollMode'),
|
rollMode: game.settings.get('core', 'rollMode'),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -56,10 +56,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.rollable:hover {
|
|
||||||
text-shadow: 0 0 10px rgb(255 0 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
.character {
|
.character {
|
||||||
|
|
||||||
width: 192px;
|
width: 192px;
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue