add fernkampf attack and damage rolls

This commit is contained in:
Sven Balzer 2024-11-11 23:24:32 +01:00
parent 6aa65be7a0
commit 998951bafc
14 changed files with 340 additions and 30 deletions

View File

@ -13,7 +13,7 @@
{{/inline}} {{/inline}}
<div class="actor-sheet ActorSheet"> <div class="actor-sheet ActorSheet">
<div class="row"> <div class="grid4 gap">
{{>editable-input type="text" name="name" value=actor.name placeholder=(localize "DSA41.name")}} {{>editable-input type="text" name="name" value=actor.name placeholder=(localize "DSA41.name")}}
{{>editable-input type="text" name="system.race" value=actor.system.race placeholder=(localize "DSA41.race")}} {{>editable-input type="text" name="system.race" value=actor.system.race placeholder=(localize "DSA41.race")}}
{{>editable-input type="text" name="system.culture" value=actor.system.culture placeholder=(localize "DSA41.culture")}} {{>editable-input type="text" name="system.culture" value=actor.system.culture placeholder=(localize "DSA41.culture")}}
@ -141,7 +141,7 @@
</div> </div>
{{#each actor.itemTypes.Bewaffnung}} {{#each actor.itemTypes.Bewaffnung}}
<div class="list-item" data-item-id="{{this._id}}"> <div class="list-item" data-item-id="{{this._id}}">
<div class="item-name row" data-action="item-open"> <div class="row" data-action="item-open">
<img class="item-image" src="{{this.img}}" title="{{this.name}}"> <img class="item-image" src="{{this.img}}" title="{{this.name}}">
<div class="col"> <div class="col">
<span>{{this.name}}</span> <span>{{this.name}}</span>
@ -168,7 +168,7 @@
</div> </div>
{{#each actor.itemTypes.Ruestung}} {{#each actor.itemTypes.Ruestung}}
<div class="list-item" data-item-id="{{this._id}}"> <div class="list-item" data-item-id="{{this._id}}">
<div class="item-name row" data-action="item-open"> <div class="row" data-action="item-open">
<img class="item-image" src="{{this.img}}" title="{{this.name}}"> <img class="item-image" src="{{this.img}}" title="{{this.name}}">
<span class="center">{{this.name}}</span> <span class="center">{{this.name}}</span>
</div> </div>
@ -187,7 +187,7 @@
</div> </div>
{{#each actor.itemTypes.Gegenstand}} {{#each actor.itemTypes.Gegenstand}}
<div class="list-item" data-item-id="{{this._id}}"> <div class="list-item" data-item-id="{{this._id}}">
<div class="item-name row" data-action="item-open"> <div class="row" data-action="item-open">
<img class="item-image" src="{{this.img}}" title="{{this.name}}"> <img class="item-image" src="{{this.img}}" title="{{this.name}}">
<span class="center">{{this.name}}</span> <span class="center">{{this.name}}</span>
</div> </div>
@ -210,7 +210,7 @@
{{#each actor.system.computed.kampf.waffen}} {{#each actor.system.computed.kampf.waffen}}
<div class="list-item" data-item-id="{{item._id}}"> <div class="list-item" data-item-id="{{item._id}}">
<div class="item-name row" data-action="item-open"> <div class="row" data-action="item-open">
<img class="item-image" src="{{item.img}}" title="{{item.name}}"> <img class="item-image" src="{{item.img}}" title="{{item.name}}">
<div class="col"> <div class="col">
<span>{{item.name}}</span> <span>{{item.name}}</span>
@ -221,6 +221,19 @@
<div class="center">{{>die-value type="trefferpunkte" data-roll=trefferpunkte value=trefferpunkte_display data-tooltip="trefferpunkte_tooltip"}}</div> <div class="center">{{>die-value type="trefferpunkte" data-roll=trefferpunkte value=trefferpunkte_display data-tooltip="trefferpunkte_tooltip"}}</div>
</div> </div>
{{/each}} {{/each}}
{{#each actor.system.computed.kampf.fernkampf_waffen}}
<div class="list-item" data-item-id="{{item._id}}">
<div class="row" data-action="item-open">
<img class="item-image" src="{{item.img}}" title="{{item.name}}">
<div class="col">
<span>{{item.name}}</span>
</div>
</div>
<div class="center">{{>die-value type="fernkampf-attacke" data-roll="1d20" value=attacke data-tooltip="fernkampf_attacke_tooltip"}}</div>
<div class="center"></div>
<div class="center">{{>die-value type="fernkampf-trefferpunkte" data-roll=trefferpunkte value=trefferpunkte_display data-tooltip="fernkampf_trefferpunkte_tooltip"}}</div>
</div>
{{/each}}
</div> </div>
<div class="list Ruestung"> <div class="list Ruestung">
@ -249,7 +262,7 @@
{{#each actor.system.computed.kampf.ruestungen}} {{#each actor.system.computed.kampf.ruestungen}}
<div class="list-item" data-item-id="{{item._id}}"> <div class="list-item" data-item-id="{{item._id}}">
<div class="row item-name" data-action="item-open"> <div class="row" data-action="item-open">
<img class="item-image" src="{{item.img}}" title="{{item.name}}"> <img class="item-image" src="{{item.img}}" title="{{item.name}}">
<span class="center">{{item.name}}</span> <span class="center">{{item.name}}</span>
</div> </div>

View File

@ -0,0 +1,59 @@
<div class="fernkampf_angriff_dialog">
<span>{{localize "DSA41.kampf.zielgroesse.label"}}</span>
<select name="ziel_groesse">
<option value="-2" {{#if (eq formData.ziel_groesse -2)}}selected{{/if}}>{{localize "DSA41.kampf.zielgroesse.sehr_gross"}}</option>
<option value="0" {{#if (eq formData.ziel_groesse 0)}}selected{{/if}}>{{localize "DSA41.kampf.zielgroesse.gross"}} </option>
<option value="2" {{#if (eq formData.ziel_groesse 2)}}selected{{/if}}>{{localize "DSA41.kampf.zielgroesse.mittel"}} </option>
<option value="4" {{#if (eq formData.ziel_groesse 4)}}selected{{/if}}>{{localize "DSA41.kampf.zielgroesse.klein"}} </option>
<option value="6" {{#if (eq formData.ziel_groesse 6)}}selected{{/if}}>{{localize "DSA41.kampf.zielgroesse.sehr_klein"}}</option>
<option value="8" {{#if (eq formData.ziel_groesse 8)}}selected{{/if}}>{{localize "DSA41.kampf.zielgroesse.winzig"}} </option>
</select>
<span>{{localize "DSA41.kampf.deckung.label"}}</span>
<select name="deckung">
<option value="0" {{#if (eq formData.deckung 0)}}selected{{/if}}>{{localize "DSA41.kampf.deckung.keine"}} </option>
<option value="2" {{#if (eq formData.deckung 2)}}selected{{/if}}>{{localize "DSA41.kampf.deckung.halb"}} </option>
<option value="4" {{#if (eq formData.deckung 4)}}selected{{/if}}>{{localize "DSA41.kampf.deckung.drei_viertel"}}</option>
</select>
<span>{{localize "DSA41.kampf.entfernung.label"}}</span>
<select name="entfernung">
<option value="-2" {{#if (eq formData.entfernung -2)}}selected{{/if}}>{{localize "DSA41.kampf.entfernung.sehr_nah"}} </option>
<option value="0" {{#if (eq formData.entfernung 0)}}selected{{/if}}>{{localize "DSA41.kampf.entfernung.nah"}} </option>
<option value="4" {{#if (eq formData.entfernung 4)}}selected{{/if}}>{{localize "DSA41.kampf.entfernung.mittel"}} </option>
<option value="8" {{#if (eq formData.entfernung 8)}}selected{{/if}}>{{localize "DSA41.kampf.entfernung.weit"}} </option>
<option value="12" {{#if (eq formData.entfernung 12)}}selected{{/if}}>{{localize "DSA41.kampf.entfernung.extrem_weit"}}</option>
</select>
<span>{{localize "DSA41.kampf.zielbewegung.label"}}</span>
<select name="ziel_bewegung">
<option value="-4" {{#if (eq formData.ziel_bewegung -4)}}selected{{/if}}>{{localize "DSA41.kampf.zielbewegung.unbeweglich"}} </option>
<option value="-2" {{#if (eq formData.ziel_bewegung -2)}}selected{{/if}}>{{localize "DSA41.kampf.zielbewegung.stillstehend"}}</option>
<option value="0" {{#if (eq formData.ziel_bewegung 0)}}selected{{/if}}>{{localize "DSA41.kampf.zielbewegung.leicht"}} </option>
<option value="2" {{#if (eq formData.ziel_bewegung 2)}}selected{{/if}}>{{localize "DSA41.kampf.zielbewegung.schnell"}} </option>
<option value="4" {{#if (eq formData.ziel_bewegung 4)}}selected{{/if}}>{{localize "DSA41.kampf.zielbewegung.sehr_schnell"}}</option>
</select>
<span>{{localize "DSA41.kampf.wind.label"}}</span>
<select name="wind">
<option value="0" {{#if (eq formData.wind 0)}}selected{{/if}}>{{localize "DSA41.kampf.wind.still"}} </option>
<option value="4" {{#if (eq formData.wind 4)}}selected{{/if}}>{{localize "DSA41.kampf.wind.seitenwind"}} </option>
<option value="8" {{#if (eq formData.wind 8)}}selected{{/if}}>{{localize "DSA41.kampf.wind.starker_seitenwind"}}</option>
</select>
<span>{{localize "DSA41.kampf.modifikator"}}</span>
{{>editable-input type="number" name="modifikator" value=(lookup formData "modifikator")}}
<div class="dsa41-calculation colspan4 center">
max(-2,
<ruby>{{formData.ziel_groesse}}<rt>{{localize "DSA41.kampf.zielgroesse.label"}}</rt></ruby>
+ <ruby>{{formData.deckung}}<rt>{{localize "DSA41.kampf.deckung.label"}}</rt></ruby>
+ <ruby>{{formData.ziel_bewegung}}<rt>{{localize "DSA41.kampf.zielbewegung.label"}}</rt></ruby>
)
+ <ruby>{{formData.entfernung}}<rt>{{localize "DSA41.kampf.entfernung.label"}}</rt></ruby>
+ <ruby>{{formData.wind}}<rt>{{localize "DSA41.kampf.wind.label"}}</rt></ruby>
+ <ruby>{{formData.modifikator}}<rt>{{localize "DSA41.kampf.modifikator"}}</rt></ruby>
</div>
</div>

View File

@ -0,0 +1,19 @@
<div class="fernkampf_trefferpunkte_dialog">
<span>{{localize "DSA41.kampf.entfernung.label"}}</span>
<select name="entfernung">
<option value="modifikator1" {{#if (eq formData.entfernung "modifikator1")}}selected{{/if}}>{{localize "DSA41.kampf.entfernung.sehr_nah"}} </option>
<option value="modifikator2" {{#if (eq formData.entfernung "modifikator2")}}selected{{/if}}>{{localize "DSA41.kampf.entfernung.nah"}} </option>
<option value="modifikator3" {{#if (eq formData.entfernung "modifikator3")}}selected{{/if}}>{{localize "DSA41.kampf.entfernung.mittel"}} </option>
<option value="modifikator4" {{#if (eq formData.entfernung "modifikator4")}}selected{{/if}}>{{localize "DSA41.kampf.entfernung.weit"}} </option>
<option value="modifikator5" {{#if (eq formData.entfernung "modifikator5")}}selected{{/if}}>{{localize "DSA41.kampf.entfernung.extrem_weit"}}</option>
</select>
<span>{{localize "DSA41.kampf.modifikator"}}</span>
{{>editable-input type="number" name="modifikator" value=(lookup formData "modifikator") }}
<div class="dsa41-calculation colspan4 center">
<ruby>{{options.item.system.fernkampfwaffe.basis}}<rt>{{localize "DSA41.bewaffnung.fernkampfwaffe.basis"}}</rt></ruby>
+ <ruby>{{lookup options.item.system.fernkampfwaffe formData.entfernung}}<rt>{{localize "DSA41.kampf.entfernung.label"}}</rt></ruby>
+ <ruby>{{formData.modifikator}}<rt>{{localize "DSA41.kampf.modifikator"}}</rt></ruby>
</div>
</div>

View File

@ -1,4 +1,4 @@
<div class="editable-input editable-{{type}}"> <div class="editable-input editable-{{type}} {{class}}">
{{#if (eq type "checkbox")}} {{#if (eq type "checkbox")}}
<input type="checkbox" name="{{name}}" {{checked value}}> <input type="checkbox" name="{{name}}" {{checked value}}>
{{else}} {{else}}

View File

@ -3,7 +3,7 @@
<img class="item-image" src="{{ item.img }}" title="{{ item.name }}" {{#if editable}}data-edit="img"{{/if}}> <img class="item-image" src="{{ item.img }}" title="{{ item.name }}" {{#if editable}}data-edit="img"{{/if}}>
<div class="col"> <div class="col">
{{>editable-input type="text" name="name" value=item.name placeholder=(localize "DSA41.name")}} {{>editable-input type="text" name="name" value=item.name placeholder=(localize "DSA41.name")}}
<div class="row"> <div class="row gap">
{{>editable-input type="number" name="system.gewicht" value=item.system.gewicht placeholder=(localize "DSA41.weight")}} {{>editable-input type="number" name="system.gewicht" value=item.system.gewicht placeholder=(localize "DSA41.weight")}}
{{>editable-input type="number" name="system.preis" value=item.system.preis placeholder=(localize "DSA41.price")}} {{>editable-input type="number" name="system.preis" value=item.system.preis placeholder=(localize "DSA41.price")}}
</div> </div>

View File

@ -3,7 +3,7 @@
<img class="item-image" src="{{ item.img }}" title="{{ item.name }}" {{#if editable}}data-edit="img"{{/if}}> <img class="item-image" src="{{ item.img }}" title="{{ item.name }}" {{#if editable}}data-edit="img"{{/if}}>
<div class="col"> <div class="col">
{{>editable-input type="text" name="name" value=item.name placeholder=(localize "DSA41.name")}} {{>editable-input type="text" name="name" value=item.name placeholder=(localize "DSA41.name")}}
<div class="row"> <div class="row gap">
{{>editable-input type="number" name="system.gewicht" value=item.system.gewicht placeholder=(localize "DSA41.weight")}} {{>editable-input type="number" name="system.gewicht" value=item.system.gewicht placeholder=(localize "DSA41.weight")}}
{{>editable-input type="number" name="system.preis" value=item.system.preis placeholder=(localize "DSA41.price")}} {{>editable-input type="number" name="system.preis" value=item.system.preis placeholder=(localize "DSA41.price")}}
</div> </div>

View File

@ -3,7 +3,7 @@
<img class="item-image" src="{{ item.img }}" title="{{ item.name }}" {{#if editable}}data-edit="img"{{/if}}> <img class="item-image" src="{{ item.img }}" title="{{ item.name }}" {{#if editable}}data-edit="img"{{/if}}>
<div class="col"> <div class="col">
{{>editable-input type="text" name="name" value=item.name placeholder=(localize "DSA41.name")}} {{>editable-input type="text" name="name" value=item.name placeholder=(localize "DSA41.name")}}
<div class="row"> <div class="row gap">
{{>editable-input type="number" name="system.gewicht" value=item.system.gewicht placeholder=(localize "DSA41.weight")}} {{>editable-input type="number" name="system.gewicht" value=item.system.gewicht placeholder=(localize "DSA41.weight")}}
{{>editable-input type="number" name="system.preis" value=item.system.preis placeholder=(localize "DSA41.price")}} {{>editable-input type="number" name="system.preis" value=item.system.preis placeholder=(localize "DSA41.price")}}
</div> </div>

View File

@ -1,5 +1,7 @@
<div class="dsa41-tooltip"> <div class="dsa41-tooltip">
<ruby>{{talent_attacke}}<rt>{{localize "DSA41.talente.label"}}</rt></ruby> <ruby>{{basis_attacke}}<rt>{{localize "DSA41.bewaffnung.nahkampfwaffe.basis"}}</rt></ruby>
+ <ruby>{{talent_attacke}}<rt>{{localize "DSA41.talente.label"}}</rt></ruby>
{{#if (ne modifikator_attacke 0)}} {{#if (ne modifikator_attacke 0)}}
+ <ruby>{{modifikator_attacke}}<rt>{{localize "DSA41.bewaffnung.nahkampfwaffe.modifikator"}}</rt></ruby> + <ruby>{{modifikator_attacke}}<rt>{{localize "DSA41.bewaffnung.nahkampfwaffe.modifikator"}}</rt></ruby>

View File

@ -0,0 +1,4 @@
<div class="dsa41-tooltip">
<ruby>{{basis_attacke}}<rt>{{localize "DSA41.bewaffnung.fernkampfwaffe.basis"}}</rt></ruby>
+ <ruby>{{talent_attacke}}<rt>{{localize "DSA41.talente.label"}}</rt></ruby>
</div>

View File

@ -0,0 +1,3 @@
<div class="dsa41-tooltip">
<ruby>{{item.system.fernkampfwaffe.basis}}<rt>{{localize "DSA41.bewaffnung.fernkampfwaffe.basis"}}</rt></ruby>
</div>

View File

@ -1,5 +1,7 @@
<div class="dsa41-tooltip"> <div class="dsa41-tooltip">
<ruby>{{talent_parade}}<rt>{{localize "DSA41.talente.label"}}</rt></ruby> <ruby>{{basis_parade}}<rt>{{localize "DSA41.bewaffnung.nahkampfwaffe.basis"}}</rt></ruby>
+ <ruby>{{talent_parade}}<rt>{{localize "DSA41.talente.label"}}</rt></ruby>
{{#if (ne modifikator_parade 0)}} {{#if (ne modifikator_parade 0)}}
+ <ruby>{{modifikator_parade}}<rt>{{localize "DSA41.bewaffnung.nahkampfwaffe.modifikator"}}</rt></ruby> + <ruby>{{modifikator_parade}}<rt>{{localize "DSA41.bewaffnung.nahkampfwaffe.modifikator"}}</rt></ruby>

View File

@ -27,7 +27,10 @@
"attacke": "Attacke", "attacke": "Attacke",
"parade": "Parade", "parade": "Parade",
"trefferpunkte": "Trefferpunkte" "trefferpunkte": "Trefferpunkte",
"fernkampf-attacke": "Attacke",
"fernkampf-trefferpunkte": "Trefferpunkte"
}, },
"character": { "character": {
@ -358,7 +361,55 @@
"attacke": "Attacke", "attacke": "Attacke",
"parade": "Parade", "parade": "Parade",
"trefferpunkte": "Trefferpunkte", "trefferpunkte": "Trefferpunkte",
"ruestungen": "Rüstungen" "ruestungen": "Rüstungen",
"modifikator": "Modifikator",
"zielgroesse": {
"label": "Zielgröße",
"winzig": "Winzig",
"sehr_klein": "Sehr Klein",
"klein": "Klein",
"mittel": "Mittel",
"gross": "Groß",
"sehr_gross": "Sehr Groß"
},
"deckung": {
"label": "Deckung",
"keine": "Keine",
"halb": "Halb",
"drei_viertel": "Drei Viertel"
},
"entfernung": {
"label": "Entfernung",
"sehr_nah": "Sehr Nah",
"nah": "Nah",
"mittel": "Mittel",
"weit": "Weit",
"extrem_weit": "Extrem Weit"
},
"zielbewegung": {
"label": "Bewegung des Ziels",
"unbeweglich": "Unbeweglich",
"stillstehend": "Stillstehend",
"leicht": "Leicht",
"schnell": "Schnell",
"sehr_schnell": "Sehr Schnell"
},
"wind": {
"label": "Wind",
"still": "Still",
"seitenwind": "Böiger Seitenwind",
"starker_seitenwind": "Starker Seitenwind"
}
} }
} }
} }

View File

@ -14,7 +14,7 @@
& [data-action] { & [data-action] {
cursor: pointer; cursor: pointer;
&:hover { &:not(button):hover {
transform: scale(1.05); transform: scale(1.05);
} }
} }
@ -58,6 +58,10 @@
flex: 0; flex: 0;
} }
& .gap {
gap: 0.5rem;
}
& .subgrid { & .subgrid {
display: grid; display: grid;
grid-template-rows: subgrid; grid-template-rows: subgrid;
@ -105,7 +109,6 @@
& .editable-input { & .editable-input {
flex: 1; flex: 1;
padding: 0px 3px;
& input { & input {
border: none; border: none;
@ -132,6 +135,7 @@
& .item-image { & .item-image {
width: 80px; width: 80px;
height: 80px; height: 80px;
margin-right: 0.5rem;
} }
& .die { & .die {
@ -161,6 +165,9 @@
&.die-attacke { fill: #b22319; } &.die-attacke { fill: #b22319; }
&.die-parade { fill: #388834; } &.die-parade { fill: #388834; }
&.die-trefferpunkte { fill: #0c0c0c; } &.die-trefferpunkte { fill: #0c0c0c; }
&.die-fernkampf-attacke { fill: #388834; }
&.die-fernkampf-trefferpunkte { fill: #0c0c0c; }
} }
& .tabs { & .tabs {
@ -194,10 +201,6 @@
width: 40px; width: 40px;
height: 40px; height: 40px;
} }
& .item-name {
gap: 0.5rem;
}
} }
& .list-header { & .list-header {
@ -231,6 +234,17 @@
} }
} }
&.Dialog > .window-content {
gap: 1rem;
& > :first-child {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 0.5rem;
align-items: center;
}
}
& [data-application-part="Bewaffnung"] { & [data-application-part="Bewaffnung"] {
& .tab { & .tab {
grid-template-columns: minmax(0, max-content) minmax(0, 1fr) minmax(0, max-content) minmax(0, 1fr); grid-template-columns: minmax(0, max-content) minmax(0, 1fr) minmax(0, max-content) minmax(0, 1fr);
@ -302,4 +316,9 @@
} }
} }
} }
& .dsa41-calculation {
font-size: 18px;
padding-top: 0.5rem;
}
} }

View File

@ -1,10 +1,10 @@
const { TypeDataModel } = foundry.abstract; const { TypeDataModel } = foundry.abstract;
const { SchemaField, NumberField, StringField, BooleanField } = foundry.data.fields; const { SchemaField, NumberField, StringField, BooleanField } = foundry.data.fields;
const { ActorSheetV2, ItemSheetV2 } = foundry.applications.sheets; const { ActorSheetV2, ItemSheetV2 } = foundry.applications.sheets;
const { HandlebarsApplicationMixin } = foundry.applications.api; const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;
const { OperatorTerm, NumericTerm } = foundry.dice.terms; const { OperatorTerm, NumericTerm } = foundry.dice.terms;
Hooks.once("init", 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.Actor.dataModels.Player = DSA41_CharacterData; CONFIG.Actor.dataModels.Player = DSA41_CharacterData;
@ -32,7 +32,7 @@ Hooks.once("init", function() {
] ]
}); });
loadTemplates({ await loadTemplates({
"editable-input": "systems/dsa-4th-edition/src/EditableInput.hbs", "editable-input": "systems/dsa-4th-edition/src/EditableInput.hbs",
"attribute_tooltip": "systems/dsa-4th-edition/src/Tooltips/Attribute.hbs", "attribute_tooltip": "systems/dsa-4th-edition/src/Tooltips/Attribute.hbs",
@ -40,6 +40,12 @@ Hooks.once("init", function() {
"attacke_tooltip": "systems/dsa-4th-edition/src/Tooltips/Attacke.hbs", "attacke_tooltip": "systems/dsa-4th-edition/src/Tooltips/Attacke.hbs",
"parade_tooltip": "systems/dsa-4th-edition/src/Tooltips/Parade.hbs", "parade_tooltip": "systems/dsa-4th-edition/src/Tooltips/Parade.hbs",
"trefferpunkte_tooltip": "systems/dsa-4th-edition/src/Tooltips/Trefferpunkte.hbs", "trefferpunkte_tooltip": "systems/dsa-4th-edition/src/Tooltips/Trefferpunkte.hbs",
"fernkampf_attacke_tooltip": "systems/dsa-4th-edition/src/Tooltips/FernkampfAttacke.hbs",
"fernkampf_trefferpunkte_tooltip": "systems/dsa-4th-edition/src/Tooltips/FernkampfTrefferpunkte.hbs",
"fernkampf_angriff_dialog": "systems/dsa-4th-edition/src/Dialogs/FernkampfAngriff.hbs",
"fernkampf_trefferpunkte_dialog": "systems/dsa-4th-edition/src/Dialogs/FernkampfTrefferpunkte.hbs",
}); });
}); });
@ -300,9 +306,10 @@ class DSA41_CharacterData extends TypeDataModel {
attributes_without_modifiers: {}, attributes_without_modifiers: {},
kampf: { kampf: {
talente: {}, talente: {},
waffen: {}, waffen: {},
ruestungen: {}, fernkampf_waffen: {},
ruestungen: {},
ruestungen_gesamt: { ruestungen_gesamt: {
kopf: 0, kopf: 0,
brust: 0, brust: 0,
@ -375,6 +382,9 @@ class DSA41_CharacterData extends TypeDataModel {
trefferpunkte: "", trefferpunkte: "",
trefferpunkte_display: "", trefferpunkte_display: "",
basis_attacke: 0,
basis_parade: 0,
talent_attacke: 0, talent_attacke: 0,
talent_parade: 0, talent_parade: 0,
@ -390,10 +400,13 @@ class DSA41_CharacterData extends TypeDataModel {
schild_parade: 0, schild_parade: 0,
}; };
computed.basis_attacke = this.computed.at_basiswert;
computed.basis_parade = this.computed.pa_basiswert;
const talent = item.system.nahkampfwaffe.kampftalente; const talent = item.system.nahkampfwaffe.kampftalente;
computed.talent_attacke = this.computed.kampf.talente[talent].attacke; computed.talent_attacke = this.kampf_talente[talent]?.attacke ?? 0;
computed.talent_parade = this.computed.kampf.talente[talent].parade; computed.talent_parade = this.kampf_talente[talent]?.parade ?? 0;
computed.modifikator_attacke = item.system.nahkampfwaffe.modifikator_attacke; computed.modifikator_attacke = item.system.nahkampfwaffe.modifikator_attacke;
computed.modifikator_parade = item.system.nahkampfwaffe.modifikator_parade; computed.modifikator_parade = item.system.nahkampfwaffe.modifikator_parade;
@ -416,13 +429,35 @@ class DSA41_CharacterData extends TypeDataModel {
computed.schild_parade += schild.system.schild.modifikator_parade; computed.schild_parade += schild.system.schild.modifikator_parade;
} }
computed.attacke = computed.talent_attacke + computed.modifikator_attacke + computed.parierwaffe_attacke + computed.schild_attacke + Math.min(computed.tp_kk, 0); computed.attacke = computed.basis_attacke + computed.talent_attacke + computed.modifikator_attacke + computed.parierwaffe_attacke + computed.schild_attacke + Math.min(computed.tp_kk, 0);
computed.parade = computed.talent_parade + computed.modifikator_parade + computed.parierwaffe_parade + computed.schild_parade + Math.min(computed.tp_kk, 0); computed.parade = computed.basis_parade + computed.talent_parade + computed.modifikator_parade + computed.parierwaffe_parade + computed.schild_parade + Math.min(computed.tp_kk, 0);
computed.trefferpunkte = get_minified_formula(item.system.nahkampfwaffe.basis + (computed.tp_kk != 0 ? " + " + computed.tp_kk : "")); computed.trefferpunkte = get_minified_formula(item.system.nahkampfwaffe.basis + (computed.tp_kk != 0 ? " + " + computed.tp_kk : ""));
computed.trefferpunkte_display = computed.trefferpunkte.replace(/[\+\-]/, (op) => "<br>" + op); computed.trefferpunkte_display = computed.trefferpunkte.replace(/[\+\-]/, (op) => "<br>" + op);
} }
} }
for (const item of equipped_fernkampfwaffen) {
let computed = this.computed.kampf.fernkampf_waffen[item._id] = {
item: item,
attacke: 0,
trefferpunkte: "",
trefferpunkte_display: "",
basis_attacke: 0,
talent_attacke: 0,
};
computed.basis_attacke = this.computed.fk_basiswert;
const talent = item.system.nahkampfwaffe.kampftalente;
computed.talent_attacke = this.kampf_talente[talent]?.attacke ?? 0;
computed.attacke = computed.basis_attacke + computed.talent_attacke;
computed.trefferpunkte = get_minified_formula(item.system.fernkampfwaffe.basis);
computed.trefferpunkte_display = computed.trefferpunkte.replace(/[\+\-]/, (op) => "<br>" + op);
}
} }
} }
@ -551,6 +586,75 @@ function DSA41_ApplicationMixin(BaseApplication) {
return DSA41_Application; return DSA41_Application;
} }
class DSA41_Dialog extends DSA41_ApplicationMixin(ApplicationV2) {
static PARTS = {
FernkampfAngriff: { template: "systems/dsa-4th-edition/src/Dialogs/FernkampfAngriff.hbs" },
FernkampfTrefferpunkte: { template: "systems/dsa-4th-edition/src/Dialogs/FernkampfTrefferpunkte.hbs" },
footer: { template: "templates/generic/form-footer.hbs" },
};
static DEFAULT_OPTIONS = {
classes: [ "DSA41", "Dialog" ],
window: {
title: "Dialog",
minimizable: false,
resizable: false
},
tag: "form",
form: {
closeOnSubmit: false,
submitOnChange: true,
}
};
get formData() {
const data = Object.fromEntries(
new FormData(this.element).entries().map(([key, value])=>{
if (typeof value != "string") return [key, value];
return isNaN(value) ? [key, value] : [key, Number(value)];
})
);
return data;
}
buttons = [{
type: "submit",
label: "Confirm"
}];
static async wait(dialog_type, options) {
return new Promise((resolve, reject) => {
const dialog = new this({
dialog_type: dialog_type,
form: {
handler: (event, form, formData) => {
if (event.type != "submit") {
dialog.render({ force: false });
return;
}
dialog.close();
resolve(dialog.formData);
}
},
...options,
});
dialog.render({ force: true });
});
}
_configureRenderOptions(options) {
super._configureRenderOptions(options);
options.parts = [ this.options.dialog_type, "footer" ];
}
_onFirstRender(context, options) {
this.render(options)
}
}
class DSA41_ActorSheet extends DSA41_ApplicationMixin(ActorSheetV2) { class DSA41_ActorSheet extends DSA41_ApplicationMixin(ActorSheetV2) {
static PARTS = { static PARTS = {
ActorSheet: { template: "systems/dsa-4th-edition/src/ActorSheet.hbs" }, ActorSheet: { template: "systems/dsa-4th-edition/src/ActorSheet.hbs" },
@ -563,6 +667,40 @@ class DSA41_ActorSheet extends DSA41_ApplicationMixin(ActorSheetV2) {
const roll_formula = event.target.closest("[data-roll]").dataset.roll; const roll_formula = event.target.closest("[data-roll]").dataset.roll;
const roll_type = event.target.closest("[data-roll-type]").dataset.rollType; const roll_type = event.target.closest("[data-roll-type]").dataset.rollType;
const success_value = event.target.closest("[data-success-value]")?.dataset.successValue; 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);
if (roll_type == "fernkampf-attacke") {
const title = game.i18n.localize("DSA41.roll_types." + roll_type) + ": " + item.name;
const data = await DSA41_Dialog.wait("FernkampfAngriff", { window: { title: title }, item: this.document.system.computed.kampf.fernkampf_waffen[item_id] });
const groessen_modifikator = Math.max(data.ziel_groesse + data.deckung + data.ziel_bewegung, -2);
const andere_modifikator = data.entfernung + data.wind + data.modifikator;
const total_modifikator = groessen_modifikator + andere_modifikator;
let roll = new Roll(roll_formula + " + " + total_modifikator, this.document.system);
roll.toMessage({
speaker: ChatMessage.getSpeaker({ actor: this.document }),
flavor: game.i18n.localize("DSA41.roll_types." + roll_type),
});
return;
}
if (roll_type == "fernkampf-trefferpunkte") {
const title = game.i18n.localize("DSA41.roll_types." + roll_type) + ": " + item.name;
const data = await DSA41_Dialog.wait("FernkampfTrefferpunkte", { window: { title: title }, item: item });
const entfernung = item.system.fernkampfwaffe[data.entfernung];
let roll = new Roll(roll_formula + " + " + (entfernung + data.modifikator), this.document.system);
roll.toMessage({
speaker: ChatMessage.getSpeaker({ actor: this.document }),
flavor: game.i18n.localize("DSA41.roll_types." + roll_type),
});
return;
}
let flavor = game.i18n.localize("DSA41.roll_types." + roll_type); let flavor = game.i18n.localize("DSA41.roll_types." + roll_type);
if (typeof success_value !== 'undefined') { if (typeof success_value !== 'undefined') {