Compare commits

...

7 Commits

Author SHA1 Message Date
Sven Balzer
b1da5ff6f2 add Abenteuerpunkte to Eigenschaften tab 2025-02-04 23:37:16 +01:00
Sven Balzer
53bff7a4a6 add dialog to select Trefferzone on damage application 2025-02-04 22:59:44 +01:00
Sven Balzer
add059a902 add currency display in inventory 2025-02-04 22:30:30 +01:00
Sven Balzer
a3b6271bf3 add a damage application button to Trefferpunkte chat messages 2025-02-03 03:53:17 +01:00
Sven Balzer
43459113d5 fix kategorie for newly created items 2025-01-31 05:28:26 +01:00
Sven Balzer
04093d752e disable annoying screen resoultion too small warning 2025-01-31 05:26:22 +01:00
Sven Balzer
ef00bd029e add more context to chat messages 2025-01-31 05:24:47 +01:00
8 changed files with 320 additions and 14 deletions

View File

@ -63,6 +63,14 @@
</nav> </nav>
<div class="tab {{#if (eq tabGroups.primary 'tab1')}}active{{/if}}" data-group="primary" data-tab="tab1"> <div class="tab {{#if (eq tabGroups.primary 'tab1')}}active{{/if}}" data-group="primary" data-tab="tab1">
<div class="Abenteuerpunkte">
<span>{{localize "DSA41.abenteuerpunkte"}}:</span>
{{>editable-input type="number" name="system.abenteuerpunkte.ausgegeben" value=actor.system.abenteuerpunkte.ausgegeben}}
/
{{>editable-input type="number" name="system.abenteuerpunkte.gesamt" value=actor.system.abenteuerpunkte.gesamt}}
<span>({{actor.system.computed.abenteuerpunkte.uebrig}})</span>
</div>
<div class="list Eigenschaften"> <div class="list Eigenschaften">
<div class="list-header"> <div class="list-header">
<span></span> <span></span>
@ -290,6 +298,17 @@
</div> </div>
<div class="tab {{#if (eq tabGroups.primary 'tab3')}}active{{/if}}" data-group="primary" data-tab="tab3"> <div class="tab {{#if (eq tabGroups.primary 'tab3')}}active{{/if}}" data-group="primary" data-tab="tab3">
<div class="currency">
{{>editable-input type="number" name="system.currency.dukaten" value=actor.system.currency.dukaten}}
<svg viewbox="80 0 40 40" data-tooltip="{{localize "DSA41.currency.dukaten"}}"> <use href="/systems/dsa-4th-edition/src/Assets/coins.svg#Gold"> </use></svg>
{{>editable-input type="number" name="system.currency.silbertaler" value=actor.system.currency.silbertaler}}
<svg viewbox="120 0 40 40" data-tooltip="{{localize "DSA41.currency.silbertaler"}}"><use href="/systems/dsa-4th-edition/src/Assets/coins.svg#Diamond"></use></svg>
{{>editable-input type="number" name="system.currency.heller" value=actor.system.currency.heller}}
<svg viewbox="0 0 40 40" data-tooltip="{{localize "DSA41.currency.heller"}}"> <use href="/systems/dsa-4th-edition/src/Assets/coins.svg#Copper"> </use></svg>
{{>editable-input type="number" name="system.currency.kreuzer" value=actor.system.currency.kreuzer}}
<svg viewbox="40 0 40 40" data-tooltip="{{localize "DSA41.currency.kreuzer"}}"> <use href="/systems/dsa-4th-edition/src/Assets/coins.svg#Silver"> </use></svg>
</div>
<div class="list Bewaffnung subgrid-columns"> <div class="list Bewaffnung subgrid-columns">
<div class="list-header"> <div class="list-header">
<div>{{localize "DSA41.inventar.bewaffnung"}}</div> <div>{{localize "DSA41.inventar.bewaffnung"}}</div>

