introduces a paperdoll for equipment handling

pull/49/head
macniel 2025-10-03 23:45:17 +02:00
parent 2a17fd7ae7
commit f5248c57aa
7 changed files with 209 additions and 25 deletions

View File

@ -91,10 +91,12 @@ Hooks.once("init", () => {
})
Hooks.on('dropActorSheetData', (actor, sheet, data) => {
if (actor.type === "character") {
return CharacterSheet.onDroppedData(actor, sheet, data);
} else {
return GroupSheet.onDroppedData(actor, sheet, data);
if (data.id) {
if (actor.type === "character") {
return CharacterSheet.onDroppedData(actor, sheet, data);
} else {
return GroupSheet.onDroppedData(actor, sheet, data);
}
}
} )

View File

@ -131,6 +131,13 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
key: new StringField(),
notiz: new StringField(),
})),
heldenausruestung: new SchemaField({
links: new DocumentIdField(),
rechts: new DocumentIdField(),
ruestung: new DocumentIdField(),
munition: new DocumentIdField()
})
}
}

View File

@ -170,6 +170,29 @@ export class CharacterSheet extends ActorSheet {
})
context.maxcarryingcapacity = actorData.system.attribute.kk.aktuell
context.carryingpercentage = Math.min((context.carryingweight / context.maxcarryingcapacity)*100, 100);
context.heldenausruestung = {
links: {
id: this.object.system.heldenausruestung.links,
name: this.object.items.get(actorData.system.heldenausruestung.links)?.name,
icon: this.object.items.get(actorData.system.heldenausruestung.links)?.img
},
rechts: {
id: this.object.system.heldenausruestung.rechts,
name: this.object.items.get(actorData.system.heldenausruestung.rechts)?.name,
icon: this.object.items.get(actorData.system.heldenausruestung.rechts)?.img
},
ruestung: {
id: this.object.system.heldenausruestung.ruestung,
name: this.object.items.get(actorData.system.heldenausruestung.ruestung)?.name,
icon: this.object.items.get(actorData.system.heldenausruestung.ruestung)?.img
},
munition: {
id: this.object.system.heldenausruestung.munition,
name: this.object.items.get(actorData.system.heldenausruestung.munition)?.name,
icon: this.object.items.get(actorData.system.heldenausruestung.munition)?.img
}
}
}
prepareEigenschaftRoll(actorData, name) {
@ -331,6 +354,58 @@ export class CharacterSheet extends ActorSheet {
evt.stopPropagation();
})
html.on('dragstart', '.equipment', (evt) => {
evt.originalEvent.dataTransfer.setData("text/plain", evt.currentTarget.dataset.id);
})
html.on('drop', '.equipped', async (evt) => {
const {actor, target} = evt.currentTarget.dataset;
const documentId = evt.originalEvent.dataTransfer.getData("text");
if (actor === this.object._id && documentId) { // managing equipped items
switch(target) {
case "links":
this.object.update({
system: {
heldenausruestung: {
links: documentId
}
}
})
break;
case "rechts":
this.object.update({
system: {
heldenausruestung: {
rechts: documentId
}
}
})
break;
case "ruestung":
this.object.update({
system: {
heldenausruestung: {
ruestung: documentId
}
}
})
break;
case "munition":
this.object.update({
system: {
heldenausruestung: {
munition: documentId
}
}
})
break;
}
}
evt.stopPropagation();
})
new ContextMenu(html, '.talent.rollable', [
{
name: "Entfernen",

View File

@ -52,36 +52,96 @@
overflow: auto;
}
.backpack {
position: absolute;
.backpack.active {
position: relative;
left: 0;
top: 0;
bottom: 0;
right: 0;
padding: 8px;
display: grid;
grid-template-columns: 1fr 280px;
grid-template-rows: 64px 1fr;
gap: 0px 0px;
grid-template-areas:
"capacity capacity"
"inventory equipment";
.resource {
.capacity {
position: relative;
border: 1px inset #ccc;
background-color: rgba(0,0,0,0.2);
height: 8px;
grid-area: capacity;
.resource {
position: relative;
border: 1px inset #ccc;
background-color: rgba(0, 0, 0, 0.2);
height: 8px;
span.fill {
position: absolute;
left: 0;
top: 0;
bottom: 0;
background: linear-gradient(to bottom, #0bad29 0%, #11f128 50%, #0cde24 51%, #6ff77b 100%);
}
span.fill {
position:absolute;
left: 0;
top: 0;
bottom: 0;
background: linear-gradient(to bottom, #0bad29 0%,#11f128 50%,#0cde24 51%,#6ff77b 100%);
}
}
.equipment:hover {
.item-name {
text-shadow: 0 0 10px rgb(255 0 0);
.inventory {
grid-area: inventory;
.equipment:hover {
.item-name {
text-shadow: 0 0 10px rgb(255 0 0);
}
}
}
.paperdoll {
grid-area: equipment;
position: relative;
.paperdoll-image {
fill: rgba(0,0,0,0.5);
}
.equipped {
background-color: rgba(0,0,0,0.2);
border: 1px inset #ccc;
width: 34px;
height: 34px;
&.links {
position: absolute;
top: 230px;
left: 250px;
}
&.rechts {
position: absolute;
top: 230px;
left: 20px;
}
&.ruestung {
position: absolute;
top: 180px;
left: 130px;
}
&.munition {
position: absolute;
top: 270px;
left: 20px;
}
}
}
}

View File

@ -62,11 +62,27 @@
"private": false
},
{
"name": "Equipment",
"label": "Ausrüstung",
"name": "Weapons",
"label": "Waffen",
"system": "DSA_4-1",
"type": "Item",
"path": "packs/ausruestung",
"path": "packs/waffen",
"private": false
},
{
"name": "Armor",
"label": "Rüstzeug",
"system": "DSA_4-1",
"type": "Item",
"path": "packs/ruestzeug",
"private": false
},
{
"name": "Ammunition",
"label": "Munition",
"system": "DSA_4-1",
"type": "Item",
"path": "packs/munition",
"private": false
}
],

View File

@ -153,9 +153,33 @@
</div>
</div>
<div class="inventory">
<h3>Inventar</h3>
{{#each equipments}}
{{> "systems/DSA_4-1/templates/ui/partial-equipment-button.hbs" this}}
{{/each}}
</div>
<div class="paperdoll">
<h3>Ausrüstung</h3>
<div class="paperdoll">
<svg
width="280"
height="530"
viewBox="0 0 70 140"
xmlns="http://www.w3.org/2000/svg"><path class="paperdoll-image"
d="m 22.868053,0.6591628 0.658626,-0.52687462 6.270125,4.42573652 3.97809,0.5795595 0.605938,-4.58379633 11.828915,2.02846193 0.07905,2.3182421 3.556578,-0.9220267 6.691636,3.7671414 2.292014,3.7671454 -4.030787,0.05268 0.89573,3.951549 -1.106491,2.23921 -3.345818,-0.632247 0.869387,4.241332 v 2.476303 l 1.422627,-0.02634 0.500563,1.343527 h 3.29312 l 1.975878,3.424677 0.05267,2.818774 2.371046,6.243447 6.665292,14.72611 1.949534,0.658592 0.34249,4.794545 -0.289802,1.606966 0.922074,1.765023 -0.395167,2.897805 2.002222,6.743979 1.027449,1.949433 -0.737657,5.031644 -3.925413,4.399394 -0.922074,-0.553222 0.579595,-1.844054 -1.896847,1.264499 -0.526897,-0.790314 1.475315,-1.369869 -1.36994,-5.690236 -0.974762,4.083275 -1.053803,-0.342473 -0.790345,-3.108552 0.579584,-2.370933 0.526907,-0.658592 -0.263459,-0.500527 0.289803,-1.554277 0.948418,-2.739737 -0.447865,-2.212876 -1.106492,-0.974715 -1.554356,-1.501588 -2.423744,-4.030581 0.711314,-1.264496 -3.793683,-5.532171 -0.02638,-1.554275 -1.475326,-1.554276 -1.185522,-3.213929 -0.869387,-0.763967 -3.029682,4.820892 -1.159179,0.447843 0.447865,0.974716 -0.790345,0.974716 -0.21076,2.002118 0.368823,1.343527 -0.289792,1.923087 1.71243,2.397274 0.02638,1.791371 1.23821,1.975774 2.950651,13.013779 -0.421522,0.684934 2.713536,14.278264 7.113157,18.150786 1.132835,0.0791 3.767339,9.19394 -2.344701,0.73762 1.92318,7.42891 -1.738774,3.87253 1.001116,3.79348 2.687192,4.10961 -0.68497,2.44996 -10.643392,0.079 -0.684969,-8.42997 1.106491,-1.42257 -1.659742,-1.47524 0.07905,-2.00211 -1.949535,-2.18653 -0.55325,-3.84617 -1.422628,0.15805 -0.500553,-7.71869 1.02745,-1.05374 -2.133941,-4.21499 0.421521,-2.42362 -4.32059,-6.322483 -1.317252,-4.056921 -9.247098,-17.702946 -0.395178,0.210749 -3.609266,18.783038 -1.975878,3.635422 -0.289802,10.721871 0.764011,-0.0264 2.397389,7.71869 -4.663069,0.97472 -0.737658,6.74398 -2.212983,1.92309 1.422638,6.74397 -1.896847,3.10855 -4.504997,0.34248 -0.105385,-0.86934 -3.714641,1.2118 -8.140618,0.21075 -0.131729,-2.00212 8.483107,-5.47948 0.711314,-1.89674 -0.316146,-2.18653 0.869386,-0.71128 -1.027449,-1.36986 1.659732,-6.55958 -2.502775,-0.76396 1.317252,-3.42469 -0.289792,-1.2645 2.397389,-3.05585 2.107608,-12.592278 -0.948419,-7.349881 0.316136,-13.90946 -1.554356,-1.159119 4.504996,-21.153968 0.316147,-4.557454 0.948418,-3.345646 -2.160295,2.924147 -4.847487,4.135956 1.264565,1.080091 -3.42485,2.397275 -3.29313,2.766082 -0.68497,1.923087 -1.791461,-0.57956 -1.001116,1.633307 0.07905,4.87358 L 9.168636,68.889233 4.2948053,70.180074 1.5812697,67.466679 0.13228831,66.070468 2.9775532,60.801731 6.5868297,58.825953 6.692205,57.245334 8.0884885,56.059869 v -1.923064 l 2.9769935,-7.824067 2.897953,0.553216 7.323918,-8.166536 v -0.500531 l 3.872714,-4.689172 -0.263448,-2.028463 2.766234,-5.1897 5.163622,-1.448903 0.158063,-1.844055 -0.922074,-2.291899 0.948428,-5.95367 -0.658626,-4.294017 -4.926518,-3.9515498 z"/>
</svg>
<img src="{{heldenausruestung.links.icon}}" class="equipped links" data-actor="{{actor.id}}" value="{{heldenausruestung.links.name}}" data-target="links"/>
<img src="{{heldenausruestung.rechts.icon}}" class="equipped rechts" data-actor="{{actor.id}}" value="{{heldenausruestung.rechts.name}}" data-target="rechts"/>
<img src="{{heldenausruestung.ruestung.icon}}" class="equipped ruestung" data-actor="{{actor.id}}" value="{{heldenausruestung.ruestung.name}}" data-target="ruestung"/>
<img src="{{heldenausruestung.munition.icon}}" class="equipped munition" data-actor="{{actor.id}}" value="{{heldenausruestung.munition.name}}" data-target="munition"/>
</div>
</div>
</div>
<div class="tab spells" data-group="primary" data-tab="spells">

View File

@ -1,4 +1,4 @@
<div class="equipment" data-id="{{this.id}}">
<div class="equipment" data-id="{{this.id}}" draggable="true">
<span class="quantity">{{this.quantity}}</span>
<span class="item-name">{{this.name}}</span>
</div>