Implement most of shield functionality using the armour implementation as a backbone

This commit is contained in:
Oliver-Akins 2025-01-19 16:13:28 -07:00
parent 27d924e336
commit 9d48794b83
9 changed files with 60 additions and 29 deletions

View file

@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<path d="m50 89.988 0.011719 0.011719v-0.011719l10.82-5.4102c12.969-6.4883 21.129-19.711 21.129-34.199v-30.25c-18.762 0-31.699-9.9219-31.949-10.121v-0.007812s-13.199 10.129-31.969 10.129v30.25c0 14.488 8.1602 27.711 21.129 34.199l10.82 5.4102-0.003907 0.011719z"/>
</svg>

After

Width:  |  Height:  |  Size: 350 B

View file

@ -5,6 +5,7 @@
}, },
"Item": { "Item": {
"armour": "Armour", "armour": "Armour",
"shield": "Shield",
"weapon": "Weapon" "weapon": "Weapon"
} }
}, },
@ -102,6 +103,9 @@
"warn": { "warn": {
"cannot-go-negative": "\"{name}\" is unable to be a negative number." "cannot-go-negative": "\"{name}\" is unable to be a negative number."
} }
},
"tooltips": {
"shield-bonus": "Shield Bonus: {value}"
} }
} }
} }

View file

@ -143,6 +143,7 @@ export class HeroSummaryCardV1 extends GenericAppMixin(HandlebarsApplicationMixi
static async prepareArmor(ctx) { static async prepareArmor(ctx) {
ctx.armours = {}; ctx.armours = {};
const equipped = ctx.actor.system.equippedArmour; const equipped = ctx.actor.system.equippedArmour;
const shield = ctx.actor.system.equippedShield;
const defenses = ctx.actor.system.defense; const defenses = ctx.actor.system.defense;
for (const slot of Object.values(gameTerms.Anatomy)) { for (const slot of Object.values(gameTerms.Anatomy)) {
const item = equipped[slot]; const item = equipped[slot];
@ -150,9 +151,16 @@ export class HeroSummaryCardV1 extends GenericAppMixin(HandlebarsApplicationMixi
name: item?.name ?? ``, name: item?.name ?? ``,
uuid: item?.uuid ?? ``, uuid: item?.uuid ?? ``,
defense: defenses[slot], defense: defenses[slot],
shielded: false, shielded: shield?.system.location.has(slot) ?? false,
}; };
}; };
ctx.shield = {
name: shield?.name ?? ``,
uuid: shield?.uuid ?? ``,
bonus: shield?.system.protection ?? 0,
};
return ctx; return ctx;
}; };

View file

@ -165,7 +165,8 @@ export class HeroData extends foundry.abstract.TypeDataModel {
}; };
get equippedShield() { get equippedShield() {
return null; const shields = this.parent.itemTypes.shield;
return shields.find(item => item.system.equipped);
}; };
get defense() { get defense() {
@ -175,7 +176,13 @@ export class HeroData extends foundry.abstract.TypeDataModel {
defenses[slot] = armour[slot]?.system.protection ?? 0; defenses[slot] = armour[slot]?.system.protection ?? 0;
}; };
// TODO: add shield defenses const shield = this.equippedShield;
if (shield) {
for (const location of [...shield.system.location.values()]) {
const slot = location.toLowerCase();
defenses[slot] += shield.system.protection;
};
};
return defenses; return defenses;
}; };

View file

@ -32,6 +32,7 @@ Hooks.once(`init`, () => {
// #region Datamodels // #region Datamodels
CONFIG.Actor.dataModels.hero = HeroData; CONFIG.Actor.dataModels.hero = HeroData;
CONFIG.Item.dataModels.armour = ProtectorData; CONFIG.Item.dataModels.armour = ProtectorData;
CONFIG.Item.dataModels.shield = ProtectorData;
CONFIG.Item.dataModels.weapon = WeaponData; CONFIG.Item.dataModels.weapon = WeaponData;
// #endregion // #endregion

View file

@ -45,6 +45,7 @@
}, },
"Item": { "Item": {
"armour": {}, "armour": {},
"shield": {},
"weapon": {} "weapon": {}
} }
} }

View file

@ -33,31 +33,26 @@
></rc-svg> ></rc-svg>
{{#each armours as | slot |}} {{#each armours as | slot |}}
<div class="{{@key}}"> <div class="{{@key}}">
<div class="compass small">{{ slot.defense }}</div> <div class="compass small">
<span class="value">
{{ slot.defense }}
</span>
{{#if slot.shielded}}
<rc-icon
class="shield"
name="icons/shield-solid"
data-tooltip="{{ rc-i18n "RipCrypt.tooltips.shield-bonus" value=@root.shield.bonus }}"
data-tooltip-direction="UP"
var:size="20px"
var:fill="var(--accent-3)"
var:stroke="black"
var:stroke-width="8px"
></rc-icon>
{{/if}}
</div>
<span class="label">{{ rc-i18n (concat "RipCrypt.common.anatomy." @key) }}</span> <span class="label">{{ rc-i18n (concat "RipCrypt.common.anatomy." @key) }}</span>
</div> </div>
{{/each}} {{/each}}
<!--
<div class="head">
<div class="compass small">0</div>
<span class="label">{{ rc-i18n "RipCrypt.common.anatomy.head" }}</span>
</div>
<div class="body">
<div class="compass small">0</div>
<span class="label">{{ rc-i18n "RipCrypt.common.anatomy.body" }}</span>
</div>
<div class="arms">
<div class="compass small">0</div>
<span class="label">{{ rc-i18n "RipCrypt.common.anatomy.arms" }}</span>
</div>
<div class="legs">
<div class="compass small">0</div>
<span class="label">{{ rc-i18n "RipCrypt.common.anatomy.legs" }}</span>
</div>
-->
<div class="shield">
<span class="label">{{ rc-i18n "RipCrypt.common.shield" }}</span>
</div>
</div> </div>
<ul class="armour-items"> <ul class="armour-items">
<li class="row-alt"> <li class="row-alt">
@ -78,6 +73,7 @@
</li> </li>
<li class="row-alt"> <li class="row-alt">
<span class="label">{{ rc-i18n "RipCrypt.common.shield" }}</span> <span class="label">{{ rc-i18n "RipCrypt.common.shield" }}</span>
<span class="value ellipses">{{ shield.name }}</span>
</li> </li>
</ul> </ul>
</div> </div>

View file

@ -237,11 +237,17 @@
/* Positioning */ /* Positioning */
.head, .body, .legs { grid-column: 1; } .head, .body, .legs { grid-column: 1; }
.arms, .shield { grid-column: 2; } .arms { grid-column: 2; }
.head { grid-row: 1; } .head { grid-row: 1; }
.body, .arms { grid-row: 2; } .body, .arms { grid-row: 2; }
.legs, .shield { grid-row: 3; } .legs { grid-row: 3; }
.shield { align-self: end; }
.shield {
--distance: -7px;
position: absolute;
top: var(--distance);
right: var(--distance);
}
.armour-items { .armour-items {
display: contents; display: contents;

View file

@ -14,5 +14,10 @@ svg {
width: var(--size, 1rem); width: var(--size, 1rem);
height: var(--size, 1rem); height: var(--size, 1rem);
fill: var(--fill); fill: var(--fill);
stroke: var(--stroke); }
path {
stroke: var(--stroke);
stroke-width: var(--stroke-width);
stroke-linejoin: var(--stroke-linejoin);
} }