31
src/Assets/coins.svg Normal file
View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="160" height="40" version="1.1" viewBox="0 0 160 40" xmlns="http://www.w3.org/2000/svg">
<g id="Diamond">
<path fill="#5796a1" d="M 154.15,5.9 H 154.1 Q 148.25,0 140,0 131.65,0 125.85,5.9 120.8,10.95 120.1,17.75 120,18.9 120,20 q 0,0.5 0.05,0.95 0,0.05 0,0.1 0,0.6 0.05,1.25 0.7,6.8 5.75,11.9 v 0.05 Q 131.7,40 140,40 q 8.25,0 14.1,-5.75 h 0.05 q 5.45,-5.55 5.85,-13.1 0,-0.05 0,-0.1 0,-0.05 0,-0.15 0,-0.4 0,-0.9 0,-8.25 -5.85,-14.1 m -26.9,1.4 Q 132.5,2 140,2 q 7.45,0 12.7,5.3 5.3,5.25 5.3,12.7 0,0.5 0,0.9 0,0.1 0,0.15 -0.35,6.8 -5.3,11.75 -5.25,5.2 -12.7,5.2 -7.5,0 -12.75,-5.2 -4.5,-4.6 -5.15,-10.7 -0.05,-0.55 -0.05,-1.05 0,-0.1 0,-0.15 Q 122,20.5 122,20 q 0,-1 0.1,-2.05 0.65,-6.1 5.15,-10.65 z"/>
<path fill="#b6ecf5" d="m 140,4.1 q -7.5,0 -12.75,5.3 -4.5,4.5 -5.15,10.7 -0.05,0.4 -0.05,0.8 0,0.05 0,0.15 0,0.5 0.05,1.05 0.65,6.1 5.15,10.7 5.25,5.2 12.75,5.2 7.45,0 12.7,-5.2 4.95,-4.95 5.3,-11.75 Q 158,21 158,20.9 157.6,14.2 152.7,9.4 147.45,4.1 140,4.1 m -7.65,8.3 q 3.15,-3.2 7.65,-3.2 4.5,0 7.65,3.2 3.15,3.15 3.15,7.6 0,0.35 0,0.65 0,0.15 0,0.25 0,0.15 0,0.25 -0.4,3.75 -3.15,6.55 -3.15,3.1 -7.65,3.1 -4.5,0 -7.65,-3.1 -2.9,-2.9 -3.1,-6.8 v -0.05 q 0,-0.1 0,-0.2 -0.05,-0.3 -0.05,-0.65 0,-4.45 3.15,-7.6 m 7.7,1.4 H 140 q -0.85,0 -1.55,0.6 -0.6,0.7 -0.6,1.55 v 8.15 q 0,0.85 0.6,1.5 0.7,0.65 1.55,0.65 h 0.05 q 0.9,0 1.5,-0.65 0.7,-0.65 0.7,-1.5 v -8.15 q 0,-0.85 -0.7,-1.55 -0.6,-0.6 -1.5,-0.6 z"/>
<path fill="#9cd6e0" d="m 140,11.3 q -4.5,0 -7.65,3.15 -2.65,2.7 -3.1,6.4 v 0.05 q 0.2,3.9 3.1,6.8 3.15,3.1 7.65,3.1 4.5,0 7.65,-3.1 2.75,-2.8 3.15,-6.55 0,-0.1 0,-0.25 -0.45,-3.7 -3.15,-6.45 Q 144.5,11.3 140,11.3 m 0,2.5 h 0.05 q 0.9,0 1.5,0.6 0.7,0.7 0.7,1.55 v 8.15 q 0,0.85 -0.7,1.5 -0.6,0.65 -1.5,0.65 H 140 q -0.85,0 -1.55,-0.65 -0.6,-0.65 -0.6,-1.5 v -8.15 q 0,-0.85 0.6,-1.55 0.7,-0.6 1.55,-0.6 z"/>
<path fill="#80c2cd" d="m 140,9.2 q -4.5,0 -7.65,3.2 -3.15,3.15 -3.15,7.6 0,0.35 0.05,0.65 0,0.1 0,0.2 0.45,-3.7 3.1,-6.4 3.15,-3.15 7.65,-3.15 4.5,0 7.65,3.15 2.7,2.75 3.15,6.45 0,-0.1 0,-0.25 0,-0.3 0,-0.65 0,-4.45 -3.15,-7.6 Q 144.5,9.2 140,9.2 Z"/>
<path fill="#d0f8ff" d="m 140,2 q -7.5,0 -12.75,5.3 -4.5,4.55 -5.15,10.65 Q 122,19 122,20 q 0,0.5 0.05,0.9 0,-0.4 0.05,-0.8 0.65,-6.2 5.15,-10.7 5.25,-5.3 12.75,-5.3 7.45,0 12.7,5.3 4.9,4.8 5.3,11.5 0,-0.4 0,-0.9 0,-7.45 -5.3,-12.7 Q 147.45,2 140,2 Z"/>
</g>
<g id="Silver">
<path fill="#778b8c" d="M 80,21.05 Q 80,21 80,20.9 80,20.5 80,20 80,11.75 74.15,5.9 H 74.1 Q 68.25,0 60,0 51.65,0 45.85,5.9 40.8,10.95 40.1,17.75 40,18.9 40,20 q 0,0.5 0.05,0.95 0,0.05 0,0.1 0,0.6 0.05,1.25 0.7,6.8 5.75,11.9 v 0.05 q 5.76172,5.66328 13.9,5.75 0.1248,0 0.25,0 8.25,0 14.1,-5.75 h 0.05 q 3.31836,-3.3793 4.75,-7.5 0.94355,-2.64707 1.1,-5.6 0,-0.05 0,-0.1 M 60,2 q 7.45,0 12.7,5.3 5.3,5.25 5.3,12.7 0,0.5 0,0.9 0,0.1 0,0.15 -0.15625,3.03437 -1.25,5.7 Q 75.44121,30.05879 72.7,32.8 67.45,38 60,38 q -0.1252,0 -0.25,0 -7.3377,-0.0867 -12.5,-5.2 -4.5,-4.6 -5.15,-10.7 -0.05,-0.55 -0.05,-1.05 0,-0.1 0,-0.15 Q 42,20.5 42,20 42,19 42.1,17.95 42.75,11.85 47.25,7.3 52.5,2 60,2 Z"/>
<path fill="#c7d4d4" d="m 60,4.1 q 7.45,0 12.7,5.3 4.9,4.8 5.3,11.5 Q 78,20.5 78,20 78,12.55 72.7,7.3 67.45,2 60,2 52.5,2 47.25,7.3 42.75,11.85 42.1,17.95 42,19 42,20 q 0,0.5 0.05,0.9 0,-0.4 0.05,-0.8 Q 42.75,13.9 47.25,9.4 52.5,4.1 60,4.1 Z"/>
<path fill="#acc0c1" d="M 72.7,9.4 Q 67.45,4.1 60,4.1 q -7.5,0 -12.75,5.3 -4.5,4.5 -5.15,10.7 -0.05,0.4 -0.05,0.8 0,0.05 0,0.15 0,0.5 0.05,1.05 0.65,6.1 5.15,10.7 5.1623,5.11328 12.5,5.2 0.1248,0 0.25,0 7.45,0 12.7,-5.2 2.74121,-2.74121 4.05,-6.05 Q 77.84375,24.08437 78,21.05 78,21 78,20.9 77.6,14.2 72.7,9.4 M 60,9.2 q 4.5,0 7.65,3.2 3.15,3.15 3.15,7.6 0,0.35 0,0.65 0,0.15 0,0.25 0,0.15 0,0.25 -0.33398,3.13125 -2.3,5.6 -0.39629,0.48789 -0.85,0.95 -3.15,3.1 -7.65,3.1 -0.12539,0 -0.25,0 -4.33789,-0.0863 -7.4,-3.1 -2.9,-2.9 -3.1,-6.8 v -0.05 q 0,-0.1 0,-0.2 Q 49.2,20.35 49.2,20 49.2,15.55 52.35,12.4 55.5,9.2 60,9.2 m 0.05,4.6 H 60 q -0.85,0 -1.55,0.6 -0.6,0.7 -0.6,1.55 v 8.15 q 0,0.85 0.6,1.5 0.7,0.65 1.55,0.65 h 0.05 q 0.9,0 1.5,-0.65 0.7,-0.65 0.7,-1.5 v -8.15 q 0,-0.85 -0.7,-1.55 -0.6,-0.6 -1.5,-0.6 z"/>
<path fill="#95aead" d="M 67.65,14.45 Q 64.5,11.3 60,11.3 q -4.5,0 -7.65,3.15 -2.65,2.7 -3.1,6.4 v 0.05 q 0.2,3.9 3.1,6.8 3.06211,3.01367 7.4,3.1 0.12461,0 0.25,0 4.5,0 7.65,-3.1 0.45371,-0.46211 0.85,-0.95 1.96602,-2.46875 2.3,-5.6 0,-0.1 0,-0.25 -0.45,-3.7 -3.15,-6.45 M 60,13.8 h 0.05 q 0.9,0 1.5,0.6 0.7,0.7 0.7,1.55 v 8.15 q 0,0.85 -0.7,1.5 -0.6,0.65 -1.5,0.65 H 60 q -0.85,0 -1.55,-0.65 -0.6,-0.65 -0.6,-1.5 v -8.15 q 0,-0.85 0.6,-1.55 0.7,-0.6 1.55,-0.6 z"/>
<path fill="#829f9f" d="m 60,11.3 q 4.5,0 7.65,3.15 2.7,2.75 3.15,6.45 0,-0.1 0,-0.25 0,-0.3 0,-0.65 0,-4.45 -3.15,-7.6 Q 64.5,9.2 60,9.2 q -4.5,0 -7.65,3.2 -3.15,3.15 -3.15,7.6 0,0.35 0.05,0.65 0,0.1 0,0.2 0.45,-3.7 3.1,-6.4 Q 55.5,11.3 60,11.3 Z"/>
</g>
<g id="Copper">
<path fill="#85572c" d="m 40.0002,20.9 q 0,-0.4 0,-0.9 -0.004,-8.26797 -5.9,-14.1 V 5.85 Q 28.26797,0.00352 20.0002,0 q -8.3377,0.005 -14.2,5.9 -4.98223,5.06113 -5.7,11.85 -0.10469,1.15234 -0.1,2.25 0.004,0.51504 0.05,0.95 0,0.0391 0,0.1 -0.004,0.58301 0.05,1.2 v 0.05 q 0.71973,6.78516 5.7,11.9 h 0.05 q 5.82656,5.79746 14.15,5.8 8.27148,-3.9e-4 14.1,-5.8 v 0 q 5.52207,-5.48301 5.9,-13.05 10e-4,-0.0559 0,-0.1 0,-0.05 0,-0.15 m -20,-18.9 q 7.45,0 12.7,5.3 5.3,5.25 5.3,12.7 0,0.5 0,0.9 0,0.1 0,0.15 -0.35,6.8 -5.3,11.75 -5.25,5.2 -12.7,5.2 -7.5,0 -12.75,-5.2 -4.5,-4.6 -5.15,-10.7 -0.05,-0.55 -0.05,-1.05 0,-0.1 0,-0.15 -0.05,-0.4 -0.05,-0.9 0,-1 0.1,-2.05 0.65,-6.1 5.15,-10.65 5.25,-5.3 12.75,-5.3 z"/>
<path fill="#cca277" d="m 20.0002,4.1 q 7.45,0 12.7,5.3 4.9,4.8 5.3,11.5 0,-0.4 0,-0.9 0,-7.45 -5.3,-12.7 -5.25,-5.3 -12.7,-5.3 -7.5,0 -12.75,5.3 -4.5,4.55 -5.15,10.65 -0.1,1.05 -0.1,2.05 0,0.5 0.05,0.9 0,-0.4 0.05,-0.8 0.65,-6.2 5.15,-10.7 5.25,-5.3 12.75,-5.3 z"/>
<path fill="#bf8851" d="m 32.7002,9.4 q -5.25,-5.3 -12.7,-5.3 -7.5,0 -12.75,5.3 -4.5,4.5 -5.15,10.7 -0.05,0.4 -0.05,0.8 0,0.05 0,0.15 0,0.5 0.05,1.05 0.65,6.1 5.15,10.7 5.25,5.2 12.75,5.2 7.45,0 12.7,-5.2 4.95,-4.95 5.3,-11.75 0,-0.05 0,-0.15 -0.4,-6.7 -5.3,-11.5 m -12.7,-0.2 q 4.5,0 7.65,3.2 3.15,3.15 3.15,7.6 0,0.35 0,0.65 0,0.15 0,0.25 0,0.15 0,0.25 -0.4,3.75 -3.15,6.55 -3.15,3.1 -7.65,3.1 -4.5,0 -7.65,-3.1 -2.9,-2.9 -3.1,-6.8 v -0.05 q 0,-0.1 0,-0.2 -0.05,-0.3 -0.05,-0.65 0,-4.45 3.15,-7.6 3.15,-3.2 7.65,-3.2 m 1.55,5.2 q -0.6,-0.6 -1.5,-0.6 h -0.05 q -0.85,0 -1.55,0.6 -0.6,0.7 -0.6,1.55 v 8.15 q 0,0.85 0.6,1.5 0.7,0.65 1.55,0.65 h 0.05 q 0.9,0 1.5,-0.65 0.7,-0.65 0.7,-1.5 v -8.15 q 0,-0.85 -0.7,-1.55 z"/>
<path fill="#ae7640" d="m 27.6502,14.45 q -3.15,-3.15 -7.65,-3.15 -4.5,0 -7.65,3.15 -2.65,2.7 -3.1,6.4 v 0.05 q 0.2,3.9 3.1,6.8 3.15,3.1 7.65,3.1 4.5,0 7.65,-3.1 2.75,-2.8 3.15,-6.55 0,-0.1 0,-0.25 -0.45,-3.7 -3.15,-6.45 m -7.6,-0.65 q 0.9,0 1.5,0.6 0.7,0.7 0.7,1.55 v 8.15 q 0,0.85 -0.7,1.5 -0.6,0.65 -1.5,0.65 h -0.05 q -0.85,0 -1.55,-0.65 -0.6,-0.65 -0.6,-1.5 v -8.15 q 0,-0.85 0.6,-1.55 0.7,-0.6 1.55,-0.6 z"/>
<path fill="#9c6938" d="m 27.6502,12.4 q -3.15,-3.2 -7.65,-3.2 -4.5,0 -7.65,3.2 -3.15,3.15 -3.15,7.6 0,0.35 0.05,0.65 0,0.1 0,0.2 0.45,-3.7 3.1,-6.4 3.15,-3.15 7.65,-3.15 4.5,0 7.65,3.15 2.7,2.75 3.15,6.45 0,-0.1 0,-0.25 0,-0.3 0,-0.65 0,-4.45 -3.15,-7.6 z"/>
</g>
<g id="Gold">
<path fill="#af8c00" d="M 114.15,5.9 H 114.1 Q 108.25,0 100,0 91.65,0 85.85,5.9 80.8,10.95 80.1,17.75 80,18.9 80,20 q 0,0.5 0.05,0.95 0,0.05 0,0.1 0,0.6 0.05,1.25 0.7,6.8 5.75,11.9 v 0.05 Q 91.7,40 100,40 q 8.25,0 14.1,-5.75 h 0.05 q 5.45,-5.55 5.85,-13.1 0,-0.05 0,-0.1 0,-0.05 0,-0.15 0,-0.4 0,-0.9 0,-8.25 -5.85,-14.1 M 87.25,7.3 Q 92.5,2 100,2 q 7.45,0 12.7,5.3 5.3,5.25 5.3,12.7 0,0.5 0,0.9 0,0.1 0,0.15 -0.35,6.8 -5.3,11.75 -5.25,5.2 -12.7,5.2 -7.5,0 -12.75,-5.2 -4.5,-4.6 -5.15,-10.7 -0.05,-0.55 -0.05,-1.05 0,-0.1 0,-0.15 Q 82,20.5 82,20 q 0,-1 0.1,-2.05 0.65,-6.1 5.15,-10.65 z"/>
<path fill="#ffcc00" d="m 100,4.1 q -7.5,0 -12.75,5.3 -4.5,4.5 -5.15,10.7 -0.05,0.4 -0.05,0.8 0,0.05 0,0.15 0,0.5 0.05,1.05 0.65,6.1 5.15,10.7 5.25,5.2 12.75,5.2 7.45,0 12.7,-5.2 4.95,-4.95 5.3,-11.75 Q 118,21 118,20.9 117.6,14.2 112.7,9.4 107.45,4.1 100,4.1 m -7.65,8.3 Q 95.5,9.2 100,9.2 q 4.5,0 7.65,3.2 3.15,3.15 3.15,7.6 0,0.35 0,0.65 0,0.15 0,0.25 0,0.15 0,0.25 -0.4,3.75 -3.15,6.55 -3.15,3.1 -7.65,3.1 -4.5,0 -7.65,-3.1 -2.9,-2.9 -3.1,-6.8 v -0.05 q 0,-0.1 0,-0.2 -0.05,-0.3 -0.05,-0.65 0,-4.45 3.15,-7.6 m 7.65,1.4 q -0.85,0 -1.55,0.6 -0.6,0.7 -0.6,1.55 v 8.15 q 0,0.85 0.6,1.5 0.7,0.65 1.55,0.65 h 0.05 q 0.9,0 1.5,-0.65 0.7,-0.65 0.7,-1.5 v -8.15 q 0,-0.85 -0.7,-1.55 -0.6,-0.6 -1.5,-0.6 z"/>
<path fill="#e3b602" d="m 100,11.3 q -4.5,0 -7.65,3.15 -2.65,2.7 -3.1,6.4 v 0.05 q 0.2,3.9 3.1,6.8 3.15,3.1 7.65,3.1 4.5,0 7.65,-3.1 2.75,-2.8 3.15,-6.55 0,-0.1 0,-0.25 -0.45,-3.7 -3.15,-6.45 Q 104.5,11.3 100,11.3 m -1.55,3.1 q 0.7,-0.6 1.55,-0.6 h 0.05 q 0.9,0 1.5,0.6 0.7,0.7 0.7,1.55 v 8.15 q 0,0.85 -0.7,1.5 -0.6,0.65 -1.5,0.65 H 100 q -0.85,0 -1.55,-0.65 -0.6,-0.65 -0.6,-1.5 v -8.15 q 0,-0.85 0.6,-1.55 z"/>
<path fill="#caa202" d="M 92.35,14.45 Q 95.5,11.3 100,11.3 q 4.5,0 7.65,3.15 2.7,2.75 3.15,6.45 0,-0.1 0,-0.25 0,-0.3 0,-0.65 0,-4.45 -3.15,-7.6 -3.15,-3.2 -7.65,-3.2 -4.5,0 -7.65,3.2 -3.15,3.15 -3.15,7.6 0,0.35 0.05,0.65 0,0.1 0,0.2 0.45,-3.7 3.1,-6.4 z"/>
<path fill="#fee481" d="M 100,2 Q 92.5,2 87.25,7.3 82.75,11.85 82.1,17.95 82,19 82,20 q 0,0.5 0.05,0.9 0,-0.4 0.05,-0.8 0.65,-6.2 5.15,-10.7 5.25,-5.3 12.75,-5.3 7.45,0 12.7,5.3 4.9,4.8 5.3,11.5 0,-0.4 0,-0.9 0,-7.45 -5.3,-12.7 Q 107.45,2 100,2 Z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.4 KiB

