add zig build for compendium packs

move document types from template.json into system.json
change Talents into Items
add rolls for Talents
change the fallback language to german
This commit is contained in:
Sven Balzer
2024-11-23 18:29:11 +01:00
parent 98dcb0749d
commit 942c395f59
170 changed files with 32606 additions and 321 deletions
+46 -34
View File
@@ -1,5 +1,8 @@
{{#*inline "die-type"}}
<div class="center die die-{{type}}">{{localize (concat "DSA41.attributes.short." type)}}</div>
<div class="die die-{{type}} die-type">
<div><svg viewbox="0 0 64 64"><use href="/systems/dsa-4th-edition/src/Assets/d20.svg#d20"></use></svg></div>
<div>{{localize (concat "DSA41.attributes.short." type)}}</div>
</div>
{{/inline}}
{{#*inline "die-value"}}
@@ -92,43 +95,52 @@
</div>
<div class="tab {{#if (eq tabGroups.primary 'tab2')}}active{{/if}}" data-group="primary" data-tab="tab2">
<fieldset>
<legend>{{localize "DSA41.talente.kampf.label"}}</legend>
<div class="Kampftalente">
<span class="center">{{localize "DSA41.talente.label"}}</span>
<span class="center">{{localize "DSA41.talente.label_talentwert"}}</span>
<span class="center">{{localize "DSA41.talente.kampf.label_attacke"}}</span>
<span class="center">{{localize "DSA41.talente.kampf.label_parade"}}</span>
<span class="center">{{localize "DSA41.talente.kampf.label_attacke_total"}}</span>
<span class="center">{{localize "DSA41.talente.kampf.label_parade_total"}}</span>
{{#each actor.system.talente}}
<div class="list subgrid-columns">
<div class="list-header">
<div class="center">{{localize (concat "DSA41.talente." @key ".label")}}</div>
<div class="center">{{localize "DSA41.talente.label_eigenschaften"}}</div>
<div class="center">{{localize "DSA41.talente.label_talentwert"}}</div>
</div>
{{#each actor.system.kampf_talente}}
<span>{{localize (concat "DSA41.talente.kampf.name." @key)}}</span>
<span>{{>editable-input type="number" name=(concat "system.kampf_talente." @key ".talentwert") value=(lookup this "talentwert")}}</span>
<span>{{>editable-input type="number" name=(concat "system.kampf_talente." @key ".attacke") value=(lookup this "attacke")}}</span>
<span>{{>editable-input type="number" name=(concat "system.kampf_talente." @key ".parade") value=(lookup this "parade")}}</span>
<span class="center">{{lookup (lookup @root.actor.system.computed.kampf.talente @key) "attacke"}}</span>
<span class="center">{{lookup (lookup @root.actor.system.computed.kampf.talente @key) "parade"}}</span>
{{#each this}}
<div class="list-item" data-item-id="{{_id}}">
<div>
<div class="fit-content" data-action="item-open">{{maybeLocalize name prefix=(concat "DSA41.talente." system.kategorie ".name")}}</div>
</div>
<div class="center" data-action="roll" data-roll-type="talent">
{{>die-type type=system.attribute1}}
{{>die-type type=system.attribute2}}
{{>die-type type=system.attribute3}}
</div>
<div>{{>editable-input type="number" data-name="system.talentwert" value=system.talentwert}}</div>
<div class="center fas fa-trash" data-action="item-delete"></div>
</div>
{{/each}}
</div>
</fieldset>
{{#each actor.system.talente}}
<fieldset>
<legend>{{localize (concat "DSA41.talente." @key ".label")}}</legend>
<div class="Talente">
<span class="center">{{localize "DSA41.talente.label"}}</span>
<span class="center">{{localize "DSA41.talente.label_eigenschaften"}}</span>
<span class="center">{{localize "DSA41.talente.label_talentwert"}}</span>
{{#each @this}}
<span>{{localize (concat "DSA41.talente." @../key ".name." @key)}}</span>
<span></span>
<span>{{>editable-input type="number" name=(concat "system.talente." @../key "." @key) value=@this}}</span>
{{/each}}
</div>
</fieldset>
{{/each}}
<div class="list Kampftalente">
<div class="list-header">
<div class="center">{{localize "DSA41.talente.kampf.label"}}</div>
<div class="center">{{localize "DSA41.talente.label_talentwert"}}</div>
<div class="center">{{localize "DSA41.talente.kampf.label_attacke"}}</div>
<div class="center">{{localize "DSA41.talente.kampf.label_parade"}}</div>
<div class="center">{{localize "DSA41.talente.kampf.label_attacke_total"}}</div>
<div class="center">{{localize "DSA41.talente.kampf.label_parade_total"}}</div>
</div>
{{#each actor.system.kampf_talente}}
<div class="list-item">
<div>{{localize (concat "DSA41.talente.kampf.name." @key)}}</div>
<div>{{>editable-input type="number" name=(concat "system.kampf_talente." @key ".talentwert") value=(lookup this "talentwert")}}</div>
<div>{{>editable-input type="number" name=(concat "system.kampf_talente." @key ".attacke") value=(lookup this "attacke")}}</div>
<div>{{>editable-input type="number" name=(concat "system.kampf_talente." @key ".parade") value=(lookup this "parade")}}</div>
<div class="center">{{lookup (lookup @root.actor.system.computed.kampf.talente @key) "attacke"}}</div>
<div class="center">{{lookup (lookup @root.actor.system.computed.kampf.talente @key) "parade"}}</div>
</div>
{{/each}}
</div>
</div>
<div class="tab {{#if (eq tabGroups.primary 'tab3')}}active{{/if}}" data-group="primary" data-tab="tab3">
+39
View File
@@ -0,0 +1,39 @@
<div class="talent_chat_message">
<h3>{{talent.name}} ({{localize (concat "DSA41.chat.talentwert_short")}}: {{talent.system.talentwert}}{{#if (ne modifikator 0)}} + {{modifikator}}{{/if}})</h3>
<div class="info">
<div>
<div>{{localize (concat "DSA41.chat.attribute")}}</div>
<div>{{localize (concat "DSA41.chat.value")}}</div>
<div>{{localize (concat "DSA41.chat.roll")}}</div>
<div>{{localize (concat "DSA41.chat.talentwert_short")}}</div>
</div>
<div>
<div>{{localize (concat "DSA41.attributes.long." attribute1.type)}}</div>
<div>{{attribute1.value}}</div>
<div>{{roll1}}</div>
<div>{{needed_taw_roll1}}</div>
</div>
<div>
<div>{{localize (concat "DSA41.attributes.long." attribute2.type)}}</div>
<div>{{attribute2.value}}</div>
<div>{{roll2}}</div>
<div>{{needed_taw_roll2}}</div>
</div>
<div>
<div>{{localize (concat "DSA41.attributes.long." attribute3.type)}}</div>
<div>{{attribute3.value}}</div>
<div>{{roll3}}</div>
<div>{{needed_taw_roll3}}</div>
</div>
</div>
<div>
{{localize (concat "DSA41.chat.result")}}:
{{#if (lt leftover_taw 0)}}
<b>{{localize (concat "DSA41.chat.failure")}}</b>
{{else}}
<b>{{localize (concat "DSA41.chat.success")}}</b>
{{/if}}
({{localize (concat "DSA41.chat.talentwert_short")}}: {{leftover_taw}})
</div>
</div>
+4
View File
@@ -0,0 +1,4 @@
<div class="talent_dialog">
<span class="colspan2">{{localize "DSA41.kampf.modifikator"}}</span>
{{>editable-input class="colspan2" type="number" name="modifikator" value=(lookup formData "modifikator") }}
</div>
+2 -2
View File
@@ -1,8 +1,8 @@
<div class="editable-input editable-{{type}} {{class}}">
{{#if (eq type "checkbox")}}
<input type="checkbox" name="{{name}}" {{checked value}}>
<input type="checkbox" name="{{name}}" data-name="{{data-name}}" {{checked value}}>
{{else}}
<input type="{{type}}" name="{{name}}" value="{{value}}" placeholder="{{placeholder}}">
<input type="{{type}}" name="{{name}}" data-name="{{data-name}}" value="{{value}}" placeholder="{{placeholder}}">
{{/if}}
{{#if placeholder}}
+55
View File
@@ -0,0 +1,55 @@
<div class="item-sheet {{ cssClass }}" autocomplete="off">
<div class="row">
<img class="item-image" src="{{ item.img }}" title="{{ item.name }}" {{#if editable}}data-edit="img"{{/if}}>
<div class="col">
<div class="grid3 gap">
{{>editable-input type="text" name="name" value=item.name placeholder=(localize "DSA41.name")}}
<div>
<select name="system.kategorie">
<option value="koerperliche" {{#if (eq item.system.kategorie "koerperliche") }}selected{{/if}}>{{localize "DSA41.talente.koerperliche.label"}} </option>
<option value="gesellschaftliche" {{#if (eq item.system.kategorie "gesellschaftliche")}}selected{{/if}}>{{localize "DSA41.talente.gesellschaftliche.label"}}</option>
<option value="natur" {{#if (eq item.system.kategorie "natur") }}selected{{/if}}>{{localize "DSA41.talente.natur.label"}} </option>
<option value="wissens" {{#if (eq item.system.kategorie "wissens") }}selected{{/if}}>{{localize "DSA41.talente.wissens.label"}} </option>
<option value="handwerks" {{#if (eq item.system.kategorie "handwerks") }}selected{{/if}}>{{localize "DSA41.talente.handwerks.label"}} </option>
</select>
<div class="placeholder">{{localize "DSA41.talente.label_kategorie"}}</div>
</div>
{{>editable-input type="text" name="system.behinderung" value=item.system.behinderung placeholder=(localize "DSA41.talente.label_behinderung")}}
</div>
<div class="grid3 gap">
<select name="system.attribute1">
<option value="courage" {{#if (eq item.system.attribute1 "courage") }}selected{{/if}}>{{localize "DSA41.attributes.long.courage"}} </option>
<option value="cleverness" {{#if (eq item.system.attribute1 "cleverness") }}selected{{/if}}>{{localize "DSA41.attributes.long.cleverness"}} </option>
<option value="intuition" {{#if (eq item.system.attribute1 "intuition") }}selected{{/if}}>{{localize "DSA41.attributes.long.intuition"}} </option>
<option value="charisma" {{#if (eq item.system.attribute1 "charisma") }}selected{{/if}}>{{localize "DSA41.attributes.long.charisma"}} </option>
<option value="dexterity" {{#if (eq item.system.attribute1 "dexterity") }}selected{{/if}}>{{localize "DSA41.attributes.long.dexterity"}} </option>
<option value="agility" {{#if (eq item.system.attribute1 "agility") }}selected{{/if}}>{{localize "DSA41.attributes.long.agility"}} </option>
<option value="constitution" {{#if (eq item.system.attribute1 "constitution")}}selected{{/if}}>{{localize "DSA41.attributes.long.constitution"}}</option>
<option value="strength" {{#if (eq item.system.attribute1 "strength") }}selected{{/if}}>{{localize "DSA41.attributes.long.strength"}} </option>
</select>
<select name="system.attribute2">
<option value="courage" {{#if (eq item.system.attribute2 "courage") }}selected{{/if}}>{{localize "DSA41.attributes.long.courage"}} </option>
<option value="cleverness" {{#if (eq item.system.attribute2 "cleverness") }}selected{{/if}}>{{localize "DSA41.attributes.long.cleverness"}} </option>
<option value="intuition" {{#if (eq item.system.attribute2 "intuition") }}selected{{/if}}>{{localize "DSA41.attributes.long.intuition"}} </option>
<option value="charisma" {{#if (eq item.system.attribute2 "charisma") }}selected{{/if}}>{{localize "DSA41.attributes.long.charisma"}} </option>
<option value="dexterity" {{#if (eq item.system.attribute2 "dexterity") }}selected{{/if}}>{{localize "DSA41.attributes.long.dexterity"}} </option>
<option value="agility" {{#if (eq item.system.attribute2 "agility") }}selected{{/if}}>{{localize "DSA41.attributes.long.agility"}} </option>
<option value="constitution" {{#if (eq item.system.attribute2 "constitution")}}selected{{/if}}>{{localize "DSA41.attributes.long.constitution"}}</option>
<option value="strength" {{#if (eq item.system.attribute2 "strength") }}selected{{/if}}>{{localize "DSA41.attributes.long.strength"}} </option>
</select>
<select name="system.attribute3">
<option value="courage" {{#if (eq item.system.attribute3 "courage") }}selected{{/if}}>{{localize "DSA41.attributes.long.courage"}} </option>
<option value="cleverness" {{#if (eq item.system.attribute3 "cleverness") }}selected{{/if}}>{{localize "DSA41.attributes.long.cleverness"}} </option>
<option value="intuition" {{#if (eq item.system.attribute3 "intuition") }}selected{{/if}}>{{localize "DSA41.attributes.long.intuition"}} </option>
<option value="charisma" {{#if (eq item.system.attribute3 "charisma") }}selected{{/if}}>{{localize "DSA41.attributes.long.charisma"}} </option>
<option value="dexterity" {{#if (eq item.system.attribute3 "dexterity") }}selected{{/if}}>{{localize "DSA41.attributes.long.dexterity"}} </option>
<option value="agility" {{#if (eq item.system.attribute3 "agility") }}selected{{/if}}>{{localize "DSA41.attributes.long.agility"}} </option>
<option value="constitution" {{#if (eq item.system.attribute3 "constitution")}}selected{{/if}}>{{localize "DSA41.attributes.long.constitution"}}</option>
<option value="strength" {{#if (eq item.system.attribute3 "strength") }}selected{{/if}}>{{localize "DSA41.attributes.long.strength"}} </option>
</select>
</div>
</div>
</div>
</div>
+123 -106
View File
@@ -3,7 +3,8 @@
"Item": {
"Gegenstand": "Gegenstand",
"Ruestung": "Rüstung",
"Bewaffnung": "Bewaffnung"
"Bewaffnung": "Bewaffnung",
"Talent": "Talent"
}
},
@@ -15,6 +16,18 @@
"weight": "Gewicht",
"price": "Preis",
"chat": {
"result": "Ergebnis",
"success": "Geschafft",
"failure": "Fehlgeschlagen",
"attribute": "Eigenshaft",
"value": "Wert",
"roll": "Wurf",
"talentwert_short": "TaW"
},
"roll_types": {
"courage": "Mut",
"cleverness": "Klugheit",
@@ -25,6 +38,8 @@
"constitution": "Konstitution",
"strength": "Körperkraft",
"talent": "Talent",
"attacke": "Attacke",
"parade": "Parade",
"trefferpunkte": "Trefferpunkte",
@@ -73,6 +88,8 @@
"label": "Talent",
"label_eigenschaften": "Eigenschaften",
"label_talentwert": "Talentwert",
"label_kategorie": "Kategorie",
"label_behinderung": "Behinderung",
"kampf": {
"label": "Kampf Talente",
@@ -116,24 +133,24 @@
"label": "Körperliche Talente",
"name": {
"akrobatik": "Akrobatik",
"athletik": "Athletik",
"fliegen": "Fliegen",
"gaukeleien": "Gaukeleien",
"klettern": "Klettern",
"koerperbeherrschung": "Körperbeherrschung",
"reiten": "Reiten",
"schleichen": "Schleichen",
"schwimmen": "Schwimmen",
"selbstbeherrschung": "Selbstbeherrschung",
"sich_verstecken": "Sich Verstecken",
"singen": "Singen",
"sinnenschärfe": "Sinnenschärfe",
"skifahren": "Skifahren",
"stimmen_imitieren": "Stimmen Imitieren",
"tanzen": "Tanzen",
"taschendiebstahl": "Taschendiebstahl",
"zechen": "Zechen"
"Akrobatik": "Akrobatik",
"Athletik": "Athletik",
"Fliegen": "Fliegen",
"Gaukeleien": "Gaukeleien",
"Klettern": "Klettern",
"rperbeherrschung": "Körperbeherrschung",
"Reiten": "Reiten",
"Schleichen": "Schleichen",
"Schwimmen": "Schwimmen",
"Selbstbeherrschung": "Selbstbeherrschung",
"Sich Verstecken": "Sich Verstecken",
"Singen": "Singen",
"Sinnenschärfe": "Sinnenschärfe",
"Skifahren": "Skifahren",
"Stimmen Imitieren": "Stimmen Imitieren",
"Tanzen": "Tanzen",
"Taschendiebstahl": "Taschendiebstahl",
"Zechen": "Zechen"
}
},
@@ -141,16 +158,16 @@
"label": "Gesellschaftliche Talente",
"name": {
"betoeren": "Betören",
"etikette": "Etikette",
"gassenwissen": "Gassenwissen",
"lehren": "Lehren",
"menschenkenntnis": "Menschenkenntnis",
"schauspielerei": "Schauspielerei",
"schriftlicher_ausdruck": "Schriftlicher Ausdruck",
"sich_verkleiden": "Sich Verkleiden",
"ueberreden": "Überreden",
"ueberzeugen": "Überzeugen"
"Betören": "Betören",
"Etikette": "Etikette",
"Gassenwissen": "Gassenwissen",
"Lehren": "Lehren",
"Menschenkenntnis": "Menschenkenntnis",
"Schauspielerei": "Schauspielerei",
"Schriftlicher Ausdruck": "Schriftlicher Ausdruck",
"Sich Verkleiden": "Sich Verkleiden",
"Überreden": "Überreden",
"Überzeugen": "Überzeugen"
}
},
@@ -158,13 +175,13 @@
"label": "Natur-Talente",
"name": {
"faehrtensuchen": "Fährtensuchen",
"fallenstellen": "Fallenstellen",
"fesseln": "Fesseln/Entfesseln",
"fischen": "Fischen/Angeln",
"orientierung": "Orientierung",
"wettervorhersage": "Wettervorhersage",
"wildnisleben": "Wildnisleben"
"hrtensuchen": "Fährtensuchen",
"Fallenstellen": "Fallenstellen",
"Fesseln/Entfesseln": "Fesseln/Entfesseln",
"Fischen/Angeln": "Fischen/Angeln",
"Orientierung": "Orientierung",
"Wettervorhersage": "Wettervorhersage",
"Wildnisleben": "Wildnisleben"
}
},
@@ -172,29 +189,29 @@
"label": "Wissenstalente",
"name": {
"anatomie": "Anatomie",
"baukunst": "Baukunst",
"brett_kartenspiel": "Brett-/Kartenspiel",
"geographie": "Geographie",
"geschichtswissen": "Geschichtswissen",
"gesteinskunde": "Gesteinskunde",
"goetter_kulte": "Götter/Kulte",
"heraldik": "Heraldik",
"huettenkunde": "Hüttenkunde",
"kriegskunst": "Kriegskunst",
"kryptographie": "Kryptographie",
"magiekunde": "Magiekunde",
"mechanik": "Mechanik",
"pflanzenkunde": "Pflanzenkunde",
"philosophie": "Philosophie",
"rechnen": "Rechnen",
"rechtskunde": "Rechtskunde",
"sagen_legenden": "Sagen/Legenden",
"schaetzen": "Schätzen",
"sprachenkunde": "Sprachenkunde",
"staatskunst": "Staatskunst",
"sternkunde": "Sternenkunde",
"tierkunde": "Tierkunde"
"Anatomie": "Anatomie",
"Baukunst": "Baukunst",
"Brett-/Kartenspiel": "Brett-/Kartenspiel",
"Geographie": "Geographie",
"Geschichtswissen": "Geschichtswissen",
"Gesteinskunde": "Gesteinskunde",
"tter/Kulte": "Götter/Kulte",
"Heraldik": "Heraldik",
"ttenkunde": "Hüttenkunde",
"Kriegskunst": "Kriegskunst",
"Kryptographie": "Kryptographie",
"Magiekunde": "Magiekunde",
"Mechanik": "Mechanik",
"Pflanzenkunde": "Pflanzenkunde",
"Philosophie": "Philosophie",
"Rechnen": "Rechnen",
"Rechtskunde": "Rechtskunde",
"Sagen/Legenden": "Sagen/Legenden",
"Schätzen": "Schätzen",
"Sprachenkunde": "Sprachenkunde",
"Staatskunst": "Staatskunst",
"Sternenkunde": "Sternenkunde",
"Tierkunde": "Tierkunde"
}
},
@@ -212,53 +229,53 @@
"label": "Handwerkstalente",
"name": {
"abrichten": "Abrichten",
"ackerbau": "Ackerbau",
"alchimie": "Alchimie",
"bergbau": "Bergbau",
"bogenbau": "Bogenbau",
"boote_fahren": "Boote Fahren",
"brauer": "Brauer",
"drucker": "Drucker",
"fahrzeug_lenken": "Fahrzeug Lenken",
"falschspiel": "Falschspiel",
"feinmechanik": "Feinmechanik",
"feuersteinbearbeitung": "Feuersteinbearbeitung",
"fleischer": "Fleischer",
"gerber": "Gerber/Kürschner",
"glaskunst": "Glaskunst",
"grobschmied": "Grobschmied",
"handel": "Handel",
"hauswirtschaft": "Hauswirtschaft",
"heilkunde_gift": "Heilkunde Gift",
"heilkunde_krankheiten": "Heilkunde Krankheiten",
"heilkunde_seele": "Heilkunde Seele",
"heilkunde_wunden": "Heilkunde Wunden",
"holzbearbeitung": "Holzbearbeitung",
"instrumentenbauer": "Instrumentenbauer",
"kartographie": "Kartographie",
"kochen": "Kochen",
"kristallzucht": "Kristallzucht",
"lederarbeiten": "Lederarbeiten",
"malen_zeichnen": "Malen/Zeichnen",
"maurer": "Maurer",
"metallguss": "Metallguss",
"musizieren": "Musizieren",
"schloesser_knacken": "Schlösser Knacken",
"schnapps_brennen": "Schnapps Brennen",
"schneidern": "Schneidern",
"seefahrt": "Seefahrt",
"seiler": "Seiler",
"steinmetz": "Steinmetz",
"juwelier": "Steinschneider/Juwelier",
"stellmacher": "Stellmacher",
"stoffe_faerben": "Stoffe Faerben",
"taetowieren": "Tätowieren",
"toepfern": "Töpfern",
"viehzucht": "Viehzucht",
"webkunst": "Webkunst",
"winzer": "Winzer",
"zimmermann": "Zimmermann"
"Abrichten": "Abrichten",
"Ackerbau": "Ackerbau",
"Alchimie": "Alchimie",
"Bergbau": "Bergbau",
"Bogenbau": "Bogenbau",
"Boote Fahren": "Boote Fahren",
"Brauer": "Brauer",
"Drucker": "Drucker",
"Fahrzeug Lenken": "Fahrzeug Lenken",
"Falschspiel": "Falschspiel",
"Feinmechanik": "Feinmechanik",
"Feuersteinbearbeitung": "Feuersteinbearbeitung",
"Fleischer": "Fleischer",
"Gerber/Kürschner": "Gerber/Kürschner",
"Glaskunst": "Glaskunst",
"Grobschmied": "Grobschmied",
"Handel": "Handel",
"Hauswirtschaft": "Hauswirtschaft",
"Heilkunde Gift": "Heilkunde Gift",
"Heilkunde Krankheiten": "Heilkunde Krankheiten",
"Heilkunde Seele": "Heilkunde Seele",
"Heilkunde Wunden": "Heilkunde Wunden",
"Holzbearbeitung": "Holzbearbeitung",
"Instrumentenbauer": "Instrumentenbauer",
"Kartographie": "Kartographie",
"Kochen": "Kochen",
"Kristallzucht": "Kristallzucht",
"Lederarbeiten": "Lederarbeiten",
"Malen/Zeichnen": "Malen/Zeichnen",
"Maurer": "Maurer",
"Metallguss": "Metallguss",
"Musizieren": "Musizieren",
"Schlösser Knacken": "Schlösser Knacken",
"Schnapps Brennen": "Schnapps Brennen",
"Schneidern": "Schneidern",
"Seefahrt": "Seefahrt",
"Seiler": "Seiler",
"Steinmetz": "Steinmetz",
"Steinschneider/Juwelier": "Steinschneider/Juwelier",
"Stellmacher": "Stellmacher",
"Stoffe Faerben": "Stoffe Faerben",
"towieren": "Tätowieren",
"pfern": "Töpfern",
"Viehzucht": "Viehzucht",
"Webkunst": "Webkunst",
"Winzer": "Winzer",
"Zimmermann": "Zimmermann"
}
}
},
+48 -21
View File
@@ -42,6 +42,11 @@
align-items: center;
}
& .fit-content {
width: fit-content;
height: fit-content;
}
& .row {
display: flex;
flex-direction: row;
@@ -117,14 +122,14 @@
&.editable-number {
text-align: center;
}
}
& .placeholder {
font-size: 0.8em;
border-top: 1px solid;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
& .placeholder {
font-size: 0.8em;
border-top: 1px solid;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
& .character-image {
@@ -153,10 +158,15 @@
grid-column: 1;
}
&.die-type {
width: 2em;
height: 2em;
}
&.die-courage { fill: #b22319; }
&.die-cleverness { fill: #8158a3; }
&.die-intuition { fill: #388834; }
&.die-charisma { fill: #0c0c0c; }
&.die-charisma { fill: #d96600; }
&.die-dexterity { fill: #d4b366; }
&.die-agility { fill: #678ec3; }
&.die-constitution { fill: #a3a3a3; }
@@ -164,10 +174,10 @@
&.die-attacke { fill: #b22319; }
&.die-parade { fill: #388834; }
&.die-trefferpunkte { fill: #0c0c0c; }
&.die-trefferpunkte { fill: #a2a0ee; }
&.die-fernkampf-attacke { fill: #388834; }
&.die-fernkampf-trefferpunkte { fill: #0c0c0c; }
&.die-fernkampf-trefferpunkte { fill: #a2a0ee; }
}
& .tabs {
@@ -194,7 +204,7 @@
& .list {
display: grid;
background: #252830;
border-radius: 5px 5px 5px 5px;
box-shadow: 0 0 6px rgba(0, 0, 0, 0.45);
& .item-image {
@@ -226,11 +236,14 @@
align-items: center;
background: #252830;
padding: 0.25rem;
border-bottom: 1px dotted;
&:last-child {
border: none;
border-radius: 0px 0px 5px 5px;
}
}
@@ -277,18 +290,14 @@
}
&[data-tab="tab2"] {
& .Kampftalente {
display: grid;
grid-template-columns: minmax(0, max-content) repeat(5, minmax(0, 1fr));
align-items: center;
gap: 0.5rem;
grid-template-columns: minmax(0, max-content) repeat(2, minmax(0, 1fr)) min-content;
& > * {
grid-column: 1 / -1;
}
& .Talente {
display: grid;
grid-template-columns: minmax(0, max-content) repeat(2, minmax(0, 1fr));
align-items: center;
gap: 0.5rem;
& .Kampftalente {
grid-template-columns: minmax(0, max-content) repeat(5, minmax(0, 1fr));
}
}
@@ -322,3 +331,21 @@
padding-top: 0.5rem;
}
}
.talent_chat_message {
& .info {
display: grid;
grid-template-columns: repeat(4, minmax(min-content, 1fr));
text-wrap: nowrap;
& > * {
display: grid;
grid-column: 1 / -1;
grid-template-columns: subgrid;
& > *:not(:first-child) {
text-align: center;
}
}
}
}
+157 -138
View File
@@ -4,6 +4,10 @@ const { ActorSheetV2, ItemSheetV2 } = foundry.applications.sheets;
const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;
const { OperatorTerm, NumericTerm } = foundry.dice.terms;
Hooks.once("i18nInit", async function() {
game.i18n._fallback = foundry.utils.mergeObject(await game.i18n._getTranslations("de"), game.i18n._fallback);
});
Hooks.once("init", async function() {
CONFIG.Combat.initiative.formula = "1d6 + @computed.ini_basiswert[INI-Basiswert]";
@@ -13,6 +17,7 @@ Hooks.once("init", async function() {
CONFIG.Item.dataModels.Gegenstand = DSA41_GegenstandData;
CONFIG.Item.dataModels.Ruestung = DSA41_RuestungData;
CONFIG.Item.dataModels.Bewaffnung = DSA41_BewaffnungData;
CONFIG.Item.dataModels.Talent = DSA41_TalentData;
DocumentSheetConfig.unregisterSheet(Actor, "core", ActorSheet);
DocumentSheetConfig.registerSheet(Actor, "dsa41", DSA41_ActorSheet, {
@@ -29,9 +34,19 @@ Hooks.once("init", async function() {
"Gegenstand",
"Ruestung",
"Bewaffnung",
"Talent",
]
});
Handlebars.registerHelper({
maybeLocalize: (value, options) => {
const prefix = options.hash.prefix ? options.hash.prefix.string : null;
if (prefix)
return game.i18n.localize(prefix + "." + value);
return value;
}
});
await loadTemplates({
"editable-input": "systems/dsa-4th-edition/src/EditableInput.hbs",
@@ -44,10 +59,7 @@ Hooks.once("init", async function() {
"fernkampf_attacke_tooltip": "systems/dsa-4th-edition/src/Tooltips/FernkampfAttacke.hbs",
"fernkampf_trefferpunkte_tooltip": "systems/dsa-4th-edition/src/Tooltips/FernkampfTrefferpunkte.hbs",
"trefferpunkte_dialog": "systems/dsa-4th-edition/src/Dialog/Trefferpunkte.hbs",
"fernkampf_angriff_dialog": "systems/dsa-4th-edition/src/Dialogs/FernkampfAngriff.hbs",
"fernkampf_trefferpunkte_dialog": "systems/dsa-4th-edition/src/Dialogs/FernkampfTrefferpunkte.hbs",
"talent_chat": "systems/dsa-4th-edition/src/Chat/Talent.hbs",
});
});
@@ -119,8 +131,56 @@ class CombatTalentField extends SchemaField {
}
}
class DSA41_CharacterDocument extends Actor {
class DSA41_CharacterDocument extends Actor {
static async create(data, operation) {
const actor = await super.create(data, operation);
if (data.type === "Player") {
const talente_compendium = game.packs.get("dsa-4th-edition.talente");
const talente = await talente_compendium.getDocuments({ name__in: [
// Basis Körperliche Talente
"Athletik",
"Klettern",
"Körperbeherrschung",
"Schleichen",
"Schwimmen",
"Selbstbeherrschung",
"Sich Verstecken",
"Singen",
"Sinnenschärfe",
"Tanzen",
"Zechen",
// Basis Gesellschaftliche Talente
"Menschenkenntnis",
"Überreden",
// Basis Natur Talente
"Fährtensuchen",
"Orientierung",
"Wildnisleben",
// Basis Wissens Talente
"Götter/Kulte",
"Rechnen",
"Sagen/Legenden",
// Basis Handwerks Talente
"Heilkunde Wunden",
"Holzbearbeitung",
"Kochen",
"Lederarbeiten",
"Malen/Zeichnen",
"Schneidern",
]});
await actor.createEmbeddedDocuments("Item", talente);
}
return actor;
}
}
class DSA41_CharacterData extends TypeDataModel {
@@ -170,134 +230,6 @@ class DSA41_CharacterData extends TypeDataModel {
zweihand_hiebwaffen: new CombatTalentField(),
zweihandschwerter: new CombatTalentField(),
}),
talente: new SchemaField({
koerperliche: new SchemaField({
akrobatik: new NumberField({ integer: true, initial: 0 }),
athletik: new NumberField({ integer: true, initial: 0 }),
fliegen: new NumberField({ integer: true, initial: 0 }),
gaukeleien: new NumberField({ integer: true, initial: 0 }),
klettern: new NumberField({ integer: true, initial: 0 }),
koerperbeherrschung: new NumberField({ integer: true, initial: 0 }),
reiten: new NumberField({ integer: true, initial: 0 }),
schleichen: new NumberField({ integer: true, initial: 0 }),
schwimmen: new NumberField({ integer: true, initial: 0 }),
selbstbeherrschung: new NumberField({ integer: true, initial: 0 }),
sich_verstecken: new NumberField({ integer: true, initial: 0 }),
singen: new NumberField({ integer: true, initial: 0 }),
sinnenschärfe: new NumberField({ integer: true, initial: 0 }),
skifahren: new NumberField({ integer: true, initial: 0 }),
stimmen_imitieren: new NumberField({ integer: true, initial: 0 }),
tanzen: new NumberField({ integer: true, initial: 0 }),
taschendiebstahl: new NumberField({ integer: true, initial: 0 }),
zechen: new NumberField({ integer: true, initial: 0 }),
}),
gesellschaftliche: new SchemaField({
betoeren: new NumberField({ integer: true, initial: 0 }),
etikette: new NumberField({ integer: true, initial: 0 }),
gassenwissen: new NumberField({ integer: true, initial: 0 }),
lehren: new NumberField({ integer: true, initial: 0 }),
menschenkenntnis: new NumberField({ integer: true, initial: 0 }),
schauspielerei: new NumberField({ integer: true, initial: 0 }),
schriftlicher_ausdruck: new NumberField({ integer: true, initial: 0 }),
sich_verkleiden: new NumberField({ integer: true, initial: 0 }),
ueberreden: new NumberField({ integer: true, initial: 0 }),
ueberzeugen: new NumberField({ integer: true, initial: 0 }),
}),
natur: new SchemaField({
faehrtensuchen: new NumberField({ integer: true, initial: 0 }),
fallenstellen: new NumberField({ integer: true, initial: 0 }),
fesseln: new NumberField({ integer: true, initial: 0 }),
fischen: new NumberField({ integer: true, initial: 0 }),
orientierung: new NumberField({ integer: true, initial: 0 }),
wettervorhersage: new NumberField({ integer: true, initial: 0 }),
wildnisleben: new NumberField({ integer: true, initial: 0 }),
}),
wissens: new SchemaField({
anatomie: new NumberField({ integer: true, initial: 0 }),
baukunst: new NumberField({ integer: true, initial: 0 }),
brett_kartenspiel: new NumberField({ integer: true, initial: 0 }),
geographie: new NumberField({ integer: true, initial: 0 }),
geschichtswissen: new NumberField({ integer: true, initial: 0 }),
gesteinskunde: new NumberField({ integer: true, initial: 0 }),
goetter_kulte: new NumberField({ integer: true, initial: 0 }),
heraldik: new NumberField({ integer: true, initial: 0 }),
huettenkunde: new NumberField({ integer: true, initial: 0 }),
kriegskunst: new NumberField({ integer: true, initial: 0 }),
kryptographie: new NumberField({ integer: true, initial: 0 }),
magiekunde: new NumberField({ integer: true, initial: 0 }),
mechanik: new NumberField({ integer: true, initial: 0 }),
pflanzenkunde: new NumberField({ integer: true, initial: 0 }),
philosophie: new NumberField({ integer: true, initial: 0 }),
rechnen: new NumberField({ integer: true, initial: 0 }),
rechtskunde: new NumberField({ integer: true, initial: 0 }),
sagen_legenden: new NumberField({ integer: true, initial: 0 }),
schaetzen: new NumberField({ integer: true, initial: 0 }),
sprachenkunde: new NumberField({ integer: true, initial: 0 }),
staatskunst: new NumberField({ integer: true, initial: 0 }),
sternkunde: new NumberField({ integer: true, initial: 0 }),
tierkunde: new NumberField({ integer: true, initial: 0 }),
}),
sprachen: new SchemaField({
lesen_schreiben: new NumberField({ integer: true, initial: 0 }),
muttersprache: new NumberField({ integer: true, initial: 0 }),
fremdsprache: new NumberField({ integer: true, initial: 0 }),
}),
handwerks: new SchemaField({
abrichten: new NumberField({ integer: true, initial: 0 }),
ackerbau: new NumberField({ integer: true, initial: 0 }),
alchimie: new NumberField({ integer: true, initial: 0 }),
bergbau: new NumberField({ integer: true, initial: 0 }),
bogenbau: new NumberField({ integer: true, initial: 0 }),
boote_fahren: new NumberField({ integer: true, initial: 0 }),
brauer: new NumberField({ integer: true, initial: 0 }),
drucker: new NumberField({ integer: true, initial: 0 }),
fahrzeug_lenken: new NumberField({ integer: true, initial: 0 }),
falschspiel: new NumberField({ integer: true, initial: 0 }),
feinmechanik: new NumberField({ integer: true, initial: 0 }),
feuersteinbearbeitung: new NumberField({ integer: true, initial: 0 }),
fleischer: new NumberField({ integer: true, initial: 0 }),
gerber: new NumberField({ integer: true, initial: 0 }),
glaskunst: new NumberField({ integer: true, initial: 0 }),
grobschmied: new NumberField({ integer: true, initial: 0 }),
handel: new NumberField({ integer: true, initial: 0 }),
hauswirtschaft: new NumberField({ integer: true, initial: 0 }),
heilkunde_gift: new NumberField({ integer: true, initial: 0 }),
heilkunde_krankheiten: new NumberField({ integer: true, initial: 0 }),
heilkunde_seele: new NumberField({ integer: true, initial: 0 }),
heilkunde_wunden: new NumberField({ integer: true, initial: 0 }),
holzbearbeitung: new NumberField({ integer: true, initial: 0 }),
instrumentenbauer: new NumberField({ integer: true, initial: 0 }),
kartographie: new NumberField({ integer: true, initial: 0 }),
kochen: new NumberField({ integer: true, initial: 0 }),
kristallzucht: new NumberField({ integer: true, initial: 0 }),
lederarbeiten: new NumberField({ integer: true, initial: 0 }),
malen_zeichnen: new NumberField({ integer: true, initial: 0 }),
maurer: new NumberField({ integer: true, initial: 0 }),
metallguss: new NumberField({ integer: true, initial: 0 }),
musizieren: new NumberField({ integer: true, initial: 0 }),
schloesser_knacken: new NumberField({ integer: true, initial: 0 }),
schnapps_brennen: new NumberField({ integer: true, initial: 0 }),
schneidern: new NumberField({ integer: true, initial: 0 }),
seefahrt: new NumberField({ integer: true, initial: 0 }),
seiler: new NumberField({ integer: true, initial: 0 }),
steinmetz: new NumberField({ integer: true, initial: 0 }),
juwelier: new NumberField({ integer: true, initial: 0 }),
stellmacher: new NumberField({ integer: true, initial: 0 }),
stoffe_faerben: new NumberField({ integer: true, initial: 0 }),
taetowieren: new NumberField({ integer: true, initial: 0 }),
toepfern: new NumberField({ integer: true, initial: 0 }),
viehzucht: new NumberField({ integer: true, initial: 0 }),
webkunst: new NumberField({ integer: true, initial: 0 }),
winzer: new NumberField({ integer: true, initial: 0 }),
zimmermann: new NumberField({ integer: true, initial: 0 }),
}),
}),
}
}
@@ -460,6 +392,15 @@ class DSA41_CharacterData extends TypeDataModel {
computed.trefferpunkte = get_minified_formula(item.system.fernkampfwaffe.basis);
computed.trefferpunkte_display = computed.trefferpunkte.replace(/[\+\-]/, (op) => "<br>" + op);
}
const talente = this.parent.items.filter((x) => x.type === "Talent").sort((a, b) => a.name > b.name);
this.talente = {
koerperliche: talente.filter((x) => x.system.kategorie === "koerperliche"),
gesellschaftliche: talente.filter((x) => x.system.kategorie === "gesellschaftliche"),
natur: talente.filter((x) => x.system.kategorie === "natur"),
wissens: talente.filter((x) => x.system.kategorie === "wissens"),
handwerks: talente.filter((x) => x.system.kategorie === "handwerks"),
};
}
}
@@ -572,6 +513,21 @@ class DSA41_BewaffnungData extends TypeDataModel {
}
}
class DSA41_TalentData extends TypeDataModel {
static defineSchema() {
return {
kategorie: new StringField(),
behinderung: new StringField(),
attribute1: new StringField(),
attribute2: new StringField(),
attribute3: new StringField(),
talentwert: new NumberField({ integer: true, initial: 0 }),
};
}
}
function DSA41_ApplicationMixin(BaseApplication) {
class DSA41_Application extends HandlebarsApplicationMixin(BaseApplication) {
static DEFAULT_OPTIONS= {
@@ -591,6 +547,7 @@ function DSA41_ApplicationMixin(BaseApplication) {
class DSA41_Dialog extends DSA41_ApplicationMixin(ApplicationV2) {
static PARTS = {
Eigenschaft: { template: "systems/dsa-4th-edition/src/Dialogs/Attribute.hbs" },
Talent: { template: "systems/dsa-4th-edition/src/Dialogs/Talent.hbs" },
Attacke: { template: "systems/dsa-4th-edition/src/Dialogs/Attacke.hbs" },
Parade: { template: "systems/dsa-4th-edition/src/Dialogs/Parade.hbs" },
@@ -672,8 +629,8 @@ class DSA41_ActorSheet extends DSA41_ApplicationMixin(ActorSheetV2) {
position: { width: "800", height: "650" },
actions: {
"roll": async function(event, target) {
var roll_formula = event.target.closest("[data-roll]").dataset.roll;
const roll_type = event.target.closest("[data-roll-type]").dataset.rollType;
var roll_formula = event.target.closest("[data-roll]")?.dataset.roll;
const roll_type = event.target.closest("[data-roll-type]")?.dataset.rollType;
const success_value = event.target.closest("[data-success-value]")?.dataset.successValue;
const item_id = event.target.closest("[data-item-id]")?.dataset.itemId;
const item = this.document.items.get(item_id);
@@ -702,10 +659,59 @@ class DSA41_ActorSheet extends DSA41_ApplicationMixin(ActorSheetV2) {
return;
}
if (roll_type == "attacke") {
const item = this.document.system.computed.kampf.waffen[item_id];
if (roll_type == "talent") {
const title = game.i18n.localize("DSA41.roll_types." + roll_type) + ": " + item.name;
const data = await DSA41_Dialog.wait("Attacke", { window: { title: title }, item: item });
const data = await DSA41_Dialog.wait("Talent", { window: {title: title}, item: item });
const talentwert = item.system.talentwert + data.modifikator;
const roll1 = (await new Roll("1d20").evaluate()).total;
const roll2 = (await new Roll("1d20").evaluate()).total;
const roll3 = (await new Roll("1d20").evaluate()).total;
const attribute1 = this.document.system.computed.attributes[item.system.attribute1];
const attribute2 = this.document.system.computed.attributes[item.system.attribute2];
const attribute3 = this.document.system.computed.attributes[item.system.attribute3];
const needed_taw_roll1 = Math.max(roll1 - attribute1, 0);
const needed_taw_roll2 = Math.max(roll2 - attribute2, 0);
const needed_taw_roll3 = Math.max(roll3 - attribute3, 0);
const leftover_taw = talentwert - needed_taw_roll1 - needed_taw_roll2 - needed_taw_roll3;
const context = {
talent: item,
modifikator: data.modifikator,
attribute1: { type: item.system.attribute1, value: attribute1 },
attribute2: { type: item.system.attribute2, value: attribute3 },
attribute3: { type: item.system.attribute3, value: attribute3 },
roll1: roll1,
roll2: roll2,
roll3: roll3,
needed_taw_roll1: -needed_taw_roll1,
needed_taw_roll2: -needed_taw_roll2,
needed_taw_roll3: -needed_taw_roll3,
leftover_taw: leftover_taw,
};
const message = await ChatMessage.create(
{
content: await renderTemplate("talent_chat", context),
speaker: { actor: this.actor },
sound: CONFIG.sounds.dice,
},
);
return;
}
if (roll_type == "attacke") {
const item = this.document.system.computed.kampf.waffen[item_id];
const title = game.i18n.localize("DSA41.roll_types." + roll_type) + ": " + item.name;
const data = await DSA41_Dialog.wait("Attacke", { window: { title: title }, item: item });
let flavor = game.i18n.localize("DSA41.roll_types." + roll_type);
if (typeof success_value !== 'undefined') {
@@ -836,6 +842,18 @@ class DSA41_ActorSheet extends DSA41_ApplicationMixin(ActorSheetV2) {
});
}
// allow changing embedded item fields
async _onChangeForm(formConfig, event) {
const item_id = event.target.closest("[data-item-id]")?.dataset.itemId;
const data_name = event.target.dataset.name;
if (!item_id || !data_name) return super._onChangeForm(formConfig, event);
event.stopImmediatePropagation();
const item = await this.actor.items.get(item_id);
const value = event.target.value;
item.update({ [data_name]: value });
}
tabGroups = { primary: "tab1" };
}
@@ -844,6 +862,7 @@ class DSA41_ItemSheetV2 extends DSA41_ApplicationMixin(ItemSheetV2) {
Bewaffnung: { template: "systems/dsa-4th-edition/src/ItemSheets/Bewaffnung.hbs" },
Gegenstand: { template: "systems/dsa-4th-edition/src/ItemSheets/Gegenstand.hbs" },
Ruestung: { template: "systems/dsa-4th-edition/src/ItemSheets/Ruestung.hbs" },
Talent: { template: "systems/dsa-4th-edition/src/ItemSheets/Talent.hbs" },
};
static DEFAULT_OPTIONS = {