adds derived values for hold weapons

pull/50/head
macniel 2025-10-04 22:15:25 +02:00
parent 801de801ba
commit e80ed623ec
15 changed files with 207 additions and 50 deletions

View File

@ -18,6 +18,7 @@ async function preloadHandlebarsTemplates() {
return loadTemplates([ return loadTemplates([
// ui partials. // ui partials.
'systems/DSA_4-1/templates/ui/partial-rollable-button.hbs', 'systems/DSA_4-1/templates/ui/partial-rollable-button.hbs',
'systems/DSA_4-1/templates/ui/partial-rollable-weaponskill-button.hbs',
'systems/DSA_4-1/templates/ui/partial-attribute-button.hbs', 'systems/DSA_4-1/templates/ui/partial-attribute-button.hbs',
'systems/DSA_4-1/templates/ui/partial-talent-editable.hbs', 'systems/DSA_4-1/templates/ui/partial-talent-editable.hbs',
'systems/DSA_4-1/templates/ui/partial-die.hbs', 'systems/DSA_4-1/templates/ui/partial-die.hbs',

View File

@ -39,12 +39,15 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
mod: new NumberField({ required: true, integer: true }), mod: new NumberField({ required: true, integer: true }),
}), }),
aup: new SchemaField({ aup: new SchemaField({
aktuell: new NumberField({ required: true, integer: true, initial: 0 }),
mod: new NumberField({ required: true, integer: true }), mod: new NumberField({ required: true, integer: true }),
}), }),
asp: new SchemaField({ asp: new SchemaField({
aktuell: new NumberField({ required: true, integer: true, initial: 0 }),
mod: new NumberField({ required: true, integer: true }), mod: new NumberField({ required: true, integer: true }),
}), }),
kap: new SchemaField({ kap: new SchemaField({
aktuell: new NumberField({ required: true, integer: true, initial: 0 }),
mod: new NumberField({ required: true, integer: true }), mod: new NumberField({ required: true, integer: true }),
}), }),
attribute: new SchemaField({ attribute: new SchemaField({
@ -158,9 +161,6 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
} }
_initializeSource(data, options) { _initializeSource(data, options) {
if (data.heldenausruestung.length === 0) { if (data.heldenausruestung.length === 0) {
let sets = []; let sets = [];
@ -179,7 +179,6 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
} }
console.log(data)
return super._initializeSource(data, options); return super._initializeSource(data, options);
} }

View File

@ -9,6 +9,8 @@ export class SkillDataModel extends BaseItem {
name: new StringField({ required: true }), name: new StringField({ required: true }),
gruppe: new StringField({ required: true }), gruppe: new StringField({ required: true }),
taw: new NumberField({ integer: true, initial: 0 }), taw: new NumberField({ integer: true, initial: 0 }),
at: new NumberField({ required: false, integer: true, initial: 0 }),
pa: new NumberField({ required: false, integer: true, initial: 0 }),
probe: new ArrayField(new StringField(), { exact: 3 }), // References one of the eight attributes by name probe: new ArrayField(new StringField(), { exact: 3 }), // References one of the eight attributes by name
voraussetzung: new SchemaField({ voraussetzung: new SchemaField({
talent: new StringField({ model: SkillDataModel }), talent: new StringField({ model: SkillDataModel }),

View File

@ -38,16 +38,16 @@ export class Character extends Actor {
const kk = systemData.attribute.kk.aktuell; const kk = systemData.attribute.kk.aktuell;
systemData.lep.max = (ko + ko + kk) / 2 + systemData.lep.mod; systemData.lep.max = Math.round((ko + ko + kk) / 2) + systemData.lep.mod;
systemData.aup.max = (mu + ko + ge) / 2 + systemData.aup.mod; systemData.aup.max = Math.round((mu + ko + ge) / 2) + systemData.aup.mod;
systemData.asp.aktuell = (mu + _in + ch) / 2 + systemData.asp.mod; systemData.asp.max = Math.round((mu + _in + ch) / 2) + systemData.asp.mod;
systemData.at = (mu + ge + kk) / 5; systemData.at = Math.round((mu + ge + kk) / 5);
systemData.pa = (_in + ge + kk) / 5; systemData.pa = Math.round((_in + ge + kk) / 5);
systemData.fk = (_in + ff + kk) / 5; systemData.fk = Math.round((_in + ff + kk) / 5);
systemData.ini.aktuell = (mu + mu + _in + ge) / 5 + systemData.ini.mod; systemData.ini.aktuell = Math.round((mu + mu + _in + ge) / 5) + systemData.ini.mod;
systemData.mr.aktuell = (mu + kl + ko) / 5 + systemData.mr.mod; systemData.mr.aktuell = Math.round((mu + kl + ko) / 5) + systemData.mr.mod;
} }

View File

@ -24,9 +24,10 @@ export class CharacterSheet extends ActorSheet {
} }
/** @override */ /** @override */
getData() { async getData() {
const context = super.getData(); const context = super.getData();
// Use a safe clone of the actor data for further operations. // Use a safe clone of the actor data for further operations.
const actorData = context.data; const actorData = context.data;
@ -38,8 +39,7 @@ export class CharacterSheet extends ActorSheet {
this.#addAdvantagesToContext(context) this.#addAdvantagesToContext(context)
this.#addAttributesToContext(context) this.#addAttributesToContext(context)
this.#addEquipmentsToContext(context) this.#addEquipmentsToContext(context)
this.#addCombatStatistics(context) await this.#addCombatStatistics(context)
return context; return context;
} }
@ -75,6 +75,8 @@ export class CharacterSheet extends ActorSheet {
eigenschaft2: werte[1].name, eigenschaft2: werte[1].name,
eigenschaft3: werte[2].name, eigenschaft3: werte[2].name,
probe: `(${eigenschaften.join("/")})`, probe: `(${eigenschaften.join("/")})`,
at: item.system.at,
pa: item.system.pa,
id: item._id, id: item._id,
}; };
context.skills[talentGruppe].push(obj); context.skills[talentGruppe].push(obj);
@ -171,13 +173,76 @@ export class CharacterSheet extends ActorSheet {
return false return false
} }
#addCombatStatistics(context) { #findEquipmentOnSlot(slot, setNumber) {
return this.object.items.get(this.object.system.heldenausruestung[setNumber][slot])
}
#findTalentsOfEquipment(equipment) {
}
async #addCombatStatistics(context) {
const actorData = context.data; const actorData = context.data;
context.inidice = actorData.system.ini.wuerfel; context.inidice = actorData.system.ini.wuerfel;
context.inivalue = actorData.system.ini.aktuell; context.inivalue = actorData.system.ini.aktuell;
context.inimod = actorData.system.ini.mod; context.inimod = actorData.system.ini.mod;
context.aupper = Math.min((context.actor.system.aup.aktuell / context.actor.system.aup.max) * 100, 100);
context.lepper = Math.min((context.actor.system.lep.aktuell / context.actor.system.lep.max) * 100, 100);
context.lepcurrent = context.actor.system.lep.aktuell ?? 0
context.aupcurrent = context.actor.system.aup.aktuell ?? 0
const fernkampf = this.#findEquipmentOnSlot("fernkampf", 0)
const links = this.#findEquipmentOnSlot("links", 0)
const rechts = this.#findEquipmentOnSlot("rechts", 0)
context.attacks = [];
if (fernkampf) {
const fkitems = fernkampf.system.rangedSkills.map( async (skillInQuestion) => await this.object.items.getName(skillInQuestion) )
fkitems.forEach( async skill => {
const obj = await skill
console.log(this.object.system.fk, obj.system.at);
context.attacks.push({
name: obj.name,
using: fernkampf.name,
atroll: `1d20 + ${this.object.system.fk + obj.system.at}`,
at: `1w20 + ${this.object.system.fk + obj.system.at}`,
})
})
}
if (links) {
const meitems = links.system.meleeSkills.map( async (skillInQuestion) => await this.object.items.getName(skillInQuestion) )
meitems.forEach( async skill => {
const obj = await skill
context.attacks.push({
name: obj.name,
using: links.name,
atroll: `1d20 + ${this.object.system.at + obj.system.at + links.system.attackModifier}`,
at: `1w20 + ${this.object.system.at + obj.system.at + links.system.attackModifier}`,
paroll: `1d20 + ${this.object.system.pa + obj.system.pa + links.system.parryModifier}`,
pa: `1w20 + ${this.object.system.pa + obj.system.pa + links.system.parryModifier}`,
})
})
}
if (rechts) {
const meitems = rechts.system.meleeSkills.map( async (skillInQuestion) => await this.object.items.getName(skillInQuestion) )
meitems.forEach( async skill => {
const obj = await skill
console.log(this.object.system.at)
context.attacks.push({
name: obj.name,
using: rechts.name,
atroll: `1d20 + ${this.object.system.at + obj.system.at + rechts.system.attackModifier}`,
at: `1w20 + ${this.object.system.at + obj.system.at + rechts.system.attackModifier}`,
paroll: `1d20 + ${this.object.system.pa + obj.system.pa + rechts.system.parryModifier}`,
pa: `1w20 + ${this.object.system.pa + obj.system.pa + rechts.system.parryModifier}`,
})
})
}
// add weapons to sidebar
} }
#addEquipmentsToContext(context) { #addEquipmentsToContext(context) {
@ -289,7 +354,11 @@ export class CharacterSheet extends ActorSheet {
} }
prepareEigenschaftRoll(actorData, name) { prepareEigenschaftRoll(actorData, name) {
if (name) {
return actorData.system.attribute[name.toLowerCase()].aktuell return actorData.system.attribute[name.toLowerCase()].aktuell
} else {
return 0
}
} }
async _onTalentRoll(event) { async _onTalentRoll(event) {

View File

@ -222,25 +222,6 @@ function mapRawJson(actor, rawJson) {
mod: filterAttribute(attributes,"Karmaenergie").mod mod: filterAttribute(attributes,"Karmaenergie").mod
} }
let attribute = filterAttribute(attributes,"Karmaenergie") let attribute = filterAttribute(attributes,"Karmaenergie")
json.attribute.at = {
mod: attribute.mod,
aktuell: attribute.value
}
attribute = filterAttribute(attributes,"at")
json.attribute.pa = {
mod: attribute.mod,
aktuell: attribute.value
}
attribute = filterAttribute(attributes,"pa")
json.attribute.at = {
mod: attribute.mod,
aktuell: attribute.value
}
attribute = filterAttribute(attributes,"fk")
json.attribute.fk = {
mod: attribute.mod,
aktuell: attribute.value
}
attribute = filterAttribute(attributes,"ini") attribute = filterAttribute(attributes,"ini")
json.ini = { json.ini = {
mod: attribute.mod, mod: attribute.mod,

View File

@ -0,0 +1,10 @@
{
"_id": "Msv0BWdwlNlF2ETU",
"_key": "!items!Msv0BWdwlNlF2ETU",
"type": "Skill",
"name": "Bogen",
"system": {
"gruppe": "Kampf",
"talent": ""
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "Msv0BWdwlNlF2EtU",
"_key": "!items!Msv0BWdwlNlF2EtU",
"type": "Skill",
"name": "Dolche",
"system": {
"gruppe": "Kampf",
"talent": ""
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "Msv0bWdwlNlF2EtU",
"_key": "!items!Msv0bWdwlNlF2EtU",
"type": "Skill",
"name": "Schwerter",
"system": {
"gruppe": "Kampf",
"talent": ""
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "Msv0bWdwlNlF2etU",
"_key": "!items!Msv0bWdwlNlF2etU",
"type": "Skill",
"name": "Säbel",
"system": {
"gruppe": "Kampf",
"talent": ""
}
}

View File

@ -13,7 +13,7 @@ $rollable_colours: (
"Wissen": colour.$talent-knowledge-color, "Wissen": colour.$talent-knowledge-color,
"Sprachen": colour.$talent-language-color, "Sprachen": colour.$talent-language-color,
"Handwerk": colour.$talent-crafting-color, "Handwerk": colour.$talent-crafting-color,
"kampftalent": colour.$kampftalent-color, "kampf": colour.$kampftalent-color,
"liturgie": colour.$liturgie-color, "liturgie": colour.$liturgie-color,
"zauber": colour.$zauber-color, "zauber": colour.$zauber-color,
); );
@ -197,7 +197,7 @@ $rollable_colours: (
@include coloring("liturgie"); @include coloring("liturgie");
@include coloring("zauber"); @include coloring("zauber");
@include coloring("talent"); @include coloring("talent");
@include coloring("kampftalent"); @include coloring("kampf");
@include coloring("Körperlich"); @include coloring("Körperlich");
@include coloring("Natur"); @include coloring("Natur");
@ -205,3 +205,4 @@ $rollable_colours: (
@include coloring("Wissen"); @include coloring("Wissen");
@include coloring("Sprachen"); @include coloring("Sprachen");
@include coloring("Handwerk"); @include coloring("Handwerk");

View File

@ -18,19 +18,27 @@
<h2 class="sidebar-element header">Kampf Daten</h2> <h2 class="sidebar-element header">Kampf Daten</h2>
<div class="sidebar-element resource-bar"> <div class="sidebar-element resource-bar">
<label>LeP:</label><span class="resource-fill" style="width: 50%"></span></div> <label>LeP: {{this.lep}}</label><span class="resource-fill" style="width: {{this.lepper}}%"></span></div>
<div class="sidebar-element resource-bar"> <div class="sidebar-element resource-bar">
<label>AuP:</label><span class="resource-fill" style="width: 80%"></span></div> <label>AuP: {{this.aup}}</label><span class="resource-fill" style="width: {{this.aupper}}%"></span></div>
<div class="sidebar-element rollable" data-roll="1d20+23" data-label="Attacke"><label>AT</label> {{#each attacks}}
<div class="formula">1W20+23</div> <div>
<h3>{{this.using}} ({{this.name}})</h3>
{{#if this.at}}
<div class="sidebar-element rollable" data-roll="{{this.atroll}}" data-label="Attacke"><label>AT</label>
<div class="formula">{{this.at}}</div>
</div> </div>
<div class="sidebar-element"><label>PA</label>: -</div> {{/if}}
<div class="sidebar-element rollable" data-label="Ausweichen" data-roll="1d6+2"><label>Ausweichen</label> {{#if this.pa}}
<div class="formula">1W6+2</div> <div class="sidebar-element rollable" data-roll="{{this.paroll}}" data-label="Parade"><label>PA</label>
<div class="formula">{{this.pa}}</div>
</div> </div>
<div class="sidebar-element rollable" data-label="Initiative" data-roll="1d6+6"><label>Initiative</label> {{/if}}
<div class="formula">1W6+6</div> </div>
{{/each}}
<div class="sidebar-element rollable" data-label="Initiative" data-roll="({{this.inidice}})d6+{{this.inivalue}}"><label>Initiative</label>
<div class="formula">{{this.inidice}}w6 +{{this.inivalue}}</div>
</div> </div>
<h2 class="sidebar-element header">Favouriten</h2> <h2 class="sidebar-element header">Favouriten</h2>
@ -82,9 +90,31 @@
<span class="inline">w6</span> <span class="inline">w6</span>
<input type="number" name="system.attribute.ini.aktuell" value="{{this.inivalue}}"/> <input type="number" name="system.attribute.ini.aktuell" value="{{this.inivalue}}"/>
</div> </div>
<div class="lebensenergie">
<label>Lebensenergie:</label>
<input type="number" name="system.lep.aktuell" value="{{actor.system.lep.aktuell}}"/>
<span class="inline">von</span>
<input type="number" name="system.lep.max" value="{{actor.system.lep.max}}"/>
</div>
<div class="ausdauer">
<label>Ausdauerpunkte:</label>
<input type="number" name="system.aup.aktuell" value="{{actor.system.aup.aktuell}}"/>
<span class="inline">von</span>
<input type="number" name="system.aup.max" value="{{actor.system.aup.max}}"/>
</div>
</div> </div>
<div class="tab skills" data-group="primary" data-tab="skills"> <div class="tab skills" data-group="primary" data-tab="skills">
<div>
<h2>Kampftalente</h2>
<ul>
{{#each skills.Kampf}}
<li>
{{> "systems/DSA_4-1/templates/ui/partial-rollable-weaponskill-button.hbs" this}}
</li>
{{/each}}
</ul>
</div>
<div> <div>
<h2>Körperliche Talente</h2> <h2>Körperliche Talente</h2>
<ul> <ul>

View File

@ -44,11 +44,23 @@
<input type="text" name="system.behinderung" value="{{system.behinderung}}" /> <input type="text" name="system.behinderung" value="{{system.behinderung}}" />
</label> </label>
</div> </div>
<div> <div>
<label>Sprachenkomplexizität <label>Sprachenkomplexizität
<input type="text" name="system.komplexität" value="{{system.komplexität}}" /> <input type="text" name="system.komplexität" value="{{system.komplexität}}" />
</label> </label>
</div> </div>
<div>
<label>Attacke
<input type="text" name="system.at" value="{{system.at}}" />
</label>
</div>
<div>
<label>Parade
<input type="text" name="system.pa" value="{{system.pa}}" />
</label>
</div>
</div> </div>
<div class="tab description" data-group="primary" data-tab="description"> <div class="tab description" data-group="primary" data-tab="description">

View File

@ -0,0 +1,22 @@
<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-eigenschaft3="{{this.eigenschaft3}}" data-taw="{{this.taw}}" data-rollEigenschaft1="{{this.rollEigenschaft1}}" data-rollEigenschaft2="{{this.rollEigenschaft2}}" data-rollEigenschaft3="{{this.rollEigenschaft3}}">
<div class="die">
{{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }}
<span class="value">{{#if this.taw}}
{{this.taw}}
{{else}}
{{#if this.liturgiekenntnis}}
<img src="{{this.liturgiekenntnis}}"/>
{{/if}}
{{/if}}
</span>
</div>
<div class="container">
<span class="name" data-id="{{this.id}}">{{this.name}}</span>
<div class="werte">
<div class="eigenschaft"><span class="name">AT</span><span class="value">{{this.at}}</span></div>
<div class="eigenschaft"><span class="name">PA</span><span class="value">{{this.pa}}</span></div>
</div>
</div>
</div>