7
src/Chat/Header.hbs Normal file
View File

@ -0,0 +1,7 @@
<div class="DSA41 row chat-header">
<img src="{{img}}" alt="{{name}}">
<div class="col">
<span class="title">{{name}}</span>
<span class="subtitle">{{author}}</span>
</div>
</div>

View File

@ -0,0 +1,11 @@
<div class="DSA41 chat-targets">
<div class="center">{{localize "DSA41.chat.targets"}}</div>
{{#each this}}
<div class="target" data-actor-id="{{uuid}}">
<img src="{{img}}" alt="{{name}}">
<span>{{name}}</span>
<button data-action="apply_damage">{{localize "DSA41.chat.trefferpunkte_apply"}}</button>
</div>
{{/each}}
</div>

View File

@ -0,0 +1,12 @@
<div class="trefferzone_dialog">
<select name="trefferzone" class="colspan4">
<option value="kopf" {{#if (eq formData.trefferzone "kopf") }}selected{{/if}}>{{localize "DSA41.ruestungen.kopf"}} </option>
<option value="brust" {{#if (eq formData.trefferzone "brust") }}selected{{/if}}>{{localize "DSA41.ruestungen.brust"}} </option>
<option value="ruecken" {{#if (eq formData.trefferzone "ruecken") }}selected{{/if}}>{{localize "DSA41.ruestungen.ruecken"}} </option>
<option value="bauch" {{#if (eq formData.trefferzone "bauch") }}selected{{/if}}>{{localize "DSA41.ruestungen.bauch"}} </option>
<option value="linker_arm" {{#if (eq formData.trefferzone "linker_arm") }}selected{{/if}}>{{localize "DSA41.ruestungen.linker_arm"}} </option>
<option value="rechter_arm" {{#if (eq formData.trefferzone "rechter_arm") }}selected{{/if}}>{{localize "DSA41.ruestungen.rechter_arm"}} </option>
<option value="linkes_bein" {{#if (eq formData.trefferzone "linkes_bein") }}selected{{/if}}>{{localize "DSA41.ruestungen.linkes_bein"}} </option>
<option value="rechtes_bein" {{#if (eq formData.trefferzone "rechtes_bein")}}selected{{/if}}>{{localize "DSA41.ruestungen.rechtes_bein"}}</option>
</select>
</div>

View File

@ -23,9 +23,17 @@
"sozialstatus": "Sozialstatus", "sozialstatus": "Sozialstatus",
"weight": "Gewicht", "weight": "Gewicht",
"price": "Preis", "price": "Preis",
"abenteuerpunkte": "Abenteuerpunkte",
"list_empty": "Keine", "list_empty": "Keine",
"currency": {
"dukaten": "Dukaten",
"silbertaler": "Silbertaler",
"heller": "Heller",
"kreuzer": "Kreuzer"
},
"chat": { "chat": {
"result": "Ergebnis", "result": "Ergebnis",
"success": "Geschafft", "success": "Geschafft",
@ -35,7 +43,10 @@
"value": "Wert", "value": "Wert",
"roll": "Wurf", "roll": "Wurf",
"talentwert_short": "TaW" "talentwert_short": "TaW",
"targets": "Ziele",
"trefferpunkte_apply": "Zuweisen"
}, },
"basiswerte": { "basiswerte": {

View File

@ -49,7 +49,7 @@ html {
height: fit-content; height: fit-content;
} }
& .row { & .row, &.row {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
flex: 1; flex: 1;
@ -145,6 +145,38 @@ html {
margin-right: 0.5rem; margin-right: 0.5rem;
} }
&.chat-header {
& img {
margin-right: .75em;
width: 38px;
height: 38px;
}
& .subtitle {
color: #666;
font-size: .6875rem;
}
}
&.chat-targets {
& img {
width: 20px;
height: 20px;
}
& .target {
display: grid;
grid-template-columns: max-content minmax(0, max-content) auto minmax(min-content, max-content);
gap: 0.5em;
& button {
grid-column: 3;
line-height: normal;
}
}
}
& .die { & .die {
display: inline-grid; display: inline-grid;
@ -236,6 +268,48 @@ html {
} }
} }
& .currency {
width: min-content;
margin-left: auto;
align-items: center;
display: grid;
grid-template-columns: repeat(8, 1fr);
& .editable-input {
display: inline-block;
width: 7ch;
& input {
background: transparent;
padding: 0;
}
}
& svg {
width: 25px;
height: 25px;
}
}
& .Abenteuerpunkte {
width: min-content;
margin-left: auto;
align-items: center;
display: flex;
gap: 1em;
& .editable-input {
display: inline-block;
width: 5ch;
& input {
background: transparent;
padding: 0;
}
}
}
& .tabs { & .tabs {
padding: .5rem; padding: .5rem;

View File

@ -8,12 +8,22 @@ Hooks.once("i18nInit", async function() {
game.i18n._fallback = foundry.utils.mergeObject(await game.i18n._getTranslations("de"), game.i18n._fallback); game.i18n._fallback = foundry.utils.mergeObject(await game.i18n._getTranslations("de"), game.i18n._fallback);
}); });
class DSA41_Notifications extends Notifications {
notify(message, type="info", {localize=false, permanent=false, console=true}={}) {
if (permanent && message.startsWith("Foundry Virtual Tabletop requires a minimum screen resolution"))
return;
return super.notify(message, type, { localize, permanent, console });
}
}
Hooks.once("init", async function() { Hooks.once("init", async function() {
CONFIG.Combat.initiative.formula = "1d6 + @computed.ini_basiswert[INI-Basiswert]"; CONFIG.Combat.initiative.formula = "1d6 + @computed.ini_basiswert[INI-Basiswert]";
CONFIG.ui.notifications = DSA41_Notifications
CONFIG.Actor.dataModels.Player = DSA41_CharacterData; CONFIG.Actor.dataModels.Player = DSA41_CharacterData;
CONFIG.Actor.documentClass = DSA41_CharacterDocument; CONFIG.Actor.documentClass = DSA41_CharacterDocument;
CONFIG.ChatMessage.documentClass = DSA41_ChatMessage;
CONFIG.Item.dataModels.Gegenstand = DSA41_GegenstandData; CONFIG.Item.dataModels.Gegenstand = DSA41_GegenstandData;
CONFIG.Item.dataModels.Ruestung = DSA41_RuestungData; CONFIG.Item.dataModels.Ruestung = DSA41_RuestungData;
CONFIG.Item.dataModels.Bewaffnung = DSA41_BewaffnungData; CONFIG.Item.dataModels.Bewaffnung = DSA41_BewaffnungData;
@ -22,6 +32,8 @@ Hooks.once("init", async function() {
CONFIG.Item.dataModels.Sonderfertigkeit = DSA41_SonderfertigkeitData; CONFIG.Item.dataModels.Sonderfertigkeit = DSA41_SonderfertigkeitData;
CONFIG.Item.dataModels.VorNachteil = DSA41_VorNachteilData; CONFIG.Item.dataModels.VorNachteil = DSA41_VorNachteilData;
CONFIG.statusEffects = [];
DocumentSheetConfig.unregisterSheet(Actor, "core", ActorSheet); DocumentSheetConfig.unregisterSheet(Actor, "core", ActorSheet);
DocumentSheetConfig.registerSheet(Actor, "dsa41", DSA41_ActorSheet, { DocumentSheetConfig.registerSheet(Actor, "dsa41", DSA41_ActorSheet, {
makeDefault: true, makeDefault: true,
@ -70,10 +82,94 @@ Hooks.once("init", async function() {
"fernkampf_attacke_tooltip": "systems/dsa-4th-edition/src/Tooltips/FernkampfAttacke.hbs", "fernkampf_attacke_tooltip": "systems/dsa-4th-edition/src/Tooltips/FernkampfAttacke.hbs",
"fernkampf_trefferpunkte_tooltip": "systems/dsa-4th-edition/src/Tooltips/FernkampfTrefferpunkte.hbs", "fernkampf_trefferpunkte_tooltip": "systems/dsa-4th-edition/src/Tooltips/FernkampfTrefferpunkte.hbs",
"CHAT_HEADER": "systems/dsa-4th-edition/src/Chat/Header.hbs",
"TrefferpunkteTargets": "systems/dsa-4th-edition/src/Chat/TrefferpunkteTargets.hbs",
"talent_chat": "systems/dsa-4th-edition/src/Chat/Talent.hbs", "talent_chat": "systems/dsa-4th-edition/src/Chat/Talent.hbs",
}); });
}); });
function get_targeted_actors() {
const targets = [];
for (const token of game.user.targets) {
if (token.actor) {
targets.push(token.actor.uuid);
}
}
return targets;
}
async function instantiateTemplate(template, context) {
const html = await renderTemplate(template, context);
const template_element = document.createElement("template");
template_element.innerHTML = html;
return template_element.content.firstChild;
}
class DSA41_ChatMessage extends ChatMessage {
get actor() {
if (this.speaker.scene && this.speaker.token) {
const scene = game.scenes.get(this.speaker.scene);
const token = scene?.tokens.get(this.speaker.token);
if (token) return token.actor;
}
return game.actors.get(this.speaker.actor);
}
async getHTML() {
const html = (await super.getHTML())[0];
if (!html) return;
const img = this.actor?.img ?? this.author.avatar;
const name = this.alias;
const header = await instantiateTemplate("CHAT_HEADER", { img: img, name: name, author: this.author?.name ?? "" });
const sender = html.querySelector(".message-sender");
sender?.replaceChildren(header);
if (this.flags.type === "trefferpunkte" && this.flags.targets.length != 0) {
const targets = this.flags.targets.map(x => fromUuidSync(x, { strict: false })).filter(x => x !== null);
const targets_list = await instantiateTemplate("TrefferpunkteTargets", targets);
html.querySelector(".message-content")?.appendChild(targets_list);
}
for (const element of html.querySelectorAll("[data-action]")) {
element.addEventListener("click", async event => {
const target = event.target;
const action = target.dataset.action;
if (action === null) return;
if (action === "apply_damage") {
const target_actor_id = target.closest("[data-actor-id]")?.dataset.actorId;
if (!target_actor_id) return;
const target_actor = fromUuidSync(target_actor_id);
if (!target_actor) return;
const dialog_data = await DSA41_Dialog.wait("Trefferzone", { window: {title: "Trefferzone"} });
const trefferzone = dialog_data.trefferzone;
const rolled_damage = this.rolls[0].total;
const target_hp = target_actor.system.lebenspunkte.aktuell;
const target_rs = target_actor.system.computed.kampf.ruestungen_gesamt[trefferzone];
const damage = Math.max(rolled_damage - target_rs, 0);
const new_hp = target_hp - damage;
target_actor.update({ "system.lebenspunkte.aktuell": new_hp });
}
});
}
return html;
}
}
function get_minified_formula(formula, data) { function get_minified_formula(formula, data) {
const terms = Roll.simplifyTerms(Roll.parse(formula, data)); const terms = Roll.simplifyTerms(Roll.parse(formula, data));
let output = []; let output = [];
@ -198,6 +294,18 @@ class DSA41_CharacterData extends TypeDataModel {
profession: new StringField(), profession: new StringField(),
sozialstatus: new NumberField({ integer: true, inital: 1 }), sozialstatus: new NumberField({ integer: true, inital: 1 }),
abenteuerpunkte: new SchemaField({
ausgegeben: new NumberField({ integer: true, initial: 0 }),
gesamt: new NumberField({ integer: true, initial: 0 }),
}),
currency: new SchemaField({
dukaten: new NumberField({ integer: true, initial: 0 }),
silbertaler: new NumberField({ integer: true, initial: 0 }),
heller: new NumberField({ integer: true, initial: 0 }),
kreuzer: new NumberField({ integer: true, initial: 0 }),
}),
attributes: new SchemaField({ attributes: new SchemaField({
courage: new AttributeField(), courage: new AttributeField(),
cleverness: new AttributeField(), cleverness: new AttributeField(),
@ -252,6 +360,7 @@ class DSA41_CharacterData extends TypeDataModel {
async prepareDerivedData() { async prepareDerivedData() {
super.prepareDerivedData(); super.prepareDerivedData();
this.computed = { this.computed = {
abenteuerpunkte: {},
attributes: {}, attributes: {},
attributes_without_modifiers: {}, attributes_without_modifiers: {},
@ -283,6 +392,8 @@ class DSA41_CharacterData extends TypeDataModel {
}, },
}; };
this.computed.abenteuerpunkte.uebrig = this.abenteuerpunkte.gesamt - this.abenteuerpunkte.ausgegeben;
for (const [attribute, values] of Object.entries(this.attributes)) { for (const [attribute, values] of Object.entries(this.attributes)) {
this.computed.attributes[attribute] = values.initial + values.advancement + values.modifier; this.computed.attributes[attribute] = values.initial + values.advancement + values.modifier;
this.computed.attributes_without_modifiers[attribute] = values.initial + values.advancement; this.computed.attributes_without_modifiers[attribute] = values.initial + values.advancement;
@ -575,7 +686,7 @@ class DSA41_BewaffnungData extends TypeDataModel {
class DSA41_TalentData extends TypeDataModel { class DSA41_TalentData extends TypeDataModel {
static defineSchema() { static defineSchema() {
return { return {
kategorie: new StringField(), kategorie: new StringField({ initial: "koerperliche" }),
behinderung: new StringField(), behinderung: new StringField(),
attribute1: new StringField(), attribute1: new StringField(),
@ -590,7 +701,7 @@ class DSA41_TalentData extends TypeDataModel {
class DSA41_KampftalentData extends TypeDataModel { class DSA41_KampftalentData extends TypeDataModel {
static defineSchema() { static defineSchema() {
return { return {
kategorie: new StringField(), kategorie: new StringField({ initial: "waffenlos" }),
behinderung: new StringField(), behinderung: new StringField(),
steigern: new StringField(), steigern: new StringField(),
@ -606,7 +717,7 @@ class DSA41_KampftalentData extends TypeDataModel {
class DSA41_SonderfertigkeitData extends TypeDataModel { class DSA41_SonderfertigkeitData extends TypeDataModel {
static defineSchema() { static defineSchema() {
return { return {
kategorie: new StringField(), kategorie: new StringField({ initial: "allgemein" }),
kosten: new NumberField({ integer: true, initial: 0 }), kosten: new NumberField({ integer: true, initial: 0 }),
verbreitung: new NumberField({ integer: true, initial: 0 }), verbreitung: new NumberField({ integer: true, initial: 0 }),
@ -618,7 +729,7 @@ class DSA41_SonderfertigkeitData extends TypeDataModel {
class DSA41_VorNachteilData extends TypeDataModel { class DSA41_VorNachteilData extends TypeDataModel {
static defineSchema() { static defineSchema() {
return { return {
kategorie: new StringField(), kategorie: new StringField({ initial: "vorteil" }),
kosten: new NumberField({ integer: true, initial: 0 }), kosten: new NumberField({ integer: true, initial: 0 }),
beschreibung: new StringField(), beschreibung: new StringField(),
@ -654,6 +765,8 @@ class DSA41_Dialog extends DSA41_ApplicationMixin(ApplicationV2) {
FernkampfAttacke: { template: "systems/dsa-4th-edition/src/Dialogs/FernkampfAttacke.hbs" }, FernkampfAttacke: { template: "systems/dsa-4th-edition/src/Dialogs/FernkampfAttacke.hbs" },
FernkampfTrefferpunkte: { template: "systems/dsa-4th-edition/src/Dialogs/FernkampfTrefferpunkte.hbs" }, FernkampfTrefferpunkte: { template: "systems/dsa-4th-edition/src/Dialogs/FernkampfTrefferpunkte.hbs" },
Trefferzone: { template: "systems/dsa-4th-edition/src/Dialogs/Trefferzone.hbs" },
footer: { template: "templates/generic/form-footer.hbs" }, footer: { template: "templates/generic/form-footer.hbs" },
}; };
@ -752,6 +865,10 @@ class DSA41_ActorSheet extends DSA41_ApplicationMixin(ActorSheetV2) {
roll.toMessage({ roll.toMessage({
speaker: ChatMessage.getSpeaker({ actor: this.document }), speaker: ChatMessage.getSpeaker({ actor: this.document }),
flavor: flavor, flavor: flavor,
flags: {
type: roll_type,
targets: get_targeted_actors(),
},
}); });
return; return;
@ -820,6 +937,10 @@ class DSA41_ActorSheet extends DSA41_ApplicationMixin(ActorSheetV2) {
roll.toMessage({ roll.toMessage({
speaker: ChatMessage.getSpeaker({ actor: this.document }), speaker: ChatMessage.getSpeaker({ actor: this.document }),
flavor: flavor, flavor: flavor,
flags: {
type: roll_type,
targets: get_targeted_actors(),
},
}); });
return; return;
@ -843,6 +964,10 @@ class DSA41_ActorSheet extends DSA41_ApplicationMixin(ActorSheetV2) {
roll.toMessage({ roll.toMessage({
speaker: ChatMessage.getSpeaker({ actor: this.document }), speaker: ChatMessage.getSpeaker({ actor: this.document }),
flavor: flavor, flavor: flavor,
flags: {
type: roll_type,
targets: get_targeted_actors(),
},
}); });
return; return;
@ -861,6 +986,10 @@ class DSA41_ActorSheet extends DSA41_ApplicationMixin(ActorSheetV2) {
roll.toMessage({ roll.toMessage({
speaker: ChatMessage.getSpeaker({ actor: this.document }), speaker: ChatMessage.getSpeaker({ actor: this.document }),
flavor: flavor, flavor: flavor,
flags: {
type: roll_type,
targets: get_targeted_actors(),
},
}); });
return; return;
@ -879,6 +1008,10 @@ class DSA41_ActorSheet extends DSA41_ApplicationMixin(ActorSheetV2) {
roll.toMessage({ roll.toMessage({
speaker: ChatMessage.getSpeaker({ actor: this.document }), speaker: ChatMessage.getSpeaker({ actor: this.document }),
flavor: game.i18n.localize("DSA41.roll_types." + roll_type), flavor: game.i18n.localize("DSA41.roll_types." + roll_type),
flags: {
type: roll_type,
targets: get_targeted_actors(),
},
}); });
return; return;
@ -897,6 +1030,10 @@ class DSA41_ActorSheet extends DSA41_ApplicationMixin(ActorSheetV2) {
roll.toMessage({ roll.toMessage({
speaker: ChatMessage.getSpeaker({ actor: this.document }), speaker: ChatMessage.getSpeaker({ actor: this.document }),
flavor: game.i18n.localize("DSA41.roll_types." + roll_type), flavor: game.i18n.localize("DSA41.roll_types." + roll_type),
flags: {
type: roll_type,
targets: get_targeted_actors(),
},
}); });
return; return;
@ -906,6 +1043,10 @@ class DSA41_ActorSheet extends DSA41_ApplicationMixin(ActorSheetV2) {
roll.toMessage({ roll.toMessage({
speaker: ChatMessage.getSpeaker({ actor: this.document }), speaker: ChatMessage.getSpeaker({ actor: this.document }),
flavor: flavor, flavor: flavor,
flags: {
type: roll_type,
targets: get_targeted_actors(),
},
}); });
}, },