Begin playing around with the weapon sheet

This commit is contained in:
Oliver-Akins 2024-04-30 21:31:49 -06:00
parent d1cb412e5a
commit 91c95da639
8 changed files with 256 additions and 4 deletions

View file

@ -15,6 +15,7 @@ import { ItemProxy } from "./documents/Item/_proxy.mjs";
// Item Sheets // Item Sheets
import { UntypedItemSheet } from "./sheets/Items/UntypedItemSheet.mjs"; import { UntypedItemSheet } from "./sheets/Items/UntypedItemSheet.mjs";
import { WeaponSheet } from "./sheets/Items/WeaponSheet.mjs";
import { AspectSheet } from "./sheets/Items/AspectSheet.mjs"; import { AspectSheet } from "./sheets/Items/AspectSheet.mjs";
import { SpellSheet } from "./sheets/Items/SpellSheet.mjs"; import { SpellSheet } from "./sheets/Items/SpellSheet.mjs";
import { PetSheet } from "./sheets/Items/PetSheet.mjs"; import { PetSheet } from "./sheets/Items/PetSheet.mjs";
@ -95,6 +96,11 @@ Hooks.once(`init`, async () => {
types: ["aspect"], types: ["aspect"],
label: "dotdungeon.sheet-names.AspectSheet" label: "dotdungeon.sheet-names.AspectSheet"
}); });
Items.registerSheet("dotdungeon", WeaponSheet, {
makeDefault: true,
types: ["weapon"],
label: "dotdungeon.sheet-names.WeaponSheet"
});
Items.registerSheet("dotdungeon", SpellSheet, { Items.registerSheet("dotdungeon", SpellSheet, {
makeDefault: true, makeDefault: true,
types: ["spell"], types: ["spell"],

View file

@ -32,11 +32,15 @@ export const partials = [
`actors/char-sheet/v2/partials/inventory/items/weapon.v2.pc.hbs`, `actors/char-sheet/v2/partials/inventory/items/weapon.v2.pc.hbs`,
`actors/char-sheet/v2/partials/inventory/items/pet.v2.pc.hbs`, `actors/char-sheet/v2/partials/inventory/items/pet.v2.pc.hbs`,
// The v2 Untyped sheet partials // The partials used for Untyped v2 and other item sheets that don't have a
// unique design for the other tabs
`items/untyped/v2/tabs/general.v2.untyped.hbs`, `items/untyped/v2/tabs/general.v2.untyped.hbs`,
`items/untyped/v2/tabs/details.v2.untyped.hbs`, `items/untyped/v2/tabs/details.v2.untyped.hbs`,
`items/untyped/v2/tabs/effects.v2.untyped.hbs`, `items/untyped/v2/tabs/effects.v2.untyped.hbs`,
`items/untyped/v2/tabs/settings.v2.untyped.hbs`, `items/untyped/v2/tabs/settings.v2.untyped.hbs`,
// The weapon sheet partials
`items/weapon/v1/tabs/details.v1.weapon.hbs`,
]; ];
export const preAliasedPartials = { export const preAliasedPartials = {

View file

@ -0,0 +1,116 @@
import { GenericContextMenu } from "../../utils/GenericContextMenu.mjs";
import { DialogManager } from "../../utils/DialogManager.mjs";
import { GenericItemSheet } from "./GenericItemSheet.mjs";
import { localizer } from "../../utils/localizer.mjs";
export class WeaponSheet extends GenericItemSheet {
static get defaultOptions() {
let opts = foundry.utils.mergeObject(
super.defaultOptions,
{
template: `systems/dotdungeon/templates/items/weapon/v1/index.hbs`,
width: 300,
height: 340,
tabs: [
{
group: `page`,
navSelector: `nav.page`,
contentSelector: `.page-content`,
initial: `general`,
},
],
}
);
opts.classes.push(`dotdungeon`, `style-v3`);
return opts;
};
activateListeners(html) {
super.activateListeners(html);
new GenericContextMenu(html, `.photo.panel`, [
{
name: localizer(`dotdungeon.common.view-larger`),
callback: () => {
(new ImagePopout(this.item.img)).render(true);
},
},
{
name: localizer(`dotdungeon.common.edit`),
condition: () => this.isEditable,
callback: () => {
const fp = new FilePicker({
callback: (path) => {
this.item.update({"img": path});
},
});
fp.render(true);
},
},
{
name: localizer(`dotdungeon.common.reset`),
condition: () => this.isEditable,
callback: () => {
console.log(`.dungeon | Reset Item Image`)
},
}
]);
if (!this.isEditable) return;
console.debug(`.dungeon | Adding event listeners for Weapon Item: ${this.item.id}`);
html.find(`.create-ae`).on(`click`, async () => {
await this.item.createEmbeddedDocuments(
`ActiveEffect`,
[{name: localizer(`dotdungeon.default.name`, { document: `ActiveEffect`, type: `base` })}],
{ renderSheet: true }
);
});
new GenericContextMenu(html, `.effect.panel`, [
{
name: localizer(`dotdungeon.common.edit`),
callback: async (html) => {
(await fromUuid(html.closest(`.effect`)[0].dataset.embeddedId))?.sheet.render(true);
},
},
{
name: localizer(`dotdungeon.common.delete`),
callback: async (html) => {
const target = html.closest(`.effect`)[0];
const data = target.dataset;
const id = data.embeddedId;
const doc = await fromUuid(id);
DialogManager.createOrFocus(
`${doc.uuid}-delete`,
{
title: localizer(`dotdungeon.delete.ActiveEffect.title`, doc),
content: localizer(`dotdungeon.delete.ActiveEffect.content`, doc),
buttons: {
yes: {
label: localizer(`Yes`),
callback() {
doc.delete();
},
},
no: {
label: localizer(`No`),
}
}
}
);
},
}
]);
};
async getData() {
const ctx = await super.getData();
ctx.meta.showSettingsTab = ctx.isGM || this.item.isOwned;
ctx.meta.isEmbedded = this.item.isOwned;
ctx.meta.isEditable = this.isEditable;
return ctx;
};
};

View file

@ -6,16 +6,24 @@
border-radius: 4px; border-radius: 4px;
padding: var(--gap); padding: var(--gap);
&.space-between {
justify-content: space-between;
}
&--row { &--row {
@extend .panel; @extend .panel;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
gap: var(--gap); gap: var(--gap);
align-items: center; align-items: center;
}
&.space-between { &--column {
justify-content: space-between; @extend .panel;
} display: flex;
flex-direction: column;
gap: var(--gap);
justify-content: center;
} }
} }
} }

View file

@ -21,6 +21,7 @@
@use "./layouts/datasheet.scss"; @use "./layouts/datasheet.scss";
@use "./layouts/items/common.scss"; @use "./layouts/items/common.scss";
@use "./layouts/items/untyped/v2.scss"; @use "./layouts/items/untyped/v2.scss";
@use "./layouts/items/weapon/v1.scss";
/* Sheet Options */ /* Sheet Options */
.dotdungeon.style-v3 { .dotdungeon.style-v3 {

View file

@ -0,0 +1,13 @@
@use "../../../mixins/material";
@use "../../../mixins/utils";
.dotdungeon.style-v3 .item--weapon-v1 {
@include utils.tab("details") {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
.full-width {
grid-column: 1 / -1;
}
}
}

View file

@ -0,0 +1,21 @@
<form class="item item--weapon-v1 theme-dark">
<div class="page-content">
{{> dotdungeon.untyped.v2.general }}
{{> dotdungeon.weapon.v1.details }}
{{#if meta.showSettingsTab}}
{{> dotdungeon.untyped.v2.settings }}
{{/if}}
{{> dotdungeon.untyped.v2.effects }}
</div>
<div class="nav-bar">
<nav data-group="page" class="page" aria-label="">
<a class="button" data-group="page" data-tab="general">General</a>
<a class="button" data-group="page" data-tab="details">Details</a>
<a class="button" data-group="page" data-tab="effects">Effects</a>
{{#if meta.showSettingsTab}}
<a class="button" data-group="page" data-tab="settings">Settings</a>
{{/if}}
</nav>
</div>
</form>

View file

@ -0,0 +1,83 @@
<div class="tab" data-group="page" data-tab="details">
<div class="full-width panel--row space-between">
{{#if meta.isEditable}}
<label
for="{{meta.idp}}-purchase-cost"
class="justify-start"
>
Purchase Cost
</label>
<dd-incrementer
var:height="1.5rem"
name="system.buy"
value="{{system.buy}}"
id="{{meta.idp}}-purchase-cost"
min="0"
></dd-incrementer>
{{else}}
<span>Purchase Cost</span>
<span class="text-right">{{dd-empty-state system.buy}}</span>
{{/if}}
</div>
<div class="full-width panel--row space-between">
{{#if meta.isEditable}}
<label
for="{{meta.idp}}-usage-cost"
class="justify-start"
>
Usage Cost
</label>
<dd-incrementer
var:height="1.5rem"
name="system.usage_cost"
value="{{system.usage_cost}}"
id="{{meta.idp}}-usage-cost"
min="0"
></dd-incrementer>
{{else}}
<span>Usage Cost</span>
<span class="text-right">{{dd-empty-state system.usage_cost}}</span>
{{/if}}
</div>
<div class="detail panel--column">
<span>Rarity</span>
{{#if meta.isEditable}}
<select
class="text-center"
name="system.tier"
id="{{meta.idp}}-item-tier"
>
{{{ dd-options system.tier config.itemTiers localize=true }}}
</select>
{{else}}
<span>{{dd-i18n (concat "dotdungeon.rarity." system.tier)}}</span>
{{/if}}
</div>
{{#if meta.isEmbedded}}
<div class="detail panel--column">
Item Location
{{#if meta.isEditable}}
<select
class="text-center"
name="system.location"
id="{{meta.idp}}-location"
>
{{{ dd-options system.location item.availableLocations localize=true }}}
</select>
{{else}}
{{dd-i18n (concat "dotdungeon.location." system.location)}}
{{/if}}
</div>
<div class="number full-width panel--row space-between">
{{#if meta.isEditable}}
<label for="{{meta.idp}}-quantity">
Quantity
</label>
<dd-incrementer value="{{system.supplies}}"></dd-incrementer>
{{else}}
Quantity
{{system.quantity}}
{{/if}}
</div>
{{/if}}
</div>