Skip to content

Commit 7965f18

Browse files
committed
link ammo to weapon
1 parent fc62b68 commit 7965f18

File tree

6 files changed

+115
-63
lines changed

6 files changed

+115
-63
lines changed

less/sheet/actor/tab/gear.less

+6
Original file line numberDiff line numberDiff line change
@@ -157,4 +157,10 @@
157157

158158
.dark-heresy .gear .all-gear .item-list .items .gear {
159159
width: 100%;
160+
}
161+
162+
.dark-heresy .gear .linked-item {
163+
width: 100%;
164+
text-align: left;
165+
padding-left: 10px;
160166
}

script/common/roll.js

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {PlaceableTemplate} from "./placeable-template.js";
1+
import { PlaceableTemplate } from "./placeable-template.js";
22

33
/**
44
* Roll a generic roll, and post the result to chat.
@@ -82,7 +82,7 @@ async function _computeCombatTarget(rollData) {
8282
}
8383
let psyModifier = 0;
8484
if (typeof rollData.psy !== "undefined" && typeof rollData.psy.useModifier !== "undefined" && rollData.psy.useModifier) {
85-
// Set Current Psyrating to the allowed maximum if it is bigger
85+
// Set Current Psyrating to the allowed maximum if it is bigger
8686
if (rollData.psy.value > rollData.psy.max) {
8787
rollData.psy.value = rollData.psy.max;
8888
}
@@ -95,11 +95,11 @@ async function _computeCombatTarget(rollData) {
9595
}
9696

9797
let targetMods = rollData.target.modifier
98-
+ (rollData.aim?.val ? rollData.aim.val : 0)
99-
+ (rollData.rangeMod ? rollData.rangeMod : 0)
100-
+ (rollData.weapon?.traits?.twinLinked ? 20: 0)
101-
+ attackType
102-
+ psyModifier;
98+
+ (rollData.aim?.val ? rollData.aim.val : 0)
99+
+ (rollData.rangeMod ? rollData.rangeMod : 0)
100+
+ (rollData.weapon?.traits?.twinLinked ? 20 : 0)
101+
+ attackType
102+
+ psyModifier;
103103

104104
rollData.target.final = _getRollTarget(targetMods, rollData.target.base);
105105
}
@@ -196,7 +196,7 @@ async function _rollDamage(rollData) {
196196
firstHit.location = firstLocation;
197197
rollData.damages.push(firstHit);
198198

199-
let additionalhits = rollData.numberOfHits -1;
199+
let additionalhits = rollData.numberOfHits - 1;
200200

201201
for (let i = 0; i < additionalhits; i++) {
202202
let additionalHit = await _computeDamage(
@@ -232,7 +232,7 @@ function _computeNumberOfHits(attackDos, evasionDos, attackType, shotsFired, wea
232232
let stormMod = weaponTraits.storm ? 2 : 1;
233233
let maxHits = attackType.maxHits * stormMod;
234234

235-
if (weaponTraits.twinLinked && attackDos >=2) {
235+
if (weaponTraits.twinLinked && attackDos >= 2) {
236236
maxHits += 1;
237237
attackDos += attackType.hitMargin;
238238
if (shotsFired) shotsFired += 1;
@@ -351,7 +351,7 @@ async function _updateRangedAmmo(rollData) {
351351
break;
352352
}
353353
}
354-
await weapon.update({"system.clip.value": rollData.weapon.clip.value});
354+
await weapon.update({ "system.clip.value": rollData.weapon.clip.value });
355355
}
356356
}
357357
}

script/common/util.js

+7-7
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ export default class DarkHeresyUtil {
4545
let characteristic = this.getWeaponCharacteristic(actor, weaponItem);
4646
let rateOfFire;
4747
if (weaponItem.class === "melee") {
48-
rateOfFire = {burst: characteristic.bonus, full: characteristic.bonus};
48+
rateOfFire = { burst: characteristic.bonus, full: characteristic.bonus };
4949
} else {
50-
rateOfFire = {burst: weaponItem.rateOfFire.burst, full: weaponItem.rateOfFire.full};
50+
rateOfFire = { burst: weaponItem.rateOfFire.burst, full: weaponItem.rateOfFire.full };
5151
}
5252
let weaponTraits = this.extractWeaponTraits(weaponItem.special);
5353
let isMelee = weaponItem.class === "melee";
@@ -64,8 +64,8 @@ export default class DarkHeresyUtil {
6464
clip: weaponItem.clip,
6565
rateOfFire: rateOfFire,
6666
range: !isMelee ? weaponItem.range : 0,
67-
damageFormula: weaponItem.damage + attributeMod + (weaponTraits.force ? "+PR": ""),
68-
penetrationFormula: weaponItem.penetration + (weaponTraits.force ? "+PR" : ""),
67+
damageFormula: weaponItem.damage + attributeMod + (weaponTraits.force ? "+PR" : "") + (weaponItem.system.ammoItem ? `+${weaponItem.system.ammoItem.system.effect.damage.modifier}` : ""),
68+
penetrationFormula: weaponItem.penetration + (weaponTraits.force ? "+PR" : "") + (weaponItem.system.ammoItem ? `+${weaponItem.system.ammoItem.system.effect.penetration}` : ""),
6969
traits: weaponTraits,
7070
special: weaponItem.special
7171
});
@@ -77,8 +77,8 @@ export default class DarkHeresyUtil {
7777
let focusPowerTarget = this.getFocusPowerTarget(actor, power);
7878

7979
let rollData = this.createCommonAttackRollData(actor, power);
80-
rollData.target.base= focusPowerTarget.total;
81-
rollData.target.modifier= power.focusPower.difficulty;
80+
rollData.target.base = focusPowerTarget.total;
81+
rollData.target.modifier = power.focusPower.difficulty;
8282
rollData.weapon = foundry.utils.mergeObject(rollData.weapon, {
8383
damageFormula: power.damage.formula,
8484
penetrationFormula: power.damage.penetration,
@@ -156,7 +156,7 @@ export default class DarkHeresyUtil {
156156

157157

158158
static extractWeaponTraits(traits) {
159-
// These weapon traits never go above 9 or below 2
159+
// These weapon traits never go above 9 or below 2
160160
return {
161161
accurate: this.hasNamedTrait(/(?<!in)Accurate/gi, traits),
162162
rfFace: this.extractNumberedTrait(/Vengeful.*\(\d\)/gi, traits), // The alternativ die face Righteous Fury is triggered on

script/data/item/weaponData.js

+9-3
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,16 @@ export default class WeaponData extends EquipmentItemData {
3636
prepareDerivedData() {
3737
super.prepareDerivedData();
3838

39-
if (this.ammo !== "") {
40-
// load ammo
41-
}
39+
this.prepareAmmoFetch();
40+
41+
}
4242

43+
prepareAmmoFetch() {
44+
// We only store a reference to the ammo, here we get the whole item and store it in memory only
45+
// Ammo can only be connected to weapons for actor owned weapons
46+
if (this.parent.actor && this.ammo !== "") {
47+
this.ammoItem = this.parent.actor.items.get(this.ammo);
48+
}
4349
}
4450

4551
}

script/sheet/weapon.js

+25-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ export class WeaponSheet extends DarkHeresyItemSheet {
1414
contentSelector: ".sheet-body",
1515
initial: "stats"
1616
}
17-
]
17+
],
18+
dragDrop: [{
19+
dropSelector: null
20+
}]
1821
});
1922
}
2023

@@ -27,4 +30,25 @@ export class WeaponSheet extends DarkHeresyItemSheet {
2730
activateListeners(html) {
2831
super.activateListeners(html);
2932
}
33+
34+
_canDragDrop(selector) {
35+
return true;
36+
}
37+
38+
async _onDrop(event) {
39+
let dragEventData = TextEditor.getDragEventData(event);
40+
let item = fromUuidSync(dragEventData.uuid);
41+
42+
// We only want to allow drops on weapons that belong to an actor
43+
if (!this.item.actor) return;
44+
45+
// It has to be ammunition from the same actor
46+
if (item?.type === "ammunition" && item?.actor.uuid === this.item.actor.uuid) {
47+
if (this.item.ammo !== "") {
48+
// remove old ammo
49+
}
50+
51+
this.item.update({ "system.ammo": item.id });
52+
}
53+
}
3054
}

template/sheet/actor/tab/gear.hbs

+58-42
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,30 @@
2727
</div>
2828
<div class="items">
2929
{{#each items.weapons as |item|}}
30-
<div class="gear item flex row" data-item-id="{{item.id}}">
31-
<div class="flex name item-edit">
32-
<div class="image-container">
33-
<div class="image" style="background-image: url('{{item.img}}')"></div>
30+
<div class="gear item">
31+
<div class="flex row" data-item-id="{{item.id}}">
32+
<div class="flex name item-edit">
33+
<div class="image-container">
34+
<div class="image" style="background-image: url('{{item.img}}')"></div>
35+
</div>
36+
<div>{{item.name}}</div>
37+
</div>
38+
<div class="class">{{item.WeaponClass}}</div>
39+
<div class="class">{{item.WeaponType}}</div>
40+
<div class="damage">{{item.damage}}</div>
41+
<div class="type">{{item.DamageTypeShort}}</div>
42+
<div class="clip">{{item.Clip}}</div>
43+
<div class="weight">{{item.weight}}</div>
44+
<div class="button">
45+
<a class="item-control item-delete" title="Delete Weapon"><i
46+
class="fas fa-trash"></i></a>
3447
</div>
35-
<div>{{item.name}}</div>
36-
</div>
37-
<div class="class">{{item.WeaponClass}}</div>
38-
<div class="class">{{item.WeaponType}}</div>
39-
<div class="damage">{{item.damage}}</div>
40-
<div class="type">{{item.DamageTypeShort}}</div>
41-
<div class="clip">{{item.Clip}}</div>
42-
<div class="weight">{{item.weight}}</div>
43-
<div class="button">
44-
<a class="item-control item-delete" title="Delete Weapon"><i class="fas fa-trash"></i></a>
4548
</div>
49+
{{#if item.system.ammoItem}}
50+
<div class="linked-item">
51+
&#8627 {{item.system.ammoItem.name}}
52+
</div>
53+
{{/if}}
4654
</div>
4755
{{/each}}
4856
</div>
@@ -53,10 +61,11 @@
5361
<b class="installed">{{localize "WEAPON_MODIFICATION.INSTALLED"}}</b>
5462
<b class="upgrade">{{localize "WEAPON_MODIFICATION.UPGRADES"}}</b>
5563
<b class="weight">{{localize "WEAPON_MODIFICATION.WEIGHT"}}</b>
56-
<a class="button item-create" title="Add Weapon Modification" data-type="weaponModification"><i class="fas fa-plus"></i></a>
64+
<a class="button item-create" title="Add Weapon Modification" data-type="weaponModification"><i
65+
class="fas fa-plus"></i></a>
5766
</div>
5867
<div class="items">
59-
{{#each items.weaponMods as |item|}}
68+
{{#each items.weaponMods as |item|}}
6069
<div class="gear item flex row" data-item-id="{{item.id}}">
6170
<div class="flex name item-edit">
6271
<div class="image-container">
@@ -68,10 +77,11 @@
6877
<div class="upgrade">{{item.upgrades}}</div>
6978
<div class="weight">{{item.weight}}</div>
7079
<div class="button">
71-
<a class="item-control item-delete" title="Delete Weapon Modification"><i class="fas fa-trash"></i></a>
80+
<a class="item-control item-delete" title="Delete Weapon Modification"><i
81+
class="fas fa-trash"></i></a>
7282
</div>
7383
</div>
74-
84+
7585
{{/each}}
7686
</div>
7787
</div>
@@ -82,25 +92,27 @@
8292
<b class="quantity">{{localize "AMMUNITION.QUANTITY"}}</b>
8393
<b class="weight">{{localize "AMMUNITION.WEIGHT"}}</b>
8494
<b class="sum-weight">{{localize "AMMUNITION.SUM"}}</b>
85-
<a class="button item-create" title="Add Ammunition" data-type="ammunition"><i class="fas fa-plus"></i></a>
95+
<a class="button item-create" title="Add Ammunition" data-type="ammunition"><i
96+
class="fas fa-plus"></i></a>
8697
</div>
8798
<div class="items">
88-
{{#each items.ammunitions as |item|}}
99+
{{#each items.ammunitions as |item|}}
89100
<div class="gear item flex row" data-item-id="{{item.id}}">
90-
<div class="flex name item-edit">
91-
<div class="image-container">
92-
<div class="image" style="background-image: url('{{item.img}}')"></div>
101+
<div class="flex name item-edit">
102+
<div class="image-container">
103+
<div class="image" style="background-image: url('{{item.img}}')"></div>
104+
</div>
105+
<div>{{item.name}}</div>
106+
</div>
107+
<div class="weapon">{{item.weapon}}</div>
108+
<div class="quantity">{{item.quantity}}</div>
109+
<div class="weight">{{item.weight}}</div>
110+
<div class="sum-weight">{{item.weightSum}}</div>
111+
<div class="button">
112+
<a class="item-control item-delete" title="Delete Ammunition"><i
113+
class="fas fa-trash"></i></a>
93114
</div>
94-
<div>{{item.name}}</div>
95-
</div>
96-
<div class="weapon">{{item.weapon}}</div>
97-
<div class="quantity">{{item.quantity}}</div>
98-
<div class="weight">{{item.weight}}</div>
99-
<div class="sum-weight">{{item.weightSum}}</div>
100-
<div class="button">
101-
<a class="item-control item-delete" title="Delete Ammunition"><i class="fas fa-trash"></i></a>
102115
</div>
103-
</div>
104116
{{/each}}
105117
</div>
106118
</div>
@@ -134,7 +146,8 @@
134146
<b class="name">{{localize "FORCE_FIELD.HEADER"}}</b>
135147
<b class="craftsmanship">{{localize "FORCE_FIELD.CRAFTSMANSHIP"}}</b>
136148
<b class="weight">{{localize "FORCE_FIELD.WEIGHT"}}</b>
137-
<a class="button item-create" title="Add Force Field" data-type="forceField"><i class="fas fa-plus"></i></a>
149+
<a class="button item-create" title="Add Force Field" data-type="forceField"><i
150+
class="fas fa-plus"></i></a>
138151
</div>
139152
<div class="items">
140153
{{#each items.forceFields as |item|}}
@@ -148,7 +161,8 @@
148161
<div class="craftsmanship">{{item.Craftsmanship}}</div>
149162
<div class="weight">{{item.weight}}</div>
150163
<div class="button">
151-
<a class="item-control item-delete" title="Delete Force Field"><i class="fas fa-trash"></i></a>
164+
<a class="item-control item-delete" title="Delete Force Field"><i
165+
class="fas fa-trash"></i></a>
152166
</div>
153167
</div>
154168
{{/each}}
@@ -187,7 +201,7 @@
187201
<a class="button item-create" title="Add Drug" data-type="drug"><i class="fas fa-plus"></i></a>
188202
</div>
189203
<div class="items">
190-
{{#each items.drugs as |item|}}
204+
{{#each items.drugs as |item|}}
191205
<div class="gear item flex row" data-item-id="{{item.id}}">
192206
<div class="flex name item-edit">
193207
<div class="image-container">
@@ -200,7 +214,7 @@
200214
<div class="button">
201215
<a class="item-control item-delete" title="Delete Drug"><i class="fas fa-trash"></i></a>
202216
</div>
203-
</div>
217+
</div>
204218
{{/each}}
205219
</div>
206220
</div>
@@ -212,7 +226,7 @@
212226
<a class="button item-create" title="Add Tool" data-type="tool"><i class="fas fa-plus"></i></a>
213227
</div>
214228
<div class="items">
215-
{{#each items.tools as |item|}}
229+
{{#each items.tools as |item|}}
216230
<div class="gear item flex row" data-item-id="{{item.id}}">
217231
<div class="flex name item-edit">
218232
<div class="image-container">
@@ -225,7 +239,7 @@
225239
<div class="button">
226240
<a class="item-control item-delete" title="Delete Tool"><i class="fas fa-trash"></i></a>
227241
</div>
228-
</div>
242+
</div>
229243
{{/each}}
230244
</div>
231245
</div>
@@ -235,10 +249,11 @@
235249
<b class="installed">{{localize "CYBERNETIC.INSTALLED"}}</b>
236250
<b class="cybernetic-craftsmanship">{{localize "CYBERNETIC.CRAFTSMANSHIP"}}</b>
237251
<b class="weight">{{localize "CYBERNETIC.WEIGHT"}}</b>
238-
<a class="button item-create" title="Add Cybernetic" data-type="cybernetic"><i class="fas fa-plus"></i></a>
252+
<a class="button item-create" title="Add Cybernetic" data-type="cybernetic"><i
253+
class="fas fa-plus"></i></a>
239254
</div>
240255
<div class="items">
241-
{{#each items.cybernetics as |item|}}
256+
{{#each items.cybernetics as |item|}}
242257
<div class="gear item flex row" data-item-id="{{item.id}}">
243258
<div class="flex name item-edit">
244259
<div class="image-container">
@@ -250,11 +265,12 @@
250265
<div class="cybernetic-craftsmanship">{{item.Craftsmanship}}</div>
251266
<div class="weight">{{item.weight}}</div>
252267
<div class="button">
253-
<a class="item-control item-delete" title="Delete Cybernetic"><i class="fas fa-trash"></i></a>
268+
<a class="item-control item-delete" title="Delete Cybernetic"><i
269+
class="fas fa-trash"></i></a>
254270
</div>
255271
</div>
256272
{{/each}}
257273
</div>
258274
</div>
259275
</div>
260-
</div>
276+
</div>

0 commit comments

Comments
 (0)